@taskforcehq/taskforce 0.3.329 → 0.3.332

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +7 -2
  2. package/dist/Taskforce.module.css +290 -45
  3. package/dist/components/features/AiProfilesModule.js +3 -5
  4. package/dist/components/features/TaskSettings.js +70 -14
  5. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  6. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  7. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +2 -2
  8. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
  9. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  10. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  11. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  12. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  13. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  14. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  15. package/dist/components/features/planning/PlanningModule.js +15 -3
  16. package/dist/components/features/planning/planningMetadata.d.ts +10 -0
  17. package/dist/components/features/planning/planningMetadata.js +8 -0
  18. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  19. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  20. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  21. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  22. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  23. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  24. package/dist/components/views/StandaloneLayout.js +62 -27
  25. package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
  26. package/dist/components/views/panels/PlanningDrawer.js +12 -8
  27. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  28. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  29. package/dist/config/envSchema.js +55 -1
  30. package/dist/core/McpTokenService.d.ts +25 -1
  31. package/dist/core/McpTokenService.js +106 -15
  32. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  33. package/dist/core/TaskChecklistCommandService.js +83 -5
  34. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  35. package/dist/core/TaskLifecycleCommandService.js +6 -2
  36. package/dist/core/Taskforce.d.ts +43 -3
  37. package/dist/core/Taskforce.js +158 -7
  38. package/dist/core/types.d.ts +9 -0
  39. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
  40. package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
  41. package/dist/documentReviews/commandService.d.ts +2 -1
  42. package/dist/documentReviews/commandService.js +6 -3
  43. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  44. package/dist/hooks/sync/orchestratorShared.js +2 -0
  45. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  46. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  47. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  48. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  49. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  50. package/dist/hooks/useSyncOrchestrator.js +111 -2
  51. package/dist/hooks/useTaskData.d.ts +31 -1
  52. package/dist/hooks/useTaskData.js +29 -7
  53. package/dist/hooks/useTaskMutations.d.ts +3 -1
  54. package/dist/hooks/useTaskMutations.js +46 -12
  55. package/dist/hooks/useTaskforce.d.ts +2 -0
  56. package/dist/hooks/useTaskforce.js +11 -2
  57. package/dist/mcp/clientRegistry.d.ts +2 -2
  58. package/dist/mcp/clientRegistry.js +1 -1
  59. package/dist/mcp/documentAssetRegistrar.js +9 -6
  60. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  61. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  62. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  63. package/dist/mcp/httpProtocolRouting.d.ts +11 -0
  64. package/dist/mcp/httpProtocolRouting.js +22 -0
  65. package/dist/mcp/localCliHealth.d.ts +2 -2
  66. package/dist/mcp/localCliHealth.js +2 -2
  67. package/dist/mcp/localServiceProxy.d.ts +1 -0
  68. package/dist/mcp/localServiceProxy.js +530 -68
  69. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  70. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  71. package/dist/mcp/runtime.d.ts +54 -79
  72. package/dist/mcp/runtime.js +408 -102
  73. package/dist/mcp/taskPlanningRegistrar.js +25 -6
  74. package/dist/mcp/toolProfiles.d.ts +2 -0
  75. package/dist/mcp/toolProfiles.js +11 -0
  76. package/dist/mcp/toolRegistry.d.ts +1 -0
  77. package/dist/mcp/toolRegistry.js +9 -8
  78. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  79. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  80. package/dist/migrations/taskSchemaMigrations.js +415 -0
  81. package/dist/runtime/appGates.d.ts +2 -1
  82. package/dist/runtime/appGates.js +7 -0
  83. package/dist/server/buildInfo.d.ts +1 -0
  84. package/dist/server/buildInfo.js +5 -1
  85. package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
  86. package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
  87. package/dist/server/index.d.ts +3 -0
  88. package/dist/server/index.js +108 -11
  89. package/dist/server/localDatabaseIdentity.js +4 -1
  90. package/dist/server/localServiceLease.js +2 -1
  91. package/dist/server/localServiceSessions.d.ts +14 -17
  92. package/dist/server/localServiceSessions.js +308 -94
  93. package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
  94. package/dist/server/routes/admin.d.ts +4 -0
  95. package/dist/server/routes/admin.js +126 -5
  96. package/dist/server/routes/agents.d.ts +7 -0
  97. package/dist/server/routes/agents.js +277 -24
  98. package/dist/server/routes/billing.js +5 -1
  99. package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
  100. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  101. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  102. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  103. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  104. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  105. package/dist/server/routes/githubReviewEvidence.js +116 -0
  106. package/dist/server/routes/localService.d.ts +15 -4
  107. package/dist/server/routes/localService.js +136 -40
  108. package/dist/server/routes/modelConnections.d.ts +24 -0
  109. package/dist/server/routes/modelConnections.js +205 -0
  110. package/dist/server/routes/shared.d.ts +22 -0
  111. package/dist/server/routes/shared.js +298 -182
  112. package/dist/server/routes/sync.js +1 -0
  113. package/dist/server/routes/syncAuxRoutes.js +5 -1
  114. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  115. package/dist/server/routes/syncPushRoutes.js +1 -0
  116. package/dist/server/routes/syncV3FeedRoutes.js +10 -1
  117. package/dist/server/routes/syncV3OperationRoutes.js +35 -9
  118. package/dist/server/routes/tasks.js +21 -2
  119. package/dist/server/routes/workflows.js +9 -1
  120. package/dist/server/routes.js +59 -0
  121. package/dist/service/localServiceCli.d.ts +2 -2
  122. package/dist/service/localServiceCli.js +4 -3
  123. package/dist/services/codexAppServerModelGateway.d.ts +54 -5
  124. package/dist/services/codexAppServerModelGateway.js +246 -21
  125. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  126. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  127. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  128. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  129. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  130. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  131. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  132. package/dist/services/executorPhaseAApprovalService.js +609 -0
  133. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  134. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  135. package/dist/services/executorPhaseAIssuerCore.d.ts +139 -0
  136. package/dist/services/executorPhaseAIssuerCore.js +402 -0
  137. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  138. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  139. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  140. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  141. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  142. package/dist/services/githubReviewEvidenceService.js +336 -0
  143. package/dist/services/modelGateway.d.ts +7 -0
  144. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  145. package/dist/services/modelProviderConnectionService.js +279 -0
  146. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  147. package/dist/services/modelProviderCredentialHome.js +271 -0
  148. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  149. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  150. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  151. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  152. package/dist/services/taskforceAgentMcpBridge.d.ts +2 -2
  153. package/dist/services/taskforceAgentMcpBridge.js +42 -29
  154. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  155. package/dist/shared/adminEdgeProxy.js +94 -0
  156. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  157. package/dist/shared/adminProxySessionCookies.js +86 -0
  158. package/dist/shared/aiProfileColors.d.ts +31 -1
  159. package/dist/shared/aiProfileColors.js +14 -6
  160. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  161. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  162. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  163. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  164. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  165. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  166. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  167. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  168. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  169. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  170. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  171. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  172. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  173. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  174. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  175. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  176. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  177. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  178. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  179. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  180. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  181. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  182. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  183. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  184. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  185. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  186. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  187. package/dist/shared/executorPhaseATiming.js +1 -0
  188. package/dist/shared/planningIdentity.js +1 -1
  189. package/dist/shared/productLogoKeys.d.ts +2 -0
  190. package/dist/shared/productLogoKeys.js +18 -0
  191. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  192. package/dist/shared/taskforceAgentDefinition.js +6 -9
  193. package/dist/shared/taskforceAgentModels.js +7 -3
  194. package/dist/shared/userFeatureGrants.d.ts +4 -0
  195. package/dist/shared/userFeatureGrants.js +7 -0
  196. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  197. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  198. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  199. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  200. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  201. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  202. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  203. package/dist/storage/modelProviderConnectionStore.js +446 -0
  204. package/dist/storage/postgresAdapter.d.ts +4 -0
  205. package/dist/storage/postgresAdapter.js +14 -1
  206. package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
  207. package/dist/storage/postgresRequestDiagnostics.js +15 -2
  208. package/dist/storage/postgresWorker.js +20 -2
  209. package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
  210. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  211. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  212. package/dist/storage/workflowStore.d.ts +2 -0
  213. package/dist/storage/workflowStore.js +39 -2
  214. package/dist/sync/cloudSyncApi.js +4 -2
  215. package/dist/sync/collaborationSyncState.js +5 -0
  216. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
  217. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  218. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  219. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
  220. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
  221. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  222. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  223. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  224. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  225. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  226. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  227. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  228. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  229. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  230. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  231. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  232. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  233. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  234. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
  235. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  236. package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
  237. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  238. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
  239. package/dist/sync/syncApplyHandlers.d.ts +3 -0
  240. package/dist/sync/syncApplyHandlers.js +81 -15
  241. package/dist/sync/syncService.d.ts +15 -0
  242. package/dist/sync/syncService.js +83 -18
  243. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  244. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  245. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  246. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  247. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  248. package/dist/sync/v3/durableOperationReplay.js +18 -0
  249. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
  250. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
  251. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
  252. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  253. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
  254. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
  255. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  256. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
  257. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
  258. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  259. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  260. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  261. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +8 -2
  262. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  263. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  264. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  265. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +3 -1
  266. package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
  267. package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
  268. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
  269. package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
  270. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
  271. package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
  272. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
  273. package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
  274. package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
  275. package/dist/sync/v3/syncDurabilityStore.js +202 -8
  276. package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
  277. package/dist/sync/v3/taskChecklistMutationService.js +44 -1
  278. package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
  279. package/dist/sync/v3/taskStatusMutationService.js +119 -3
  280. package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
  281. package/dist/sync/v3/workflowAssignmentSync.js +27 -0
  282. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
  283. package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
  284. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  285. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  286. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  287. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  288. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
  289. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
  290. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  291. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
  292. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
  293. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
  294. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  295. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
  296. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
  297. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
  298. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  299. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
  300. package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
  301. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
  302. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
  303. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  304. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
  305. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
  306. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  307. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  308. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
  309. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
  310. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  311. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  312. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  313. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  314. package/dist/sync/workspaceRepair.d.ts +5 -2
  315. package/dist/sync/workspaceRepair.js +161 -6
  316. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  317. package/dist/sync/workspaceSyncModel.js +35 -7
  318. package/dist/sync/workspaceSyncState.d.ts +1 -0
  319. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  320. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  321. package/dist/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
  322. package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
  323. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
  324. package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
  325. package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
  326. package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
  327. package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
  328. package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
  329. package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
  330. package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
  331. package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
  332. package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
  333. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  334. package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
  335. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  336. package/dist/ui/assets/index-DSQINwt9.js +7 -0
  337. package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
  338. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  339. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  340. package/dist/ui/branding/logos/signature_dark.png +0 -0
  341. package/dist/ui/branding/logos/signature_light.png +0 -0
  342. package/dist/ui/index.html +3 -3
  343. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  344. package/dist/utils/httpSetCookie.d.ts +1 -0
  345. package/dist/utils/httpSetCookie.js +4 -1
  346. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  347. package/dist/utils/localRuntimeUrl.js +14 -0
  348. package/dist/utils/productLogoRegistry.d.ts +2 -0
  349. package/dist/utils/productLogoRegistry.js +36 -0
  350. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  351. package/dist/utils/syncStatusPresentation.js +17 -0
  352. package/dist/utils/taskEvents.d.ts +2 -0
  353. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  354. package/dist/utils/workspaceSyncPresentation.js +23 -17
  355. package/package.json +24 -4
  356. package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
  357. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
  358. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
  359. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
  360. package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
  361. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  362. package/dist/ui/assets/index-I5zhdtgt.js +0 -7
  363. package/dist/ui/assets/index-VRFsx3wz.css +0 -1
