@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.
Files changed (485) hide show
  1. package/dist/Taskforce.module.css +523 -79
  2. package/dist/TaskforceCore.js +237 -230
  3. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
  4. package/dist/cli.js +34 -0
  5. package/dist/cliCloudTargetGuard.d.ts +5 -0
  6. package/dist/cliCloudTargetGuard.js +11 -0
  7. package/dist/components/features/AiProfilesModule.js +3 -5
  8. package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
  9. package/dist/components/features/TaskSettings.d.ts +12 -1
  10. package/dist/components/features/TaskSettings.js +217 -54
  11. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  12. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  13. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
  14. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  15. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  16. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  17. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  18. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  19. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  20. package/dist/components/features/planning/PlanningModule.js +2 -5
  21. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
  22. package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
  23. package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
  24. package/dist/components/features/planning/planningTaskArrangement.js +5 -5
  25. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  26. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  27. package/dist/components/features/taskforceAgentEditorModel.js +5 -1
  28. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  29. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  30. package/dist/components/task/TaskCard.d.ts +5 -0
  31. package/dist/components/task/TaskCard.js +65 -10
  32. package/dist/components/task/TaskImageReviews.js +14 -5
  33. package/dist/components/task/TaskKanban.d.ts +6 -1
  34. package/dist/components/task/TaskKanban.js +152 -6
  35. package/dist/components/task/TaskList.d.ts +5 -0
  36. package/dist/components/task/TaskList.js +3 -3
  37. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  38. package/dist/components/ui/PasswordInput.d.ts +6 -0
  39. package/dist/components/ui/PasswordInput.js +11 -0
  40. package/dist/components/ui/TopNoticeLayer.js +1 -1
  41. package/dist/components/views/AppShellHeader.js +32 -11
  42. package/dist/components/views/PlanComparisonPage.js +12 -0
  43. package/dist/components/views/StandaloneLayout.js +32 -55
  44. package/dist/components/views/WidgetView.js +3 -3
  45. package/dist/components/views/panels/PlanningDrawer.js +5 -12
  46. package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
  47. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  48. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  49. package/dist/config/envSchema.js +60 -1
  50. package/dist/config/localServiceRuntimeContract.d.ts +13 -0
  51. package/dist/config/localServiceRuntimeContract.js +135 -0
  52. package/dist/core/AiProfileService.js +46 -8
  53. package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
  54. package/dist/core/DeletedTaskLifecycleService.js +37 -6
  55. package/dist/core/McpTokenService.d.ts +23 -1
  56. package/dist/core/McpTokenService.js +93 -10
  57. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
  58. package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
  59. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  60. package/dist/core/TaskChecklistCommandService.js +83 -5
  61. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  62. package/dist/core/TaskLifecycleCommandService.js +6 -2
  63. package/dist/core/Taskforce.d.ts +94 -2
  64. package/dist/core/Taskforce.js +760 -36
  65. package/dist/core/types.d.ts +14 -0
  66. package/dist/documentReviews/commandService.d.ts +2 -1
  67. package/dist/documentReviews/commandService.js +6 -3
  68. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  69. package/dist/hooks/sync/orchestratorShared.js +2 -0
  70. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
  71. package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
  72. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
  73. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
  74. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
  75. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  76. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  77. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  78. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  79. package/dist/hooks/tasks/taskHttpMutation.js +1 -0
  80. package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
  81. package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
  82. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
  83. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
  84. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
  85. package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
  86. package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
  87. package/dist/hooks/tasks/useTaskFormActions.js +65 -12
  88. package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
  89. package/dist/hooks/ui/useSettingsModel.js +13 -2
  90. package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
  91. package/dist/hooks/ui/useSettingsPersistence.js +74 -47
  92. package/dist/hooks/useFilterSort.d.ts +7 -3
  93. package/dist/hooks/useFilterSort.js +15 -5
  94. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  95. package/dist/hooks/useSyncOrchestrator.js +111 -2
  96. package/dist/hooks/useTaskData.d.ts +40 -1
  97. package/dist/hooks/useTaskData.js +240 -9
  98. package/dist/hooks/useTaskMutations.d.ts +12 -2
  99. package/dist/hooks/useTaskMutations.js +266 -52
  100. package/dist/hooks/useTaskforce.d.ts +39 -9
  101. package/dist/hooks/useTaskforce.js +359 -40
  102. package/dist/hooks/useUiNotice.d.ts +4 -0
  103. package/dist/hooks/useUiNotice.js +4 -0
  104. package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
  105. package/dist/mcp/clientRegistry.d.ts +2 -2
  106. package/dist/mcp/clientRegistry.js +1 -1
  107. package/dist/mcp/documentAssetRegistrar.js +53 -41
  108. package/dist/mcp/documentHelpers.d.ts +1 -0
  109. package/dist/mcp/documentHelpers.js +7 -3
  110. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  111. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  112. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  113. package/dist/mcp/httpProtocolRouting.d.ts +10 -0
  114. package/dist/mcp/httpProtocolRouting.js +19 -0
  115. package/dist/mcp/localCliHealth.d.ts +2 -2
  116. package/dist/mcp/localCliHealth.js +2 -2
  117. package/dist/mcp/localServiceProxy.d.ts +1 -0
  118. package/dist/mcp/localServiceProxy.js +530 -68
  119. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  120. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  121. package/dist/mcp/runtime.d.ts +54 -79
  122. package/dist/mcp/runtime.js +556 -139
  123. package/dist/mcp/taskPlanningRegistrar.js +64 -42
  124. package/dist/mcp/toolCallCompatibility.js +38 -1
  125. package/dist/mcp/toolCatalog.d.ts +1 -0
  126. package/dist/mcp/toolProfiles.d.ts +2 -0
  127. package/dist/mcp/toolProfiles.js +10 -0
  128. package/dist/mcp/toolRegistry.d.ts +1 -0
  129. package/dist/mcp/toolRegistry.js +1 -0
  130. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  131. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  132. package/dist/migrations/taskSchemaMigrations.js +427 -0
  133. package/dist/runtime/appGateDefinitions.d.ts +30 -6
  134. package/dist/runtime/appGateDefinitions.js +6 -6
  135. package/dist/runtime/appGates.d.ts +13 -13
  136. package/dist/runtime/appGates.js +36 -13
  137. package/dist/runtime/nodeAppGates.d.ts +8 -0
  138. package/dist/runtime/nodeAppGates.js +27 -0
  139. package/dist/server/cloudCollectionRead.d.ts +1 -1
  140. package/dist/server/cloudCollectionRead.js +2 -2
  141. package/dist/server/index.d.ts +6 -0
  142. package/dist/server/index.js +123 -14
  143. package/dist/server/localDatabaseIdentity.js +4 -1
  144. package/dist/server/localServiceLease.d.ts +3 -0
  145. package/dist/server/localServiceLease.js +11 -2
  146. package/dist/server/localServiceSessions.d.ts +14 -17
  147. package/dist/server/localServiceSessions.js +308 -94
  148. package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
  149. package/dist/server/rateLimit.d.ts +1 -0
  150. package/dist/server/rateLimit.js +4 -0
  151. package/dist/server/realtimeSyncWs.js +36 -12
  152. package/dist/server/routes/admin.d.ts +4 -0
  153. package/dist/server/routes/admin.js +113 -3
  154. package/dist/server/routes/agentRoles.js +3 -2
  155. package/dist/server/routes/agentSkills.js +3 -2
  156. package/dist/server/routes/agents.d.ts +7 -0
  157. package/dist/server/routes/agents.js +394 -39
  158. package/dist/server/routes/annotatedAttachments.js +3 -2
  159. package/dist/server/routes/auth.js +3 -1
  160. package/dist/server/routes/billing.js +5 -1
  161. package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
  162. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  163. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  164. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  165. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  166. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  167. package/dist/server/routes/githubReviewEvidence.js +116 -0
  168. package/dist/server/routes/localService.d.ts +15 -4
  169. package/dist/server/routes/localService.js +138 -40
  170. package/dist/server/routes/modelConnections.d.ts +24 -0
  171. package/dist/server/routes/modelConnections.js +205 -0
  172. package/dist/server/routes/primitives.d.ts +2 -0
  173. package/dist/server/routes/shared.d.ts +19 -0
  174. package/dist/server/routes/shared.js +95 -19
  175. package/dist/server/routes/sync.js +1 -0
  176. package/dist/server/routes/syncAuxRoutes.js +9 -2
  177. package/dist/server/routes/syncPullApplyRoutes.js +23 -4
  178. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  179. package/dist/server/routes/syncPushRoutes.js +1 -0
  180. package/dist/server/routes/syncV3FeedRoutes.js +27 -16
  181. package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
  182. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
  183. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
  184. package/dist/server/routes/syncV3OperationRoutes.js +45 -9
  185. package/dist/server/routes/tasks.js +124 -13
  186. package/dist/server/routes/workflows.js +9 -1
  187. package/dist/server/routes/workspaces.js +43 -1
  188. package/dist/server/routes.js +59 -0
  189. package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
  190. package/dist/server/workspaceDeletionAdmission.js +50 -0
  191. package/dist/service/localServiceCli.js +16 -0
  192. package/dist/service/localServiceClientLifecycle.js +36 -10
  193. package/dist/services/codexAppServerModelGateway.d.ts +161 -0
  194. package/dist/services/codexAppServerModelGateway.js +663 -0
  195. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  196. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  197. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  198. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  199. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  200. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  201. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  202. package/dist/services/executorPhaseAApprovalService.js +609 -0
  203. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  204. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  205. package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
  206. package/dist/services/executorPhaseAIssuerCore.js +295 -0
  207. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  208. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  209. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  210. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  211. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  212. package/dist/services/githubReviewEvidenceService.js +336 -0
  213. package/dist/services/modelGateway.d.ts +7 -0
  214. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  215. package/dist/services/modelProviderConnectionService.js +279 -0
  216. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  217. package/dist/services/modelProviderCredentialHome.js +271 -0
  218. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  219. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  220. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  221. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  222. package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
  223. package/dist/services/taskforceAgentMcpBridge.js +30 -27
  224. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  225. package/dist/shared/adminEdgeProxy.js +94 -0
  226. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  227. package/dist/shared/adminProxySessionCookies.js +86 -0
  228. package/dist/shared/aiProfileColors.d.ts +31 -1
  229. package/dist/shared/aiProfileColors.js +14 -6
  230. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  231. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  232. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  233. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  234. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  235. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  236. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  237. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  238. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  239. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  240. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  241. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  242. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  243. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  244. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  245. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  246. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  247. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  248. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  249. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  250. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  251. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  252. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  253. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  254. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  255. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  256. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  257. package/dist/shared/executorPhaseATiming.js +1 -0
  258. package/dist/shared/planningIdentity.js +1 -1
  259. package/dist/shared/productLogoKeys.d.ts +2 -0
  260. package/dist/shared/productLogoKeys.js +18 -0
  261. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  262. package/dist/shared/taskforceAgentDefinition.js +6 -3
  263. package/dist/shared/taskforceAgentModels.d.ts +1 -0
  264. package/dist/shared/taskforceAgentModels.js +36 -3
  265. package/dist/shared/userFeatureGrants.d.ts +4 -0
  266. package/dist/shared/userFeatureGrants.js +7 -0
  267. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  268. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  269. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  270. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  271. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  272. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  273. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  274. package/dist/storage/modelProviderConnectionStore.js +446 -0
  275. package/dist/storage/postgresAdapter.d.ts +24 -3
  276. package/dist/storage/postgresAdapter.js +117 -14
  277. package/dist/storage/postgresWorker.js +22 -5
  278. package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
  279. package/dist/storage/postgresWorkerProtocol.js +30 -0
  280. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  281. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  282. package/dist/sync/cloudSyncApi.d.ts +4 -1
  283. package/dist/sync/cloudSyncApi.js +7 -2
  284. package/dist/sync/contentSyncState.d.ts +1 -1
  285. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
  286. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
  287. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  288. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  289. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
  290. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  291. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  292. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  293. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  294. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  295. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  296. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  297. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
  298. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  299. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
  300. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
  301. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  302. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  303. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  304. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
  305. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
  306. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  307. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  308. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
  309. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
  310. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
  311. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  312. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
  313. package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
  314. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  315. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
  316. package/dist/sync/syncApplyHandlers.d.ts +2 -0
  317. package/dist/sync/syncApplyHandlers.js +10 -1
  318. package/dist/sync/syncService.d.ts +17 -0
  319. package/dist/sync/syncService.js +87 -19
  320. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  321. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  322. package/dist/sync/v3/combinedFeedCapability.js +8 -0
  323. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  324. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  325. package/dist/sync/v3/durableOperationReplay.js +18 -0
  326. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
  327. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
  328. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
  329. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
  330. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  331. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
  332. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
  333. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
  334. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
  335. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  336. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
  337. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
  338. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  339. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  340. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  341. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
  342. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
  343. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  344. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  345. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  346. package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
  347. package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
  348. package/dist/sync/v3/localTaskMetadataClient.js +1 -0
  349. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
  350. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
  351. package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
  352. package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
  353. package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
  354. package/dist/sync/v3/localTaskStatusClient.js +6 -1
  355. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
  356. package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
  357. package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
  358. package/dist/sync/v3/syncDurabilityStore.js +199 -13
  359. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
  360. package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
  361. package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
  362. package/dist/sync/v3/taskChecklistMutationService.js +48 -1
  363. package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
  364. package/dist/sync/v3/taskCreateMutationService.js +7 -4
  365. package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
  366. package/dist/sync/v3/taskMetadataMutationService.js +4 -0
  367. package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
  368. package/dist/sync/v3/taskRestoreMutationService.js +7 -4
  369. package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
  370. package/dist/sync/v3/taskStatusMutationService.js +123 -3
  371. package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
  372. package/dist/sync/v3/workflowAssignmentSync.js +30 -0
  373. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  374. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  375. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  376. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
  377. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
  378. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
  379. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
  380. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
  381. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
  382. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  383. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
  384. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
  385. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
  386. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
  387. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
  388. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
  389. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
  390. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
  391. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
  392. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
  393. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
  394. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
  395. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
  396. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
  397. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
  398. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
  399. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
  400. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
  401. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
  402. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
  403. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
  404. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
  405. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
  406. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
  407. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
  408. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
  409. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  410. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  411. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
  412. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
  413. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
  414. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
  415. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
  416. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  417. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  418. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  419. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  420. package/dist/sync/workspacePullFeed.js +2 -1
  421. package/dist/sync/workspaceRepair.d.ts +8 -2
  422. package/dist/sync/workspaceRepair.js +222 -6
  423. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  424. package/dist/sync/workspaceSyncModel.js +35 -7
  425. package/dist/sync/workspaceSyncState.d.ts +1 -0
  426. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  427. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  428. package/dist/types.d.ts +47 -1
  429. package/dist/types.js +6 -0
  430. package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
  431. package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
  432. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
  433. package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
  434. package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
  435. package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
  436. package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
  437. package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
  438. package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
  439. package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
  440. package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
  441. package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
  442. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  443. package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
  444. package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
  445. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  446. package/dist/ui/assets/index-CTsDBaef.js +7 -0
  447. package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
  448. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  449. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  450. package/dist/ui/branding/logos/signature_dark.png +0 -0
  451. package/dist/ui/branding/logos/signature_light.png +0 -0
  452. package/dist/ui/index.html +3 -3
  453. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  454. package/dist/utils/httpSetCookie.d.ts +1 -0
  455. package/dist/utils/httpSetCookie.js +4 -1
  456. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  457. package/dist/utils/localRuntimeUrl.js +14 -0
  458. package/dist/utils/productLogoRegistry.d.ts +2 -0
  459. package/dist/utils/productLogoRegistry.js +36 -0
  460. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  461. package/dist/utils/syncStatusPresentation.js +17 -0
  462. package/dist/utils/taskActivity.d.ts +3 -2
  463. package/dist/utils/taskActivity.js +19 -2
  464. package/dist/utils/taskEditorReconciliation.d.ts +40 -0
  465. package/dist/utils/taskEditorReconciliation.js +217 -0
  466. package/dist/utils/taskEvents.d.ts +2 -0
  467. package/dist/utils/taskNormalization.d.ts +1 -0
  468. package/dist/utils/taskNormalization.js +39 -0
  469. package/dist/utils/taskSearch.js +2 -2
  470. package/dist/utils/uiNotice.d.ts +4 -0
  471. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  472. package/dist/utils/workspaceSyncPresentation.js +23 -17
  473. package/package.json +36 -6
  474. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
  475. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
  476. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
  477. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
  478. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
  479. package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
  480. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
  481. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
  482. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
  483. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  484. package/dist/ui/assets/index-BUplSsv_.js +0 -7
  485. package/dist/ui/assets/index-gz2EXuoK.css +0 -1
