@taskforcehq/taskforce 0.3.305 → 0.3.307

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 (440) hide show
  1. package/README.md +0 -2
  2. package/dist/Taskforce.module.css +603 -107
  3. package/dist/TaskforceCore.js +216 -43
  4. package/dist/TaskforceCore.test.js +611 -28
  5. package/dist/assets/fonts/CourierPrime-Bold.woff2 +0 -0
  6. package/dist/assets/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  7. package/dist/assets/fonts/CourierPrime-Italic.woff2 +0 -0
  8. package/dist/assets/fonts/CourierPrime-Regular.woff2 +0 -0
  9. package/dist/assets/fonts/Noir_medium.woff2 +0 -0
  10. package/dist/assets/fonts/Noir_regular.woff2 +0 -0
  11. package/dist/assets/fonts/RussoOne-Regular.woff2 +0 -0
  12. package/dist/assets/fonts/SpecialElite-Regular.woff2 +0 -0
  13. package/dist/compat/workspaceSyncCompat.js +46 -2
  14. package/dist/compat/workspaceSyncCompat.test.js +38 -1
  15. package/dist/components/activity/EntityActivityTimeline.d.ts +34 -0
  16. package/dist/components/activity/EntityActivityTimeline.js +81 -0
  17. package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
  18. package/dist/components/context/ContextAttachmentManager.js +561 -0
  19. package/dist/components/features/AgentsModule.d.ts +14 -1
  20. package/dist/components/features/AgentsModule.js +366 -18
  21. package/dist/components/features/AgentsModule.test.js +507 -8
  22. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +3 -1
  23. package/dist/components/features/AnnotatedAttachmentWorkspace.js +118 -4
  24. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +52 -0
  25. package/dist/components/features/DocumentIndex.d.ts +2 -2
  26. package/dist/components/features/DocumentIndex.js +3 -4
  27. package/dist/components/features/DocumentViewer.d.ts +7 -1
  28. package/dist/components/features/DocumentViewer.js +62 -4
  29. package/dist/components/features/DocumentWorkspace.d.ts +10 -2
  30. package/dist/components/features/DocumentWorkspace.js +15 -4
  31. package/dist/components/features/DocumentWorkspace.test.js +51 -1
  32. package/dist/components/features/TaskSettings.d.ts +2 -0
  33. package/dist/components/features/TaskSettings.js +83 -78
  34. package/dist/components/features/TaskSettings.test.js +171 -82
  35. package/dist/components/features/documentWorkspaceModel.d.ts +1 -1
  36. package/dist/components/task/TaskActionHeader.js +11 -5
  37. package/dist/components/task/TaskActionHeader.test.js +10 -0
  38. package/dist/components/task/TaskCard.js +24 -29
  39. package/dist/components/task/TaskCard.test.js +38 -3
  40. package/dist/components/task/TaskContextUpload.js +4 -526
  41. package/dist/components/task/TaskContextUpload.test.js +3 -3
  42. package/dist/components/task/TaskForm.js +61 -116
  43. package/dist/components/task/TaskForm.test.js +110 -8
  44. package/dist/components/task/TaskKanban.d.ts +2 -1
  45. package/dist/components/task/TaskKanban.js +94 -21
  46. package/dist/components/task/TaskKanban.test.js +36 -0
  47. package/dist/components/task/TaskList.js +5 -1
  48. package/dist/components/task/TaskList.test.js +4 -0
  49. package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
  50. package/dist/components/ui/EditableAvatarButton.js +18 -0
  51. package/dist/components/ui/HierarchyActionBadge.d.ts +10 -0
  52. package/dist/components/ui/HierarchyActionBadge.js +5 -0
  53. package/dist/components/views/AppShellHeader.d.ts +3 -1
  54. package/dist/components/views/AppShellHeader.js +27 -11
  55. package/dist/components/views/AppShellHeader.test.js +18 -1
  56. package/dist/components/views/PlanComparisonPage.d.ts +9 -1
  57. package/dist/components/views/PlanComparisonPage.js +78 -14
  58. package/dist/components/views/PlanComparisonPage.test.js +257 -0
  59. package/dist/components/views/PlansPage.js +127 -36
  60. package/dist/components/views/PlansPage.test.js +294 -12
  61. package/dist/components/views/StandaloneLayout.js +529 -592
  62. package/dist/components/views/WidgetView.js +10 -8
  63. package/dist/components/views/panels/PlanningDrawer.d.ts +25 -5
  64. package/dist/components/views/panels/PlanningDrawer.js +270 -55
  65. package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
  66. package/dist/components/views/panels/PlanningDrawer.test.js +529 -0
  67. package/dist/components/views/planningScope.d.ts +20 -0
  68. package/dist/components/views/planningScope.js +25 -0
  69. package/dist/components/views/planningScope.test.d.ts +1 -0
  70. package/dist/components/views/planningScope.test.js +60 -0
  71. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +26 -1
  72. package/dist/components/views/standalone/modals/AccountHubModal.js +76 -2
  73. package/dist/components/views/standalone/modals/AccountHubModal.test.js +20 -3
  74. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
  75. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
  76. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
  77. package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
  78. package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
  79. package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
  80. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
  81. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
  82. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
  83. package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
  84. package/dist/config/envSchema.js +1 -0
  85. package/dist/core/AiProfileService.d.ts +46 -2
  86. package/dist/core/AiProfileService.js +1073 -82
  87. package/dist/core/AiProfileService.test.js +19 -1
  88. package/dist/core/AiProfiles.test.js +1249 -44
  89. package/dist/core/AttachmentLinkService.d.ts +3 -0
  90. package/dist/core/AttachmentLinkService.js +110 -23
  91. package/dist/core/AuthIdentityService.d.ts +107 -0
  92. package/dist/core/AuthIdentityService.js +284 -0
  93. package/dist/core/AuthTokenService.d.ts +4 -0
  94. package/dist/core/AuthTokenService.js +34 -6
  95. package/dist/core/AuthTokenService.test.js +3 -3
  96. package/dist/core/EntitlementsPolicy.test.js +2 -2
  97. package/dist/core/GlobalSettingsService.js +127 -6
  98. package/dist/core/McpTokenService.d.ts +12 -0
  99. package/dist/core/McpTokenService.js +44 -1
  100. package/dist/core/PlanEntitlementService.d.ts +23 -2
  101. package/dist/core/PlanEntitlementService.js +343 -57
  102. package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
  103. package/dist/core/PlanFeatureCatalog.test.js +84 -0
  104. package/dist/core/PlanVersionPolicy.test.js +35 -2
  105. package/dist/core/PlanningEntities.test.js +418 -4
  106. package/dist/core/SignupMonetizationSettings.test.js +199 -27
  107. package/dist/core/SyncReconciliationService.js +2 -65
  108. package/dist/core/SystemAdmin.test.js +42 -42
  109. package/dist/core/TaskActivityService.d.ts +28 -1
  110. package/dist/core/TaskActivityService.js +227 -46
  111. package/dist/core/TaskActivitySync.test.d.ts +1 -0
  112. package/dist/core/TaskActivitySync.test.js +90 -0
  113. package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
  114. package/dist/core/TaskAuditTimeline.test.js +96 -0
  115. package/dist/core/Taskforce.d.ts +415 -40
  116. package/dist/core/Taskforce.ids.test.js +58 -0
  117. package/dist/core/Taskforce.js +1543 -266
  118. package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
  119. package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
  120. package/dist/core/Taskforce.mcpAuth.test.js +109 -0
  121. package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
  122. package/dist/core/WorkspaceLifecycleService.js +0 -5
  123. package/dist/core/WorkspacePermissions.test.js +25 -1
  124. package/dist/core/WorkspacePlanMode.test.js +117 -16
  125. package/dist/core/shared.d.ts +1 -1
  126. package/dist/core/shared.js +5 -1
  127. package/dist/core/types.d.ts +75 -2
  128. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +28 -2
  129. package/dist/hooks/bootstrapTimeouts.d.ts +4 -0
  130. package/dist/hooks/bootstrapTimeouts.js +8 -0
  131. package/dist/hooks/bootstrapTimeouts.test.d.ts +1 -0
  132. package/dist/hooks/bootstrapTimeouts.test.js +12 -0
  133. package/dist/hooks/sync/bootstrap.js +2 -0
  134. package/dist/hooks/sync/controlPlane.d.ts +37 -0
  135. package/dist/hooks/sync/controlPlane.js +78 -0
  136. package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
  137. package/dist/hooks/sync/controlPlane.test.js +121 -0
  138. package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
  139. package/dist/hooks/sync/lifecyclePolicy.js +93 -0
  140. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
  141. package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
  142. package/dist/hooks/sync/orchestratorShared.d.ts +13 -4
  143. package/dist/hooks/sync/orchestratorShared.js +129 -48
  144. package/dist/hooks/sync/orchestratorShared.test.js +50 -1
  145. package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
  146. package/dist/hooks/sync/pullLifecycle.js +24 -0
  147. package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
  148. package/dist/hooks/sync/pullLifecycle.test.js +80 -0
  149. package/dist/hooks/sync/recovery.d.ts +16 -2
  150. package/dist/hooks/sync/recovery.js +179 -53
  151. package/dist/hooks/sync/recovery.test.d.ts +1 -0
  152. package/dist/hooks/sync/recovery.test.js +292 -0
  153. package/dist/hooks/sync/transfers.d.ts +16 -3
  154. package/dist/hooks/sync/transfers.js +210 -66
  155. package/dist/hooks/sync/transfers.test.d.ts +1 -0
  156. package/dist/hooks/sync/transfers.test.js +928 -0
  157. package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
  158. package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
  159. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
  160. package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
  161. package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
  162. package/dist/hooks/sync/useSyncStatusActions.js +88 -0
  163. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
  164. package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
  165. package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
  166. package/dist/hooks/sync/useSyncStatusControls.js +60 -0
  167. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
  168. package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
  169. package/dist/hooks/useFilterSort.js +13 -13
  170. package/dist/hooks/useFilterSort.test.js +87 -1
  171. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
  172. package/dist/hooks/useSyncOrchestrator.d.ts +9 -2
  173. package/dist/hooks/useSyncOrchestrator.js +409 -183
  174. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +407 -0
  175. package/dist/hooks/useTaskData.js +8 -3
  176. package/dist/hooks/useTaskData.test.js +45 -0
  177. package/dist/hooks/useTaskforce.d.ts +145 -52
  178. package/dist/hooks/useTaskforce.js +592 -253
  179. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
  180. package/dist/hooks/useTaskforce.runtime-routing.test.js +246 -0
  181. package/dist/hooks/useTaskforce.sync-behavior.test.js +2468 -201
  182. package/dist/hooks/useWorkspaceSyncController.d.ts +1 -0
  183. package/dist/hooks/useWorkspaceSyncController.js +13 -2
  184. package/dist/hooks/useWorkspaceSyncController.test.js +48 -0
  185. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
  186. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +328 -40
  187. package/dist/localization/locales/en-US.d.ts +0 -1
  188. package/dist/localization/locales/en-US.js +0 -1
  189. package/dist/localization/locales/es-419.js +0 -1
  190. package/dist/localization/locales/pt-BR.js +0 -1
  191. package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
  192. package/dist/mcp/canonicalAssetHelpers.js +18 -10
  193. package/dist/mcp/canonicalAssetHelpers.test.d.ts +1 -0
  194. package/dist/mcp/canonicalAssetHelpers.test.js +67 -0
  195. package/dist/mcp/clientIntegrations.d.ts +1 -0
  196. package/dist/mcp/clientIntegrations.js +25 -0
  197. package/dist/mcp/clientIntegrations.test.js +14 -3
  198. package/dist/mcp/clientProfileDefaults.js +3 -3
  199. package/dist/mcp/collaborationRegistrar.js +7 -7
  200. package/dist/mcp/documentAssetRegistrar.js +116 -10
  201. package/dist/mcp/runtime.d.ts +3 -0
  202. package/dist/mcp/runtime.js +1099 -185
  203. package/dist/mcp/runtime.test.js +1491 -140
  204. package/dist/mcp/taskAttachmentTypes.d.ts +1 -1
  205. package/dist/mcp/taskPlanningRegistrar.js +48 -0
  206. package/dist/mcp/toolRegistry.d.ts +56 -0
  207. package/dist/mcp/toolRegistry.js +8 -0
  208. package/dist/mcp/toolRegistry.test.js +4 -0
  209. package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
  210. package/dist/migrations/taskSchemaMigrations.js +192 -61
  211. package/dist/migrations/taskSchemaMigrations.test.js +15 -0
  212. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  213. package/dist/resources/templates/workflows/collaborate.yaml +1 -1
  214. package/dist/resources/templates/workflows/evaluate.yaml +2 -2
  215. package/dist/resources/templates/workflows/plan.yaml +1 -1
  216. package/dist/resources/templates/workflows/review.yaml +2 -2
  217. package/dist/server/aiProfileAvatarAssets.d.ts +49 -0
  218. package/dist/server/aiProfileAvatarAssets.js +319 -0
  219. package/dist/server/aiProfileAvatarAssets.test.d.ts +1 -0
  220. package/dist/server/aiProfileAvatarAssets.test.js +213 -0
  221. package/dist/server/annotatedAttachmentsRoutes.test.js +69 -10
  222. package/dist/server/auth/providers/apple.d.ts +33 -0
  223. package/dist/server/auth/providers/apple.js +82 -0
  224. package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
  225. package/dist/server/auth/providers/appleClientSecret.js +65 -0
  226. package/dist/server/auth/providers/github.d.ts +26 -0
  227. package/dist/server/auth/providers/github.js +86 -0
  228. package/dist/server/auth/providers/google.d.ts +21 -0
  229. package/dist/server/auth/providers/google.js +56 -0
  230. package/dist/server/auth/providers/types.d.ts +21 -0
  231. package/dist/server/auth/providers/types.js +1 -0
  232. package/dist/server/auth.d.ts +2 -0
  233. package/dist/server/auth.js +6 -3
  234. package/dist/server/documentReviewRoutes.test.js +36 -3
  235. package/dist/server/index.cookieProxy.test.js +1 -0
  236. package/dist/server/index.d.ts +12 -0
  237. package/dist/server/index.js +124 -9
  238. package/dist/server/index.rateLimit.test.js +3 -0
  239. package/dist/server/index.test.js +111 -3
  240. package/dist/server/routes/admin.d.ts +3 -0
  241. package/dist/server/routes/admin.js +459 -28
  242. package/dist/server/routes/annotatedAttachments.js +51 -0
  243. package/dist/server/routes/auth.d.ts +26 -2
  244. package/dist/server/routes/auth.js +1170 -71
  245. package/dist/server/routes/authSupport.d.ts +5 -1
  246. package/dist/server/routes/authSupport.js +13 -2
  247. package/dist/server/routes/billing.js +372 -35
  248. package/dist/server/routes/billing.test.js +595 -12
  249. package/dist/server/routes/documents.d.ts +1 -0
  250. package/dist/server/routes/documents.js +182 -70
  251. package/dist/server/routes/shared.d.ts +28 -2
  252. package/dist/server/routes/shared.js +69 -14
  253. package/dist/server/routes/sync.integration.test.js +658 -39
  254. package/dist/server/routes/sync.js +74 -608
  255. package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
  256. package/dist/server/routes/syncAuxRoutes.js +91 -0
  257. package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
  258. package/dist/server/routes/syncAuxRoutes.test.js +158 -0
  259. package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
  260. package/dist/server/routes/syncPullApplyRoutes.js +204 -0
  261. package/dist/server/routes/syncPushRoutes.d.ts +24 -0
  262. package/dist/server/routes/syncPushRoutes.js +212 -0
  263. package/dist/server/routes/syncRouteGuards.d.ts +36 -0
  264. package/dist/server/routes/syncRouteGuards.js +67 -0
  265. package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
  266. package/dist/server/routes/syncRouteGuards.test.js +94 -0
  267. package/dist/server/routes/syncRouteTypes.d.ts +13 -0
  268. package/dist/server/routes/syncRouteTypes.js +1 -0
  269. package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
  270. package/dist/server/routes/syncSnapshotRoutes.js +182 -0
  271. package/dist/server/routes/tasks.js +55 -10
  272. package/dist/server/routes/workspaces.js +36 -5
  273. package/dist/server/routes.js +147 -11
  274. package/dist/server/routes.test.js +2704 -183
  275. package/dist/services/workflowExportSnapshots.test.js +2 -0
  276. package/dist/shared/aiProfileSeatScope.d.ts +5 -0
  277. package/dist/shared/aiProfileSeatScope.js +21 -0
  278. package/dist/shared/aiProfileSurfaceType.d.ts +1 -1
  279. package/dist/shared/aiProfileSurfaceType.js +10 -8
  280. package/dist/shared/passwordPolicy.d.ts +13 -0
  281. package/dist/shared/passwordPolicy.js +84 -0
  282. package/dist/shared/passwordPolicy.test.d.ts +1 -0
  283. package/dist/shared/passwordPolicy.test.js +34 -0
  284. package/dist/storage/objectStorage.d.ts +1 -0
  285. package/dist/storage/objectStorage.js +2 -1
  286. package/dist/storage/objectStorageClient.d.ts +1 -0
  287. package/dist/storage/objectStorageClient.js +41 -8
  288. package/dist/storage/objectStorageClient.test.js +26 -1
  289. package/dist/storage/objectStorageConfig.js +3 -1
  290. package/dist/storage/objectStorageConfig.test.js +13 -1
  291. package/dist/storage/workspaceAssetStore.d.ts +15 -3
  292. package/dist/storage/workspaceAssetStore.js +132 -44
  293. package/dist/storage/workspaceAssetStore.test.js +93 -6
  294. package/dist/styles/fonts.css +70 -0
  295. package/dist/sync/collaborationSyncPayload.d.ts +6 -1
  296. package/dist/sync/collaborationSyncPayload.js +19 -11
  297. package/dist/sync/collaborationSyncPayload.test.js +14 -1
  298. package/dist/sync/collaborationSyncState.d.ts +3 -3
  299. package/dist/sync/collaborationSyncState.js +19 -12
  300. package/dist/sync/contentSyncPayload.d.ts +5 -1
  301. package/dist/sync/contentSyncPayload.js +9 -0
  302. package/dist/sync/contentSyncPayload.test.js +39 -0
  303. package/dist/sync/contentSyncState.d.ts +9 -9
  304. package/dist/sync/contentSyncState.js +248 -107
  305. package/dist/sync/planningSyncPayload.js +5 -0
  306. package/dist/sync/planningSyncPayload.test.js +24 -0
  307. package/dist/sync/syncApplyHandlers.d.ts +11 -4
  308. package/dist/sync/syncApplyHandlers.js +115 -42
  309. package/dist/sync/syncApplyHandlers.test.js +251 -4
  310. package/dist/sync/syncFieldSemantics.d.ts +12 -0
  311. package/dist/sync/syncFieldSemantics.js +55 -0
  312. package/dist/sync/syncResourceAdapters.d.ts +46 -0
  313. package/dist/sync/syncResourceAdapters.js +79 -0
  314. package/dist/sync/syncService.d.ts +6 -0
  315. package/dist/sync/syncService.js +65 -1
  316. package/dist/sync/syncService.test.js +96 -3
  317. package/dist/sync/taskSyncChangeKey.d.ts +2 -0
  318. package/dist/sync/taskSyncChangeKey.js +143 -0
  319. package/dist/sync/taskSyncPayload.js +3 -8
  320. package/dist/sync/workspacePullFeed.d.ts +4 -0
  321. package/dist/sync/workspacePullFeed.js +132 -72
  322. package/dist/sync/workspacePullFeed.test.js +92 -0
  323. package/dist/sync/workspaceRepair.js +5 -2
  324. package/dist/sync/workspaceSyncModel.d.ts +73 -6
  325. package/dist/sync/workspaceSyncModel.js +342 -73
  326. package/dist/sync/workspaceSyncModel.test.js +559 -14
  327. package/dist/sync/workspaceSyncState.d.ts +17 -0
  328. package/dist/sync/workspaceSyncState.js +2 -1
  329. package/dist/sync/workspaceSyncSurface.js +3 -8
  330. package/dist/types.d.ts +50 -2
  331. package/dist/ui/assets/AgentsModule-2y82_3DO.js +1 -0
  332. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTLZZCiQ.js +3 -0
  333. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +1 -0
  334. package/dist/ui/assets/ContextAttachmentManager-D2epuNnG.js +3 -0
  335. package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
  336. package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
  337. package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
  338. package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
  339. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +1 -0
  340. package/dist/ui/assets/DocumentWorkspace-sVa-3Do6.js +252 -0
  341. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +1 -0
  342. package/dist/ui/assets/EntityActivityTimeline-Zods27y_.js +1 -0
  343. package/dist/ui/assets/{InitiativesModule-Dhm7M8e7.js → InitiativesModule-D4XseTwW.js} +1 -1
  344. package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
  345. package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
  346. package/dist/ui/assets/PlansPage-D5AcbO0L.js +1 -0
  347. package/dist/ui/assets/PlansPage-Dvqsz5zc.css +1 -0
  348. package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
  349. package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
  350. package/dist/ui/assets/TaskContextUpload-uC5qx4Bv.js +1 -0
  351. package/dist/ui/assets/TaskSettings-CqvPAsTv.js +9 -0
  352. package/dist/ui/assets/{WorkflowsModule-BcS4afRn.js → WorkflowsModule-oOA9bcdK.js} +4 -4
  353. package/dist/ui/assets/documentReferences-DPZuTgHh.js +1 -0
  354. package/dist/ui/assets/index-607WPo_X.js +4 -0
  355. package/dist/ui/assets/index-CYyodXsg.css +1 -0
  356. package/dist/ui/assets/{vendor-icons-BSUaRwF8.js → vendor-icons-B32hGuF2.js} +1 -1
  357. package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
  358. package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
  359. package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
  360. package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  361. package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
  362. package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
  363. package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
  364. package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
  365. package/dist/ui/fonts/Noir_medium.otf +0 -0
  366. package/dist/ui/fonts/Noir_medium.woff2 +0 -0
  367. package/dist/ui/fonts/Noir_regular.otf +0 -0
  368. package/dist/ui/fonts/Noir_regular.woff2 +0 -0
  369. package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
  370. package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
  371. package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
  372. package/dist/ui/index.html +3 -3
  373. package/dist/ui/product/agent manager.png +0 -0
  374. package/dist/ui/product/agent_manager_02.png +0 -0
  375. package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
  376. package/dist/utils/aiProfileEvents.d.ts +7 -0
  377. package/dist/utils/aiProfileEvents.js +6 -0
  378. package/dist/utils/assignees.d.ts +8 -0
  379. package/dist/utils/assignees.js +10 -1
  380. package/dist/utils/assignees.test.d.ts +1 -0
  381. package/dist/utils/assignees.test.js +25 -0
  382. package/dist/utils/avatarDisplay.d.ts +1 -0
  383. package/dist/utils/avatarDisplay.js +15 -0
  384. package/dist/utils/avatarUpload.d.ts +27 -0
  385. package/dist/utils/avatarUpload.js +132 -0
  386. package/dist/utils/avatarUpload.test.d.ts +1 -0
  387. package/dist/utils/avatarUpload.test.js +40 -0
  388. package/dist/utils/bootstrapTrace.d.ts +7 -0
  389. package/dist/utils/bootstrapTrace.js +29 -0
  390. package/dist/utils/commercialLifecyclePresentation.js +3 -0
  391. package/dist/utils/contextAssetEvents.d.ts +2 -0
  392. package/dist/utils/contextFiles.d.ts +3 -1
  393. package/dist/utils/contextFiles.js +2 -1
  394. package/dist/utils/syncEventDetails.d.ts +3 -0
  395. package/dist/utils/syncEventDetails.js +64 -0
  396. package/dist/utils/syncEventDetails.test.d.ts +1 -0
  397. package/dist/utils/syncEventDetails.test.js +23 -0
  398. package/dist/utils/syncEventPresentation.d.ts +15 -0
  399. package/dist/utils/syncEventPresentation.js +129 -0
  400. package/dist/utils/syncEventPresentation.test.d.ts +1 -0
  401. package/dist/utils/syncEventPresentation.test.js +64 -0
  402. package/dist/utils/syncStatusPresentation.d.ts +72 -0
  403. package/dist/utils/syncStatusPresentation.js +217 -0
  404. package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
  405. package/dist/utils/syncStatusPresentation.test.js +164 -0
  406. package/dist/utils/taskActivity.d.ts +9 -1
  407. package/dist/utils/taskActivity.js +290 -22
  408. package/dist/utils/taskActivity.test.js +141 -8
  409. package/dist/utils/taskSearch.d.ts +22 -0
  410. package/dist/utils/taskSearch.js +87 -0
  411. package/dist/utils/taskSearch.test.d.ts +1 -0
  412. package/dist/utils/taskSearch.test.js +69 -0
  413. package/dist/utils/taskUtils.js +10 -3
  414. package/dist/utils/taskUtils.test.d.ts +1 -0
  415. package/dist/utils/taskUtils.test.js +19 -0
  416. package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
  417. package/dist/utils/workspaceSyncPresentation.js +68 -2
  418. package/dist/utils/workspaceSyncPresentation.test.js +36 -1
  419. package/package.json +3 -2
  420. package/scripts/export-sqlite-to-postgres.mjs +7 -9
  421. package/scripts/run-e2e-realtime.sh +17 -3
  422. package/scripts/run-smoke.sh +17 -5
  423. package/scripts/run-soak.sh +17 -5
  424. package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  425. package/src/resources/templates/workflows/collaborate.yaml +1 -1
  426. package/src/resources/templates/workflows/evaluate.yaml +2 -2
  427. package/src/resources/templates/workflows/plan.yaml +1 -1
  428. package/src/resources/templates/workflows/review.yaml +2 -2
  429. package/dist/ui/assets/AgentsModule-N2MnQBZk.js +0 -1
  430. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BG6P_GVW.js +0 -3
  431. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +0 -1
  432. package/dist/ui/assets/DocumentWorkspace-B3nV_Gc5.css +0 -1
  433. package/dist/ui/assets/DocumentWorkspace-DRbDMwh8.js +0 -252
  434. package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
  435. package/dist/ui/assets/PlansPage-Cq0zXj3I.js +0 -1
  436. package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
  437. package/dist/ui/assets/TaskSettings-ln0aF7xc.js +0 -9
  438. package/dist/ui/assets/index-C2-OXZV7.css +0 -1
  439. package/dist/ui/assets/index-DcSI5F86.js +0 -6
  440. package/scripts/migrate-planning-model.ts +0 -233
