@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,3 +1,4 @@
1
+ import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
1
2
  export const WORKSPACE_SYNC_ENGINE_V2_PUSH_BOUNDARY_VERSION = 1;
2
3
  export function createWorkspaceSyncEngineV2PushBoundary(batchOperationIdentities) {
3
4
  if (!Array.isArray(batchOperationIdentities)
@@ -85,3 +86,86 @@ export function parseWorkspaceSyncEngineAppliedTaskUpserts(value, expectedTaskId
85
86
  }
86
87
  return normalized;
87
88
  }
89
+ function taskSettlementProjection(task, preserveReferenceNumber) {
90
+ const { updatedAt: _updatedAt, ...stableTask } = structuredClone(task);
91
+ if (!preserveReferenceNumber)
92
+ delete stableTask.referenceNumber;
93
+ return stableTask;
94
+ }
95
+ function taskSettlementOwnedProjection(input) {
96
+ // The cloud echo is authoritative for the complete task row, but this V2
97
+ // page may own only carrier fields. Validate exactly that remaining V2
98
+ // surface; V3-owned fields are checked by their own acknowledgement/feed.
99
+ const task = taskSettlementProjection(input.task, input.preserveReferenceNumber);
100
+ const rootOwnedByV3 = input.excludedProjections.has('task/root-v1');
101
+ const commentsOwnedByV3 = input.excludedProjections.has('task-comments/full-v1');
102
+ const checklistOwnedByV3 = input.excludedProjections.has('task-checklist/full-v1');
103
+ const attachmentLinksV1OwnedByV3 = input.excludedProjections
104
+ .has('task-attachment-links/full-v1');
105
+ const attachmentLinksV2OwnedByV3 = input.excludedProjections
106
+ .has('task-attachment-links/full-v2');
107
+ if (rootOwnedByV3) {
108
+ for (const key of Object.keys(task)) {
109
+ if (![
110
+ 'id',
111
+ 'comments',
112
+ 'checklistItems',
113
+ 'attachments',
114
+ 'cardCoverAssetId',
115
+ ].includes(key)) {
116
+ delete task[key];
117
+ }
118
+ }
119
+ }
120
+ if (commentsOwnedByV3)
121
+ delete task.comments;
122
+ if (checklistOwnedByV3)
123
+ delete task.checklistItems;
124
+ if (attachmentLinksV1OwnedByV3 || attachmentLinksV2OwnedByV3) {
125
+ delete task.attachments;
126
+ }
127
+ if (attachmentLinksV2OwnedByV3)
128
+ delete task.cardCoverAssetId;
129
+ return {
130
+ ...(rootOwnedByV3 ? {} : { archived: input.archived }),
131
+ task,
132
+ };
133
+ }
134
+ export function createWorkspaceSyncEngineV2SettlementIdentityProjection(input) {
135
+ const operationIdentity = String(input.operationIdentity || '').trim();
136
+ if (!operationIdentity || operationIdentity !== input.operationIdentity) {
137
+ throw new TypeError('The V2 push settlement operation identity is invalid.');
138
+ }
139
+ const expectedTaskUpserts = input.changes.filter((change) => change.op === 'upsert');
140
+ if (expectedTaskUpserts.length !== input.appliedTaskUpserts.length) {
141
+ throw new TypeError('The V2 push authoritative settlement projection is incomplete.');
142
+ }
143
+ const expectedProjection = expectedTaskUpserts.map((change) => ({
144
+ archived: change.archived,
145
+ task: taskSettlementProjection(change.task, change.task.referenceNumber !== undefined && change.task.referenceNumber !== null),
146
+ }));
147
+ const excludedProjections = new Set(input.excludedProjections || []);
148
+ const expectedOwnedProjection = expectedTaskUpserts.map((change) => (taskSettlementOwnedProjection({
149
+ archived: change.archived,
150
+ task: change.task,
151
+ preserveReferenceNumber: change.task.referenceNumber !== undefined
152
+ && change.task.referenceNumber !== null,
153
+ excludedProjections,
154
+ })));
155
+ const authoritativeOwnedProjection = input.appliedTaskUpserts.map((entry, index) => (taskSettlementOwnedProjection({
156
+ archived: entry.archived,
157
+ task: entry.task,
158
+ preserveReferenceNumber: expectedTaskUpserts[index]?.task.referenceNumber !== undefined
159
+ && expectedTaskUpserts[index]?.task.referenceNumber !== null,
160
+ excludedProjections,
161
+ })));
162
+ if (canonicalWorkspaceSyncJson(authoritativeOwnedProjection)
163
+ !== canonicalWorkspaceSyncJson(expectedOwnedProjection)) {
164
+ throw new TypeError('The V2 push authoritative settlement does not match the canonical request state.');
165
+ }
166
+ return {
167
+ version: 1,
168
+ operationIdentity,
169
+ taskUpserts: expectedProjection,
170
+ };
171
+ }
@@ -10,6 +10,7 @@ function resetWorkspaceSyncStatePushBaselines(runtime) {
10
10
  runtime.lastPushedInitiativeWatermarks.current = new Map();
11
11
  runtime.lastPushedWorkstreamIds.current = new Set();
12
12
  runtime.lastPushedWorkstreamWatermarks.current = new Map();
13
+ runtime.lastPushedPlanningIdentityWatermarks.current = new Map();
13
14
  runtime.lastPushedAiProfileIds.current = new Set();
14
15
  runtime.lastPushedAiProfileWatermarks.current = new Map();
15
16
  runtime.lastPushedAiProfileChangeKeys.current = new Map();
@@ -37,6 +37,12 @@ export type WorkspaceSyncEngineContentPullInput = Parameters<typeof pullWorkspac
37
37
  * commit against one exact prior boundary.
38
38
  */
39
39
  previousCursor: string | null;
40
+ /**
41
+ * Separates an independent content lookup from a V2 feed page. The
42
+ * identity becomes an apply boundary that settles the transfer
43
+ * without advancing or validating the runner's V2 cursor.
44
+ */
45
+ independentCompletionIdentity?: string;
40
46
  };
41
47
  type RemoteResult<Result> = Awaited<Result> & {
42
48
  transferReceipt?: WorkspaceSyncEngineRemoteTransferReceipt;
@@ -94,6 +100,11 @@ export interface WorkspaceSyncEngineRemoteServices {
94
100
  nextCursor: string | null;
95
101
  receipts: readonly WorkspaceSyncEngineRemoteTransferReceipt[];
96
102
  }): WorkspaceSyncEngineTransferCompletionGroup | undefined;
103
+ buildIndependentContentApplyCompletionGroup(input: {
104
+ workspaceId: string;
105
+ identity: string;
106
+ receipts: readonly WorkspaceSyncEngineRemoteTransferReceipt[];
107
+ }): WorkspaceSyncEngineTransferCompletionGroup | undefined;
97
108
  buildV2PushApplyCompletionGroup(input: {
98
109
  workspaceId: string;
99
110
  pushBoundary: WorkspaceSyncEngineV2PushBoundary;
@@ -6,7 +6,7 @@ export function createBrowserWorkspaceSyncEngineRemoteServices(resolveCloudAuthU
6
6
  provisionWorkspace: (input) => provisionWorkspace(resolveCloudAuthUrl, input),
7
7
  pushWorkspaceChanges: ({ ownership: _ownership, pushBoundary: _pushBoundary, ...input }) => (pushWorkspaceChanges(resolveCloudAuthUrl, input)),
8
8
  pullWorkspaceChanges: (input) => pullWorkspaceChanges(resolveCloudAuthUrl, input),
9
- pullWorkspaceContent: ({ previousCursor: _previousCursor, ...input }) => (pullWorkspaceContent(resolveCloudAuthUrl, input)),
9
+ pullWorkspaceContent: ({ previousCursor: _previousCursor, independentCompletionIdentity: _independentCompletionIdentity, ...input }) => (pullWorkspaceContent(resolveCloudAuthUrl, input)),
10
10
  pullInitiativeFeed: (input) => pullWorkspaceSyncV3Feed(resolveCloudAuthUrl, input),
11
11
  pullInitiativeRepair: (input) => pullWorkspaceInitiativeRepair(resolveCloudAuthUrl, input),
12
12
  pullCombinedFeed: (input) => pullWorkspaceSyncV3CombinedFeed(resolveCloudAuthUrl, input),
@@ -15,6 +15,7 @@ export function createBrowserWorkspaceSyncEngineRemoteServices(resolveCloudAuthU
15
15
  abandonTransferReceipts: () => undefined,
16
16
  acknowledgeNonApplyingTransferReceipts: () => undefined,
17
17
  buildV2ApplyCompletionGroup: () => undefined,
18
+ buildIndependentContentApplyCompletionGroup: () => undefined,
18
19
  buildV2PushApplyCompletionGroup: () => undefined,
19
20
  buildV3ApplyCompletionGroup: () => undefined,
20
21
  };
@@ -26,6 +26,7 @@ export interface WorkspaceSyncEngineRuntime {
26
26
  lastPushedInitiativeWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
27
27
  lastPushedWorkstreamIds: WorkspaceSyncMutableValue<Set<string>>;
28
28
  lastPushedWorkstreamWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
29
+ lastPushedPlanningIdentityWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
29
30
  lastPushedAiProfileIds: WorkspaceSyncMutableValue<Set<string>>;
30
31
  lastPushedAiProfileWatermarks: WorkspaceSyncMutableValue<Map<string, string>>;
31
32
  lastPushedAiProfileChangeKeys: WorkspaceSyncMutableValue<Map<string, string>>;
@@ -24,6 +24,7 @@ export function createWorkspaceSyncEngineRuntime() {
24
24
  lastPushedInitiativeWatermarks: mutable(new Map()),
25
25
  lastPushedWorkstreamIds: mutable(new Set()),
26
26
  lastPushedWorkstreamWatermarks: mutable(new Map()),
27
+ lastPushedPlanningIdentityWatermarks: mutable(new Map()),
27
28
  lastPushedAiProfileIds: mutable(new Set()),
28
29
  lastPushedAiProfileWatermarks: mutable(new Map()),
29
30
  lastPushedAiProfileChangeKeys: mutable(new Map()),
@@ -40,6 +40,18 @@ function v3Boundary(input) {
40
40
  ...(input.coverage ? { coverage: { ...input.coverage } } : {}),
41
41
  };
42
42
  }
43
+ function independentContentBoundary(identity) {
44
+ const normalizedIdentity = String(identity || '').trim();
45
+ if (!normalizedIdentity) {
46
+ throw new TypeError('Independent content transfer identity is required.');
47
+ }
48
+ return {
49
+ version: 1,
50
+ projection: 'independent-content',
51
+ cursor: null,
52
+ identity: normalizedIdentity,
53
+ };
54
+ }
43
55
  function decodeGatewayResult(result, nowMs) {
44
56
  const rawText = new TextDecoder().decode(result.body);
45
57
  let data = {};
@@ -96,12 +108,15 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
96
108
  throw new TypeError('The server sync operation workspace does not match its runner.');
97
109
  }
98
110
  };
99
- const abandon = (permitId, errorCode) => (options.permitStore.abandonPermit({
111
+ const abandon = (permitId, errorCode, readResponseUnavailableBeforeApply = false) => (options.permitStore.abandonPermit({
100
112
  permitId,
101
113
  workspaceId: options.workspaceId,
102
114
  coordinatorGeneration: options.coordinatorGeneration,
103
115
  serverInstanceId: options.serverInstanceId,
104
116
  errorCode,
117
+ ...(readResponseUnavailableBeforeApply
118
+ ? { readResponseUnavailableBeforeApply: true }
119
+ : {}),
105
120
  }));
106
121
  const execute = async (input) => {
107
122
  assertWorkspace(input.operation.workspaceId);
@@ -131,7 +146,7 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
131
146
  });
132
147
  }
133
148
  catch (error) {
134
- abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED');
149
+ abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED', operationClass === 'pull' || operationClass === 'repair');
135
150
  throw error;
136
151
  }
137
152
  const decoded = decodeGatewayResult(gatewayResult, issuedAt.getTime());
@@ -171,6 +186,12 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
171
186
  abandon(permit.permitId, 'SYNC_COORDINATOR_APPLYING_REJECTED');
172
187
  return result;
173
188
  }
189
+ if (!result.ok
190
+ && completedPermit.upstreamDisposition === 'unknown'
191
+ && (operationClass === 'pull' || operationClass === 'repair')) {
192
+ abandon(permit.permitId, 'SYNC_COORDINATOR_GATEWAY_REQUEST_FAILED', true);
193
+ return result;
194
+ }
174
195
  if (!input.previousBoundary) {
175
196
  abandon(permit.permitId, 'SYNC_COORDINATOR_APPLY_BOUNDARY_MISSING');
176
197
  throw new Error('A server applying request did not declare its prior boundary.');
@@ -319,10 +340,12 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
319
340
  });
320
341
  },
321
342
  pullWorkspaceContent: (input) => {
322
- const { previousCursor, ...request } = input;
343
+ const { previousCursor, independentCompletionIdentity, ...request } = input;
323
344
  return execute({
324
345
  operation: { type: 'content-pull', ...request },
325
- previousBoundary: v2Boundary(previousCursor),
346
+ previousBoundary: independentCompletionIdentity
347
+ ? independentContentBoundary(independentCompletionIdentity)
348
+ : v2Boundary(previousCursor),
326
349
  applying: true,
327
350
  });
328
351
  },
@@ -433,6 +456,10 @@ export function createServerWorkspaceSyncEngineRemoteServices(options) {
433
456
  }
434
457
  },
435
458
  buildV2ApplyCompletionGroup: ({ workspaceId, previousCursor, nextCursor, receipts, }) => completionGroup(workspaceId, receipts, v2Boundary(previousCursor), v2Boundary(nextCursor)),
459
+ buildIndependentContentApplyCompletionGroup: ({ workspaceId, identity, receipts, }) => {
460
+ const boundary = independentContentBoundary(identity);
461
+ return completionGroup(workspaceId, receipts, boundary, boundary);
462
+ },
436
463
  buildV2PushApplyCompletionGroup: ({ workspaceId, pushBoundary, receipts, }) => completionGroup(workspaceId, receipts, parseWorkspaceSyncEngineV2PushBoundary(pushBoundary), parseWorkspaceSyncEngineV2PushBoundary(pushBoundary)),
437
464
  buildV3ApplyCompletionGroup: ({ workspaceId, apply, receipts }) => {
438
465
  const metadata = readReceipts(workspaceId, receipts);
@@ -2,7 +2,7 @@ import type { LocalWorkspaceSyncRunnerOperations } from '../coordinator/localWor
2
2
  import { type EnsureWorkspaceReadyResult } from '../syncService.js';
3
3
  import type { WorkspaceSyncV2ProjectionExclusion } from '../v3/workspaceSyncV2ProjectionExclusions.js';
4
4
  import type { WorkspaceSyncV3CombinedCoverageSelector } from '../v3/workspaceSyncV3CombinedWireContract.js';
5
- import type { WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
5
+ import { type WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
6
6
  import type { WorkspaceSyncEngineRemoteServices } from './workspaceSyncEngineRemoteServices.js';
7
7
  import type { WorkspaceSyncEngineServerPushCandidateProvider } from './workspaceSyncEngineServerSnapshotReader.js';
8
8
  import type { WorkspaceSyncEngineServerCheckpointPort } from './workspaceSyncEngineServerApplyBoundary.js';
@@ -46,11 +46,13 @@ export interface WorkspaceSyncEngineServerAttachmentApplyPort {
46
46
  } | {
47
47
  success: false;
48
48
  error: string;
49
+ disposition?: 'retryable' | 'terminal-unavailable';
49
50
  }>;
50
51
  }): Promise<{
51
52
  attempted: number;
52
53
  resolved: number;
53
54
  remaining: number;
55
+ terminal: number;
54
56
  nextAttemptAt: string | null;
55
57
  lastError: string | null;
56
58
  }>;
@@ -1,11 +1,12 @@
1
1
  import { createHash } from 'crypto';
2
- import { createLocalWorkspaceSyncPendingV2Push, decodeWorkspaceSyncPayload, fingerprintLocalWorkspaceSyncPreparedPlan, isLocalWorkspaceSyncPullFairnessDue, } from '../coordinator/localWorkspaceSyncRunnerState.js';
2
+ import { createLocalWorkspaceSyncPendingV2Push, decodeWorkspaceSyncPayload, fingerprintLocalWorkspaceSyncPreparedPlan, isLocalWorkspaceSyncPullFairnessDue, upgradeLocalWorkspaceSyncPendingV2PushSettlement, } from '../coordinator/localWorkspaceSyncRunnerState.js';
3
3
  import { isTransientWorkspaceSyncStatus, runWorkspacePullSyncService, runWorkspacePushSyncService, } from '../syncService.js';
4
4
  import { hydrateWorkspaceSyncV3AttachmentAsset } from '../v3/workspaceSyncV3AttachmentAssetHydration.js';
5
5
  import { runWorkspaceSyncV3CombinedProjectionCycle } from '../v3/workspaceSyncV3CombinedFeedOrchestrator.js';
6
6
  import { runWorkspaceSyncV3InitiativeProjectionCycle } from '../v3/workspaceSyncV3FeedOrchestrator.js';
7
7
  import { normalizeWorkspaceSyncV2ProjectionExclusions } from '../v3/workspaceSyncV2ProjectionExclusions.js';
8
8
  import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
9
+ import { authoritativeV2ApplyFailureMessage, } from './workspaceSyncEngineLocalServices.js';
9
10
  import { combinedAttachmentAssetHydrationId, createWorkspaceSyncV3TransferBindings, } from './workspaceSyncEngineTransfers.js';
10
11
  import { createWorkspaceSyncTransferEvidence, } from './workspaceSyncTransferEvidence.js';
11
12
  const NOOP_CLOUD_RESOLVER = (path) => path;
@@ -13,6 +14,7 @@ const RETRY_BASE_DELAY_MS = 1_000;
13
14
  const RETRY_MAX_DELAY_MS = 5 * 60_000;
14
15
  const COMBINED_FEED_COVERED_OUTBOX_BLOCK = 'WORKSPACE_SYNC_V3_COVERED_LOCAL_OPERATIONS';
15
16
  const REPAIR_OWNERSHIP_FINGERPRINT_VERSION = 2;
17
+ const NON_APPLYING_ACKNOWLEDGEMENT_CHECKPOINT_INTERVAL = 64;
16
18
  class WorkspaceSyncEngineServerRunnerOperationError extends Error {
17
19
  code;
18
20
  retryAfterMs;
@@ -513,7 +515,9 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
513
515
  ? 'repair'
514
516
  : 'push';
515
517
  activeRetryKind = pushRetryKind;
516
- persist({ ...checkpoint, controlState: 'pushing' });
518
+ if (checkpoint.controlState !== 'pushing') {
519
+ persist({ ...checkpoint, controlState: 'pushing' });
520
+ }
517
521
  let payload;
518
522
  let signature;
519
523
  if (checkpoint.pendingV2Push) {
@@ -523,6 +527,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
523
527
  forceAllAiProfiles: checkpoint.pendingV2Push.forceAllAiProfiles,
524
528
  repairMode: checkpoint.pendingV2Push.repairMode,
525
529
  };
530
+ if (checkpoint.pendingV2Push.preparedPlan
531
+ && checkpoint.pendingV2Push.settlementVersion !== 1) {
532
+ persist({
533
+ ...checkpoint,
534
+ pendingV2Push: upgradeLocalWorkspaceSyncPendingV2PushSettlement(checkpoint.pendingV2Push),
535
+ });
536
+ }
526
537
  }
527
538
  else {
528
539
  const forcedContentPaths = pushRetryKind === 'v2-content-push'
@@ -551,11 +562,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
551
562
  persist({ ...checkpoint, pendingV2Push });
552
563
  }
553
564
  if (checkpoint.remoteHintObservedAt) {
554
- persist({
565
+ checkpoint = {
555
566
  ...checkpoint,
556
567
  consecutivePushesWhilePullDue: Math.min(Number.MAX_SAFE_INTEGER, checkpoint.consecutivePushesWhilePullDue + 1),
557
- });
568
+ };
558
569
  }
570
+ let persistedAcknowledgementCount = checkpoint.pendingV2Push
571
+ ?.acknowledgedNonApplyingBatchOperationIdentities.length || 0;
559
572
  const result = await runWorkspacePushSyncService({
560
573
  resolveCloudAuthUrl: NOOP_CLOUD_RESOLVER,
561
574
  workspaceId,
@@ -567,29 +580,33 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
567
580
  preparedPlan: checkpoint.pendingV2Push?.preparedPlan,
568
581
  acknowledgedNonApplyingBatchOperationIdentities: checkpoint.pendingV2Push
569
582
  ?.acknowledgedNonApplyingBatchOperationIdentities,
583
+ settledBatchOperationIdentities: checkpoint.pendingV2Push?.settledBatchOperationIdentities,
570
584
  onPreparedPlan: ({ plan, acknowledgedOperationIdentities, }) => {
571
585
  const pendingV2Push = checkpoint.pendingV2Push;
572
586
  if (!pendingV2Push) {
573
587
  throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push disappeared while recording its prepared plan.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
574
588
  }
589
+ const preparedPendingV2Push = {
590
+ ...pendingV2Push,
591
+ preparedPlan: plan,
592
+ preparedPlanFingerprint: fingerprintLocalWorkspaceSyncPreparedPlan(plan),
593
+ acknowledgedNonApplyingBatchOperationIdentities: [
594
+ ...acknowledgedOperationIdentities,
595
+ ],
596
+ };
575
597
  persist({
576
598
  ...checkpoint,
577
- pendingV2Push: {
578
- ...pendingV2Push,
579
- preparedPlan: plan,
580
- preparedPlanFingerprint: fingerprintLocalWorkspaceSyncPreparedPlan(plan),
581
- acknowledgedNonApplyingBatchOperationIdentities: [
582
- ...acknowledgedOperationIdentities,
583
- ],
584
- },
599
+ pendingV2Push: upgradeLocalWorkspaceSyncPendingV2PushSettlement(preparedPendingV2Push),
585
600
  });
601
+ persistedAcknowledgementCount =
602
+ acknowledgedOperationIdentities.length;
586
603
  },
587
604
  onNonApplyingBatchAcknowledged: ({ acknowledgedOperationIdentities }) => {
588
605
  const pendingV2Push = checkpoint.pendingV2Push;
589
606
  if (!pendingV2Push) {
590
607
  throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push disappeared while recording batch progress.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
591
608
  }
592
- persist({
609
+ checkpoint = {
593
610
  ...checkpoint,
594
611
  pendingV2Push: {
595
612
  ...pendingV2Push,
@@ -597,19 +614,93 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
597
614
  ...acknowledgedOperationIdentities,
598
615
  ],
599
616
  },
617
+ };
618
+ if (acknowledgedOperationIdentities.length
619
+ - persistedAcknowledgementCount
620
+ >= NON_APPLYING_ACKNOWLEDGEMENT_CHECKPOINT_INTERVAL) {
621
+ persist(checkpoint);
622
+ persistedAcknowledgementCount =
623
+ acknowledgedOperationIdentities.length;
624
+ }
625
+ },
626
+ onAcceptedBatchSettled: async ({ operationIdentity, settlementIdentityFingerprint, appliedTaskUpserts, transferReceipt, pushBoundary, excludedProjections, }) => {
627
+ const pendingV2Push = checkpoint.pendingV2Push;
628
+ if (!pendingV2Push
629
+ || pendingV2Push.settlementVersion !== 1
630
+ || !pendingV2Push.settledBatchOperationIdentities
631
+ || !pendingV2Push.settledBatchContributions) {
632
+ throw new WorkspaceSyncEngineServerRunnerOperationError('The frozen V2 push settlement checkpoint is unavailable.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
633
+ }
634
+ if (pendingV2Push.settledBatchOperationIdentities.includes(operationIdentity)) {
635
+ throw new WorkspaceSyncEngineServerRunnerOperationError('The accepted V2 push page was already settled locally.', 'SYNC_RUNNER_PUSH_CHECKPOINT_INVALID');
636
+ }
637
+ if (checkpoint.retry?.kind !== pushRetryKind) {
638
+ setRetry(pushRetryKind, 'Accepted V2 push page local settlement is pending.');
639
+ }
640
+ const completionGroup = options.remoteServices.buildV2PushApplyCompletionGroup({
641
+ workspaceId,
642
+ pushBoundary,
643
+ receipts: [transferReceipt],
644
+ });
645
+ if (!completionGroup) {
646
+ throw new WorkspaceSyncEngineServerRunnerOperationError('Accepted V2 push page is missing an atomic local apply completion group.', 'SYNC_RUNNER_PUSH_APPLY_COMPLETION_INVALID');
647
+ }
648
+ const nextCheckpoint = {
649
+ ...checkpoint,
650
+ pendingV2Push: {
651
+ ...checkpoint.pendingV2Push,
652
+ settledBatchOperationIdentities: [
653
+ ...checkpoint.pendingV2Push
654
+ .settledBatchOperationIdentities,
655
+ operationIdentity,
656
+ ],
657
+ settledBatchContributions: [
658
+ ...checkpoint.pendingV2Push
659
+ .settledBatchContributions,
660
+ {
661
+ operationIdentity,
662
+ settlementIdentityFingerprint,
663
+ appliedTaskUpserts: structuredClone(appliedTaskUpserts),
664
+ },
665
+ ],
666
+ },
667
+ };
668
+ const commitState = {};
669
+ const applyResult = await localServices.applyV2Batch(workspaceId, appliedTaskUpserts.map((entry) => ({
670
+ op: 'upsert',
671
+ archived: entry.archived === true,
672
+ task: entry.task,
673
+ ...(entry.durableRevision
674
+ ? { durableRevision: entry.durableRevision }
675
+ : {}),
676
+ })), {
677
+ repairMode: attemptOptions.repairMode,
678
+ excludedProjections,
679
+ completionGroup,
680
+ commitServerCheckpoint: () => {
681
+ const persisted = input.persistCheckpoint(nextCheckpoint);
682
+ commitState.checkpoint = structuredClone(persisted.checkpoint);
683
+ return commitState.checkpoint;
684
+ },
600
685
  });
686
+ if (!applyResult.ok || !commitState.checkpoint) {
687
+ throw new WorkspaceSyncEngineServerRunnerOperationError(!applyResult.ok
688
+ ? authoritativeV2ApplyFailureMessage(applyResult)
689
+ : 'Accepted V2 push page did not commit its settlement checkpoint.', 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
690
+ }
691
+ checkpoint = structuredClone(commitState.checkpoint);
601
692
  },
602
693
  });
603
694
  onResult?.(result);
604
695
  if (!result.success) {
605
696
  if (result.batchProgress && checkpoint.pendingV2Push) {
606
- persist({
697
+ checkpoint = {
607
698
  ...checkpoint,
608
699
  pendingV2Push: {
609
700
  ...checkpoint.pendingV2Push,
610
701
  lastBatchProgress: structuredClone(result.batchProgress),
611
702
  },
612
- });
703
+ };
613
704
  }
614
705
  const message = pushFailureMessage(result);
615
706
  if (isAuthFailure(result)) {
@@ -617,7 +708,19 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
617
708
  }
618
709
  fail(pushRetryKind, message, 'SYNC_RUNNER_PUSH_FAILED', result.retryAfterMs);
619
710
  }
620
- for (const entry of result.appliedTaskUpserts || []) {
711
+ const serviceTaskUpserts = result.appliedTaskUpserts || [];
712
+ const pushTransferReceipts = result.pushTransferReceipts || [];
713
+ const settledTaskUpserts = checkpoint.pendingV2Push
714
+ ?.settledBatchContributions
715
+ ?.flatMap((entry) => entry.appliedTaskUpserts) || [];
716
+ const terminalTaskUpserts = pushTransferReceipts.length > 0
717
+ ? serviceTaskUpserts
718
+ : [];
719
+ result.appliedTaskUpserts = [
720
+ ...settledTaskUpserts,
721
+ ...terminalTaskUpserts,
722
+ ];
723
+ for (const entry of result.appliedTaskUpserts) {
621
724
  const taskId = String(entry.task.id || '').trim();
622
725
  const watermark = String(entry.task.updatedAt || entry.task.createdAt || '').trim();
623
726
  if (!taskId || !watermark)
@@ -632,14 +735,6 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
632
735
  result,
633
736
  });
634
737
  const syncedAt = result.syncedAt || input.now;
635
- const appliedTaskUpserts = result.appliedTaskUpserts || [];
636
- const pushTransferReceipts = result.pushTransferReceipts || [];
637
- if (appliedTaskUpserts.length > 0) {
638
- // Persist the retry obligation before entering the atomic local
639
- // apply. If that transaction rolls back after its checkpoint
640
- // callback, the runner resumes from this durable revision.
641
- setRetry(pushRetryKind, 'Authoritative V2 push echo local commit is pending.');
642
- }
643
738
  const baseNextCheckpoint = {
644
739
  ...checkpoint,
645
740
  controlState: 'pushing',
@@ -653,10 +748,8 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
653
748
  const nextCheckpoint = transformTerminalCheckpoint
654
749
  ? transformTerminalCheckpoint(baseNextCheckpoint, result, signature)
655
750
  : baseNextCheckpoint;
656
- if (appliedTaskUpserts.length > 0) {
657
- const abandonPushReceipts = async (errorCode) => {
658
- if (pushTransferReceipts.length === 0)
659
- return;
751
+ if (terminalTaskUpserts.length > 0) {
752
+ const abandonTerminalReceipts = async (errorCode = 'WORKSPACE_SYNC_V2_PUSH_AUTHORITATIVE_APPLY_FAILED') => {
660
753
  try {
661
754
  await options.remoteServices.abandonTransferReceipts({
662
755
  workspaceId,
@@ -666,10 +759,9 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
666
759
  }
667
760
  catch {
668
761
  // The durable retry checkpoint remains authoritative.
669
- // The next exact replay will recover the retained or
670
- // ambiguous permit through the gateway.
671
762
  }
672
763
  };
764
+ setRetry(pushRetryKind, 'Authoritative V2 push echo local commit is pending.');
673
765
  const completionGroup = result.pushBoundary
674
766
  ? options.remoteServices.buildV2PushApplyCompletionGroup({
675
767
  workspaceId,
@@ -678,13 +770,13 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
678
770
  })
679
771
  : undefined;
680
772
  if (!completionGroup) {
681
- await abandonPushReceipts('WORKSPACE_SYNC_V2_PUSH_APPLY_COMPLETION_INVALID');
773
+ await abandonTerminalReceipts('WORKSPACE_SYNC_V2_PUSH_APPLY_COMPLETION_INVALID');
682
774
  throw new WorkspaceSyncEngineServerRunnerOperationError('Accepted V2 push echoes are missing an atomic local apply completion group.', 'SYNC_RUNNER_PUSH_APPLY_COMPLETION_INVALID');
683
775
  }
684
776
  const commitState = {};
685
777
  let applyResult;
686
778
  try {
687
- applyResult = await localServices.applyV2Batch(workspaceId, appliedTaskUpserts.map((entry) => ({
779
+ applyResult = await localServices.applyV2Batch(workspaceId, terminalTaskUpserts.map((entry) => ({
688
780
  op: 'upsert',
689
781
  archived: entry.archived === true,
690
782
  task: entry.task,
@@ -692,32 +784,31 @@ export function createWorkspaceSyncEngineServerRunnerOperations(options) {
692
784
  ? { durableRevision: entry.durableRevision }
693
785
  : {}),
694
786
  })), {
695
- ...(completionGroup ? { completionGroup } : {}),
787
+ repairMode: attemptOptions.repairMode,
788
+ excludedProjections: result.effectiveV2ExcludedProjections,
789
+ completionGroup,
696
790
  commitServerCheckpoint: () => {
697
791
  const persisted = input.persistCheckpoint(nextCheckpoint, {
698
792
  beforeCommit: beforeTerminalPersist
699
793
  ? () => beforeTerminalPersist(result)
700
794
  : undefined,
701
795
  });
702
- commitState.checkpoint =
703
- structuredClone(persisted.checkpoint);
796
+ commitState.checkpoint = structuredClone(persisted.checkpoint);
704
797
  return commitState.checkpoint;
705
798
  },
706
799
  });
707
800
  }
708
801
  catch (error) {
709
- await abandonPushReceipts('WORKSPACE_SYNC_V2_PUSH_AUTHORITATIVE_APPLY_FAILED');
802
+ await abandonTerminalReceipts();
710
803
  throw new WorkspaceSyncEngineServerRunnerOperationError(errorMessage(error, 'Authoritative V2 push echo apply failed.'), 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
711
804
  }
712
805
  if (!applyResult.ok || !commitState.checkpoint) {
713
- await abandonPushReceipts('WORKSPACE_SYNC_V2_PUSH_AUTHORITATIVE_APPLY_FAILED');
714
- throw new WorkspaceSyncEngineServerRunnerOperationError(`Authoritative V2 push echo apply failed (${applyResult.status || 0}).`, 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
715
- }
716
- const committedCheckpoint = commitState.checkpoint;
717
- if (!committedCheckpoint) {
718
- throw new WorkspaceSyncEngineServerRunnerOperationError('The authoritative V2 push echo apply did not commit its runner checkpoint.', 'SYNC_RUNNER_PUSH_CHECKPOINT_NOT_COMMITTED');
806
+ await abandonTerminalReceipts();
807
+ throw new WorkspaceSyncEngineServerRunnerOperationError(!applyResult.ok
808
+ ? authoritativeV2ApplyFailureMessage(applyResult)
809
+ : 'Authoritative V2 push echo did not commit the server checkpoint.', 'SYNC_RUNNER_PUSH_AUTHORITATIVE_APPLY_FAILED');
719
810
  }
720
- checkpoint = structuredClone(committedCheckpoint);
811
+ checkpoint = structuredClone(commitState.checkpoint);
721
812
  }
722
813
  else {
723
814
  persist(nextCheckpoint, {
@@ -28,6 +28,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
28
28
  lastPushedInitiativeWatermarks: new Map(),
29
29
  lastPushedWorkstreamIds: new Set(),
30
30
  lastPushedWorkstreamWatermarks: new Map(),
31
+ lastPushedPlanningIdentityWatermarks: new Map(),
31
32
  lastPushedAiProfileIds: new Set(),
32
33
  lastPushedAiProfileWatermarks: new Map(),
33
34
  lastPushedAiProfileChangeKeys: new Map(),
@@ -57,6 +58,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
57
58
  || snapshot.taxonomyStateFingerprint === currentTaxonomyStateFingerprint;
58
59
  const initiativeWatermarks = stringMap(snapshot.initiativeWatermarks);
59
60
  const workstreamWatermarks = stringMap(snapshot.workstreamWatermarks);
61
+ const planningIdentityWatermarks = stringMap(snapshot.planningIdentityWatermarks);
60
62
  const aiProfileWatermarks = stringMap(snapshot.aiProfileWatermarks);
61
63
  const documentWatermarks = stringMap(snapshot.documentWatermarks);
62
64
  const assetWatermarks = stringMap(snapshot.assetWatermarks);
@@ -76,6 +78,7 @@ export function toWorkspaceSyncV2PushBaseline(snapshot, currentTaxonomyStateFing
76
78
  lastPushedInitiativeWatermarks: initiativeWatermarks,
77
79
  lastPushedWorkstreamIds: new Set(workstreamWatermarks.keys()),
78
80
  lastPushedWorkstreamWatermarks: workstreamWatermarks,
81
+ lastPushedPlanningIdentityWatermarks: planningIdentityWatermarks,
79
82
  lastPushedAiProfileIds: new Set(aiProfileWatermarks.keys()),
80
83
  lastPushedAiProfileWatermarks: aiProfileWatermarks,
81
84
  lastPushedAiProfileChangeKeys: stringMap(snapshot.aiProfileChangeKeys),
@@ -146,6 +149,9 @@ export function createWorkspaceSyncEngineServerPushCandidateProvider(snapshotRea
146
149
  taskRelationshipChangeKeys: sortedEntries(taskRelationshipChangeKeys),
147
150
  initiativeWatermarks: sortedEntries(result.currentInitiativeWatermarks),
148
151
  workstreamWatermarks: sortedEntries(result.currentWorkstreamWatermarks),
152
+ planningIdentityWatermarks: sortedEntries(result.currentPlanningIdentityWatermarks
153
+ || payload.currentPlanningIdentityWatermarks
154
+ || stringMap(previousBaseline?.planningIdentityWatermarks)),
149
155
  aiProfileWatermarks: sortedEntries(result.currentAiProfileWatermarks),
150
156
  aiProfileChangeKeys: sortedEntries(aiProfileChangeKeys),
151
157
  taskforceAgentWatermarks: sortedEntries(result.currentTaskforceAgentWatermarks),
@@ -3,7 +3,7 @@ import type { WorkspaceSyncPayload } from '../workspaceSyncModel.js';
3
3
  import type { WorkspaceSyncPhase } from '../workspaceSyncState.js';
4
4
  import type { WorkspaceSyncV3CombinedCoverageSelector } from '../v3/workspaceSyncV3CombinedWireContract.js';
5
5
  import type { WorkspaceSyncEngineRuntime } from './workspaceSyncEngineRuntime.js';
6
- import type { WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
6
+ import { type WorkspaceSyncEngineLocalServices } from './workspaceSyncEngineLocalServices.js';
7
7
  import type { WorkspaceSyncEngineRemoteServices, WorkspaceSyncEngineRemoteTransferReceipt } from './workspaceSyncEngineRemoteServices.js';
8
8
  export type { PendingWorkspacePushReplay } from './workspaceSyncEngineTransferTypes.js';
9
9
  type StateSetter<T> = (value: T | ((current: T) => T)) => void;