@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,6 +1,8 @@
1
1
  import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_NESTED_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3NestedWireContract.js';
2
2
  import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_WORKFLOW_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3WorkflowWireContract.js';
3
3
  import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_PLANNING_ORDER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3PlanningOrderWireContract.js';
4
+ import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3TaskCoverWireContract.js';
5
+ import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS, } from './workspaceSyncV3WorkflowTaskCoverWireContract.js';
4
6
  export const WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR = Object.freeze({
5
7
  coverageProfileId: 'task-planning-metadata',
6
8
  coverageVersion: 3,
@@ -27,6 +29,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
27
29
  nestedWriterPrerequisitesRequired: false,
28
30
  workflowWriterPrerequisitesRequired: false,
29
31
  planningOrderWriterPrerequisitesRequired: false,
32
+ taskCoverProjectionRequired: false,
30
33
  };
31
34
  }
32
35
  if (profileId === WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR.coverageProfileId
@@ -38,6 +41,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
38
41
  nestedWriterPrerequisitesRequired: true,
39
42
  workflowWriterPrerequisitesRequired: false,
40
43
  planningOrderWriterPrerequisitesRequired: false,
44
+ taskCoverProjectionRequired: false,
41
45
  };
42
46
  }
43
47
  if (profileId === WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR.coverageProfileId
@@ -49,6 +53,7 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
49
53
  nestedWriterPrerequisitesRequired: true,
50
54
  workflowWriterPrerequisitesRequired: true,
51
55
  planningOrderWriterPrerequisitesRequired: false,
56
+ taskCoverProjectionRequired: false,
52
57
  };
53
58
  }
54
59
  if (profileId === WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR.coverageProfileId
@@ -60,16 +65,45 @@ export function resolveWorkspaceSyncV3CombinedWireContract(input) {
60
65
  nestedWriterPrerequisitesRequired: true,
61
66
  workflowWriterPrerequisitesRequired: false,
62
67
  planningOrderWriterPrerequisitesRequired: true,
68
+ taskCoverProjectionRequired: false,
69
+ };
70
+ }
71
+ if (profileId === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageProfileId
72
+ && version === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageVersion
73
+ && digest === WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR.coverageDigest) {
74
+ return {
75
+ coverage: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR,
76
+ excludedProjections: WORKSPACE_SYNC_V3_TASK_COVER_EXCLUDED_V2_PROJECTIONS,
77
+ nestedWriterPrerequisitesRequired: true,
78
+ workflowWriterPrerequisitesRequired: false,
79
+ planningOrderWriterPrerequisitesRequired: false,
80
+ taskCoverProjectionRequired: true,
81
+ };
82
+ }
83
+ if (profileId === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageProfileId
84
+ && version === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageVersion
85
+ && digest === WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR.coverageDigest) {
86
+ return {
87
+ coverage: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_SELECTOR,
88
+ excludedProjections: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_EXCLUDED_V2_PROJECTIONS,
89
+ nestedWriterPrerequisitesRequired: true,
90
+ workflowWriterPrerequisitesRequired: true,
91
+ planningOrderWriterPrerequisitesRequired: false,
92
+ taskCoverProjectionRequired: true,
63
93
  };
64
94
  }
65
95
  return null;
66
96
  }
