@taskforcehq/taskforce 0.3.329 → 0.3.332

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