@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
|
@@ -28,6 +28,8 @@ function mapRow(row) {
|
|
|
28
28
|
createdAt: row.created_at,
|
|
29
29
|
updatedAt: row.updated_at,
|
|
30
30
|
nextAttemptAt: row.next_attempt_at,
|
|
31
|
+
terminalAt: row.terminal_at,
|
|
32
|
+
terminalReason: row.terminal_reason,
|
|
31
33
|
resolvedAt: row.resolved_at,
|
|
32
34
|
};
|
|
33
35
|
}
|
|
@@ -52,8 +54,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
|
|
|
52
54
|
tenant_id, workspace_id, task_id, asset_ids_json, payload_json,
|
|
53
55
|
canonical_fingerprint, source_sequence, attempts, last_error,
|
|
54
56
|
entity_revision, lifecycle_revision, revision_fingerprint,
|
|
55
|
-
created_at, updated_at, next_attempt_at, resolved_at
|
|
56
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, NULL)
|
|
57
|
+
created_at, updated_at, next_attempt_at, terminal_at, terminal_reason, resolved_at
|
|
58
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL)
|
|
57
59
|
ON CONFLICT (tenant_id, workspace_id, task_id) DO UPDATE SET
|
|
58
60
|
asset_ids_json = excluded.asset_ids_json,
|
|
59
61
|
payload_json = excluded.payload_json,
|
|
@@ -66,6 +68,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
|
|
|
66
68
|
last_error = excluded.last_error,
|
|
67
69
|
updated_at = excluded.updated_at,
|
|
68
70
|
next_attempt_at = excluded.next_attempt_at,
|
|
71
|
+
terminal_at = NULL,
|
|
72
|
+
terminal_reason = NULL,
|
|
69
73
|
resolved_at = NULL
|
|
70
74
|
WHERE workspace_sync_v3_attachment_apply_obligations.resolved_at IS NOT NULL
|
|
71
75
|
OR CAST(excluded.source_sequence AS ${this.db.provider === 'postgres' ? 'BIGINT' : 'INTEGER'})
|
|
@@ -77,7 +81,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
|
|
|
77
81
|
const rows = this.db.prepare(`
|
|
78
82
|
SELECT *
|
|
79
83
|
FROM workspace_sync_v3_attachment_apply_obligations
|
|
80
|
-
WHERE tenant_id = ? AND workspace_id = ?
|
|
84
|
+
WHERE tenant_id = ? AND workspace_id = ?
|
|
85
|
+
AND resolved_at IS NULL AND terminal_at IS NULL AND next_attempt_at <= ?
|
|
81
86
|
ORDER BY next_attempt_at ASC, task_id ASC
|
|
82
87
|
LIMIT ?
|
|
83
88
|
`).all(input.tenantId, input.workspaceId, input.now, limit);
|
|
@@ -87,30 +92,34 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
|
|
|
87
92
|
const row = this.db.prepare(`
|
|
88
93
|
SELECT COUNT(*) AS count
|
|
89
94
|
FROM workspace_sync_v3_attachment_apply_obligations
|
|
90
|
-
WHERE tenant_id = ? AND workspace_id = ?
|
|
95
|
+
WHERE tenant_id = ? AND workspace_id = ?
|
|
96
|
+
AND resolved_at IS NULL AND terminal_at IS NULL
|
|
91
97
|
`).get(input.tenantId, input.workspaceId);
|
|
92
98
|
return Number(row?.count || 0);
|
|
93
99
|
}
|
|
94
100
|
readSummary(input) {
|
|
95
101
|
const aggregate = this.db.prepare(`
|
|
96
|
-
SELECT
|
|
97
|
-
SUM(CASE WHEN
|
|
98
|
-
|
|
99
|
-
MIN(
|
|
100
|
-
|
|
102
|
+
SELECT SUM(CASE WHEN terminal_at IS NULL THEN 1 ELSE 0 END) AS open,
|
|
103
|
+
SUM(CASE WHEN terminal_at IS NOT NULL THEN 1 ELSE 0 END) AS terminal,
|
|
104
|
+
SUM(CASE WHEN terminal_at IS NULL AND next_attempt_at <= ? THEN 1 ELSE 0 END) AS due,
|
|
105
|
+
MIN(CASE WHEN terminal_at IS NULL THEN created_at END) AS oldest_open_created_at,
|
|
106
|
+
MIN(CASE WHEN terminal_at IS NULL THEN next_attempt_at END) AS next_attempt_at,
|
|
107
|
+
SUM(CASE WHEN terminal_at IS NULL THEN attempts ELSE 0 END) AS total_attempts
|
|
101
108
|
FROM workspace_sync_v3_attachment_apply_obligations
|
|
102
109
|
WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
|
|
103
110
|
`).get(input.now, input.tenantId, input.workspaceId);
|
|
104
111
|
const latest = this.db.prepare(`
|
|
105
112
|
SELECT last_error
|
|
106
113
|
FROM workspace_sync_v3_attachment_apply_obligations
|
|
107
|
-
WHERE tenant_id = ? AND workspace_id = ?
|
|
114
|
+
WHERE tenant_id = ? AND workspace_id = ?
|
|
115
|
+
AND resolved_at IS NULL AND terminal_at IS NULL
|
|
108
116
|
AND last_error IS NOT NULL
|
|
109
117
|
ORDER BY updated_at DESC, task_id ASC
|
|
110
118
|
LIMIT 1
|
|
111
119
|
`).get(input.tenantId, input.workspaceId);
|
|
112
120
|
return {
|
|
113
121
|
open: Number(aggregate?.open || 0),
|
|
122
|
+
terminal: Number(aggregate?.terminal || 0),
|
|
114
123
|
due: Number(aggregate?.due || 0),
|
|
115
124
|
oldestOpenCreatedAt: aggregate?.oldest_open_created_at || null,
|
|
116
125
|
nextAttemptAt: aggregate?.next_attempt_at || null,
|
|
@@ -142,6 +151,14 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
|
|
|
142
151
|
WHERE tenant_id = ? AND workspace_id = ? AND task_id = ? AND resolved_at IS NULL
|
|
143
152
|
`).run(input.now, input.now, input.tenantId, input.workspaceId, input.taskId);
|
|
144
153
|
}
|
|
154
|
+
markTerminalUnavailable(input) {
|
|
155
|
+
this.db.prepare(`
|
|
156
|
+
UPDATE workspace_sync_v3_attachment_apply_obligations
|
|
157
|
+
SET terminal_at = ?, terminal_reason = ?, last_error = ?, updated_at = ?
|
|
158
|
+
WHERE tenant_id = ? AND workspace_id = ? AND task_id = ?
|
|
159
|
+
AND canonical_fingerprint = ? AND resolved_at IS NULL AND terminal_at IS NULL
|
|
160
|
+
`).run(input.now, String(input.reason || '').slice(0, 500), String(input.reason || '').slice(0, 500), input.now, input.tenantId, input.workspaceId, input.taskId, input.canonicalFingerprint);
|
|
161
|
+
}
|
|
145
162
|
recordAttemptFailure(input) {
|
|
146
163
|
this.db.prepare(`
|
|
147
164
|
UPDATE workspace_sync_v3_attachment_apply_obligations
|
|
@@ -7,10 +7,11 @@ export type WorkspaceSyncV3AttachmentAssetHydrationResult = {
|
|
|
7
7
|
} | {
|
|
8
8
|
success: false;
|
|
9
9
|
error: string;
|
|
10
|
+
disposition?: 'retryable' | 'terminal-unavailable';
|
|
10
11
|
};
|
|
11
12
|
export declare function hydrateWorkspaceSyncV3AttachmentAsset(input: {
|
|
12
13
|
workspaceId: string;
|
|
13
14
|
assetId: string;
|
|
14
|
-
remoteServices: Pick<WorkspaceSyncEngineRemoteServices, 'pullWorkspaceContent' | 'abandonTransferReceipts' | '
|
|
15
|
+
remoteServices: Pick<WorkspaceSyncEngineRemoteServices, 'pullWorkspaceContent' | 'abandonTransferReceipts' | 'buildIndependentContentApplyCompletionGroup'>;
|
|
15
16
|
localServices: Pick<WorkspaceSyncEngineLocalServices, 'applyV2Batch'>;
|
|
16
17
|
}): Promise<WorkspaceSyncV3AttachmentAssetHydrationResult>;
|
|
@@ -3,20 +3,48 @@ import { fingerprintWorkspaceContentBody } from '../workspaceContentManifest.js'
|
|
|
3
3
|
export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
|
|
4
4
|
const remoteServices = input.remoteServices;
|
|
5
5
|
const applyV2Batch = input.localServices.applyV2Batch;
|
|
6
|
+
const completionIdentity = `attachment-asset:${input.assetId}`;
|
|
6
7
|
const response = await remoteServices.pullWorkspaceContent({
|
|
7
8
|
workspaceId: input.workspaceId,
|
|
8
9
|
requests: [{ kind: 'asset', assetId: input.assetId }],
|
|
9
10
|
previousCursor: null,
|
|
11
|
+
independentCompletionIdentity: completionIdentity,
|
|
10
12
|
});
|
|
11
13
|
const receipt = response.transferReceipt;
|
|
12
14
|
let transferCommitted = false;
|
|
15
|
+
let localApplyStarted = false;
|
|
13
16
|
try {
|
|
14
17
|
if (!response.ok) {
|
|
15
18
|
return { success: false, error: `Workspace attachment asset hydration failed (${response.status || 0}).` };
|
|
16
19
|
}
|
|
17
20
|
const data = response.data || {};
|
|
18
|
-
if ((data.
|
|
19
|
-
return {
|
|
21
|
+
if ((data.remaining?.length || 0) > 0) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: `Workspace attachment asset hydration is incomplete: ${input.assetId}`,
|
|
25
|
+
disposition: 'retryable',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const exactMissing = Array.isArray(data.missing) && data.missing.find((entry) => (entry?.kind === 'asset'
|
|
29
|
+
&& 'assetId' in entry
|
|
30
|
+
&& String(entry.assetId || '').trim() === input.assetId));
|
|
31
|
+
if (exactMissing) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
error: exactMissing.disposition === 'terminal-unavailable'
|
|
35
|
+
? `Workspace attachment asset is authoritatively unavailable in cloud metadata: ${input.assetId}`
|
|
36
|
+
: `Workspace attachment asset body is temporarily unavailable in cloud content: ${input.assetId}`,
|
|
37
|
+
disposition: exactMissing.disposition === 'terminal-unavailable'
|
|
38
|
+
? 'terminal-unavailable'
|
|
39
|
+
: 'retryable',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if ((data.missing?.length || 0) > 0) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
error: `Workspace attachment asset hydration returned an unexpected missing result: ${input.assetId}`,
|
|
46
|
+
disposition: 'retryable',
|
|
47
|
+
};
|
|
20
48
|
}
|
|
21
49
|
const rawChanges = Array.isArray(data.changes) ? data.changes : [];
|
|
22
50
|
const changes = rawChanges.filter((change) => ((change.op === 'document-upsert' || change.op === 'asset-upsert')
|
|
@@ -50,10 +78,9 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
|
|
|
50
78
|
return { success: false, error: `Workspace attachment asset hydration verification failed: ${input.assetId}` };
|
|
51
79
|
}
|
|
52
80
|
const completionGroup = receipt
|
|
53
|
-
? remoteServices.
|
|
81
|
+
? remoteServices.buildIndependentContentApplyCompletionGroup({
|
|
54
82
|
workspaceId: input.workspaceId,
|
|
55
|
-
|
|
56
|
-
nextCursor: null,
|
|
83
|
+
identity: completionIdentity,
|
|
57
84
|
receipts: [receipt],
|
|
58
85
|
})
|
|
59
86
|
: undefined;
|
|
@@ -63,6 +90,7 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
|
|
|
63
90
|
error: 'Workspace attachment asset hydration could not bind its transfer to local apply.',
|
|
64
91
|
};
|
|
65
92
|
}
|
|
93
|
+
localApplyStarted = true;
|
|
66
94
|
const applyResult = completionGroup
|
|
67
95
|
? await applyV2Batch(input.workspaceId, changes, { completionGroup })
|
|
68
96
|
: await applyV2Batch(input.workspaceId, changes);
|
|
@@ -80,11 +108,25 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
|
|
|
80
108
|
}
|
|
81
109
|
finally {
|
|
82
110
|
if (receipt && !transferCommitted) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
111
|
+
if (!localApplyStarted) {
|
|
112
|
+
const completionGroup = remoteServices.buildIndependentContentApplyCompletionGroup({
|
|
113
|
+
workspaceId: input.workspaceId,
|
|
114
|
+
identity: completionIdentity,
|
|
115
|
+
receipts: [receipt],
|
|
116
|
+
});
|
|
117
|
+
if (completionGroup) {
|
|
118
|
+
localApplyStarted = true;
|
|
119
|
+
const settlement = await applyV2Batch(input.workspaceId, [], { completionGroup });
|
|
120
|
+
transferCommitted = settlement.ok;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!transferCommitted) {
|
|
124
|
+
await remoteServices.abandonTransferReceipts({
|
|
125
|
+
workspaceId: input.workspaceId,
|
|
126
|
+
receipts: [receipt],
|
|
127
|
+
errorCode: 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
88
130
|
}
|
|
89
131
|
}
|
|
90
132
|
}
|
|
@@ -46,6 +46,7 @@ export type WorkspaceSyncV3CloudOperationContext = {
|
|
|
46
46
|
/** @deprecated Prefer resolveOriginActorRef; retained for create callers. */
|
|
47
47
|
resolveTaskCreateActorRef?: (originActor: NonNullable<WorkspaceSyncV3TaskCreateEnvelope['operation']['payload']['originActor']>) => string;
|
|
48
48
|
onPostCommitError?: (error: unknown) => void;
|
|
49
|
+
includeWorkflowRuntimeJournal?: boolean;
|
|
49
50
|
};
|
|
50
51
|
export type WorkspaceSyncV3CloudOperationHandler = {
|
|
51
52
|
key: string;
|
|
@@ -71,6 +71,10 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
|
|
|
71
71
|
...withDeferredOriginActor(context, operation.payload.originActor),
|
|
72
72
|
taskId: operation.entityId, patch: operation.payload.patch,
|
|
73
73
|
saveSource: operation.payload.saveSource,
|
|
74
|
+
expectedDetailRevision: operation.payload.expectedDetailRevision,
|
|
75
|
+
assertPrecondition: operation.payload.expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
|
|
76
|
+
? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, operation.payload.expectedDetailRevision, context.workspaceId)
|
|
77
|
+
: undefined,
|
|
74
78
|
baseEntityRevision: operation.baseEntityRevision, baseLifecycleRevision: operation.baseLifecycleRevision,
|
|
75
79
|
});
|
|
76
80
|
},
|
|
@@ -187,11 +191,16 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
|
|
|
187
191
|
supports: (envelope) => envelope.operation.domain === 'task' && envelope.operation.mutationKind === 'set-status',
|
|
188
192
|
apply: (envelope, context) => {
|
|
189
193
|
const operation = envelope.operation;
|
|
190
|
-
const { originActor, ...payload } = operation.payload;
|
|
194
|
+
const { originActor, expectedDetailRevision, ...payload } = operation.payload;
|
|
191
195
|
return runDurableTaskStatusMutation({
|
|
192
196
|
...withDeferredOriginActor(context, originActor),
|
|
193
197
|
taskId: operation.entityId,
|
|
194
198
|
payload,
|
|
199
|
+
expectedDetailRevision,
|
|
200
|
+
includeWorkflowRuntimeJournal: context.includeWorkflowRuntimeJournal,
|
|
201
|
+
assertPrecondition: expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
|
|
202
|
+
? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, expectedDetailRevision, context.workspaceId)
|
|
203
|
+
: undefined,
|
|
195
204
|
baseEntityRevision: operation.baseEntityRevision,
|
|
196
205
|
baseLifecycleRevision: operation.baseLifecycleRevision,
|
|
197
206
|
});
|
|
@@ -229,10 +238,16 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
|
|
|
229
238
|
supports: (envelope) => envelope.operation.domain === 'task-checklist' && envelope.operation.mutationKind === 'replace',
|
|
230
239
|
apply: (envelope, context) => {
|
|
231
240
|
const operation = envelope.operation;
|
|
241
|
+
const { originActor, expectedDetailRevision, itemUpdateIntent, items } = operation.payload;
|
|
232
242
|
return runDurableTaskChecklistReplace({
|
|
233
|
-
...withDeferredOriginActor(context,
|
|
243
|
+
...withDeferredOriginActor(context, originActor),
|
|
234
244
|
taskId: operation.entityId,
|
|
235
|
-
items
|
|
245
|
+
items,
|
|
246
|
+
expectedDetailRevision,
|
|
247
|
+
itemUpdateIntent,
|
|
248
|
+
assertPrecondition: expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
|
|
249
|
+
? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, expectedDetailRevision, context.workspaceId)
|
|
250
|
+
: undefined,
|
|
236
251
|
baseEntityRevision: operation.baseEntityRevision,
|
|
237
252
|
baseLifecycleRevision: operation.baseLifecycleRevision,
|
|
238
253
|
});
|
|
@@ -325,10 +325,14 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
|
|
|
325
325
|
let projection = initial;
|
|
326
326
|
let recoveryRepairApplied = false;
|
|
327
327
|
let restartStaleRepair = false;
|
|
328
|
+
let restartCoverageRepair = false;
|
|
328
329
|
let restartedStaleRepair = staleRepairAlreadyRestarted;
|
|
329
330
|
const persistedCoverage = projectionCoverage(projection);
|
|
330
331
|
if (!persistedCoverage)
|
|
331
332
|
return localFailure(projection, 'Persisted combined workspace sync coverage is unsupported.');
|
|
333
|
+
restartCoverageRepair = projection.owner === 'v3'
|
|
334
|
+
&& projection.repair !== null
|
|
335
|
+
&& !exactCoverage(persistedCoverage, coverage);
|
|
332
336
|
if (projection.coverageRepairRequired
|
|
333
337
|
|| (projection.owner === 'v3' && !projection.repair && !exactCoverage(persistedCoverage, coverage))) {
|
|
334
338
|
const feed = await dependencies.pullFeed(input.resolveCloudAuthUrl, {
|
|
@@ -413,12 +417,12 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
|
|
|
413
417
|
}
|
|
414
418
|
let restartExpiredRepair = false;
|
|
415
419
|
let restartedExpiredRepair = false;
|
|
416
|
-
while (projection.owner === 'v2' || projection.repair || restartStaleRepair) {
|
|
417
|
-
const previousCursor = restartExpiredRepair || restartStaleRepair
|
|
420
|
+
while (projection.owner === 'v2' || projection.repair || restartStaleRepair || restartCoverageRepair) {
|
|
421
|
+
const previousCursor = restartExpiredRepair || restartStaleRepair || restartCoverageRepair
|
|
418
422
|
? null : projection.repair?.cursor || null;
|
|
419
423
|
const feed = await dependencies.pullFeed(input.resolveCloudAuthUrl, {
|
|
420
424
|
workspaceId: input.workspaceId,
|
|
421
|
-
...(restartExpiredRepair || restartStaleRepair
|
|
425
|
+
...(restartExpiredRepair || restartStaleRepair || restartCoverageRepair
|
|
422
426
|
? { forceRepair: true }
|
|
423
427
|
: { repairCursor: previousCursor }),
|
|
424
428
|
limit: 100,
|
|
@@ -449,6 +453,7 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
|
|
|
449
453
|
projection = updated;
|
|
450
454
|
restartExpiredRepair = false;
|
|
451
455
|
restartStaleRepair = false;
|
|
456
|
+
restartCoverageRepair = false;
|
|
452
457
|
if (repairSnapshotWasInvalidated(applied)) {
|
|
453
458
|
if (restartedStaleRepair) {
|
|
454
459
|
return localFailure(projection, 'A refreshed combined repair snapshot still predates authoritative local state.');
|
|
@@ -6,7 +6,7 @@ import { validateWorkspaceSyncV3CombinedRepairPage, WorkspaceSyncV3CombinedProje
|
|
|
6
6
|
import { fingerprintWorkspaceSyncPayload, WorkspaceSyncDurabilityStore } from './syncDurabilityStore.js';
|
|
7
7
|
import { WorkflowStore } from '../../storage/workflowStore.js';
|
|
8
8
|
import { serializeTaskRelationshipForSync } from './workspaceSyncV3TaskRelationshipProjection.js';
|
|
9
|
-
import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3EntityEventPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
9
|
+
import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3EntityEventPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
10
10
|
import { applyWorkspaceSyncV3NestedTaskEntries, WorkspaceSyncV3TaskCommentAggregateDivergenceError, } from './workspaceSyncV3NestedTaskApply.js';
|
|
11
11
|
import { LocalSyncIdentityStore } from './localSyncIdentityStore.js';
|
|
12
12
|
import { enqueueLocalTaskCommentReconciliation } from './localTaskCommentOutboxService.js';
|
|
@@ -25,7 +25,8 @@ function combinedRepairBaselineMarker(page) {
|
|
|
25
25
|
})}`;
|
|
26
26
|
}
|
|
27
27
|
const NESTED_TASK_PROJECTIONS = new Set([
|
|
28
|
-
'task-comments/full-v1', 'task-checklist/full-v1', 'task-attachment-links/full-v1',
|
|
28
|
+
'task-comments/full-v1', 'task-checklist/full-v1', 'task-attachment-links/full-v1',
|
|
29
|
+
'task-attachment-links/full-v2', 'entity-event/full-v1',
|
|
29
30
|
]);
|
|
30
31
|
const WORKFLOW_RUNTIME_PROJECTIONS = new Set([
|
|
31
32
|
'workflow-published-definition/full-v2',
|
|
@@ -59,7 +60,8 @@ function coveredDomains(projections) {
|
|
|
59
60
|
domains.push('task-comments');
|
|
60
61
|
if (projections.has('task-checklist/full-v1'))
|
|
61
62
|
domains.push('task-checklist');
|
|
62
|
-
if (projections.has('task-attachment-links/full-v1')
|
|
63
|
+
if (projections.has('task-attachment-links/full-v1')
|
|
64
|
+
|| projections.has('task-attachment-links/full-v2'))
|
|
63
65
|
domains.push('task-attachment-links');
|
|
64
66
|
if (projections.has('entity-event/full-v1'))
|
|
65
67
|
domains.push('entity-event');
|
|
@@ -181,6 +183,15 @@ function isExactPlanningRootProjectionReplay(input) {
|
|
|
181
183
|
&& input.current.lastSequence === input.entry.sequence
|
|
182
184
|
&& input.current.canonicalFingerprint === (input.entry.canonicalFingerprint || input.entry.payloadFingerprint);
|
|
183
185
|
}
|
|
186
|
+
function parentOwnedNestedTaskId(entry) {
|
|
187
|
+
if (entry.projection === 'task-comments/full-v1'
|
|
188
|
+
|| entry.projection === 'task-checklist/full-v1'
|
|
189
|
+
|| entry.projection === 'task-attachment-links/full-v1'
|
|
190
|
+
|| entry.projection === 'task-attachment-links/full-v2') {
|
|
191
|
+
return entry.entityId;
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
184
195
|
function applyEntries(input) {
|
|
185
196
|
const store = new WorkspaceSyncDurabilityStore(input.core.getDatabaseAdapter());
|
|
186
197
|
const workflowApply = prepareWorkspaceSyncV3WorkflowRuntimeApply({
|
|
@@ -200,9 +211,13 @@ function applyEntries(input) {
|
|
|
200
211
|
throw coveredLocalOperationsError('Combined feed apply is blocked by covered local operations.');
|
|
201
212
|
}
|
|
202
213
|
const notices = notifications();
|
|
214
|
+
const deletedTaskRoots = new Set();
|
|
203
215
|
for (const entry of input.entries) {
|
|
204
216
|
let taskChange = null;
|
|
205
217
|
let nestedTaskChangeId = null;
|
|
218
|
+
const nestedTaskId = parentOwnedNestedTaskId(entry);
|
|
219
|
+
if (nestedTaskId && deletedTaskRoots.has(nestedTaskId))
|
|
220
|
+
continue;
|
|
206
221
|
const current = store.readWorkspaceDomainOwnership({ tenantId: input.tenantId,
|
|
207
222
|
workspaceId: input.workspaceId, domain: entry.domain, entityId: entry.entityId });
|
|
208
223
|
const exactTaskRootReplay = isExactTaskRootProjectionReplay({ entry, current });
|
|
@@ -288,6 +303,16 @@ function applyEntries(input) {
|
|
|
288
303
|
shouldRecordRevision: (result) => result?.state !== 'deferred',
|
|
289
304
|
});
|
|
290
305
|
}
|
|
306
|
+
if (entry.projection === 'task/root-v1') {
|
|
307
|
+
if (taskChange === 'upsert') {
|
|
308
|
+
deletedTaskRoots.delete(entry.entityId);
|
|
309
|
+
}
|
|
310
|
+
else if (taskChange === 'delete'
|
|
311
|
+
|| (!input.core.getTask(entry.entityId, input.workspaceId)
|
|
312
|
+
&& input.core.hasTaskDeletionMarkerForSync(entry.entityId, input.workspaceId))) {
|
|
313
|
+
deletedTaskRoots.add(entry.entityId);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
291
316
|
if (applied.state !== 'applied')
|
|
292
317
|
continue;
|
|
293
318
|
if (entry.projection === 'task/root-v1' && entry.mutationKind !== 'delete') {
|
|
@@ -366,12 +391,19 @@ function listLocalTaskNestedProjection(core, workspaceId, projection) {
|
|
|
366
391
|
taskId: task.id, items: task.checklistItems || [],
|
|
367
392
|
}));
|
|
368
393
|
}
|
|
369
|
-
else {
|
|
394
|
+
else if (projection === 'task-attachment-links/full-v1') {
|
|
370
395
|
values.set(task.id, serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
371
396
|
taskId: task.id,
|
|
372
397
|
links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
|
|
373
398
|
}));
|
|
374
399
|
}
|
|
400
|
+
else {
|
|
401
|
+
values.set(task.id, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
402
|
+
taskId: task.id,
|
|
403
|
+
links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
|
|
404
|
+
cardCoverAssetId: task.cardCoverAssetId ?? null,
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
375
407
|
}
|
|
376
408
|
const last = page.at(-1);
|
|
377
409
|
cursor = page.length === 1000 && last
|
|
@@ -416,6 +448,9 @@ function nestedLocalDomains(core, workspaceId, projections, liveEntityIds) {
|
|
|
416
448
|
if (projections.has('task-attachment-links/full-v1')) {
|
|
417
449
|
domains.push(['task-attachment-links', listLocalTaskNestedProjection(core, workspaceId, 'task-attachment-links/full-v1')]);
|
|
418
450
|
}
|
|
451
|
+
else if (projections.has('task-attachment-links/full-v2')) {
|
|
452
|
+
domains.push(['task-attachment-links', listLocalTaskNestedProjection(core, workspaceId, 'task-attachment-links/full-v2')]);
|
|
453
|
+
}
|
|
419
454
|
if (projections.has('entity-event/full-v1')) {
|
|
420
455
|
domains.push(['entity-event', listLocalEntityEvents(core, workspaceId, liveEntityIds)]);
|
|
421
456
|
}
|
|
@@ -560,13 +595,18 @@ function isCompatibleLegacyAttachmentLinks(core, workspaceId, local, incoming) {
|
|
|
560
595
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
561
596
|
return false;
|
|
562
597
|
const incomingLink = value;
|
|
563
|
-
if (localLink.role !== incomingLink.role)
|
|
564
|
-
return false;
|
|
565
598
|
const localAsset = store.get(String(localLink.assetId || ''), workspaceId);
|
|
566
599
|
const incomingAsset = store.get(String(incomingLink.assetId || ''), workspaceId);
|
|
567
600
|
if (!localAsset || !incomingAsset || localAsset.deletedAt || incomingAsset.deletedAt
|
|
568
601
|
|| localAsset.storageKey !== incomingAsset.storageKey)
|
|
569
602
|
return false;
|
|
603
|
+
const compatibleRole = localLink.role === incomingLink.role
|
|
604
|
+
|| (localAsset.storageProvider === 'external'
|
|
605
|
+
&& localLink.role === 'reference'
|
|
606
|
+
&& incomingAsset.storageProvider !== 'external'
|
|
607
|
+
&& incomingLink.role === (incomingAsset.kind === 'image' ? 'image' : 'attachment'));
|
|
608
|
+
if (!compatibleRole)
|
|
609
|
+
return false;
|
|
570
610
|
const sameContent = localAsset.contentSha256 === incomingAsset.contentSha256
|
|
571
611
|
&& localAsset.sizeBytes === incomingAsset.sizeBytes;
|
|
572
612
|
const authoritativeMaterialization = localAsset.storageProvider === 'external'
|
|
@@ -584,15 +624,15 @@ function isCompatibleLegacyAttachmentLinks(core, workspaceId, local, incoming) {
|
|
|
584
624
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
585
625
|
return false;
|
|
586
626
|
const incomingLink = value;
|
|
587
|
-
if (localLink.role !== incomingLink.role)
|
|
588
|
-
return false;
|
|
589
627
|
const incomingAsset = store.get(String(incomingLink.assetId || ''), workspaceId);
|
|
590
628
|
return Boolean(incomingAsset && !incomingAsset.deletedAt
|
|
591
629
|
&& incomingAsset.storageProvider !== 'external'
|
|
630
|
+
&& localLink.role === 'reference'
|
|
631
|
+
&& incomingLink.role === (incomingAsset.kind === 'image' ? 'image' : 'attachment')
|
|
592
632
|
&& incomingAsset.storageKey === localAsset.storageKey
|
|
593
633
|
&& incomingAsset.sizeBytes >= localAsset.sizeBytes);
|
|
594
634
|
}));
|
|
595
|
-
})
|
|
635
|
+
});
|
|
596
636
|
return compatible;
|
|
597
637
|
}
|
|
598
638
|
function assertLocalInventoryReady(input) {
|
|
@@ -981,7 +1021,8 @@ export function applyWorkspaceSyncV3CombinedRepairPage(input) {
|
|
|
981
1021
|
const supportedTarget = ((target.domain === 'task' && entry.projection === 'task/root-v1')
|
|
982
1022
|
|| (target.domain === 'task-comments' && entry.projection === 'task-comments/full-v1')
|
|
983
1023
|
|| (target.domain === 'task-attachment-links'
|
|
984
|
-
&& entry.projection === 'task-attachment-links/full-v1'
|
|
1024
|
+
&& (entry.projection === 'task-attachment-links/full-v1'
|
|
1025
|
+
|| entry.projection === 'task-attachment-links/full-v2'))
|
|
985
1026
|
|| (target.domain === 'entity-event' && entry.projection === 'entity-event/full-v1'));
|
|
986
1027
|
if (!supportedTarget) {
|
|
987
1028
|
throw new Error('Targeted workspace sync recovery does not support this projection.');
|
|
@@ -6,7 +6,9 @@ export declare function prepareWorkspaceSyncV3CombinedRepairSnapshot(input: {
|
|
|
6
6
|
now?: string;
|
|
7
7
|
nestedCoverage?: boolean;
|
|
8
8
|
workflowCoverage?: boolean;
|
|
9
|
+
workflowTaskCoverCoverage?: boolean;
|
|
9
10
|
planningOrderCoverage?: boolean;
|
|
11
|
+
taskCoverCoverage?: boolean;
|
|
10
12
|
coveredLegacyWritesFenced?: boolean;
|
|
11
13
|
}): {
|
|
12
14
|
highWatermark: string;
|
|
@@ -35,6 +37,18 @@ export declare function prepareWorkspaceSyncV3PlanningOrderRepairSnapshot(input:
|
|
|
35
37
|
now?: string;
|
|
36
38
|
coveredLegacyWritesFenced?: boolean;
|
|
37
39
|
}): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
|
|
40
|
+
export declare function prepareWorkspaceSyncV3TaskCoverRepairSnapshot(input: {
|
|
41
|
+
core: TaskforceCore;
|
|
42
|
+
workspaceId: string;
|
|
43
|
+
now?: string;
|
|
44
|
+
coveredLegacyWritesFenced?: boolean;
|
|
45
|
+
}): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
|
|
46
|
+
export declare function prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input: {
|
|
47
|
+
core: TaskforceCore;
|
|
48
|
+
workspaceId: string;
|
|
49
|
+
now?: string;
|
|
50
|
+
coveredLegacyWritesFenced?: boolean;
|
|
51
|
+
}): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
|
|
38
52
|
export declare function ensureWorkspaceSyncV3CombinedRepairBaselines(input: {
|
|
39
53
|
core: TaskforceCore;
|
|
40
54
|
workspaceId: string;
|
|
@@ -3,11 +3,13 @@ import { serializeInitiativeForSync, serializeWorkstreamForSync } from '../plann
|
|
|
3
3
|
import { serializeTaskForSync } from '../taskSyncPayload.js';
|
|
4
4
|
import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
|
|
5
5
|
import { WORKSPACE_SYNC_COMBINED_PROJECTION, fingerprintWorkspaceSyncPayload, WORKSPACE_SYNC_CONTRACT_VERSION, WorkspaceSyncRevisionConflictError, } from './syncDurabilityStore.js';
|
|
6
|
-
import { buildWorkspaceSyncV3CombinedRepairSnapshot, buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates, buildWorkspaceSyncV3NestedRepairSnapshot, buildWorkspaceSyncV3PlanningOrderRepairSnapshot, buildWorkspaceSyncV3WorkflowRepairSnapshot, listWorkspaceSyncV3CombinedRepairCandidates, listWorkspaceSyncV3NestedRepairCandidates, listWorkspaceSyncV3PlanningOrderRepairCandidates, listWorkspaceSyncV3WorkflowRepairCandidates, } from './workspaceSyncV3CombinedRepairSnapshot.js';
|
|
6
|
+
import { buildWorkspaceSyncV3CombinedRepairSnapshot, buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates, buildWorkspaceSyncV3NestedRepairSnapshot, buildWorkspaceSyncV3PlanningOrderRepairSnapshot, buildWorkspaceSyncV3TaskCoverRepairSnapshot, buildWorkspaceSyncV3WorkflowRepairSnapshot, buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot, listWorkspaceSyncV3CombinedRepairCandidates, listWorkspaceSyncV3NestedRepairCandidates, listWorkspaceSyncV3PlanningOrderRepairCandidates, listWorkspaceSyncV3TaskCoverRepairCandidates, listWorkspaceSyncV3WorkflowRepairCandidates, listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates, } from './workspaceSyncV3CombinedRepairSnapshot.js';
|
|
7
7
|
import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE } from './workspaceSyncV3CombinedCoverage.js';
|
|
8
8
|
import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE } from './workspaceSyncV3NestedCoverage.js';
|
|
9
9
|
import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowCoverage.js';
|
|
10
10
|
import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE } from './workspaceSyncV3PlanningOrderCoverage.js';
|
|
11
|
+
import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3TaskCoverCoverage.js';
|
|
12
|
+
import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
|
|
11
13
|
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
12
14
|
import { projectWorkspaceSyncV3NestedTaskJournalRow } from './workspaceSyncV3NestedTaskProjection.js';
|
|
13
15
|
import { serializeTaskRelationshipForSync } from './workspaceSyncV3TaskRelationshipProjection.js';
|
|
@@ -260,13 +262,17 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
|
|
|
260
262
|
`).get(tenantId, workspaceId, now);
|
|
261
263
|
sequence(lock?.last_sequence);
|
|
262
264
|
const lockCompletedAt = Date.now();
|
|
263
|
-
const candidates = input.
|
|
264
|
-
?
|
|
265
|
-
: input.
|
|
266
|
-
?
|
|
267
|
-
: input.
|
|
268
|
-
?
|
|
269
|
-
:
|
|
265
|
+
const candidates = input.workflowTaskCoverCoverage
|
|
266
|
+
? listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates(input.core, workspaceId)
|
|
267
|
+
: input.workflowCoverage
|
|
268
|
+
? listWorkspaceSyncV3WorkflowRepairCandidates(input.core, workspaceId)
|
|
269
|
+
: input.taskCoverCoverage
|
|
270
|
+
? listWorkspaceSyncV3TaskCoverRepairCandidates(input.core, workspaceId)
|
|
271
|
+
: input.planningOrderCoverage
|
|
272
|
+
? listWorkspaceSyncV3PlanningOrderRepairCandidates(input.core, workspaceId)
|
|
273
|
+
: input.nestedCoverage
|
|
274
|
+
? listWorkspaceSyncV3NestedRepairCandidates(input.core, workspaceId)
|
|
275
|
+
: listWorkspaceSyncV3CombinedRepairCandidates(input.core, workspaceId);
|
|
270
276
|
const inventoryCompletedAt = Date.now();
|
|
271
277
|
const keys = candidates.map((candidate) => `${candidate.domain}\0${candidate.entityId}`);
|
|
272
278
|
if (new Set(keys).size !== keys.length)
|
|
@@ -548,13 +554,17 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
|
|
|
548
554
|
throw repairConflict('legacy-nested-repair-raced', repair.candidate);
|
|
549
555
|
}
|
|
550
556
|
const baselineWritesCompletedAt = Date.now();
|
|
551
|
-
const profile = input.
|
|
552
|
-
?
|
|
553
|
-
: input.
|
|
554
|
-
?
|
|
555
|
-
: input.
|
|
556
|
-
?
|
|
557
|
-
:
|
|
557
|
+
const profile = input.workflowTaskCoverCoverage
|
|
558
|
+
? WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE
|
|
559
|
+
: input.workflowCoverage
|
|
560
|
+
? WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE
|
|
561
|
+
: input.taskCoverCoverage
|
|
562
|
+
? WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE
|
|
563
|
+
: input.planningOrderCoverage
|
|
564
|
+
? WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE
|
|
565
|
+
: input.nestedCoverage
|
|
566
|
+
? WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE
|
|
567
|
+
: WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE;
|
|
558
568
|
const activeOwner = db.prepare(`
|
|
559
569
|
SELECT 1 AS active
|
|
560
570
|
FROM workspace_sync_projection_state
|
|
@@ -575,24 +585,32 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
|
|
|
575
585
|
inventory: candidates,
|
|
576
586
|
nestedCoverage: input.nestedCoverage === true,
|
|
577
587
|
workflowCoverage: input.workflowCoverage === true,
|
|
588
|
+
workflowTaskCoverCoverage: input.workflowTaskCoverCoverage === true,
|
|
578
589
|
planningOrderCoverage: input.planningOrderCoverage === true,
|
|
590
|
+
taskCoverCoverage: input.taskCoverCoverage === true,
|
|
579
591
|
})
|
|
580
|
-
: input.
|
|
581
|
-
?
|
|
582
|
-
: input.
|
|
583
|
-
?
|
|
584
|
-
: input.
|
|
585
|
-
?
|
|
586
|
-
:
|
|
592
|
+
: input.workflowTaskCoverCoverage
|
|
593
|
+
? buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot({ core: input.core, workspaceId })
|
|
594
|
+
: input.workflowCoverage
|
|
595
|
+
? buildWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId })
|
|
596
|
+
: input.taskCoverCoverage
|
|
597
|
+
? buildWorkspaceSyncV3TaskCoverRepairSnapshot({ core: input.core, workspaceId })
|
|
598
|
+
: input.planningOrderCoverage
|
|
599
|
+
? buildWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId })
|
|
600
|
+
: input.nestedCoverage
|
|
601
|
+
? buildWorkspaceSyncV3NestedRepairSnapshot({ core: input.core, workspaceId })
|
|
602
|
+
: buildWorkspaceSyncV3CombinedRepairSnapshot({ core: input.core, workspaceId });
|
|
587
603
|
const snapshotCompletedAt = Date.now();
|
|
588
604
|
if (snapshot.snapshotSequence !== highWatermark) {
|
|
589
605
|
throw new Error('Combined repair baseline snapshot sequence changed while locked.');
|
|
590
606
|
}
|
|
591
607
|
console.info('[Taskforce Sync Repair Baseline Timing]', JSON.stringify({
|
|
592
608
|
workspaceId,
|
|
593
|
-
coverage: input.
|
|
594
|
-
: input.
|
|
595
|
-
: input.
|
|
609
|
+
coverage: input.workflowTaskCoverCoverage ? 'workflow-task-cover'
|
|
610
|
+
: input.workflowCoverage ? 'workflow'
|
|
611
|
+
: input.taskCoverCoverage ? 'task-cover'
|
|
612
|
+
: input.planningOrderCoverage ? 'planning-order'
|
|
613
|
+
: input.nestedCoverage ? 'nested' : 'combined',
|
|
596
614
|
candidates: candidates.length,
|
|
597
615
|
lock: lockCompletedAt - startedAt,
|
|
598
616
|
inventory: inventoryCompletedAt - lockCompletedAt,
|
|
@@ -615,6 +633,12 @@ export function prepareWorkspaceSyncV3WorkflowRepairSnapshot(input) {
|
|
|
615
633
|
export function prepareWorkspaceSyncV3PlanningOrderRepairSnapshot(input) {
|
|
616
634
|
return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, planningOrderCoverage: true });
|
|
617
635
|
}
|
|
636
|
+
export function prepareWorkspaceSyncV3TaskCoverRepairSnapshot(input) {
|
|
637
|
+
return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, taskCoverCoverage: true });
|
|
638
|
+
}
|
|
639
|
+
export function prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input) {
|
|
640
|
+
return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, workflowTaskCoverCoverage: true });
|
|
641
|
+
}
|
|
618
642
|
export function ensureWorkspaceSyncV3CombinedRepairBaselines(input) {
|
|
619
643
|
const { snapshot: _snapshot, ...result } = prepareWorkspaceSyncV3CombinedRepairSnapshot(input);
|
|
620
644
|
return result;
|