@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
@@ -1,12 +1,15 @@
1
1
  import { applyTaskStatusMutationForDurableSync, validateDurableTaskStatusMutationPayload, } from '../../core/TaskDurableStatusMutationService.js';
2
2
  import { serializeTaskForSync } from '../taskSyncPayload.js';
3
3
  import { buildTaskLifecycleActivityEventId } from './taskLifecycleActivityIdentity.js';
4
+ import { buildTaskCommentActivityEventId } from './taskCommentActivityIdentity.js';
4
5
  import { validateTaskActivityAuthoritativeRevision } from './taskActivityAuthoritativeRevision.js';
5
6
  import { serializeEntityActivityForSync, serializeTaskActivityForSync, WORKSPACE_SYNC_ENTITY_EVENT_APPEND, WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN, } from './taskActivityJournal.js';
6
7
  import { fingerprintWorkspaceSyncPayload, } from './syncDurabilityStore.js';
7
8
  import { WorkflowStore } from '../../storage/workflowStore.js';
8
9
  import { normalizeTaskStatusOperationWithWorkflowAssignment, normalizeWorkflowAssignmentSyncRecord, } from './workflowAssignmentSync.js';
9
10
  import { withOriginActorPayload } from './workspaceSyncV3OriginActor.js';
11
+ import { mergeWorkspaceSyncV3TaskCommentsPayload, serializeWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
12
+ import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
10
13
  export class LocalAuthoritativeTaskStatusError extends Error {
11
14
  code = 'WORKSPACE_SYNC_AUTHORITATIVE_RESPONSE_INVALID';
12
15
  constructor(message) {
@@ -19,6 +22,16 @@ function isCanonicalIso(value) {
19
22
  && Number.isFinite(Date.parse(value))
20
23
  && new Date(value).toISOString() === value;
21
24
  }
25
+ function nextTaskUpdatedAt(current, requested) {
26
+ const currentMs = Date.parse(current);
27
+ const requestedMs = Date.parse(requested);
28
+ if (!Number.isFinite(requestedMs) || new Date(requestedMs).toISOString() !== requested) {
29
+ throw new LocalAuthoritativeTaskStatusError('Task status operation timestamp is invalid.');
30
+ }
31
+ return Number.isFinite(currentMs) && currentMs >= requestedMs
32
+ ? new Date(currentMs + 1).toISOString()
33
+ : requested;
34
+ }
22
35
  function normalizeAssignee(value) {
23
36
  const normalized = typeof value === 'string' ? value.trim() : '';
24
37
  return normalized && normalized.toLowerCase() !== 'unassigned' ? normalized : null;
@@ -46,13 +59,27 @@ export function enqueueLocalTaskStatusMutation(input) {
46
59
  const taskId = String(input.taskId || '').trim();
47
60
  if (!taskId)
48
61
  throw new LocalAuthoritativeTaskStatusError('Task id is required.');
49
- const statusPayload = validateDurableTaskStatusMutationPayload(input.payload);
62
+ const operationPayload = normalizeTaskStatusOperationWithWorkflowAssignment(input.payload);
63
+ const statusPayload = validateDurableTaskStatusMutationPayload({
64
+ status: operationPayload.status,
65
+ assigneeIntent: operationPayload.assigneeIntent,
66
+ canceledReason: operationPayload.canceledReason,
67
+ metadataPatch: operationPayload.metadataPatch,
68
+ });
50
69
  const assignment = statusPayload.status === 'in-progress'
51
70
  ? new WorkflowStore(input.core.getDatabaseAdapter(), input.core.getTenantId())
52
71
  .getAssignmentForTaskSync(input.identity.workspaceId, taskId)
53
72
  : null;
73
+ const reviewHandoff = operationPayload.reviewHandoff ? {
74
+ comment: {
75
+ ...operationPayload.reviewHandoff.comment,
76
+ author: input.actorRef,
77
+ submittedAuthor: input.actorRef,
78
+ },
79
+ } : null;
54
80
  const payload = {
55
- ...statusPayload,
81
+ ...operationPayload,
82
+ ...(reviewHandoff ? { reviewHandoff } : {}),
56
83
  ...(assignment?.execution.status === 'pending' ? { workflowAssignment: assignment } : {}),
57
84
  };
58
85
  const activityEventId = buildTaskLifecycleActivityEventId({
@@ -62,6 +89,23 @@ export function enqueueLocalTaskStatusMutation(input) {
62
89
  taskId,
63
90
  mutationKind: 'set-status',
64
91
  });
92
+ const reviewComment = payload.reviewHandoff ? {
93
+ ...payload.reviewHandoff.comment,
94
+ timestamp: input.now,
95
+ } : null;
96
+ const reviewCommentActivityEventId = reviewComment ? buildTaskCommentActivityEventId({
97
+ workspaceId: input.identity.workspaceId,
98
+ clientId: input.identity.clientId,
99
+ operationId: input.identity.operationId,
100
+ taskId,
101
+ commentId: reviewComment.id,
102
+ }) : null;
103
+ const reviewCommentRevision = reviewComment ? input.store.readEntityRevisionCoordinates({
104
+ tenantId: input.identity.tenantId,
105
+ workspaceId: input.identity.workspaceId,
106
+ domain: 'task-comments',
107
+ entityId: taskId,
108
+ }) : null;
65
109
  const result = input.store.enqueueLocalOperation({
66
110
  identity: input.identity,
67
111
  domain: 'task',
@@ -74,23 +118,80 @@ export function enqueueLocalTaskStatusMutation(input) {
74
118
  taskLifecycle: true,
75
119
  taskAssignee: payload.assigneeIntent.kind !== 'preserve',
76
120
  },
77
- payload: withOriginActorPayload({ ...payload }, input.actorRef),
121
+ ...(reviewComment ? {
122
+ additionalTargets: [{
123
+ domain: 'task-comments',
124
+ entityId: taskId,
125
+ mutationKind: 'append',
126
+ baseEntityRevision: reviewCommentRevision.entityRevision,
127
+ baseLifecycleRevision: reviewCommentRevision.lifecycleRevision,
128
+ }],
129
+ } : {}),
130
+ payload: withOriginActorPayload({
131
+ ...payload,
132
+ ...(input.expectedDetailRevision
133
+ ? { expectedDetailRevision: input.expectedDetailRevision }
134
+ : {}),
135
+ }, input.actorRef),
78
136
  ...(payload.workflowAssignment ? {
79
137
  coalesceWorkflowAssignmentExecutionId: payload.workflowAssignment.execution.id,
80
138
  } : {}),
81
139
  ...(input.requireV3CombinedOwnership ? { requireV3PlanningOwnership: 'combined' } : {}),
82
140
  now: input.now,
83
- applyLocalMutation: () => applyTaskStatusMutationForDurableSync({
84
- core: input.core,
85
- workspaceId: input.identity.workspaceId,
86
- taskId,
87
- targetStatus: statusPayload.status,
88
- metadataPatch: statusPayload.metadataPatch,
89
- assigneeIntent: statusPayload.assigneeIntent,
90
- canceledReason: statusPayload.canceledReason,
91
- updatedAt: input.now,
92
- actorRef: input.actorRef,
93
- taskEventId: activityEventId,
141
+ applyLocalMutation: () => {
142
+ if (input.expectedDetailRevision) {
143
+ if (!input.core.assertTaskDetailRevisionForUpdate) {
144
+ throw new Error('Task detail revision checks are unavailable.');
145
+ }
146
+ input.core.assertTaskDetailRevisionForUpdate(taskId, input.expectedDetailRevision, input.identity.workspaceId);
147
+ }
148
+ let mutation = applyTaskStatusMutationForDurableSync({
149
+ core: input.core,
150
+ workspaceId: input.identity.workspaceId,
151
+ taskId,
152
+ targetStatus: statusPayload.status,
153
+ metadataPatch: statusPayload.metadataPatch,
154
+ assigneeIntent: statusPayload.assigneeIntent,
155
+ canceledReason: statusPayload.canceledReason,
156
+ updatedAt: input.now,
157
+ actorRef: input.actorRef,
158
+ taskEventId: activityEventId,
159
+ });
160
+ if (reviewComment) {
161
+ const comments = serializeWorkspaceSyncV3TaskCommentsPayload({
162
+ taskId,
163
+ comments: mutation.task.comments || [],
164
+ }).comments;
165
+ if (comments.some((comment) => comment.id === reviewComment.id)) {
166
+ throw new LocalAuthoritativeTaskStatusError(`Review handoff comment identity conflict: ${reviewComment.id}.`);
167
+ }
168
+ const updatedAt = nextTaskUpdatedAt(String(mutation.task.updatedAt || mutation.task.createdAt), input.now);
169
+ const updated = input.core.updateTask(taskId, { comments: [...comments, reviewComment] }, input.identity.workspaceId, {
170
+ persistBackup: false,
171
+ emitRealtime: false,
172
+ skipTaskEvents: true,
173
+ syncUpdatedAt: updatedAt,
174
+ allowV3OwnedMetadataWrite: true,
175
+ });
176
+ if (!updated)
177
+ throw new LocalAuthoritativeTaskStatusError('Review handoff task disappeared.');
178
+ input.core.addTaskCommentEventForDurableSync({
179
+ taskId,
180
+ workspaceId: input.identity.workspaceId,
181
+ actor: input.actorRef,
182
+ eventId: reviewCommentActivityEventId,
183
+ createdAt: String(updated.updatedAt),
184
+ comment: reviewComment,
185
+ });
186
+ mutation = { ...mutation, task: updated };
187
+ }
188
+ return mutation;
189
+ },
190
+ buildCanonicalIntent: (result) => ({
191
+ metadataPatch: Object.fromEntries(Object.keys(payload.metadataPatch).map((key) => [
192
+ key,
193
+ result.task[key] ?? null,
194
+ ])),
94
195
  }),
95
196
  });
96
197
  if (!result.enqueued)
@@ -98,7 +199,7 @@ export function enqueueLocalTaskStatusMutation(input) {
98
199
  const mutationResult = result.mutationResult;
99
200
  if (!mutationResult)
100
201
  throw new LocalAuthoritativeTaskStatusError('Local task status mutation result is missing.');
101
- if (!mutationResult.noOp) {
202
+ if (!mutationResult.noOp || reviewComment) {
102
203
  try {
103
204
  input.core.notifyDurableTaskLifecycleCommitted(input.identity.workspaceId, taskId);
104
205
  }
@@ -155,6 +256,66 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
155
256
  throw new LocalAuthoritativeTaskStatusError('Persisted task status payload fingerprint is invalid.');
156
257
  }
157
258
  const operationPayload = normalizeTaskStatusOperationWithWorkflowAssignment(persistedPayload);
259
+ const requestedReviewHandoff = operationPayload.reviewHandoff || null;
260
+ const reviewHandoff = response.reviewHandoff || null;
261
+ if (Boolean(requestedReviewHandoff) !== Boolean(reviewHandoff)) {
262
+ throw new LocalAuthoritativeTaskStatusError('Authoritative review handoff presence is invalid.');
263
+ }
264
+ let reviewCommentsPayload = null;
265
+ let reviewCommentActivity = null;
266
+ let reviewCommentTimestamp = null;
267
+ if (requestedReviewHandoff && reviewHandoff) {
268
+ reviewCommentsPayload = serializeWorkspaceSyncV3TaskCommentsPayload({
269
+ taskId: task.id,
270
+ comments: reviewHandoff.comments.payload.comments,
271
+ });
272
+ reviewCommentActivity = reviewHandoff.activity;
273
+ const requestedComment = requestedReviewHandoff.comment;
274
+ const authoritativeComment = reviewCommentsPayload.comments.find((comment) => comment.id === requestedComment.id);
275
+ reviewCommentTimestamp = authoritativeComment?.timestamp || null;
276
+ const expectedActivityId = buildTaskCommentActivityEventId({
277
+ workspaceId: input.identity.workspaceId,
278
+ clientId: input.identity.clientId,
279
+ operationId: input.identity.operationId,
280
+ taskId: task.id,
281
+ commentId: requestedComment.id,
282
+ });
283
+ const reviewCommentActivityDetails = reviewCommentActivity.details;
284
+ if (reviewHandoff.comments.domain !== 'task-comments'
285
+ || reviewHandoff.comments.entityId !== task.id
286
+ || reviewHandoff.comments.mutationKind !== 'append'
287
+ || !/^(0|[1-9]\d*)$/.test(reviewHandoff.comments.sequence)
288
+ || !/^(0|[1-9]\d*)$/.test(reviewHandoff.comments.entityRevision)
289
+ || reviewHandoff.comments.lifecycleRevision !== '0'
290
+ || reviewCommentsPayload.taskId !== task.id
291
+ || !authoritativeComment
292
+ || authoritativeComment.author !== requestedComment.author
293
+ || authoritativeComment.submittedAuthor !== requestedComment.submittedAuthor
294
+ || authoritativeComment.text !== requestedComment.text
295
+ || !isCanonicalIso(authoritativeComment.timestamp)
296
+ || reviewCommentActivity.id !== expectedActivityId
297
+ || reviewCommentActivity.workspaceId !== input.identity.workspaceId
298
+ || reviewCommentActivity.entityType !== 'task'
299
+ || reviewCommentActivity.entityId !== task.id
300
+ || reviewCommentActivity.taskId !== task.id
301
+ || reviewCommentActivity.action !== 'task-comment-added'
302
+ || !String(reviewCommentActivity.actor || '').trim()
303
+ || !['human', 'ai', 'system'].includes(reviewCommentActivity.actorType)
304
+ || reviewCommentActivity.createdAt !== task.updatedAt
305
+ || !reviewCommentActivityDetails
306
+ || Object.keys(reviewCommentActivityDetails).sort().join(',') !== 'commentId,preview,submittedAuthor'
307
+ || reviewCommentActivityDetails.commentId !== authoritativeComment.id
308
+ || reviewCommentActivityDetails.submittedAuthor !== authoritativeComment.submittedAuthor
309
+ || reviewCommentActivityDetails.preview !== authoritativeComment.text.slice(0, 160)
310
+ || reviewHandoff.activityRevision.domain !== 'entity-event'
311
+ || reviewHandoff.activityRevision.entityId !== expectedActivityId
312
+ || !/^(0|[1-9]\d*)$/.test(reviewHandoff.activityRevision.sequence)
313
+ || reviewHandoff.activityRevision.entityRevision !== '1'
314
+ || reviewHandoff.activityRevision.lifecycleRevision !== '0'
315
+ || canonicalWorkspaceSyncJson(reviewCommentsPayload) !== canonicalWorkspaceSyncJson(serializeWorkspaceSyncV3TaskCommentsPayload({ taskId: task.id, comments: task.comments || [] }))) {
316
+ throw new LocalAuthoritativeTaskStatusError('Authoritative review handoff is invalid.');
317
+ }
318
+ }
158
319
  const requestedWorkflowAssignment = operationPayload.workflowAssignment || null;
159
320
  const workflowIdentityMismatch = (expected, actual) => expected.template.id !== actual.template.id
160
321
  || expected.version.id !== actual.version.id
@@ -189,9 +350,31 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
189
350
  const localCanonical = input.core.getTask(task.id, input.identity.workspaceId);
190
351
  if (!localCanonical)
191
352
  throw new LocalAuthoritativeTaskStatusError('Local task status projection is missing.');
353
+ let canonicalMetadataIntent = null;
354
+ if (input.record.canonicalIntentJson) {
355
+ try {
356
+ const parsed = JSON.parse(input.record.canonicalIntentJson);
357
+ canonicalMetadataIntent = parsed.metadataPatch
358
+ && typeof parsed.metadataPatch === 'object'
359
+ && !Array.isArray(parsed.metadataPatch)
360
+ ? parsed.metadataPatch
361
+ : null;
362
+ }
363
+ catch {
364
+ canonicalMetadataIntent = null;
365
+ }
366
+ if (!canonicalMetadataIntent) {
367
+ throw new LocalAuthoritativeTaskStatusError('Persisted canonical task status intent is invalid.');
368
+ }
369
+ }
192
370
  for (const key of Object.keys(payload.metadataPatch)) {
371
+ if (canonicalMetadataIntent && !Object.prototype.hasOwnProperty.call(canonicalMetadataIntent, key)) {
372
+ throw new LocalAuthoritativeTaskStatusError('Persisted canonical task status intent is incomplete.');
373
+ }
193
374
  const actual = task[key];
194
- const expected = localCanonical[key];
375
+ const expected = canonicalMetadataIntent
376
+ ? canonicalMetadataIntent[key]
377
+ : localCanonical[key];
195
378
  if (fingerprintWorkspaceSyncPayload(actual ?? null) !== fingerprintWorkspaceSyncPayload(expected ?? null)) {
196
379
  throw new LocalAuthoritativeTaskStatusError('Authoritative task metadata does not match the persisted request.');
197
380
  }
@@ -228,7 +411,7 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
228
411
  || activity.taskId !== task.id
229
412
  || activity.action !== 'task-status-changed'
230
413
  || !isCanonicalIso(activity.createdAt)
231
- || activity.createdAt !== task.updatedAt
414
+ || activity.createdAt !== (reviewCommentTimestamp || task.updatedAt)
232
415
  || typeof activity.actor !== 'string' || !activity.actor.trim()
233
416
  || !['human', 'ai', 'system'].includes(activity.actorType)
234
417
  || !activity.details || typeof activity.details !== 'object' || Array.isArray(activity.details)
@@ -238,12 +421,37 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
238
421
  throw new LocalAuthoritativeTaskStatusError('Authoritative task status activity is invalid.');
239
422
  }
240
423
  }
241
- const revision = validateTaskActivityAuthoritativeRevision({
242
- response: response,
243
- authoritative: authoritative,
244
- activityId: activity?.id || null,
245
- invalid: (message) => new LocalAuthoritativeTaskStatusError(message),
246
- });
424
+ const reviewIntermediateRevisions = reviewHandoff ? [
425
+ { sequence: reviewHandoff.comments.sequence },
426
+ { sequence: reviewHandoff.activityRevision.sequence },
427
+ ] : [];
428
+ const revision = activity === null && reviewHandoff
429
+ ? (() => {
430
+ const taskSequence = authoritative.sequence;
431
+ const commentsSequence = reviewHandoff.comments.sequence;
432
+ const commentActivitySequence = reviewHandoff.activityRevision.sequence;
433
+ if (!/^(0|[1-9]\d*)$/.test(taskSequence)
434
+ || BigInt(commentsSequence) !== BigInt(taskSequence) + 1n
435
+ || BigInt(commentActivitySequence) !== BigInt(commentsSequence) + 1n
436
+ || response.operationHighWatermark !== commentActivitySequence
437
+ || response.dependentActivityRevisions !== undefined) {
438
+ throw new LocalAuthoritativeTaskStatusError('Authoritative review handoff revisions are not in canonical sequence order.');
439
+ }
440
+ return {
441
+ taskSequence,
442
+ operationHighWatermark: commentActivitySequence,
443
+ activityRevision: null,
444
+ legacySingleEntry: false,
445
+ dependentActivityRevisions: [],
446
+ };
447
+ })()
448
+ : validateTaskActivityAuthoritativeRevision({
449
+ response: response,
450
+ authoritative: authoritative,
451
+ activityId: activity?.id || null,
452
+ invalid: (message) => new LocalAuthoritativeTaskStatusError(message),
453
+ intermediateRevisions: reviewIntermediateRevisions,
454
+ });
247
455
  const dependentActivities = Array.isArray(response.dependentActivities)
248
456
  ? response.dependentActivities
249
457
  : [];
@@ -332,7 +540,23 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
332
540
  canonicalFingerprint,
333
541
  metadataOwned: authoritative.metadataOwned,
334
542
  reopenAssigneeOwned: authoritative.assigneeOwned,
335
- }, ...(!revision.legacySingleEntry && revision.activityRevision && activity ? [{
543
+ }, ...(reviewHandoff && reviewCommentsPayload && reviewCommentActivity ? [{
544
+ domain: 'task-comments',
545
+ entityId: task.id,
546
+ mutationKind: 'append',
547
+ entityRevision: reviewHandoff.comments.entityRevision,
548
+ lifecycleRevision: reviewHandoff.comments.lifecycleRevision,
549
+ sequence: reviewHandoff.comments.sequence,
550
+ canonicalFingerprint: fingerprintWorkspaceSyncPayload(reviewCommentsPayload),
551
+ }, {
552
+ domain: WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN,
553
+ entityId: reviewCommentActivity.id,
554
+ mutationKind: WORKSPACE_SYNC_ENTITY_EVENT_APPEND,
555
+ entityRevision: reviewHandoff.activityRevision.entityRevision,
556
+ lifecycleRevision: reviewHandoff.activityRevision.lifecycleRevision,
557
+ sequence: reviewHandoff.activityRevision.sequence,
558
+ canonicalFingerprint: fingerprintWorkspaceSyncPayload(serializeTaskActivityForSync(reviewCommentActivity)),
559
+ }] : []), ...(!revision.legacySingleEntry && revision.activityRevision && activity ? [{
336
560
  domain: WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN,
337
561
  entityId: activity.id,
338
562
  mutationKind: WORKSPACE_SYNC_ENTITY_EVENT_APPEND,
@@ -364,6 +588,30 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
364
588
  : input.core.installDurableTaskStatusAuthoritativeForSync(task, payload, installAssignee, input.identity.workspaceId);
365
589
  if (!updated)
366
590
  throw new LocalAuthoritativeTaskStatusError('Local task status projection is missing.');
591
+ if (reviewHandoff && reviewCommentsPayload && reviewCommentActivity) {
592
+ const localComments = serializeWorkspaceSyncV3TaskCommentsPayload({
593
+ taskId: updated.id,
594
+ comments: updated.comments || [],
595
+ });
596
+ const installedComments = hasSuccessor
597
+ ? mergeWorkspaceSyncV3TaskCommentsPayload({
598
+ taskId: updated.id,
599
+ left: reviewCommentsPayload.comments,
600
+ right: localComments.comments.filter((comment) => (!reviewCommentsPayload.comments.some((accepted) => accepted.id === comment.id))),
601
+ })
602
+ : reviewCommentsPayload;
603
+ updated = input.core.updateTask(task.id, { comments: installedComments.comments }, input.identity.workspaceId, {
604
+ persistBackup: false,
605
+ emitRealtime: false,
606
+ skipTaskEvents: true,
607
+ syncUpdatedAt: updated.updatedAt,
608
+ allowV3OwnedMetadataWrite: true,
609
+ });
610
+ if (!updated)
611
+ throw new LocalAuthoritativeTaskStatusError('Review handoff task disappeared locally.');
612
+ input.core.upsertEntityEventForSync(reviewCommentActivity, { allowAuthoritativeReplacement: true });
613
+ activityReconciled = true;
614
+ }
367
615
  if (hasSuccessor
368
616
  && installAssignee
369
617
  && !successors.some((successor) => successor.ownsTaskAssignee)
@@ -80,6 +80,7 @@ export type WorkspaceSyncOutboxRecord = WorkspaceSyncOperationIdentity & {
80
80
  baseLifecycleRevision: string;
81
81
  payloadJson: string;
82
82
  payloadFingerprint: string;
83
+ canonicalIntentJson: string | null;
83
84
  status: string;
84
85
  attemptCount: number;
85
86
  initialNotFoundAttemptCount: number;
@@ -90,6 +91,15 @@ export type WorkspaceSyncOutboxRecord = WorkspaceSyncOperationIdentity & {
90
91
  leaseOwner: string | null;
91
92
  leaseExpiresAt: string | null;
92
93
  };
94
+ export type WorkspaceSyncOutboxOperationLookup = WorkspaceSyncOperationIdentity & {
95
+ status: string;
96
+ createdAt: string;
97
+ domain: string;
98
+ entityId: string;
99
+ mutationKind: string;
100
+ payloadFingerprint: string;
101
+ authoritativeResponseJson: string | null;
102
+ };
93
103
  export type WorkspaceSyncOutboxSupersession = {
94
104
  recoveryBatchId: string;
95
105
  operationIds: string[];
@@ -324,6 +334,31 @@ export declare class WorkspaceSyncDurabilityStore {
324
334
  createdAt: string;
325
335
  } | null;
326
336
  readOutboxOperation(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncOutboxRecord | null;
337
+ assertOutboxOperationIdentity(record: Readonly<WorkspaceSyncOutboxRecord>, expected: {
338
+ domain: string;
339
+ entityId: string;
340
+ mutationKind: string;
341
+ payloadFingerprint?: string;
342
+ }): void;
343
+ readOutboxOperationLookup(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncOutboxOperationLookup | null;
344
+ pruneTerminalOutboxOperations(input: {
345
+ tenantId: string;
346
+ workspaceId: string;
347
+ terminalBefore: string;
348
+ limit?: number;
349
+ }): {
350
+ deleted: number;
351
+ remainingEligible: number;
352
+ };
353
+ pruneCommittedOperationResults(input: {
354
+ tenantId: string;
355
+ workspaceId: string;
356
+ terminalBefore: string;
357
+ limit?: number;
358
+ }): {
359
+ deleted: number;
360
+ remainingEligible: number;
361
+ };
327
362
  readV3DispatchSettlementEvidence(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncV3DispatchSettlementEvidence | null;
328
363
  listBlockedInvalidOutboxOperations(input: {
329
364
  tenantId: string;
@@ -542,6 +577,7 @@ export declare class WorkspaceSyncDurabilityStore {
542
577
  queuedTaskSuccessor?: boolean;
543
578
  queuedWorkflowRuntimeSuccessor?: boolean;
544
579
  coalesceWorkflowAssignmentExecutionId?: string;
580
+ buildCanonicalIntent?: (mutationResult: T) => unknown;
545
581
  }): {
546
582
  enqueued: boolean;
547
583
  mutationResult?: T;
@@ -760,6 +796,11 @@ export declare class WorkspaceSyncDurabilityStore {
760
796
  private assertTaskCommentAppendRecoveryEventOwned;
761
797
  private isTaskCommentAppendRecoveryIntentSatisfied;
762
798
  private prepareTaskRecoveryPayload;
799
+ lockWorkspaceSequenceForMutation(input: {
800
+ tenantId: string;
801
+ workspaceId: string;
802
+ now: string;
803
+ }): void;
763
804
  private allocateSequenceRange;
764
805
  private allocateOutboxEnqueueSequence;
765
806
  private readOperationRow;