@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
|
@@ -5,6 +5,7 @@ import { enqueueLocalWorkstreamTaskOrderReplacement } from './localWorkstreamTas
|
|
|
5
5
|
import { DurableWorkstreamTaskOrderError, runDurableWorkstreamTaskOrderReplace, } from './workstreamTaskOrderMutationService.js';
|
|
6
6
|
import { WorkspaceSyncDurabilityStore } from './syncDurabilityStore.js';
|
|
7
7
|
import { serializeWorkstreamTaskOrderForSync } from './workstreamTaskOrderSync.js';
|
|
8
|
+
import { readDurableOperationReplay } from './durableOperationReplay.js';
|
|
8
9
|
const OPERATION_LEASE_MS = 30_000;
|
|
9
10
|
function enabled(value) {
|
|
10
11
|
return /^(1|true|on|yes)$/i.test(String(value || '').trim());
|
|
@@ -68,6 +69,9 @@ export function createDurableWorkstreamTaskOrderMutationRouter(input) {
|
|
|
68
69
|
|| canonicalWorkspaceSyncJson(prior.taskIds || []) !== canonicalWorkspaceSyncJson(payload.taskIds)) {
|
|
69
70
|
throw new DurableWorkstreamTaskOrderError('Operation identity is assigned to a different workstream task order.', 'WORKSTREAM_TASK_ORDER_IDENTITY_CONFLICT', 409);
|
|
70
71
|
}
|
|
72
|
+
store.assertOutboxOperationIdentity(existing, {
|
|
73
|
+
domain: 'workstream-task-order', entityId: payload.workstreamId, mutationKind: 'replace',
|
|
74
|
+
});
|
|
71
75
|
return { state: 'pending', route: 'local-outbox', operationId,
|
|
72
76
|
taskIds: input.core.getWorkstreamTaskOrderForSync(payload.workstreamId, input.workspaceId) };
|
|
73
77
|
}
|
|
@@ -85,14 +89,21 @@ export function createDurableWorkstreamTaskOrderMutationRouter(input) {
|
|
|
85
89
|
}
|
|
86
90
|
const committed = store.readCommittedOperationResponse(identity);
|
|
87
91
|
if (committed) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
const replay = readDurableOperationReplay({
|
|
93
|
+
responseJson: committed,
|
|
94
|
+
operationId,
|
|
95
|
+
domain: 'workstream-task-order',
|
|
96
|
+
entityId: payload.workstreamId,
|
|
97
|
+
mutationKind: 'replace',
|
|
98
|
+
revisionMode: 'metadata',
|
|
99
|
+
requirePayload: true,
|
|
100
|
+
});
|
|
101
|
+
if (canonicalWorkspaceSyncJson(replay.authoritative.payload?.taskIds)
|
|
102
|
+
!== canonicalWorkspaceSyncJson(payload.taskIds)) {
|
|
92
103
|
throw new DurableWorkstreamTaskOrderError('Operation identity is assigned to a different workstream task order.', 'WORKSTREAM_TASK_ORDER_IDENTITY_CONFLICT', 409);
|
|
93
104
|
}
|
|
94
105
|
return { state: 'committed', route: 'cloud-acceptance', operationId,
|
|
95
|
-
taskIds:
|
|
106
|
+
taskIds: replay.authoritative.payload.taskIds };
|
|
96
107
|
}
|
|
97
108
|
const coordinates = store.readEntityRevisionCoordinates({
|
|
98
109
|
tenantId: input.tenantId,
|
|
@@ -20,7 +20,7 @@ import { serializeTaskRootForSync } from './workspaceSyncV3TaskRootProjection.js
|
|
|
20
20
|
import { createLocalWorkflowRuntimeOutboxHandler } from './localWorkflowRuntimeOutboxHandler.js';
|
|
21
21
|
import { createLocalWorkstreamOutboxHandler } from './localWorkstreamOutboxHandler.js';
|
|
22
22
|
import { createLocalWorkstreamTaskOrderOutboxHandler } from './localWorkstreamTaskOrderOutboxHandler.js';
|
|
23
|
-
import {
|
|
23
|
+
import { resolveWorkflowRuntimeDurableTransportCapability } from './durableWorkflowRuntimeMutationRouter.js';
|
|
24
24
|
import { createLocalEntityEventLegacyAdoptionHandler, enqueueNextLegacyEntityEventAdoption, } from './localEntityEventLegacyAdoption.js';
|
|
25
25
|
export function createLocalOutboxDispatchHandlers(input) {
|
|
26
26
|
return [
|
|
@@ -40,7 +40,7 @@ export function createLocalOutboxDispatchHandlers(input) {
|
|
|
40
40
|
createLocalInitiativeOutboxHandler(input),
|
|
41
41
|
createLocalWorkstreamOutboxHandler(input),
|
|
42
42
|
createLocalWorkstreamTaskOrderOutboxHandler(input),
|
|
43
|
-
...(
|
|
43
|
+
...(resolveWorkflowRuntimeDurableTransportCapability({
|
|
44
44
|
runtimeMode: 'local',
|
|
45
45
|
surface: 'http',
|
|
46
46
|
env: input.env || process.env,
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { TaskEvent, TaskItem } from '../../core/Taskforce.js';
|
|
2
|
+
import type { DatabaseAdapter } from '../../storage/databaseAdapter.js';
|
|
2
3
|
import type { DurableTaskAttachmentLinksServiceCore } from './taskAttachmentLinksMutationService.js';
|
|
3
4
|
import { WorkspaceSyncDurabilityStore, type WorkspaceSyncOperationIdentity } from './syncDurabilityStore.js';
|
|
4
5
|
import { type WorkspaceSyncV3TaskAttachmentLink } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
5
6
|
export interface LocalTaskAttachmentLinksOutboxCore extends DurableTaskAttachmentLinksServiceCore {
|
|
7
|
+
getDatabaseAdapter(): DatabaseAdapter;
|
|
6
8
|
getWorkspaceAssetDispatchReadiness(assetId: string, workspaceId: string): {
|
|
7
9
|
ready: boolean;
|
|
8
10
|
retryable: boolean;
|
|
@@ -5,7 +5,9 @@ import { buildTaskAttachmentLinksActivityEventId } from './taskAttachmentLinksAc
|
|
|
5
5
|
import { canonicalizeEntityActivityDetailsForSync, serializeTaskActivityForSync, } from './taskActivityJournal.js';
|
|
6
6
|
import { fingerprintWorkspaceSyncPayload, } from './syncDurabilityStore.js';
|
|
7
7
|
import { serializeTaskRootForSync } from './workspaceSyncV3TaskRootProjection.js';
|
|
8
|
-
import {
|
|
8
|
+
import { resolveWorkspaceSyncV3RegisteredCoverage } from './workspaceSyncV3CoverageRegistry.js';
|
|
9
|
+
import { WorkspaceSyncV3CombinedProjectionStateStore } from './workspaceSyncV3CombinedProjectionState.js';
|
|
10
|
+
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
9
11
|
import { withOriginActorPayload } from './workspaceSyncV3OriginActor.js';
|
|
10
12
|
export class LocalAuthoritativeTaskAttachmentLinksError extends Error {
|
|
11
13
|
code = 'WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID';
|
|
@@ -90,6 +92,24 @@ function requireRevision(value, label) {
|
|
|
90
92
|
throw new LocalAuthoritativeTaskAttachmentLinksError(`${label} is invalid.`);
|
|
91
93
|
return text;
|
|
92
94
|
}
|
|
95
|
+
function resolveOwnedAttachmentProjection(input) {
|
|
96
|
+
const state = new WorkspaceSyncV3CombinedProjectionStateStore(input.core.getDatabaseAdapter()).read({
|
|
97
|
+
tenantId: input.identity.tenantId,
|
|
98
|
+
workspaceId: input.identity.workspaceId,
|
|
99
|
+
});
|
|
100
|
+
if (state.owner !== 'v3')
|
|
101
|
+
return null;
|
|
102
|
+
const coverage = resolveWorkspaceSyncV3RegisteredCoverage(state)?.profile;
|
|
103
|
+
if (!coverage)
|
|
104
|
+
throw new LocalAuthoritativeTaskAttachmentLinksError('Owned task attachment-link coverage is not registered.');
|
|
105
|
+
if (coverage.projections.some(({ projectionId }) => projectionId === 'task-attachment-links/full-v2')) {
|
|
106
|
+
return 'task-attachment-links/full-v2';
|
|
107
|
+
}
|
|
108
|
+
if (coverage.projections.some(({ projectionId }) => projectionId === 'task-attachment-links/full-v1')) {
|
|
109
|
+
return 'task-attachment-links/full-v1';
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
93
113
|
export function enqueueLocalTaskAttachmentLinksMutation(input) {
|
|
94
114
|
const requestedLinks = canonicalLinks(input.taskId, input.links);
|
|
95
115
|
let attachments;
|
|
@@ -206,9 +226,20 @@ export function applyAuthoritativeTaskAttachmentLinksAndAck(input) {
|
|
|
206
226
|
throw new LocalAuthoritativeTaskAttachmentLinksError('Authoritative task attachment-link operation ordering is invalid.');
|
|
207
227
|
}
|
|
208
228
|
const rootPayload = serializeTaskRootForSync(root.payload);
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
229
|
+
const rawAttachmentPayload = attachmentLinks.payload;
|
|
230
|
+
const hasAuthoritativeCardCover = Object.prototype.hasOwnProperty.call(rawAttachmentPayload, 'cardCoverAssetId');
|
|
231
|
+
const validatedAttachmentLinksPayload = hasAuthoritativeCardCover
|
|
232
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(rawAttachmentPayload)
|
|
233
|
+
: validateWorkspaceSyncV3TaskAttachmentLinksPayload(rawAttachmentPayload);
|
|
234
|
+
const ownedAttachmentProjection = resolveOwnedAttachmentProjection(input);
|
|
235
|
+
const attachmentLinksPayload = ownedAttachmentProjection === 'task-attachment-links/full-v1'
|
|
236
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksPayload(validatedAttachmentLinksPayload)
|
|
237
|
+
: validatedAttachmentLinksPayload;
|
|
238
|
+
const authoritativeCardCoverAssetId = hasAuthoritativeCardCover
|
|
239
|
+
&& ownedAttachmentProjection !== 'task-attachment-links/full-v1'
|
|
240
|
+
? validatedAttachmentLinksPayload
|
|
241
|
+
.cardCoverAssetId
|
|
242
|
+
: undefined;
|
|
212
243
|
const activityPayload = serializeTaskActivityForSync(activity);
|
|
213
244
|
const expectedActivityId = buildTaskAttachmentLinksActivityEventId({
|
|
214
245
|
workspaceId: input.identity.workspaceId, clientId: input.identity.clientId,
|
|
@@ -268,6 +299,9 @@ export function applyAuthoritativeTaskAttachmentLinksAndAck(input) {
|
|
|
268
299
|
completedAt: rootPayload.completedAt,
|
|
269
300
|
canceledReason: rootPayload.canceledReason,
|
|
270
301
|
attachments,
|
|
302
|
+
...(authoritativeCardCoverAssetId !== undefined
|
|
303
|
+
? { cardCoverAssetId: authoritativeCardCoverAssetId }
|
|
304
|
+
: {}),
|
|
271
305
|
};
|
|
272
306
|
const updated = input.core.updateTask(root.entityId, rootPatch, input.identity.workspaceId, {
|
|
273
307
|
persistBackup: false, emitRealtime: false, skipTaskEvents: true,
|
|
@@ -282,9 +316,15 @@ export function applyAuthoritativeTaskAttachmentLinksAndAck(input) {
|
|
|
282
316
|
input.core.upsertEntityEventForSync(activity, { allowAuthoritativeReplacement: true });
|
|
283
317
|
const installedLinks = input.core.listTaskAttachmentLinksForDurableSync(updated.id, input.identity.workspaceId);
|
|
284
318
|
if (canonicalWorkspaceSyncJson(serializeTaskRootForSync(updated)) !== canonicalWorkspaceSyncJson(rootPayload)
|
|
285
|
-
|| canonicalWorkspaceSyncJson(
|
|
286
|
-
|
|
287
|
-
|
|
319
|
+
|| canonicalWorkspaceSyncJson(authoritativeCardCoverAssetId !== undefined
|
|
320
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
321
|
+
taskId: updated.id,
|
|
322
|
+
links: installedLinks,
|
|
323
|
+
cardCoverAssetId: updated.cardCoverAssetId ?? null,
|
|
324
|
+
})
|
|
325
|
+
: serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
326
|
+
taskId: updated.id, links: installedLinks,
|
|
327
|
+
})) !== canonicalWorkspaceSyncJson(attachmentLinksPayload)) {
|
|
288
328
|
throw new LocalAuthoritativeTaskAttachmentLinksError('Installed task attachment-link state does not match authority.');
|
|
289
329
|
}
|
|
290
330
|
return updated;
|
|
@@ -2,6 +2,7 @@ import { EntityEventIdentityCollisionError } from '../../core/TaskActivityServic
|
|
|
2
2
|
import { applyAuthoritativeTaskChecklistAndAck, LocalAuthoritativeTaskChecklistError, } from './localTaskChecklistOutboxService.js';
|
|
3
3
|
import { fingerprintWorkspaceSyncPayload, WorkspaceSyncIdempotencyConflictError, WorkspaceSyncRevisionConflictError, } from './syncDurabilityStore.js';
|
|
4
4
|
import { validateWorkspaceSyncV3TaskChecklistPayload } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
5
|
+
import { validateTaskChecklistItemUpdateIntent } from './taskChecklistMutationService.js';
|
|
5
6
|
import { parseWorkspaceSyncV3OriginActor } from './workspaceSyncV3OriginActor.js';
|
|
6
7
|
export function buildTaskChecklistEnvelope(record) {
|
|
7
8
|
let payload;
|
|
@@ -17,9 +18,20 @@ export function buildTaskChecklistEnvelope(record) {
|
|
|
17
18
|
}
|
|
18
19
|
const source = payload;
|
|
19
20
|
if (!Object.prototype.hasOwnProperty.call(source, 'items')
|
|
20
|
-
|| Object.keys(source).some((key) =>
|
|
21
|
-
|
|
21
|
+
|| Object.keys(source).some((key) => ![
|
|
22
|
+
'items', 'expectedDetailRevision', 'itemUpdateIntent', 'originActor',
|
|
23
|
+
].includes(key))) {
|
|
24
|
+
throw new Error('Local task checklist outbox payload must contain items and optional expectedDetailRevision/originActor.');
|
|
22
25
|
}
|
|
26
|
+
const expectedDetailRevision = source.expectedDetailRevision === undefined
|
|
27
|
+
? undefined
|
|
28
|
+
: String(source.expectedDetailRevision).trim();
|
|
29
|
+
if (source.expectedDetailRevision !== undefined && !expectedDetailRevision) {
|
|
30
|
+
throw new Error('Local task checklist expectedDetailRevision is invalid.');
|
|
31
|
+
}
|
|
32
|
+
const itemUpdateIntent = source.itemUpdateIntent === undefined
|
|
33
|
+
? undefined
|
|
34
|
+
: validateTaskChecklistItemUpdateIntent(source.itemUpdateIntent);
|
|
23
35
|
const checklist = validateWorkspaceSyncV3TaskChecklistPayload({ taskId: record.entityId, items: source.items });
|
|
24
36
|
return {
|
|
25
37
|
contractVersion: 3,
|
|
@@ -31,6 +43,8 @@ export function buildTaskChecklistEnvelope(record) {
|
|
|
31
43
|
baseEntityRevision: record.baseEntityRevision, baseLifecycleRevision: '0',
|
|
32
44
|
payload: {
|
|
33
45
|
items: checklist.items,
|
|
46
|
+
...(expectedDetailRevision ? { expectedDetailRevision } : {}),
|
|
47
|
+
...(itemUpdateIntent ? { itemUpdateIntent } : {}),
|
|
34
48
|
...(source.originActor !== undefined
|
|
35
49
|
? { originActor: parseWorkspaceSyncV3OriginActor(source.originActor) }
|
|
36
50
|
: {}),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ChecklistItem, TaskEvent, TaskItem } from '../../core/Taskforce.js';
|
|
2
|
+
import { type TaskChecklistItemUpdateIntent } from './taskChecklistMutationService.js';
|
|
2
3
|
import { WorkspaceSyncDurabilityStore, type WorkspaceSyncOperationIdentity } from './syncDurabilityStore.js';
|
|
3
4
|
export interface LocalTaskChecklistOutboxCore {
|
|
4
5
|
getTask(id: string, workspaceId?: string): TaskItem | null;
|
|
@@ -17,6 +18,7 @@ export interface LocalTaskChecklistOutboxCore {
|
|
|
17
18
|
allowAuthoritativeReplacement?: boolean;
|
|
18
19
|
}): unknown;
|
|
19
20
|
notifyDurableTaskMetadataCommitted(workspaceId: string, taskId: string): void;
|
|
21
|
+
assertTaskDetailRevisionForUpdate?(id: string, expectedDetailRevision: string, workspaceId?: string): void;
|
|
20
22
|
}
|
|
21
23
|
export declare class LocalAuthoritativeTaskChecklistError extends Error {
|
|
22
24
|
readonly code = "WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID";
|
|
@@ -30,6 +32,8 @@ export declare function enqueueLocalTaskChecklistMutation(input: {
|
|
|
30
32
|
items: readonly Partial<ChecklistItem>[];
|
|
31
33
|
now: string;
|
|
32
34
|
actorRef: string;
|
|
35
|
+
expectedDetailRevision?: string;
|
|
36
|
+
itemUpdateIntent?: TaskChecklistItemUpdateIntent;
|
|
33
37
|
requireV3CombinedOwnership?: boolean;
|
|
34
38
|
onPostCommitError?: (error: unknown) => void;
|
|
35
39
|
}): {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
|
|
2
2
|
import { buildTaskChecklistActivityEventId } from './taskChecklistActivityIdentity.js';
|
|
3
|
+
import { DurableTaskChecklistMutationError, } from './taskChecklistMutationService.js';
|
|
3
4
|
import { selectDurableTaskMetadataPatch } from '../../core/TaskDurableSyncMutationService.js';
|
|
4
5
|
import { serializeTaskRootForSync } from './workspaceSyncV3TaskRootProjection.js';
|
|
5
6
|
import { serializeTaskActivityForSync } from './taskActivityJournal.js';
|
|
@@ -48,7 +49,13 @@ export function enqueueLocalTaskChecklistMutation(input) {
|
|
|
48
49
|
const result = input.store.enqueueLocalOperation({
|
|
49
50
|
identity: input.identity,
|
|
50
51
|
domain: 'task-checklist', entityId: input.taskId, mutationKind: 'replace',
|
|
51
|
-
revisionSource: 'current', payload: withOriginActorPayload({
|
|
52
|
+
revisionSource: 'current', payload: withOriginActorPayload({
|
|
53
|
+
items,
|
|
54
|
+
...(input.expectedDetailRevision
|
|
55
|
+
? { expectedDetailRevision: input.expectedDetailRevision }
|
|
56
|
+
: {}),
|
|
57
|
+
...(input.itemUpdateIntent ? { itemUpdateIntent: input.itemUpdateIntent } : {}),
|
|
58
|
+
}, input.actorRef),
|
|
52
59
|
additionalTargets: [{
|
|
53
60
|
domain: 'task', entityId: input.taskId, mutationKind: 'metadata-update',
|
|
54
61
|
baseEntityRevision: rootRevision.entityRevision, baseLifecycleRevision: rootRevision.lifecycleRevision,
|
|
@@ -58,6 +65,12 @@ export function enqueueLocalTaskChecklistMutation(input) {
|
|
|
58
65
|
...(input.requireV3CombinedOwnership ? { requireV3PlanningOwnership: 'combined' } : {}),
|
|
59
66
|
now: input.now,
|
|
60
67
|
applyLocalMutation: () => {
|
|
68
|
+
if (input.expectedDetailRevision) {
|
|
69
|
+
if (!input.core.assertTaskDetailRevisionForUpdate) {
|
|
70
|
+
throw new DurableTaskChecklistMutationError('Task detail revision checks are unavailable.', 'TASK_CHECKLIST_INVALID', 500);
|
|
71
|
+
}
|
|
72
|
+
input.core.assertTaskDetailRevisionForUpdate(input.taskId, input.expectedDetailRevision, input.identity.workspaceId);
|
|
73
|
+
}
|
|
61
74
|
const existing = input.core.getTask(input.taskId, input.identity.workspaceId);
|
|
62
75
|
if (!existing)
|
|
63
76
|
throw new LocalAuthoritativeTaskChecklistError('Task not found.');
|
|
@@ -5,7 +5,7 @@ import { validateTaskActivityAuthoritativeRevision } from './taskActivityAuthori
|
|
|
5
5
|
import { serializeEntityActivityForSync, serializeTaskActivityForSync, WORKSPACE_SYNC_ENTITY_EVENT_APPEND, WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN, } from './taskActivityJournal.js';
|
|
6
6
|
import { fingerprintWorkspaceSyncPayload, } from './syncDurabilityStore.js';
|
|
7
7
|
import { serializeTaskRootForSync } from './workspaceSyncV3TaskRootProjection.js';
|
|
8
|
-
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
8
|
+
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskChecklistPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
9
9
|
export class LocalAuthoritativeTaskCreateError extends Error {
|
|
10
10
|
code = 'WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID';
|
|
11
11
|
constructor(message) {
|
|
@@ -264,7 +264,9 @@ export function applyAuthoritativeTaskCreateAndAck(input) {
|
|
|
264
264
|
throw new LocalAuthoritativeTaskCreateError('Authoritative task create attachment-link projection is invalid.');
|
|
265
265
|
}
|
|
266
266
|
try {
|
|
267
|
-
canonicalAttachmentProjection =
|
|
267
|
+
canonicalAttachmentProjection = Object.prototype.hasOwnProperty.call(attachmentProjection.payload, 'cardCoverAssetId')
|
|
268
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(attachmentProjection.payload)
|
|
269
|
+
: validateWorkspaceSyncV3TaskAttachmentLinksPayload(attachmentProjection.payload);
|
|
268
270
|
}
|
|
269
271
|
catch {
|
|
270
272
|
throw new LocalAuthoritativeTaskCreateError('Authoritative task create attachment-link payload is invalid.');
|
|
@@ -272,10 +274,16 @@ export function applyAuthoritativeTaskCreateAndAck(input) {
|
|
|
272
274
|
if (canonicalAttachmentProjection.taskId !== task.id) {
|
|
273
275
|
throw new LocalAuthoritativeTaskCreateError('Authoritative task create attachment-link identity is invalid.');
|
|
274
276
|
}
|
|
275
|
-
const capturedAttachmentProjection =
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
277
|
+
const capturedAttachmentProjection = 'cardCoverAssetId' in canonicalAttachmentProjection
|
|
278
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
279
|
+
taskId: task.id,
|
|
280
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.identity.workspaceId),
|
|
281
|
+
cardCoverAssetId: task.cardCoverAssetId ?? null,
|
|
282
|
+
})
|
|
283
|
+
: serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
284
|
+
taskId: task.id,
|
|
285
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.identity.workspaceId),
|
|
286
|
+
});
|
|
279
287
|
const relationshipIntent = (projection) => ({
|
|
280
288
|
taskId: projection.taskId,
|
|
281
289
|
links: projection.links.map(({ assetId, role, order, displayName }) => ({
|
|
@@ -284,6 +292,7 @@ export function applyAuthoritativeTaskCreateAndAck(input) {
|
|
|
284
292
|
order,
|
|
285
293
|
...(displayName ? { displayName } : {}),
|
|
286
294
|
})),
|
|
295
|
+
...('cardCoverAssetId' in projection ? { cardCoverAssetId: projection.cardCoverAssetId } : {}),
|
|
287
296
|
});
|
|
288
297
|
if (fingerprintWorkspaceSyncPayload(relationshipIntent(canonicalAttachmentProjection))
|
|
289
298
|
!== fingerprintWorkspaceSyncPayload(relationshipIntent(capturedAttachmentProjection))) {
|
|
@@ -7,6 +7,7 @@ export declare function createLocalTaskMetadataClient(input?: LocalTaskOperation
|
|
|
7
7
|
entityId: string;
|
|
8
8
|
patch: Partial<TaskItem>;
|
|
9
9
|
saveSource?: "manual" | "autosave";
|
|
10
|
+
expectedDetailRevision?: string;
|
|
10
11
|
isAuthenticated: boolean;
|
|
11
12
|
dispatchEnabled?: boolean;
|
|
12
13
|
}): Promise<LocalTaskMetadataMutationResult>;
|
|
@@ -15,6 +15,7 @@ export function createLocalTaskMetadataClient(input = {}) {
|
|
|
15
15
|
payload: {
|
|
16
16
|
patch,
|
|
17
17
|
...(inputValue.saveSource ? { saveSource: inputValue.saveSource } : {}),
|
|
18
|
+
...(inputValue.expectedDetailRevision ? { expectedDetailRevision: inputValue.expectedDetailRevision } : {}),
|
|
18
19
|
},
|
|
19
20
|
};
|
|
20
21
|
return client.execute({
|
|
@@ -18,12 +18,15 @@ function buildTaskMetadataEnvelope(record) {
|
|
|
18
18
|
throw new Error('Local outbox payload must be an object.');
|
|
19
19
|
}
|
|
20
20
|
const payloadRecord = payload;
|
|
21
|
-
const allowedKeys = new Set(['patch', 'saveSource', 'originActor']);
|
|
21
|
+
const allowedKeys = new Set(['patch', 'saveSource', 'expectedDetailRevision', 'originActor']);
|
|
22
22
|
if (!Object.prototype.hasOwnProperty.call(payloadRecord, 'patch')
|
|
23
23
|
|| Object.keys(payloadRecord).some((key) => !allowedKeys.has(key))) {
|
|
24
24
|
throw new Error('Local task metadata outbox payload must contain patch and optional saveSource/originActor.');
|
|
25
25
|
}
|
|
26
26
|
const saveSource = payloadRecord.saveSource;
|
|
27
|
+
const expectedDetailRevision = typeof payloadRecord.expectedDetailRevision === 'string'
|
|
28
|
+
? payloadRecord.expectedDetailRevision
|
|
29
|
+
: undefined;
|
|
27
30
|
if (saveSource !== undefined && saveSource !== 'manual' && saveSource !== 'autosave') {
|
|
28
31
|
throw new Error('Local task metadata outbox saveSource must be manual or autosave.');
|
|
29
32
|
}
|
|
@@ -41,6 +44,7 @@ function buildTaskMetadataEnvelope(record) {
|
|
|
41
44
|
payload: {
|
|
42
45
|
patch: validateDurableTaskMetadataPatch(payloadRecord.patch),
|
|
43
46
|
...(saveSource ? { saveSource } : {}),
|
|
47
|
+
...(expectedDetailRevision ? { expectedDetailRevision } : {}),
|
|
44
48
|
...(payloadRecord.originActor !== undefined
|
|
45
49
|
? { originActor: parseWorkspaceSyncV3OriginActor(payloadRecord.originActor) }
|
|
46
50
|
: {}),
|
|
@@ -17,6 +17,7 @@ export interface LocalTaskMetadataOutboxCore {
|
|
|
17
17
|
allowAuthoritativeReplacement?: boolean;
|
|
18
18
|
}): unknown;
|
|
19
19
|
notifyDurableTaskMetadataCommitted(workspaceId: string, taskId: string): void;
|
|
20
|
+
assertTaskDetailRevisionForUpdate?(id: string, expectedDetailRevision: string, workspaceId?: string): void;
|
|
20
21
|
}
|
|
21
22
|
export declare class LocalAuthoritativeTaskMetadataError extends Error {
|
|
22
23
|
readonly code = "WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID";
|
|
@@ -29,6 +30,7 @@ export declare function enqueueLocalTaskMetadataMutation(input: {
|
|
|
29
30
|
taskId: string;
|
|
30
31
|
patch: Partial<TaskItem>;
|
|
31
32
|
saveSource?: 'manual' | 'autosave';
|
|
33
|
+
expectedDetailRevision?: string;
|
|
32
34
|
now: string;
|
|
33
35
|
actorRef: string;
|
|
34
36
|
requireV3CombinedOwnership?: boolean;
|
|
@@ -30,10 +30,17 @@ export function enqueueLocalTaskMetadataMutation(input) {
|
|
|
30
30
|
payload: withOriginActorPayload({
|
|
31
31
|
patch,
|
|
32
32
|
...(input.saveSource ? { saveSource: input.saveSource } : {}),
|
|
33
|
+
...(input.expectedDetailRevision ? { expectedDetailRevision: input.expectedDetailRevision } : {}),
|
|
33
34
|
}, input.actorRef),
|
|
34
35
|
...(input.requireV3CombinedOwnership ? { requireV3PlanningOwnership: 'combined' } : {}),
|
|
35
36
|
now: input.now,
|
|
36
37
|
applyLocalMutation: () => {
|
|
38
|
+
if (input.expectedDetailRevision) {
|
|
39
|
+
if (!input.core.assertTaskDetailRevisionForUpdate) {
|
|
40
|
+
throw new DurableTaskMetadataMutationError('Task detail revision checks are unavailable.', 'DURABLE_TASK_PATCH_INVALID', 500);
|
|
41
|
+
}
|
|
42
|
+
input.core.assertTaskDetailRevisionForUpdate(input.taskId, input.expectedDetailRevision, input.identity.workspaceId);
|
|
43
|
+
}
|
|
37
44
|
const task = input.core.updateTask(input.taskId, patch, input.identity.workspaceId, {
|
|
38
45
|
persistBackup: false,
|
|
39
46
|
emitRealtime: false,
|
|
@@ -5,7 +5,7 @@ import { buildTaskLifecycleActivityEventId } from './taskLifecycleActivityIdenti
|
|
|
5
5
|
import { validateTaskActivityAuthoritativeRevision } from './taskActivityAuthoritativeRevision.js';
|
|
6
6
|
import { serializeTaskActivityForSync, WORKSPACE_SYNC_ENTITY_EVENT_APPEND, WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN, } from './taskActivityJournal.js';
|
|
7
7
|
import { fingerprintWorkspaceSyncPayload, WorkspaceSyncIdempotencyConflictError, } from './syncDurabilityStore.js';
|
|
8
|
-
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
8
|
+
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
9
9
|
export class LocalAuthoritativeTaskRestoreError extends Error {
|
|
10
10
|
code = 'WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID';
|
|
11
11
|
constructor(message) {
|
|
@@ -190,7 +190,9 @@ export function applyAuthoritativeTaskRestoreAndAck(input) {
|
|
|
190
190
|
let canonicalAttachments;
|
|
191
191
|
try {
|
|
192
192
|
canonicalChecklist = validateWorkspaceSyncV3TaskChecklistPayload(checklist.payload);
|
|
193
|
-
canonicalAttachments =
|
|
193
|
+
canonicalAttachments = Object.prototype.hasOwnProperty.call(attachments.payload, 'cardCoverAssetId')
|
|
194
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(attachments.payload)
|
|
195
|
+
: validateWorkspaceSyncV3TaskAttachmentLinksPayload(attachments.payload);
|
|
194
196
|
}
|
|
195
197
|
catch {
|
|
196
198
|
throw new LocalAuthoritativeTaskRestoreError('Authoritative task restore nested projection is invalid.');
|
|
@@ -214,10 +216,16 @@ export function applyAuthoritativeTaskRestoreAndAck(input) {
|
|
|
214
216
|
!== fingerprintWorkspaceSyncPayload(serializeWorkspaceSyncV3TaskChecklistPayload({ taskId: task.id, items: task.checklistItems || [] }))) {
|
|
215
217
|
throw new LocalAuthoritativeTaskRestoreError('Authoritative task restore projections do not match the task payload.');
|
|
216
218
|
}
|
|
217
|
-
const capturedAttachments =
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
const capturedAttachments = 'cardCoverAssetId' in canonicalAttachments
|
|
220
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
221
|
+
taskId: task.id,
|
|
222
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.identity.workspaceId),
|
|
223
|
+
cardCoverAssetId: task.cardCoverAssetId ?? null,
|
|
224
|
+
})
|
|
225
|
+
: serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
226
|
+
taskId: task.id,
|
|
227
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.identity.workspaceId),
|
|
228
|
+
});
|
|
221
229
|
if (fingerprintWorkspaceSyncPayload(canonicalAttachments)
|
|
222
230
|
!== fingerprintWorkspaceSyncPayload(capturedAttachments)) {
|
|
223
231
|
throw new LocalAuthoritativeTaskRestoreError('Authoritative task restore attachment links do not match the captured projection.');
|
|
@@ -9,6 +9,7 @@ export type LocalTaskStatusMutationInput = {
|
|
|
9
9
|
assigneeIntent: DurableTaskStatusAssigneeIntent;
|
|
10
10
|
canceledReason: string | null;
|
|
11
11
|
metadataPatch?: Partial<TaskItem>;
|
|
12
|
+
expectedDetailRevision?: string;
|
|
12
13
|
isAuthenticated: boolean;
|
|
13
14
|
dispatchEnabled?: boolean;
|
|
14
15
|
};
|
|
@@ -20,7 +20,12 @@ export function createLocalTaskStatusClient(input = {}) {
|
|
|
20
20
|
domain: 'task',
|
|
21
21
|
entityId,
|
|
22
22
|
mutationKind: 'set-status',
|
|
23
|
-
payload
|
|
23
|
+
payload: {
|
|
24
|
+
...payload,
|
|
25
|
+
...(inputValue.expectedDetailRevision
|
|
26
|
+
? { expectedDetailRevision: inputValue.expectedDetailRevision }
|
|
27
|
+
: {}),
|
|
28
|
+
},
|
|
24
29
|
};
|
|
25
30
|
return client.execute({
|
|
26
31
|
workspaceId,
|
|
@@ -3,6 +3,7 @@ import { type DurableTaskStatusMutationCore, type DurableTaskStatusMutationPaylo
|
|
|
3
3
|
import { WorkspaceSyncDurabilityStore, type WorkspaceSyncOperationIdentity, type WorkspaceSyncOutboxRecord } from './syncDurabilityStore.js';
|
|
4
4
|
import type { DatabaseAdapter } from '../../storage/databaseAdapter.js';
|
|
5
5
|
export interface LocalTaskStatusOutboxCore extends DurableTaskStatusMutationCore {
|
|
6
|
+
assertTaskDetailRevisionForUpdate?(id: string, expectedDetailRevision: string, workspaceId?: string): void;
|
|
6
7
|
getDatabaseAdapter(): DatabaseAdapter;
|
|
7
8
|
getTenantId(): string;
|
|
8
9
|
installDurableTaskStatusAuthoritativeForSync(task: TaskItem, payload: DurableTaskStatusMutationPayload, installAssignee: boolean, workspaceId: string): TaskItem;
|
|
@@ -22,6 +23,14 @@ export interface LocalTaskStatusOutboxCore extends DurableTaskStatusMutationCore
|
|
|
22
23
|
activity: TaskEvent | null;
|
|
23
24
|
}): boolean;
|
|
24
25
|
notifyDurableTaskLifecycleCommitted(workspaceId: string, taskId: string): void;
|
|
26
|
+
addTaskCommentEventForDurableSync(event: {
|
|
27
|
+
taskId: string;
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
actor: string;
|
|
30
|
+
eventId: string;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
comment: NonNullable<TaskItem['comments']>[number];
|
|
33
|
+
}): void;
|
|
25
34
|
}
|
|
26
35
|
export declare class LocalAuthoritativeTaskStatusError extends Error {
|
|
27
36
|
readonly code = "WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID";
|
|
@@ -33,6 +42,7 @@ export declare function enqueueLocalTaskStatusMutation(input: {
|
|
|
33
42
|
identity: WorkspaceSyncOperationIdentity;
|
|
34
43
|
taskId: string;
|
|
35
44
|
payload: unknown;
|
|
45
|
+
expectedDetailRevision?: string;
|
|
36
46
|
now: string;
|
|
37
47
|
actorRef: string;
|
|
38
48
|
requireV3CombinedOwnership?: boolean;
|