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