@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,8 +1,9 @@
1
- import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
1
+ import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, } from './workspaceSyncV3NestedTaskCodecs.js';
2
2
  const rank = new Map([
3
3
  ['task-comments/full-v1', 0],
4
4
  ['task-checklist/full-v1', 1],
5
5
  ['task-attachment-links/full-v1', 2],
6
+ ['task-attachment-links/full-v2', 2],
6
7
  ['entity-event/full-v1', 3],
7
8
  ]);
8
9
  function compareCodeUnits(left, right) {
@@ -19,6 +20,7 @@ export function buildWorkspaceSyncV3NestedTaskRepairCandidates(input) {
19
20
  if (!links) {
20
21
  throw new Error(`Task attachment-link repair source is missing for ${task.id}.`);
21
22
  }
23
+ const attachmentProjection = input.attachmentProjection || 'task-attachment-links/full-v1';
22
24
  candidates.push({
23
25
  projection: 'task-comments/full-v1', domain: 'task-comments', entityId: task.id, mutationKind: 'replace',
24
26
  payload: serializeWorkspaceSyncV3TaskCommentsPayload({ taskId: task.id, comments: task.comments || [] }),
@@ -26,8 +28,14 @@ export function buildWorkspaceSyncV3NestedTaskRepairCandidates(input) {
26
28
  projection: 'task-checklist/full-v1', domain: 'task-checklist', entityId: task.id, mutationKind: 'replace',
27
29
  payload: serializeWorkspaceSyncV3TaskChecklistPayload({ taskId: task.id, items: task.checklistItems || [] }),
28
30
  }, {
29
- projection: 'task-attachment-links/full-v1', domain: 'task-attachment-links', entityId: task.id, mutationKind: 'replace',
30
- payload: validateWorkspaceSyncV3TaskAttachmentLinksPayload({ taskId: task.id, links: links || [] }),
31
+ projection: attachmentProjection, domain: 'task-attachment-links', entityId: task.id, mutationKind: 'replace',
32
+ payload: attachmentProjection === 'task-attachment-links/full-v2'
33
+ ? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
34
+ taskId: task.id,
35
+ links,
36
+ cardCoverAssetId: task.cardCoverAssetId ?? null,
37
+ })
38
+ : validateWorkspaceSyncV3TaskAttachmentLinksPayload({ taskId: task.id, links }),
31
39
  });
32
40
  }
