@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
@@ -156,6 +156,29 @@ export function useSyncOrchestrator(input) {
156
156
  const bootstrapPhaseStartedAtRef = useRef(null);
157
157
  const bootstrapLastProgressAtRef = useRef(null);
158
158
  const lastBootstrapPhaseRef = useRef('idle');
159
+ // Incremented every time the workspace-switch reset effect runs (including a
160
+ // switch back to the same workspace id). Reference-snapshot refreshes capture
161
+ // this value before their first await and refuse to commit a response whose
162
+ // generation has since moved on, so a stale/raced fetch can never overwrite a
163
+ // fresher (or freshly-reset) snapshot with data for the wrong workspace visit.
164
+ const workspaceSyncGenerationRef = useRef(0);
165
+ // Positive completeness signal for the document/asset snapshots, mirrored in a
166
+ // ref (not React state) so buildWorkspaceSyncPayload's ref-only read pattern
167
+ // can't observe a stale value from an earlier render's closure. Only ever set
168
+ // true immediately alongside a validated, non-stale successful refresh; reset
169
+ // to false whenever the workspace-switch effect invalidates the current
170
+ // generation. buildWorkspaceSyncPayloadModel refuses to compute any deletions
171
+ // for a domain while its completeness flag is false.
172
+ const workspaceSyncDocumentsSnapshotCompleteRef = useRef(false);
173
+ const workspaceSyncAssetsSnapshotCompleteRef = useRef(false);
174
+ // Per-domain monotonic request counters. Incremented at the start of every
175
+ // refresh call (independent of workspaceSyncGenerationRef, which only tracks
176
+ // workspace switches). Guards against two overlapping in-flight requests for
177
+ // the SAME workspace/generation — e.g. an interval tick firing while an
178
+ // event-triggered refresh is still in flight — where an older response could
179
+ // otherwise resolve after a newer one and overwrite fresher data.
180
+ const workspaceSyncDocumentsRequestSeqRef = useRef(0);
181
+ const workspaceSyncAssetsRequestSeqRef = useRef(0);
159
182
  // === SECTION: User global settings sync ===
160
183
  const clearUserSettingsRetry = useCallback(() => {
161
184
  if (userSettingsRetryTimeoutRef.current !== null) {
@@ -256,6 +279,7 @@ export function useSyncOrchestrator(input) {
256
279
  const workspaceLastPushedInitiativeWatermarksRef = useRef(new Map());
257
280
  const workspaceLastPushedWorkstreamIdsRef = useRef(new Set());
258
281
  const workspaceLastPushedWorkstreamWatermarksRef = useRef(new Map());
282
+ const workspaceLastPushedPlanningIdentityWatermarksRef = useRef(new Map());
259
283
  const workspaceLastPushedAiProfileIdsRef = useRef(new Set());
260
284
  const workspaceLastPushedAiProfileWatermarksRef = useRef(new Map());
261
285
  const workspaceLastPushedAiProfileChangeKeysRef = useRef(new Map());
@@ -288,6 +312,7 @@ export function useSyncOrchestrator(input) {
288
312
  workspaceLastPushedInitiativeWatermarksRef.current = persisted.initiativeWatermarks;
289
313
  workspaceLastPushedWorkstreamIdsRef.current = new Set(Array.from(persisted.workstreamWatermarks.keys()));
290
314
  workspaceLastPushedWorkstreamWatermarksRef.current = persisted.workstreamWatermarks;
315
+ workspaceLastPushedPlanningIdentityWatermarksRef.current = new Map(persisted.planningIdentityWatermarks || []);
291
316
  workspaceLastPushedAiProfileIdsRef.current = new Set(Array.from(persisted.aiProfileWatermarks.keys()));
292
317
  workspaceLastPushedAiProfileWatermarksRef.current = persisted.aiProfileWatermarks;
293
318
  workspaceLastPushedAiProfileChangeKeysRef.current = persisted.aiProfileChangeKeys || new Map();
@@ -319,6 +344,7 @@ export function useSyncOrchestrator(input) {
319
344
  taxonomyChangeKey: workspaceLastPushedTaxonomyChangeKeyRef.current,
320
345
  initiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
321
346
  workstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
347
+ planningIdentityWatermarks: workspaceLastPushedPlanningIdentityWatermarksRef.current,
322
348
  aiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef.current,
323
349
  aiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef.current,
324
350
  taskforceAgentWatermarks: workspaceLastPushedTaskforceAgentWatermarksRef.current,
@@ -604,6 +630,9 @@ export function useSyncOrchestrator(input) {
604
630
  taxonomyStateFingerprint
605
631
  ]);
606
632
  useEffect(() => {
633
+ workspaceSyncGenerationRef.current += 1;
634
+ workspaceSyncDocumentsSnapshotCompleteRef.current = false;
635
+ workspaceSyncAssetsSnapshotCompleteRef.current = false;
607
636
  workspaceSyncMarkdownDocumentsFingerprintRef.current = '';
608
637
  workspaceSyncAiProfilesFingerprintRef.current = '';
609
638
  workspaceSyncAssetsFingerprintRef.current = '';
@@ -612,11 +641,15 @@ export function useSyncOrchestrator(input) {
612
641
  workspaceSyncTaskforceAgentsFingerprintRef.current = '';
613
642
  workspaceAttachBootstrapBaselineSignatureRef.current = '';
614
643
  workspaceCaptureAttachBootstrapBaselineRef.current = false;
644
+ workspaceSyncMarkdownDocumentsRef.current = [];
645
+ workspaceSyncKnownDocumentPathsRef.current = new Set();
615
646
  setWorkspaceSyncMarkdownDocuments([]);
616
647
  setWorkspaceSyncMarkdownDocumentsFingerprint('');
617
648
  workspaceSyncAiProfilesRef.current = [];
618
649
  setWorkspaceSyncAiProfiles([]);
619
650
  setWorkspaceSyncAiProfilesFingerprint('');
651
+ workspaceSyncAssetsRef.current = [];
652
+ workspaceSyncKnownAssetPathsRef.current = new Set();
620
653
  setWorkspaceSyncAssets([]);
621
654
  setWorkspaceSyncAssetsFingerprint('');
622
655
  workspaceSyncDocumentReviewSessionsRef.current = [];
@@ -648,6 +681,7 @@ export function useSyncOrchestrator(input) {
648
681
  workspaceLastPushedInitiativeWatermarksRef.current = new Map();
649
682
  workspaceLastPushedWorkstreamIdsRef.current = new Set();
650
683
  workspaceLastPushedWorkstreamWatermarksRef.current = new Map();
684
+ workspaceLastPushedPlanningIdentityWatermarksRef.current = new Map();
651
685
  workspaceLastPushedAiProfileIdsRef.current = new Set();
652
686
  workspaceLastPushedAiProfileWatermarksRef.current = new Map();
653
687
  workspaceLastPushedAiProfileChangeKeysRef.current = new Map();
@@ -806,6 +840,7 @@ export function useSyncOrchestrator(input) {
806
840
  lastPushedInitiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef,
807
841
  lastPushedWorkstreamIds: workspaceLastPushedWorkstreamIdsRef,
808
842
  lastPushedWorkstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef,
843
+ lastPushedPlanningIdentityWatermarks: workspaceLastPushedPlanningIdentityWatermarksRef,
809
844
  lastPushedAiProfileIds: workspaceLastPushedAiProfileIdsRef,
810
845
  lastPushedAiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef,
811
846
  lastPushedAiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef,
@@ -937,6 +972,8 @@ export function useSyncOrchestrator(input) {
937
972
  assets: workspaceSyncAssetsRef.current,
938
973
  currentDocumentPaths: workspaceSyncKnownDocumentPathsRef.current,
939
974
  currentAssetPaths: workspaceSyncKnownAssetPathsRef.current,
975
+ documentsSnapshotComplete: workspaceSyncDocumentsSnapshotCompleteRef.current,
976
+ assetsSnapshotComplete: workspaceSyncAssetsSnapshotCompleteRef.current,
940
977
  documentReviewSessions: workspaceSyncDocumentReviewSessionsRef.current,
941
978
  documentReviewComments: workspaceSyncDocumentReviewCommentsRef.current,
942
979
  annotatedAttachmentSessions: workspaceSyncAnnotatedAttachmentSessionsRef.current,
@@ -961,6 +998,7 @@ export function useSyncOrchestrator(input) {
961
998
  lastPushedInitiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
962
999
  lastPushedWorkstreamIds: workspaceLastPushedWorkstreamIdsRef.current,
963
1000
  lastPushedWorkstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
1001
+ lastPushedPlanningIdentityWatermarks: workspaceLastPushedPlanningIdentityWatermarksRef.current,
964
1002
  lastPushedAiProfileIds: workspaceLastPushedAiProfileIdsRef.current,
965
1003
  lastPushedAiProfileWatermarks: workspaceLastPushedAiProfileWatermarksRef.current,
966
1004
  lastPushedAiProfileChangeKeys: workspaceLastPushedAiProfileChangeKeysRef.current,
@@ -1165,14 +1203,27 @@ export function useSyncOrchestrator(input) {
1165
1203
  return false;
1166
1204
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1167
1205
  return false;
1206
+ // See refreshWorkspaceSyncAssetsSnapshot for the snapshot-completeness contract
1207
+ // this mirrors: only a response that still answers the CURRENT workspace visit
1208
+ // may be committed or raise "ready".
1209
+ const requestWorkspaceId = currentWorkspaceId;
1210
+ const requestGeneration = workspaceSyncGenerationRef.current;
1211
+ const requestSeq = (workspaceSyncDocumentsRequestSeqRef.current += 1);
1212
+ const isStaleRequest = () => (requestWorkspaceId !== currentWorkspaceIdRef.current
1213
+ || requestGeneration !== workspaceSyncGenerationRef.current
1214
+ || requestSeq !== workspaceSyncDocumentsRequestSeqRef.current);
1168
1215
  try {
1169
1216
  const res = await fetch(`/api/taskforce/sync/workspace/documents?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1170
1217
  method: 'GET',
1171
1218
  credentials: 'include'
1172
1219
  });
1220
+ if (isStaleRequest())
1221
+ return false;
1173
1222
  if (!res.ok)
1174
1223
  return false;
1175
1224
  const data = await res.json();
1225
+ if (isStaleRequest())
1226
+ return false;
1176
1227
  if (!Array.isArray(data?.documents))
1177
1228
  return false;
1178
1229
  const docs = Array.isArray(data?.documents)
@@ -1201,13 +1252,18 @@ export function useSyncOrchestrator(input) {
1201
1252
  const fingerprint = typeof data?.fingerprint === 'string'
1202
1253
  ? data.fingerprint
1203
1254
  : JSON.stringify(docs.map((entry) => `${entry.path}:${entry.updatedAt}:${entry.content.length}`).sort());
1204
- if (fingerprint === workspaceSyncMarkdownDocumentsFingerprintRef.current)
1255
+ if (isStaleRequest())
1256
+ return false;
1257
+ if (fingerprint === workspaceSyncMarkdownDocumentsFingerprintRef.current) {
1258
+ workspaceSyncDocumentsSnapshotCompleteRef.current = true;
1205
1259
  return true;
1260
+ }
1206
1261
  workspaceSyncMarkdownDocumentsFingerprintRef.current = fingerprint;
1207
1262
  workspaceSyncMarkdownDocumentsRef.current = docs;
1208
1263
  workspaceSyncKnownDocumentPathsRef.current = knownDocumentPaths;
1209
1264
  setWorkspaceSyncMarkdownDocuments(docs);
1210
1265
  setWorkspaceSyncMarkdownDocumentsFingerprint(fingerprint);
1266
+ workspaceSyncDocumentsSnapshotCompleteRef.current = true;
1211
1267
  return true;
1212
1268
  }
1213
1269
  catch (error) {
@@ -1218,6 +1274,12 @@ export function useSyncOrchestrator(input) {
1218
1274
  return false;
1219
1275
  }
1220
1276
  finally {
1277
+ // General push readiness intentionally stays decoupled from the strict
1278
+ // per-domain completeness contract above: a domain that's temporarily
1279
+ // erroring must not block ALL sync forever. What must never happen is
1280
+ // this domain's ref/deletion-completeness being treated as trustworthy
1281
+ // off the back of a failed or stale fetch — that's guarded above, not
1282
+ // here. See workspaceSyncDocumentsSnapshotCompleteRef.
1221
1283
  markWorkspaceSyncReferenceSnapshotReady('documents');
1222
1284
  }
1223
1285
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
@@ -1288,14 +1350,31 @@ export function useSyncOrchestrator(input) {
1288
1350
  return false;
1289
1351
  if (cloudAuthConfigured && (!authSessionResolved || !isAuthenticated))
1290
1352
  return false;
1353
+ // Snapshot-completeness contract: a response is only ever committed, and
1354
+ // "ready" only ever raised, when it demonstrably answers the CURRENT
1355
+ // workspace visit. Any failure, malformed payload, or response that
1356
+ // resolves after the workspace has moved on (switched away and possibly
1357
+ // back) is discarded outright — never coerced into "assume unchanged" or
1358
+ // "assume empty". This is what makeWorkspaceSyncPayloadModel's delete-diff
1359
+ // relies on via assetsSnapshotComplete.
1360
+ const requestWorkspaceId = currentWorkspaceId;
1361
+ const requestGeneration = workspaceSyncGenerationRef.current;
1362
+ const requestSeq = (workspaceSyncAssetsRequestSeqRef.current += 1);
1363
+ const isStaleRequest = () => (requestWorkspaceId !== currentWorkspaceIdRef.current
1364
+ || requestGeneration !== workspaceSyncGenerationRef.current
1365
+ || requestSeq !== workspaceSyncAssetsRequestSeqRef.current);
1291
1366
  try {
1292
1367
  const res = await fetch(`/api/taskforce/sync/workspace/assets?workspaceId=${encodeURIComponent(currentWorkspaceId)}`, {
1293
1368
  method: 'GET',
1294
1369
  credentials: 'include'
1295
1370
  });
1371
+ if (isStaleRequest())
1372
+ return false;
1296
1373
  if (!res.ok)
1297
1374
  return false;
1298
1375
  const data = await res.json();
1376
+ if (isStaleRequest())
1377
+ return false;
1299
1378
  if (!Array.isArray(data?.assets))
1300
1379
  return false;
1301
1380
  const assets = Array.isArray(data?.assets)
@@ -1328,13 +1407,18 @@ export function useSyncOrchestrator(input) {
1328
1407
  const fingerprint = typeof data?.fingerprint === 'string'
1329
1408
  ? data.fingerprint
1330
1409
  : JSON.stringify(assets.map((entry) => `${entry.path}:${entry.updatedAt}:${entry.contentBase64.length}`).sort());
1331
- if (fingerprint === workspaceSyncAssetsFingerprintRef.current)
1410
+ if (isStaleRequest())
1411
+ return false;
1412
+ if (fingerprint === workspaceSyncAssetsFingerprintRef.current) {
1413
+ workspaceSyncAssetsSnapshotCompleteRef.current = true;
1332
1414
  return true;
1415
+ }
1333
1416
  workspaceSyncAssetsFingerprintRef.current = fingerprint;
1334
1417
  workspaceSyncAssetsRef.current = assets;
1335
1418
  workspaceSyncKnownAssetPathsRef.current = knownAssetPaths;
1336
1419
  setWorkspaceSyncAssets(assets);
1337
1420
  setWorkspaceSyncAssetsFingerprint(fingerprint);
1421
+ workspaceSyncAssetsSnapshotCompleteRef.current = true;
1338
1422
  return true;
1339
1423
  }
1340
1424
  catch (error) {
@@ -1345,6 +1429,8 @@ export function useSyncOrchestrator(input) {
1345
1429
  return false;
1346
1430
  }
1347
1431
  finally {
1432
+ // See refreshWorkspaceSyncMarkdownDocumentsSnapshot: general push
1433
+ // readiness stays decoupled from the strict completeness contract above.
1348
1434
  markWorkspaceSyncReferenceSnapshotReady('assets');
1349
1435
  }
1350
1436
  }, [runtimeMode, currentWorkspaceId, cloudAuthConfigured, authSessionResolved, isAuthenticated, markWorkspaceSyncReferenceSnapshotReady]);
@@ -1622,6 +1708,16 @@ export function useSyncOrchestrator(input) {
1622
1708
  workspaceLastPushedWorkstreamWatermarksRef.current = new Map(workspaceWorkstreamsRef.current
1623
1709
  .map((entry) => [String(entry?.id || '').trim(), String(entry?.updatedAt || entry?.createdAt || '').trim()])
1624
1710
  .filter(([id]) => id.length > 0));
1711
+ workspaceLastPushedPlanningIdentityWatermarksRef.current = new Map([
1712
+ ...workspaceInitiativesRef.current.map((entry) => [
1713
+ `initiative:${String(entry?.id || '').trim()}`,
1714
+ String(entry?.identityUpdatedAt || '').trim(),
1715
+ ]),
1716
+ ...workspaceWorkstreamsRef.current.map((entry) => [
1717
+ `workstream:${String(entry?.id || '').trim()}`,
1718
+ String(entry?.identityUpdatedAt || '').trim(),
1719
+ ]),
1720
+ ].filter(([key, watermark]) => !key.endsWith(':') && Number.isFinite(Date.parse(watermark))));
1625
1721
  workspaceLastPushedAiProfileIdsRef.current = new Set(workspaceSyncAiProfilesRef.current
1626
1722
  .map((entry) => String(entry?.id || '').trim())
1627
1723
  .filter((id) => id.length > 0));
@@ -2636,6 +2732,8 @@ export function useSyncOrchestrator(input) {
2636
2732
  phase: localCoordinator.phase,
2637
2733
  snapshot: localCoordinator.snapshot,
2638
2734
  errorMessage: localCoordinator.error?.message || null,
2735
+ activeCommandType: localCoordinator.activeCommandType,
2736
+ activePriorityCommandType: localCoordinator.activePriorityCommandType,
2639
2737
  }
2640
2738
  : null;
2641
2739
  const switchLocalCoordinatorWorkspace = useCallback(async (targetWorkspaceId) => {
@@ -2677,6 +2775,16 @@ export function useSyncOrchestrator(input) {
2677
2775
  runtimeMode,
2678
2776
  workspaceCloudSyncEnabled,
2679
2777
  ]);
2778
+ const clearLocalCoordinatorCredential = useCallback(async () => {
2779
+ if (runtimeMode !== 'local'
2780
+ || !localCoordinatorAttachmentEnabled)
2781
+ return false;
2782
+ return localCoordinator.clearCredential();
2783
+ }, [
2784
+ localCoordinator,
2785
+ localCoordinatorAttachmentEnabled,
2786
+ runtimeMode,
2787
+ ]);
2680
2788
  return {
2681
2789
  userGlobalSyncStatus,
2682
2790
  setUserGlobalSyncStatus,
@@ -2700,6 +2808,7 @@ export function useSyncOrchestrator(input) {
2700
2808
  localCoordinatorStatus,
2701
2809
  switchLocalCoordinatorWorkspace,
2702
2810
  transferLocalCoordinatorOwnership,
2811
+ clearLocalCoordinatorCredential,
2703
2812
  syncInFlightRef,
2704
2813
  workspaceRetryAt,
2705
2814
  isWorkspaceRetryPending,
@@ -1,3 +1,28 @@
1
+ /**
2
+ * useTaskData
3
+ *
4
+ * Manages the task fetch lifecycle, recently-changed-task highlighting,
5
+ * and merge/coalesce helpers. Task and archive state arrays live in
6
+ * useTaskforce.ts (because they must be passed to useSyncOrchestrator),
7
+ * but all fetch and mutation helpers are encapsulated here.
8
+ *
9
+ * === SECTION MAP ===
10
+ * === SECTION: Recently Changed === — recentlyChangedTaskIds, markRecentlyChangedTasks, timer cleanup
11
+ * === SECTION: Fetch Functions === — fetchTasks, fetchArchive, refreshTaskCollections, refreshTaskCollectionsFromInvalidation
12
+ * === SECTION: Revision Tracking === — getTaskRevisionKey, taskRevisionMapRef, hasFetchedTasksRef
13
+ * === SECTION: Merge Helper === — mergeTaskFromServer
14
+ *
15
+ * Key return values:
16
+ * - fetchTasks(isSilent?, options?) — refresh the active task list
17
+ * - fetchArchive(isSilent?, options?) — refresh the archive
18
+ * - refreshTaskCollections(options?) — refresh both in parallel
19
+ * - refreshTaskCollectionsFromInvalidation() — scoped task collection refresh
20
+ * - mergeTaskFromServer(task) — merge a single server response into both collections
21
+ * - markRecentlyChangedTasks(ids) — flag task IDs for highlight animation
22
+ * - recentlyChangedTaskIds — task IDs that changed in the last 2s
23
+ * - getTaskRevisionKey(task) — stable revision string for change detection
24
+ */
25
+ import { type MutableRefObject } from 'react';
1
26
  import type { TaskItem } from '../types';
2
27
  interface UseTaskDataProps {
3
28
  tasks: TaskItem[];
@@ -12,10 +37,19 @@ interface UseTaskDataProps {
12
37
  handleUnauthorized: () => void;
13
38
  /** Only used to detect auth changes in the fetch dependency array */
14
39
  authRequiredForApi: boolean;
40
+ setError?: (value: string) => void;
41
+ setLoading?: (value: boolean) => void;
42
+ pendingTaskMetadataOverlaysRef?: MutableRefObject<Map<string, PendingTaskMetadataOverlay>>;
15
43
  }
16
- export declare function useTaskData({ tasks, archivedTasks, setTasks, setArchivedTasks, setLoadingTasks, getCurrentWorkspaceId, workspaceResetKey, shouldDeferProtectedApiCalls, shouldBlockProtectedApiCalls, handleUnauthorized, authRequiredForApi }: UseTaskDataProps): {
44
+ export interface PendingTaskMetadataOverlay {
45
+ patch: Partial<TaskItem>;
46
+ observedUpdatedAt: string | null;
47
+ }
48
+ export declare function useTaskData({ tasks, archivedTasks, setTasks, setArchivedTasks, setLoadingTasks, getCurrentWorkspaceId, workspaceResetKey, shouldDeferProtectedApiCalls, shouldBlockProtectedApiCalls, handleUnauthorized, authRequiredForApi, setError, setLoading, pendingTaskMetadataOverlaysRef, }: UseTaskDataProps): {
17
49
  tasksRef: import("react").RefObject<TaskItem[]>;
18
50
  archivedTasksRef: import("react").RefObject<TaskItem[]>;
51
+ taskDetails: TaskItem[];
52
+ staleTaskDetailRevisions: Record<string, string>;
19
53
  recentlyChangedTaskIds: string[];
20
54
  markRecentlyChangedTasks: (taskIds: string[]) => void;
21
55
  fetchTasks: (isSilent?: boolean, options?: {
@@ -26,6 +60,11 @@ export declare function useTaskData({ tasks, archivedTasks, setTasks, setArchive
26
60
  fetchArchive: (isSilent?: boolean, options?: {
27
61
  ignoreAuthGuard?: boolean;
28
62
  }) => Promise<boolean>;
63
+ loadTaskDetail: (task: TaskItem, options?: {
64
+ shouldCommit?: () => boolean;
65
+ force?: boolean;
66
+ }) => Promise<TaskItem | null>;
67
+ cancelTaskDetailLoad: () => void;
29
68
  refreshTaskCollections: (options?: {
30
69
  isSilent?: boolean;
31
70
  ignoreAuthGuard?: boolean;