@@ -1,14 +1,19 @@
1
1
  import type { Dispatch, MutableRefObject, SetStateAction } from 'react';
2
2
  import { type EnsureWorkspaceReadyResult } from '../../sync/syncService';
3
- import type { WorkspaceSyncPayload } from '../../sync/workspaceSyncModel';
3
+ import type { WorkspaceSyncBaselineResetReason, WorkspaceSyncPayload } from '../../sync/workspaceSyncModel';
4
4
  import type { WorkspaceSyncPhase } from '../../sync/workspaceSyncState';
5
+ export interface PendingWorkspacePushReplay {
6
+ signature: string;
7
+ payload: WorkspaceSyncPayload;
8
+ forceAllAiProfiles: boolean;
9
+ repairMode: boolean;
10
+ }
5
11
  interface CreateWorkspaceTransferCoordinatorArgs {
6
12
  cloudAuthConfigured: boolean;
7
13
  runtimeMode: 'local' | 'cloud';
8
14
  workspaceCloudSyncEnabled: boolean;
9
15
  currentWorkspaceId: string;
10
16
  workspaceSyncPhase: WorkspaceSyncPhase;
11
- taxonomyStateFingerprint: string;
12
17
  isAuthenticated: boolean;
13
18
  checkAuthSession: () => Promise<boolean>;
14
19
  resolveCloudAuthUrl: (path: string) => string;
@@ -29,6 +34,8 @@ interface CreateWorkspaceTransferCoordinatorArgs {
29
34
  lastSyncedAt: string;
30
35
  pullCursor?: string | null;
31
36
  lastErrorMessage: null;
37
+ } | {
38
+ pullCursor: null;
32
39
  }) => void;
