@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
@@ -3,6 +3,8 @@ import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE } from './workspaceSyncV3Co
3
3
  import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE } from './workspaceSyncV3NestedCoverage.js';
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
+ import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3TaskCoverCoverage.js';
7
+ import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
6
8
  import { type WorkspaceSyncV3FeedEntry } from './workspaceSyncV3Feed.js';
7
9
  import { type WorkspaceSyncV3FeedCursorKeyring } from './workspaceSyncV3FeedCursorKeys.js';
8
10
  export interface WorkspaceSyncV3CombinedRepairCursor {
@@ -21,7 +23,7 @@ export interface WorkspaceSyncV3CombinedRepairPage {
21
23
  success: true;
22
24
  protocolVersion: 3;
23
25
  workspaceId: string;
24
- 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;
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;
25
27
  snapshotId: string;
26
28
  snapshotSequence: string;
27
29
  expiresAt: string;
@@ -47,6 +49,9 @@ export declare function decodeWorkspaceSyncV3CombinedRepairCursor(raw: string |
47
49
  export declare function decodeWorkspaceSyncV3NestedRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
48
50
  export declare function decodeWorkspaceSyncV3WorkflowRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
49
51
  export declare function decodeWorkspaceSyncV3PlanningOrderRepairCursor(raw: string | null | undefined, keyring: WorkspaceSyncV3FeedCursorKeyring): WorkspaceSyncV3CombinedRepairCursor | null;
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;
54
+ export declare const WORKSPACE_SYNC_REPAIR_SNAPSHOT_CLEANUP_BATCH_SIZE = 500;
50
55
  export declare function buildWorkspaceSyncV3CombinedRepairPage(input: {
51
56
  core: TaskforceCore;
52
57
  workspaceId: string;
@@ -58,9 +63,13 @@ export declare function buildWorkspaceSyncV3CombinedRepairPage(input: {
58
63
  now?: string;
59
64
  nestedCoverage?: boolean;
60
65
  workflowCoverage?: boolean;
66
+ workflowTaskCoverCoverage?: boolean;
61
67
  planningOrderCoverage?: boolean;
68
+ taskCoverCoverage?: boolean;
62
69
  coveredLegacyWritesFenced?: boolean;
63
70
  }): WorkspaceSyncV3CombinedRepairPage;
64
- export declare function buildWorkspaceSyncV3NestedRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage'>): WorkspaceSyncV3CombinedRepairPage;
65
- export declare function buildWorkspaceSyncV3WorkflowRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage'>): WorkspaceSyncV3CombinedRepairPage;
66
- export declare function buildWorkspaceSyncV3PlanningOrderRepairPage(input: Omit<Parameters<typeof buildWorkspaceSyncV3CombinedRepairPage>[0], 'nestedCoverage' | 'workflowCoverage' | 'planningOrderCoverage'>): 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,11 +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, 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
+ 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';
9
11
  import { createWorkspaceSyncV3FeedResumeCursor, WorkspaceSyncV3FeedOperationTooLargeError, } from './workspaceSyncV3Feed.js';
10
12
  import { findWorkspaceSyncV3FeedCursorVerificationKey, } from './workspaceSyncV3FeedCursorKeys.js';
11
13
  import { WORKSPACE_SYNC_COMBINED_PROJECTION, WORKSPACE_SYNC_CONTRACT_VERSION, } from './syncDurabilityStore.js';
@@ -95,14 +97,24 @@ export function decodeWorkspaceSyncV3WorkflowRepairCursor(raw, keyring) {
95
97
  export function decodeWorkspaceSyncV3PlanningOrderRepairCursor(raw, keyring) {
96
98
  return decodeRepairCursor(raw, keyring, WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE);
97
99
  }
100
+ export function decodeWorkspaceSyncV3TaskCoverRepairCursor(raw, keyring) {
101
+ return decodeRepairCursor(raw, keyring, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE);
102
+ }
103
+ export function decodeWorkspaceSyncV3WorkflowTaskCoverRepairCursor(raw, keyring) {
104
+ return decodeRepairCursor(raw, keyring, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE);
105
+ }
98
106
  function repairProfile(coverage) {
99
- return coverage === 'workflow'
100
- ? WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE
101
- : coverage === 'planning-order'
102
- ? WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE
103
- : coverage === 'nested'
104
- ? WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE
105
- : 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;
106
118
  }
107
119
  function containsCurrentEntityEventInventory(input) {
108
120
  if (input.coverage === 'combined')
@@ -140,27 +152,70 @@ function containsCurrentEntityEventInventory(input) {
140
152
  AND entry.domain = 'entity-event'
141
153
  AND entry.entity_id = event.id
142
154
  )
155
+ AND NOT EXISTS (
156
+ SELECT 1
157
+ FROM workspace_sync_journal journal
158
+ WHERE journal.tenant_id = event.tenant_id
159
+ AND journal.workspace_id = event.workspace_id
160
+ AND journal.domain = 'entity-event'
161
+ AND journal.entity_id = event.id
162
+ -- Later sequenced events are delivered after the immutable
163
+ -- repair boundary; only unsequenced legacy adoption makes the
164
+ -- snapshot incomplete and requires rematerialization.
165
+ AND journal.sequence > ?
166
+ )
143
167
  LIMIT 1
144
- `).get(input.tenantId, input.workspaceId, input.snapshotId);
168
+ `).get(input.tenantId, input.workspaceId, input.snapshotId, input.snapshotSequence);
145
169
  return !missing;
146
170
  }
147
- function cleanupExpired(core, tenantId, workspaceId, now, excludingSnapshotId) {
171
+ export const WORKSPACE_SYNC_REPAIR_SNAPSHOT_CLEANUP_BATCH_SIZE = 500;
172
+ function cleanupExpiredBestEffort(core, tenantId, workspaceId, now, excludingSnapshotId) {
148
173
  const db = core.getDatabaseAdapter();
149
174
  const exclusion = excludingSnapshotId ? ' AND snapshot_id <> ?' : '';
150
175
  const args = excludingSnapshotId
151
176
  ? [tenantId, workspaceId, now, excludingSnapshotId]
152
177
  : [tenantId, workspaceId, now];
153
- db.prepare(`
154
- DELETE FROM workspace_sync_repair_snapshot_entries
155
- WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id IN (
156
- SELECT snapshot_id FROM workspace_sync_repair_snapshots
157
- WHERE tenant_id = ? AND workspace_id = ? AND expires_at <= ?${exclusion}
158
- )
159
- `).run(tenantId, workspaceId, ...args);
160
- db.prepare(`
161
- DELETE FROM workspace_sync_repair_snapshots
162
- WHERE tenant_id = ? AND workspace_id = ? AND expires_at <= ?${exclusion}
163
- `).run(...args);
178
+ try {
179
+ db.transaction(() => {
180
+ const expired = db.prepare(`
181
+ SELECT snapshot_id
182
+ FROM workspace_sync_repair_snapshots
183
+ WHERE tenant_id = ? AND workspace_id = ? AND expires_at <= ?${exclusion}
184
+ ORDER BY expires_at ASC, snapshot_id ASC
185
+ LIMIT 1
186
+ `).get(...args);
187
+ const snapshotId = String(expired?.snapshot_id || '').trim();
188
+ if (!snapshotId)
189
+ return;
190
+ db.prepare(`
191
+ DELETE FROM workspace_sync_repair_snapshot_entries
192
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
193
+ AND entry_index IN (
194
+ SELECT entry_index
195
+ FROM workspace_sync_repair_snapshot_entries
196
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
197
+ ORDER BY entry_index ASC
198
+ LIMIT ?
199
+ )
200
+ `).run(tenantId, workspaceId, snapshotId, tenantId, workspaceId, snapshotId, WORKSPACE_SYNC_REPAIR_SNAPSHOT_CLEANUP_BATCH_SIZE);
201
+ db.prepare(`
202
+ DELETE FROM workspace_sync_repair_snapshots
203
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ? AND expires_at <= ?
204
+ AND NOT EXISTS (
205
+ SELECT 1 FROM workspace_sync_repair_snapshot_entries
206
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
207
+ )
208
+ `).run(tenantId, workspaceId, snapshotId, now, tenantId, workspaceId, snapshotId);
209
+ })();
210
+ }
211
+ catch (error) {
212
+ // Expired snapshot removal is opportunistic maintenance. A cleanup
213
+ // timeout must not invalidate an otherwise valid repair response.
214
+ console.warn('[Taskforce Sync Repair Cleanup Deferred]', JSON.stringify({
215
+ workspaceId,
216
+ error: String(error?.message || error),
217
+ }));
218
+ }
164
219
  }
165
220
  function persistMaterialization(input) {
166
221
  const db = input.core.getDatabaseAdapter();
@@ -225,6 +280,7 @@ function readMetadata(input) {
225
280
  tenantId: input.tenantId,
226
281
  workspaceId: input.workspaceId,
227
282
  snapshotId: input.cursor.snapshotId,
283
+ snapshotSequence: input.cursor.snapshotSequence,
228
284
  coverage: input.coverage,
229
285
  })) {
230
286
  throw new WorkspaceSyncV3CombinedRepairSnapshotUnavailableError();
@@ -275,6 +331,7 @@ function readReusableMetadata(input) {
275
331
  tenantId: input.tenantId,
276
332
  workspaceId: input.workspaceId,
277
333
  snapshotId: String(row.snapshot_id),
334
+ snapshotSequence: sequence(row.snapshot_sequence, 'Combined repair snapshot sequence'),
278
335
  coverage: input.coverage,
279
336
  }))
280
337
  return null;
@@ -304,13 +361,17 @@ function mapEntry(row, coverage) {
304
361
  payloadFingerprint: String(row.payload_fingerprint || ''), payload,
305
362
  occurredAt: timestamp(row.occurred_at, 'Combined repair occurrence time'),
306
363
  };
307
- (coverage === 'workflow'
308
- ? validateWorkspaceSyncV3WorkflowCoverageFeedEntry
309
- : coverage === 'planning-order'
310
- ? validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry
311
- : coverage === 'nested'
312
- ? validateWorkspaceSyncV3NestedCoverageFeedEntry
313
- : 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);
314
375
  return entry;
315
376
  }
316
377
  function finalizePage(input) {
@@ -367,24 +428,19 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
367
428
  const pageSize = Math.max(1, Math.min(MAX_PAGE_SIZE, Math.floor(input.pageSize || DEFAULT_PAGE_SIZE)));
368
429
  const maxResponseBytes = Math.max(1024, Math.min(8 * 1024 * 1024, Math.floor(input.maxResponseBytes || DEFAULT_MAX_RESPONSE_BYTES)));
369
430
  const db = input.core.getDatabaseAdapter();
370
- const coverage = input.workflowCoverage
371
- ? 'workflow'
372
- : input.planningOrderCoverage
373
- ? 'planning-order'
374
- : input.nestedCoverage
375
- ? 'nested'
376
- : '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';
377
442
  if (input.cursor && Date.parse(input.cursor.expiresAt) <= Date.parse(now)) {
378
- db.transaction(() => {
379
- db.prepare(`DELETE FROM workspace_sync_repair_snapshot_entries
380
- WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ? AND EXISTS (
381
- SELECT 1 FROM workspace_sync_repair_snapshots
382
- WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ? AND expires_at <= ?
383
- )`).run(tenantId, workspaceId, input.cursor.snapshotId, tenantId, workspaceId, input.cursor.snapshotId, now);
384
- db.prepare(`DELETE FROM workspace_sync_repair_snapshots
385
- WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ? AND expires_at <= ?`)
386
- .run(tenantId, workspaceId, input.cursor.snapshotId, now);
387
- })();
443
+ cleanupExpiredBestEffort(input.core, tenantId, workspaceId, now);
388
444
  throw new WorkspaceSyncV3CombinedRepairSnapshotUnavailableError();
389
445
  }
390
446
  let insertedBaselineEntities = 0;
@@ -393,17 +449,17 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
393
449
  let metadata;
394
450
  let nextIndex;
395
451
  if (input.cursor) {
452
+ cleanupExpiredBestEffort(input.core, tenantId, workspaceId, now, input.cursor.snapshotId);
396
453
  metadata = db.transaction(() => {
397
- const current = readMetadata({
454
+ return readMetadata({
398
455
  core: input.core, tenantId, workspaceId, cursor: input.cursor, now,
399
456
  coverage,
400
457
  });
401
- cleanupExpired(input.core, tenantId, workspaceId, now, current.snapshotId);
402
- return current;
403
458
  })();
404
459
  nextIndex = input.cursor.nextIndex;
405
460
  }
406
461
  else {
462
+ cleanupExpiredBestEffort(input.core, tenantId, workspaceId, now);
407
463
  const materialized = db.transaction(() => {
408
464
  // Serialize cursorless materialization and reuse decisions with
409
465
  // durable writers and competing repair requests.
@@ -413,7 +469,6 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
413
469
  ON CONFLICT (tenant_id, workspace_id) DO UPDATE SET updated_at = excluded.updated_at
414
470
  RETURNING CAST(last_sequence AS TEXT) AS last_sequence
415
471
  `).get(tenantId, workspaceId, now);
416
- cleanupExpired(input.core, tenantId, workspaceId, now);
417
472
  const reusable = readReusableMetadata({
418
473
  core: input.core, tenantId, workspaceId, now,
419
474
  coverage,
@@ -422,17 +477,23 @@ export function buildWorkspaceSyncV3CombinedRepairPage(input) {
422
477
  return { metadata: reusable, reused: true,
423
478
  insertedBaselineEntities: 0, insertedBaselineJournalRows: 0 };
424
479
  const repairStartedAt = Date.now();
425
- const prepared = coverage === 'workflow'
426
- ? prepareWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId, now,
480
+ const prepared = coverage === 'workflow-task-cover'
481
+ ? prepareWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot({ core: input.core, workspaceId, now,
427
482
  coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
428
- : coverage === 'planning-order'
429
- ? prepareWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId, now,
483
+ : coverage === 'workflow'
484
+ ? prepareWorkspaceSyncV3WorkflowRepairSnapshot({ core: input.core, workspaceId, now,
430
485
  coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
431
- : coverage === 'nested'
432
- ? prepareWorkspaceSyncV3NestedRepairSnapshot({ core: input.core, workspaceId, now,
486
+ : coverage === 'planning-order'
487
+ ? prepareWorkspaceSyncV3PlanningOrderRepairSnapshot({ core: input.core, workspaceId, now,
433
488
  coveredLegacyWritesFenced: input.coveredLegacyWritesFenced })
434
- : prepareWorkspaceSyncV3CombinedRepairSnapshot({ core: input.core, workspaceId, now,
435
- coveredLegacyWritesFenced: input.coveredLegacyWritesFenced });
489
+ : coverage === 'task-cover'
490
+ ? prepareWorkspaceSyncV3TaskCoverRepairSnapshot({ core: input.core, workspaceId, now,
491
+ 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 });
436
497
  // Production expiry is sampled at the end of persistence, after
437
498
  // every immutable payload row has committed in the same lock.
438
499
  const materializationStartedAt = input.now
@@ -525,3 +586,9 @@ export function buildWorkspaceSyncV3WorkflowRepairPage(input) {
525
586
  export function buildWorkspaceSyncV3PlanningOrderRepairPage(input) {
526
587
  return buildWorkspaceSyncV3CombinedRepairPage({ ...input, planningOrderCoverage: true });
527
588
  }
589
+ export function buildWorkspaceSyncV3TaskCoverRepairPage(input) {
590
+ return buildWorkspaceSyncV3CombinedRepairPage({ ...input, taskCoverCoverage: true });
591
+ }
592
+ export function buildWorkspaceSyncV3WorkflowTaskCoverRepairPage(input) {
593
+ return buildWorkspaceSyncV3CombinedRepairPage({ ...input, workflowTaskCoverCoverage: true });
594
+ }
@@ -31,8 +31,12 @@ export declare class WorkspaceSyncV3CombinedRepairBaselineRequiredError extends
31
31
  export declare function listWorkspaceSyncV3CombinedRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
32
32
  /** Candidate v4 inventory. The coverage-v3 inventory above intentionally remains unchanged. */
33
33
  export declare function listWorkspaceSyncV3NestedRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
34
+ /** Candidate v7 inventory. It is the v4 family with attachment-link schema v2. */
35
+ export declare function listWorkspaceSyncV3TaskCoverRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
34
36
  /** Candidate v5 inventory. Coverage-v3/v4 inventories intentionally remain unchanged. */
35
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[];
36
40
  /** Candidate v6 inventory. Workflow v5 remains an independent dark contract. */
37
41
  export declare function listWorkspaceSyncV3PlanningOrderRepairCandidates(core: TaskforceCore, workspaceId: string): WorkspaceSyncV3CombinedRepairCandidate[];
38
42
  export declare function buildWorkspaceSyncV3CombinedRepairSnapshot(input: {
@@ -49,7 +53,9 @@ export declare function buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCand
49
53
  inventory: WorkspaceSyncV3CombinedRepairCandidate[];
50
54
  nestedCoverage?: boolean;
51
55
  workflowCoverage?: boolean;
56
+ workflowTaskCoverCoverage?: boolean;
52
57
  planningOrderCoverage?: boolean;
58
+ taskCoverCoverage?: boolean;
53
59
  }): {
54
60
  snapshotSequence: string;
55
61
  entries: WorkspaceSyncV3FeedEntry[];
@@ -75,4 +81,18 @@ export declare function buildWorkspaceSyncV3PlanningOrderRepairSnapshot(input: {
75
81
  snapshotSequence: string;
76
82
  entries: WorkspaceSyncV3FeedEntry[];
77
83
  };
84
+ export declare function buildWorkspaceSyncV3TaskCoverRepairSnapshot(input: {
85
+ core: TaskforceCore;
86
+ workspaceId: string;
87
+ }): {
88
+ snapshotSequence: string;
89
+ entries: WorkspaceSyncV3FeedEntry[];
90
+ };
91
+ export declare function buildWorkspaceSyncV3WorkflowTaskCoverRepairSnapshot(input: {
92
+ core: TaskforceCore;
93
+ workspaceId: string;
94
+ }): {
95
+ snapshotSequence: string;
96
+ entries: WorkspaceSyncV3FeedEntry[];
97
+ };
78
98
  export {};
@@ -8,12 +8,14 @@ import { serializeTaskRootForSync, projectWorkspaceSyncV3TaskRootJournalRow } fr
8
8
  import { projectWorkspaceSyncV3TaxonomyJournalRow } from './workspaceSyncV3TaxonomyFeedProjection.js';
9
9
  import { projectWorkspaceSyncV3WorkstreamJournalRow } from './workspaceSyncV3WorkstreamProjection.js';
10
10
  import { buildWorkspaceSyncV3NestedTaskRepairCandidates, } from './workspaceSyncV3NestedTaskRepairSnapshot.js';
11
- import { projectWorkspaceSyncV3NestedTaskJournalRow } from './workspaceSyncV3NestedTaskProjection.js';
11
+ import { projectWorkspaceSyncV3NestedTaskJournalRow, projectWorkspaceSyncV3NestedTaskV2JournalRow, } from './workspaceSyncV3NestedTaskProjection.js';
12
12
  import { validateWorkspaceSyncV3NestedCoverageFeedEntry, WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE, } from './workspaceSyncV3NestedCoverage.js';
13
13
  import { serializeWorkflowExecutionEventSyncPayload, serializeWorkflowExecutionRootSyncPayload, serializeWorkflowPublishedDefinitionSyncPayload, } from './workflowRuntimeSync.js';
14
14
  import { projectWorkspaceSyncV3WorkflowRuntimeJournalRow, } from './workspaceSyncV3WorkflowRuntimeProjection.js';
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
+ 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';
17
19
  import { projectWorkspaceSyncV3WorkstreamTaskOrderJournalRow } from './workspaceSyncV3WorkstreamTaskOrderProjection.js';
18
20
  import { serializeWorkstreamTaskOrderForSync } from './workstreamTaskOrderSync.js';
19
21
  import { serializeTaxonomyStateForSync } from './taxonomySyncPayload.js';
@@ -28,6 +30,10 @@ const WORKFLOW_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PRO
28
30
  .map((projection, index) => [projection.projectionId, index]));
29
31
  const PLANNING_ORDER_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE.projections
30
32
  .map((projection, index) => [projection.projectionId, index]));
33
+ const TASK_COVER_PROJECTION_RANK = new Map(WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE.projections
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]));
31
37
  export class WorkspaceSyncV3CombinedRepairBaselineRequiredError extends Error {
32
38
  missing;
33
39
  code = 'WORKSPACE_SYNC_V3_COMBINED_REPAIR_BASELINE_REQUIRED';
@@ -40,13 +46,17 @@ function compareCodeUnits(left, right) {
40
46
  return left < right ? -1 : left > right ? 1 : 0;
41
47
  }
42
48
  function projectionRank(entry, coverage) {
43
- const ranks = coverage === 'workflow'
44
- ? WORKFLOW_PROJECTION_RANK
45
- : coverage === 'planning-order'
46
- ? PLANNING_ORDER_PROJECTION_RANK
47
- : coverage === 'nested'
48
- ? NESTED_PROJECTION_RANK
49
- : 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;
50
60
  const rank = ranks.get(entry.projection);
51
61
  if (rank === undefined)
52
62
  throw new Error(`Unsupported combined repair projection: ${entry.projection}.`);
@@ -151,8 +161,7 @@ function listLiveEvents(core, workspaceId, liveEntityIds) {
151
161
  cursor = { watermark: last.createdAt, id: eventCursorId(last) };
152
162
  }
153
163
  }
154
- /** Candidate v4 inventory. The coverage-v3 inventory above intentionally remains unchanged. */
155
- export function listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId) {
164
+ function listNestedRepairCandidates(core, workspaceId, attachmentProjection) {
156
165
  const startedAt = Date.now();
157
166
  const tasks = listTasks(core, workspaceId);
158
167
  const tasksCompletedAt = Date.now();
@@ -185,6 +194,7 @@ export function listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId) {
185
194
  tasks,
186
195
  events,
187
196
  attachmentLinksByTaskId,
197
+ attachmentProjection,
188
198
  }),
189
199
  ];
190
200
  const completedAt = Date.now();
@@ -210,8 +220,15 @@ export function listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId) {
210
220
  }
211
221
  return candidates;
212
222
  }
213
- /** Candidate v5 inventory. Coverage-v3/v4 inventories intentionally remain unchanged. */
214
- export function listWorkspaceSyncV3WorkflowRepairCandidates(core, workspaceId) {
223
+ /** Candidate v4 inventory. The coverage-v3 inventory above intentionally remains unchanged. */
224
+ export function listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId) {
225
+ return listNestedRepairCandidates(core, workspaceId, 'task-attachment-links/full-v1');
226
+ }
227
+ /** Candidate v7 inventory. It is the v4 family with attachment-link schema v2. */
228
+ export function listWorkspaceSyncV3TaskCoverRepairCandidates(core, workspaceId) {
229
+ return listNestedRepairCandidates(core, workspaceId, 'task-attachment-links/full-v2');
230
+ }
231
+ function listWorkflowRuntimeRepairCandidates(core, workspaceId) {
215
232
  const workflowStore = new WorkflowStore(core.getDatabaseAdapter(), core.getTenantId());
216
233
  const executions = workflowStore.listExecutions(workspaceId).map((execution) => {
217
234
  const projected = workflowStore.getProjectedExecution(workspaceId, execution.id);
@@ -252,12 +269,25 @@ export function listWorkspaceSyncV3WorkflowRepairCandidates(core, workspaceId) {
252
269
  };
253
270
  });
254
271
  return [
255
- ...listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId),
256
272
  ...definitions.values(),
257
273
  ...executionCandidates,
258
274
  ...events,
259
275
  ];
260
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
+ }
261
291
  /** Candidate v6 inventory. Workflow v5 remains an independent dark contract. */
262
292
  export function listWorkspaceSyncV3PlanningOrderRepairCandidates(core, workspaceId) {
263
293
  const nested = listWorkspaceSyncV3NestedRepairCandidates(core, workspaceId);
@@ -380,7 +410,7 @@ function taskEntry(candidate, row, priorFullRow) {
380
410
  return { ...projected, mutationKind, payload: candidate.payload,
381
411
  payloadFingerprint: fingerprintWorkspaceSyncPayload(candidate.payload) };
382
412
  }
383
- function entry(candidate, row, taskFullProvenance) {
413
+ function entry(candidate, row, taskFullProvenance, taskCoverCoverage = false) {
384
414
  if (candidate.domain === 'workstream-task-order') {
385
415
  const projected = projectWorkspaceSyncV3WorkstreamTaskOrderJournalRow(row);
386
416
  if (!projected
@@ -401,7 +431,9 @@ function entry(candidate, row, taskFullProvenance) {
401
431
  }
402
432
  if (candidate.domain === 'task-comments' || candidate.domain === 'task-checklist'
403
433
  || candidate.domain === 'task-attachment-links' || candidate.domain === 'entity-event') {
404
- const projected = projectWorkspaceSyncV3NestedTaskJournalRow(row);
434
+ const projected = taskCoverCoverage && candidate.domain === 'task-attachment-links'
435
+ ? projectWorkspaceSyncV3NestedTaskV2JournalRow(row)
436
+ : projectWorkspaceSyncV3NestedTaskJournalRow(row);
405
437
  if (!projected) {
406
438
  throw new Error(`${candidate.domain} repair revision does not match canonical state: ${candidate.entityId}.`);
407
439
  }
@@ -475,22 +507,30 @@ export function buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates(i
475
507
  .map((candidate) => candidate.entityId);
476
508
  const taskFullProvenance = readTaskFullProvenanceRows({ db, tenantId, workspaceId, taskIds: remappedTaskIds });
477
509
  const provenanceCompletedAt = Date.now();
478
- const entries = inventory.map((candidate) => entry(candidate, rows.get(`${candidate.domain}\0${candidate.entityId}`), taskFullProvenance));
510
+ const entries = inventory.map((candidate) => entry(candidate, rows.get(`${candidate.domain}\0${candidate.entityId}`), taskFullProvenance, input.taskCoverCoverage === true || input.workflowTaskCoverCoverage === true));
479
511
  const entriesCompletedAt = Date.now();
480
- const coverage = input.workflowCoverage
481
- ? 'workflow'
482
- : input.planningOrderCoverage
483
- ? 'planning-order'
484
- : input.nestedCoverage
485
- ? 'nested'
486
- : 'combined';
487
- entries.forEach(coverage === 'workflow'
488
- ? validateWorkspaceSyncV3WorkflowCoverageFeedEntry
489
- : coverage === 'planning-order'
490
- ? validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry
491
- : coverage === 'nested'
492
- ? validateWorkspaceSyncV3NestedCoverageFeedEntry
493
- : 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);
494
534
  const validationCompletedAt = Date.now();
495
535
  if (entries.some((candidate) => BigInt(candidate.sequence) > BigInt(snapshotSequence))) {
496
536
  throw new Error('Combined repair entry exceeds the locked snapshot sequence.');
@@ -564,3 +604,39 @@ export function buildWorkspaceSyncV3PlanningOrderRepairSnapshot(input) {
564
604
  });
565
605
  })();
566
606
  }
607
+ export function buildWorkspaceSyncV3TaskCoverRepairSnapshot(input) {
608
+ const workspaceId = String(input.workspaceId || '').trim();
609
+ if (!workspaceId)
610
+ throw new Error('Workspace id is required.');
611
+ const tenantId = input.core.getTenantId();
612
+ const db = input.core.getDatabaseAdapter();
613
+ return db.transaction(() => {
614
+ const snapshotSequence = lockAndReadHighWatermark(db, tenantId, workspaceId);
615
+ const inventory = listWorkspaceSyncV3TaskCoverRepairCandidates(input.core, workspaceId);
616
+ return buildWorkspaceSyncV3CombinedRepairSnapshotFromLockedCandidates({
617
+ core: input.core,
618
+ workspaceId,
619
+ snapshotSequence,
620
+ inventory,
621
+ taskCoverCoverage: true,
622
+ });
623
+ })();
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
+ }
@@ -2,6 +2,8 @@ import type { WorkspaceSyncV2ProjectionExclusion } from './workspaceSyncV2Projec
2
2
  import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR } from './workspaceSyncV3NestedWireContract.js';
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
+ import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR } from './workspaceSyncV3TaskCoverWireContract.js';
6
+ import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR } from './workspaceSyncV3WorkflowTaskCoverWireContract.js';
5
7
  export declare const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR: Readonly<{
6
8
  coverageProfileId: "task-planning-metadata";
7
9
  coverageVersion: 3;
@@ -9,13 +11,14 @@ export declare const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR: Readonly<{
9
11
  }>;
10
12
  export declare const WORKSPACE_SYNC_V3_COMBINED_CAPABILITY_VERSION: 1;
11
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"];
12
- 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;
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;
13
15
  export interface WorkspaceSyncV3CombinedWireContract {
14
16
  coverage: WorkspaceSyncV3CombinedCoverageSelector;
15
17
  excludedProjections: readonly WorkspaceSyncV2ProjectionExclusion[];
16
18
  nestedWriterPrerequisitesRequired: boolean;
17
19
  workflowWriterPrerequisitesRequired: boolean;
18
20
  planningOrderWriterPrerequisitesRequired: boolean;
21
+ taskCoverProjectionRequired: boolean;
19
22
  }
20
23
  export declare function resolveWorkspaceSyncV3CombinedWireContract(input: {
21
24
  coverageProfileId: unknown;