@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
@@ -111,6 +111,16 @@ if (!runtimeOptions.deadlines) {
111
111
  }
112
112
  const pool = createPool(connectionString, runtimeOptions.deadlines);
113
113
  const txClients = new Map();
114
+ function withPoolSnapshot(payload) {
115
+ return {
116
+ ...payload,
117
+ pool: {
118
+ totalCount: Math.max(0, Number(pool.totalCount) || 0),
119
+ idleCount: Math.max(0, Number(pool.idleCount) || 0),
120
+ waitingCount: Math.max(0, Number(pool.waitingCount) || 0),
121
+ },
122
+ };
123
+ }
114
124
  async function handleMessage(message) {
115
125
  const { payload } = message;
116
126
  const txId = payload.txId ? String(payload.txId) : null;
@@ -174,10 +184,18 @@ parentPort.on('message', async (message) => {
174
184
  return;
175
185
  }
176
186
  const response = await handleMessage(message);
177
- writeResponse(message.statusBuffer, message.responseBuffer, response);
187
+ writeResponse(message.statusBuffer, message.responseBuffer, withPoolSnapshot(response));
178
188
  }
179
189
  catch (error) {
180
190
  const messageText = error instanceof Error ? error.message : String(error);
181
- writeResponse(message.statusBuffer, message.responseBuffer, { ok: false, error: messageText });
191
+ const databaseErrorCode = error && typeof error === 'object'
192
+ && typeof error.code === 'string'
193
+ ? String(error.code)
194
+ : undefined;
195
+ writeResponse(message.statusBuffer, message.responseBuffer, withPoolSnapshot({
196
+ ok: false,
197
+ error: messageText,
198
+ ...(databaseErrorCode ? { databaseErrorCode } : {}),
199
+ }));
182
200
  }
183
201
  });
@@ -10,13 +10,20 @@ export type PostgresWorkerQueryResult = {
10
10
  rows: Record<string, unknown>[];
11
11
  rowCount?: number;
12
12
  };
13
+ export type PostgresWorkerPoolSnapshot = {
14
+ totalCount: number;
15
+ idleCount: number;
16
+ waitingCount: number;
17
+ };
13
18
  export type PostgresWorkerResponsePayload = {
14
19
  ok: boolean;
15
20
  result?: PostgresWorkerQueryResult;
16
21
  error?: string;
17
22
  errorCode?: 'RESPONSE_BUFFER_TOO_SMALL';
23
+ databaseErrorCode?: string;
18
24
  requiredBytes?: number;
19
25
  responseToken?: string;
26
+ pool?: PostgresWorkerPoolSnapshot;
20
27
  };