33
41
  for (const event of input.events) {
@@ -11,6 +11,7 @@ import type { WorkflowRuntimeMutationCommand } from './workflowRuntimeSync.js';
11
11
  import type { WorkspaceSyncV3OriginActor } from './workspaceSyncV3OriginActor.js';
12
12
  import type { WorkspaceSyncV3TaskCommentReconcileProvenance } from './taskCommentReconcileProvenance.js';
13
13
  import type { WorkspaceSyncEntityEventSnapshot } from '../workspaceSyncModel.js';
14
+ import type { TaskChecklistItemUpdateIntent } from './taskChecklistMutationService.js';
14
15
  export type { WorkspaceSyncV3OriginActor } from './workspaceSyncV3OriginActor.js';
15
16
  type WorkspaceSyncV3OperationEnvelopeBase<TOperation> = {
16
17
  contractVersion: 3;
@@ -30,6 +31,7 @@ type TaskOperationBase<TMutationKind extends string, TPayload> = {
30
31
  export type WorkspaceSyncV3TaskMetadataEnvelope = WorkspaceSyncV3OperationEnvelopeBase<TaskOperationBase<'metadata-update', {
31
32
  patch: Partial<TaskItem>;
32
33
  saveSource?: 'manual' | 'autosave';
34
+ expectedDetailRevision?: string;
33
35
  originActor?: WorkspaceSyncV3OriginActor;
34
36
  }>>;
35
37
  export type WorkspaceSyncV3TaskCreateEnvelope = WorkspaceSyncV3OperationEnvelopeBase<TaskOperationBase<'create', {
@@ -74,6 +76,7 @@ export type WorkspaceSyncV3TaskWorkflowEnvelope = WorkspaceSyncV3OperationEnvelo
74
76
  export type WorkspaceSyncV3TaskStatusEnvelope = WorkspaceSyncV3OperationEnvelopeBase<TaskOperationBase<'set-status', DurableTaskStatusMutationPayload & {
75
77
  workflowAssignment?: WorkflowAssignmentSyncRecord;
76
78
  originActor?: WorkspaceSyncV3OriginActor;
79
+ expectedDetailRevision?: string;
77
80
  }>>;
78
81
  export type WorkspaceSyncV3WorkflowRuntimeEnvelope = WorkspaceSyncV3OperationEnvelopeBase<{
79
82
  domain: 'workflow-execution';
@@ -113,6 +116,8 @@ export type WorkspaceSyncV3TaskChecklistEnvelope = WorkspaceSyncV3OperationEnvel
113
116
  baseLifecycleRevision: '0';
114
117
  payload: {
115
118
  items: ChecklistItem[];
119
+ expectedDetailRevision?: string;
120
+ itemUpdateIntent?: TaskChecklistItemUpdateIntent;
116
121
  originActor?: WorkspaceSyncV3OriginActor;
117
122
  };
118
123
  }>;
@@ -46,6 +46,10 @@ export interface WorkspaceSyncV3OperatorDiagnosticsSnapshot {
46
46
  materializationsInWindow: number;
47
47
  materializedEntriesInWindow: number;
48
48
  unexpiredMaterializations: number;
49
+ storedMaterializations: number;
50
+ storedEntries: number;
51
+ expiredMaterializations: number;
52
+ expiredEntries: number;
49
53
  };
50
54
  outbox: {
51
55
  captureConfigured: boolean;
@@ -74,6 +78,7 @@ export interface WorkspaceSyncV3OperatorDiagnosticsSnapshot {
74
78
  };
75
79
  server5xx: number;
76
80
  nonTest409: number;
81
+ cursorExpiredResets: number;
77
82
  requestP95Ms: number | null;
78
83
  maxObservedResponseBytes: number | null;
79
84
  };
@@ -131,11 +136,13 @@ export interface WorkspaceSyncV3OperatorDiagnosticsSnapshot {
131
136
  };
132
137
  attachmentApply: {
133
138
  openObligations: number;
139
+ terminalObligations: number;
134
140
  dueObligations: number;
135
141
  oldestOpenCreatedAt: string | null;
136
142
  nextAttemptAt: string | null;
137
143
  attempted: number;
138
144
  lastError: string | null;
145
+ terminalReason: string | null;
139
146
  };
140
147
  runner: {
141
148
  available: boolean;
@@ -116,7 +116,13 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
116
116
  `).all(tenantId, workspaceId, since, eventLimit + 1);
117
117
  const truncated = eventRows.length > eventLimit;
118
118
  const events = eventRows.slice(0, eventLimit);
119
- const transfer = { pull: { success: 0, error: 0 }, apply: { success: 0, error: 0 }, server5xx: 0, nonTest409: 0 };
119
+ const transfer = {
120
+ pull: { success: 0, error: 0 },
121
+ apply: { success: 0, error: 0 },
122
+ server5xx: 0,
123
+ nonTest409: 0,
124
+ cursorExpiredResets: 0,
125
+ };
120
126
  const requestTimes = [];
121
127
  const observedResponseBytes = [];
122
128
  for (const row of events) {
@@ -131,7 +137,10 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
131
137
  const requestMs = Number(row.request_ms);
132
138
  if (Number.isFinite(requestMs) && requestMs >= 0)
133
139
  requestTimes.push(requestMs);
134
- const bytes = responseBytes(parseDetails(row.details_json));
140
+ const details = parseDetails(row.details_json);
141
+ if (JSON.stringify(details).includes('CURSOR_EXPIRED'))
142
+ transfer.cursorExpiredResets += 1;
143
+ const bytes = responseBytes(details);
135
144
  if (bytes !== null)
136
145
  observedResponseBytes.push(bytes);
137
146
  }
@@ -143,6 +152,27 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
143
152
  AND coverage_profile_id = ? AND coverage_version = ? AND coverage_digest = ?
144
153
  AND created_at >= ?
145
154
  `).get(nowIso, tenantId, workspaceId, projection.coverageProfileId, projection.coverageVersion, projection.coverageDigest, since);
155
+ const storedRepairMaterialization = input.db.prepare(`
156
+ SELECT
157
+ COUNT(*) AS count,
158
+ COALESCE(SUM(CASE WHEN expires_at < ? THEN 1 ELSE 0 END), 0) AS expired,
159
+ (SELECT COUNT(*)
160
+ FROM workspace_sync_repair_snapshot_entries entry
161
+ WHERE entry.tenant_id = ? AND entry.workspace_id = ?) AS entries,
162
+ (SELECT COUNT(*)
163
+ FROM workspace_sync_repair_snapshot_entries entry
164
+ WHERE entry.tenant_id = ? AND entry.workspace_id = ?
165
+ AND EXISTS (
166
+ SELECT 1
167
+ FROM workspace_sync_repair_snapshots snapshot
168
+ WHERE snapshot.tenant_id = entry.tenant_id
169
+ AND snapshot.workspace_id = entry.workspace_id
170
+ AND snapshot.snapshot_id = entry.snapshot_id
171
+ AND snapshot.expires_at < ?
172
+ )) AS expired_entries
173
+ FROM workspace_sync_repair_snapshots
174
+ WHERE tenant_id = ? AND workspace_id = ?
175
+ `).get(nowIso, tenantId, workspaceId, tenantId, workspaceId, nowIso, tenantId, workspaceId);
146
176
  const stagedEntry = projection.repair ? input.db.prepare(`
147
177
  SELECT COUNT(*) AS count
148
178
  FROM workspace_sync_coverage_repair_entries
@@ -216,12 +246,14 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
216
246
  WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
217
247
  `).get(tenantId, workspaceId);
218
248
  attachmentApplyRow = input.db.prepare(`
219
- SELECT COUNT(*) AS count,
220
- SUM(CASE WHEN next_attempt_at <= ? THEN 1 ELSE 0 END) AS due,
221
- MIN(created_at) AS oldest_created_at,
222
- MIN(next_attempt_at) AS next_attempt_at,
223
- COALESCE(SUM(attempts), 0) AS attempts,
224
- MAX(last_error) AS last_error
249
+ SELECT SUM(CASE WHEN terminal_at IS NULL THEN 1 ELSE 0 END) AS count,
250
+ SUM(CASE WHEN terminal_at IS NOT NULL THEN 1 ELSE 0 END) AS terminal,
251
+ SUM(CASE WHEN terminal_at IS NULL AND next_attempt_at <= ? THEN 1 ELSE 0 END) AS due,
252
+ MIN(CASE WHEN terminal_at IS NULL THEN created_at END) AS oldest_created_at,
253
+ MIN(CASE WHEN terminal_at IS NULL THEN next_attempt_at END) AS next_attempt_at,
254
+ COALESCE(SUM(CASE WHEN terminal_at IS NULL THEN attempts ELSE 0 END), 0) AS attempts,
255
+ MAX(CASE WHEN terminal_at IS NULL THEN last_error END) AS last_error,
256
+ MAX(CASE WHEN terminal_at IS NOT NULL THEN terminal_reason END) AS terminal_reason
225
257
  FROM workspace_sync_v3_attachment_apply_obligations
226
258
  WHERE tenant_id = ? AND workspace_id = ? AND resolved_at IS NULL
227
259
  `).get(nowIso, tenantId, workspaceId);
@@ -255,7 +287,9 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
255
287
  const oldestOpenRecoveryAt = String(recoveryRow?.oldest_created_at || '').trim() || null;
256
288
  const coordinatorGeneration = coordinatorState ? integer(coordinatorState.coordinator_generation) : null;
257
289
  const ownershipMode = coordinatorState ? String(coordinatorState.ownership_mode || '') || null : null;
258
- const localConverged = baseLocalConverged && integer(attachmentApplyRow?.count) === 0;
290
+ const localConverged = baseLocalConverged
291
+ && integer(attachmentApplyRow?.count) === 0
292
+ && integer(attachmentApplyRow?.terminal) === 0;
259
293
  const coordinatorFailures = [];
260
294
  if (input.runtimeMode === 'local') {
261
295
  if (!coordinatorState)
@@ -279,6 +313,9 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
279
313
  if (integer(attachmentApplyRow?.count) > 0) {
280
314
  coordinatorFailures.push('open attachment apply obligations remain');
281
315
  }
316
+ if (integer(attachmentApplyRow?.terminal) > 0) {
317
+ coordinatorFailures.push('terminal unavailable attachment apply obligations require operator action');
318
+ }
282
319
  if (ownershipMode === 'server' && !runnerState) {
283
320
  coordinatorFailures.push('server ownership has no durable runner checkpoint');
284
321
  }
@@ -305,6 +342,9 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
305
342
  failures.push('recent pull/apply window contains 409 responses');
306
343
  if (integer(attachmentApplyRow?.count) > 0)
307
344
  failures.push('attachment apply obligations remain open');
345
+ if (integer(attachmentApplyRow?.terminal) > 0) {
346
+ failures.push('terminal unavailable attachment apply obligations require operator action');
347
+ }
308
348
  if (cursorAtCycleHighWatermark === null)
309
349
  unknowns.push('no committed feed cycle coordinates are available');
310
350
  if (!events.length)
@@ -336,6 +376,10 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
336
376
  materializationsInWindow: integer(repairMaterialization?.count),
337
377
  materializedEntriesInWindow: integer(repairMaterialization?.entries),
338
378
  unexpiredMaterializations: integer(repairMaterialization?.unexpired),
379
+ storedMaterializations: integer(storedRepairMaterialization?.count),
380
+ storedEntries: integer(storedRepairMaterialization?.entries),
381
+ expiredMaterializations: integer(storedRepairMaterialization?.expired),
382
+ expiredEntries: integer(storedRepairMaterialization?.expired_entries),
339
383
  },
340
384
  outbox: {
341
385
  captureConfigured, dispatchConfigured, automaticSyncEnabled: automaticSync.enabled,
@@ -387,11 +431,13 @@ export function buildWorkspaceSyncV3OperatorDiagnostics(input) {
387
431
  },
388
432
  attachmentApply: {
389
433
  openObligations: integer(attachmentApplyRow?.count),
434
+ terminalObligations: integer(attachmentApplyRow?.terminal),
390
435
  dueObligations: integer(attachmentApplyRow?.due),
391
436
  oldestOpenCreatedAt: String(attachmentApplyRow?.oldest_created_at || '').trim() || null,
392
437
  nextAttemptAt: String(attachmentApplyRow?.next_attempt_at || '').trim() || null,
393
438
  attempted: integer(attachmentApplyRow?.attempts),
394
439
  lastError: String(attachmentApplyRow?.last_error || '').trim() || null,
440
+ terminalReason: String(attachmentApplyRow?.terminal_reason || '').trim() || null,
395
441
  },
396
442
  runner: {
397
443
  available: Boolean(runnerState),
@@ -0,0 +1,17 @@
1
+ import type { DatabaseAdapter } from '../../storage/databaseAdapter.js';
2
+ export declare const DEFAULT_WORKSPACE_SYNC_REPAIR_SNAPSHOT_RETENTION_BATCH_SIZE = 500;
3
+ export interface WorkspaceSyncRepairSnapshotRetentionPolicy {
4
+ batchSize: number;
5
+ }
6
+ export interface WorkspaceSyncRepairSnapshotRetentionResult {
7
+ deletedEntries: number;
8
+ deletedSnapshots: number;
9
+ remainingExpiredSnapshots: number;
10
+ }
11
+ export declare function resolveWorkspaceSyncRepairSnapshotRetentionPolicy(env?: NodeJS.ProcessEnv): WorkspaceSyncRepairSnapshotRetentionPolicy;
12
+ export declare function pruneExpiredWorkspaceSyncRepairSnapshots(input: {
13
+ db: DatabaseAdapter;
14
+ tenantId: string;
15
+ now?: Date;
16
+ policy?: WorkspaceSyncRepairSnapshotRetentionPolicy;
17
+ }): WorkspaceSyncRepairSnapshotRetentionResult;
@@ -0,0 +1,64 @@
1
+ export const DEFAULT_WORKSPACE_SYNC_REPAIR_SNAPSHOT_RETENTION_BATCH_SIZE = 500;
2
+ function positiveInteger(value, fallback) {
3
+ const parsed = Number.parseInt(String(value ?? '').trim(), 10);
4
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
5
+ }
6
+ export function resolveWorkspaceSyncRepairSnapshotRetentionPolicy(env = process.env) {
7
+ return {
8
+ batchSize: Math.min(10_000, positiveInteger(env.TASKFORCE_SYNC_REPAIR_SNAPSHOT_RETENTION_BATCH_SIZE, DEFAULT_WORKSPACE_SYNC_REPAIR_SNAPSHOT_RETENTION_BATCH_SIZE)),
9
+ };
10
+ }
11
+ export function pruneExpiredWorkspaceSyncRepairSnapshots(input) {
12
+ const now = (input.now || new Date()).toISOString();
13
+ const policy = input.policy || resolveWorkspaceSyncRepairSnapshotRetentionPolicy();
14
+ return input.db.transaction(() => {
15
+ const snapshot = input.db.prepare(`
16
+ SELECT workspace_id, snapshot_id
17
+ FROM workspace_sync_repair_snapshots
18
+ WHERE tenant_id = ? AND expires_at < ?
19
+ ORDER BY expires_at ASC, workspace_id ASC, snapshot_id ASC
20
+ LIMIT 1
21
+ `).get(input.tenantId, now);
22
+ const workspaceId = String(snapshot?.workspace_id || '').trim();
23
+ const snapshotId = String(snapshot?.snapshot_id || '').trim();
24
+ let deletedEntries = 0;
25
+ let deletedSnapshots = 0;
26
+ if (workspaceId && snapshotId) {
27
+ const entries = input.db.prepare(`
28
+ SELECT entry_index
29
+ FROM workspace_sync_repair_snapshot_entries
30
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
31
+ ORDER BY entry_index ASC
32
+ LIMIT ?
33
+ `).all(input.tenantId, workspaceId, snapshotId, policy.batchSize);
34
+ if (entries.length > 0) {
35
+ const result = input.db.prepare(`
36
+ DELETE FROM workspace_sync_repair_snapshot_entries
37
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
38
+ AND entry_index IN (${entries.map(() => '?').join(', ')})
39
+ `).run(input.tenantId, workspaceId, snapshotId, ...entries.map((entry) => entry.entry_index));
40
+ deletedEntries = Number(result.changes || 0);
41
+ }
42
+ const snapshotResult = input.db.prepare(`
43
+ DELETE FROM workspace_sync_repair_snapshots
44
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ? AND expires_at < ?
45
+ AND NOT EXISTS (
46
+ SELECT 1
47
+ FROM workspace_sync_repair_snapshot_entries
48
+ WHERE tenant_id = ? AND workspace_id = ? AND snapshot_id = ?
49
+ )
50
+ `).run(input.tenantId, workspaceId, snapshotId, now, input.tenantId, workspaceId, snapshotId);
51
+ deletedSnapshots = Number(snapshotResult.changes || 0);
52
+ }
53
+ const remaining = input.db.prepare(`
54
+ SELECT COUNT(*) AS count
55
+ FROM workspace_sync_repair_snapshots
56
+ WHERE tenant_id = ? AND expires_at < ?
57
+ `).get(input.tenantId, now);
58
+ return {
59
+ deletedEntries,
60
+ deletedSnapshots,
61
+ remainingExpiredSnapshots: Number(remaining?.count || 0),
62
+ };
63
+ })();
64
+ }
@@ -36,12 +36,19 @@ export function buildWorkspaceSyncV3TaskCommentAuditPage(input) {
36
36
  const workspaceId = String(input.workspaceId || '').trim();
37
37
  const previousCursor = normalizeCursor(input.cursor);
38
38
  const limit = pageSize(input.limit);
39
+ // Task IDs are compared in JavaScript when a page is installed locally.
40
+ // Make the database boundary use the same bytewise ordering so Postgres
41
+ // locale collation cannot place mixed-case IDs in an order the local
42
+ // validator rejects (SQLite already defaults to binary ordering here).
43
+ const taskIdWithCollationSql = input.core.getDatabaseAdapter().provider === 'postgres'
44
+ ? 'id COLLATE "C"'
45
+ : 'id COLLATE BINARY';
39
46
  const rows = input.core.getDatabaseAdapter().prepare(`
40
47
  SELECT id
41
48
  FROM tasks
42
49
  WHERE tenant_id = ? AND workspace_id = ?
43
- AND (? = '' OR id > ?)
44
- ORDER BY id
50
+ AND (? = '' OR ${taskIdWithCollationSql} > ?)
51
+ ORDER BY ${taskIdWithCollationSql}
45
52
  LIMIT ?
46
53
  `).all(input.core.getTenantId(), workspaceId, previousCursor || '', previousCursor || '', limit + 1);
47
54
  const pageRows = rows.slice(0, limit);
@@ -0,0 +1,7 @@
1
+ import type { WorkspaceSyncV3FeedCoveragePolicy, WorkspaceSyncV3FeedEntry, WorkspaceSyncV3FeedOperationProjector } from './workspaceSyncV3Feed.js';
2
+ import type { WorkspaceSyncV3CoverageProfile } from './workspaceSyncV3FeedProfile.js';
3
+ /** Dark v7 candidate: v4 ownership plus explicit task card-cover selection. */
4
+ export declare const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE: WorkspaceSyncV3CoverageProfile;
5
+ export declare const projectWorkspaceSyncV3TaskCoverCoverageOperation: WorkspaceSyncV3FeedOperationProjector;
6
+ export declare const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY: WorkspaceSyncV3FeedCoveragePolicy;
7
+ export declare function validateWorkspaceSyncV3TaskCoverCoverageFeedEntry(entry: WorkspaceSyncV3FeedEntry): void;
@@ -0,0 +1,37 @@
1
+ import { createHash } from 'crypto';
2
+ import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
3
+ import { projectWorkspaceSyncV3CombinedOperation, validateWorkspaceSyncV3CombinedFeedEntry, } from './workspaceSyncV3CombinedCoverage.js';
4
+ import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE } from './workspaceSyncV3NestedCoverage.js';
5
+ import { projectWorkspaceSyncV3NestedTaskV2Operation, validateWorkspaceSyncV3NestedTaskFeedEntry, WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION, } from './workspaceSyncV3NestedTaskProjection.js';
6
+ const projections = Object.freeze(WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE.projections.map((projection) => (projection.projectionId === 'task-attachment-links/full-v1'
7
+ ? WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION
8
+ : projection)));
9
+ const identity = Object.freeze({
10
+ coverageProfileId: 'task-planning-metadata',
11
+ coverageVersion: 7,
12
+ projections,
13
+ });
14
+ /** Dark v7 candidate: v4 ownership plus explicit task card-cover selection. */
15
+ export const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE = Object.freeze({
16
+ ...identity,
17
+ coverageDigest: createHash('sha256').update(canonicalWorkspaceSyncJson(identity)).digest('hex'),
18
+ });
19
+ const NESTED_DOMAINS = new Set(['task-comments', 'task-checklist', 'task-attachment-links', 'entity-event']);
20
+ export const projectWorkspaceSyncV3TaskCoverCoverageOperation = (input) => {
21
+ if (input.rows.some((row) => NESTED_DOMAINS.has(row.domain))) {
22
+ const nested = projectWorkspaceSyncV3NestedTaskV2Operation(input);
23
+ if (!nested)
24
+ throw new Error('Task-cover coverage operation is incomplete.');
25
+ return nested;
26
+ }
27
+ return projectWorkspaceSyncV3CombinedOperation(input);
28
+ };
29
+ export const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY = Object.freeze({
30
+ profile: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE,
31
+ projectOperation: projectWorkspaceSyncV3TaskCoverCoverageOperation,
32
+ });
33
+ export function validateWorkspaceSyncV3TaskCoverCoverageFeedEntry(entry) {
34
+ if (NESTED_DOMAINS.has(entry.domain))
35
+ return validateWorkspaceSyncV3NestedTaskFeedEntry(entry);
36
+ return validateWorkspaceSyncV3CombinedFeedEntry(entry);
37
+ }
@@ -0,0 +1,6 @@
1
+ export declare const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR: Readonly<{
2
+ coverageProfileId: "task-planning-metadata";
3
+ coverageVersion: 7;
4
+ coverageDigest: "84b0dee7ac0811234288c1b296357b2ddbcfe82d438ccf90b6bc6e8b5afea0b6";
5
+ }>;
6
+ export declare const WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS: readonly ("initiative/full-v1" | "taxonomy/full-v1" | "task/root-v1" | "task-relationship/full-v1" | "workstream/full-v1" | "task-comments/full-v1" | "task-checklist/full-v1" | "task-attachment-links/full-v2" | "entity-event/full-v1")[];
@@ -0,0 +1,9 @@
1
+ import { WORKSPACE_SYNC_V3_NESTED_EXCLUDED_V2_PROJECTIONS } from './workspaceSyncV3NestedWireContract.js';
2
+ export const WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR = Object.freeze({
3
+ coverageProfileId: 'task-planning-metadata',
4
+ coverageVersion: 7,
5
+ coverageDigest: '84b0dee7ac0811234288c1b296357b2ddbcfe82d438ccf90b6bc6e8b5afea0b6',
6
+ });
7
+ export const WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS = Object.freeze(WORKSPACE_SYNC_V3_NESTED_EXCLUDED_V2_PROJECTIONS.map((projection) => (projection === 'task-attachment-links/full-v1'
8
+ ? 'task-attachment-links/full-v2'
9
+ : projection)));
@@ -0,0 +1,7 @@
1
+ import type { WorkspaceSyncV3FeedCoveragePolicy, WorkspaceSyncV3FeedEntry, WorkspaceSyncV3FeedOperationProjector } from './workspaceSyncV3Feed.js';
2
+ import type { WorkspaceSyncV3CoverageProfile } from './workspaceSyncV3FeedProfile.js';
3
+ /** Dark v8 candidate: active v7 task-cover ownership plus workflow runtime. */
4
+ export declare const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE: WorkspaceSyncV3CoverageProfile;
5
+ export declare const projectWorkspaceSyncV3WorkflowTaskCoverCoverageOperation: WorkspaceSyncV3FeedOperationProjector;
6
+ export declare const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY: WorkspaceSyncV3FeedCoveragePolicy;
7
+ export declare function validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry(entry: WorkspaceSyncV3FeedEntry): void;
@@ -0,0 +1,33 @@
1
+ import { createHash } from 'crypto';
2
+ import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
3
+ import { projectWorkspaceSyncV3TaskCoverCoverageOperation, validateWorkspaceSyncV3TaskCoverCoverageFeedEntry, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE, } from './workspaceSyncV3TaskCoverCoverage.js';
4
+ import { WORKSPACE_SYNC_V3_WORKFLOW_RUNTIME_PROJECTIONS } from './workflowRuntimeSync.js';
5
+ import { projectWorkspaceSyncV3WorkflowRuntimeOperation, validateWorkspaceSyncV3WorkflowRuntimeFeedEntry, } from './workspaceSyncV3WorkflowRuntimeProjection.js';
6
+ const projections = Object.freeze([
7
+ ...WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE.projections,
8
+ ...WORKSPACE_SYNC_V3_WORKFLOW_RUNTIME_PROJECTIONS,
9
+ ]);
10
+ const identity = Object.freeze({
11
+ coverageProfileId: 'task-planning-metadata',
12
+ coverageVersion: 8,
13
+ projections,
14
+ });
15
+ /** Dark v8 candidate: active v7 task-cover ownership plus workflow runtime. */
16
+ export const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE = Object.freeze({
17
+ ...identity,
18
+ coverageDigest: createHash('sha256').update(canonicalWorkspaceSyncJson(identity)).digest('hex'),
19
+ });
20
+ export const projectWorkspaceSyncV3WorkflowTaskCoverCoverageOperation = (input) => {
21
+ const workflow = projectWorkspaceSyncV3WorkflowRuntimeOperation(input);
22
+ return workflow || projectWorkspaceSyncV3TaskCoverCoverageOperation(input);
23
+ };
24
+ export const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY = Object.freeze({
25
+ profile: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE,
26
+ projectOperation: projectWorkspaceSyncV3WorkflowTaskCoverCoverageOperation,
27
+ });
28
+ export function validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry(entry) {
29
+ if (entry.projection.startsWith('workflow-')) {
30
+ return validateWorkspaceSyncV3WorkflowRuntimeFeedEntry(entry);
31
+ }
32
+ return validateWorkspaceSyncV3TaskCoverCoverageFeedEntry(entry);
33
+ }
@@ -0,0 +1,7 @@
1
+ export declare const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR: Readonly<{
2
+ coverageProfileId: "task-planning-metadata";
3
+ coverageVersion: 8;
4
+ coverageDigest: "344c3360d36d383241b212192fe6c2ac1a7694fe521d3b6636559043b7e58253";
5
+ }>;
6
+ /** V2 has neither workflow runtime nor explicit task card-cover projections. */
7
+ export declare const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS: readonly ("initiative/full-v1" | "taxonomy/full-v1" | "task/root-v1" | "task-relationship/full-v1" | "workstream/full-v1" | "task-comments/full-v1" | "task-checklist/full-v1" | "task-attachment-links/full-v2" | "entity-event/full-v1")[];
@@ -0,0 +1,8 @@
1
+ import { WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS } from './workspaceSyncV3TaskCoverWireContract.js';
2
+ export const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR = Object.freeze({
3
+ coverageProfileId: 'task-planning-metadata',
4
+ coverageVersion: 8,
5
+ coverageDigest: '344c3360d36d383241b212192fe6c2ac1a7694fe521d3b6636559043b7e58253',
6
+ });
7
+ /** V2 has neither workflow runtime nor explicit task card-cover projections. */
8
+ export const WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS = WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS;
@@ -33,7 +33,8 @@ export async function buildWorkspacePullFeed(input) {
33
33
  const excludedProjections = new Set(input.excludedProjections || []);
34
34
  const commentsV3Owned = excludedProjections.has('task-comments/full-v1');
35
35
  const checklistV3Owned = excludedProjections.has('task-checklist/full-v1');
36
- const attachmentsV3Owned = excludedProjections.has('task-attachment-links/full-v1');
36
+ const attachmentsV3Owned = excludedProjections.has('task-attachment-links/full-v1')
37
+ || excludedProjections.has('task-attachment-links/full-v2');
37
38
  const suppressTaskCarriers = excludedProjections.has('task/root-v1')
38
39
  && commentsV3Owned && checklistV3Owned && attachmentsV3Owned;
39
40
  const syncCursor = cursor ? { watermark: cursor.u, id: cursor.id } : null;
@@ -2,6 +2,7 @@ import type { TaskItem } from '../types.js';
2
2
  import type { WorkspaceAssetLinkRole, WorkspaceAssetStore } from '../storage/workspaceAssetStore.js';
3
3
  import { type AiProfileAvatarPathSource } from './aiProfileAvatarSyncPaths.js';
4
4
  import { type WorkspaceSyncPublishedContentResolver } from './engine/workspaceSyncPublishedContentResolver.js';
5
+ import type { WorkspaceSyncContentPullObligationStore } from './engine/workspaceSyncContentPullObligationStore.js';
5
6
  export interface WorkspaceRepairManifestTaskEntry {
6
7
  id: string;
7
8
  archived: boolean;
@@ -22,6 +23,7 @@ export interface WorkspaceRepairManifestDocumentEntry {
22
23
  sha256: string;
23
24
  sizeBytes: number;
24
25
  existsLocally: boolean;
26
+ contentCheckReliable: boolean;
25
27
  source: 'metadata' | 'filesystem';
26
28
  publicationState: 'legacy' | 'versioned' | 'deleted' | 'invalid';
27
29
  publicationError: string | null;
@@ -36,6 +38,7 @@ export interface WorkspaceRepairManifestAssetEntry {
36
38
  sha256: string;
37
39
  sizeBytes: number;
38
40
  existsLocally: boolean;
41
+ contentCheckReliable: boolean;
39
42
  source: 'metadata' | 'filesystem';
40
43
  publicationState: 'legacy' | 'versioned' | 'deleted' | 'invalid';
41
44
  publicationError: string | null;
@@ -50,7 +53,7 @@ export interface WorkspaceRepairManifest {
50
53
  assets: WorkspaceRepairManifestAssetEntry[];
51
54
  assetDeletes: WorkspaceRepairManifestDeleteEntry[];
52
55
  }
53
- export type WorkspaceRepairIssueCode = 'missing_document_metadata' | 'missing_document_file' | 'stale_document_tombstone' | 'published_document_tombstone_conflict' | 'published_document_live_head_conflict' | 'invalid_published_document_content' | 'missing_asset_metadata' | 'missing_asset_file' | 'stale_asset_tombstone' | 'published_asset_tombstone_conflict' | 'published_asset_live_head_conflict' | 'invalid_published_asset_content' | 'stale_asset_link' | 'missing_asset_link';
56
+ export type WorkspaceRepairIssueCode = 'missing_document_metadata' | 'missing_document_file' | 'stale_document_tombstone' | 'published_document_tombstone_conflict' | 'published_document_live_head_conflict' | 'invalid_published_document_content' | 'document_content_unverified' | 'missing_asset_metadata' | 'missing_asset_file' | 'stale_asset_tombstone' | 'published_asset_tombstone_conflict' | 'published_asset_live_head_conflict' | 'invalid_published_asset_content' | 'asset_content_unverified' | 'stale_asset_link' | 'missing_asset_link';
54
57
  export interface WorkspaceRepairIssue {
55
58
  code: WorkspaceRepairIssueCode;
56
59
  entityKind: 'document' | 'asset' | 'link';
@@ -59,7 +62,7 @@ export interface WorkspaceRepairIssue {
59
62
  taskId?: string | null;
60
63
  role?: WorkspaceAssetLinkRole;
61
64
  repairable: boolean;
62
- recommendedAction: 'create-metadata' | 'mark-deleted' | 'revive-metadata' | 'delete-link' | 'create-link' | 'inspect-published-content';
65
+ recommendedAction: 'create-metadata' | 'mark-deleted' | 'revive-metadata' | 'delete-link' | 'create-link' | 'inspect-published-content' | 'retry-pull';
63
66
  detail: string;
64
67
  }
65
68
  export interface WorkspaceRepairScanResult {
@@ -103,4 +106,7 @@ export declare function scanWorkspaceRepair(input: WorkspaceRepairInput): Worksp
103
106
  export declare function applyWorkspaceRepair(input: WorkspaceRepairInput & {
104
107
  upsertDocumentWatermark: (workspaceId: string, path: string, contentHash: string, updatedAt: string) => void;
105
108
  repairMissingAssetLinks?: boolean;
109
+ repairMissingContentFiles?: boolean;
110
+ contentPullObligationStore?: WorkspaceSyncContentPullObligationStore;
111
+ now?: () => string;
106
112
  }): WorkspaceRepairApplyResult;