@@ -28,6 +28,8 @@ function mapRow(row) {
28
28
  createdAt: row.created_at,
29
29
  updatedAt: row.updated_at,
30
30
  nextAttemptAt: row.next_attempt_at,
31
+ terminalAt: row.terminal_at,
32
+ terminalReason: row.terminal_reason,
31
33
  resolvedAt: row.resolved_at,
32
34
  };
33
35
  }
@@ -52,8 +54,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
52
54
  tenant_id, workspace_id, task_id, asset_ids_json, payload_json,
53
55
  canonical_fingerprint, source_sequence, attempts, last_error,
54
56
  entity_revision, lifecycle_revision, revision_fingerprint,
55
- created_at, updated_at, next_attempt_at, resolved_at
56
- ) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, NULL)
57
+ created_at, updated_at, next_attempt_at, terminal_at, terminal_reason, resolved_at
58
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL)
57
59
  ON CONFLICT (tenant_id, workspace_id, task_id) DO UPDATE SET
58
60
  asset_ids_json = excluded.asset_ids_json,
59
61
  payload_json = excluded.payload_json,
@@ -66,6 +68,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
66
68
  last_error = excluded.last_error,
67
69
  updated_at = excluded.updated_at,
68
70
  next_attempt_at = excluded.next_attempt_at,
