@taskforcehq/taskforce 0.3.304 → 0.3.306

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 (383) hide show
  1. package/README.md +140 -247
  2. package/dist/Taskforce.module.css +295 -89
  3. package/dist/TaskforceCore.js +378 -111
  4. package/dist/TaskforceCore.test.js +1221 -107
  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 +52 -2
  14. package/dist/compat/workspaceSyncCompat.test.js +38 -1
  15. package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
  16. package/dist/components/context/ContextAttachmentManager.js +549 -0
  17. package/dist/components/features/AgentsModule.d.ts +10 -1
  18. package/dist/components/features/AgentsModule.js +260 -15
  19. package/dist/components/features/AgentsModule.test.js +255 -5
  20. package/dist/components/features/DocumentIndex.d.ts +1 -1
  21. package/dist/components/features/DocumentIndex.js +1 -1
  22. package/dist/components/features/DocumentViewer.d.ts +6 -2
  23. package/dist/components/features/DocumentViewer.js +90 -10
  24. package/dist/components/features/DocumentWorkspace.d.ts +5 -22
  25. package/dist/components/features/DocumentWorkspace.js +12 -155
  26. package/dist/components/features/DocumentWorkspace.test.js +226 -6
  27. package/dist/components/features/TaskSettings.js +29 -3
  28. package/dist/components/features/TaskSettings.test.js +42 -1
  29. package/dist/components/features/documentWorkspaceModel.d.ts +24 -0
  30. package/dist/components/features/documentWorkspaceModel.js +57 -0
  31. package/dist/components/features/useDocumentWorkspaceController.d.ts +34 -0
  32. package/dist/components/features/useDocumentWorkspaceController.js +113 -0
  33. package/dist/components/task/TaskCard.js +19 -28
  34. package/dist/components/task/TaskCard.test.js +38 -3
  35. package/dist/components/task/TaskContextUpload.js +4 -526
  36. package/dist/components/task/TaskForm.d.ts +8 -8
  37. package/dist/components/task/TaskForm.js +362 -230
  38. package/dist/components/task/TaskForm.test.js +558 -381
  39. package/dist/components/task/TaskKanban.d.ts +2 -1
  40. package/dist/components/task/TaskKanban.js +96 -14
  41. package/dist/components/task/TaskKanban.test.js +36 -0
  42. package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
  43. package/dist/components/ui/EditableAvatarButton.js +18 -0
  44. package/dist/components/views/PlanComparisonPage.d.ts +9 -1
  45. package/dist/components/views/PlanComparisonPage.js +70 -17
  46. package/dist/components/views/PlanComparisonPage.test.js +289 -41
  47. package/dist/components/views/PlansPage.js +239 -106
  48. package/dist/components/views/PlansPage.test.js +593 -42
  49. package/dist/components/views/StandaloneLayout.js +310 -554
  50. package/dist/components/views/panels/FilterToolbar.test.js +6 -4
  51. package/dist/components/views/panels/PlanningDrawer.d.ts +8 -1
  52. package/dist/components/views/panels/PlanningDrawer.js +18 -11
  53. package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
  54. package/dist/components/views/panels/PlanningDrawer.test.js +141 -0
  55. package/dist/components/views/planningScope.d.ts +20 -0
  56. package/dist/components/views/planningScope.js +25 -0
  57. package/dist/components/views/planningScope.test.d.ts +1 -0
  58. package/dist/components/views/planningScope.test.js +60 -0
  59. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +27 -14
  60. package/dist/components/views/standalone/modals/AccountHubModal.js +87 -15
  61. package/dist/components/views/standalone/modals/AccountHubModal.test.js +42 -2
  62. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
  63. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
  64. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
  65. package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
  66. package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
  67. package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
  68. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
  69. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
  70. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
  71. package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
  72. package/dist/config/envSchema.js +1 -1
  73. package/dist/core/AiProfileService.d.ts +45 -3
  74. package/dist/core/AiProfileService.js +774 -63
  75. package/dist/core/AiProfileService.test.js +22 -2
  76. package/dist/core/AiProfiles.test.js +761 -2
  77. package/dist/core/AttachmentLinkService.js +57 -15
  78. package/dist/core/AuthIdentityService.d.ts +107 -0
  79. package/dist/core/AuthIdentityService.js +284 -0
  80. package/dist/core/AuthTokenService.d.ts +4 -0
  81. package/dist/core/AuthTokenService.js +34 -6
  82. package/dist/core/AuthTokenService.test.d.ts +1 -0
  83. package/dist/core/AuthTokenService.test.js +78 -0
  84. package/dist/core/EntitlementsPolicy.test.js +77 -15
  85. package/dist/core/GlobalSettingsService.js +115 -6
  86. package/dist/core/PlanEntitlementService.d.ts +30 -3
  87. package/dist/core/PlanEntitlementService.js +454 -93
  88. package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
  89. package/dist/core/PlanFeatureCatalog.test.js +84 -0
  90. package/dist/core/PlanVersionPolicy.test.js +54 -28
  91. package/dist/core/PlanningEntities.test.js +52 -0
  92. package/dist/core/SignupMonetizationSettings.test.js +241 -44
  93. package/dist/core/SyncReconciliationService.js +2 -65
  94. package/dist/core/SystemAdmin.test.js +244 -88
  95. package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
  96. package/dist/core/TaskTaxonomyValidation.test.js +53 -0
  97. package/dist/core/Taskforce.d.ts +228 -14
  98. package/dist/core/Taskforce.js +814 -201
  99. package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
  100. package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
  101. package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
  102. package/dist/core/WorkspaceLifecycleService.js +0 -5
  103. package/dist/core/WorkspacePermissions.test.js +25 -1
  104. package/dist/core/WorkspacePlanMode.test.js +128 -27
  105. package/dist/core/shared.d.ts +3 -1
  106. package/dist/core/shared.js +16 -1
  107. package/dist/core/types.d.ts +68 -2
  108. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +26 -1
  109. package/dist/hooks/sync/auth.js +3 -1
  110. package/dist/hooks/sync/bootstrap.js +2 -0
  111. package/dist/hooks/sync/controlPlane.d.ts +37 -0
  112. package/dist/hooks/sync/controlPlane.js +78 -0
  113. package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
  114. package/dist/hooks/sync/controlPlane.test.js +121 -0
  115. package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
  116. package/dist/hooks/sync/lifecyclePolicy.js +93 -0
  117. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
  118. package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
  119. package/dist/hooks/sync/orchestratorShared.d.ts +10 -1
  120. package/dist/hooks/sync/orchestratorShared.js +68 -47
  121. package/dist/hooks/sync/orchestratorShared.test.js +50 -1
  122. package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
  123. package/dist/hooks/sync/pullLifecycle.js +24 -0
  124. package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
  125. package/dist/hooks/sync/pullLifecycle.test.js +80 -0
  126. package/dist/hooks/sync/recovery.d.ts +16 -2
  127. package/dist/hooks/sync/recovery.js +171 -53
  128. package/dist/hooks/sync/recovery.test.d.ts +1 -0
  129. package/dist/hooks/sync/recovery.test.js +292 -0
  130. package/dist/hooks/sync/transfers.d.ts +16 -3
  131. package/dist/hooks/sync/transfers.js +186 -65
  132. package/dist/hooks/sync/transfers.test.d.ts +1 -0
  133. package/dist/hooks/sync/transfers.test.js +396 -0
  134. package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
  135. package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
  136. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
  137. package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
  138. package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
  139. package/dist/hooks/sync/useSyncStatusActions.js +88 -0
  140. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
  141. package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
  142. package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
  143. package/dist/hooks/sync/useSyncStatusControls.js +60 -0
  144. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
  145. package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
  146. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
  147. package/dist/hooks/useSyncOrchestrator.d.ts +16 -6
  148. package/dist/hooks/useSyncOrchestrator.js +424 -175
  149. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +487 -10
  150. package/dist/hooks/useTaskData.js +8 -3
  151. package/dist/hooks/useTaskData.test.js +45 -0
  152. package/dist/hooks/useTaskMutations.d.ts +2 -1
  153. package/dist/hooks/useTaskMutations.js +12 -1
  154. package/dist/hooks/useTaskMutations.test.js +30 -1
  155. package/dist/hooks/useTaskforce.d.ts +65 -4
  156. package/dist/hooks/useTaskforce.js +564 -243
  157. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
  158. package/dist/hooks/useTaskforce.runtime-routing.test.js +152 -0
  159. package/dist/hooks/useTaskforce.sync-behavior.test.js +2454 -208
  160. package/dist/hooks/useWorkspaceSyncController.d.ts +4 -1
  161. package/dist/hooks/useWorkspaceSyncController.js +17 -2
  162. package/dist/hooks/useWorkspaceSyncController.test.js +1 -0
  163. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
  164. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +316 -35
  165. package/dist/localization/locales/en-US.d.ts +0 -1
  166. package/dist/localization/locales/en-US.js +0 -1
  167. package/dist/localization/locales/es-419.js +0 -1
  168. package/dist/localization/locales/pt-BR.js +0 -1
  169. package/dist/mcp/adminWorkspaceRegistrar.d.ts +2 -0
  170. package/dist/mcp/adminWorkspaceRegistrar.js +154 -0
  171. package/dist/mcp/collaborationRegistrar.d.ts +2 -0
  172. package/dist/mcp/collaborationRegistrar.js +71 -0
  173. package/dist/mcp/documentAssetRegistrar.d.ts +2 -0
  174. package/dist/mcp/documentAssetRegistrar.js +346 -0
  175. package/dist/mcp/runtime.d.ts +2 -0
  176. package/dist/mcp/runtime.js +2433 -3534
  177. package/dist/mcp/runtime.test.js +440 -2
  178. package/dist/mcp/taskPlanningRegistrar.d.ts +2 -0
  179. package/dist/mcp/taskPlanningRegistrar.js +418 -0
  180. package/dist/mcp/toolCatalog.d.ts +35 -0
  181. package/dist/mcp/toolCatalog.js +3 -0
  182. package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
  183. package/dist/migrations/taskSchemaMigrations.js +171 -61
  184. package/dist/migrations/taskSchemaMigrations.test.js +15 -0
  185. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  186. package/dist/resources/templates/workflows/collaborate.yaml +1 -1
  187. package/dist/resources/templates/workflows/evaluate.yaml +2 -2
  188. package/dist/resources/templates/workflows/plan.yaml +1 -1
  189. package/dist/resources/templates/workflows/review.yaml +2 -2
  190. package/dist/server/annotatedAttachmentsRoutes.test.js +3 -3
  191. package/dist/server/auth/providers/apple.d.ts +33 -0
  192. package/dist/server/auth/providers/apple.js +82 -0
  193. package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
  194. package/dist/server/auth/providers/appleClientSecret.js +65 -0
  195. package/dist/server/auth/providers/github.d.ts +26 -0
  196. package/dist/server/auth/providers/github.js +86 -0
  197. package/dist/server/auth/providers/google.d.ts +21 -0
  198. package/dist/server/auth/providers/google.js +56 -0
  199. package/dist/server/auth/providers/types.d.ts +21 -0
  200. package/dist/server/auth/providers/types.js +1 -0
  201. package/dist/server/auth.d.ts +2 -0
  202. package/dist/server/auth.js +6 -3
  203. package/dist/server/documentReviewRoutes.test.js +36 -3
  204. package/dist/server/index.cookieProxy.test.js +1 -0
  205. package/dist/server/index.d.ts +12 -0
  206. package/dist/server/index.js +120 -9
  207. package/dist/server/index.rateLimit.test.js +3 -0
  208. package/dist/server/index.test.js +106 -3
  209. package/dist/server/routes/admin.d.ts +4 -5
  210. package/dist/server/routes/admin.js +410 -80
  211. package/dist/server/routes/annotatedAttachments.d.ts +1 -1
  212. package/dist/server/routes/annotatedAttachments.js +1 -1
  213. package/dist/server/routes/auth.d.ts +16 -6
  214. package/dist/server/routes/auth.js +1015 -118
  215. package/dist/server/routes/authSupport.d.ts +30 -0
  216. package/dist/server/routes/authSupport.js +81 -0
  217. package/dist/server/routes/billing.d.ts +1 -1
  218. package/dist/server/routes/billing.js +276 -34
  219. package/dist/server/routes/billing.test.js +760 -52
  220. package/dist/server/routes/documentReviews.d.ts +1 -1
  221. package/dist/server/routes/documentReviews.js +1 -1
  222. package/dist/server/routes/documents.d.ts +5 -2
  223. package/dist/server/routes/documents.js +242 -74
  224. package/dist/server/routes/primitives.d.ts +11 -0
  225. package/dist/server/routes/primitives.js +73 -0
  226. package/dist/server/routes/resources.d.ts +1 -1
  227. package/dist/server/routes/resources.js +1 -1
  228. package/dist/server/routes/shared.d.ts +29 -3
  229. package/dist/server/routes/shared.js +69 -4
  230. package/dist/server/routes/sync.d.ts +1 -1
  231. package/dist/server/routes/sync.integration.test.js +437 -39
  232. package/dist/server/routes/sync.js +62 -606
  233. package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
  234. package/dist/server/routes/syncAuxRoutes.js +91 -0
  235. package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
  236. package/dist/server/routes/syncAuxRoutes.test.js +158 -0
  237. package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
  238. package/dist/server/routes/syncPullApplyRoutes.js +204 -0
  239. package/dist/server/routes/syncPushRoutes.d.ts +24 -0
  240. package/dist/server/routes/syncPushRoutes.js +212 -0
  241. package/dist/server/routes/syncRouteGuards.d.ts +36 -0
  242. package/dist/server/routes/syncRouteGuards.js +67 -0
  243. package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
  244. package/dist/server/routes/syncRouteGuards.test.js +94 -0
  245. package/dist/server/routes/syncRouteTypes.d.ts +13 -0
  246. package/dist/server/routes/syncRouteTypes.js +1 -0
  247. package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
  248. package/dist/server/routes/syncSnapshotRoutes.js +180 -0
  249. package/dist/server/routes/tasks.d.ts +1 -1
  250. package/dist/server/routes/tasks.js +44 -2
  251. package/dist/server/routes/workspaces.d.ts +1 -1
  252. package/dist/server/routes/workspaces.js +37 -6
  253. package/dist/server/routes.d.ts +2 -9
  254. package/dist/server/routes.js +136 -165
  255. package/dist/server/routes.test.js +2457 -162
  256. package/dist/services/workflowExportSnapshots.test.js +2 -0
  257. package/dist/shared/aiProfileSeatScope.d.ts +5 -0
  258. package/dist/shared/aiProfileSeatScope.js +21 -0
  259. package/dist/shared/passwordPolicy.d.ts +13 -0
  260. package/dist/shared/passwordPolicy.js +84 -0
  261. package/dist/shared/passwordPolicy.test.d.ts +1 -0
  262. package/dist/shared/passwordPolicy.test.js +34 -0
  263. package/dist/storage/workspaceAssetStore.d.ts +15 -3
  264. package/dist/storage/workspaceAssetStore.js +132 -44
  265. package/dist/storage/workspaceAssetStore.test.js +93 -6
  266. package/dist/styles/fonts.css +70 -0
  267. package/dist/sync/collaborationSyncPayload.d.ts +6 -1
  268. package/dist/sync/collaborationSyncPayload.js +17 -11
  269. package/dist/sync/collaborationSyncPayload.test.js +13 -1
  270. package/dist/sync/contentSyncState.d.ts +4 -8
  271. package/dist/sync/contentSyncState.js +33 -77
  272. package/dist/sync/syncApplyHandlers.d.ts +7 -0
  273. package/dist/sync/syncApplyHandlers.js +28 -13
  274. package/dist/sync/syncApplyHandlers.test.js +72 -3
  275. package/dist/sync/syncFieldSemantics.d.ts +12 -0
  276. package/dist/sync/syncFieldSemantics.js +55 -0
  277. package/dist/sync/syncResourceAdapters.d.ts +44 -0
  278. package/dist/sync/syncResourceAdapters.js +77 -0
  279. package/dist/sync/syncService.d.ts +6 -0
  280. package/dist/sync/syncService.js +60 -0
  281. package/dist/sync/syncService.test.js +71 -3
  282. package/dist/sync/taskSyncChangeKey.d.ts +2 -0
  283. package/dist/sync/taskSyncChangeKey.js +143 -0
  284. package/dist/sync/taskSyncPayload.js +3 -8
  285. package/dist/sync/workspacePullFeed.js +4 -3
  286. package/dist/sync/workspacePullFeed.test.js +43 -0
  287. package/dist/sync/workspaceRepair.js +5 -2
  288. package/dist/sync/workspaceSyncModel.d.ts +48 -0
  289. package/dist/sync/workspaceSyncModel.js +195 -31
  290. package/dist/sync/workspaceSyncModel.test.js +325 -12
  291. package/dist/sync/workspaceSyncState.d.ts +19 -0
  292. package/dist/sync/workspaceSyncState.js +3 -1
  293. package/dist/sync/workspaceSyncSurface.js +3 -8
  294. package/dist/types.d.ts +17 -0
  295. package/dist/ui/assets/AgentsModule-DrLawwNl.js +1 -0
  296. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-BlS-cqnl.js → AnnotatedAttachmentWorkspace-Z9_whf7F.js} +1 -1
  297. package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
  298. package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
  299. package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
  300. package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
  301. package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +252 -0
  302. package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +1 -0
  303. package/dist/ui/assets/{InitiativesModule-BjR6iBf9.js → InitiativesModule-9E6ParrY.js} +1 -1
  304. package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
  305. package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
  306. package/dist/ui/assets/PlansPage-CvfnMiWq.css +1 -0
  307. package/dist/ui/assets/PlansPage-DRXscYxH.js +1 -0
  308. package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
  309. package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
  310. package/dist/ui/assets/TaskSettings-DZX4jk7e.js +9 -0
  311. package/dist/ui/assets/{WorkflowsModule-DnFqdUME.js → WorkflowsModule-BA7jcEpH.js} +1 -1
  312. package/dist/ui/assets/index-9eT8e0Lu.css +1 -0
  313. package/dist/ui/assets/index-C6k75jr8.js +6 -0
  314. package/dist/ui/assets/{vendor-icons-I7ZwG1z_.js → vendor-icons-DuEd_65c.js} +1 -1
  315. package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
  316. package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
  317. package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
  318. package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  319. package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
  320. package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
  321. package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
  322. package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
  323. package/dist/ui/fonts/Noir_medium.otf +0 -0
  324. package/dist/ui/fonts/Noir_medium.woff2 +0 -0
  325. package/dist/ui/fonts/Noir_regular.otf +0 -0
  326. package/dist/ui/fonts/Noir_regular.woff2 +0 -0
  327. package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
  328. package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
  329. package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
  330. package/dist/ui/index.html +3 -3
  331. package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
  332. package/dist/utils/assignees.d.ts +2 -0
  333. package/dist/utils/assignees.js +2 -0
  334. package/dist/utils/avatarUpload.d.ts +27 -0
  335. package/dist/utils/avatarUpload.js +132 -0
  336. package/dist/utils/avatarUpload.test.d.ts +1 -0
  337. package/dist/utils/avatarUpload.test.js +40 -0
  338. package/dist/utils/bootstrapTrace.d.ts +7 -0
  339. package/dist/utils/bootstrapTrace.js +29 -0
  340. package/dist/utils/commercialLifecyclePresentation.d.ts +19 -0
  341. package/dist/utils/commercialLifecyclePresentation.js +199 -0
  342. package/dist/utils/contextAssetEvents.d.ts +2 -0
  343. package/dist/utils/syncEventDetails.d.ts +3 -0
  344. package/dist/utils/syncEventDetails.js +64 -0
  345. package/dist/utils/syncEventDetails.test.d.ts +1 -0
  346. package/dist/utils/syncEventDetails.test.js +23 -0
  347. package/dist/utils/syncEventPresentation.d.ts +15 -0
  348. package/dist/utils/syncEventPresentation.js +129 -0
  349. package/dist/utils/syncEventPresentation.test.d.ts +1 -0
  350. package/dist/utils/syncEventPresentation.test.js +64 -0
  351. package/dist/utils/syncStatusPresentation.d.ts +72 -0
  352. package/dist/utils/syncStatusPresentation.js +217 -0
  353. package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
  354. package/dist/utils/syncStatusPresentation.test.js +164 -0
  355. package/dist/utils/taskActivity.d.ts +2 -0
  356. package/dist/utils/taskActivity.js +228 -22
  357. package/dist/utils/taskActivity.test.js +119 -8
  358. package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
  359. package/dist/utils/workspaceSyncPresentation.js +68 -2
  360. package/dist/utils/workspaceSyncPresentation.test.js +36 -1
  361. package/package.json +10 -2
  362. package/scripts/check-cloud-mcp.mjs +83 -0
  363. package/scripts/export-sqlite-to-postgres.mjs +7 -9
  364. package/scripts/playwright-auth.sh +5 -1
  365. package/scripts/run-billing-performance-smoke.sh +24 -0
  366. package/scripts/run-e2e-realtime.sh +17 -3
  367. package/scripts/run-smoke.sh +17 -5
  368. package/scripts/run-soak.sh +17 -5
  369. package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  370. package/src/resources/templates/workflows/collaborate.yaml +1 -1
  371. package/src/resources/templates/workflows/evaluate.yaml +2 -2
  372. package/src/resources/templates/workflows/plan.yaml +1 -1
  373. package/src/resources/templates/workflows/review.yaml +2 -2
  374. package/dist/ui/assets/AgentsModule-BLWVbuKP.js +0 -1
  375. package/dist/ui/assets/DocumentWorkspace-BH_6DF6x.js +0 -250
  376. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +0 -1
  377. package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
  378. package/dist/ui/assets/PlansPage-CSDQ4sLa.js +0 -1
  379. package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
  380. package/dist/ui/assets/TaskSettings-CEDy34Jo.js +0 -9
  381. package/dist/ui/assets/index-DXUdtH1B.js +0 -6
  382. package/dist/ui/assets/index-Ii0B0rTO.css +0 -1
  383. package/scripts/migrate-planning-model.ts +0 -233