21
28
  export type PostgresWorkerDeadlines = {
22
29
  responseTimeoutMs: number;
@@ -0,0 +1,31 @@
1
+ import type { DatabaseAdapter } from './databaseAdapter.js';
2
+ export interface TaskforceAgentConnectionBindingRecord {
3
+ tenantId: string;
4
+ workspaceId: string;
5
+ agentId: string;
6
+ connectionId: string;
7
+ ownerUserId: string;
8
+ providerKey: string;
9
+ modelSource: string;
10
+ createdByUserId: string;
11
+ updatedByUserId: string;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ export declare class TaskforceAgentConnectionBindingStore {
16
+ private readonly db;
17
+ private readonly tenantId;
18
+ private readonly now;
19
+ constructor(db: DatabaseAdapter, tenantId: string, now?: () => Date);
20
+ get(workspaceIdRaw: string, agentIdRaw: string): TaskforceAgentConnectionBindingRecord | null;
21
+ bind(input: {
22
+ workspaceId: string;
23
+ agentId: string;
24
+ connectionId: string;
25
+ ownerUserId: string;
26
+ providerKey: string;
27
+ modelSource: string;
28
+ actorUserId: string;
29
+ }): TaskforceAgentConnectionBindingRecord | null;
30
+ clear(workspaceIdRaw: string, agentIdRaw: string, ownerUserIdRaw: string): boolean;
31
+ }
@@ -0,0 +1,84 @@
1
+ function normalizeRequired(value, label) {
2
+ const normalized = String(value || '').trim();
3
+ if (!normalized)
4
+ throw new Error(`${label} is required.`);
5
+ return normalized;
6
+ }
7
+ function mapRow(row) {
8
+ return {
9
+ tenantId: String(row.tenant_id || ''),
10
+ workspaceId: String(row.workspace_id || ''),
11
+ agentId: String(row.agent_id || ''),
12
+ connectionId: String(row.connection_id || ''),
13
+ ownerUserId: String(row.owner_user_id || ''),
14
+ providerKey: String(row.provider_key || ''),
15
+ modelSource: String(row.model_source || ''),
16
+ createdByUserId: String(row.created_by_user_id || ''),
17
+ updatedByUserId: String(row.updated_by_user_id || ''),
18
+ createdAt: String(row.created_at || ''),
19
+ updatedAt: String(row.updated_at || ''),
20
+ };
21
+ }
22
+ export class TaskforceAgentConnectionBindingStore {
23
+ db;
24
+ tenantId;
25
+ now;
26
+ constructor(db, tenantId, now = () => new Date()) {
27
+ this.db = db;
28
+ this.tenantId = tenantId;
29
+ this.now = now;
30
+ }
31
+ get(workspaceIdRaw, agentIdRaw) {
32
+ const workspaceId = String(workspaceIdRaw || '').trim();
33
+ const agentId = String(agentIdRaw || '').trim();
34
+ if (!workspaceId || !agentId)
35
+ return null;
36
+ const row = this.db.prepare(`
37
+ SELECT *
38
+ FROM taskforce_agent_connection_bindings
39
+ WHERE tenant_id = ? AND workspace_id = ? AND agent_id = ?
40
+ LIMIT 1
41
+ `).get(this.tenantId, workspaceId, agentId);
42
+ return row ? mapRow(row) : null;
43
+ }
44
+ bind(input) {
45
+ const workspaceId = normalizeRequired(input.workspaceId, 'Workspace ID');
46
+ const agentId = normalizeRequired(input.agentId, 'Agent ID');
47
+ const connectionId = normalizeRequired(input.connectionId, 'Connection ID');
48
+ const ownerUserId = normalizeRequired(input.ownerUserId, 'Connection owner');
49
+ const providerKey = normalizeRequired(input.providerKey, 'Provider key');
50
+ const modelSource = normalizeRequired(input.modelSource, 'Model source');
51
+ const actorUserId = normalizeRequired(input.actorUserId, 'Actor user');
52
+ const now = this.now().toISOString();
53
+ const result = this.db.prepare(`
54
+ INSERT INTO taskforce_agent_connection_bindings (
55
+ tenant_id, workspace_id, agent_id, connection_id, owner_user_id,
56
+ provider_key, model_source, created_by_user_id, updated_by_user_id,
57
+ created_at, updated_at
58
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
59
+ ON CONFLICT (tenant_id, workspace_id, agent_id) DO UPDATE SET
60
+ connection_id = excluded.connection_id,
61
+ owner_user_id = excluded.owner_user_id,
62
+ provider_key = excluded.provider_key,
63
+ model_source = excluded.model_source,
64
+ updated_by_user_id = excluded.updated_by_user_id,
65
+ updated_at = excluded.updated_at
66
+ WHERE taskforce_agent_connection_bindings.owner_user_id = excluded.owner_user_id
67
+ `).run(this.tenantId, workspaceId, agentId, connectionId, ownerUserId, providerKey, modelSource, actorUserId, actorUserId, now, now);
68
+ if (Number(result.changes || 0) === 0)
69
+ return null;
70
+ return this.get(workspaceId, agentId);
71
+ }
72
+ clear(workspaceIdRaw, agentIdRaw, ownerUserIdRaw) {
73
+ const workspaceId = String(workspaceIdRaw || '').trim();
74
+ const agentId = String(agentIdRaw || '').trim();
75
+ const ownerUserId = String(ownerUserIdRaw || '').trim();
76
+ if (!workspaceId || !agentId || !ownerUserId)
77
+ return false;
78
+ const result = this.db.prepare(`
79
+ DELETE FROM taskforce_agent_connection_bindings
80
+ WHERE tenant_id = ? AND workspace_id = ? AND agent_id = ? AND owner_user_id = ?
81
+ `).run(this.tenantId, workspaceId, agentId, ownerUserId);
82
+ return Number(result.changes || 0) > 0;
83
+ }
84
+ }
@@ -200,7 +200,9 @@ export declare class WorkflowStore {
200
200
  installAssignmentForSync(workspaceIdRaw: string, snapshot: WorkflowAssignmentSyncRecord, options: {
201
201
  authority: 'pending-intent' | 'cloud-execution';
202
202
  expectedTaskId: string;
203
+ replaceAuthoritativeHistory?: boolean;
203
204
  }): WorkflowExecutionStateRecord;
205
+ private runAssignmentSyncTransaction;
204
206
  appendExecutionTransition(input: {
205
207
  workspaceId: string;
206
208
  executionId: string;
@@ -759,7 +759,7 @@ export class WorkflowStore {
759
759
  || snapshot.execution.updatedAt !== snapshotProjection.updatedAt) {
760
760
  throw new WorkflowAssignmentSyncConflictError('Workflow assignment execution does not match its event history.');
761
761
  }
762
- return this.db.transaction(() => {
762
+ return this.runAssignmentSyncTransaction(Boolean(options.authority === 'cloud-execution' && options.replaceAuthoritativeHistory), () => {
763
763
  const existingForTask = this.getActiveExecutionForTask(workspaceId, snapshot.execution.taskId);
764
764
  if (existingForTask && existingForTask.id !== snapshot.execution.id) {
765
765
  throw new WorkflowAssignmentSyncConflictError('Task already has a different active workflow execution.');
@@ -852,7 +852,14 @@ export class WorkflowStore {
852
852
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
853
853
  `).run(snapshot.execution.id, this.tenantId, workspaceId, snapshot.execution.taskId, snapshot.template.id, snapshot.version.id, snapshot.execution.status, snapshot.execution.currentStepId || null, snapshot.execution.createdByActorId || null, snapshot.execution.updatedByActorId || null, snapshot.execution.createdAt, snapshot.execution.updatedAt, snapshot.execution.startedAt || null, snapshot.execution.completedAt || null, snapshot.execution.endedAt || null, snapshot.execution.deletedAt || null);
854
854
  }
855
- const canonicalEvents = this.listExecutionEvents(workspaceId, snapshot.execution.id);
855
+ let canonicalEvents = this.listExecutionEvents(workspaceId, snapshot.execution.id);
856
+ if (options.authority === 'cloud-execution' && options.replaceAuthoritativeHistory) {
857
+ this.db.prepare(`
858
+ DELETE FROM workflow_execution_events
859
+ WHERE tenant_id = ? AND workspace_id = ? AND workflow_execution_id = ?
860
+ `).run(this.tenantId, workspaceId, snapshot.execution.id);
861
+ canonicalEvents = [];
862
+ }
856
863
  const authoritativeHistoryIsExactPrefix = options.authority === 'cloud-execution'
857
864
  && snapshot.events.length < canonicalEvents.length
858
865
  && snapshot.events.every((event, index) => canonicalJson(event) === canonicalJson(canonicalEvents[index]));
@@ -908,6 +915,36 @@ export class WorkflowStore {
908
915
  `).run(snapshotProjection.status, snapshotProjection.currentStepId || null, snapshot.execution.updatedByActorId || null, snapshotProjection.updatedAt, snapshotProjection.startedAt || null, snapshotProjection.completedAt || null, snapshotProjection.endedAt || null, snapshot.execution.deletedAt || null, this.tenantId, workspaceId, snapshot.execution.id);
909
916
  }
910
917
  return this.getExecutionStateSnapshot(workspaceId, snapshot.execution.id);
918
+ });
919
+ }
920
+ runAssignmentSyncTransaction(replaceAuthoritativeHistory, apply) {
921
+ return this.db.transaction(() => {
922
+ if (!replaceAuthoritativeHistory)
923
+ return apply();
924
+ if (this.db.provider === 'postgres') {
925
+ throw new WorkflowAssignmentSyncConflictError('Authoritative workflow history replacement is local-runtime only.');
926
+ }
927
+ this.db.exec(`
928
+ DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_update;
929
+ DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_delete;
930
+ `);
931
+ try {
932
+ return apply();
933
+ }
934
+ finally {
935
+ this.db.exec(`
936
+ CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_update
937
+ BEFORE UPDATE ON workflow_execution_events
938
+ BEGIN
939
+ SELECT RAISE(ABORT, 'Workflow execution events are append-only');
940
+ END;
941
+ CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_delete
942
+ BEFORE DELETE ON workflow_execution_events
943
+ BEGIN
944
+ SELECT RAISE(ABORT, 'Workflow execution events are append-only');
945
+ END;
946
+ `);
947
+ }
911
948
  })();
912
949
  }
913
950
  appendExecutionTransition(input) {
@@ -558,8 +558,10 @@ export async function prepareWorkspacePushChanges(input, dependencies = {}) {
558
558
  .filter((taskId) => taskUpsertIdSet.has(taskId) && !activeV3TaskCreateIds.has(taskId));
559
559
  }
560
560
  const ownershipFilteredChanges = input.changes.filter((change) => {
561
- if (change.op === 'upsert')
562
- return !activeV3TaskCreateIds.has(String(change.task?.id || '').trim());
561
+ if (change.op === 'upsert') {
562
+ const taskId = String(change.task?.id || '').trim();
563
+ return !activeV3TaskCreateIds.has(taskId) && !activeV3TaskDeleteIds.has(taskId);
564
+ }
563
565
  if (change.op === 'delete') {
564
566
  return !activeV3TaskDeleteIds.has(String(change.taskId || '').trim());
565
567
  }
@@ -32,6 +32,11 @@ export function listWorkspaceSyncDocumentReviewCommentsSnapshot(deps, workspaceI
32
32
  authorActorId: comment.authorActorId,
33
33
  updatedByActorId: comment.updatedByActorId,
34
34
  deletedByActorId: comment.deletedByActorId,
35
+ parentCommentId: comment.parentCommentId,
36
+ threadStatus: comment.threadStatus,
37
+ threadStatusUpdatedAt: comment.threadStatusUpdatedAt,
38
+ resolvedAt: comment.resolvedAt,
39
+ resolvedByActorId: comment.resolvedByActorId,
35
40
  createdAt: comment.createdAt,
36
41
  updatedAt: comment.updatedAt,
37
42
  deletedAt: comment.deletedAt,
@@ -1,4 +1,4 @@
1
- import { randomUUID } from 'crypto';
1
+ import { createHash, randomUUID } from 'crypto';
2
2
  import { assertSynchronousTransactionResult, } from '../../storage/databaseAdapter.js';
3
3
  import { validateWorkspaceSyncEngineTransferCompletionGroup, } from '../engine/workspaceSyncEngineTransferCompletion.js';
4
4
  import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
@@ -1407,36 +1407,67 @@ export class LocalSyncExecutionPermitStore {
1407
1407
  const requiredAction = mutationReplay
1408
1408
  ? 'replay-operation-then-reconcile'
1409
1409
  : 'refetch-from-committed-cursor';
1410
- const coalescesRepeatedApplyFailure = errorCode === 'WORKSPACE_SYNC_V3_APPLY_NOT_COMMITTED'
1410
+ const coalescesLegacyApplyFailure = errorCode === 'WORKSPACE_SYNC_V3_APPLY_NOT_COMMITTED'
1411
1411
  || errorCode === 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED';
1412
- if (coalescesRepeatedApplyFailure) {
1413
- const committedBoundary = canonicalWorkspaceSyncJson(permit.lastCommittedCursor);
1414
- const equivalentOpenObligation = this.db.prepare(`
1415
- SELECT obligation.*
1416
- FROM local_sync_recovery_obligations AS obligation
1417
- INNER JOIN local_sync_execution_permits AS origin
1418
- ON origin.permit_id = obligation.permit_id
1419
- WHERE obligation.workspace_id = ?
1420
- AND obligation.operation_class = ?
1421
- AND obligation.upstream_disposition = ?
1422
- AND obligation.required_action = ?
1423
- AND obligation.resolved_at IS NULL
1424
- AND origin.error_code = ?
1425
- ORDER BY obligation.created_at ASC
1426
- `).all(permit.workspaceId, permit.operationClass, disposition, requiredAction, errorCode).map(mapObligation).some((obligation) => ((obligation.operationIdentity || null) === (permit.operationIdentity || null)
1427
- && canonicalWorkspaceSyncJson(obligation.lastCommittedCursor) === committedBoundary));
1428
- if (equivalentOpenObligation)
1429
- return;
1412
+ const coalescingKey = mutationReplay || coalescesLegacyApplyFailure
1413
+ ? createHash('sha256').update(canonicalWorkspaceSyncJson(mutationReplay ? {
1414
+ workspaceId: permit.workspaceId,
1415
+ operationClass: permit.operationClass,
1416
+ operationIdentity: permit.operationIdentity || null,
1417
+ lastCommittedCursor: permit.lastCommittedCursor,
1418
+ requiredAction,
1419
+ } : {
1420
+ workspaceId: permit.workspaceId,
1421
+ operationClass: permit.operationClass,
1422
+ operationIdentity: permit.operationIdentity || null,
1423
+ upstreamDisposition: disposition,
1424
+ lastCommittedCursor: permit.lastCommittedCursor,
1425
+ requiredAction,
1426
+ errorCode,
1427
+ })).digest('hex')
1428
+ : null;
1429
+ // This store method normally runs inside the permit transition
1430
+ // transaction. The nested transaction gives PostgreSQL a savepoint
1431
+ // boundary while the partial unique index arbitrates concurrent
1432
+ // equivalent inserts without poisoning the outer transaction.
1433
+ let inserted = false;
1434
+ try {
1435
+ this.db.transaction(() => {
1436
+ this.db.prepare(`
1437
+ INSERT INTO local_sync_recovery_obligations (
1438
+ obligation_id, permit_id, workspace_id, operation_class,
1439
+ operation_identity, upstream_disposition,
1440
+ last_committed_cursor_json, required_action, coalescing_key,
1441
+ created_at, resolved_at
1442
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)
1443
+ `).run(this.createId(), permit.permitId, permit.workspaceId, permit.operationClass, permit.operationIdentity, disposition, permit.lastCommittedCursor === null
1444
+ ? null
1445
+ : JSON.stringify(permit.lastCommittedCursor), requiredAction, coalescingKey, this.now());
1446
+ inserted = true;
1447
+ })();
1448
+ }
1449
+ catch (error) {
1450
+ const existing = coalescingKey
1451
+ ? this.db.prepare(`
1452
+ SELECT obligation_id
1453
+ FROM local_sync_recovery_obligations
1454
+ WHERE coalescing_key = ? AND resolved_at IS NULL
1455
+ `).get(coalescingKey)
1456
+ : undefined;
1457
+ if (!existing?.obligation_id)
1458
+ throw error;
1430
1459
  }
1460
+ if (inserted || !coalescingKey)
1461
+ return;
1431
1462
  this.db.prepare(`
1432
- INSERT INTO local_sync_recovery_obligations (
1433
- obligation_id, permit_id, workspace_id, operation_class,
1434
- operation_identity, upstream_disposition, last_committed_cursor_json,
1435
- required_action, created_at, resolved_at
1436
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)
1437
- ON CONFLICT (permit_id) DO NOTHING
1438
- `).run(this.createId(), permit.permitId, permit.workspaceId, permit.operationClass, permit.operationIdentity, disposition, permit.lastCommittedCursor === null
1439
- ? null
1440
- : JSON.stringify(permit.lastCommittedCursor), requiredAction, this.now());
1463
+ UPDATE local_sync_recovery_obligations
1464
+ SET upstream_disposition = CASE
1465
+ WHEN upstream_disposition = 'accepted' OR ? = 'accepted' THEN 'accepted'
1466
+ WHEN upstream_disposition = 'unknown' OR ? = 'unknown' THEN 'unknown'
1467
+ WHEN upstream_disposition = 'rejected' OR ? = 'rejected' THEN 'rejected'
1468
+ ELSE upstream_disposition
1469
+ END
1470
+ WHERE coalescing_key = ? AND resolved_at IS NULL
1471
+ `).run(disposition, disposition, disposition, coalescingKey);
1441
1472
  }
1442
1473
  }
@@ -0,0 +1,10 @@
1
+ import type { LocalWorkspaceSyncPendingV2Push } from './localWorkspaceSyncRunnerState.js';
2
+ export interface LocalWorkspaceSyncPendingV2PushProgress {
3
+ effectiveTotalBatches: number;
4
+ settledBatches: number;
5
+ effectiveTotalChanges: number;
6
+ settledChanges: number;
7
+ remainingChanges: number;
8
+ firstUnsettledBatchIndex: number | null;
9
+ }
10
+ export declare function resolveLocalWorkspaceSyncPendingV2PushProgress(pending: LocalWorkspaceSyncPendingV2Push | null | undefined): LocalWorkspaceSyncPendingV2PushProgress | null;
@@ -0,0 +1,29 @@
1
+ export function resolveLocalWorkspaceSyncPendingV2PushProgress(pending) {
2
+ const plan = pending?.preparedPlan;
3
+ const settledIdentities = pending?.settledBatchOperationIdentities;
4
+ if (pending?.settlementVersion !== 1
5
+ || !plan
6
+ || !Array.isArray(settledIdentities)
7
+ || plan.batches.length !== plan.batchOperationIdentities.length
8
+ || new Set(plan.batchOperationIdentities).size !== plan.batchOperationIdentities.length
9
+ || new Set(settledIdentities).size !== settledIdentities.length
10
+ || settledIdentities.some((identity) => !plan.batchOperationIdentities.includes(identity))) {
11
+ return null;
12
+ }
13
+ const settled = new Set(settledIdentities);
14
+ const effectiveTotalChanges = plan.batches.reduce((total, batch) => total + batch.length, 0);
15
+ const settledChanges = plan.batches.reduce((total, batch, index) => (settled.has(plan.batchOperationIdentities[index])
16
+ ? total + batch.length
17
+ : total), 0);
18
+ const firstUnsettledBatchIndex = plan.batchOperationIdentities.findIndex((identity) => !settled.has(identity));
19
+ return {
20
+ effectiveTotalBatches: plan.batches.length,
21
+ settledBatches: settled.size,
22
+ effectiveTotalChanges,
23
+ settledChanges,
24
+ remainingChanges: effectiveTotalChanges - settledChanges,
25
+ firstUnsettledBatchIndex: firstUnsettledBatchIndex < 0
26
+ ? null
27
+ : firstUnsettledBatchIndex,
28
+ };
29
+ }
@@ -1,6 +1,6 @@
1
1
  import type { LocalSyncCoordinatorCommandRecord } from './localSyncCoordinatorTypes.js';
2
2
  import type { LocalSyncCoordinatorStore } from './localSyncCoordinatorStore.js';
3
- import { type LocalWorkspaceSyncRunnerCheckpoint, type LocalWorkspaceSyncRunnerState, type LocalWorkspaceSyncRunnerStateStore } from './localWorkspaceSyncRunnerState.js';
3
+ import { type LocalWorkspaceSyncRunnerCheckpoint, type LocalWorkspaceSyncRunnerRetryKind, type LocalWorkspaceSyncRunnerState, type LocalWorkspaceSyncRunnerStateStore } from './localWorkspaceSyncRunnerState.js';
4
4
  import type { WorkspaceSyncCredentialBroker } from './workspaceSyncCredentialBroker.js';
5
5
  export interface LocalWorkspaceSyncRunnerOperationInput {
6
6
  command: LocalSyncCoordinatorCommandRecord | null;
@@ -55,6 +55,7 @@ export declare class LocalWorkspaceSyncRunnerError extends Error {
55
55
  readonly code: 'SYNC_RUNNER_NOT_STARTED' | 'SYNC_RUNNER_ALREADY_STARTED' | 'SYNC_RUNNER_COORDINATOR_FENCE_INVALID' | 'SYNC_RUNNER_COMMAND_INVALID' | 'SYNC_RUNNER_COMMAND_DISABLED' | 'SYNC_RUNNER_DRAIN_TIMEOUT';
56
56
  constructor(message: string, code: 'SYNC_RUNNER_NOT_STARTED' | 'SYNC_RUNNER_ALREADY_STARTED' | 'SYNC_RUNNER_COORDINATOR_FENCE_INVALID' | 'SYNC_RUNNER_COMMAND_INVALID' | 'SYNC_RUNNER_COMMAND_DISABLED' | 'SYNC_RUNNER_DRAIN_TIMEOUT');
57
57
  }
58
+ export declare function canCoordinatorRecoveryPreemptRetry(kind: LocalWorkspaceSyncRunnerRetryKind): boolean;
58
59
  export declare class LocalWorkspaceSyncRunner {
59
60
  private readonly options;
60
61
  private context;
@@ -87,6 +88,7 @@ export declare class LocalWorkspaceSyncRunner {
87
88
  activate(): void;
88
89
  executeCommand(commandId: string): Promise<LocalSyncCoordinatorCommandRecord | null>;
89
90
  inspect(): Promise<void>;
91
+ recoverCoordinatorObligationsDue(isRecoveryStillRequired: () => boolean): Promise<void>;
90
92
  pullDue(): Promise<void>;
91
93
  retryDue(): Promise<void>;
92
94
  pushDue(): Promise<void>;
@@ -21,6 +21,14 @@ const CONTENT_PREREQUISITE_BYPASSED_RETRY_KINDS = new Set([
21
21
  'pull',
22
22
  'repair',
23
23
  ]);
24
+ const COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS = new Set([
25
+ 'pull',
26
+ 'push',
27
+ 'v3-dispatch',
28
+ ]);
29
+ export function canCoordinatorRecoveryPreemptRetry(kind) {
30
+ return COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS.has(kind);
31
+ }
24
32
  function cloneCheckpoint(checkpoint) {
25
33
  return JSON.parse(canonicalWorkspaceSyncJson(checkpoint));
26
34
  }
@@ -140,6 +148,16 @@ export class LocalWorkspaceSyncRunner {
140
148
  }
141
149
  return this.enqueue(async () => this.runInspection());
142
150
  }
151
+ recoverCoordinatorObligationsDue(isRecoveryStillRequired) {
152
+ if (!this.context || this.terminated || !this.acceptingWork) {
153
+ return Promise.resolve();
154
+ }
155
+ return this.enqueue(async () => {
156
+ if (!isRecoveryStillRequired())
157
+ return;
158
+ await this.runInspection(this.options.operations.sync, { bypassRetryKinds: COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS });
159
+ });
160
+ }
143
161
  pullDue() {
144
162
  if (!this.context || this.terminated || !this.acceptingWork) {
145
163
  return Promise.resolve();
@@ -1,5 +1,5 @@
1
1
  import type { DatabaseAdapter } from '../../storage/databaseAdapter.js';
2
- import type { WorkspaceSyncDeltaDiagnostics, WorkspaceSyncPayload } from '../workspaceSyncModel.js';
2
+ import type { WorkspaceSyncDeltaDiagnostics, WorkspaceSyncDurableTaskRevision, WorkspaceSyncPayload, WorkspaceSyncTaskSnapshot } from '../workspaceSyncModel.js';
3
3
  import { type WorkspacePushPreparedPlan } from '../workspacePushPreparedPlan.js';
4
4
  import type { WorkspaceSyncPhase, WorkspaceSyncPushBaselineSnapshot } from '../workspaceSyncState.js';
5
5
  import type { LocalSyncCoordinatorCommandStatus } from './localSyncCoordinatorTypes.js';
@@ -30,6 +30,7 @@ export interface EncodedWorkspaceSyncPayload {
30
30
  currentInitiativeWatermarks: EncodedStringMap;
31
31
  currentWorkstreamIds: string[];
32
32
  currentWorkstreamWatermarks: EncodedStringMap;
33
+ currentPlanningIdentityWatermarks?: EncodedStringMap;
33
34
  currentAiProfileIds: string[];
34
35
  currentAiProfileWatermarks: EncodedStringMap;
35
36
  currentAiProfileChangeKeys?: EncodedStringMap;
@@ -68,8 +69,20 @@ export interface LocalWorkspaceSyncPendingV2Push {
68
69
  preparedPlan: WorkspacePushPreparedPlan | null;
69
70
  preparedPlanFingerprint: string | null;
70
71
  acknowledgedNonApplyingBatchOperationIdentities: string[];
72
+ settlementVersion?: 1;
73
+ settledBatchOperationIdentities?: string[];
74
+ settledBatchContributions?: LocalWorkspaceSyncSettledV2PushBatch[];
71
75
  lastBatchProgress: LocalWorkspaceSyncPendingV2PushBatchProgress | null;
72
76
  }
77
+ export interface LocalWorkspaceSyncSettledV2PushBatch {
78
+ operationIdentity: string;
79
+ settlementIdentityFingerprint: string;
80
+ appliedTaskUpserts: Array<{
81
+ archived: boolean;
82
+ task: WorkspaceSyncTaskSnapshot;
83
+ durableRevision?: WorkspaceSyncDurableTaskRevision;
84
+ }>;
85
+ }
73
86
  export interface LocalWorkspaceSyncPendingV2PushBatchProgress {
74
87
  totalBatches: number;
75
88
  completedBatches: number;
@@ -144,6 +157,7 @@ export declare function createLocalWorkspaceSyncPendingV2Push(input: {
144
157
  repairMode: boolean;
145
158
  }): LocalWorkspaceSyncPendingV2Push;
146
159
  export declare function fingerprintLocalWorkspaceSyncPreparedPlan(plan: WorkspacePushPreparedPlan): string;
160
+ export declare function upgradeLocalWorkspaceSyncPendingV2PushSettlement(pending: LocalWorkspaceSyncPendingV2Push): LocalWorkspaceSyncPendingV2Push;
147
161
  export declare function createDefaultLocalWorkspaceSyncRunnerCheckpoint(): LocalWorkspaceSyncRunnerCheckpoint;
148
162
  export declare class LocalWorkspaceSyncRunnerStateStore {
149
163
  private readonly db;