71
+ terminal_at = NULL,
72
+ terminal_reason = NULL,
69
73
  resolved_at = NULL
70
74
  WHERE workspace_sync_v3_attachment_apply_obligations.resolved_at IS NOT NULL
71
75
  OR CAST(excluded.source_sequence AS ${this.db.provider === 'postgres' ? 'BIGINT' : 'INTEGER'})
@@ -77,7 +81,8 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
77
81
  const rows = this.db.prepare(`
78
82
  SELECT *
79
83
  FROM workspace_sync_v3_attachment_apply_obligations
80
- WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL AND next_attempt_at <= ?
84
+ WHERE tenant_id = ? AND workspace_id = ?
85
+ AND resolved_at IS NULL AND terminal_at IS NULL AND next_attempt_at <= ?
81
86
  ORDER BY next_attempt_at ASC, task_id ASC
82
87
  LIMIT ?
83
88
  `).all(input.tenantId, input.workspaceId, input.now, limit);
@@ -87,30 +92,34 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
87
92
  const row = this.db.prepare(`
88
93
  SELECT COUNT(*) AS count
89
94
  FROM workspace_sync_v3_attachment_apply_obligations
90
- WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
95
+ WHERE tenant_id = ? AND workspace_id = ?
96
+ AND resolved_at IS NULL AND terminal_at IS NULL
91
97
  `).get(input.tenantId, input.workspaceId);
92
98
  return Number(row?.count || 0);
93
99
  }
