@taskforcehq/taskforce 0.3.329 → 0.3.332
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/README.md +7 -2
- package/dist/Taskforce.module.css +290 -45
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/TaskSettings.js +70 -14
- 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 +2 -2
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
- 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 +15 -3
- package/dist/components/features/planning/planningMetadata.d.ts +10 -0
- package/dist/components/features/planning/planningMetadata.js +8 -0
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +3 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/views/StandaloneLayout.js +62 -27
- package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
- package/dist/components/views/panels/PlanningDrawer.js +12 -8
- 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 +55 -1
- package/dist/core/McpTokenService.d.ts +25 -1
- package/dist/core/McpTokenService.js +106 -15
- 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 +43 -3
- package/dist/core/Taskforce.js +158 -7
- package/dist/core/types.d.ts +9 -0
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
- package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
- 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/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/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +31 -1
- package/dist/hooks/useTaskData.js +29 -7
- package/dist/hooks/useTaskMutations.d.ts +3 -1
- package/dist/hooks/useTaskMutations.js +46 -12
- package/dist/hooks/useTaskforce.d.ts +2 -0
- package/dist/hooks/useTaskforce.js +11 -2
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +9 -6
- 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 +11 -0
- package/dist/mcp/httpProtocolRouting.js +22 -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 +408 -102
- package/dist/mcp/taskPlanningRegistrar.js +25 -6
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +11 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +9 -8
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +415 -0
- package/dist/runtime/appGates.d.ts +2 -1
- package/dist/runtime/appGates.js +7 -0
- package/dist/server/buildInfo.d.ts +1 -0
- package/dist/server/buildInfo.js +5 -1
- package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
- package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +108 -11
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.js +2 -1
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +126 -5
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +277 -24
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
- 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 +136 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/shared.d.ts +22 -0
- package/dist/server/routes/shared.js +298 -182
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +5 -1
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +10 -1
- package/dist/server/routes/syncV3OperationRoutes.js +35 -9
- package/dist/server/routes/tasks.js +21 -2
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes.js +59 -0
- package/dist/service/localServiceCli.d.ts +2 -2
- package/dist/service/localServiceCli.js +4 -3
- package/dist/services/codexAppServerModelGateway.d.ts +54 -5
- package/dist/services/codexAppServerModelGateway.js +246 -21
- 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 +139 -0
- package/dist/services/executorPhaseAIssuerCore.js +402 -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 +2 -2
- package/dist/services/taskforceAgentMcpBridge.js +42 -29
- 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 -9
- package/dist/shared/taskforceAgentModels.js +7 -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 +4 -0
- package/dist/storage/postgresAdapter.js +14 -1
- package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
- package/dist/storage/postgresRequestDiagnostics.js +15 -2
- package/dist/storage/postgresWorker.js +20 -2
- package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/storage/workflowStore.d.ts +2 -0
- package/dist/storage/workflowStore.js +39 -2
- package/dist/sync/cloudSyncApi.js +4 -2
- package/dist/sync/collaborationSyncState.js +5 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
- 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/workspaceSyncEngineLifecyclePolicy.js +6 -6
- 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/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
- package/dist/sync/syncApplyHandlers.d.ts +3 -0
- package/dist/sync/syncApplyHandlers.js +81 -15
- package/dist/sync/syncService.d.ts +15 -0
- package/dist/sync/syncService.js +83 -18
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +4 -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.js +3 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
- 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/localOutboxRecoveryPreparationService.js +8 -2
- 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.d.ts +3 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
- package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
- package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
- package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
- package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
- package/dist/sync/v3/syncDurabilityStore.js +202 -8
- package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
- package/dist/sync/v3/taskChecklistMutationService.js +44 -1
- package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
- package/dist/sync/v3/taskStatusMutationService.js +119 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
- package/dist/sync/v3/workflowAssignmentSync.js +27 -0
- package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
- package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
- 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/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
- package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
- 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/workspaceRepair.d.ts +5 -2
- package/dist/sync/workspaceRepair.js +161 -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/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
- package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
- package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
- package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
- package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
- package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-DSQINwt9.js +7 -0
- package/dist/ui/assets/{vendor-icons-D9Lpw-j4.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/taskEvents.d.ts +2 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +24 -4
- package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
- package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
- package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
- package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-I5zhdtgt.js +0 -7
- package/dist/ui/assets/index-VRFsx3wz.css +0 -1
|
@@ -4,6 +4,7 @@ import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE } from './workspaceSyncV3Nest
|
|
|
4
4
|
import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowCoverage.js';
|
|
5
5
|
import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE } from './workspaceSyncV3PlanningOrderCoverage.js';
|
|
6
6
|
import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3TaskCoverCoverage.js';
|
|
7
|
+
import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
|
|
7
8
|
import { type WorkspaceSyncV3FeedEntry } from './workspaceSyncV3Feed.js';
|
|
8
9
|
import { type WorkspaceSyncV3FeedCursorKeyring } from './workspaceSyncV3FeedCursorKeys.js';
|
|
9
10
|
export interface WorkspaceSyncV3CombinedRepairCursor {
|
|
@@ -22,7 +23,7 @@ export interface WorkspaceSyncV3CombinedRepairPage {
|
|
|
22
23
|
success: true;
|
|
23
24
|
protocolVersion: 3;
|
|
24
25
|
workspaceId: string;
|
|
25
|
-
coverage: typeof WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE;
|
|
26
|
+
coverage: typeof WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE | typeof WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE;
|
|
26
27
|
snapshotId: string;
|
|
27
28
|
snapshotSequence: string;
|
|
28
29
|
expiresAt: string;
|
|
@@ -49,6 +50,7 @@ export declare function decodeWorkspaceSyncV3NestedRepairCursor(raw: string | nu
|
|
|
49
50
|
export declare function decodeWorkspaceSyncV3WorkflowRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
|
|
50
51
|
export declare function decodeWorkspaceSyncV3PlanningOrderRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
|
|
51
52
|
export declare function decodeWorkspaceSyncV3TaskCoverRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
|
|
53
|
+
export declare function decodeWorkspaceSyncV3WorkflowTaskCoverRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
|
|
52
54
|
export declare const WORKSPACE_SYNC_REPAIR_SNAPSHOT_CLEANUP_BATCH_SIZE = 500;
|
|
53
55
|
export declare function buildWorkspaceSyncV3CombinedRepairPage(input: {
|
|
54
56
|
core: TaskforceCore;
|
|
@@ -61,11 +63,13 @@ export declare function buildWorkspaceSyncV3CombinedRepairPage(input: {
|
|
|
61
63
|
now?: string;
|
|
62
64
|
nestedCoverage?: boolean;
|
|
63
65
|
workflowCoverage?: boolean;
|
|
66
|
+
workflowTaskCoverCoverage?: boolean;
|
|
64
67
|
planningOrderCoverage?: boolean;
|
|
65
68
|
taskCoverCoverage?: boolean;
|
|
66
69
|
coveredLegacyWritesFenced?: boolean;
|
|
67
70
|
}): WorkspaceSyncV3CombinedRepairPage;
|
|
68
|
-
export declare function buildWorkspaceSyncV3NestedRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
69
|
-
export declare function buildWorkspaceSyncV3WorkflowRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
70
|
-
export declare function buildWorkspaceSyncV3PlanningOrderRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
71
|
-
export declare function buildWorkspaceSyncV3TaskCoverRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
71
|
+
export declare function buildWorkspaceSyncV3NestedRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'workflowTaskCoverCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
72
|
+
export declare function buildWorkspaceSyncV3WorkflowRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'workflowTaskCoverCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
73
|
+
export declare function buildWorkspaceSyncV3PlanningOrderRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'workflowTaskCoverCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
74
|
+
export declare function buildWorkspaceSyncV3TaskCoverRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'workflowTaskCoverCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
75
|
+
export declare function buildWorkspaceSyncV3WorkflowTaskCoverRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'workflowTaskCoverCoverage' | 'planningOrderCoverage' | 'taskCoverCoverage'>): WorkspaceSyncV3CombinedRepairPage;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createHmac, randomUUID, timingSafeEqual } from 'crypto';
|
|
2
2
|
import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
|
|
3
3
|
import { decodeCanonicalWorkspaceSyncBase64Url } from './workspaceSyncV3CursorEncoding.js';
|
|
4
|
-
import { prepareWorkspaceSyncV3CombinedRepairSnapshot, prepareWorkspaceSyncV3NestedRepairSnapshot, prepareWorkspaceSyncV3PlanningOrderRepairSnapshot, prepareWorkspaceSyncV3TaskCoverRepairSnapshot, prepareWorkspaceSyncV3WorkflowRepairSnapshot, } from './workspaceSyncV3CombinedRepairBaseline.js';
|
|
4
|
+
import { prepareWorkspaceSyncV3CombinedRepairSnapshot, prepareWorkspaceSyncV3NestedRepairSnapshot, prepareWorkspaceSyncV3PlanningOrderRepairSnapshot, prepareWorkspaceSyncV3TaskCoverRepairSnapshot, prepareWorkspaceSyncV3WorkflowRepairSnapshot, prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot, } from './workspaceSyncV3CombinedRepairBaseline.js';
|
|
5
5
|
import { validateWorkspaceSyncV3CombinedFeedEntry, WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE, } from './workspaceSyncV3CombinedCoverage.js';
|
|
6
6
|
import { validateWorkspaceSyncV3NestedCoverageFeedEntry, WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE, } from './workspaceSyncV3NestedCoverage.js';
|
|
7
7
|
import { validateWorkspaceSyncV3WorkflowCoverageFeedEntry, WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE, } from './workspaceSyncV3WorkflowCoverage.js';
|
|
8
8
|
import { validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry, WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE, } from './workspaceSyncV3PlanningOrderCoverage.js';
|
|
9
9
|
import { validateWorkspaceSyncV3TaskCoverCoverageFeedEntry, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE, } from './workspaceSyncV3TaskCoverCoverage.js';
|
|
10
|
+
import { validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE, } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
|
|
10
11
|
import { createWorkspaceSyncV3FeedResumeCursor, WorkspaceSyncV3FeedOperationTooLargeError, } from './workspaceSyncV3Feed.js';
|
|
11
12
|
import { findWorkspaceSyncV3FeedCursorVerificationKey, } from './workspaceSyncV3FeedCursorKeys.js';
|
|
12
13
|
import { WORKSPACE_SYNC_COMBINED_PROJECTION, WORKSPACE_SYNC_CONTRACT_VERSION, } from './syncDurabilityStore.js';
|
|
@@ -99,16 +100,21 @@ export function decodeWorkspaceSyncV3PlanningOrderRepairCursor(raw, keyring) {
|
|
|
99
100
|
export function decodeWorkspaceSyncV3TaskCoverRepairCursor(raw, keyring) {
|
|
100
101
|
return decodeRepairCursor(raw, keyring, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE);
|
|
101
102
|
}
|
|
103
|
+
export function decodeWorkspaceSyncV3WorkflowTaskCoverRepairCursor(raw, keyring) {
|
|
104
|
+
return decodeRepairCursor(raw, keyring, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE);
|
|
105
|
+
}
|
|
102
106
|
function repairProfile(coverage) {
|
|
103
|
-
return coverage === 'workflow'
|
|
104
|
-
?
|
|
105
|
-
: coverage === '
|
|
106
|
-
?
|
|
107
|
-
: coverage === '
|
|
108
|
-
?
|
|
109
|
-
: coverage === '
|
|
110
|
-
?
|
|
111
|
-
:
|
|
107
|
+
return coverage === 'workflow-task-cover'
|
|
108
|
+
? WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE
|
|
109
|
+
: coverage === 'workflow'
|
|
110
|
+
? WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE
|
|
111
|
+
: coverage === 'task-cover'
|
|
112
|
+
? WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE
|
|
113
|
+
: coverage === 'planning-order'
|
|
114
|
+
? WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE
|
|
115
|
+
: coverage === 'nested'
|
|
116
|
+
? WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE
|
|
117
|
+
: WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE;
|
|
112
118
|
}
|
|
113
119
|
function containsCurrentEntityEventInventory(input) {
|
|
114
120
|
if (input.coverage === 'combined')
|
|
@@ -355,15 +361,17 @@ function mapEntry(row, coverage) {
|
|
|
355
361
|
payloadFingerprint: String(row.payload_fingerprint || ''), payload,
|
|
356
362
|
occurredAt: timestamp(row.occurred_at, 'Combined repair occurrence time'),
|
|
357
363
|
};
|
|
358
|
-
(coverage === 'workflow'
|
|
359
|
-
?
|
|
360
|
-
: coverage === '
|
|
361
|
-
?
|
|
362
|
-
: coverage === '
|
|
363
|
-
?
|
|
364
|
-
: coverage === '
|
|
365
|
-
?
|
|
366
|
-
:
|
|
364
|
+
(coverage === 'workflow-task-cover'
|
|
365
|
+
? validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry
|
|
366
|
+
: coverage === 'workflow'
|
|
367
|
+
? validateWorkspaceSyncV3WorkflowCoverageFeedEntry
|
|
368
|
+
: coverage === 'task-cover'
|
|
369
|
+
? validateWorkspaceSyncV3TaskCoverCoverageFeedEntry
|
|
370
|
+
: coverage === 'planning-order'
|
|
371
|
+
? validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry
|
|
372
|
+
: coverage === 'nested'
|
|
373
|
+
? validateWorkspaceSyncV3NestedCoverageFeedEntry
|
|
374
|
+
: validateWorkspaceSyncV3CombinedFeedEntry)(entry);
|
|
367
375
|
return entry;
|
|
368
376
|
}
|
|
369
377
|
function finalizePage(input) {
|
|
@@ -420,15 +428,17 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
|
|
|
420
428
|
const pageSize = Math.max(1, Math.min(MAX_PAGE_SIZE, Math.floor(input.pageSize || DEFAULT_PAGE_SIZE)));
|
|
421
429
|
const maxResponseBytes = Math.max(1024, Math.min(8 * 1024 * 1024, Math.floor(input.maxResponseBytes || DEFAULT_MAX_RESPONSE_BYTES)));
|
|
422
430
|
const db = input.core.getDatabaseAdapter();
|
|
423
|
-
const coverage = input.
|
|
424
|
-
? 'workflow'
|
|
425
|
-
: input.
|
|
426
|
-
? '
|
|
427
|
-
: input.
|
|
428
|
-
? '
|
|
429
|
-
: input.
|
|
430
|
-
? '
|
|
431
|
-
:
|
|
431
|
+
const coverage = input.workflowTaskCoverCoverage
|
|
432
|
+
? 'workflow-task-cover'
|
|
433
|
+
: input.workflowCoverage
|
|
434
|
+
? 'workflow'
|
|
435
|
+
: input.taskCoverCoverage
|
|
436
|
+
? 'task-cover'
|
|
437
|
+
: input.planningOrderCoverage
|
|
438
|
+
? 'planning-order'
|
|
439
|
+
: input.nestedCoverage
|
|
440
|
+
? 'nested'
|
|
441
|
+
: 'combined';
|
|
432
442
|
if (input.cursor && Date.parse(input.cursor.expiresAt) <= Date.parse(now)) {
|
|
433
443
|
cleanupExpiredBestEffort(input.core, tenantId, workspaceId, now);
|
|
434
444
|
throw new WorkspaceSyncV3CombinedRepairSnapshotUnavailableError();
|
|
@@ -467,20 +477,23 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
|
|
|
467
477
|
return { metadata: reusable, reused: true,
|
|
468
478
|
insertedBaselineEntities: 0, insertedBaselineJournalRows: 0 };
|
|
469
479
|
const repairStartedAt = Date.now();
|
|
470
|
-
const prepared = coverage === 'workflow'
|
|
471
|
-
?
|
|
480
|
+
const prepared = coverage === 'workflow-task-cover'
|
|
481
|
+
? prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot({ core: input.core, workspaceId, now,
|
|
472
482
|
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
|
|
473
|
-
: coverage === '
|
|
474
|
-
?
|
|
483
|
+
: coverage === 'workflow'
|
|
484
|
+
? prepareWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId, now,
|
|
475
485
|
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
|
|
476
|
-
: coverage === '
|
|
477
|
-
?
|
|
486
|
+
: coverage === 'planning-order'
|
|
487
|
+
? prepareWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId, now,
|
|
478
488
|
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
|
|
479
|
-
: coverage === '
|
|
480
|
-
?
|
|
489
|
+
: coverage === 'task-cover'
|
|
490
|
+
? prepareWorkspaceSyncV3TaskCoverRepairSnapshot({ core: input.core, workspaceId, now,
|
|
481
491
|
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
|
|
482
|
-
:
|
|
483
|
-
|
|
492
|
+
: coverage === 'nested'
|
|
493
|
+
? prepareWorkspaceSyncV3NestedRepairSnapshot({ core: input.core, workspaceId, now,
|
|
494
|
+
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
|
|
495
|
+
: prepareWorkspaceSyncV3CombinedRepairSnapshot({ core: input.core, workspaceId, now,
|
|
496
|
+
coveredLegacyWritesFenced: input.coveredLegacyWritesFenced });
|
|
484
497
|
// Production expiry is sampled at the end of persistence, after
|
|
485
498
|
// every immutable payload row has committed in the same lock.
|
|
486
499
|
const materializationStartedAt = input.now
|
|
@@ -576,3 +589,6 @@ export function buildWorkspaceSyncV3PlanningOrderRepairPage(input) {
|
|
|
576
589
|
export function buildWorkspaceSyncV3TaskCoverRepairPage(input) {
|
|
577
590
|
return buildWorkspaceSyncV3CombinedRepairPage({ ...input, taskCoverCoverage: true });
|
|
578
591
|
}
|
|
592
|
+
export function buildWorkspaceSyncV3WorkflowTaskCoverRepairPage(input) {
|
|
593
|
+
return buildWorkspaceSyncV3CombinedRepairPage({ ...input, workflowTaskCoverCoverage: true });
|
|
594
|
+
}
|
|
@@ -35,6 +35,8 @@ export declare function listWorkspaceSyncV3NestedRepairCandidates(core: Taskforc
|
|
|
35
35
|
export declare function listWorkspaceSyncV3TaskCoverRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
|
|
36
36
|
/** Candidate v5 inventory. Coverage-v3/v4 inventories intentionally remain unchanged. */
|
|
37
37
|
export declare function listWorkspaceSyncV3WorkflowRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
|
|
38
|
+
/** Candidate v8 inventory. It composes v7 task-cover state with workflow runtime. */
|
|
39
|
+
export declare function listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
|
|
38
40
|
/** Candidate v6 inventory. Workflow v5 remains an independent dark contract. */
|
|
39
41
|
export declare function listWorkspaceSyncV3PlanningOrderRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
|
|
40
42
|
export declare function buildWorkspaceSyncV3CombinedRepairSnapshot(input: {
|
|
@@ -51,6 +53,7 @@ export declare function buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCand
|
|
|
51
53
|
inventory: WorkspaceSyncV3CombinedRepairCandidate[];
|
|
52
54
|
nestedCoverage?: boolean;
|
|
53
55
|
workflowCoverage?: boolean;
|
|
56
|
+
workflowTaskCoverCoverage?: boolean;
|
|
54
57
|
planningOrderCoverage?: boolean;
|
|
55
58
|
taskCoverCoverage?: boolean;
|
|
56
59
|
}): {
|
|
@@ -85,4 +88,11 @@ export declare function buildWorkspaceSyncV3TaskCoverRepairSnapshot(input: {
|
|
|
85
88
|
snapshotSequence: string;
|
|
86
89
|
entries: WorkspaceSyncV3FeedEntry[];
|
|
87
90
|
};
|
|
91
|
+
export declare function buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input: {
|
|
92
|
+
core: TaskforceCore;
|
|
93
|
+
workspaceId: string;
|
|
94
|
+
}): {
|
|
95
|
+
snapshotSequence: string;
|
|
96
|
+
entries: WorkspaceSyncV3FeedEntry[];
|
|
97
|
+
};
|
|
88
98
|
export {};
|
|
@@ -15,6 +15,7 @@ import { projectWorkspaceSyncV3WorkflowRuntimeJournalRow, } from './workspaceSyn
|
|
|
15
15
|
import { validateWorkspaceSyncV3WorkflowCoverageFeedEntry, WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE, } from './workspaceSyncV3WorkflowCoverage.js';
|
|
16
16
|
import { validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry, WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE, } from './workspaceSyncV3PlanningOrderCoverage.js';
|
|
17
17
|
import { validateWorkspaceSyncV3TaskCoverCoverageFeedEntry, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE, } from './workspaceSyncV3TaskCoverCoverage.js';
|
|
18
|
+
import { validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE, } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
|
|
18
19
|
import { projectWorkspaceSyncV3WorkstreamTaskOrderJournalRow } from './workspaceSyncV3WorkstreamTaskOrderProjection.js';
|
|
19
20
|
import { serializeWorkstreamTaskOrderForSync } from './workstreamTaskOrderSync.js';
|
|
20
21
|
import { serializeTaxonomyStateForSync } from './taxonomySyncPayload.js';
|
|
@@ -31,6 +32,8 @@ const PLANNING_ORDER_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_PLANNING_ORDER_
|
|
|
31
32
|
.map((projection, index) => [projection.projectionId, index]));
|
|
32
33
|
const TASK_COVER_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE.projections
|
|
33
34
|
.map((projection, index) => [projection.projectionId, index]));
|
|
35
|
+
const WORKFLOW_TASK_COVER_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE.projections
|
|
36
|
+
.map((projection, index) => [projection.projectionId, index]));
|
|
34
37
|
export class WorkspaceSyncV3CombinedRepairBaselineRequiredError extends Error {
|
|
35
38
|
missing;
|
|
36
39
|
code = 'WORKSPACE_SYNC_V3_COMBINED_REPAIR_BASELINE_REQUIRED';
|
|
@@ -43,15 +46,17 @@ function compareCodeUnits(left, right) {
|
|
|
43
46
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
44
47
|
}
|
|
45
48
|
function projectionRank(entry, coverage) {
|
|
46
|
-
const ranks = coverage === 'workflow'
|
|
47
|
-
?
|
|
48
|
-
: coverage === '
|
|
49
|
-
?
|
|
50
|
-
: coverage === '
|
|
51
|
-
?
|
|
52
|
-
: coverage === '
|
|
53
|
-
?
|
|
54
|
-
:
|
|
49
|
+
const ranks = coverage === 'workflow-task-cover'
|
|
50
|
+
? WORKFLOW_TASK_COVER_PROJECTION_RANK
|
|
51
|
+
: coverage === 'workflow'
|
|
52
|
+
? WORKFLOW_PROJECTION_RANK
|
|
53
|
+
: coverage === 'task-cover'
|
|
54
|
+
? TASK_COVER_PROJECTION_RANK
|
|
55
|
+
: coverage === 'planning-order'
|
|
56
|
+
? PLANNING_ORDER_PROJECTION_RANK
|
|
57
|
+
: coverage === 'nested'
|
|
58
|
+
? NESTED_PROJECTION_RANK
|
|
59
|
+
: COMBINED_PROJECTION_RANK;
|
|
55
60
|
const rank = ranks.get(entry.projection);
|
|
56
61
|
if (rank === undefined)
|
|
57
62
|
throw new Error(`Unsupported combined repair projection: ${entry.projection}.`);
|
|
@@ -223,8 +228,7 @@ export function listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId) {
|
|
|
223
228
|
export function listWorkspaceSyncV3TaskCoverRepairCandidates(core, workspaceId) {
|
|
224
229
|
return listNestedRepairCandidates(core, workspaceId, 'task-attachment-links/full-v2');
|
|
225
230
|
}
|
|
226
|
-
|
|
227
|
-
export function listWorkspaceSyncV3WorkflowRepairCandidates(core, workspaceId) {
|
|
231
|
+
function listWorkflowRuntimeRepairCandidates(core, workspaceId) {
|
|
228
232
|
const workflowStore = new WorkflowStore(core.getDatabaseAdapter(), core.getTenantId());
|
|
229
233
|
const executions = workflowStore.listExecutions(workspaceId).map((execution) => {
|
|
230
234
|
const projected = workflowStore.getProjectedExecution(workspaceId, execution.id);
|
|
@@ -265,12 +269,25 @@ export function listWorkspaceSyncV3WorkflowRepairCandidates(core, workspaceId) {
|
|
|
265
269
|
};
|
|
266
270
|
});
|
|
267
271
|
return [
|
|
268
|
-
...listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId),
|
|
269
272
|
...definitions.values(),
|
|
270
273
|
...executionCandidates,
|
|
271
274
|
...events,
|
|
272
275
|
];
|
|
273
276
|
}
|
|
277
|
+
/** Candidate v5 inventory. Coverage-v3/v4 inventories intentionally remain unchanged. */
|
|
278
|
+
export function listWorkspaceSyncV3WorkflowRepairCandidates(core, workspaceId) {
|
|
279
|
+
return [
|
|
280
|
+
...listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId),
|
|
281
|
+
...listWorkflowRuntimeRepairCandidates(core, workspaceId),
|
|
282
|
+
];
|
|
283
|
+
}
|
|
284
|
+
/** Candidate v8 inventory. It composes v7 task-cover state with workflow runtime. */
|
|
285
|
+
export function listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates(core, workspaceId) {
|
|
286
|
+
return [
|
|
287
|
+
...listWorkspaceSyncV3TaskCoverRepairCandidates(core, workspaceId),
|
|
288
|
+
...listWorkflowRuntimeRepairCandidates(core, workspaceId),
|
|
289
|
+
];
|
|
290
|
+
}
|
|
274
291
|
/** Candidate v6 inventory. Workflow v5 remains an independent dark contract. */
|
|
275
292
|
export function listWorkspaceSyncV3PlanningOrderRepairCandidates(core, workspaceId) {
|
|
276
293
|
const nested = listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId);
|
|
@@ -490,26 +507,30 @@ export function buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates(i
|
|
|
490
507
|
.map((candidate) => candidate.entityId);
|
|
491
508
|
const taskFullProvenance = readTaskFullProvenanceRows({ db, tenantId, workspaceId, taskIds: remappedTaskIds });
|
|
492
509
|
const provenanceCompletedAt = Date.now();
|
|
493
|
-
const entries = inventory.map((candidate) => entry(candidate, rows.get(`${candidate.domain}\0${candidate.entityId}`), taskFullProvenance, input.taskCoverCoverage === true));
|
|
510
|
+
const entries = inventory.map((candidate) => entry(candidate, rows.get(`${candidate.domain}\0${candidate.entityId}`), taskFullProvenance, input.taskCoverCoverage === true || input.workflowTaskCoverCoverage === true));
|
|
494
511
|
const entriesCompletedAt = Date.now();
|
|
495
|
-
const coverage = input.
|
|
496
|
-
? 'workflow'
|
|
497
|
-
: input.
|
|
498
|
-
? '
|
|
499
|
-
: input.
|
|
500
|
-
? '
|
|
501
|
-
: input.
|
|
502
|
-
? '
|
|
503
|
-
:
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
512
|
+
const coverage = input.workflowTaskCoverCoverage
|
|
513
|
+
? 'workflow-task-cover'
|
|
514
|
+
: input.workflowCoverage
|
|
515
|
+
? 'workflow'
|
|
516
|
+
: input.taskCoverCoverage
|
|
517
|
+
? 'task-cover'
|
|
518
|
+
: input.planningOrderCoverage
|
|
519
|
+
? 'planning-order'
|
|
520
|
+
: input.nestedCoverage
|
|
521
|
+
? 'nested'
|
|
522
|
+
: 'combined';
|
|
523
|
+
entries.forEach(coverage === 'workflow-task-cover'
|
|
524
|
+
? validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry
|
|
525
|
+
: coverage === 'workflow'
|
|
526
|
+
? validateWorkspaceSyncV3WorkflowCoverageFeedEntry
|
|
527
|
+
: coverage === 'task-cover'
|
|
528
|
+
? validateWorkspaceSyncV3TaskCoverCoverageFeedEntry
|
|
529
|
+
: coverage === 'planning-order'
|
|
530
|
+
? validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry
|
|
531
|
+
: coverage === 'nested'
|
|
532
|
+
? validateWorkspaceSyncV3NestedCoverageFeedEntry
|
|
533
|
+
: validateWorkspaceSyncV3CombinedFeedEntry);
|
|
513
534
|
const validationCompletedAt = Date.now();
|
|
514
535
|
if (entries.some((candidate) => BigInt(candidate.sequence) > BigInt(snapshotSequence))) {
|
|
515
536
|
throw new Error('Combined repair entry exceeds the locked snapshot sequence.');
|
|
@@ -601,3 +622,21 @@ export function buildWorkspaceSyncV3TaskCoverRepairSnapshot(input) {
|
|
|
601
622
|
});
|
|
602
623
|
})();
|
|
603
624
|
}
|
|
625
|
+
export function buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input) {
|
|
626
|
+
const workspaceId = String(input.workspaceId || '').trim();
|
|
627
|
+
if (!workspaceId)
|
|
628
|
+
throw new Error('Workspace id is required.');
|
|
629
|
+
const tenantId = input.core.getTenantId();
|
|
630
|
+
const db = input.core.getDatabaseAdapter();
|
|
631
|
+
return db.transaction(() => {
|
|
632
|
+
const snapshotSequence = lockAndReadHighWatermark(db, tenantId, workspaceId);
|
|
633
|
+
const inventory = listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates(input.core, workspaceId);
|
|
634
|
+
return buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates({
|
|
635
|
+
core: input.core,
|
|
636
|
+
workspaceId,
|
|
637
|
+
snapshotSequence,
|
|
638
|
+
inventory,
|
|
639
|
+
workflowTaskCoverCoverage: true,
|
|
640
|
+
});
|
|
641
|
+
})();
|
|
642
|
+
}
|
|
@@ -3,6 +3,7 @@ import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR } from './workspaceSyncV3Nes
|
|
|
3
3
|
import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR } from './workspaceSyncV3WorkflowWireContract.js';
|
|
4
4
|
import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR } from './workspaceSyncV3PlanningOrderWireContract.js';
|
|
5
5
|
import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR } from './workspaceSyncV3TaskCoverWireContract.js';
|
|
6
|
+
import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR } from './workspaceSyncV3WorkflowTaskCoverWireContract.js';
|
|
6
7
|
export declare const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR: Readonly<{
|
|
7
8
|
coverageProfileId: "task-planning-metadata";
|
|
8
9
|
coverageVersion: 3;
|
|
@@ -10,7 +11,7 @@ export declare const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR: Readonly<{
|
|
|
10
11
|
}>;
|
|
11
12
|
export declare const WORKSPACE_SYNC_V3_COMBINED_CAPABILITY_VERSION: 1;
|
|
12
13
|
export declare const WORKSPACE_SYNC_V3_COMBINED_EXCLUDED_V2_PROJECTIONS: readonly ["task/root-v1", "task-relationship/full-v1", "taxonomy/full-v1", "initiative/full-v1", "workstream/full-v1"];
|
|
13
|
-
export type WorkspaceSyncV3CombinedCoverageSelector = typeof WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR;
|
|
14
|
+
export type WorkspaceSyncV3CombinedCoverageSelector = typeof WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR | typeof WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR;
|
|
14
15
|
export interface WorkspaceSyncV3CombinedWireContract {
|
|
15
16
|
coverage: WorkspaceSyncV3CombinedCoverageSelector;
|
|
16
17
|
excludedProjections: readonly WorkspaceSyncV2ProjectionExclusion[];
|
|
@@ -2,6 +2,7 @@ import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_NESTED_EX
|
|
|
2
2
|
import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_WORKFLOW_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3WorkflowWireContract.js';
|
|
3
3
|
import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_PLANNING_ORDER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3PlanningOrderWireContract.js';
|
|
4
4
|
import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3TaskCoverWireContract.js';
|
|
5
|
+
import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3WorkflowTaskCoverWireContract.js';
|
|
5
6
|
export const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR = Object.freeze({
|
|
6
7
|
coverageProfileId: 'task-planning-metadata',
|
|
7
8
|
coverageVersion: 3,
|
|
@@ -79,9 +80,24 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
|
|
|
79
80
|
taskCoverProjectionRequired: true,
|
|
80
81
|
};
|
|
81
82
|
}
|
|
83
|
+
if (profileId === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageProfileId
|
|
84
|
+
&& version === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageVersion
|
|
85
|
+
&& digest === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageDigest) {
|
|
86
|
+
return {
|
|
87
|
+
coverage: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR,
|
|
88
|
+
excludedProjections: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS,
|
|
89
|
+
nestedWriterPrerequisitesRequired: true,
|
|
90
|
+
workflowWriterPrerequisitesRequired: true,
|
|
91
|
+
planningOrderWriterPrerequisitesRequired: false,
|
|
92
|
+
taskCoverProjectionRequired: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
82
95
|
return null;
|
|
83
96
|
}
|
|
84
97
|
export function resolveWorkspaceSyncV3CombinedCoverageForExclusions(exclusions) {
|
|
98
|
+
// V8 deliberately shares V7's v2 exclusions. Exclusions alone therefore
|
|
99
|
+
// identify the active V7 boundary; V8 activation must carry its exact
|
|
100
|
+
// persisted selector instead of using this legacy reverse lookup.
|
|
85
101
|
for (const coverage of [
|
|
86
102
|
WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR,
|
|
87
103
|
WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR,
|
|
@@ -3,6 +3,7 @@ import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_POLICY, WORKSPACE_SYNC_V3_NESTED_COVE
|
|
|
3
3
|
import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_POLICY, WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE, validateWorkspaceSyncV3WorkflowCoverageFeedEntry, } from './workspaceSyncV3WorkflowCoverage.js';
|
|
4
4
|
import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE, validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry, } from './workspaceSyncV3PlanningOrderCoverage.js';
|
|
5
5
|
import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE, validateWorkspaceSyncV3TaskCoverCoverageFeedEntry, } from './workspaceSyncV3TaskCoverCoverage.js';
|
|
6
|
+
import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE, validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry, } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
|
|
6
7
|
export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
|
|
7
8
|
Object.freeze({
|
|
8
9
|
profile: WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE,
|
|
@@ -29,6 +30,11 @@ export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
|
|
|
29
30
|
policy: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY,
|
|
30
31
|
validateEntry: validateWorkspaceSyncV3TaskCoverCoverageFeedEntry,
|
|
31
32
|
}),
|
|
33
|
+
Object.freeze({
|
|
34
|
+
profile: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE,
|
|
35
|
+
policy: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY,
|
|
36
|
+
validateEntry: validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry,
|
|
37
|
+
}),
|
|
32
38
|
]);
|
|
33
39
|
export function resolveWorkspaceSyncV3RegisteredCoverage(input) {
|
|
34
40
|
const profileId = String(input.coverageProfileId || '').trim();
|
|
@@ -34,6 +34,7 @@ export interface WorkspaceSyncV3FeedProjectionInput {
|
|
|
34
34
|
rows: readonly WorkspaceSyncJournalRow[];
|
|
35
35
|
cycleHighWatermark: string;
|
|
36
36
|
followingRow?: WorkspaceSyncJournalRow | null;
|
|
37
|
+
workspaceId: string;
|
|
37
38
|
}
|
|
38
39
|
export type WorkspaceSyncV3FeedOperationProjector = (input: WorkspaceSyncV3FeedProjectionInput) => WorkspaceSyncV3FeedEntry[];
|
|
39
40
|
export interface WorkspaceSyncV3FeedCoveragePolicy {
|
|
@@ -207,7 +207,12 @@ export function buildWorkspaceSyncV3Feed(input) {
|
|
|
207
207
|
throw new WorkspaceSyncV3FeedOperationTooLargeError(`Workspace sync operation ${clientId}/${operationId} exceeds ${MAX_OPERATION_ROWS} journal rows.`);
|
|
208
208
|
}
|
|
209
209
|
const groupRows = rows.slice(offset, end);
|
|
210
|
-
const groupEntries = projectOperation({
|
|
210
|
+
const groupEntries = projectOperation({
|
|
211
|
+
rows: groupRows,
|
|
212
|
+
cycleHighWatermark: String(high),
|
|
213
|
+
followingRow: rows[end] || null,
|
|
214
|
+
workspaceId: input.workspaceId,
|
|
215
|
+
});
|
|
211
216
|
if (entries.length + groupEntries.length > pageSize) {
|
|
212
217
|
if (!entries.length)
|
|
213
218
|
throw new WorkspaceSyncV3FeedOperationTooLargeError(`Covered operation ${clientId}/${operationId} exceeds the feed entry limit.`);
|
|
@@ -49,9 +49,11 @@ export declare function projectWorkspaceSyncV3NestedTaskOperation(input: {
|
|
|
49
49
|
rows: readonly WorkspaceSyncJournalRow[];
|
|
50
50
|
cycleHighWatermark: string;
|
|
51
51
|
followingRow?: WorkspaceSyncJournalRow | null;
|
|
52
|
+
workspaceId: string;
|
|
52
53
|
}): WorkspaceSyncV3FeedEntry[] | null;
|
|
53
54
|
export declare function projectWorkspaceSyncV3NestedTaskV2Operation(input: {
|
|
54
55
|
rows: readonly WorkspaceSyncJournalRow[];
|
|
55
56
|
cycleHighWatermark: string;
|
|
56
57
|
followingRow?: WorkspaceSyncJournalRow | null;
|
|
58
|
+
workspaceId: string;
|
|
57
59
|
}): WorkspaceSyncV3FeedEntry[] | null;
|
|
@@ -225,6 +225,34 @@ function projectNestedDependentRows(rows, attachmentProjection) {
|
|
|
225
225
|
return [projected];
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
|
+
function assertOperationEventWorkspace(events, workspaceId) {
|
|
229
|
+
if (events.some((event) => event.workspaceId !== workspaceId)) {
|
|
230
|
+
throw new Error('Nested task operation activity belongs to another workspace.');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function assertTaskOperationActivities(events, taskId) {
|
|
234
|
+
let membershipStarted = false;
|
|
235
|
+
let taskActivityCount = 0;
|
|
236
|
+
for (const event of events) {
|
|
237
|
+
if (event.entityType === 'task') {
|
|
238
|
+
if (membershipStarted) {
|
|
239
|
+
throw new Error('Task operation activity cannot follow workstream membership activity.');
|
|
240
|
+
}
|
|
241
|
+
if (event.entityId !== taskId || event.taskId !== taskId) {
|
|
242
|
+
throw new Error('Nested task operation event identity does not match its parent root.');
|
|
243
|
+
}
|
|
244
|
+
taskActivityCount += 1;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
membershipStarted = true;
|
|
248
|
+
if (event.entityType !== 'workstream' || event.details?.taskId !== taskId) {
|
|
249
|
+
throw new Error('Task operation secondary activity does not describe workstream membership.');
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (taskActivityCount < 1) {
|
|
253
|
+
throw new Error('Task operation must contain primary task activity before workstream membership.');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
228
256
|
function isSupportedNestedOnlyOperation(rows) {
|
|
229
257
|
const first = rows[0];
|
|
230
258
|
if (!first)
|
|
@@ -247,7 +275,7 @@ function isSupportedNestedOnlyOperation(rows) {
|
|
|
247
275
|
* root. Apply still requires referenced parents to exist on the receiver; feed
|
|
248
276
|
* only needs to project the nested rows.
|
|
249
277
|
*/
|
|
250
|
-
function projectNestedOnlyOperation(rows, attachmentProjection) {
|
|
278
|
+
function projectNestedOnlyOperation(rows, attachmentProjection, workspaceId) {
|
|
251
279
|
if (!isSupportedNestedOnlyOperation(rows)) {
|
|
252
280
|
throw new Error('Nested-only task operation is not an allowed repair or reconciliation shape.');
|
|
253
281
|
}
|
|
@@ -259,6 +287,10 @@ function projectNestedOnlyOperation(rows, attachmentProjection) {
|
|
|
259
287
|
throw new Error('Nested task operation dependent identity does not match its task root.');
|
|
260
288
|
}
|
|
261
289
|
}
|
|
290
|
+
const rawEvents = rows
|
|
291
|
+
.filter((row) => row.domain === 'entity-event')
|
|
292
|
+
.map((row) => canonicalEntityEventPayload(parsePayload(row)));
|
|
293
|
+
assertOperationEventWorkspace(rawEvents, workspaceId);
|
|
262
294
|
const projected = projectNestedDependentRows(rows, attachmentProjection);
|
|
263
295
|
const events = projected
|
|
264
296
|
.filter((entry) => entry.domain === 'entity-event')
|
|
@@ -268,13 +300,7 @@ function projectNestedOnlyOperation(rows, attachmentProjection) {
|
|
|
268
300
|
}
|
|
269
301
|
if (taskScoped.length > 0 && events.length > 0) {
|
|
270
302
|
const taskId = taskScoped[0].entityId;
|
|
271
|
-
|
|
272
|
-
if (primaryEvent && (primaryEvent.entityType !== 'task' || primaryEvent.entityId !== taskId)) {
|
|
273
|
-
throw new Error('Nested task operation event identity does not match its parent root.');
|
|
274
|
-
}
|
|
275
|
-
if (secondaryEvents.some((event) => (event.entityType !== 'workstream' || event.details?.taskId !== taskId))) {
|
|
276
|
-
throw new Error('Task operation secondary activity does not describe workstream membership.');
|
|
277
|
-
}
|
|
303
|
+
assertTaskOperationActivities(events, taskId);
|
|
278
304
|
}
|
|
279
305
|
if (events.length > 0 && projected.at(-1)?.domain !== 'entity-event') {
|
|
280
306
|
throw new Error('Nested task operation must end with entity activity.');
|
|
@@ -293,7 +319,7 @@ function projectNestedTaskOperation(input, attachmentProjection) {
|
|
|
293
319
|
const [first, ...dependents] = input.rows;
|
|
294
320
|
if (first && projectionByDomain.has(first.domain)
|
|
295
321
|
&& input.rows.every((row) => projectionByDomain.has(row.domain))) {
|
|
296
|
-
return projectNestedOnlyOperation(input.rows, attachmentProjection);
|
|
322
|
+
return projectNestedOnlyOperation(input.rows, attachmentProjection, input.workspaceId);
|
|
297
323
|
}
|
|
298
324
|
if (!first || !['task', 'initiative', 'workstream'].includes(first.domain)) {
|
|
299
325
|
throw new Error('Nested task operation must begin with its v3-owned parent root.');
|
|
@@ -302,10 +328,13 @@ function projectNestedTaskOperation(input, attachmentProjection) {
|
|
|
302
328
|
throw new Error('Nested task operation contains an unsupported dependent row.');
|
|
303
329
|
}
|
|
304
330
|
assertNestedDependentOrder(dependents);
|
|
331
|
+
const rawEventRows = dependents.filter((row) => row.domain === 'entity-event');
|
|
332
|
+
const rawEvents = rawEventRows.map((row) => canonicalEntityEventPayload(parsePayload(row)));
|
|
333
|
+
assertOperationEventWorkspace(rawEvents, input.workspaceId);
|
|
305
334
|
const projectedDependents = projectNestedDependentRows(dependents, attachmentProjection);
|
|
306
335
|
const eventRows = projectedDependents.filter((entry) => entry.domain === 'entity-event');
|
|
307
|
-
const
|
|
308
|
-
|
|
336
|
+
const sentinelOnly = eventRows.length === 0 && rawEvents.length > 0
|
|
337
|
+
&& rawEvents.every((event) => event.action === 'sync-v3-repair-baseline');
|
|
309
338
|
const nestedBodiesOnly = eventRows.length === 0
|
|
310
339
|
&& projectedDependents.length > 0
|
|
311
340
|
&& projectedDependents.every((entry) => entry.domain !== 'entity-event');
|
|
@@ -324,17 +353,19 @@ function projectNestedTaskOperation(input, attachmentProjection) {
|
|
|
324
353
|
}
|
|
325
354
|
const events = eventRows.map((entry) => validateWorkspaceSyncV3EntityEventPayload(entry.payload));
|
|
326
355
|
const [primaryEvent, ...secondaryEvents] = events;
|
|
327
|
-
if (primaryEvent && (primaryEvent.entityType !== first.domain || primaryEvent.entityId !== first.entityId)) {
|
|
328
|
-
throw new Error('Nested task operation event identity does not match its parent root.');
|
|
329
|
-
}
|
|
330
356
|
if (new Set(events.map((event) => event.id)).size !== events.length) {
|
|
331
357
|
throw new Error('Nested task operation contains duplicate entity-event identities.');
|
|
332
358
|
}
|
|
333
|
-
if (first.domain
|
|
334
|
-
|
|
359
|
+
if (first.domain === 'task' && events.length > 0) {
|
|
360
|
+
assertTaskOperationActivities(events, first.entityId);
|
|
335
361
|
}
|
|
336
|
-
if (first.domain
|
|
337
|
-
|
|
362
|
+
else if (first.domain !== 'task') {
|
|
363
|
+
if (primaryEvent && (primaryEvent.entityType !== first.domain || primaryEvent.entityId !== first.entityId)) {
|
|
364
|
+
throw new Error('Nested task operation event identity does not match its parent root.');
|
|
365
|
+
}
|
|
366
|
+
if (secondaryEvents.length > 0) {
|
|
367
|
+
throw new Error('Planning-root operations cannot contain secondary entity activity.');
|
|
368
|
+
}
|
|
338
369
|
}
|
|
339
370
|
let parent;
|
|
340
371
|
if (first.domain === 'task') {
|
|
@@ -11,6 +11,7 @@ import type { WorkflowRuntimeMutationCommand } from './workflowRuntimeSync.js';
|
|
|
11
11
|
import type { WorkspaceSyncV3OriginActor } from './workspaceSyncV3OriginActor.js';
|
|
12
12
|
import type { WorkspaceSyncV3TaskCommentReconcileProvenance } from './taskCommentReconcileProvenance.js';
|
|
13
13
|
import type { WorkspaceSyncEntityEventSnapshot } from '../workspaceSyncModel.js';
|
|
14
|
+
import type { TaskChecklistItemUpdateIntent } from './taskChecklistMutationService.js';
|
|
14
15
|
export type { WorkspaceSyncV3OriginActor } from './workspaceSyncV3OriginActor.js';
|
|
15
16
|
type WorkspaceSyncV3OperationEnvelopeBase<TOperation> = {
|
|
16
17
|
contractVersion: 3;
|
|
@@ -115,6 +116,8 @@ export type WorkspaceSyncV3TaskChecklistEnvelope = WorkspaceSyncV3OperationEnvel
|
|
|
115
116
|
baseLifecycleRevision: '0';
|
|
116
117
|
payload: {
|
|
117
118
|
items: ChecklistItem[];
|
|
119
|
+
expectedDetailRevision?: string;
|
|
120
|
+
itemUpdateIntent?: TaskChecklistItemUpdateIntent;
|
|
118
121
|
originActor?: WorkspaceSyncV3OriginActor;
|
|
119
122
|
};
|
|
120
123
|
}>;
|