@@ -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,6 +118,15 @@ export function enqueueLocalTaskStatusMutation(input) {
74
118
  taskLifecycle: true,
75
119
  taskAssignee: payload.assigneeIntent.kind !== 'preserve',
76
120
  },
121
+ ...(reviewComment ? {
122
+ additionalTargets: [{
123
+ domain: 'task-comments',
124
+ entityId: taskId,
125
+ mutationKind: 'append',
126
+ baseEntityRevision: reviewCommentRevision.entityRevision,
127
+ baseLifecycleRevision: reviewCommentRevision.lifecycleRevision,
128
+ }],
129
+ } : {}),
77
130
  payload: withOriginActorPayload({
78
131
  ...payload,
79
132
  ...(input.expectedDetailRevision
@@ -92,7 +145,7 @@ export function enqueueLocalTaskStatusMutation(input) {
92
145
  }
93
146
  input.core.assertTaskDetailRevisionForUpdate(taskId, input.expectedDetailRevision, input.identity.workspaceId);
94
147
  }
95
- return applyTaskStatusMutationForDurableSync({
148
+ let mutation = applyTaskStatusMutationForDurableSync({
96
149
  core: input.core,
97
150
  workspaceId: input.identity.workspaceId,
98
151
  taskId,
@@ -104,6 +157,35 @@ export function enqueueLocalTaskStatusMutation(input) {
104
157
  actorRef: input.actorRef,
105
158
  taskEventId: activityEventId,
106
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;
107
189
  },
108
190
  buildCanonicalIntent: (result) => ({
109
191
  metadataPatch: Object.fromEntries(Object.keys(payload.metadataPatch).map((key) => [
@@ -117,7 +199,7 @@ export function enqueueLocalTaskStatusMutation(input) {
117
199
  const mutationResult = result.mutationResult;
118
200
  if (!mutationResult)
119
201
  throw new LocalAuthoritativeTaskStatusError('Local task status mutation result is missing.');
120
- if (!mutationResult.noOp) {
202
+ if (!mutationResult.noOp || reviewComment) {
121
203
  try {
122
204
  input.core.notifyDurableTaskLifecycleCommitted(input.identity.workspaceId, taskId);
123
205
  }
@@ -174,6 +256,66 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
174
256
  throw new LocalAuthoritativeTaskStatusError('Persisted task status payload fingerprint is invalid.');
175
257
  }
176
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
+ }
177
319
  const requestedWorkflowAssignment = operationPayload.workflowAssignment || null;
178
320
  const workflowIdentityMismatch = (expected, actual) => expected.template.id !== actual.template.id
179
321
  || expected.version.id !== actual.version.id
@@ -205,7 +347,11 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
205
347
  if (!validLifecycle || authoritative.metadataOwned !== expectsMetadataOwnership) {
206
348
  throw new LocalAuthoritativeTaskStatusError('Authoritative task status state does not match the persisted request.');
207
349
  }
208
- const localCanonical = input.core.getTask(task.id, input.identity.workspaceId);
350
+ const activeSuccessors = input.store.listActiveOutboxSuccessors(input.identity);
351
+ const localCanonical = input.core.getTask(task.id, input.identity.workspaceId)
352
+ || (activeSuccessors.some((successor) => successor.mutationKind === 'delete')
353
+ ? input.core.getDeletedTask(task.id, input.identity.workspaceId)?.taskSnapshot
354
+ : null);
209
355
  if (!localCanonical)
210
356
  throw new LocalAuthoritativeTaskStatusError('Local task status projection is missing.');
211
357
  let canonicalMetadataIntent = null;
@@ -269,7 +415,7 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
269
415
  || activity.taskId !== task.id
270
416
  || activity.action !== 'task-status-changed'
271
417
  || !isCanonicalIso(activity.createdAt)
272
- || activity.createdAt !== task.updatedAt
418
+ || activity.createdAt !== (reviewCommentTimestamp || task.updatedAt)
273
419
  || typeof activity.actor !== 'string' || !activity.actor.trim()
274
420
  || !['human', 'ai', 'system'].includes(activity.actorType)
275
421
  || !activity.details || typeof activity.details !== 'object' || Array.isArray(activity.details)
@@ -279,12 +425,37 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
279
425
  throw new LocalAuthoritativeTaskStatusError('Authoritative task status activity is invalid.');
280
426
  }
281
427
  }
282
- const revision = validateTaskActivityAuthoritativeRevision({
283
- response: response,
284
- authoritative: authoritative,
285
- activityId: activity?.id || null,
286
- invalid: (message) => new LocalAuthoritativeTaskStatusError(message),
287
- });
428
+ const reviewIntermediateRevisions = reviewHandoff ? [
429
+ { sequence: reviewHandoff.comments.sequence },
430
+ { sequence: reviewHandoff.activityRevision.sequence },
431
+ ] : [];
432
+ const revision = activity === null && reviewHandoff
433
+ ? (() => {
434
+ const taskSequence = authoritative.sequence;
435
+ const commentsSequence = reviewHandoff.comments.sequence;
436
+ const commentActivitySequence = reviewHandoff.activityRevision.sequence;
437
+ if (!/^(0|[1-9]\d*)$/.test(taskSequence)
438
+ || BigInt(commentsSequence) !== BigInt(taskSequence) + 1n
439
+ || BigInt(commentActivitySequence) !== BigInt(commentsSequence) + 1n
440
+ || response.operationHighWatermark !== commentActivitySequence
441
+ || response.dependentActivityRevisions !== undefined) {
442
+ throw new LocalAuthoritativeTaskStatusError('Authoritative review handoff revisions are not in canonical sequence order.');
443
+ }
444
+ return {
445
+ taskSequence,
446
+ operationHighWatermark: commentActivitySequence,
447
+ activityRevision: null,
448
+ legacySingleEntry: false,
449
+ dependentActivityRevisions: [],
450
+ };
451
+ })()
452
+ : validateTaskActivityAuthoritativeRevision({
453
+ response: response,
454
+ authoritative: authoritative,
455
+ activityId: activity?.id || null,
456
+ invalid: (message) => new LocalAuthoritativeTaskStatusError(message),
457
+ intermediateRevisions: reviewIntermediateRevisions,
458
+ });
288
459
  const dependentActivities = Array.isArray(response.dependentActivities)
289
460
  ? response.dependentActivities
290
461
  : [];
@@ -373,7 +544,23 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
373
544
  canonicalFingerprint,
374
545
  metadataOwned: authoritative.metadataOwned,
375
546
  reopenAssigneeOwned: authoritative.assigneeOwned,
376
- }, ...(!revision.legacySingleEntry && revision.activityRevision && activity ? [{
547
+ }, ...(reviewHandoff && reviewCommentsPayload && reviewCommentActivity ? [{
548
+ domain: 'task-comments',
549
+ entityId: task.id,
550
+ mutationKind: 'append',
551
+ entityRevision: reviewHandoff.comments.entityRevision,
552
+ lifecycleRevision: reviewHandoff.comments.lifecycleRevision,
553
+ sequence: reviewHandoff.comments.sequence,
554
+ canonicalFingerprint: fingerprintWorkspaceSyncPayload(reviewCommentsPayload),
555
+ }, {
556
+ domain: WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN,
557
+ entityId: reviewCommentActivity.id,
558
+ mutationKind: WORKSPACE_SYNC_ENTITY_EVENT_APPEND,
559
+ entityRevision: reviewHandoff.activityRevision.entityRevision,
560
+ lifecycleRevision: reviewHandoff.activityRevision.lifecycleRevision,
561
+ sequence: reviewHandoff.activityRevision.sequence,
562
+ canonicalFingerprint: fingerprintWorkspaceSyncPayload(serializeTaskActivityForSync(reviewCommentActivity)),
563
+ }] : []), ...(!revision.legacySingleEntry && revision.activityRevision && activity ? [{
377
564
  domain: WORKSPACE_SYNC_ENTITY_EVENT_DOMAIN,
378
565
  entityId: activity.id,
379
566
  mutationKind: WORKSPACE_SYNC_ENTITY_EVENT_APPEND,
@@ -398,14 +585,49 @@ export function applyAuthoritativeTaskStatusAndAck(input) {
398
585
  expectedTaskId: task.id,
399
586
  });
400
587
  }
401
- const successors = input.store.listActiveOutboxSuccessors(input.identity);
588
+ const successors = activeSuccessors;
402
589
  const hasSuccessor = successors.length > 0;
403
- let updated = hasSuccessor
590
+ const activeTask = hasSuccessor
404
591
  ? input.core.getTask(task.id, input.identity.workspaceId)
592
+ : null;
593
+ const deletedSnapshot = !activeTask && successors.some((successor) => successor.mutationKind === 'delete')
594
+ ? input.core.getDeletedTask(task.id, input.identity.workspaceId)?.taskSnapshot
595
+ : null;
596
+ let updated = hasSuccessor
597
+ ? activeTask || deletedSnapshot
405
598
  : input.core.installDurableTaskStatusAuthoritativeForSync(task, payload, installAssignee, input.identity.workspaceId);
406
599
  if (!updated)
407
600
  throw new LocalAuthoritativeTaskStatusError('Local task status projection is missing.');
408
- if (hasSuccessor
601
+ if (reviewHandoff && reviewCommentsPayload && reviewCommentActivity && !deletedSnapshot) {
602
+ const localComments = serializeWorkspaceSyncV3TaskCommentsPayload({
603
+ taskId: updated.id,
604
+ comments: updated.comments || [],
605
+ });
606
+ const installedComments = hasSuccessor
607
+ ? mergeWorkspaceSyncV3TaskCommentsPayload({
608
+ taskId: updated.id,
609
+ left: reviewCommentsPayload.comments,
610
+ right: localComments.comments.filter((comment) => (!reviewCommentsPayload.comments.some((accepted) => accepted.id === comment.id))),
611
+ })
612
+ : reviewCommentsPayload;
613
+ updated = input.core.updateTask(task.id, { comments: installedComments.comments }, input.identity.workspaceId, {
614
+ persistBackup: false,
615
+ emitRealtime: false,
616
+ skipTaskEvents: true,
617
+ syncUpdatedAt: updated.updatedAt,
618
+ allowV3OwnedMetadataWrite: true,
619
+ });
620
+ if (!updated)
621
+ throw new LocalAuthoritativeTaskStatusError('Review handoff task disappeared locally.');
622
+ input.core.upsertEntityEventForSync(reviewCommentActivity, { allowAuthoritativeReplacement: true });
623
+ activityReconciled = true;
624
+ }
625
+ else if (reviewHandoff && reviewCommentActivity && deletedSnapshot) {
626
+ input.core.upsertEntityEventForSync(reviewCommentActivity, { allowAuthoritativeReplacement: true });
627
+ activityReconciled = true;
628
+ }
629
+ if (!deletedSnapshot
630
+ && hasSuccessor
409
631
  && installAssignee
410
632
  && !successors.some((successor) => successor.ownsTaskAssignee)
411
633
  && normalizeAssignee(updated.assignee) !== normalizeAssignee(task.assignee)) {
@@ -90,6 +90,16 @@ export type WorkspaceSyncOutboxRecord = WorkspaceSyncOperationIdentity & {
90
90
  initiativeMetadataRevisionRebaseCount?: number;
91
91
  leaseOwner: string | null;
92
92
  leaseExpiresAt: string | null;
93
+ lastErrorCode: string | null;
94
+ };
95
+ export type WorkspaceSyncOutboxOperationLookup = WorkspaceSyncOperationIdentity & {
96
+ status: string;
97
+ createdAt: string;
98
+ domain: string;
99
+ entityId: string;
100
+ mutationKind: string;
101
+ payloadFingerprint: string;
102
+ authoritativeResponseJson: string | null;
93
103
  };
94
104
  export type WorkspaceSyncOutboxSupersession = {
95
105
  recoveryBatchId: string;
@@ -325,6 +335,31 @@ export declare class WorkspaceSyncDurabilityStore {
325
335
  createdAt: string;
326
336
  } | null;
327
337
  readOutboxOperation(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncOutboxRecord | null;
338
+ assertOutboxOperationIdentity(record: Readonly<WorkspaceSyncOutboxRecord>, expected: {
339
+ domain: string;
340
+ entityId: string;
341
+ mutationKind: string;
342
+ payloadFingerprint?: string;
343
+ }): void;
344
+ readOutboxOperationLookup(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncOutboxOperationLookup | null;
345
+ pruneTerminalOutboxOperations(input: {
346
+ tenantId: string;
347
+ workspaceId: string;
348
+ terminalBefore: string;
349
+ limit?: number;
350
+ }): {
351
+ deleted: number;
352
+ remainingEligible: number;
353
+ };
354
+ pruneCommittedOperationResults(input: {
355
+ tenantId: string;
356
+ workspaceId: string;
357
+ terminalBefore: string;
358
+ limit?: number;
359
+ }): {
360
+ deleted: number;
361
+ remainingEligible: number;
362
+ };
328
363
  readV3DispatchSettlementEvidence(identity: WorkspaceSyncOperationIdentity): WorkspaceSyncV3DispatchSettlementEvidence | null;
329
364
  listBlockedInvalidOutboxOperations(input: {
330
365
  tenantId: string;
@@ -363,7 +398,7 @@ export declare class WorkspaceSyncDurabilityStore {
363
398
  identity: WorkspaceSyncOperationIdentity;
364
399
  recoveryBatchId: string;
365
400
  now: string;
366
- replayPolicy?: 'task-root';
401
+ replayPolicy?: 'task-root' | 'authoritative-workflow-runtime';
367
402
  appendToExistingRecovery?: boolean;
368
403
  }): WorkspaceSyncOutboxSupersession;
369
404
  recordOutboxRecoveryBaseline(input: {