@@ -0,0 +1,143 @@
1
+ import { serializeTaskForSync } from './taskSyncPayload.js';
2
+ import { normalizeSyncNullableId, normalizeSyncNullableIsoString, normalizeSyncNullableString, normalizeSyncOptionalId, normalizeSyncOptionalString, } from './syncFieldSemantics.js';
3
+ function normalizeConflictTaxonomies(value) {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ return {};
6
+ const entries = Object.entries(value)
7
+ .filter(([key]) => String(key || '').trim().length > 0)
8
+ .sort(([left], [right]) => left.localeCompare(right));
9
+ const normalized = {};
10
+ for (const [key, raw] of entries) {
11
+ if (Array.isArray(raw)) {
12
+ normalized[key] = raw.map((entry) => String(entry ?? '')).sort((left, right) => left.localeCompare(right));
13
+ continue;
14
+ }
15
+ if (raw === undefined || raw === null)
16
+ continue;
17
+ normalized[key] = String(raw);
18
+ }
19
+ return normalized;
20
+ }
21
+ function normalizeConflictChecklistItems(value) {
22
+ if (!Array.isArray(value))
23
+ return [];
24
+ return value
25
+ .map((item) => {
26
+ const entry = item && typeof item === 'object' ? item : {};
27
+ return {
28
+ id: String(entry.id || '').trim(),
29
+ title: String(entry.title || '').trim(),
30
+ isCompleted: Boolean(entry.isCompleted),
31
+ order: entry.order === undefined || entry.order === null ? '' : String(entry.order),
32
+ };
33
+ })
34
+ .sort((left, right) => {
35
+ const leftOrder = Number.parseInt(left.order, 10);
36
+ const rightOrder = Number.parseInt(right.order, 10);
37
+ if (Number.isFinite(leftOrder) && Number.isFinite(rightOrder) && leftOrder !== rightOrder) {
38
+ return leftOrder - rightOrder;
39
+ }
40
+ if (left.title !== right.title)
41
+ return left.title.localeCompare(right.title);
42
+ return left.id.localeCompare(right.id);
43
+ });
44
+ }
45
+ function normalizeSyncComments(value) {
46
+ if (!Array.isArray(value))
47
+ return [];
48
+ return value
49
+ .map((entry) => {
50
+ const comment = entry && typeof entry === 'object' ? entry : null;
51
+ return {
52
+ id: String(comment?.id || '').trim(),
53
+ author: String(comment?.author || '').trim(),
54
+ submittedAuthor: normalizeSyncOptionalString(comment?.submittedAuthor) || '',
55
+ text: String(comment?.text || ''),
56
+ timestamp: normalizeSyncNullableIsoString(comment?.timestamp) || '',
57
+ actor: comment?.actor ?? null,
58
+ };
59
+ })
60
+ .sort((left, right) => {
61
+ if (left.timestamp !== right.timestamp)
62
+ return left.timestamp.localeCompare(right.timestamp);
63
+ if (left.id !== right.id)
64
+ return left.id.localeCompare(right.id);
65
+ if (left.author !== right.author)
66
+ return left.author.localeCompare(right.author);
67
+ return left.text.localeCompare(right.text);
68
+ });
69
+ }
70
+ function normalizeSyncAttachments(value) {
71
+ if (!Array.isArray(value))
72
+ return [];
73
+ return value
74
+ .map((entry) => {
75
+ if (typeof entry === 'string') {
76
+ const path = entry.trim();
77
+ return {
78
+ path,
79
+ fsPath: '',
80
+ caption: '',
81
+ displayName: '',
82
+ originalFilename: '',
83
+ assetId: '',
84
+ referenceNumber: '',
85
+ taskId: '',
86
+ timestamp: '',
87
+ };
88
+ }
89
+ const attachment = entry && typeof entry === 'object' ? entry : null;
90
+ return {
91
+ path: String(attachment?.path || '').trim(),
92
+ fsPath: normalizeSyncOptionalString(attachment?.fsPath) || '',
93
+ caption: normalizeSyncOptionalString(attachment?.caption) || '',
94
+ displayName: normalizeSyncOptionalString(attachment?.displayName) || '',
95
+ originalFilename: normalizeSyncOptionalString(attachment?.originalFilename) || '',
96
+ assetId: normalizeSyncOptionalId(attachment?.assetId) || '',
97
+ referenceNumber: attachment?.referenceNumber === undefined || attachment.referenceNumber === null
98
+ ? ''
99
+ : String(attachment.referenceNumber),
100
+ taskId: normalizeSyncNullableId(attachment?.taskId) || '',
101
+ timestamp: normalizeSyncNullableIsoString(attachment?.timestamp) || '',
102
+ };
103
+ })
104
+ .sort((left, right) => {
105
+ if (left.path !== right.path)
106
+ return left.path.localeCompare(right.path);
107
+ if (left.assetId !== right.assetId)
108
+ return left.assetId.localeCompare(right.assetId);
109
+ if (left.timestamp !== right.timestamp)
110
+ return left.timestamp.localeCompare(right.timestamp);
111
+ return JSON.stringify(left).localeCompare(JSON.stringify(right));
112
+ });
113
+ }
114
+ export function buildTaskSyncChangeKey(task, archivedValue) {
115
+ const source = serializeTaskForSync(task);
116
+ return JSON.stringify({
117
+ id: source.id,
118
+ title: source.title,
119
+ description: normalizeSyncNullableString(source.description) || '',
120
+ category: source.category,
121
+ type: source.type,
122
+ priority: source.priority === undefined || source.priority === null ? '' : String(source.priority),
123
+ complexity: source.complexity === undefined || source.complexity === null ? '' : String(source.complexity),
124
+ status: source.status,
125
+ approach: normalizeSyncOptionalString(source.approach) || '',
126
+ canceledReason: normalizeSyncNullableString(source.canceledReason) || '',
127
+ createdAt: source.createdAt,
128
+ completedAt: normalizeSyncNullableIsoString(source.completedAt) || '',
129
+ taxonomies: normalizeConflictTaxonomies(source.taxonomies),
130
+ createdBy: normalizeSyncOptionalId(source.createdBy) || '',
131
+ assignee: normalizeSyncOptionalId(source.assignee) || '',
132
+ scheduledDate: normalizeSyncNullableString(source.scheduledDate) || '',
133
+ dueDate: normalizeSyncNullableString(source.dueDate) || '',
134
+ scheduledWeekKey: normalizeSyncNullableString(source.scheduledWeekKey) || '',
135
+ orderInDay: source.orderInDay === undefined || source.orderInDay === null ? '' : String(source.orderInDay),
136
+ workstreamId: normalizeSyncNullableId(source.workstreamId) || '',
137
+ referenceNumber: source.referenceNumber === undefined || source.referenceNumber === null ? '' : String(source.referenceNumber),
138
+ comments: normalizeSyncComments(source.comments),
139
+ attachments: normalizeSyncAttachments(source.attachments),
140
+ checklistItems: normalizeConflictChecklistItems(source.checklistItems),
141
+ isArchived: archivedValue ? '1' : '0'
142
+ });
143
+ }
@@ -1,16 +1,11 @@
1
+ import { normalizeSyncNullableString, normalizeSyncOptionalString, } from './syncFieldSemantics.js';
1
2
  function toOptionalString(value) {
2
- if (value === undefined || value === null)
3
- return undefined;
4
- const normalized = String(value).trim();
5
- return normalized.length > 0 ? normalized : undefined;
3
+ return normalizeSyncOptionalString(value);
6
4
  }
