@taskforcehq/taskforce 0.3.328 → 0.3.330
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Taskforce.module.css +523 -79
- package/dist/TaskforceCore.js +237 -230
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
- package/dist/cli.js +34 -0
- package/dist/cliCloudTargetGuard.d.ts +5 -0
- package/dist/cliCloudTargetGuard.js +11 -0
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
- package/dist/components/features/TaskSettings.d.ts +12 -1
- package/dist/components/features/TaskSettings.js +217 -54
- package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
- package/dist/components/features/TaskforceAgentsModule.js +586 -116
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
- package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
- package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
- package/dist/components/features/planning/PlanningModule.js +2 -5
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
- package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
- package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
- package/dist/components/features/planning/planningTaskArrangement.js +5 -5
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +5 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskCard.d.ts +5 -0
- package/dist/components/task/TaskCard.js +65 -10
- package/dist/components/task/TaskImageReviews.js +14 -5
- package/dist/components/task/TaskKanban.d.ts +6 -1
- package/dist/components/task/TaskKanban.js +152 -6
- package/dist/components/task/TaskList.d.ts +5 -0
- package/dist/components/task/TaskList.js +3 -3
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/ui/PasswordInput.d.ts +6 -0
- package/dist/components/ui/PasswordInput.js +11 -0
- package/dist/components/ui/TopNoticeLayer.js +1 -1
- package/dist/components/views/AppShellHeader.js +32 -11
- package/dist/components/views/PlanComparisonPage.js +12 -0
- package/dist/components/views/StandaloneLayout.js +32 -55
- package/dist/components/views/WidgetView.js +3 -3
- package/dist/components/views/panels/PlanningDrawer.js +5 -12
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
- package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
- package/dist/config/envSchema.js +60 -1
- package/dist/config/localServiceRuntimeContract.d.ts +13 -0
- package/dist/config/localServiceRuntimeContract.js +135 -0
- package/dist/core/AiProfileService.js +46 -8
- package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
- package/dist/core/DeletedTaskLifecycleService.js +37 -6
- package/dist/core/McpTokenService.d.ts +23 -1
- package/dist/core/McpTokenService.js +93 -10
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
- package/dist/core/TaskChecklistCommandService.d.ts +27 -0
- package/dist/core/TaskChecklistCommandService.js +83 -5
- package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
- package/dist/core/TaskLifecycleCommandService.js +6 -2
- package/dist/core/Taskforce.d.ts +94 -2
- package/dist/core/Taskforce.js +760 -36
- package/dist/core/types.d.ts +14 -0
- package/dist/documentReviews/commandService.d.ts +2 -1
- package/dist/documentReviews/commandService.js +6 -3
- package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.js +2 -0
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
- package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
- package/dist/hooks/sync/useSyncStatusControls.js +47 -11
- package/dist/hooks/tasks/taskHttpMutation.js +1 -0
- package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
- package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
- package/dist/hooks/tasks/useTaskFormActions.js +65 -12
- package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
- package/dist/hooks/ui/useSettingsModel.js +13 -2
- package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
- package/dist/hooks/ui/useSettingsPersistence.js +74 -47
- package/dist/hooks/useFilterSort.d.ts +7 -3
- package/dist/hooks/useFilterSort.js +15 -5
- package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +40 -1
- package/dist/hooks/useTaskData.js +240 -9
- package/dist/hooks/useTaskMutations.d.ts +12 -2
- package/dist/hooks/useTaskMutations.js +266 -52
- package/dist/hooks/useTaskforce.d.ts +39 -9
- package/dist/hooks/useTaskforce.js +359 -40
- package/dist/hooks/useUiNotice.d.ts +4 -0
- package/dist/hooks/useUiNotice.js +4 -0
- package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +53 -41
- package/dist/mcp/documentHelpers.d.ts +1 -0
- package/dist/mcp/documentHelpers.js +7 -3
- package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
- package/dist/mcp/durableTaskMutationRouter.js +10 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
- package/dist/mcp/httpProtocolRouting.d.ts +10 -0
- package/dist/mcp/httpProtocolRouting.js +19 -0
- package/dist/mcp/localCliHealth.d.ts +2 -2
- package/dist/mcp/localCliHealth.js +2 -2
- package/dist/mcp/localServiceProxy.d.ts +1 -0
- package/dist/mcp/localServiceProxy.js +530 -68
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
- package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
- package/dist/mcp/runtime.d.ts +54 -79
- package/dist/mcp/runtime.js +556 -139
- package/dist/mcp/taskPlanningRegistrar.js +64 -42
- package/dist/mcp/toolCallCompatibility.js +38 -1
- package/dist/mcp/toolCatalog.d.ts +1 -0
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +10 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +1 -0
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +427 -0
- package/dist/runtime/appGateDefinitions.d.ts +30 -6
- package/dist/runtime/appGateDefinitions.js +6 -6
- package/dist/runtime/appGates.d.ts +13 -13
- package/dist/runtime/appGates.js +36 -13
- package/dist/runtime/nodeAppGates.d.ts +8 -0
- package/dist/runtime/nodeAppGates.js +27 -0
- package/dist/server/cloudCollectionRead.d.ts +1 -1
- package/dist/server/cloudCollectionRead.js +2 -2
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +123 -14
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.d.ts +3 -0
- package/dist/server/localServiceLease.js +11 -2
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +4 -0
- package/dist/server/realtimeSyncWs.js +36 -12
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +113 -3
- package/dist/server/routes/agentRoles.js +3 -2
- package/dist/server/routes/agentSkills.js +3 -2
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +394 -39
- package/dist/server/routes/annotatedAttachments.js +3 -2
- package/dist/server/routes/auth.js +3 -1
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
- package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
- package/dist/server/routes/executorPhaseAApprovals.js +140 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
- package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
- package/dist/server/routes/githubReviewEvidence.js +116 -0
- package/dist/server/routes/localService.d.ts +15 -4
- package/dist/server/routes/localService.js +138 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/primitives.d.ts +2 -0
- package/dist/server/routes/shared.d.ts +19 -0
- package/dist/server/routes/shared.js +95 -19
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +9 -2
- package/dist/server/routes/syncPullApplyRoutes.js +23 -4
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +27 -16
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
- package/dist/server/routes/syncV3OperationRoutes.js +45 -9
- package/dist/server/routes/tasks.js +124 -13
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes/workspaces.js +43 -1
- package/dist/server/routes.js +59 -0
- package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
- package/dist/server/workspaceDeletionAdmission.js +50 -0
- package/dist/service/localServiceCli.js +16 -0
- package/dist/service/localServiceClientLifecycle.js +36 -10
- package/dist/services/codexAppServerModelGateway.d.ts +161 -0
- package/dist/services/codexAppServerModelGateway.js +663 -0
- package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
- package/dist/services/codexDeviceCodeLoginManager.js +265 -0
- package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
- package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
- package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
- package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
- package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
- package/dist/services/executorPhaseAApprovalService.js +609 -0
- package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
- package/dist/services/executorPhaseADriftEvaluator.js +93 -0
- package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
- package/dist/services/executorPhaseAIssuerCore.js +295 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
- package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
- package/dist/services/githubReviewEvidenceRuntime.js +30 -0
- package/dist/services/githubReviewEvidenceService.d.ts +93 -0
- package/dist/services/githubReviewEvidenceService.js +336 -0
- package/dist/services/modelGateway.d.ts +7 -0
- package/dist/services/modelProviderConnectionService.d.ts +71 -0
- package/dist/services/modelProviderConnectionService.js +279 -0
- package/dist/services/modelProviderCredentialHome.d.ts +32 -0
- package/dist/services/modelProviderCredentialHome.js +271 -0
- package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
- package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
- package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
- package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
- package/dist/services/taskforceAgentMcpBridge.js +30 -27
- package/dist/shared/adminEdgeProxy.d.ts +5 -0
- package/dist/shared/adminEdgeProxy.js +94 -0
- package/dist/shared/adminProxySessionCookies.d.ts +16 -0
- package/dist/shared/adminProxySessionCookies.js +86 -0
- package/dist/shared/aiProfileColors.d.ts +31 -1
- package/dist/shared/aiProfileColors.js +14 -6
- package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
- package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
- package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
- package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
- package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
- package/dist/shared/executorPhaseADriftContracts.js +63 -0
- package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
- package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
- package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
- package/dist/shared/executorPhaseARunAuthorization.js +232 -0
- package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
- package/dist/shared/executorPhaseASchemaValidation.js +53 -0
- package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
- package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
- package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
- package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
- package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
- package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
- package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
- package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
- package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
- package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
- package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
- package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
- package/dist/shared/executorPhaseATiming.d.ts +1 -0
- package/dist/shared/executorPhaseATiming.js +1 -0
- package/dist/shared/planningIdentity.js +1 -1
- package/dist/shared/productLogoKeys.d.ts +2 -0
- package/dist/shared/productLogoKeys.js +18 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
- package/dist/shared/taskforceAgentDefinition.js +6 -3
- package/dist/shared/taskforceAgentModels.d.ts +1 -0
- package/dist/shared/taskforceAgentModels.js +36 -3
- package/dist/shared/userFeatureGrants.d.ts +4 -0
- package/dist/shared/userFeatureGrants.js +7 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
- package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
- package/dist/storage/modelProviderConnectionStore.js +446 -0
- package/dist/storage/postgresAdapter.d.ts +24 -3
- package/dist/storage/postgresAdapter.js +117 -14
- package/dist/storage/postgresWorker.js +22 -5
- package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
- package/dist/storage/postgresWorkerProtocol.js +30 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/sync/cloudSyncApi.d.ts +4 -1
- package/dist/sync/cloudSyncApi.js +7 -2
- package/dist/sync/contentSyncState.d.ts +1 -1
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
- package/dist/sync/syncApplyHandlers.d.ts +2 -0
- package/dist/sync/syncApplyHandlers.js +10 -1
- package/dist/sync/syncService.d.ts +17 -0
- package/dist/sync/syncService.js +87 -19
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +8 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
- package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
- package/dist/sync/v3/durableOperationReplay.js +18 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
- package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
- package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
- package/dist/sync/v3/localTaskMetadataClient.js +1 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
- package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
- package/dist/sync/v3/localTaskStatusClient.js +6 -1
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
- package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
- package/dist/sync/v3/syncDurabilityStore.js +199 -13
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
- package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
- package/dist/sync/v3/taskChecklistMutationService.js +48 -1
- package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
- package/dist/sync/v3/taskCreateMutationService.js +7 -4
- package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
- package/dist/sync/v3/taskMetadataMutationService.js +4 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
- package/dist/sync/v3/taskRestoreMutationService.js +7 -4
- package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
- package/dist/sync/v3/taskStatusMutationService.js +123 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
- package/dist/sync/v3/workflowAssignmentSync.js +30 -0
- package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
- package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
- package/dist/sync/workspacePullFeed.js +2 -1
- package/dist/sync/workspaceRepair.d.ts +8 -2
- package/dist/sync/workspaceRepair.js +222 -6
- package/dist/sync/workspaceSyncModel.d.ts +21 -0
- package/dist/sync/workspaceSyncModel.js +35 -7
- package/dist/sync/workspaceSyncState.d.ts +1 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
- package/dist/types.d.ts +47 -1
- package/dist/types.js +6 -0
- package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
- package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
- package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
- package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
- package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
- package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
- package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
- package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-CTsDBaef.js +7 -0
- package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
- package/dist/ui/branding/logos/letterhead_dark.png +0 -0
- package/dist/ui/branding/logos/letterhead_light.png +0 -0
- package/dist/ui/branding/logos/signature_dark.png +0 -0
- package/dist/ui/branding/logos/signature_light.png +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/aiProfileDefaultLogo.js +16 -48
- package/dist/utils/httpSetCookie.d.ts +1 -0
- package/dist/utils/httpSetCookie.js +4 -1
- package/dist/utils/localRuntimeUrl.d.ts +1 -0
- package/dist/utils/localRuntimeUrl.js +14 -0
- package/dist/utils/productLogoRegistry.d.ts +2 -0
- package/dist/utils/productLogoRegistry.js +36 -0
- package/dist/utils/syncStatusPresentation.d.ts +4 -0
- package/dist/utils/syncStatusPresentation.js +17 -0
- package/dist/utils/taskActivity.d.ts +3 -2
- package/dist/utils/taskActivity.js +19 -2
- package/dist/utils/taskEditorReconciliation.d.ts +40 -0
- package/dist/utils/taskEditorReconciliation.js +217 -0
- package/dist/utils/taskEvents.d.ts +2 -0
- package/dist/utils/taskNormalization.d.ts +1 -0
- package/dist/utils/taskNormalization.js +39 -0
- package/dist/utils/taskSearch.js +2 -2
- package/dist/utils/uiNotice.d.ts +4 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +36 -6
- package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
- package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
- package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
- package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
- package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
- package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-BUplSsv_.js +0 -7
- package/dist/ui/assets/index-gz2EXuoK.css +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_NESTED_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3NestedWireContract.js';
|
|
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
|
+
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';
|
|
4
6
|
export const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR = Object.freeze({
|
|
5
7
|
coverageProfileId: 'task-planning-metadata',
|
|
6
8
|
coverageVersion: 3,
|
|
@@ -27,6 +29,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
|
|
|
27
29
|
nestedWriterPrerequisitesRequired: false,
|
|
28
30
|
workflowWriterPrerequisitesRequired: false,
|
|
29
31
|
planningOrderWriterPrerequisitesRequired: false,
|
|
32
|
+
taskCoverProjectionRequired: false,
|
|
30
33
|
};
|
|
31
34
|
}
|
|
32
35
|
if (profileId === WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR.coverageProfileId
|
|
@@ -38,6 +41,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
|
|
|
38
41
|
nestedWriterPrerequisitesRequired: true,
|
|
39
42
|
workflowWriterPrerequisitesRequired: false,
|
|
40
43
|
planningOrderWriterPrerequisitesRequired: false,
|
|
44
|
+
taskCoverProjectionRequired: false,
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
if (profileId === WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR.coverageProfileId
|
|
@@ -49,6 +53,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
|
|
|
49
53
|
nestedWriterPrerequisitesRequired: true,
|
|
50
54
|
workflowWriterPrerequisitesRequired: true,
|
|
51
55
|
planningOrderWriterPrerequisitesRequired: false,
|
|
56
|
+
taskCoverProjectionRequired: false,
|
|
52
57
|
};
|
|
53
58
|
}
|
|
54
59
|
if (profileId === WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR.coverageProfileId
|
|
@@ -60,16 +65,45 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
|
|
|
60
65
|
nestedWriterPrerequisitesRequired: true,
|
|
61
66
|
workflowWriterPrerequisitesRequired: false,
|
|
62
67
|
planningOrderWriterPrerequisitesRequired: true,
|
|
68
|
+
taskCoverProjectionRequired: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (profileId === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageProfileId
|
|
72
|
+
&& version === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageVersion
|
|
73
|
+
&& digest === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageDigest) {
|
|
74
|
+
return {
|
|
75
|
+
coverage: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR,
|
|
76
|
+
excludedProjections: WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS,
|
|
77
|
+
nestedWriterPrerequisitesRequired: true,
|
|
78
|
+
workflowWriterPrerequisitesRequired: false,
|
|
79
|
+
planningOrderWriterPrerequisitesRequired: false,
|
|
80
|
+
taskCoverProjectionRequired: true,
|
|
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,
|
|
63
93
|
};
|
|
64
94
|
}
|
|
65
95
|
return null;
|
|
66
96
|
}
|
|
67
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.
|
|
68
101
|
for (const coverage of [
|
|
69
102
|
WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR,
|
|
70
103
|
WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR,
|
|
71
104
|
WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR,
|
|
72
105
|
WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR,
|
|
106
|
+
WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR,
|
|
73
107
|
]) {
|
|
74
108
|
const contract = resolveWorkspaceSyncV3CombinedWireContract(coverage);
|
|
75
109
|
if (exclusions.length === contract.excludedProjections.length
|
|
@@ -2,6 +2,8 @@ import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_POLICY, WORKSPACE_SYNC_V3_COMBINED_
|
|
|
2
2
|
import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_POLICY, WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE, validateWorkspaceSyncV3NestedCoverageFeedEntry, } from './workspaceSyncV3NestedCoverage.js';
|
|
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
|
+
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';
|
|
5
7
|
export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
|
|
6
8
|
Object.freeze({
|
|
7
9
|
profile: WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE,
|
|
@@ -23,6 +25,16 @@ export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
|
|
|
23
25
|
policy: WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_POLICY,
|
|
24
26
|
validateEntry: validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry,
|
|
25
27
|
}),
|
|
28
|
+
Object.freeze({
|
|
29
|
+
profile: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE,
|
|
30
|
+
policy: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY,
|
|
31
|
+
validateEntry: validateWorkspaceSyncV3TaskCoverCoverageFeedEntry,
|
|
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
|
+
}),
|
|
26
38
|
]);
|
|
27
39
|
export function resolveWorkspaceSyncV3RegisteredCoverage(input) {
|
|
28
40
|
const profileId = String(input.coverageProfileId || '').trim();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type WorkspaceSyncV3ProjectionDescriptor = 'initiative/full-v1' | 'workstream/full-v1' | 'task/root-v1' | 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'entity-event/full-v1' | 'task-relationship/full-v1' | 'taxonomy/full-v1' | 'workflow-published-definition/full-v2' | 'workflow-execution/root-v1' | 'workflow-execution-event/full-v1' | 'workstream-task-order/full-v1';
|
|
1
|
+
export type WorkspaceSyncV3ProjectionDescriptor = 'initiative/full-v1' | 'workstream/full-v1' | 'task/root-v1' | 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2' | 'entity-event/full-v1' | 'task-relationship/full-v1' | 'taxonomy/full-v1' | 'workflow-published-definition/full-v2' | 'workflow-execution/root-v1' | 'workflow-execution-event/full-v1' | 'workstream-task-order/full-v1';
|
|
2
2
|
export type WorkspaceSyncV3JournalProjectionDescriptor = WorkspaceSyncV3ProjectionDescriptor | 'task/taxonomy-remap-v1';
|
|
3
3
|
export interface WorkspaceSyncV3ProjectionCoverageDescriptor {
|
|
4
4
|
projectionId: WorkspaceSyncV3ProjectionDescriptor;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isWorkspaceSyncV3CombinedLegacyFenceEnabled, normalizeWorkspaceSyncV2ProjectionExclusions, WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS, } from './workspaceSyncV2ProjectionExclusions.js';
|
|
2
|
-
import { resolveWorkspaceSyncV3CombinedWireContract, } from './workspaceSyncV3CombinedWireContract.js';
|
|
1
|
+
import { isWorkspaceSyncV3CombinedLegacyFenceConfigured, isWorkspaceSyncV3CombinedLegacyFenceEnabled, normalizeWorkspaceSyncV2ProjectionExclusions, WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS, } from './workspaceSyncV2ProjectionExclusions.js';
|
|
2
|
+
import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR, resolveWorkspaceSyncV3CombinedWireContract, } from './workspaceSyncV3CombinedWireContract.js';
|
|
3
3
|
import { resolveCombinedFeedCapability, resolveRequestedCombinedFeedCoverage } from './combinedFeedCapability.js';
|
|
4
4
|
export function isWorkspaceSyncV3NestedLegacyFenceEnabled(env = process.env) {
|
|
5
5
|
return /^(1|true|on|yes)$/i.test(String(env.TASKFORCE_SYNC_V3_NESTED_LEGACY_FENCE_ENABLED || '').trim());
|
|
@@ -17,17 +17,30 @@ export function resolveWorkspaceSyncV3RequiredCloudCoverage(env = process.env) {
|
|
|
17
17
|
export const resolveWorkspaceSyncV3RequiredPushCoverage = resolveWorkspaceSyncV3RequiredCloudCoverage;
|
|
18
18
|
export function resolveWorkspaceSyncV3AttestedV2Exclusions(input) {
|
|
19
19
|
const env = input.env || process.env;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
const runtimeMode = input.runtimeMode || 'cloud';
|
|
21
|
+
const localFenceEnabled = (coverage) => (isWorkspaceSyncV3CombinedLegacyFenceConfigured(env)
|
|
22
|
+
&& resolveCombinedFeedCapability({ runtimeMode: 'local', env, coverage })
|
|
23
|
+
.combinedFeed.activationReady);
|
|
24
|
+
if (input.coverage == null) {
|
|
25
|
+
const fenceEnabled = runtimeMode === 'local'
|
|
26
|
+
? localFenceEnabled(WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR)
|
|
27
|
+
: isWorkspaceSyncV3CombinedLegacyFenceEnabled(env);
|
|
28
|
+
return fenceEnabled ? WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS : [];
|
|
29
|
+
}
|
|
24
30
|
if (!input.coverage || typeof input.coverage !== 'object' || Array.isArray(input.coverage))
|
|
25
31
|
return null;
|
|
26
32
|
const contract = resolveWorkspaceSyncV3CombinedWireContract(input.coverage);
|
|
27
|
-
if (!contract
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
if (!contract)
|
|
34
|
+
return null;
|
|
35
|
+
const fenceEnabled = runtimeMode === 'local'
|
|
36
|
+
? localFenceEnabled(contract.coverage)
|
|
37
|
+
: isWorkspaceSyncV3CombinedLegacyFenceEnabled(env)
|
|
38
|
+
&& (!contract.nestedWriterPrerequisitesRequired
|
|
39
|
+
|| (isWorkspaceSyncV3NestedLegacyFenceEnabled(env)
|
|
40
|
+
&& resolveCombinedFeedCapability({
|
|
41
|
+
runtimeMode: 'cloud', env, coverage: contract.coverage,
|
|
42
|
+
}).combinedFeed.activationReady));
|
|
43
|
+
if (!fenceEnabled)
|
|
31
44
|
return null;
|
|
32
45
|
if (!Array.isArray(input.excludedProjections))
|
|
33
46
|
return null;
|
|
@@ -23,6 +23,7 @@ export interface WorkspaceSyncV3NestedTaskApplyCore {
|
|
|
23
23
|
resolveTaskAttachmentLinksForDurableSync(links: ReturnType<typeof serializeWorkspaceSyncV3TaskAttachmentLinksPayload>['links'], workspaceId: string, options?: {
|
|
24
24
|
adoptAuthoritativeReferenceNumber?: boolean;
|
|
25
25
|
ignoreAssetMetadataSnapshots?: boolean;
|
|
26
|
+
restoreDeletedExternalAssetForAuthoritativeSync?: boolean;
|
|
26
27
|
}): AttachmentItem[];
|
|
27
28
|
listTaskAttachmentLinksForDurableSync(taskId: string, workspaceId: string): ReturnType<typeof serializeWorkspaceSyncV3TaskAttachmentLinksPayload>['links'];
|
|
28
29
|
getEntityEventForSync(input: {
|
|
@@ -71,12 +72,14 @@ export declare function resolveWorkspaceSyncV3AttachmentApplyObligations(input:
|
|
|
71
72
|
} | {
|
|
72
73
|
success: false;
|
|
73
74
|
error: string;
|
|
75
|
+
disposition?: 'retryable' | 'terminal-unavailable';
|
|
74
76
|
}>;
|
|
75
77
|
onInstalled?: (taskId: string) => void;
|
|
76
78
|
}): Promise<{
|
|
77
79
|
attempted: number;
|
|
78
80
|
resolved: number;
|
|
79
81
|
remaining: number;
|
|
82
|
+
terminal: number;
|
|
80
83
|
nextAttemptAt: string | null;
|
|
81
84
|
resolvedTaskIds: string[];
|
|
82
85
|
lastError: string | null;
|
|
@@ -2,7 +2,7 @@ import { DurableTaskAttachmentLinksApplyError } from '../../core/TaskAttachmentL
|
|
|
2
2
|
import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
|
|
3
3
|
import { fingerprintWorkspaceSyncPayload, hasCompletedRecoveryForSupersededEntityEvent, WorkspaceSyncDurabilityStore, } from './syncDurabilityStore.js';
|
|
4
4
|
import { calculateAttachmentApplyObligationRetryDelayMs, WorkspaceSyncV3AttachmentApplyObligationStore, } from './workspaceSyncV3AttachmentApplyObligationStore.js';
|
|
5
|
-
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
5
|
+
import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
6
6
|
import { validateWorkspaceSyncV3NestedTaskFeedEntry } from './workspaceSyncV3NestedTaskProjection.js';
|
|
7
7
|
export class WorkspaceSyncV3TaskCommentAggregateDivergenceError extends Error {
|
|
8
8
|
taskId;
|
|
@@ -50,6 +50,7 @@ function serializeTaskAttachmentLinkOwnership(payload) {
|
|
|
50
50
|
order: link.order,
|
|
51
51
|
...(link.displayName !== undefined ? { displayName: link.displayName } : {}),
|
|
52
52
|
})),
|
|
53
|
+
...('cardCoverAssetId' in payload ? { cardCoverAssetId: payload.cardCoverAssetId } : {}),
|
|
53
54
|
};
|
|
54
55
|
}
|
|
55
56
|
function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecoveryIds) {
|
|
@@ -85,16 +86,22 @@ function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecov
|
|
|
85
86
|
assertInstalledFingerprint(serializeWorkspaceSyncV3TaskChecklistPayload({ taskId: task.id, items: installed.checklistItems || [] }), entry.canonicalFingerprint || '', 'Task checklist');
|
|
86
87
|
return;
|
|
87
88
|
}
|
|
88
|
-
if (entry.projection === 'task-attachment-links/full-v1'
|
|
89
|
-
|
|
89
|
+
if (entry.projection === 'task-attachment-links/full-v1'
|
|
90
|
+
|| entry.projection === 'task-attachment-links/full-v2') {
|
|
91
|
+
const v2Payload = entry.projection === 'task-attachment-links/full-v2'
|
|
92
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(entry.payload)
|
|
93
|
+
: null;
|
|
94
|
+
const payload = v2Payload ?? validateWorkspaceSyncV3TaskAttachmentLinksPayload(entry.payload);
|
|
95
|
+
const cardCoverAssetId = v2Payload?.cardCoverAssetId;
|
|
90
96
|
const task = taskOrThrow(core, payload.taskId, workspaceId);
|
|
91
97
|
const ownershipFingerprint = fingerprintWorkspaceSyncPayload(serializeTaskAttachmentLinkOwnership(payload));
|
|
92
98
|
const obligations = new WorkspaceSyncV3AttachmentApplyObligationStore(core.getDatabaseAdapter());
|
|
93
99
|
let attachments;
|
|
94
100
|
try {
|
|
95
|
-
attachments = core.resolveTaskAttachmentLinksForDurableSync(payload.links, workspaceId, {
|
|
101
|
+
attachments = core.getDatabaseAdapter().transaction(() => (core.resolveTaskAttachmentLinksForDurableSync(payload.links, workspaceId, {
|
|
96
102
|
ignoreAssetMetadataSnapshots: true,
|
|
97
|
-
|
|
103
|
+
restoreDeletedExternalAssetForAuthoritativeSync: true,
|
|
104
|
+
})))();
|
|
98
105
|
}
|
|
99
106
|
catch (error) {
|
|
100
107
|
if (error instanceof DurableTaskAttachmentLinksApplyError
|
|
@@ -122,10 +129,19 @@ function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecov
|
|
|
122
129
|
}
|
|
123
130
|
throw error;
|
|
124
131
|
}
|
|
125
|
-
installTaskNestedFields(core, workspaceId, task, {
|
|
126
|
-
|
|
127
|
-
|
|
132
|
+
const installed = installTaskNestedFields(core, workspaceId, task, {
|
|
133
|
+
attachments,
|
|
134
|
+
...(cardCoverAssetId !== undefined ? { cardCoverAssetId } : {}),
|
|
128
135
|
});
|
|
136
|
+
const installedPayload = cardCoverAssetId !== undefined
|
|
137
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
138
|
+
taskId: task.id,
|
|
139
|
+
links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
|
|
140
|
+
cardCoverAssetId: installed.cardCoverAssetId ?? null,
|
|
141
|
+
})
|
|
142
|
+
: serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
143
|
+
taskId: task.id, links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
|
|
144
|
+
});
|
|
129
145
|
// Captions, original filenames, and readable references are snapshots of
|
|
130
146
|
// asset-owned metadata. A historical link event must remain installable
|
|
131
147
|
// after the asset is renamed or receives a new readable reference.
|
|
@@ -210,7 +226,14 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
|
|
|
210
226
|
let lastError = null;
|
|
211
227
|
for (const obligation of due) {
|
|
212
228
|
try {
|
|
213
|
-
const
|
|
229
|
+
const rawPayload = JSON.parse(obligation.payloadJson);
|
|
230
|
+
const hasCardCover = Object.prototype.hasOwnProperty.call(rawPayload, 'cardCoverAssetId');
|
|
231
|
+
const payload = hasCardCover
|
|
232
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(rawPayload)
|
|
233
|
+
: validateWorkspaceSyncV3TaskAttachmentLinksPayload(rawPayload);
|
|
234
|
+
const cardCoverAssetId = hasCardCover
|
|
235
|
+
? payload.cardCoverAssetId
|
|
236
|
+
: undefined;
|
|
214
237
|
const installMutation = () => {
|
|
215
238
|
const task = input.core.getTask(payload.taskId, input.workspaceId);
|
|
216
239
|
if (!task) {
|
|
@@ -222,11 +245,22 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
|
|
|
222
245
|
}
|
|
223
246
|
const attachments = input.core.resolveTaskAttachmentLinksForDurableSync(payload.links, input.workspaceId, {
|
|
224
247
|
ignoreAssetMetadataSnapshots: true,
|
|
248
|
+
restoreDeletedExternalAssetForAuthoritativeSync: true,
|
|
225
249
|
});
|
|
226
|
-
installTaskNestedFields(input.core, input.workspaceId, task, {
|
|
227
|
-
|
|
228
|
-
|
|
250
|
+
const installed = installTaskNestedFields(input.core, input.workspaceId, task, {
|
|
251
|
+
attachments,
|
|
252
|
+
...(cardCoverAssetId !== undefined ? { cardCoverAssetId } : {}),
|
|
229
253
|
});
|
|
254
|
+
const installedPayload = cardCoverAssetId !== undefined
|
|
255
|
+
? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
256
|
+
taskId: task.id,
|
|
257
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.workspaceId),
|
|
258
|
+
cardCoverAssetId: installed.cardCoverAssetId ?? null,
|
|
259
|
+
})
|
|
260
|
+
: serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
|
|
261
|
+
taskId: task.id,
|
|
262
|
+
links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.workspaceId),
|
|
263
|
+
});
|
|
230
264
|
assertInstalledFingerprint(serializeTaskAttachmentLinkOwnership(installedPayload), fingerprintWorkspaceSyncPayload(serializeTaskAttachmentLinkOwnership(payload)), `Task attachment links for ${task.id}`);
|
|
231
265
|
obligationStore.resolve({
|
|
232
266
|
tenantId, workspaceId: input.workspaceId, taskId: obligation.taskId,
|
|
@@ -292,8 +326,20 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
|
|
|
292
326
|
if (!input.hydrateAsset || !assetId || hydratedAssetIds.has(assetId))
|
|
293
327
|
throw error;
|
|
294
328
|
const hydration = await input.hydrateAsset(assetId);
|
|
295
|
-
if (!hydration.success)
|
|
329
|
+
if (!hydration.success) {
|
|
330
|
+
if (hydration.disposition === 'terminal-unavailable') {
|
|
331
|
+
obligationStore.markTerminalUnavailable({
|
|
332
|
+
tenantId,
|
|
333
|
+
workspaceId: input.workspaceId,
|
|
334
|
+
taskId: obligation.taskId,
|
|
335
|
+
canonicalFingerprint: obligation.canonicalFingerprint,
|
|
336
|
+
reason: hydration.error,
|
|
337
|
+
now: input.now,
|
|
338
|
+
});
|
|
339
|
+
throw new TerminalAttachmentApplyObligationError(hydration.error);
|
|
340
|
+
}
|
|
296
341
|
throw new Error(hydration.error);
|
|
342
|
+
}
|
|
297
343
|
hydratedAssetIds.add(assetId);
|
|
298
344
|
}
|
|
299
345
|
}
|
|
@@ -304,6 +350,8 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
|
|
|
304
350
|
}
|
|
305
351
|
catch (error) {
|
|
306
352
|
lastError = error instanceof Error ? error.message : 'Deferred attachment-link retry failed.';
|
|
353
|
+
if (error instanceof TerminalAttachmentApplyObligationError)
|
|
354
|
+
continue;
|
|
307
355
|
const nextAttemptAt = new Date(Date.parse(input.now) + calculateAttachmentApplyObligationRetryDelayMs(obligation.attempts + 1)).toISOString();
|
|
308
356
|
obligationStore.recordAttemptFailure({
|
|
309
357
|
tenantId, workspaceId: input.workspaceId, taskId: obligation.taskId,
|
|
@@ -318,8 +366,11 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
|
|
|
318
366
|
attempted: due.length,
|
|
319
367
|
resolved,
|
|
320
368
|
remaining: summary.open,
|
|
369
|
+
terminal: summary.terminal,
|
|
321
370
|
nextAttemptAt: summary.nextAttemptAt,
|
|
322
371
|
resolvedTaskIds,
|
|
323
372
|
lastError: summary.lastError || lastError,
|
|
324
373
|
};
|
|
325
374
|
}
|
|
375
|
+
class TerminalAttachmentApplyObligationError extends Error {
|
|
376
|
+
}
|
|
@@ -18,6 +18,9 @@ export type WorkspaceSyncV3TaskAttachmentLinksPayload = {
|
|
|
18
18
|
taskId: string;
|
|
19
19
|
links: WorkspaceSyncV3TaskAttachmentLink[];
|
|
20
20
|
};
|
|
21
|
+
export type WorkspaceSyncV3TaskAttachmentLinksV2Payload = WorkspaceSyncV3TaskAttachmentLinksPayload & {
|
|
22
|
+
cardCoverAssetId: string | null;
|
|
23
|
+
};
|
|
21
24
|
export type WorkspaceSyncV3TaskAttachmentLink = {
|
|
22
25
|
assetId: string;
|
|
23
26
|
role: 'attachment' | 'image' | 'reference';
|
|
@@ -55,5 +58,11 @@ export declare function serializeWorkspaceSyncV3TaskAttachmentLinksPayload(input
|
|
|
55
58
|
links: unknown;
|
|
56
59
|
}): WorkspaceSyncV3TaskAttachmentLinksPayload;
|
|
57
60
|
export declare function validateWorkspaceSyncV3TaskAttachmentLinksPayload(value: unknown): WorkspaceSyncV3TaskAttachmentLinksPayload;
|
|
61
|
+
export declare function serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload(input: {
|
|
62
|
+
taskId: string;
|
|
63
|
+
links: unknown;
|
|
64
|
+
cardCoverAssetId: unknown;
|
|
65
|
+
}): WorkspaceSyncV3TaskAttachmentLinksV2Payload;
|
|
66
|
+
export declare function validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(value: unknown): WorkspaceSyncV3TaskAttachmentLinksV2Payload;
|
|
58
67
|
export declare function serializeWorkspaceSyncV3EntityEventPayload(event: EntityEvent): WorkspaceSyncEntityEventSnapshot;
|
|
59
68
|
export declare function validateWorkspaceSyncV3EntityEventPayload(value: unknown): WorkspaceSyncEntityEventSnapshot;
|
|
@@ -279,6 +279,32 @@ export function validateWorkspaceSyncV3TaskAttachmentLinksPayload(value) {
|
|
|
279
279
|
}
|
|
280
280
|
return canonical;
|
|
281
281
|
}
|
|
282
|
+
export function serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload(input) {
|
|
283
|
+
const canonical = serializeWorkspaceSyncV3TaskAttachmentLinksPayload(input);
|
|
284
|
+
const cardCoverAssetId = input.cardCoverAssetId == null
|
|
285
|
+
? null
|
|
286
|
+
: requiredId(input.cardCoverAssetId, 'Task attachment links cardCoverAssetId');
|
|
287
|
+
if (cardCoverAssetId !== null && !canonical.links.some((link) => (link.assetId === cardCoverAssetId && link.role === 'image'))) {
|
|
288
|
+
throw new Error('Task attachment links cardCoverAssetId must reference an image link.');
|
|
289
|
+
}
|
|
290
|
+
return { ...canonical, cardCoverAssetId };
|
|
291
|
+
}
|
|
292
|
+
export function validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(value) {
|
|
293
|
+
const source = record(value, 'Task attachment links v2 payload');
|
|
294
|
+
exactKeys(source, new Set(['taskId', 'links', 'cardCoverAssetId']), 'Task attachment links v2 payload');
|
|
295
|
+
if (!Object.prototype.hasOwnProperty.call(source, 'cardCoverAssetId')) {
|
|
296
|
+
throw new Error('Task attachment links v2 payload must explicitly carry cardCoverAssetId.');
|
|
297
|
+
}
|
|
298
|
+
const canonical = serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
|
|
299
|
+
taskId: requiredId(source.taskId, 'Task attachment links taskId'),
|
|
300
|
+
links: source.links,
|
|
301
|
+
cardCoverAssetId: source.cardCoverAssetId,
|
|
302
|
+
});
|
|
303
|
+
if (canonicalWorkspaceSyncJson(canonical) !== canonicalWorkspaceSyncJson(value)) {
|
|
304
|
+
throw new Error('Task attachment links v2 payload is not canonically ordered or normalized.');
|
|
305
|
+
}
|
|
306
|
+
return canonical;
|
|
307
|
+
}
|
|
282
308
|
export function serializeWorkspaceSyncV3EntityEventPayload(event) {
|
|
283
309
|
const serialized = serializeEntityActivityForSync(event);
|
|
284
310
|
assertMetadataOnly(serialized.details, 'Entity event details');
|
|
@@ -33,15 +33,25 @@ export declare const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS: readonly [Readon
|
|
|
33
33
|
dependencies: readonly ["initiative/full-v1", "workstream/full-v1", "task/root-v1"];
|
|
34
34
|
operationAtomic: true;
|
|
35
35
|
}>];
|
|
36
|
+
export declare const WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION: Readonly<{
|
|
37
|
+
readonly projectionId: "task-attachment-links/full-v2";
|
|
38
|
+
readonly domain: "task-attachment-links";
|
|
39
|
+
readonly schemaVersion: 2;
|
|
40
|
+
readonly mutationKinds: readonly string[];
|
|
41
|
+
readonly fields: readonly string[];
|
|
42
|
+
readonly dependencies: readonly ["task/root-v1"];
|
|
43
|
+
readonly operationAtomic: true;
|
|
44
|
+
}>;
|
|
36
45
|
export declare function projectWorkspaceSyncV3NestedTaskJournalRow(row: WorkspaceSyncJournalRow): WorkspaceSyncV3FeedEntry | null;
|
|
46
|
+
export declare function projectWorkspaceSyncV3NestedTaskV2JournalRow(row: WorkspaceSyncJournalRow): WorkspaceSyncV3FeedEntry | null;
|
|
37
47
|
export declare function validateWorkspaceSyncV3NestedTaskFeedEntry(entry: WorkspaceSyncV3FeedEntry): void;
|
|
38
|
-
/**
|
|
39
|
-
* Operation projector for nested/event coverage. Ordinary writers emit
|
|
40
|
-
* parent-first operations; repair baselines and comment reconcile may emit
|
|
41
|
-
* nested-only groups that still project when every row is a nested domain.
|
|
42
|
-
*/
|
|
43
48
|
export declare function projectWorkspaceSyncV3NestedTaskOperation(input: {
|
|
44
49
|
rows: readonly WorkspaceSyncJournalRow[];
|
|
45
50
|
cycleHighWatermark: string;
|
|
46
51
|
followingRow?: WorkspaceSyncJournalRow | null;
|
|
47
52
|
}): WorkspaceSyncV3FeedEntry[] | null;
|
|
53
|
+
export declare function projectWorkspaceSyncV3NestedTaskV2Operation(input: {
|
|
54
|
+
rows: readonly WorkspaceSyncJournalRow[];
|
|
55
|
+
cycleHighWatermark: string;
|
|
56
|
+
followingRow?: WorkspaceSyncJournalRow | null;
|
|
57
|
+
}): WorkspaceSyncV3FeedEntry[] | null;
|
|
@@ -4,7 +4,7 @@ import { assertWorkspaceSyncV3OperationBoundary } from './workspaceSyncV3Operati
|
|
|
4
4
|
import { projectWorkspaceSyncV3TaskRootJournalRow } from './workspaceSyncV3TaskRootProjection.js';
|
|
5
5
|
import { projectWorkspaceSyncV3InitiativeJournalRow } from './workspaceSyncV3Feed.js';
|
|
6
6
|
import { projectWorkspaceSyncV3WorkstreamJournalRow } from './workspaceSyncV3WorkstreamProjection.js';
|
|
7
|
-
import { serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
7
|
+
import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
8
8
|
import { isLegacyEntityEventAdoptionIdentity } from './entityEventLegacyAdoptionContract.js';
|
|
9
9
|
export const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS = Object.freeze([
|
|
10
10
|
Object.freeze({
|
|
@@ -46,6 +46,15 @@ export const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS = Object.freeze([
|
|
|
46
46
|
operationAtomic: true,
|
|
47
47
|
}),
|
|
48
48
|
]);
|
|
49
|
+
export const WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION = Object.freeze({
|
|
50
|
+
projectionId: 'task-attachment-links/full-v2',
|
|
51
|
+
domain: 'task-attachment-links',
|
|
52
|
+
schemaVersion: 2,
|
|
53
|
+
mutationKinds: Object.freeze(['replace']),
|
|
54
|
+
fields: Object.freeze(['taskId', 'links', 'cardCoverAssetId']),
|
|
55
|
+
dependencies: Object.freeze(['task/root-v1']),
|
|
56
|
+
operationAtomic: true,
|
|
57
|
+
});
|
|
49
58
|
const projectionByDomain = new Map(WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS.map((projection) => [projection.domain, projection.projectionId]));
|
|
50
59
|
function sequence(value, label) {
|
|
51
60
|
const text = String(value ?? '').trim();
|
|
@@ -68,7 +77,7 @@ function parsePayload(row) {
|
|
|
68
77
|
throw new Error(`Nested task journal payload is malformed at ${row.sequence}.`);
|
|
69
78
|
}
|
|
70
79
|
}
|
|
71
|
-
function canonicalPayload(row) {
|
|
80
|
+
function canonicalPayload(row, attachmentProjection) {
|
|
72
81
|
const raw = parsePayload(row);
|
|
73
82
|
if (row.domain === 'task-comments') {
|
|
74
83
|
if (row.mutationKind === 'append') {
|
|
@@ -91,7 +100,17 @@ function canonicalPayload(row) {
|
|
|
91
100
|
return { payload, canonicalFingerprint: fingerprintWorkspaceSyncPayload(payload) };
|
|
92
101
|
}
|
|
93
102
|
if (row.domain === 'task-attachment-links' && row.mutationKind === 'replace') {
|
|
94
|
-
const payload =
|
|
103
|
+
const payload = attachmentProjection === 'task-attachment-links/full-v2'
|
|
104
|
+
? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(raw)
|
|
105
|
+
: (() => {
|
|
106
|
+
try {
|
|
107
|
+
return validateWorkspaceSyncV3TaskAttachmentLinksPayload(raw);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
const v2 = validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(raw);
|
|
111
|
+
return serializeWorkspaceSyncV3TaskAttachmentLinksPayload(v2);
|
|
112
|
+
}
|
|
113
|
+
})();
|
|
95
114
|
if (payload.taskId !== row.entityId)
|
|
96
115
|
throw new Error(`Task attachment-link identity is invalid at ${row.sequence}.`);
|
|
97
116
|
return { payload, canonicalFingerprint: fingerprintWorkspaceSyncPayload(payload) };
|
|
@@ -107,8 +126,10 @@ function canonicalPayload(row) {
|
|
|
107
126
|
function canonicalEntityEventPayload(raw) {
|
|
108
127
|
return validateWorkspaceSyncV3EntityEventPayload(serializeWorkspaceSyncV3EntityEventPayload(raw));
|
|
109
128
|
}
|
|
110
|
-
|
|
111
|
-
const projection =
|
|
129
|
+
function projectNestedTaskJournalRow(row, attachmentProjection) {
|
|
130
|
+
const projection = row.domain === 'task-attachment-links'
|
|
131
|
+
? attachmentProjection
|
|
132
|
+
: projectionByDomain.get(row.domain);
|
|
112
133
|
if (!projection)
|
|
113
134
|
return null;
|
|
114
135
|
if (row.contractVersion !== WORKSPACE_SYNC_CONTRACT_VERSION) {
|
|
@@ -131,7 +152,7 @@ export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
|
|
|
131
152
|
if (payload.action === 'sync-v3-repair-baseline')
|
|
132
153
|
return null;
|
|
133
154
|
}
|
|
134
|
-
const { payload, canonicalFingerprint } = canonicalPayload(row);
|
|
155
|
+
const { payload, canonicalFingerprint } = canonicalPayload(row, attachmentProjection);
|
|
135
156
|
return {
|
|
136
157
|
sequence: journalSequence,
|
|
137
158
|
projection,
|
|
@@ -146,8 +167,17 @@ export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
|
|
|
146
167
|
occurredAt,
|
|
147
168
|
};
|
|
148
169
|
}
|
|
170
|
+
export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
|
|
171
|
+
return projectNestedTaskJournalRow(row, 'task-attachment-links/full-v1');
|
|
172
|
+
}
|
|
173
|
+
export function projectWorkspaceSyncV3NestedTaskV2JournalRow(row) {
|
|
174
|
+
return projectNestedTaskJournalRow(row, 'task-attachment-links/full-v2');
|
|
175
|
+
}
|
|
149
176
|
export function validateWorkspaceSyncV3NestedTaskFeedEntry(entry) {
|
|
150
|
-
const
|
|
177
|
+
const projector = entry.projection === 'task-attachment-links/full-v2'
|
|
178
|
+
? projectWorkspaceSyncV3NestedTaskV2JournalRow
|
|
179
|
+
: projectWorkspaceSyncV3NestedTaskJournalRow;
|
|
180
|
+
const projected = projector({
|
|
151
181
|
sequence: entry.sequence,
|
|
152
182
|
contractVersion: WORKSPACE_SYNC_CONTRACT_VERSION,
|
|
153
183
|
clientId: 'validation-client',
|
|
@@ -181,9 +211,9 @@ function assertNestedDependentOrder(rows) {
|
|
|
181
211
|
throw new Error('Nested task operation dependents are duplicated or out of order.');
|
|
182
212
|
}
|
|
183
213
|
}
|
|
184
|
-
function projectNestedDependentRows(rows) {
|
|
214
|
+
function projectNestedDependentRows(rows, attachmentProjection) {
|
|
185
215
|
return rows.flatMap((row) => {
|
|
186
|
-
const projected =
|
|
216
|
+
const projected = projectNestedTaskJournalRow(row, attachmentProjection);
|
|
187
217
|
if (!projected) {
|
|
188
218
|
const payload = row.domain === 'entity-event'
|
|
189
219
|
? canonicalEntityEventPayload(parsePayload(row))
|
|
@@ -217,7 +247,7 @@ function isSupportedNestedOnlyOperation(rows) {
|
|
|
217
247
|
* root. Apply still requires referenced parents to exist on the receiver; feed
|
|
218
248
|
* only needs to project the nested rows.
|
|
219
249
|
*/
|
|
220
|
-
function projectNestedOnlyOperation(rows) {
|
|
250
|
+
function projectNestedOnlyOperation(rows, attachmentProjection) {
|
|
221
251
|
if (!isSupportedNestedOnlyOperation(rows)) {
|
|
222
252
|
throw new Error('Nested-only task operation is not an allowed repair or reconciliation shape.');
|
|
223
253
|
}
|
|
@@ -229,7 +259,7 @@ function projectNestedOnlyOperation(rows) {
|
|
|
229
259
|
throw new Error('Nested task operation dependent identity does not match its task root.');
|
|
230
260
|
}
|
|
231
261
|
}
|
|
232
|
-
const projected = projectNestedDependentRows(rows);
|
|
262
|
+
const projected = projectNestedDependentRows(rows, attachmentProjection);
|
|
233
263
|
const events = projected
|
|
234
264
|
.filter((entry) => entry.domain === 'entity-event')
|
|
235
265
|
.map((entry) => validateWorkspaceSyncV3EntityEventPayload(entry.payload));
|
|
@@ -256,14 +286,14 @@ function projectNestedOnlyOperation(rows) {
|
|
|
256
286
|
* parent-first operations; repair baselines and comment reconcile may emit
|
|
257
287
|
* nested-only groups that still project when every row is a nested domain.
|
|
258
288
|
*/
|
|
259
|
-
|
|
289
|
+
function projectNestedTaskOperation(input, attachmentProjection) {
|
|
260
290
|
if (!input.rows.some((row) => projectionByDomain.has(row.domain)))
|
|
261
291
|
return null;
|
|
262
292
|
assertWorkspaceSyncV3OperationBoundary(input);
|
|
263
293
|
const [first, ...dependents] = input.rows;
|
|
264
294
|
if (first && projectionByDomain.has(first.domain)
|
|
265
295
|
&& input.rows.every((row) => projectionByDomain.has(row.domain))) {
|
|
266
|
-
return projectNestedOnlyOperation(input.rows);
|
|
296
|
+
return projectNestedOnlyOperation(input.rows, attachmentProjection);
|
|
267
297
|
}
|
|
268
298
|
if (!first || !['task', 'initiative', 'workstream'].includes(first.domain)) {
|
|
269
299
|
throw new Error('Nested task operation must begin with its v3-owned parent root.');
|
|
@@ -272,7 +302,7 @@ export function projectWorkspaceSyncV3NestedTaskOperation(input) {
|
|
|
272
302
|
throw new Error('Nested task operation contains an unsupported dependent row.');
|
|
273
303
|
}
|
|
274
304
|
assertNestedDependentOrder(dependents);
|
|
275
|
-
const projectedDependents = projectNestedDependentRows(dependents);
|
|
305
|
+
const projectedDependents = projectNestedDependentRows(dependents, attachmentProjection);
|
|
276
306
|
const eventRows = projectedDependents.filter((entry) => entry.domain === 'entity-event');
|
|
277
307
|
const rawEventRows = dependents.filter((row) => row.domain === 'entity-event');
|
|
278
308
|
const sentinelOnly = eventRows.length === 0 && rawEventRows.length > 0 && rawEventRows.every((row) => (canonicalEntityEventPayload(parsePayload(row)).action === 'sync-v3-repair-baseline'));
|
|
@@ -327,3 +357,9 @@ export function projectWorkspaceSyncV3NestedTaskOperation(input) {
|
|
|
327
357
|
}
|
|
328
358
|
return [parent, ...projectedDependents];
|
|
329
359
|
}
|
|
360
|
+
export function projectWorkspaceSyncV3NestedTaskOperation(input) {
|
|
361
|
+
return projectNestedTaskOperation(input, 'task-attachment-links/full-v1');
|
|
362
|
+
}
|
|
363
|
+
export function projectWorkspaceSyncV3NestedTaskV2Operation(input) {
|
|
364
|
+
return projectNestedTaskOperation(input, 'task-attachment-links/full-v2');
|
|
365
|
+
}
|
|
@@ -2,7 +2,7 @@ import type { EntityEvent, TaskItem } from '../../types.js';
|
|
|
2
2
|
import type { WorkspaceSyncV3ProjectionDescriptor } from './workspaceSyncV3FeedProfile.js';
|
|
3
3
|
import { type WorkspaceSyncV3TaskAttachmentLink } from './workspaceSyncV3NestedTaskCodecs.js';
|
|
4
4
|
export type WorkspaceSyncV3NestedTaskRepairCandidate = {
|
|
5
|
-
projection: Extract<WorkspaceSyncV3ProjectionDescriptor, 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'entity-event/full-v1'>;
|
|
5
|
+
projection: Extract<WorkspaceSyncV3ProjectionDescriptor, 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2' | 'entity-event/full-v1'>;
|
|
6
6
|
domain: 'task-comments' | 'task-checklist' | 'task-attachment-links' | 'entity-event';
|
|
7
7
|
entityId: string;
|
|
8
8
|
mutationKind: 'replace' | 'append';
|
|
@@ -16,4 +16,5 @@ export declare function buildWorkspaceSyncV3NestedTaskRepairCandidates(input: {
|
|
|
16
16
|
tasks: readonly TaskItem[];
|
|
17
17
|
events: readonly EntityEvent[];
|
|
18
18
|
attachmentLinksByTaskId?: ReadonlyMap<string, readonly WorkspaceSyncV3TaskAttachmentLink[]>;
|
|
19
|
+
attachmentProjection?: 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2';
|
|
19
20
|
}): WorkspaceSyncV3NestedTaskRepairCandidate[];
|