67
97
  export function resolveWorkspaceSyncV3CombinedCoverageForExclusions(exclusions) {
98
+ // V8 deliberately shares V7's v2 exclusions. Exclusions alone therefore
99
+ // identify the active V7 boundary; V8 activation must carry its exact
100
+ // persisted selector instead of using this legacy reverse lookup.
68
101
  for (const coverage of [
69
102
  WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR,
70
103
  WORKSPACE_SYNC_V3_NESTED_COVERAGE_SELECTOR,
71
104
  WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_SELECTOR,
72
105
  WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_SELECTOR,
106
+ WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_SELECTOR,
73
107
  ]) {
74
108
  const contract = resolveWorkspaceSyncV3CombinedWireContract(coverage);
75
109
  if (exclusions.length === contract.excludedProjections.length
@@ -2,6 +2,8 @@ import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_POLICY, WORKSPACE_SYNC_V3_COMBINED_
2
2
  import { WORKSPACE_SYNC_V3_NESTED_COVERAGE_POLICY, WORKSPACE_SYNC_V3_NESTED_COVERAGE_PROFILE, validateWorkspaceSyncV3NestedCoverageFeedEntry, } from './workspaceSyncV3NestedCoverage.js';
3
3
  import { WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_POLICY, WORKSPACE_SYNC_V3_WORKFLOW_COVERAGE_PROFILE, validateWorkspaceSyncV3WorkflowCoverageFeedEntry, } from './workspaceSyncV3WorkflowCoverage.js';
4
4
  import { WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_PROFILE, validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry, } from './workspaceSyncV3PlanningOrderCoverage.js';
5
+ import { WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE, validateWorkspaceSyncV3TaskCoverCoverageFeedEntry, } from './workspaceSyncV3TaskCoverCoverage.js';
6
+ import { WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY, WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE, validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry, } from './workspaceSyncV3WorkflowTaskCoverCoverage.js';
5
7
  export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
6
8
  Object.freeze({
7
9
  profile: WORKSPACE_SYNC_V3_COMBINED_COVERAGE_PROFILE,
@@ -23,6 +25,16 @@ export const WORKSPACE_SYNC_V3_REGISTERED_COVERAGES = Object.freeze([
23
25
  policy: WORKSPACE_SYNC_V3_PLANNING_ORDER_COVERAGE_POLICY,
24
26
  validateEntry: validateWorkspaceSyncV3PlanningOrderCoverageFeedEntry,
25
27
  }),
28
+ Object.freeze({
29
+ profile: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_PROFILE,
30
+ policy: WORKSPACE_SYNC_V3_TASK_COVER_COVERAGE_POLICY,
31
+ validateEntry: validateWorkspaceSyncV3TaskCoverCoverageFeedEntry,
32
+ }),
33
+ Object.freeze({
34
+ profile: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_PROFILE,
35
+ policy: WORKSPACE_SYNC_V3_WORKFLOW_TASK_COVER_COVERAGE_POLICY,
36
+ validateEntry: validateWorkspaceSyncV3WorkflowTaskCoverCoverageFeedEntry,
37
+ }),
26
38
  ]);
27
39
  export function resolveWorkspaceSyncV3RegisteredCoverage(input) {
28
40
  const profileId = String(input.coverageProfileId || '').trim();
@@ -1,4 +1,4 @@
1
- export type WorkspaceSyncV3ProjectionDescriptor = 'initiative/full-v1' | 'workstream/full-v1' | 'task/root-v1' | 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'entity-event/full-v1' | 'task-relationship/full-v1' | 'taxonomy/full-v1' | 'workflow-published-definition/full-v2' | 'workflow-execution/root-v1' | 'workflow-execution-event/full-v1' | 'workstream-task-order/full-v1';
1
+ export type WorkspaceSyncV3ProjectionDescriptor = 'initiative/full-v1' | 'workstream/full-v1' | 'task/root-v1' | 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2' | 'entity-event/full-v1' | 'task-relationship/full-v1' | 'taxonomy/full-v1' | 'workflow-published-definition/full-v2' | 'workflow-execution/root-v1' | 'workflow-execution-event/full-v1' | 'workstream-task-order/full-v1';
2
2
  export type WorkspaceSyncV3JournalProjectionDescriptor = WorkspaceSyncV3ProjectionDescriptor | 'task/taxonomy-remap-v1';
3
3
  export interface WorkspaceSyncV3ProjectionCoverageDescriptor {
4
4
  projectionId: WorkspaceSyncV3ProjectionDescriptor;
@@ -7,4 +7,5 @@ export declare function resolveWorkspaceSyncV3AttestedV2Exclusions(input: {
7
7
  coverage: unknown;
8
8
  excludedProjections: unknown;
9
9
  env?: NodeJS.ProcessEnv;
10
+ runtimeMode?: 'local' | 'cloud';
10
11
  }): readonly WorkspaceSyncV2ProjectionExclusion[] | null;
@@ -1,5 +1,5 @@
1
- import { isWorkspaceSyncV3CombinedLegacyFenceEnabled, normalizeWorkspaceSyncV2ProjectionExclusions, WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS, } from './workspaceSyncV2ProjectionExclusions.js';
2
- import { resolveWorkspaceSyncV3CombinedWireContract, } from './workspaceSyncV3CombinedWireContract.js';
1
+ import { isWorkspaceSyncV3CombinedLegacyFenceConfigured, isWorkspaceSyncV3CombinedLegacyFenceEnabled, normalizeWorkspaceSyncV2ProjectionExclusions, WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS, } from './workspaceSyncV2ProjectionExclusions.js';
2
+ import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR, resolveWorkspaceSyncV3CombinedWireContract, } from './workspaceSyncV3CombinedWireContract.js';
3
3
  import { resolveCombinedFeedCapability, resolveRequestedCombinedFeedCoverage } from './combinedFeedCapability.js';
4
4
  export function isWorkspaceSyncV3NestedLegacyFenceEnabled(env = process.env) {
5
5
  return /^(1|true|on|yes)$/i.test(String(env.TASKFORCE_SYNC_V3_NESTED_LEGACY_FENCE_ENABLED || '').trim());
@@ -17,17 +17,30 @@ export function resolveWorkspaceSyncV3RequiredCloudCoverage(env = process.env) {
17
17
  export const resolveWorkspaceSyncV3RequiredPushCoverage = resolveWorkspaceSyncV3RequiredCloudCoverage;
18
18
  export function resolveWorkspaceSyncV3AttestedV2Exclusions(input) {
19
19
  const env = input.env || process.env;
20
- if (!isWorkspaceSyncV3CombinedLegacyFenceEnabled(env))
21
- return input.coverage == null ? [] : null;
22
- if (input.coverage == null)
23
- return WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS;
20
+ const runtimeMode = input.runtimeMode || 'cloud';
21
+ const localFenceEnabled = (coverage) => (isWorkspaceSyncV3CombinedLegacyFenceConfigured(env)
22
+ && resolveCombinedFeedCapability({ runtimeMode: 'local', env, coverage })
23
+ .combinedFeed.activationReady);
24
+ if (input.coverage == null) {
25
+ const fenceEnabled = runtimeMode === 'local'
26
+ ? localFenceEnabled(WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR)
27
+ : isWorkspaceSyncV3CombinedLegacyFenceEnabled(env);
28
+ return fenceEnabled ? WORKSPACE_SYNC_V3_COMBINED_V2_EXCLUSIONS : [];
29
+ }
24
30
  if (!input.coverage || typeof input.coverage !== 'object' || Array.isArray(input.coverage))
25
31
  return null;
26
32
  const contract = resolveWorkspaceSyncV3CombinedWireContract(input.coverage);
27
- if (!contract || (contract.nestedWriterPrerequisitesRequired
28
- && (!isWorkspaceSyncV3NestedLegacyFenceEnabled(env)
29
- || !resolveCombinedFeedCapability({ runtimeMode: 'cloud', env, coverage: contract.coverage })
30
- .combinedFeed.activationReady)))
33
+ if (!contract)
34
+ return null;
35
+ const fenceEnabled = runtimeMode === 'local'
36
+ ? localFenceEnabled(contract.coverage)
37
+ : isWorkspaceSyncV3CombinedLegacyFenceEnabled(env)
38
+ && (!contract.nestedWriterPrerequisitesRequired
39
+ || (isWorkspaceSyncV3NestedLegacyFenceEnabled(env)
40
+ && resolveCombinedFeedCapability({
41
+ runtimeMode: 'cloud', env, coverage: contract.coverage,
42
+ }).combinedFeed.activationReady));
43
+ if (!fenceEnabled)
31
44
  return null;
32
45
  if (!Array.isArray(input.excludedProjections))
33
46
  return null;
@@ -23,6 +23,7 @@ export interface WorkspaceSyncV3NestedTaskApplyCore {
23
23
  resolveTaskAttachmentLinksForDurableSync(links: ReturnType<typeof serializeWorkspaceSyncV3TaskAttachmentLinksPayload>['links'], workspaceId: string, options?: {
24
24
  adoptAuthoritativeReferenceNumber?: boolean;
25
25
  ignoreAssetMetadataSnapshots?: boolean;
26
+ restoreDeletedExternalAssetForAuthoritativeSync?: boolean;
26
27
  }): AttachmentItem[];
27
28
  listTaskAttachmentLinksForDurableSync(taskId: string, workspaceId: string): ReturnType<typeof serializeWorkspaceSyncV3TaskAttachmentLinksPayload>['links'];
28
29
  getEntityEventForSync(input: {
@@ -71,12 +72,14 @@ export declare function resolveWorkspaceSyncV3AttachmentApplyObligations(input:
71
72
  } | {
72
73
  success: false;
73
74
  error: string;
75
+ disposition?: 'retryable' | 'terminal-unavailable';
74
76
  }>;
75
77
  onInstalled?: (taskId: string) => void;
76
78
  }): Promise<{
77
79
  attempted: number;
78
80
  resolved: number;
79
81
  remaining: number;
82
+ terminal: number;
80
83
  nextAttemptAt: string | null;
81
84
  resolvedTaskIds: string[];
82
85
  lastError: string | null;
@@ -2,7 +2,7 @@ import { DurableTaskAttachmentLinksApplyError } from '../../core/TaskAttachmentL
2
2
  import { canonicalWorkspaceSyncJson } from './canonicalWorkspaceSyncJson.js';
3
3
  import { fingerprintWorkspaceSyncPayload, hasCompletedRecoveryForSupersededEntityEvent, WorkspaceSyncDurabilityStore, } from './syncDurabilityStore.js';
4
4
  import { calculateAttachmentApplyObligationRetryDelayMs, WorkspaceSyncV3AttachmentApplyObligationStore, } from './workspaceSyncV3AttachmentApplyObligationStore.js';
5
- import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
5
+ import { serializeWorkspaceSyncV3TaskAttachmentLinksPayload, serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload, serializeWorkspaceSyncV3TaskChecklistPayload, serializeWorkspaceSyncV3TaskCommentsPayload, serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
6
6
  import { validateWorkspaceSyncV3NestedTaskFeedEntry } from './workspaceSyncV3NestedTaskProjection.js';
7
7
  export class WorkspaceSyncV3TaskCommentAggregateDivergenceError extends Error {
8
8
  taskId;
@@ -50,6 +50,7 @@ function serializeTaskAttachmentLinkOwnership(payload) {
50
50
  order: link.order,
51
51
  ...(link.displayName !== undefined ? { displayName: link.displayName } : {}),
52
52
  })),
53
+ ...('cardCoverAssetId' in payload ? { cardCoverAssetId: payload.cardCoverAssetId } : {}),
53
54
  };
54
55
  }
55
56
  function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecoveryIds) {
@@ -85,16 +86,22 @@ function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecov
85
86
  assertInstalledFingerprint(serializeWorkspaceSyncV3TaskChecklistPayload({ taskId: task.id, items: installed.checklistItems || [] }), entry.canonicalFingerprint || '', 'Task checklist');
86
87
  return;
87
88
  }
88
- if (entry.projection === 'task-attachment-links/full-v1') {
89
- const payload = validateWorkspaceSyncV3TaskAttachmentLinksPayload(entry.payload);
89
+ if (entry.projection === 'task-attachment-links/full-v1'
90
+ || entry.projection === 'task-attachment-links/full-v2') {
91
+ const v2Payload = entry.projection === 'task-attachment-links/full-v2'
92
+ ? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(entry.payload)
93
+ : null;
94
+ const payload = v2Payload ?? validateWorkspaceSyncV3TaskAttachmentLinksPayload(entry.payload);
95
+ const cardCoverAssetId = v2Payload?.cardCoverAssetId;
90
96
  const task = taskOrThrow(core, payload.taskId, workspaceId);
91
97
  const ownershipFingerprint = fingerprintWorkspaceSyncPayload(serializeTaskAttachmentLinkOwnership(payload));
92
98
  const obligations = new WorkspaceSyncV3AttachmentApplyObligationStore(core.getDatabaseAdapter());
93
99
  let attachments;
94
100
  try {
95
- attachments = core.resolveTaskAttachmentLinksForDurableSync(payload.links, workspaceId, {
101
+ attachments = core.getDatabaseAdapter().transaction(() => (core.resolveTaskAttachmentLinksForDurableSync(payload.links, workspaceId, {
96
102
  ignoreAssetMetadataSnapshots: true,
97
- });
103
+ restoreDeletedExternalAssetForAuthoritativeSync: true,
104
+ })))();
98
105
  }
99
106
  catch (error) {
100
107
  if (error instanceof DurableTaskAttachmentLinksApplyError
@@ -122,10 +129,19 @@ function applyEntry(core, workspaceId, entry, now, authoritativeEntityEventRecov
122
129
  }
123
130
  throw error;
124
131
  }
125
- installTaskNestedFields(core, workspaceId, task, { attachments });
126
- const installedPayload = serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
127
- taskId: task.id, links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
132
+ const installed = installTaskNestedFields(core, workspaceId, task, {
133
+ attachments,
134
+ ...(cardCoverAssetId !== undefined ? { cardCoverAssetId } : {}),
128
135
  });
136
+ const installedPayload = cardCoverAssetId !== undefined
137
+ ? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
138
+ taskId: task.id,
139
+ links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
140
+ cardCoverAssetId: installed.cardCoverAssetId ?? null,
141
+ })
142
+ : serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
143
+ taskId: task.id, links: core.listTaskAttachmentLinksForDurableSync(task.id, workspaceId),
144
+ });
129
145
  // Captions, original filenames, and readable references are snapshots of
130
146
  // asset-owned metadata. A historical link event must remain installable
131
147
  // after the asset is renamed or receives a new readable reference.
@@ -210,7 +226,14 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
210
226
  let lastError = null;
211
227
  for (const obligation of due) {
212
228
  try {
213
- const payload = validateWorkspaceSyncV3TaskAttachmentLinksPayload(JSON.parse(obligation.payloadJson));
229
+ const rawPayload = JSON.parse(obligation.payloadJson);
230
+ const hasCardCover = Object.prototype.hasOwnProperty.call(rawPayload, 'cardCoverAssetId');
231
+ const payload = hasCardCover
232
+ ? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(rawPayload)
233
+ : validateWorkspaceSyncV3TaskAttachmentLinksPayload(rawPayload);
234
+ const cardCoverAssetId = hasCardCover
235
+ ? payload.cardCoverAssetId
236
+ : undefined;
214
237
  const installMutation = () => {
215
238
  const task = input.core.getTask(payload.taskId, input.workspaceId);
216
239
  if (!task) {
@@ -222,11 +245,22 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
222
245
  }
223
246
  const attachments = input.core.resolveTaskAttachmentLinksForDurableSync(payload.links, input.workspaceId, {
224
247
  ignoreAssetMetadataSnapshots: true,
248
+ restoreDeletedExternalAssetForAuthoritativeSync: true,
225
249
  });
226
- installTaskNestedFields(input.core, input.workspaceId, task, { attachments });
227
- const installedPayload = serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
228
- taskId: task.id, links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.workspaceId),
250
+ const installed = installTaskNestedFields(input.core, input.workspaceId, task, {
251
+ attachments,
252
+ ...(cardCoverAssetId !== undefined ? { cardCoverAssetId } : {}),
229
253
  });
254
+ const installedPayload = cardCoverAssetId !== undefined
255
+ ? serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
256
+ taskId: task.id,
257
+ links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.workspaceId),
258
+ cardCoverAssetId: installed.cardCoverAssetId ?? null,
259
+ })
260
+ : serializeWorkspaceSyncV3TaskAttachmentLinksPayload({
261
+ taskId: task.id,
262
+ links: input.core.listTaskAttachmentLinksForDurableSync(task.id, input.workspaceId),
263
+ });
230
264
  assertInstalledFingerprint(serializeTaskAttachmentLinkOwnership(installedPayload), fingerprintWorkspaceSyncPayload(serializeTaskAttachmentLinkOwnership(payload)), `Task attachment links for ${task.id}`);
231
265
  obligationStore.resolve({
232
266
  tenantId, workspaceId: input.workspaceId, taskId: obligation.taskId,
@@ -292,8 +326,20 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
292
326
  if (!input.hydrateAsset || !assetId || hydratedAssetIds.has(assetId))
293
327
  throw error;
294
328
  const hydration = await input.hydrateAsset(assetId);
295
- if (!hydration.success)
329
+ if (!hydration.success) {
330
+ if (hydration.disposition === 'terminal-unavailable') {
331
+ obligationStore.markTerminalUnavailable({
332
+ tenantId,
333
+ workspaceId: input.workspaceId,
334
+ taskId: obligation.taskId,
335
+ canonicalFingerprint: obligation.canonicalFingerprint,
336
+ reason: hydration.error,
337
+ now: input.now,
338
+ });
339
+ throw new TerminalAttachmentApplyObligationError(hydration.error);
340
+ }
296
341
  throw new Error(hydration.error);
342
+ }
297
343
  hydratedAssetIds.add(assetId);
298
344
  }
299
345
  }
@@ -304,6 +350,8 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
304
350
  }
305
351
  catch (error) {
306
352
  lastError = error instanceof Error ? error.message : 'Deferred attachment-link retry failed.';
353
+ if (error instanceof TerminalAttachmentApplyObligationError)
354
+ continue;
307
355
  const nextAttemptAt = new Date(Date.parse(input.now) + calculateAttachmentApplyObligationRetryDelayMs(obligation.attempts + 1)).toISOString();
308
356
  obligationStore.recordAttemptFailure({
309
357
  tenantId, workspaceId: input.workspaceId, taskId: obligation.taskId,
@@ -318,8 +366,11 @@ export async function resolveWorkspaceSyncV3AttachmentApplyObligations(input) {
318
366
  attempted: due.length,
319
367
  resolved,
320
368
  remaining: summary.open,
369
+ terminal: summary.terminal,
321
370
  nextAttemptAt: summary.nextAttemptAt,
322
371
  resolvedTaskIds,
323
372
  lastError: summary.lastError || lastError,
324
373
  };
325
374
  }
375
+ class TerminalAttachmentApplyObligationError extends Error {
376
+ }
@@ -18,6 +18,9 @@ export type WorkspaceSyncV3TaskAttachmentLinksPayload = {
18
18
  taskId: string;
19
19
  links: WorkspaceSyncV3TaskAttachmentLink[];
20
20
  };
21
+ export type WorkspaceSyncV3TaskAttachmentLinksV2Payload = WorkspaceSyncV3TaskAttachmentLinksPayload & {
22
+ cardCoverAssetId: string | null;
23
+ };
21
24
  export type WorkspaceSyncV3TaskAttachmentLink = {
22
25
  assetId: string;
23
26
  role: 'attachment' | 'image' | 'reference';
@@ -55,5 +58,11 @@ export declare function serializeWorkspaceSyncV3TaskAttachmentLinksPayload(input
55
58
  links: unknown;
56
59
  }): WorkspaceSyncV3TaskAttachmentLinksPayload;
57
60
  export declare function validateWorkspaceSyncV3TaskAttachmentLinksPayload(value: unknown): WorkspaceSyncV3TaskAttachmentLinksPayload;
61
+ export declare function serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload(input: {
62
+ taskId: string;
63
+ links: unknown;
64
+ cardCoverAssetId: unknown;
65
+ }): WorkspaceSyncV3TaskAttachmentLinksV2Payload;
66
+ export declare function validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(value: unknown): WorkspaceSyncV3TaskAttachmentLinksV2Payload;
58
67
  export declare function serializeWorkspaceSyncV3EntityEventPayload(event: EntityEvent): WorkspaceSyncEntityEventSnapshot;
59
68
  export declare function validateWorkspaceSyncV3EntityEventPayload(value: unknown): WorkspaceSyncEntityEventSnapshot;
@@ -279,6 +279,32 @@ export function validateWorkspaceSyncV3TaskAttachmentLinksPayload(value) {
279
279
  }
280
280
  return canonical;
281
281
  }
282
+ export function serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload(input) {
283
+ const canonical = serializeWorkspaceSyncV3TaskAttachmentLinksPayload(input);
284
+ const cardCoverAssetId = input.cardCoverAssetId == null
285
+ ? null
286
+ : requiredId(input.cardCoverAssetId, 'Task attachment links cardCoverAssetId');
287
+ if (cardCoverAssetId !== null && !canonical.links.some((link) => (link.assetId === cardCoverAssetId && link.role === 'image'))) {
288
+ throw new Error('Task attachment links cardCoverAssetId must reference an image link.');
289
+ }
290
+ return { ...canonical, cardCoverAssetId };
291
+ }
292
+ export function validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(value) {
293
+ const source = record(value, 'Task attachment links v2 payload');
294
+ exactKeys(source, new Set(['taskId', 'links', 'cardCoverAssetId']), 'Task attachment links v2 payload');
295
+ if (!Object.prototype.hasOwnProperty.call(source, 'cardCoverAssetId')) {
296
+ throw new Error('Task attachment links v2 payload must explicitly carry cardCoverAssetId.');
297
+ }
298
+ const canonical = serializeWorkspaceSyncV3TaskAttachmentLinksV2Payload({
299
+ taskId: requiredId(source.taskId, 'Task attachment links taskId'),
300
+ links: source.links,
301
+ cardCoverAssetId: source.cardCoverAssetId,
302
+ });
303
+ if (canonicalWorkspaceSyncJson(canonical) !== canonicalWorkspaceSyncJson(value)) {
304
+ throw new Error('Task attachment links v2 payload is not canonically ordered or normalized.');
305
+ }
306
+ return canonical;
307
+ }
282
308
  export function serializeWorkspaceSyncV3EntityEventPayload(event) {
283
309
  const serialized = serializeEntityActivityForSync(event);
284
310
  assertMetadataOnly(serialized.details, 'Entity event details');
@@ -33,15 +33,25 @@ export declare const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS: readonly [Readon
33
33
  dependencies: readonly ["initiative/full-v1", "workstream/full-v1", "task/root-v1"];
34
34
  operationAtomic: true;
35
35
  }>];
36
+ export declare const WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION: Readonly<{
37
+ readonly projectionId: "task-attachment-links/full-v2";
38
+ readonly domain: "task-attachment-links";
39
+ readonly schemaVersion: 2;
40
+ readonly mutationKinds: readonly string[];
41
+ readonly fields: readonly string[];
42
+ readonly dependencies: readonly ["task/root-v1"];
43
+ readonly operationAtomic: true;
44
+ }>;
36
45
  export declare function projectWorkspaceSyncV3NestedTaskJournalRow(row: WorkspaceSyncJournalRow): WorkspaceSyncV3FeedEntry | null;
46
+ export declare function projectWorkspaceSyncV3NestedTaskV2JournalRow(row: WorkspaceSyncJournalRow): WorkspaceSyncV3FeedEntry | null;
37
47
  export declare function validateWorkspaceSyncV3NestedTaskFeedEntry(entry: WorkspaceSyncV3FeedEntry): void;
38
- /**
39
- * Operation projector for nested/event coverage. Ordinary writers emit
40
- * parent-first operations; repair baselines and comment reconcile may emit
41
- * nested-only groups that still project when every row is a nested domain.
42
- */
43
48
  export declare function projectWorkspaceSyncV3NestedTaskOperation(input: {
44
49
  rows: readonly WorkspaceSyncJournalRow[];
45
50
  cycleHighWatermark: string;
46
51
  followingRow?: WorkspaceSyncJournalRow | null;
47
52
  }): WorkspaceSyncV3FeedEntry[] | null;
53
+ export declare function projectWorkspaceSyncV3NestedTaskV2Operation(input: {
54
+ rows: readonly WorkspaceSyncJournalRow[];
55
+ cycleHighWatermark: string;
56
+ followingRow?: WorkspaceSyncJournalRow | null;
57
+ }): WorkspaceSyncV3FeedEntry[] | null;
@@ -4,7 +4,7 @@ import { assertWorkspaceSyncV3OperationBoundary } from './workspaceSyncV3Operati
4
4
  import { projectWorkspaceSyncV3TaskRootJournalRow } from './workspaceSyncV3TaskRootProjection.js';
5
5
  import { projectWorkspaceSyncV3InitiativeJournalRow } from './workspaceSyncV3Feed.js';
6
6
  import { projectWorkspaceSyncV3WorkstreamJournalRow } from './workspaceSyncV3WorkstreamProjection.js';
7
- import { serializeWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
7
+ import { serializeWorkspaceSyncV3EntityEventPayload, serializeWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3EntityEventPayload, validateWorkspaceSyncV3TaskAttachmentLinksPayload, validateWorkspaceSyncV3TaskAttachmentLinksV2Payload, validateWorkspaceSyncV3TaskChecklistPayload, validateWorkspaceSyncV3TaskCommentAppendPayload, validateWorkspaceSyncV3TaskCommentsPayload, } from './workspaceSyncV3NestedTaskCodecs.js';
8
8
  import { isLegacyEntityEventAdoptionIdentity } from './entityEventLegacyAdoptionContract.js';
9
9
  export const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS = Object.freeze([
10
10
  Object.freeze({
@@ -46,6 +46,15 @@ export const WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS = Object.freeze([
46
46
  operationAtomic: true,
47
47
  }),
48
48
  ]);
49
+ export const WORKSPACE_SYNC_V3_TASK_ATTACHMENT_LINKS_V2_PROJECTION = Object.freeze({
50
+ projectionId: 'task-attachment-links/full-v2',
51
+ domain: 'task-attachment-links',
52
+ schemaVersion: 2,
53
+ mutationKinds: Object.freeze(['replace']),
54
+ fields: Object.freeze(['taskId', 'links', 'cardCoverAssetId']),
55
+ dependencies: Object.freeze(['task/root-v1']),
56
+ operationAtomic: true,
57
+ });
49
58
  const projectionByDomain = new Map(WORKSPACE_SYNC_V3_NESTED_TASK_PROJECTIONS.map((projection) => [projection.domain, projection.projectionId]));
50
59
  function sequence(value, label) {
51
60
  const text = String(value ?? '').trim();
@@ -68,7 +77,7 @@ function parsePayload(row) {
68
77
  throw new Error(`Nested task journal payload is malformed at ${row.sequence}.`);
69
78
  }
70
79
  }
71
- function canonicalPayload(row) {
80
+ function canonicalPayload(row, attachmentProjection) {
72
81
  const raw = parsePayload(row);
73
82
  if (row.domain === 'task-comments') {
74
83
  if (row.mutationKind === 'append') {
@@ -91,7 +100,17 @@ function canonicalPayload(row) {
91
100
  return { payload, canonicalFingerprint: fingerprintWorkspaceSyncPayload(payload) };
92
101
  }
93
102
  if (row.domain === 'task-attachment-links' && row.mutationKind === 'replace') {
94
- const payload = validateWorkspaceSyncV3TaskAttachmentLinksPayload(raw);
103
+ const payload = attachmentProjection === 'task-attachment-links/full-v2'
104
+ ? validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(raw)
105
+ : (() => {
106
+ try {
107
+ return validateWorkspaceSyncV3TaskAttachmentLinksPayload(raw);
108
+ }
109
+ catch {
110
+ const v2 = validateWorkspaceSyncV3TaskAttachmentLinksV2Payload(raw);
111
+ return serializeWorkspaceSyncV3TaskAttachmentLinksPayload(v2);
112
+ }
113
+ })();
95
114
  if (payload.taskId !== row.entityId)
96
115
  throw new Error(`Task attachment-link identity is invalid at ${row.sequence}.`);
97
116
  return { payload, canonicalFingerprint: fingerprintWorkspaceSyncPayload(payload) };
@@ -107,8 +126,10 @@ function canonicalPayload(row) {
107
126
  function canonicalEntityEventPayload(raw) {
108
127
  return validateWorkspaceSyncV3EntityEventPayload(serializeWorkspaceSyncV3EntityEventPayload(raw));
109
128
  }
110
- export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
111
- const projection = projectionByDomain.get(row.domain);
129
+ function projectNestedTaskJournalRow(row, attachmentProjection) {
130
+ const projection = row.domain === 'task-attachment-links'
131
+ ? attachmentProjection
132
+ : projectionByDomain.get(row.domain);
112
133
  if (!projection)
113
134
  return null;
114
135
  if (row.contractVersion !== WORKSPACE_SYNC_CONTRACT_VERSION) {
@@ -131,7 +152,7 @@ export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
131
152
  if (payload.action === 'sync-v3-repair-baseline')
132
153
  return null;
133
154
  }
134
- const { payload, canonicalFingerprint } = canonicalPayload(row);
155
+ const { payload, canonicalFingerprint } = canonicalPayload(row, attachmentProjection);
135
156
  return {
136
157
  sequence: journalSequence,
137
158
  projection,
@@ -146,8 +167,17 @@ export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
146
167
  occurredAt,
147
168
  };
148
169
  }
170
+ export function projectWorkspaceSyncV3NestedTaskJournalRow(row) {
171
+ return projectNestedTaskJournalRow(row, 'task-attachment-links/full-v1');
172
+ }
173
+ export function projectWorkspaceSyncV3NestedTaskV2JournalRow(row) {
174
+ return projectNestedTaskJournalRow(row, 'task-attachment-links/full-v2');
175
+ }
149
176
  export function validateWorkspaceSyncV3NestedTaskFeedEntry(entry) {
150
- const projected = projectWorkspaceSyncV3NestedTaskJournalRow({
177
+ const projector = entry.projection === 'task-attachment-links/full-v2'
178
+ ? projectWorkspaceSyncV3NestedTaskV2JournalRow
179
+ : projectWorkspaceSyncV3NestedTaskJournalRow;
180
+ const projected = projector({
151
181
  sequence: entry.sequence,
152
182
  contractVersion: WORKSPACE_SYNC_CONTRACT_VERSION,
153
183
  clientId: 'validation-client',
@@ -181,9 +211,9 @@ function assertNestedDependentOrder(rows) {
181
211
  throw new Error('Nested task operation dependents are duplicated or out of order.');
182
212
  }
183
213
  }
184
- function projectNestedDependentRows(rows) {
214
+ function projectNestedDependentRows(rows, attachmentProjection) {
185
215
  return rows.flatMap((row) => {
186
- const projected = projectWorkspaceSyncV3NestedTaskJournalRow(row);
216
+ const projected = projectNestedTaskJournalRow(row, attachmentProjection);
187
217
  if (!projected) {
188
218
  const payload = row.domain === 'entity-event'
189
219
  ? canonicalEntityEventPayload(parsePayload(row))
@@ -217,7 +247,7 @@ function isSupportedNestedOnlyOperation(rows) {
217
247
  * root. Apply still requires referenced parents to exist on the receiver; feed
218
248
  * only needs to project the nested rows.
219
249
  */
220
- function projectNestedOnlyOperation(rows) {
250
+ function projectNestedOnlyOperation(rows, attachmentProjection) {
221
251
  if (!isSupportedNestedOnlyOperation(rows)) {
222
252
  throw new Error('Nested-only task operation is not an allowed repair or reconciliation shape.');
223
253
  }
@@ -229,7 +259,7 @@ function projectNestedOnlyOperation(rows) {
229
259
  throw new Error('Nested task operation dependent identity does not match its task root.');
230
260
  }
231
261
  }
232
- const projected = projectNestedDependentRows(rows);
262
+ const projected = projectNestedDependentRows(rows, attachmentProjection);
233
263
  const events = projected
234
264
  .filter((entry) => entry.domain === 'entity-event')
235
265
  .map((entry) => validateWorkspaceSyncV3EntityEventPayload(entry.payload));
@@ -256,14 +286,14 @@ function projectNestedOnlyOperation(rows) {
256
286
  * parent-first operations; repair baselines and comment reconcile may emit
257
287
  * nested-only groups that still project when every row is a nested domain.
258
288
  */
259
- export function projectWorkspaceSyncV3NestedTaskOperation(input) {
289
+ function projectNestedTaskOperation(input, attachmentProjection) {
260
290
  if (!input.rows.some((row) => projectionByDomain.has(row.domain)))
261
291
  return null;
262
292
  assertWorkspaceSyncV3OperationBoundary(input);
263
293
  const [first, ...dependents] = input.rows;
264
294
  if (first && projectionByDomain.has(first.domain)
265
295
  && input.rows.every((row) => projectionByDomain.has(row.domain))) {
266
- return projectNestedOnlyOperation(input.rows);
296
+ return projectNestedOnlyOperation(input.rows, attachmentProjection);
267
297
  }
268
298
  if (!first || !['task', 'initiative', 'workstream'].includes(first.domain)) {
269
299
  throw new Error('Nested task operation must begin with its v3-owned parent root.');
@@ -272,7 +302,7 @@ export function projectWorkspaceSyncV3NestedTaskOperation(input) {
272
302
  throw new Error('Nested task operation contains an unsupported dependent row.');
273
303
  }
274
304
  assertNestedDependentOrder(dependents);
275
- const projectedDependents = projectNestedDependentRows(dependents);
305
+ const projectedDependents = projectNestedDependentRows(dependents, attachmentProjection);
276
306
  const eventRows = projectedDependents.filter((entry) => entry.domain === 'entity-event');
277
307
  const rawEventRows = dependents.filter((row) => row.domain === 'entity-event');
278
308
  const sentinelOnly = eventRows.length === 0 && rawEventRows.length > 0 && rawEventRows.every((row) => (canonicalEntityEventPayload(parsePayload(row)).action === 'sync-v3-repair-baseline'));
@@ -327,3 +357,9 @@ export function projectWorkspaceSyncV3NestedTaskOperation(input) {
327
357
  }
328
358
  return [parent, ...projectedDependents];
329
359
  }
360
+ export function projectWorkspaceSyncV3NestedTaskOperation(input) {
361
+ return projectNestedTaskOperation(input, 'task-attachment-links/full-v1');
362
+ }
363
+ export function projectWorkspaceSyncV3NestedTaskV2Operation(input) {
364
+ return projectNestedTaskOperation(input, 'task-attachment-links/full-v2');
365
+ }
@@ -2,7 +2,7 @@ import type { EntityEvent, TaskItem } from '../../types.js';
2
2
  import type { WorkspaceSyncV3ProjectionDescriptor } from './workspaceSyncV3FeedProfile.js';
3
3
  import { type WorkspaceSyncV3TaskAttachmentLink } from './workspaceSyncV3NestedTaskCodecs.js';
4
4
  export type WorkspaceSyncV3NestedTaskRepairCandidate = {
5
- projection: Extract<WorkspaceSyncV3ProjectionDescriptor, 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'entity-event/full-v1'>;
5
+ projection: Extract<WorkspaceSyncV3ProjectionDescriptor, 'task-comments/full-v1' | 'task-checklist/full-v1' | 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2' | 'entity-event/full-v1'>;
6
6
  domain: 'task-comments' | 'task-checklist' | 'task-attachment-links' | 'entity-event';
7
7
  entityId: string;
8
8
  mutationKind: 'replace' | 'append';
@@ -16,4 +16,5 @@ export declare function buildWorkspaceSyncV3NestedTaskRepairCandidates(input: {
16
16
  tasks: readonly TaskItem[];
17
17
  events: readonly EntityEvent[];
18
18
  attachmentLinksByTaskId?: ReadonlyMap<string, readonly WorkspaceSyncV3TaskAttachmentLink[]>;
19
+ attachmentProjection?: 'task-attachment-links/full-v1' | 'task-attachment-links/full-v2';
19
20
  }): WorkspaceSyncV3NestedTaskRepairCandidate[];