33
40
  persistWorkspaceSyncPatchBestEffort: (patch: {
34
41
  phase: 'active';
@@ -37,6 +44,7 @@ interface CreateWorkspaceTransferCoordinatorArgs {
37
44
  lastSyncedAt: string;
38
45
  lastErrorMessage: null;
39
46
  }) => Promise<unknown>;
47
+ persistWorkspaceSyncWatermarksSnapshotBestEffort: () => boolean;
40
48
  reportSyncEvent: (workspaceId: string, event: {
41
49
  eventType: 'pull' | 'handshake' | 'bootstrap' | 'apply' | 'push';
42
50
  status: 'success' | 'error';
@@ -52,6 +60,7 @@ interface CreateWorkspaceTransferCoordinatorArgs {
52
60
  refreshWorkspaceSyncMarkdownDocumentsSnapshot: () => Promise<void>;
53
61
  refreshWorkspaceSyncAiProfilesSnapshot: () => Promise<void>;
54
62
  refreshWorkspaceSyncAssetsSnapshot: () => Promise<void>;
63
+ refreshWorkspaceSyncPlanningEntitiesSnapshot: () => Promise<void>;
55
64
  refreshWorkspaceSyncDocumentReviewSessionsSnapshot: () => Promise<void>;
56
65
  refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot: () => Promise<void>;
57
66
  refreshLocalWorkspaceTaskCollections: () => Promise<void>;
@@ -70,6 +79,7 @@ interface CreateWorkspaceTransferCoordinatorArgs {
70
79
  workspaceForceFullAiProfilePushRef: MutableRefObject<boolean>;
71
80
  workspacePushInFlightRef: MutableRefObject<boolean>;
72
81
  workspacePullInFlightRef: MutableRefObject<boolean>;
82
+ workspacePendingPushReplayRef: MutableRefObject<PendingWorkspacePushReplay | null>;
73
83
  workspaceLastPushedSignatureRef: MutableRefObject<string>;
74
84
  workspacePendingSignatureRef: MutableRefObject<string>;
75
85
  workspaceLastPushedTaskIdsRef: MutableRefObject<Set<string>>;
@@ -77,12 +87,14 @@ interface CreateWorkspaceTransferCoordinatorArgs {
77
87
  workspaceDeletedTaskWatermarksRef: MutableRefObject<Map<string, string>>;
78
88
  workspacePullCursorRef: MutableRefObject<string | null>;
79
89
  workspaceLastPushedWatermarksRef: MutableRefObject<Map<string, string>>;
90
+ workspaceLastPushedTaskChangeKeysRef: MutableRefObject<Map<string, string>>;
80
91
  workspaceLastPushedInitiativeIdsRef: MutableRefObject<Set<string>>;
81
92
  workspaceLastPushedInitiativeWatermarksRef: MutableRefObject<Map<string, string>>;
82
93
  workspaceLastPushedWorkstreamIdsRef: MutableRefObject<Set<string>>;
83
94
  workspaceLastPushedWorkstreamWatermarksRef: MutableRefObject<Map<string, string>>;
84
95
  workspaceLastPushedAiProfileIdsRef: MutableRefObject<Set<string>>;
85
96
  workspaceLastPushedAiProfileWatermarksRef: MutableRefObject<Map<string, string>>;
97
+ workspaceLastPushedAiProfileChangeKeysRef: MutableRefObject<Map<string, string>>;
86
98
  workspaceLastPushedDocumentPathsRef: MutableRefObject<Set<string>>;
87
99
  workspaceLastPushedDocumentWatermarksRef: MutableRefObject<Map<string, string>>;
88
100
  workspaceLastPushedAssetPathsRef: MutableRefObject<Set<string>>;
@@ -94,6 +106,7 @@ interface CreateWorkspaceTransferCoordinatorArgs {
94
106
  workspaceLastPushedAnnotatedAttachmentSessionIdsRef: MutableRefObject<Set<string>>;
95
107
  workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef: MutableRefObject<Map<string, string>>;
96
108
  workspaceLastPushedTaskEventWatermarksRef: MutableRefObject<Map<string, string>>;
109
+ workspaceBaselineResetReasonRef: MutableRefObject<WorkspaceSyncBaselineResetReason | null>;
97
110
  workspaceCaptureAttachBootstrapBaselineRef: MutableRefObject<boolean>;
98
111
  workspaceStartupFullReconcileRanRef: MutableRefObject<boolean>;
99
112
  workspaceFullReconcileInFlightRef: MutableRefObject<boolean>;
@@ -110,7 +123,7 @@ interface CreateWorkspaceTransferCoordinatorArgs {
110
123
  setTasks: Dispatch<SetStateAction<any[]>>;
111
124
  setArchivedTasks: Dispatch<SetStateAction<any[]>>;
112
125
  }
113
- export declare function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtimeMode, workspaceCloudSyncEnabled, currentWorkspaceId, workspaceSyncPhase, taxonomyStateFingerprint, isAuthenticated, checkAuthSession, resolveCloudAuthUrl, ensureCloudWorkspaceReadyForSync, ensureWorkspaceSyncReady, handleSyncAuthFailure, clearWorkspaceRetry, clearWorkspaceIssue, isWorkspaceRetryPending, scheduleWorkspaceSyncRetry, persistWorkspaceSyncPatchSafely, persistWorkspaceSyncPatchBestEffort, reportSyncEvent, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, reportWorkspaceWindowContention, refreshWorkspaceSyncMarkdownDocumentsSnapshot, refreshWorkspaceSyncAiProfilesSnapshot, refreshWorkspaceSyncAssetsSnapshot, refreshWorkspaceSyncDocumentReviewSessionsSnapshot, refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot, refreshLocalWorkspaceTaskCollections, buildWorkspaceSyncPayload, buildWorkspaceSyncSignature, seedWorkspaceSnapshotPushBaseline, shouldSuppressAttachBootstrapPush, recordSuppressedEventIds, workspaceRepairModeRef, workspaceForceFullAiProfilePushRef, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, workspaceLastPushedWatermarksRef, workspaceLastPushedInitiativeIdsRef, workspaceLastPushedInitiativeWatermarksRef, workspaceLastPushedWorkstreamIdsRef, workspaceLastPushedWorkstreamWatermarksRef, workspaceLastPushedAiProfileIdsRef, workspaceLastPushedAiProfileWatermarksRef, workspaceLastPushedDocumentPathsRef, workspaceLastPushedDocumentWatermarksRef, workspaceLastPushedAssetPathsRef, workspaceLastPushedAssetWatermarksRef, workspaceLastPushedDocumentReviewSessionIdsRef, workspaceLastPushedDocumentReviewSessionWatermarksRef, workspaceLastPushedDocumentReviewCommentIdsRef, workspaceLastPushedDocumentReviewCommentWatermarksRef, workspaceLastPushedAnnotatedAttachmentSessionIdsRef, workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef, workspaceLastPushedTaskEventWatermarksRef, workspaceCaptureAttachBootstrapBaselineRef, workspaceStartupFullReconcileRanRef, workspaceFullReconcileInFlightRef, bootstrapLastProgressAtRef, realtimeSuppressedEventQueueRef, setWorkspaceSyncBusy, setUserGlobalSyncStatus, setUserGlobalSyncError, setWorkspaceLastErrorMessage, setWorkspaceLastErrorAt, setWorkspaceLastPullAt, setWorkspaceLastPushAt, setWorkspaceSyncPendingChanges, setTasks, setArchivedTasks }: CreateWorkspaceTransferCoordinatorArgs): {
126
+ export declare function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtimeMode, workspaceCloudSyncEnabled, currentWorkspaceId, workspaceSyncPhase, isAuthenticated, checkAuthSession, resolveCloudAuthUrl, ensureCloudWorkspaceReadyForSync, ensureWorkspaceSyncReady, handleSyncAuthFailure, clearWorkspaceRetry, clearWorkspaceIssue, isWorkspaceRetryPending, scheduleWorkspaceSyncRetry, persistWorkspaceSyncPatchSafely, persistWorkspaceSyncPatchBestEffort, persistWorkspaceSyncWatermarksSnapshotBestEffort, reportSyncEvent, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, reportWorkspaceWindowContention, refreshWorkspaceSyncMarkdownDocumentsSnapshot, refreshWorkspaceSyncAiProfilesSnapshot, refreshWorkspaceSyncAssetsSnapshot, refreshWorkspaceSyncPlanningEntitiesSnapshot, refreshWorkspaceSyncDocumentReviewSessionsSnapshot, refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot, refreshLocalWorkspaceTaskCollections, buildWorkspaceSyncPayload, buildWorkspaceSyncSignature, seedWorkspaceSnapshotPushBaseline, shouldSuppressAttachBootstrapPush, recordSuppressedEventIds, workspaceRepairModeRef, workspaceForceFullAiProfilePushRef, workspacePushInFlightRef, workspacePullInFlightRef, workspacePendingPushReplayRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, workspaceLastPushedWatermarksRef, workspaceLastPushedTaskChangeKeysRef, workspaceLastPushedInitiativeIdsRef, workspaceLastPushedInitiativeWatermarksRef, workspaceLastPushedWorkstreamIdsRef, workspaceLastPushedWorkstreamWatermarksRef, workspaceLastPushedAiProfileIdsRef, workspaceLastPushedAiProfileWatermarksRef, workspaceLastPushedAiProfileChangeKeysRef, workspaceLastPushedDocumentPathsRef, workspaceLastPushedDocumentWatermarksRef, workspaceLastPushedAssetPathsRef, workspaceLastPushedAssetWatermarksRef, workspaceLastPushedDocumentReviewSessionIdsRef, workspaceLastPushedDocumentReviewSessionWatermarksRef, workspaceLastPushedDocumentReviewCommentIdsRef, workspaceLastPushedDocumentReviewCommentWatermarksRef, workspaceLastPushedAnnotatedAttachmentSessionIdsRef, workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef, workspaceLastPushedTaskEventWatermarksRef, workspaceBaselineResetReasonRef, workspaceCaptureAttachBootstrapBaselineRef, workspaceStartupFullReconcileRanRef, workspaceFullReconcileInFlightRef, bootstrapLastProgressAtRef, realtimeSuppressedEventQueueRef, setWorkspaceSyncBusy, setUserGlobalSyncStatus, setUserGlobalSyncError, setWorkspaceLastErrorMessage, setWorkspaceLastErrorAt, setWorkspaceLastPullAt, setWorkspaceLastPushAt, setWorkspaceSyncPendingChanges, setTasks, setArchivedTasks }: CreateWorkspaceTransferCoordinatorArgs): {
114
127
  pushWorkspaceChangesToCloud: (signature: string, options?: {
115
128
  forceAllAiProfiles?: boolean;
116
129
  repairMode?: boolean;
@@ -1,35 +1,54 @@
1
1
  import { applyLocalWorkspaceChanges } from '../../sync/cloudSyncApi';
2
2
  import { isTransientWorkspaceSyncStatus, runWorkspacePullSyncService, runWorkspacePushSyncService } from '../../sync/syncService';
3
- import { logSyncDebug, savePersistedSyncWatermarks, isValidWorkspaceKey } from './orchestratorShared';
4
- export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtimeMode, workspaceCloudSyncEnabled, currentWorkspaceId, workspaceSyncPhase, taxonomyStateFingerprint, isAuthenticated, checkAuthSession, resolveCloudAuthUrl, ensureCloudWorkspaceReadyForSync, ensureWorkspaceSyncReady, handleSyncAuthFailure, clearWorkspaceRetry, clearWorkspaceIssue, isWorkspaceRetryPending, scheduleWorkspaceSyncRetry, persistWorkspaceSyncPatchSafely, persistWorkspaceSyncPatchBestEffort, reportSyncEvent, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, reportWorkspaceWindowContention, refreshWorkspaceSyncMarkdownDocumentsSnapshot, refreshWorkspaceSyncAiProfilesSnapshot, refreshWorkspaceSyncAssetsSnapshot, refreshWorkspaceSyncDocumentReviewSessionsSnapshot, refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot, refreshLocalWorkspaceTaskCollections, buildWorkspaceSyncPayload, buildWorkspaceSyncSignature, seedWorkspaceSnapshotPushBaseline, shouldSuppressAttachBootstrapPush, recordSuppressedEventIds, workspaceRepairModeRef, workspaceForceFullAiProfilePushRef, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, workspaceLastPushedWatermarksRef, workspaceLastPushedInitiativeIdsRef, workspaceLastPushedInitiativeWatermarksRef, workspaceLastPushedWorkstreamIdsRef, workspaceLastPushedWorkstreamWatermarksRef, workspaceLastPushedAiProfileIdsRef, workspaceLastPushedAiProfileWatermarksRef, workspaceLastPushedDocumentPathsRef, workspaceLastPushedDocumentWatermarksRef, workspaceLastPushedAssetPathsRef, workspaceLastPushedAssetWatermarksRef, workspaceLastPushedDocumentReviewSessionIdsRef, workspaceLastPushedDocumentReviewSessionWatermarksRef, workspaceLastPushedDocumentReviewCommentIdsRef, workspaceLastPushedDocumentReviewCommentWatermarksRef, workspaceLastPushedAnnotatedAttachmentSessionIdsRef, workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef, workspaceLastPushedTaskEventWatermarksRef, workspaceCaptureAttachBootstrapBaselineRef, workspaceStartupFullReconcileRanRef, workspaceFullReconcileInFlightRef, bootstrapLastProgressAtRef, realtimeSuppressedEventQueueRef, setWorkspaceSyncBusy, setUserGlobalSyncStatus, setUserGlobalSyncError, setWorkspaceLastErrorMessage, setWorkspaceLastErrorAt, setWorkspaceLastPullAt, setWorkspaceLastPushAt, setWorkspaceSyncPendingChanges, setTasks, setArchivedTasks }) {
3
+ import { createWorkspaceSyncLeaseHeldDecision, resolvePullSyncReadiness, resolvePushSyncReadiness } from './controlPlane';
4
+ import { resolveWorkspacePullRequestPlan, resolveWorkspacePullSuccessPlan } from './pullLifecycle';
5
+ import { logSyncDebug } from './orchestratorShared';
6
+ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtimeMode, workspaceCloudSyncEnabled, currentWorkspaceId, workspaceSyncPhase, isAuthenticated, checkAuthSession, resolveCloudAuthUrl, ensureCloudWorkspaceReadyForSync, ensureWorkspaceSyncReady, handleSyncAuthFailure, clearWorkspaceRetry, clearWorkspaceIssue, isWorkspaceRetryPending, scheduleWorkspaceSyncRetry, persistWorkspaceSyncPatchSafely, persistWorkspaceSyncPatchBestEffort, persistWorkspaceSyncWatermarksSnapshotBestEffort, reportSyncEvent, acquireWorkspaceSyncLease, releaseWorkspaceSyncLease, reportWorkspaceWindowContention, refreshWorkspaceSyncMarkdownDocumentsSnapshot, refreshWorkspaceSyncAiProfilesSnapshot, refreshWorkspaceSyncAssetsSnapshot, refreshWorkspaceSyncPlanningEntitiesSnapshot, refreshWorkspaceSyncDocumentReviewSessionsSnapshot, refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot, refreshLocalWorkspaceTaskCollections, buildWorkspaceSyncPayload, buildWorkspaceSyncSignature, seedWorkspaceSnapshotPushBaseline, shouldSuppressAttachBootstrapPush, recordSuppressedEventIds, workspaceRepairModeRef, workspaceForceFullAiProfilePushRef, workspacePushInFlightRef, workspacePullInFlightRef, workspacePendingPushReplayRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, workspaceLastPushedWatermarksRef, workspaceLastPushedTaskChangeKeysRef, workspaceLastPushedInitiativeIdsRef, workspaceLastPushedInitiativeWatermarksRef, workspaceLastPushedWorkstreamIdsRef, workspaceLastPushedWorkstreamWatermarksRef, workspaceLastPushedAiProfileIdsRef, workspaceLastPushedAiProfileWatermarksRef, workspaceLastPushedAiProfileChangeKeysRef, workspaceLastPushedDocumentPathsRef, workspaceLastPushedDocumentWatermarksRef, workspaceLastPushedAssetPathsRef, workspaceLastPushedAssetWatermarksRef, workspaceLastPushedDocumentReviewSessionIdsRef, workspaceLastPushedDocumentReviewSessionWatermarksRef, workspaceLastPushedDocumentReviewCommentIdsRef, workspaceLastPushedDocumentReviewCommentWatermarksRef, workspaceLastPushedAnnotatedAttachmentSessionIdsRef, workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef, workspaceLastPushedTaskEventWatermarksRef, workspaceBaselineResetReasonRef, workspaceCaptureAttachBootstrapBaselineRef, workspaceStartupFullReconcileRanRef, workspaceFullReconcileInFlightRef, bootstrapLastProgressAtRef, realtimeSuppressedEventQueueRef, setWorkspaceSyncBusy, setUserGlobalSyncStatus, setUserGlobalSyncError, setWorkspaceLastErrorMessage, setWorkspaceLastErrorAt, setWorkspaceLastPullAt, setWorkspaceLastPushAt, setWorkspaceSyncPendingChanges, setTasks, setArchivedTasks }) {
5
7
  const pushWorkspaceChangesToCloud = async (signature, options) => {
6
- if (!cloudAuthConfigured || runtimeMode !== 'local' || !workspaceCloudSyncEnabled)
7
- return false;
8
- if (!isValidWorkspaceKey(currentWorkspaceId))
9
- return false;
10
- if (workspaceRepairModeRef.current === true && options?.repairMode !== true) {
11
- workspacePendingSignatureRef.current = signature;
12
- return false;
13
- }
14
- if (workspaceSyncPhase === 'attach-cloud') {
15
- workspacePendingSignatureRef.current = signature;
16
- return false;
17
- }
18
- if (!isAuthenticated) {
8
+ let pushReadiness = resolvePushSyncReadiness({
9
+ cloudAuthConfigured,
10
+ runtimeMode,
11
+ workspaceCloudSyncEnabled,
12
+ currentWorkspaceId,
13
+ workspaceSyncPhase,
14
+ isAuthenticated,
15
+ repairModeActive: workspaceRepairModeRef.current === true,
16
+ repairModeBypass: options?.repairMode === true,
17
+ pushInFlight: workspacePushInFlightRef.current,
18
+ pullInFlight: workspacePullInFlightRef.current
19
+ });
20
+ if (!pushReadiness.allowed && pushReadiness.reason === 'auth-required') {
19
21
  const authed = await checkAuthSession();
20
22
  if (!authed)
21
23
  return false;
24
+ pushReadiness = resolvePushSyncReadiness({
25
+ cloudAuthConfigured,
26
+ runtimeMode,
27
+ workspaceCloudSyncEnabled,
28
+ currentWorkspaceId,
29
+ workspaceSyncPhase,
30
+ isAuthenticated: true,
31
+ repairModeActive: workspaceRepairModeRef.current === true,
32
+ repairModeBypass: options?.repairMode === true,
33
+ pushInFlight: workspacePushInFlightRef.current,
34
+ pullInFlight: workspacePullInFlightRef.current
35
+ });
22
36
  }
23
- if (shouldSuppressAttachBootstrapPush(signature)) {
37
+ if (!pushReadiness.allowed) {
38
+ if (pushReadiness.retainPendingSignature) {
39
+ workspacePendingSignatureRef.current = signature;
40
+ }
24
41
  return false;
25
42
  }
26
- if (workspacePushInFlightRef.current || workspacePullInFlightRef.current) {
27
- workspacePendingSignatureRef.current = signature;
43
+ if (shouldSuppressAttachBootstrapPush(signature)) {
28
44
  return false;
29
45
  }
30
46
  const leaseAcquired = await acquireWorkspaceSyncLease(currentWorkspaceId, 'push');
31
47
  if (!leaseAcquired) {
32
- workspacePendingSignatureRef.current = signature;
48
+ const leaseDecision = createWorkspaceSyncLeaseHeldDecision('push');
49
+ if (!leaseDecision.allowed && leaseDecision.retainPendingSignature) {
50
+ workspacePendingSignatureRef.current = signature;
51
+ }
33
52
  reportWorkspaceWindowContention('push');
34
53
  return false;
35
54
  }
@@ -39,25 +58,48 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
39
58
  setUserGlobalSyncError(null);
40
59
  const pushStartedAtMs = Date.now();
41
60
  const forceAllAiProfiles = options?.forceAllAiProfiles === true || workspaceForceFullAiProfilePushRef.current === true;
61
+ const repairMode = options?.repairMode === true || workspaceRepairModeRef.current === true;
62
+ let payloadForAttempt = null;
63
+ let replayedPayload = false;
64
+ let attemptSignature = signature;
42
65
  try {
43
66
  await refreshWorkspaceSyncMarkdownDocumentsSnapshot();
44
67
  await refreshWorkspaceSyncAiProfilesSnapshot();
45
68
  await refreshWorkspaceSyncAssetsSnapshot();
69
+ await refreshWorkspaceSyncPlanningEntitiesSnapshot();
46
70
  await refreshWorkspaceSyncDocumentReviewSessionsSnapshot();
47
71
  const ready = await ensureWorkspaceSyncReady();
48
72
  if (!ready)
49
73
  return false;
50
- const payload = buildWorkspaceSyncPayload({ forceAllAiProfiles });
74
+ const refreshedSignature = buildWorkspaceSyncSignature();
75
+ if (refreshedSignature) {
76
+ attemptSignature = refreshedSignature;
77
+ }
78
+ if (shouldSuppressAttachBootstrapPush(attemptSignature)) {
79
+ return false;
80
+ }
81
+ const pendingReplay = workspacePendingPushReplayRef.current;
82
+ const canReplayPayload = (pendingReplay
83
+ && pendingReplay.signature === attemptSignature
84
+ && (!forceAllAiProfiles || pendingReplay.forceAllAiProfiles === true)
85
+ && (!repairMode || pendingReplay.repairMode === true));
86
+ const replayPayload = canReplayPayload
87
+ ? pendingReplay
88
+ : null;
89
+ const payload = replayPayload?.payload || buildWorkspaceSyncPayload({ forceAllAiProfiles });
90
+ payloadForAttempt = payload;
91
+ replayedPayload = replayPayload !== null;
51
92
  setWorkspaceSyncPendingChanges(payload.changes.length);
52
93
  const pushResult = await runWorkspacePushSyncService({
53
94
  resolveCloudAuthUrl,
54
95
  workspaceId: currentWorkspaceId,
55
96
  payload,
56
97
  ensureCloudWorkspaceReadyForSync,
57
- repairMode: options?.repairMode === true || workspaceRepairModeRef.current === true
98
+ repairMode: replayPayload?.repairMode ?? repairMode
58
99
  });
59
100
  if (!pushResult.success) {
60
101
  if (pushResult.status === 401) {
102
+ workspacePendingPushReplayRef.current = null;
61
103
  await handleSyncAuthFailure('push', 401);
62
104
  return false;
63
105
  }
@@ -76,25 +118,48 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
76
118
  status: 'error',
77
119
  statusCode: pushResult.status,
78
120
  errorMessage: message,
79
- requestMs: pushResult.requestMs
121
+ requestMs: pushResult.requestMs,
122
+ details: {
123
+ payloadDiagnostics: payload.deltaDiagnostics || null,
124
+ replayedPayload
125
+ }
80
126
  });
81
- workspacePendingSignatureRef.current = signature;
127
+ workspacePendingSignatureRef.current = attemptSignature;
82
128
  if (pushResult.transient || isTransientWorkspaceSyncStatus(pushResult.status)) {
129
+ workspacePendingPushReplayRef.current = {
130
+ signature: attemptSignature,
131
+ payload,
132
+ forceAllAiProfiles: replayPayload?.forceAllAiProfiles ?? forceAllAiProfiles,
133
+ repairMode: replayPayload?.repairMode ?? repairMode
134
+ };
83
135
  scheduleWorkspaceSyncRetry(pushResult.retryAfterMs);
84
136
  }
85
- else if (workspaceSyncPhase === 'active') {
86
- persistWorkspaceSyncPatchSafely({ phase: 'error', lastErrorMessage: message });
137
+ else {
138
+ workspacePendingPushReplayRef.current = null;
139
+ if (workspaceSyncPhase === 'active') {
140
+ persistWorkspaceSyncPatchSafely({ phase: 'error', lastErrorMessage: message });
141
+ }
87
142
  }
88
143
  return false;
89
144
  }
90
- workspaceLastPushedSignatureRef.current = signature;
145
+ workspacePendingPushReplayRef.current = null;
146
+ workspaceLastPushedSignatureRef.current = attemptSignature;
91
147
  workspaceLastPushedTaskIdsRef.current = pushResult.currentTaskIds;
148
+ workspaceLastPushedWatermarksRef.current = pushResult.currentTaskWatermarks
149
+ ? new Map(pushResult.currentTaskWatermarks)
150
+ : new Map(workspaceLastPushedWatermarksRef.current);
151
+ workspaceLastPushedTaskChangeKeysRef.current = pushResult.currentTaskChangeKeys
152
+ ? new Map(pushResult.currentTaskChangeKeys)
153
+ : new Map(workspaceLastPushedTaskChangeKeysRef.current);
92
154
  workspaceLastPushedInitiativeIdsRef.current = new Set(pushResult.currentInitiativeIds);
93
155
  workspaceLastPushedInitiativeWatermarksRef.current = new Map(pushResult.currentInitiativeWatermarks);
94
156
  workspaceLastPushedWorkstreamIdsRef.current = new Set(pushResult.currentWorkstreamIds);
95
157
  workspaceLastPushedWorkstreamWatermarksRef.current = new Map(pushResult.currentWorkstreamWatermarks);
96
158
  workspaceLastPushedAiProfileIdsRef.current = new Set(pushResult.currentAiProfileIds);
97
159
  workspaceLastPushedAiProfileWatermarksRef.current = new Map(pushResult.currentAiProfileWatermarks);
160
+ workspaceLastPushedAiProfileChangeKeysRef.current = pushResult.currentAiProfileChangeKeys
161
+ ? new Map(pushResult.currentAiProfileChangeKeys)
162
+ : new Map(workspaceLastPushedAiProfileChangeKeysRef.current);
98
163
  workspaceLastPushedDocumentPathsRef.current = new Set(pushResult.currentDocumentPaths);
99
164
  workspaceLastPushedDocumentWatermarksRef.current = new Map(pushResult.currentDocumentWatermarks);
100
165
  workspaceLastPushedAssetPathsRef.current = new Set(pushResult.currentAssetPaths);
@@ -112,25 +177,19 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
112
177
  for (const [taskId, watermark] of pushResult.pushedWatermarks) {
113
178
  workspaceLastPushedWatermarksRef.current.set(taskId, watermark);
114
179
  }
180
+ for (const [taskId, changeKey] of (pushResult.pushedTaskChangeKeys || new Map())) {
181
+ workspaceLastPushedTaskChangeKeysRef.current.set(taskId, changeKey);
182
+ }
115
183
  if (pushResult.deleteTaskIds.size > 0) {
116
184
  for (const taskId of pushResult.deleteTaskIds) {
117
185
  workspaceDeletedTaskIdsRef.current.delete(taskId);
118
186
  workspaceDeletedTaskWatermarksRef.current.delete(taskId);
119
187
  workspaceLastPushedWatermarksRef.current.delete(taskId);
188
+ workspaceLastPushedTaskChangeKeysRef.current.delete(taskId);
120
189
  }
121
190
  }
122
- savePersistedSyncWatermarks(currentWorkspaceId, {
123
- taskWatermarks: workspaceLastPushedWatermarksRef.current,
124
- initiativeWatermarks: workspaceLastPushedInitiativeWatermarksRef.current,
125
- workstreamWatermarks: workspaceLastPushedWorkstreamWatermarksRef.current,
126
- documentWatermarks: workspaceLastPushedDocumentWatermarksRef.current,
127
- assetWatermarks: workspaceLastPushedAssetWatermarksRef.current,
128
- documentReviewSessionWatermarks: workspaceLastPushedDocumentReviewSessionWatermarksRef.current,
129
- documentReviewCommentWatermarks: workspaceLastPushedDocumentReviewCommentWatermarksRef.current,
130
- annotatedAttachmentSessionWatermarks: workspaceLastPushedAnnotatedAttachmentSessionWatermarksRef.current,
131
- taskEventWatermarks: workspaceLastPushedTaskEventWatermarksRef.current,
132
- taxonomyStateFingerprint
133
- });
191
+ const persisted = await persistWorkspaceSyncWatermarksSnapshotBestEffort();
192
+ workspaceBaselineResetReasonRef.current = persisted ? null : 'storage-write-failed';
134
193
  if (Array.isArray(pushResult.emittedEventIds) && pushResult.emittedEventIds.length > 0) {
135
194
  recordSuppressedEventIds(pushResult.emittedEventIds, {
136
195
  queueRef: realtimeSuppressedEventQueueRef,
@@ -187,7 +246,11 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
187
246
  eventType: workspaceSyncPhase === 'provision-local' ? 'bootstrap' : 'push',
188
247
  status: 'success',
189
248
  changeCount: pushResult.changeCount,
190
- requestMs: pushResult.requestMs
249
+ requestMs: pushResult.requestMs,
250
+ details: {
251
+ payloadDiagnostics: payload.deltaDiagnostics || null,
252
+ replayedPayload
253
+ }
191
254
  });
192
255
  return true;
193
256
  }
@@ -197,12 +260,23 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
197
260
  setUserGlobalSyncError(message);
198
261
  setWorkspaceLastErrorMessage(message);
199
262
  setWorkspaceLastErrorAt(new Date().toISOString());
200
- workspacePendingSignatureRef.current = signature;
263
+ workspacePendingSignatureRef.current = attemptSignature;
264
+ if (payloadForAttempt) {
265
+ workspacePendingPushReplayRef.current = {
266
+ signature: attemptSignature,
267
+ payload: payloadForAttempt,
268
+ forceAllAiProfiles,
269
+ repairMode
270
+ };
271
+ }
201
272
  scheduleWorkspaceSyncRetry();
202
273
  reportSyncEvent(currentWorkspaceId, {
203
274
  eventType: 'push',
204
275
  status: 'error',
205
- errorMessage: `${message} ${String(error?.message || '').trim()}`.trim()
276
+ errorMessage: `${message} ${String(error?.message || '').trim()}`.trim(),
277
+ details: {
278
+ replayedPayload
279
+ }
206
280
  });
207
281
  logSyncDebug('push_failed_exception', {
208
282
  workspaceId: currentWorkspaceId,
@@ -229,23 +303,40 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
229
303
  }
230
304
  };
231
305
  const pullWorkspaceChangesFromCloud = async (options) => {
232
- if (!cloudAuthConfigured || runtimeMode !== 'local' || !workspaceCloudSyncEnabled)
233
- return false;
234
- if (!isValidWorkspaceKey(currentWorkspaceId))
235
- return false;
236
- if (workspaceRepairModeRef.current === true && options?.repairMode !== true)
237
- return false;
238
- if (workspaceSyncPhase === 'provision-local')
239
- return false;
240
- if (isWorkspaceRetryPending())
241
- return false;
242
- if (!isAuthenticated) {
306
+ let pullReadiness = resolvePullSyncReadiness({
307
+ cloudAuthConfigured,
308
+ runtimeMode,
309
+ workspaceCloudSyncEnabled,
310
+ currentWorkspaceId,
311
+ workspaceSyncPhase,
312
+ isAuthenticated,
313
+ repairModeActive: workspaceRepairModeRef.current === true,
314
+ repairModeBypass: options?.repairMode === true,
315
+ retryPending: isWorkspaceRetryPending(),
316
+ pullInFlight: workspacePullInFlightRef.current,
317
+ pushInFlight: workspacePushInFlightRef.current
318
+ });
319
+ if (!pullReadiness.allowed && pullReadiness.reason === 'auth-required') {
243
320
  const authed = await checkAuthSession();
244
321
  if (!authed)
245
322
  return false;
323
+ pullReadiness = resolvePullSyncReadiness({
324
+ cloudAuthConfigured,
325
+ runtimeMode,
326
+ workspaceCloudSyncEnabled,
327
+ currentWorkspaceId,
328
+ workspaceSyncPhase,
329
+ isAuthenticated: true,
330
+ repairModeActive: workspaceRepairModeRef.current === true,
331
+ repairModeBypass: options?.repairMode === true,
332
+ retryPending: isWorkspaceRetryPending(),
333
+ pullInFlight: workspacePullInFlightRef.current,
334
+ pushInFlight: workspacePushInFlightRef.current
335
+ });
246
336
  }
247
- if (workspacePullInFlightRef.current || workspacePushInFlightRef.current)
337
+ if (!pullReadiness.allowed) {
248
338
  return false;
339
+ }
249
340
  const leaseAcquired = await acquireWorkspaceSyncLease(currentWorkspaceId, 'pull');
250
341
  if (!leaseAcquired) {
251
342
  reportWorkspaceWindowContention('pull');
@@ -260,13 +351,16 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
260
351
  const ready = await ensureWorkspaceSyncReady();
261
352
  if (!ready)
262
353
  return false;
263
- const bootstrap = workspaceSyncPhase === 'attach-cloud';
264
- const cursor = bootstrap || options?.forceCursorNull === true ? null : workspacePullCursorRef.current;
354
+ const pullRequestPlan = resolveWorkspacePullRequestPlan({
355
+ workspaceSyncPhase,
356
+ forceCursorNull: options?.forceCursorNull === true,
357
+ currentCursor: workspacePullCursorRef.current
358
+ });
265
359
  const pullResult = await runWorkspacePullSyncService({
266
360
  resolveCloudAuthUrl,
267
361
  workspaceId: currentWorkspaceId,
268
- cursor,
269
- bootstrap,
362
+ cursor: pullRequestPlan.cursor,
363
+ bootstrap: pullRequestPlan.bootstrap,
270
364
  ensureCloudWorkspaceReadyForSync,
271
365
  maxPages: 20,
272
366
  repairMode: options?.repairMode === true || workspaceRepairModeRef.current === true,
@@ -282,6 +376,28 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
282
376
  await handleSyncAuthFailure('apply', 401);
283
377
  return false;
284
378
  }
379
+ if (pullResult.kind === 'pull_http' && pullResult.errorCode === 'INVALID_SYNC_CURSOR') {
380
+ const message = 'Saved sync cursor was invalid. Clearing it and retrying from the beginning.';
381
+ workspacePullCursorRef.current = null;
382
+ persistWorkspaceSyncPatchSafely({ pullCursor: null });
383
+ setUserGlobalSyncStatus('error');
384
+ setUserGlobalSyncError(message);
385
+ setWorkspaceLastErrorMessage(message);
386
+ setWorkspaceLastErrorAt(new Date().toISOString());
387
+ reportSyncEvent(currentWorkspaceId, {
388
+ eventType: 'pull',
389
+ status: 'error',
390
+ statusCode: pullResult.status,
391
+ errorMessage: message,
392
+ requestMs: pullResult.pullRequestMs,
393
+ details: {
394
+ recovery: 'cursor-reset',
395
+ ...(pullResult.serverDiagnostics ? { serverPullDiagnostics: pullResult.serverDiagnostics } : {})
396
+ }
397
+ });
398
+ scheduleWorkspaceSyncRetry(150);
399
+ return false;
400
+ }
285
401
  let message = pullResult.kind === 'apply_payload' || pullResult.kind === 'apply_all_candidates' || pullResult.kind === 'exception'
286
402
  ? String(pullResult.error || 'Workspace sync apply failed.')
287
403
  : `Workspace sync pull failed (${pullResult.status || 0})`;
@@ -332,7 +448,8 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
332
448
  if (pullResult.appliedChanges > 0
333
449
  && (pullResult.pulledActiveUpserts
334
450
  || pullResult.pulledArchivedUpserts
335
- || pullResult.pulledTaskEventUpserts)) {
451
+ || pullResult.pulledTaskEventUpserts
452
+ || pullResult.pulledPlanningUpserts)) {
336
453
  try {
337
454
  await refreshLocalWorkspaceTaskCollections();
338
455
  }
@@ -349,9 +466,20 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
349
466
  setWorkspaceLastPullAt(syncedAt);
350
467
  setWorkspaceSyncPendingChanges(0);
351
468
  setUserGlobalSyncStatus('idle');
352
- if (workspaceSyncPhase === 'attach-cloud') {
469
+ const pullSuccessPlan = resolveWorkspacePullSuccessPlan({
470
+ workspaceSyncPhase,
471
+ forceCursorNull: options?.forceCursorNull === true,
472
+ startupFullReconcileRan: workspaceStartupFullReconcileRanRef.current,
473
+ pendingSignature: workspacePendingSignatureRef.current,
474
+ fallbackSignature: buildWorkspaceSyncSignature(),
475
+ lastPushedSignature: workspaceLastPushedSignatureRef.current
476
+ });
477
+ if (pullSuccessPlan.shouldCaptureAttachBootstrapBaseline) {
353
478
  workspaceCaptureAttachBootstrapBaselineRef.current = true;
479
+ }
480
+ if (pullSuccessPlan.shouldClearPendingSignature) {
354
481
  workspacePendingSignatureRef.current = '';
482
+ workspacePendingPushReplayRef.current = null;
355
483
  }
356
484
  await persistWorkspaceSyncPatchBestEffort({
357
485
  phase: 'active',
@@ -361,7 +489,7 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
361
489
  lastErrorMessage: null
362
490
  });
363
491
  reportSyncEvent(currentWorkspaceId, {
364
- eventType: workspaceSyncPhase === 'attach-cloud' ? 'bootstrap' : 'pull',
492
+ eventType: pullSuccessPlan.successEventType,
365
493
  status: 'success',
366
494
  changeCount: pullResult.appliedChanges,
367
495
  requestMs: pullResult.pullRequestMs,
@@ -371,15 +499,19 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
371
499
  ...(pullResult.serverDiagnostics ? { serverPullDiagnostics: pullResult.serverDiagnostics } : {})
372
500
  }
373
501
  });
374
- if (workspaceSyncPhase === 'attach-cloud') {
502
+ if (pullSuccessPlan.shouldRefreshReferenceSnapshots) {
375
503
  await refreshWorkspaceSyncMarkdownDocumentsSnapshot();
376
504
  await refreshWorkspaceSyncAssetsSnapshot();
377
505
  await refreshWorkspaceSyncDocumentReviewSessionsSnapshot();
378
506
  await refreshWorkspaceSyncAnnotatedAttachmentSessionsSnapshot();
507
+ }
508
+ if (pullSuccessPlan.shouldSeedWorkspaceSnapshotPushBaseline) {
379
509
  seedWorkspaceSnapshotPushBaseline();
510
+ }
511
+ if (pullSuccessPlan.shouldRefreshReferenceSnapshots || pullSuccessPlan.shouldSeedWorkspaceSnapshotPushBaseline) {
380
512
  return true;
381
513
  }
382
- if (!options?.forceCursorNull && !bootstrap && !workspaceStartupFullReconcileRanRef.current) {
514
+ if (pullSuccessPlan.shouldScheduleStartupFullReconcile) {
383
515
  workspaceStartupFullReconcileRanRef.current = true;
384
516
  window.setTimeout(() => {
385
517
  if (workspaceFullReconcileInFlightRef.current)
@@ -390,11 +522,23 @@ export function createWorkspaceTransferCoordinator({ cloudAuthConfigured, runtim
390
522
  });
391
523
  }, 250);
392
524
  }
393
- const pendingSignature = workspacePendingSignatureRef.current || buildWorkspaceSyncSignature();
394
- if (pendingSignature && pendingSignature !== workspaceLastPushedSignatureRef.current) {
395
- workspacePendingSignatureRef.current = '';
525
+ const shouldReassertAiProfilesAfterFullReconcile = (options?.forceCursorNull === true
526
+ && options?.repairMode !== true
527
+ && workspaceSyncPhase === 'active');
528
+ if (shouldReassertAiProfilesAfterFullReconcile) {
529
+ const reassertSignature = buildWorkspaceSyncSignature();
530
+ if (reassertSignature) {
531
+ workspaceForceFullAiProfilePushRef.current = true;
532
+ workspacePendingSignatureRef.current = reassertSignature;
533
+ window.setTimeout(() => {
534
+ void pushWorkspaceChangesToCloud(reassertSignature, { forceAllAiProfiles: true });
535
+ }, 120);
536
+ }
537
+ }
538
+ else if (pullSuccessPlan.deferredPushSignature) {
539
+ const deferredPushSignature = pullSuccessPlan.deferredPushSignature;
396
540
  window.setTimeout(() => {
397
- void pushWorkspaceChangesToCloud(pendingSignature);
541
+ void pushWorkspaceChangesToCloud(deferredPushSignature);
398
542
  }, 120);
399
543
  }
400
544
  return true;
@@ -0,0 +1 @@
1
+ export {};