7
5
  function toNullableString(value) {
8
6
  if (value === undefined)
9
7
  return undefined;
10
- if (value === null)
11
- return null;
12
- const normalized = String(value).trim();
13
- return normalized.length > 0 ? normalized : null;
8
+ return normalizeSyncNullableString(value);
14
9
  }
15
10
  function toOptionalBoolean(value) {
16
11
  return typeof value === 'boolean' ? value : undefined;
@@ -1,4 +1,5 @@
1
1
  import { serializeTaskForSync } from './taskSyncPayload.js';
2
+ import { aiProfileSyncResourceAdapter, taskSyncResourceAdapter } from './syncResourceAdapters.js';
2
3
  export async function buildWorkspacePullFeed(input) {
3
4
  const buildStartedAtMs = Date.now();
4
5
  const { core, workspaceId, cursor, pageSize, encodeWorkspaceSyncCursor, contentSyncState, collaborationSyncState } = input;
@@ -7,7 +8,7 @@ export async function buildWorkspacePullFeed(input) {
7
8
  const taskRows = core.listTasksForSync(workspaceId, syncCursor, dbFetchLimit);
8
9
  const upsertEntries = taskRows
9
10
  .map((entry) => {
10
- const watermark = String(entry.task?.updatedAt || entry.task?.createdAt || '').trim();
11
+ const watermark = taskSyncResourceAdapter.getWatermark(entry.task);
11
12
  const taskId = String(entry.task?.id || '').trim();
12
13
  return {
13
14
  kind: 'upsert',
@@ -55,10 +56,10 @@ export async function buildWorkspacePullFeed(input) {
55
56
  workstream
56
57
  }))
57
58
  .filter((entry) => Number.isFinite(Date.parse(entry.watermark)) && entry.workstream.id.length > 0);
58
- const aiProfileEntries = core.listAiProfiles(workspaceId)
59
+ const aiProfileEntries = core.listAiProfiles(workspaceId, { includeArchived: true })
59
60
  .map((profile) => ({
60
61
  kind: 'ai-profile',
61
- watermark: String(profile.updatedAt || profile.createdAt || '').trim(),
62
+ watermark: aiProfileSyncResourceAdapter.getWatermark(profile),
62
63
  sortId: `ai-profile:${String(profile.id || '').trim()}`,
63
64
  profile
64
65
  }))
@@ -126,6 +126,7 @@ describe('workspacePullFeed', () => {
126
126
  userId: 'user-1',
127
127
  email: 'person@example.com',
128
128
  displayName: 'Person',
129
+ avatarUrl: '/api/taskforce/context/users%2Fuser-1%2Fprofile%2Favatar%2Fheadshot.webp',
129
130
  role: 'owner',
130
131
  permissionMode: 'read-write',
131
132
  betaAccess: true,
@@ -167,6 +168,48 @@ describe('workspacePullFeed', () => {
167
168
  displayName: 'Person',
168
169
  })
169
170
  ]);
171
+ expect(result.workspaceMembers[0]).not.toHaveProperty('avatarUrl');
172
+ });
173
+ it('includes ai-profile upserts with avatar fields in the pull feed', async () => {
174
+ const core = createCoreMock();
175
+ core.listAiProfiles = () => [
176
+ {
177
+ id: 'ai-profile-1',
178
+ workspaceId: 'workspace-1',
179
+ profileToken: 'tfp_test',
180
+ name: 'Codex',
181
+ username: 'codex',
182
+ icon: 'Bot',
183
+ color: '#0ea5e9',
184
+ avatarUrl: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fai-profiles%2Fai-profile-1%2Favatar%2Favatar.webp',
185
+ avatarSourceUrl: '/api/taskforce/context/workspaces%2Fworkspace-1%2Fassets%2Fimages%2Fai-profiles%2Fai-profile-1%2Favatar%2Fsource.webp',
186
+ createdAt: '2026-04-10T10:00:00.000Z',
187
+ updatedAt: '2026-04-10T10:05:00.000Z',
188
+ lastActiveAt: '2026-04-10T10:05:00.000Z'
189
+ }
190
+ ];
191
+ const result = await buildWorkspacePullFeed({
192
+ core,
193
+ workspaceId: 'workspace-1',
194
+ cursor: null,
195
+ pageSize: 10,
196
+ encodeWorkspaceSyncCursor: encodeCursor,
197
+ contentSyncState: createContentSyncStateMock(),
198
+ collaborationSyncState: createCollaborationSyncStateMock(),
199
+ });
200
+ expect(result.changes).toEqual([
201
+ expect.objectContaining({
202
+ op: 'ai-profile-upsert',
203
+ watermark: '2026-04-10T10:05:00.000Z',
204
+ profile: expect.objectContaining({
205
+ id: 'ai-profile-1',
206
+ avatarUrl: expect.stringContaining('/api/taskforce/context/'),
207
+ avatarSourceUrl: expect.stringContaining('/api/taskforce/context/')
208
+ })
209
+ })
210
+ ]);
211
+ expect(result.nextCursor).toBe('2026-04-10T10:05:00.000Z|ai-profile:ai-profile-1');
212
+ expect(result.hasMore).toBe(false);
170
213
  });
171
214
  it('hydrates document and asset payloads only for entries included in the current page', async () => {
172
215
  const core = createCoreMock();
@@ -338,8 +338,9 @@ export function scanWorkspaceRepair(input) {
338
338
  for (const asset of assets) {
339
339
  const links = input.workspaceAssetStore.listLinksForAsset(asset.assetId, snapshot.workspaceId, { includeDeleted: false });
340
340
  for (const link of links) {
341
- if (activeTaskIds.has(link.taskId))
341
+ if (link.targetType === 'task' && link.taskId && activeTaskIds.has(link.taskId))
342
342
  continue;
343
+ const linkedTargetId = link.targetId;
343
344
  issues.push({
344
345
  code: 'stale_asset_link',
345
346
  entityKind: 'link',
@@ -349,7 +350,9 @@ export function scanWorkspaceRepair(input) {
349
350
  role: link.role,
350
351
  repairable: true,
351
352
  recommendedAction: 'delete-link',
352
- detail: 'Canonical asset link points to a task that no longer exists in this workspace.'
353
+ detail: link.targetType === 'task'
354
+ ? 'Canonical asset link points to a task that no longer exists in this workspace.'
355
+ : `Canonical asset link points to a missing ${link.targetType} target (${linkedTargetId}).`
353
356
  });
354
357
  }
355
358
  }
@@ -3,6 +3,7 @@ import type { DocumentReviewCommentRecord, DocumentReviewSessionStatus } from '.
3
3
  import type { AnnotatedAttachmentAnnotation } from '../annotatedAttachments/types.js';
4
4
  import type { WorkspaceTaxonomyState } from '../shared/taxonomyState.js';
5
5
  import { type AiProfileSurfaceType } from '../shared/aiProfileSurfaceType.js';
6
+ import { type AiProfileSeatScope } from '../shared/aiProfileSeatScope.js';
6
7
  import { type TaskSyncPayload } from './taskSyncPayload.js';
7
8
  export type WorkspaceSyncTaskSnapshot = TaskSyncPayload;
8
9
  export interface WorkspaceSyncTaskEventSnapshot {
@@ -23,12 +24,20 @@ export interface WorkspaceSyncAiProfileSnapshot {
23
24
  username: string;
24
25
  icon: string;
25
26
  color: string;
27
+ avatarUrl?: string | null;
28
+ avatarSourceUrl?: string | null;
26
29
  description?: string | null;
27
30
  role?: string | null;
28
31
  provider?: string | null;
29
32
  model?: string | null;
30
33
  surfaceType?: AiProfileSurfaceType | null;
34
+ seatScope?: AiProfileSeatScope | null;
31
35
  providerMetadata?: Record<string, unknown> | null;
36
+ archivedAt?: string | null;
37
+ archivedBy?: string | null;
38
+ archivedReason?: string | null;
39
+ mergedIntoProfileId?: string | null;
40
+ rosterStateUpdatedAt?: string | null;
32
41
  createdAt: string;
33
42
  updatedAt: string;
34
43
  lastActiveAt?: string | null;
@@ -118,6 +127,8 @@ export type WorkspaceSyncChange = {
118
127
  } | {
119
128
  op: 'delete';
120
129
  taskId: string;
130
+ deletedAt?: string;
131
+ watermark?: string;
121
132
  } | {
122
133
  op: 'initiative-upsert';
123
134
  initiative: WorkspaceSyncInitiativeSnapshot;
@@ -198,6 +209,8 @@ export type WorkspaceSyncChange = {
198
209
  export interface WorkspaceSyncPayload {
199
210
  changes: WorkspaceSyncChange[];
200
211
  currentTaskIds: Set<string>;
212
+ currentTaskWatermarks?: Map<string, string>;
213
+ currentTaskChangeKeys?: Map<string, string>;
201
214
  deleteTaskIds: Set<string>;
202
215
  currentInitiativeIds: Set<string>;
203
216
  currentInitiativeWatermarks: Map<string, string>;
@@ -205,6 +218,7 @@ export interface WorkspaceSyncPayload {
205
218
  currentWorkstreamWatermarks: Map<string, string>;
206
219
  currentAiProfileIds: Set<string>;
207
220
  currentAiProfileWatermarks: Map<string, string>;
221
+ currentAiProfileChangeKeys?: Map<string, string>;
208
222
  currentDocumentPaths: Set<string>;
209
223
  deleteDocumentPaths: Set<string>;
210
224
  currentDocumentWatermarks: Map<string, string>;
@@ -223,6 +237,34 @@ export interface WorkspaceSyncPayload {
223
237
  currentTaskEventWatermarks: Map<string, string>;
224
238
  /** Watermarks for every task upsert included in this payload (id → updatedAt|createdAt). */
225
239
  pushedWatermarks: Map<string, string>;
240
+ pushedTaskChangeKeys?: Map<string, string>;
241
+ deltaDiagnostics?: WorkspaceSyncDeltaDiagnostics;
242
+ }
243
+ export type WorkspaceSyncBaselineResetReason = 'missing-baseline' | 'repair-reset' | 'storage-write-failed';
244
+ export interface WorkspaceSyncDomainDeltaDiagnostics {
245
+ mode: 'none' | 'delta' | 'send-all';
246
+ reason: WorkspaceSyncBaselineResetReason | 'full-state-domain' | null;
247
+ currentCount: number;
248
+ baselineCount: number;
249
+ changeCount: number;
250
+ }
251
+ export interface WorkspaceSyncDeltaDiagnostics {
252
+ totalChanges: number;
253
+ byOp: Record<string, number>;
254
+ baselineResetReason: WorkspaceSyncBaselineResetReason | null;
255
+ domains: {
256
+ tasks: WorkspaceSyncDomainDeltaDiagnostics;
257
+ initiatives: WorkspaceSyncDomainDeltaDiagnostics;
258
+ workstreams: WorkspaceSyncDomainDeltaDiagnostics;
259
+ aiProfiles: WorkspaceSyncDomainDeltaDiagnostics;
260
+ documents: WorkspaceSyncDomainDeltaDiagnostics;
261
+ assets: WorkspaceSyncDomainDeltaDiagnostics;
262
+ documentReviewSessions: WorkspaceSyncDomainDeltaDiagnostics;
263
+ documentReviewComments: WorkspaceSyncDomainDeltaDiagnostics;
264
+ annotatedAttachmentSessions: WorkspaceSyncDomainDeltaDiagnostics;
265
+ taskEvents: WorkspaceSyncDomainDeltaDiagnostics;
266
+ taxonomy: WorkspaceSyncDomainDeltaDiagnostics;
267
+ };
226
268
  }
227
269
  export declare function toWorkspaceSyncTaskSnapshot(task: TaskItem): WorkspaceSyncTaskSnapshot;
228
270
  export interface WorkspaceSyncDocumentSnapshot {
@@ -258,6 +300,7 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
258
300
  archivedTasks: TaskItem[];
259
301
  lastPushedTaskIds: Set<string>;
260
302
  pendingDeletedTaskIds: Set<string>;
303
+ pendingDeletedTaskWatermarks?: Map<string, string>;
261
304
  initiatives?: InitiativeItem[];
262
305
  workstreams?: WorkstreamItem[];
263
306
  taxonomies?: unknown[];
@@ -265,6 +308,8 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
265
308
  aiProfiles?: WorkspaceSyncAiProfileSnapshot[];
266
309
  documents?: WorkspaceSyncDocumentSnapshot[];
267
310
  assets?: WorkspaceSyncAssetSnapshot[];
311
+ currentDocumentPaths?: Iterable<string>;
312
+ currentAssetPaths?: Iterable<string>;
268
313
  documentReviewSessions?: WorkspaceSyncDocumentReviewSessionSnapshot[];
269
314
  documentReviewComments?: WorkspaceSyncDocumentReviewCommentSnapshot[];
270
315
  annotatedAttachmentSessions?: WorkspaceSyncAnnotatedAttachmentSessionSnapshot[];
@@ -286,6 +331,7 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
286
331
  lastPushedAnnotatedAttachmentSessionIds?: Set<string>;
287
332
  lastPushedAnnotatedAttachmentSessionWatermarks?: Map<string, string>;
288
333
  lastPushedTaskEventWatermarks?: Map<string, string>;
334
+ baselineResetReason?: WorkspaceSyncBaselineResetReason | null;
289
335
  /**
290
336
  * Watermark (updatedAt|createdAt) of each task as of its last successful push.
291
337
  * When provided, only tasks whose watermark differs from this map are included
@@ -293,6 +339,8 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
293
339
  * Absent or empty map = include all tasks (first-push / full-sync behaviour).
294
340
  */
295
341
  lastPushedWatermarks?: Map<string, string>;
342
+ lastPushedTaskChangeKeys?: Map<string, string>;
343
+ lastPushedAiProfileChangeKeys?: Map<string, string>;
296
344
  }): WorkspaceSyncPayload;
297
345
  export declare function buildWorkspaceSyncSignatureModel(input: {
298
346
  workspaceId: string;