94
100
  readSummary(input) {
95
101
  const aggregate = this.db.prepare(`
96
- SELECT COUNT(*) AS open,
97
- SUM(CASE WHEN next_attempt_at <= ? THEN 1 ELSE 0 END) AS due,
98
- MIN(created_at) AS oldest_open_created_at,
99
- MIN(next_attempt_at) AS next_attempt_at,
100
- SUM(attempts) AS total_attempts
102
+ SELECT SUM(CASE WHEN terminal_at IS NULL THEN 1 ELSE 0 END) AS open,
103
+ SUM(CASE WHEN terminal_at IS NOT NULL THEN 1 ELSE 0 END) AS terminal,
104
+ SUM(CASE WHEN terminal_at IS NULL AND next_attempt_at <= ? THEN 1 ELSE 0 END) AS due,
105
+ MIN(CASE WHEN terminal_at IS NULL THEN created_at END) AS oldest_open_created_at,
106
+ MIN(CASE WHEN terminal_at IS NULL THEN next_attempt_at END) AS next_attempt_at,
107
+ SUM(CASE WHEN terminal_at IS NULL THEN attempts ELSE 0 END) AS total_attempts
101
108
  FROM workspace_sync_v3_attachment_apply_obligations
102
109
  WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
103
110
  `).get(input.now, input.tenantId, input.workspaceId);
104
111
  const latest = this.db.prepare(`
105
112
  SELECT last_error
106
113
  FROM workspace_sync_v3_attachment_apply_obligations
107
- WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
114
+ WHERE tenant_id = ? AND workspace_id = ?
115
+ AND resolved_at IS NULL AND terminal_at IS NULL
108
116
  AND last_error IS NOT NULL
109
117
  ORDER BY updated_at DESC, task_id ASC
110
118
  LIMIT 1
111
119
  `).get(input.tenantId, input.workspaceId);
112
120
  return {
113
121
  open: Number(aggregate?.open || 0),
122
+ terminal: Number(aggregate?.terminal || 0),
114
123
  due: Number(aggregate?.due || 0),
115
124
  oldestOpenCreatedAt: aggregate?.oldest_open_created_at || null,
116
125
  nextAttemptAt: aggregate?.next_attempt_at || null,
@@ -142,6 +151,14 @@ export class WorkspaceSyncV3AttachmentApplyObligationStore {
142
151
  WHERE tenant_id = ? AND workspace_id = ? AND task_id = ? AND resolved_at IS NULL
143
152
  `).run(input.now, input.now, input.tenantId, input.workspaceId, input.taskId);
144
153
  }
154
+ markTerminalUnavailable(input) {
155
+ this.db.prepare(`
156
+ UPDATE workspace_sync_v3_attachment_apply_obligations
157
+ SET terminal_at = ?, terminal_reason = ?, last_error = ?, updated_at = ?
158
+ WHERE tenant_id = ? AND workspace_id = ? AND task_id = ?
159
+ AND canonical_fingerprint = ? AND resolved_at IS NULL AND terminal_at IS NULL
160
+ `).run(input.now, String(input.reason || '').slice(0, 500), String(input.reason || '').slice(0, 500), input.now, input.tenantId, input.workspaceId, input.taskId, input.canonicalFingerprint);
161
+ }
145
162
  recordAttemptFailure(input) {
146
163
  this.db.prepare(`
147
164
  UPDATE workspace_sync_v3_attachment_apply_obligations
@@ -7,10 +7,11 @@ export type WorkspaceSyncV3AttachmentAssetHydrationResult = {
7
7
  } | {
8
8
  success: false;
9
9
  error: string;
10
+ disposition?: 'retryable' | 'terminal-unavailable';
10
11
  };
11
12
  export declare function hydrateWorkspaceSyncV3AttachmentAsset(input: {
12
13
  workspaceId: string;
13
14
  assetId: string;
14
- remoteServices: Pick<WorkspaceSyncEngineRemoteServices, 'pullWorkspaceContent' | 'abandonTransferReceipts' | 'buildV2ApplyCompletionGroup'>;
15
+ remoteServices: Pick<WorkspaceSyncEngineRemoteServices, 'pullWorkspaceContent' | 'abandonTransferReceipts' | 'buildIndependentContentApplyCompletionGroup'>;
15
16
  localServices: Pick<WorkspaceSyncEngineLocalServices, 'applyV2Batch'>;
16
17
  }): Promise<WorkspaceSyncV3AttachmentAssetHydrationResult>;
@@ -3,20 +3,48 @@ import { fingerprintWorkspaceContentBody } from '../workspaceContentManifest.js'
3
3
  export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
4
4
  const remoteServices = input.remoteServices;
5
5
  const applyV2Batch = input.localServices.applyV2Batch;
6
+ const completionIdentity = `attachment-asset:${input.assetId}`;
6
7
  const response = await remoteServices.pullWorkspaceContent({
7
8
  workspaceId: input.workspaceId,
8
9
  requests: [{ kind: 'asset', assetId: input.assetId }],
9
10
  previousCursor: null,
11
+ independentCompletionIdentity: completionIdentity,
10
12
  });
11
13
  const receipt = response.transferReceipt;
12
14
  let transferCommitted = false;
15
+ let localApplyStarted = false;
13
16
  try {
14
17
  if (!response.ok) {
15
18
  return { success: false, error: `Workspace attachment asset hydration failed (${response.status || 0}).` };
16
19
  }
17
20
  const data = response.data || {};
18
- if ((data.missing?.length || 0) > 0 || (data.remaining?.length || 0) > 0) {
19
- return { success: false, error: `Workspace attachment asset is unavailable in cloud content: ${input.assetId}` };
21
+ if ((data.remaining?.length || 0) > 0) {
22
+ return {
23
+ success: false,
24
+ error: `Workspace attachment asset hydration is incomplete: ${input.assetId}`,
25
+ disposition: 'retryable',
26
+ };
27
+ }
28
+ const exactMissing = Array.isArray(data.missing) && data.missing.find((entry) => (entry?.kind === 'asset'
29
+ && 'assetId' in entry
30
+ && String(entry.assetId || '').trim() === input.assetId));
31
+ if (exactMissing) {
32
+ return {
33
+ success: false,
34
+ error: exactMissing.disposition === 'terminal-unavailable'
35
+ ? `Workspace attachment asset is authoritatively unavailable in cloud metadata: ${input.assetId}`
36
+ : `Workspace attachment asset body is temporarily unavailable in cloud content: ${input.assetId}`,
37
+ disposition: exactMissing.disposition === 'terminal-unavailable'
38
+ ? 'terminal-unavailable'
39
+ : 'retryable',
40
+ };
41
+ }
42
+ if ((data.missing?.length || 0) > 0) {
43
+ return {
44
+ success: false,
45
+ error: `Workspace attachment asset hydration returned an unexpected missing result: ${input.assetId}`,
46
+ disposition: 'retryable',
47
+ };
20
48
  }
21
49
  const rawChanges = Array.isArray(data.changes) ? data.changes : [];
22
50
  const changes = rawChanges.filter((change) => ((change.op === 'document-upsert' || change.op === 'asset-upsert')
@@ -50,10 +78,9 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
50
78
  return { success: false, error: `Workspace attachment asset hydration verification failed: ${input.assetId}` };
51
79
  }
52
80
  const completionGroup = receipt
53
- ? remoteServices.buildV2ApplyCompletionGroup({
81
+ ? remoteServices.buildIndependentContentApplyCompletionGroup({
54
82
  workspaceId: input.workspaceId,
55
- previousCursor: null,
56
- nextCursor: null,
83
+ identity: completionIdentity,
57
84
  receipts: [receipt],
58
85
  })
59
86
  : undefined;
@@ -63,6 +90,7 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
63
90
  error: 'Workspace attachment asset hydration could not bind its transfer to local apply.',
64
91
  };
65
92
  }
93
+ localApplyStarted = true;
66
94
  const applyResult = completionGroup
67
95
  ? await applyV2Batch(input.workspaceId, changes, { completionGroup })
68
96
  : await applyV2Batch(input.workspaceId, changes);
@@ -80,11 +108,25 @@ export async function hydrateWorkspaceSyncV3AttachmentAsset(input) {
80
108
  }
81
109
  finally {
82
110
  if (receipt && !transferCommitted) {
83
- await remoteServices.abandonTransferReceipts({
84
- workspaceId: input.workspaceId,
85
- receipts: [receipt],
86
- errorCode: 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED',
87
- });
111
+ if (!localApplyStarted) {
112
+ const completionGroup = remoteServices.buildIndependentContentApplyCompletionGroup({
113
+ workspaceId: input.workspaceId,
114
+ identity: completionIdentity,
115
+ receipts: [receipt],
116
+ });
117
+ if (completionGroup) {
118
+ localApplyStarted = true;
119
+ const settlement = await applyV2Batch(input.workspaceId, [], { completionGroup });
120
+ transferCommitted = settlement.ok;
121
+ }
122
+ }
123
+ if (!transferCommitted) {
124
+ await remoteServices.abandonTransferReceipts({
125
+ workspaceId: input.workspaceId,
126
+ receipts: [receipt],
127
+ errorCode: 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED',
128
+ });
129
+ }
88
130
  }
89
131
  }
90
132
  }
@@ -46,6 +46,7 @@ export type WorkspaceSyncV3CloudOperationContext = {
46
46
  /** @deprecated Prefer resolveOriginActorRef; retained for create callers. */
47
47
  resolveTaskCreateActorRef?: (originActor: NonNullable<WorkspaceSyncV3TaskCreateEnvelope['operation']['payload']['originActor']>) => string;
48
48
  onPostCommitError?: (error: unknown) => void;
49
+ includeWorkflowRuntimeJournal?: boolean;
49
50
  };
50
51
  export type WorkspaceSyncV3CloudOperationHandler = {
51
52
  key: string;
@@ -71,6 +71,10 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
71
71
  ...withDeferredOriginActor(context, operation.payload.originActor),
72
72
  taskId: operation.entityId, patch: operation.payload.patch,
73
73
  saveSource: operation.payload.saveSource,
74
+ expectedDetailRevision: operation.payload.expectedDetailRevision,
75
+ assertPrecondition: operation.payload.expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
76
+ ? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, operation.payload.expectedDetailRevision, context.workspaceId)
77
+ : undefined,
74
78
  baseEntityRevision: operation.baseEntityRevision, baseLifecycleRevision: operation.baseLifecycleRevision,
75
79
  });
76
80
  },
@@ -187,11 +191,16 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
187
191
  supports: (envelope) => envelope.operation.domain === 'task' && envelope.operation.mutationKind === 'set-status',
188
192
  apply: (envelope, context) => {
189
193
  const operation = envelope.operation;
190
- const { originActor, ...payload } = operation.payload;
194
+ const { originActor, expectedDetailRevision, ...payload } = operation.payload;
191
195
  return runDurableTaskStatusMutation({
192
196
  ...withDeferredOriginActor(context, originActor),
193
197
  taskId: operation.entityId,
194
198
  payload,
199
+ expectedDetailRevision,
200
+ includeWorkflowRuntimeJournal: context.includeWorkflowRuntimeJournal,
201
+ assertPrecondition: expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
202
+ ? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, expectedDetailRevision, context.workspaceId)
203
+ : undefined,
195
204
  baseEntityRevision: operation.baseEntityRevision,
196
205
  baseLifecycleRevision: operation.baseLifecycleRevision,
197
206
  });
@@ -229,10 +238,16 @@ export function createWorkspaceSyncV3CloudOperationHandlers() {
229
238
  supports: (envelope) => envelope.operation.domain === 'task-checklist' && envelope.operation.mutationKind === 'replace',
230
239
  apply: (envelope, context) => {
231
240
  const operation = envelope.operation;
241
+ const { originActor, expectedDetailRevision, itemUpdateIntent, items } = operation.payload;
232
242
  return runDurableTaskChecklistReplace({
233
- ...withDeferredOriginActor(context, operation.payload.originActor),
243
+ ...withDeferredOriginActor(context, originActor),
234
244
  taskId: operation.entityId,
235
- items: operation.payload.items,
245
+ items,
246
+ expectedDetailRevision,
247
+ itemUpdateIntent,
248
+ assertPrecondition: expectedDetailRevision && context.core.assertTaskDetailRevisionForUpdate
249
+ ? () => context.core.assertTaskDetailRevisionForUpdate(operation.entityId, expectedDetailRevision, context.workspaceId)
250
+ : undefined,
236
251
  baseEntityRevision: operation.baseEntityRevision,
237
252
  baseLifecycleRevision: operation.baseLifecycleRevision,
238
253
  });
@@ -325,10 +325,14 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
325
325
  let projection = initial;
326
326
  let recoveryRepairApplied = false;
327
327
  let restartStaleRepair = false;
328
+ let restartCoverageRepair = false;
328
329
  let restartedStaleRepair = staleRepairAlreadyRestarted;
329
330
  const persistedCoverage = projectionCoverage(projection);
330
331
  if (!persistedCoverage)
331
332
  return localFailure(projection, 'Persisted combined workspace sync coverage is unsupported.');
333
+ restartCoverageRepair = projection.owner === 'v3'
334
+ && projection.repair !== null
335
+ && !exactCoverage(persistedCoverage, coverage);
332
336
  if (projection.coverageRepairRequired
333
337
  || (projection.owner === 'v3' && !projection.repair && !exactCoverage(persistedCoverage, coverage))) {
334
338
  const feed = await dependencies.pullFeed(input.resolveCloudAuthUrl, {
@@ -413,12 +417,12 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
413
417
  }
414
418
  let restartExpiredRepair = false;
415
419
  let restartedExpiredRepair = false;
416
- while (projection.owner === 'v2' || projection.repair || restartStaleRepair) {
417
- const previousCursor = restartExpiredRepair || restartStaleRepair
420
+ while (projection.owner === 'v2' || projection.repair || restartStaleRepair || restartCoverageRepair) {
421
+ const previousCursor = restartExpiredRepair || restartStaleRepair || restartCoverageRepair
418
422
  ? null : projection.repair?.cursor || null;
419
423
  const feed = await dependencies.pullFeed(input.resolveCloudAuthUrl, {
420
424
  workspaceId: input.workspaceId,
421
- ...(restartExpiredRepair || restartStaleRepair
425
+ ...(restartExpiredRepair || restartStaleRepair || restartCoverageRepair
422
426
  ? { forceRepair: true }
423
427
  : { repairCursor: previousCursor }),
424
428
  limit: 100,
@@ -449,6 +453,7 @@ async function runWorkspaceSyncV3CombinedProjectionCycleInternal(input, staleRep
449
453
  projection = updated;
450
454
  restartExpiredRepair = false;
451
455
  restartStaleRepair = false;
456
+ restartCoverageRepair = false;
452
457
  if (repairSnapshotWasInvalidated(applied)) {
453
458
  if (restartedStaleRepair) {
454
459
  return localFailure(projection, 'A refreshed combined repair snapshot still predates authoritative local state.');
@@ -6,7 +6,7 @@ import { validateWorkspaceSyncV3CombinedRepairPage, WorkspaceSyncV3CombinedProje
6
6
  import { fingerprintWorkspaceSyncPayload, WorkspaceSyncDurabilityStore } from './syncDurabilityStore.js';
7
7
  import { WorkflowStore } from '../../storage/workflowStore.js';
8
8
  import { serializeTaskRelationshipForSync } from './workspaceSyncV3TaskRelationshipProjection.js';
9
- import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3EntityEventPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
9
+ import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3EntityEventPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
10
10
  import { applyWorkspaceSyncV3NestedTaskEntries, WorkspaceSyncV3TaskCommentAggregateDivergenceError, } from './workspaceSyncV3NestedTaskApply.js';
11
11
  import { LocalSyncIdentityStore } from './localSyncIdentityStore.js';
12
12
  import { enqueueLocalTaskCommentReconciliation } from './localTaskCommentOutboxService.js';
@@ -25,7 +25,8 @@ function combinedRepairBaselineMarker(page) {
25
25
  })}`;
26
26
  }
27
27
  const NESTED_TASK_PROJECTIONS = new Set([
28
- 'task-comments/full-v1', 'task-checklist/full-v1', 'task-attachment-links/full-v1', 'entity-event/full-v1',
28
+ 'task-comments/full-v1', 'task-checklist/full-v1', 'task-attachment-links/full-v1',
29
+ 'task-attachment-links/full-v2', 'entity-event/full-v1',
29
30
  ]);
30
31
  const WORKFLOW_RUNTIME_PROJECTIONS = new Set([
31
32
  'workflow-published-definition/full-v2',
@@ -59,7 +60,8 @@ function coveredDomains(projections) {
59
60
  domains.push('task-comments');
60
61
  if (projections.has('task-checklist/full-v1'))
61
62
  domains.push('task-checklist');
62
- if (projections.has('task-attachment-links/full-v1'))
63
+ if (projections.has('task-attachment-links/full-v1')
64
+ || projections.has('task-attachment-links/full-v2'))
63
65
  domains.push('task-attachment-links');
64
66
  if (projections.has('entity-event/full-v1'))
65
67
  domains.push('entity-event');
@@ -181,6 +183,15 @@ function isExactPlanningRootProjectionReplay(input) {
181
183
  && input.current.lastSequence === input.entry.sequence
182
184
  && input.current.canonicalFingerprint === (input.entry.canonicalFingerprint || input.entry.payloadFingerprint);
183
185
  }
186
+ function parentOwnedNestedTaskId(entry) {
187
+ if (entry.projection === 'task-comments/full-v1'
188
+ || entry.projection === 'task-checklist/full-v1'
189
+ || entry.projection === 'task-attachment-links/full-v1'
190
+ || entry.projection === 'task-attachment-links/full-v2') {
191
+ return entry.entityId;
192
+ }
193
+ return null;
194
+ }
184
195
  function applyEntries(input) {
185
196
  const store = new WorkspaceSyncDurabilityStore(input.core.getDatabaseAdapter());
186
197
  const workflowApply = prepareWorkspaceSyncV3WorkflowRuntimeApply({
@@ -200,9 +211,13 @@ function applyEntries(input) {
200
211
  throw coveredLocalOperationsError('Combined feed apply is blocked by covered local operations.');
201
212
  }
202
213
  const notices = notifications();
214
+ const deletedTaskRoots = new Set();
203
215
  for (const entry of input.entries) {
204
216
  let taskChange = null;
205
217
  let nestedTaskChangeId = null;
218
+ const nestedTaskId = parentOwnedNestedTaskId(entry);
219
+ if (nestedTaskId && deletedTaskRoots.has(nestedTaskId))
220
+ continue;
206
221
  const current = store.readWorkspaceDomainOwnership({ tenantId: input.tenantId,
207
222
  workspaceId: input.workspaceId, domain: entry.domain, entityId: entry.entityId });
208
223
  const exactTaskRootReplay = isExactTaskRootProjectionReplay({ entry, current });
@@ -288,6 +303,16 @@ function applyEntries(input) {
288
303
  shouldRecordRevision: (result) => result?.state !== 'deferred',
289
304
  });
290
305
  }
306
+ if (entry.projection === 'task/root-v1') {
307
+ if (taskChange === 'upsert') {
308
+ deletedTaskRoots.delete(entry.entityId);
309
+ }
310
+ else if (taskChange === 'delete'
311
+ || (!input.core.getTask(entry.entityId, input.workspaceId)
312
+ && input.core.hasTaskDeletionMarkerForSync(entry.entityId, input.workspaceId))) {
313
+ deletedTaskRoots.add(entry.entityId);
314
+ }
315
+ }
291
316
  if (applied.state !== 'applied')
292
317
  continue;
293
318
  if (entry.projection === 'task/root-v1' && entry.mutationKind !== 'delete') {
@@ -366,12 +391,19 @@ function listLocalTaskNestedProjection(core, workspaceId, projection) {
366
391
  taskId: task.id, items: task.checklistItems || [],
367
392
  }));
368
393
  }
369
- else {
394
+ else if (projection === 'task-attachment-links/full-v1') {
370
395
  values.set(task.id, serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
371
396
  taskId: task.id,
372
397
  links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
373
398
  }));
374
399
  }
400
+ else {
401
+ values.set(task.id, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
402
+ taskId: task.id,
403
+ links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
404
+ cardCoverAssetId: task.cardCoverAssetId ?? null,
405
+ }));
406
+ }
375
407
  }
376
408
  const last = page.at(-1);
377
409
  cursor = page.length === 1000 && last
@@ -416,6 +448,9 @@ function nestedLocalDomains(core, workspaceId, projections, liveEntityIds) {
416
448
  if (projections.has('task-attachment-links/full-v1')) {
417
449
  domains.push(['task-attachment-links', listLocalTaskNestedProjection(core, workspaceId, 'task-attachment-links/full-v1')]);
418
450
  }
451
+ else if (projections.has('task-attachment-links/full-v2')) {
452
+ domains.push(['task-attachment-links', listLocalTaskNestedProjection(core, workspaceId, 'task-attachment-links/full-v2')]);
453
+ }
419
454
  if (projections.has('entity-event/full-v1')) {
420
455
  domains.push(['entity-event', listLocalEntityEvents(core, workspaceId, liveEntityIds)]);
421
456
  }
@@ -560,13 +595,18 @@ function isCompatibleLegacyAttachmentLinks(core, workspaceId, local, incoming) {
560
595
  if (!value || typeof value !== 'object' || Array.isArray(value))
561
596
  return false;
562
597
  const incomingLink = value;
563
- if (localLink.role !== incomingLink.role)
564
- return false;
565
598
  const localAsset = store.get(String(localLink.assetId || ''), workspaceId);
566
599
  const incomingAsset = store.get(String(incomingLink.assetId || ''), workspaceId);
567
600
  if (!localAsset || !incomingAsset || localAsset.deletedAt || incomingAsset.deletedAt
568
601
  || localAsset.storageKey !== incomingAsset.storageKey)
569
602
  return false;
603
+ const compatibleRole = localLink.role === incomingLink.role
604
+ || (localAsset.storageProvider === 'external'
605
+ && localLink.role === 'reference'
606
+ && incomingAsset.storageProvider !== 'external'
607
+ && incomingLink.role === (incomingAsset.kind === 'image' ? 'image' : 'attachment'));
608
+ if (!compatibleRole)
609
+ return false;
570
610
  const sameContent = localAsset.contentSha256 === incomingAsset.contentSha256
571
611
  && localAsset.sizeBytes === incomingAsset.sizeBytes;
572
612
  const authoritativeMaterialization = localAsset.storageProvider === 'external'
@@ -584,15 +624,15 @@ function isCompatibleLegacyAttachmentLinks(core, workspaceId, local, incoming) {
584
624
  if (!value || typeof value !== 'object' || Array.isArray(value))
585
625
  return false;
586
626
  const incomingLink = value;
587
- if (localLink.role !== incomingLink.role)
588
- return false;
589
627
  const incomingAsset = store.get(String(incomingLink.assetId || ''), workspaceId);
590
628
  return Boolean(incomingAsset && !incomingAsset.deletedAt
591
629
  && incomingAsset.storageProvider !== 'external'
630
+ && localLink.role === 'reference'
631
+ && incomingLink.role === (incomingAsset.kind === 'image' ? 'image' : 'attachment')
592
632
  && incomingAsset.storageKey === localAsset.storageKey
593
633
  && incomingAsset.sizeBytes >= localAsset.sizeBytes);
594
634
  }));
595
- }) && unmatched.length === 0;
635
+ });
596
636
  return compatible;
597
637
  }
598
638
  function assertLocalInventoryReady(input) {
@@ -981,7 +1021,8 @@ export function applyWorkspaceSyncV3CombinedRepairPage(input) {
981
1021
  const supportedTarget = ((target.domain === 'task' && entry.projection === 'task/root-v1')
982
1022
  || (target.domain === 'task-comments' && entry.projection === 'task-comments/full-v1')
983
1023
  || (target.domain === 'task-attachment-links'
984
- && entry.projection === 'task-attachment-links/full-v1')
1024
+ && (entry.projection === 'task-attachment-links/full-v1'
1025
+ || entry.projection === 'task-attachment-links/full-v2'))
985
1026
  || (target.domain === 'entity-event' && entry.projection === 'entity-event/full-v1'));
986
1027
  if (!supportedTarget) {
987
1028
  throw new Error('Targeted workspace sync recovery does not support this projection.');
@@ -6,7 +6,9 @@ export declare function prepareWorkspaceSyncV3CombinedRepairSnapshot(input: {
6
6
  now?: string;
7
7
  nestedCoverage?: boolean;
8
8
  workflowCoverage?: boolean;
9
+ workflowTaskCoverCoverage?: boolean;
9
10
  planningOrderCoverage?: boolean;
11
+ taskCoverCoverage?: boolean;
10
12
  coveredLegacyWritesFenced?: boolean;
11
13
  }): {
12
14
  highWatermark: string;
@@ -35,6 +37,18 @@ export declare function prepareWorkspaceSyncV3PlanningOrderRepairSnapshot(input:
35
37
  now?: string;
36
38
  coveredLegacyWritesFenced?: boolean;
37
39
  }): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
40
+ export declare function prepareWorkspaceSyncV3TaskCoverRepairSnapshot(input: {
41
+ core: TaskforceCore;
42
+ workspaceId: string;
43
+ now?: string;
44
+ coveredLegacyWritesFenced?: boolean;
45
+ }): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
46
+ export declare function prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input: {
47
+ core: TaskforceCore;
48
+ workspaceId: string;
49
+ now?: string;
50
+ coveredLegacyWritesFenced?: boolean;
51
+ }): ReturnType<typeof prepareWorkspaceSyncV3CombinedRepairSnapshot>;
38
52
  export declare function ensureWorkspaceSyncV3CombinedRepairBaselines(input: {
39
53
  core: TaskforceCore;
40
54
  workspaceId: string;
@@ -3,11 +3,13 @@ import { serializeInitiativeForSync, serializeWorkstreamForSync } from '../plann
3
3
  import { serializeTaskForSync } from '../taskSyncPayload.js';
4
4
  import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
5
5
  import { WORKSPACE_SYNC_COMBINED_PROJECTION, fingerprintWorkspaceSyncPayload, WORKSPACE_SYNC_CONTRACT_VERSION, WorkspaceSyncRevisionConflictError, } from './syncDurabilityStore.js';
6
- import { buildWorkspaceSyncV3CombinedRepairSnapshot, buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates, buildWorkspaceSyncV3NestedRepairSnapshot, buildWorkspaceSyncV3PlanningOrderRepairSnapshot, buildWorkspaceSyncV3WorkflowRepairSnapshot, listWorkspaceSyncV3CombinedRepairCandidates, listWorkspaceSyncV3NestedRepairCandidates, listWorkspaceSyncV3PlanningOrderRepairCandidates, listWorkspaceSyncV3WorkflowRepairCandidates, } from './workspaceSyncV3CombinedRepairSnapshot.js';
6
+ import { buildWorkspaceSyncV3CombinedRepairSnapshot, buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates, buildWorkspaceSyncV3NestedRepairSnapshot, buildWorkspaceSyncV3PlanningOrderRepairSnapshot, buildWorkspaceSyncV3TaskCoverRepairSnapshot, buildWorkspaceSyncV3WorkflowRepairSnapshot, buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot, listWorkspaceSyncV3CombinedRepairCandidates, listWorkspaceSyncV3NestedRepairCandidates, listWorkspaceSyncV3PlanningOrderRepairCandidates, listWorkspaceSyncV3TaskCoverRepairCandidates, listWorkspaceSyncV3WorkflowRepairCandidates, listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates, } from './workspaceSyncV3CombinedRepairSnapshot.js';
7
7
  import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE } from './workspaceSyncV3CombinedCoverage.js';
8
8
  import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE } from './workspaceSyncV3NestedCoverage.js';
9
9
  import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowCoverage.js';
10
10
  import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE } from './workspaceSyncV3PlanningOrderCoverage.js';
11
+ import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3TaskCoverCoverage.js';
12
+ import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
11
13
  import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
12
14
  import { projectWorkspaceSyncV3NestedTaskJournalRow } from './workspaceSyncV3NestedTaskProjection.js';
13
15
  import { serializeTaskRelationshipForSync } from './workspaceSyncV3TaskRelationshipProjection.js';
@@ -260,13 +262,17 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
260
262
  `).get(tenantId, workspaceId, now);
261
263
  sequence(lock?.last_sequence);
262
264
  const lockCompletedAt = Date.now();
263
- const candidates = input.workflowCoverage
264
- ? listWorkspaceSyncV3WorkflowRepairCandidates(input.core, workspaceId)
265
- : input.planningOrderCoverage
266
- ? listWorkspaceSyncV3PlanningOrderRepairCandidates(input.core, workspaceId)
267
- : input.nestedCoverage
268
- ? listWorkspaceSyncV3NestedRepairCandidates(input.core, workspaceId)
269
- : listWorkspaceSyncV3CombinedRepairCandidates(input.core, workspaceId);
265
+ const candidates = input.workflowTaskCoverCoverage
266
+ ? listWorkspaceSyncV3WorkflowTaskCoverRepairCandidates(input.core, workspaceId)
267
+ : input.workflowCoverage
268
+ ? listWorkspaceSyncV3WorkflowRepairCandidates(input.core, workspaceId)
269
+ : input.taskCoverCoverage
270
+ ? listWorkspaceSyncV3TaskCoverRepairCandidates(input.core, workspaceId)
271
+ : input.planningOrderCoverage
272
+ ? listWorkspaceSyncV3PlanningOrderRepairCandidates(input.core, workspaceId)
273
+ : input.nestedCoverage
274
+ ? listWorkspaceSyncV3NestedRepairCandidates(input.core, workspaceId)
275
+ : listWorkspaceSyncV3CombinedRepairCandidates(input.core, workspaceId);
270
276
  const inventoryCompletedAt = Date.now();
271
277
  const keys = candidates.map((candidate) => `${candidate.domain}\0${candidate.entityId}`);
272
278
  if (new Set(keys).size !== keys.length)
@@ -548,13 +554,17 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
548
554
  throw repairConflict('legacy-nested-repair-raced', repair.candidate);
549
555
  }
550
556
  const baselineWritesCompletedAt = Date.now();
551
- const profile = input.workflowCoverage
552
- ? WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE
553
- : input.planningOrderCoverage
554
- ? WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE
555
- : input.nestedCoverage
556
- ? WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE
557
- : WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE;
557
+ const profile = input.workflowTaskCoverCoverage
558
+ ? WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE
559
+ : input.workflowCoverage
560
+ ? WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE
561
+ : input.taskCoverCoverage
562
+ ? WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE
563
+ : input.planningOrderCoverage
564
+ ? WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE
565
+ : input.nestedCoverage
566
+ ? WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE
567
+ : WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE;
558
568
  const activeOwner = db.prepare(`
559
569
  SELECT 1 AS active
560
570
  FROM workspace_sync_projection_state
@@ -575,24 +585,32 @@ export function prepareWorkspaceSyncV3CombinedRepairSnapshot(input) {
575
585
  inventory: candidates,
576
586
  nestedCoverage: input.nestedCoverage === true,
577
587
  workflowCoverage: input.workflowCoverage === true,
588
+ workflowTaskCoverCoverage: input.workflowTaskCoverCoverage === true,
578
589
  planningOrderCoverage: input.planningOrderCoverage === true,
590
+ taskCoverCoverage: input.taskCoverCoverage === true,
579
591
  })
580
- : input.workflowCoverage
581
- ? buildWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId })
582
- : input.planningOrderCoverage
583
- ? buildWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId })
584
- : input.nestedCoverage
585
- ? buildWorkspaceSyncV3NestedRepairSnapshot({ core: input.core, workspaceId })
586
- : buildWorkspaceSyncV3CombinedRepairSnapshot({ core: input.core, workspaceId });
592
+ : input.workflowTaskCoverCoverage
593
+ ? buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot({ core: input.core, workspaceId })
594
+ : input.workflowCoverage
595
+ ? buildWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId })
596
+ : input.taskCoverCoverage
597
+ ? buildWorkspaceSyncV3TaskCoverRepairSnapshot({ core: input.core, workspaceId })
598
+ : input.planningOrderCoverage
599
+ ? buildWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId })
600
+ : input.nestedCoverage
601
+ ? buildWorkspaceSyncV3NestedRepairSnapshot({ core: input.core, workspaceId })
602
+ : buildWorkspaceSyncV3CombinedRepairSnapshot({ core: input.core, workspaceId });
587
603
  const snapshotCompletedAt = Date.now();
588
604
  if (snapshot.snapshotSequence !== highWatermark) {
589
605
  throw new Error('Combined repair baseline snapshot sequence changed while locked.');
590
606
  }
591
607
  console.info('[Taskforce Sync Repair Baseline Timing]', JSON.stringify({
592
608
  workspaceId,
593
- coverage: input.workflowCoverage ? 'workflow'
594
- : input.planningOrderCoverage ? 'planning-order'
595
- : input.nestedCoverage ? 'nested' : 'combined',
609
+ coverage: input.workflowTaskCoverCoverage ? 'workflow-task-cover'
610
+ : input.workflowCoverage ? 'workflow'
611
+ : input.taskCoverCoverage ? 'task-cover'
612
+ : input.planningOrderCoverage ? 'planning-order'
613
+ : input.nestedCoverage ? 'nested' : 'combined',
596
614
  candidates: candidates.length,
597
615
  lock: lockCompletedAt - startedAt,
598
616
  inventory: inventoryCompletedAt - lockCompletedAt,
@@ -615,6 +633,12 @@ export function prepareWorkspaceSyncV3WorkflowRepairSnapshot(input) {
615
633
  export function prepareWorkspaceSyncV3PlanningOrderRepairSnapshot(input) {
616
634
  return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, planningOrderCoverage: true });
617
635
  }
636
+ export function prepareWorkspaceSyncV3TaskCoverRepairSnapshot(input) {
637
+ return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, taskCoverCoverage: true });
638
+ }
639
+ export function prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input) {
640
+ return prepareWorkspaceSyncV3CombinedRepairSnapshot({ ...input, workflowTaskCoverCoverage: true });
641
+ }
618
642
  export function ensureWorkspaceSyncV3CombinedRepairBaselines(input) {
619
643
  const { snapshot: _snapshot, ...result } = prepareWorkspaceSyncV3CombinedRepairSnapshot(input);
620
644
  return result;