@taskforcehq/taskforce 0.3.326 → 0.3.328

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 (1382) hide show
  1. package/LICENSE.md +68 -0
  2. package/README.md +19 -0
  3. package/dist/Taskforce.module.css +2168 -585
  4. package/dist/TaskforceCore.d.ts +1 -0
  5. package/dist/TaskforceCore.js +65 -22
  6. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
  7. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
  8. package/dist/annotatedAttachments/commandService.d.ts +68 -0
  9. package/dist/annotatedAttachments/commandService.js +348 -0
  10. package/dist/annotatedAttachments/service.d.ts +2 -0
  11. package/dist/annotatedAttachments/service.js +13 -12
  12. package/dist/cli.js +158 -9
  13. package/dist/cliOpenPort.d.ts +1 -0
  14. package/dist/cliOpenPort.js +4 -0
  15. package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
  16. package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
  17. package/dist/compat/workspaceSyncCompat.js +6 -2
  18. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
  19. package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
  20. package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
  21. package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
  22. package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
  23. package/dist/components/activity/EntityActivityTimeline.js +83 -35
  24. package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
  25. package/dist/components/context/AttachmentPreviewHost.js +222 -0
  26. package/dist/components/context/ContextAttachmentManager.d.ts +7 -0
  27. package/dist/components/context/ContextAttachmentManager.js +514 -208
  28. package/dist/components/features/AiProfilesModule.d.ts +24 -0
  29. package/dist/components/features/AiProfilesModule.js +744 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
  32. package/dist/components/features/DocumentGenerateModal.js +23 -5
  33. package/dist/components/features/DocumentIndex.d.ts +19 -1
  34. package/dist/components/features/DocumentIndex.js +104 -15
  35. package/dist/components/features/DocumentViewer.d.ts +9 -1
  36. package/dist/components/features/DocumentViewer.js +721 -100
  37. package/dist/components/features/DocumentWorkspace.d.ts +37 -2
  38. package/dist/components/features/DocumentWorkspace.js +21 -6
  39. package/dist/components/features/TaskSettings.d.ts +6 -27
  40. package/dist/components/features/TaskSettings.js +232 -143
  41. package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
  42. package/dist/components/features/TaskforceAgentsModule.js +1782 -0
  43. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
  44. package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
  45. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
  46. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
  47. package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
  48. package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
  49. package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
  50. package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
  51. package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
  52. package/dist/components/features/documentWorkspaceModel.js +30 -5
  53. package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
  54. package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
  55. package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
  56. package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
  57. package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
  58. package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
  59. package/dist/components/features/planning/PlanningEntitySummary.d.ts +46 -0
  60. package/dist/components/features/planning/PlanningEntitySummary.js +98 -0
  61. package/dist/components/features/planning/PlanningLinkPicker.d.ts +11 -0
  62. package/dist/components/features/planning/PlanningLinkPicker.js +28 -0
  63. package/dist/components/features/planning/PlanningModule.d.ts +6 -0
  64. package/dist/components/features/planning/PlanningModule.js +588 -0
  65. package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
  66. package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
  67. package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
  68. package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
  69. package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
  70. package/dist/components/features/planning/PlanningTaskCard.js +26 -0
  71. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
  72. package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
  73. package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
  74. package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
  75. package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
  76. package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
  77. package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
  78. package/dist/components/features/planning/planningCreateIntent.js +16 -0
  79. package/dist/components/features/planning/planningNavigator.d.ts +33 -0
  80. package/dist/components/features/planning/planningNavigator.js +96 -0
  81. package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
  82. package/dist/components/features/planning/planningTaskArrangement.js +106 -0
  83. package/dist/components/features/planning/planningWorkspaceModel.d.ts +132 -0
  84. package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
  85. package/dist/components/features/settings/CategoryManager.js +2 -2
  86. package/dist/components/features/settings/TaxonomyEditor.js +1 -1
  87. package/dist/components/features/settings/TaxonomyManager.js +1 -1
  88. package/dist/components/features/settings/TypeManager.js +1 -1
  89. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
  90. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
  91. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
  92. package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
  93. package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
  94. package/dist/components/features/taskforceAgentEditorModel.js +145 -0
  95. package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
  96. package/dist/components/features/useDocumentWorkspaceController.js +106 -21
  97. package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
  98. package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
  99. package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
  100. package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
  101. package/dist/components/features/workflowManager/types.d.ts +74 -0
  102. package/dist/components/features/workflowManager/types.js +1 -0
  103. package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
  104. package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
  105. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
  106. package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
  107. package/dist/components/task/TaskActionHeader.d.ts +7 -3
  108. package/dist/components/task/TaskActionHeader.js +46 -53
  109. package/dist/components/task/TaskCard.d.ts +10 -2
  110. package/dist/components/task/TaskCard.js +138 -56
  111. package/dist/components/task/TaskContextUpload.d.ts +4 -0
  112. package/dist/components/task/TaskContextUpload.js +3 -2
  113. package/dist/components/task/TaskForm.d.ts +16 -17
  114. package/dist/components/task/TaskForm.js +569 -199
  115. package/dist/components/task/TaskImageReviews.d.ts +8 -0
  116. package/dist/components/task/TaskImageReviews.js +47 -0
  117. package/dist/components/task/TaskKanban.d.ts +9 -10
  118. package/dist/components/task/TaskKanban.js +70 -18
  119. package/dist/components/task/TaskList.d.ts +9 -8
  120. package/dist/components/task/TaskList.js +46 -32
  121. package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
  122. package/dist/components/task/TaskReferenceBadge.js +3 -2
  123. package/dist/components/task/TaskStatusActions.d.ts +3 -1
  124. package/dist/components/task/TaskStatusActions.js +27 -7
  125. package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
  126. package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
  127. package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
  128. package/dist/components/task/TaskWorkstreamPicker.js +25 -0
  129. package/dist/components/task/TrashRestoreControls.d.ts +18 -0
  130. package/dist/components/task/TrashRestoreControls.js +71 -0
  131. package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
  132. package/dist/components/ui/AiIdentityRosterCard.js +5 -0
  133. package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
  134. package/dist/components/ui/AssetTraySortControl.js +38 -0
  135. package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
  136. package/dist/components/ui/AssigneeIdentity.js +41 -0
  137. package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
  138. package/dist/components/ui/DiscardChangesDialog.js +7 -0
  139. package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
  140. package/dist/components/ui/DisclosureSectionHeader.js +2 -2
  141. package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
  142. package/dist/components/ui/DocumentTypeIcon.js +8 -0
  143. package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
  144. package/dist/components/ui/EditableAvatarButton.js +6 -5
  145. package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
  146. package/dist/components/ui/HierarchyActionBadge.js +2 -2
  147. package/dist/components/ui/Markdown.d.ts +13 -3
  148. package/dist/components/ui/Markdown.fixture.d.ts +1 -0
  149. package/dist/components/ui/Markdown.fixture.js +23 -0
  150. package/dist/components/ui/Markdown.js +158 -68
  151. package/dist/components/ui/Modal.d.ts +3 -1
  152. package/dist/components/ui/Modal.js +85 -19
  153. package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
  154. package/dist/components/ui/MultiSelectFilter.js +26 -5
  155. package/dist/components/ui/ReferenceBadgeButton.js +2 -3
  156. package/dist/components/ui/TaxonomyDropdown.d.ts +18 -1
  157. package/dist/components/ui/TaxonomyDropdown.js +177 -59
  158. package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
  159. package/dist/components/ui/TopNoticeLayer.js +5 -2
  160. package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
  161. package/dist/components/ui/useFallbackImageUrl.js +20 -0
  162. package/dist/components/views/AppShellHeader.js +2 -2
  163. package/dist/components/views/StandaloneLayout.d.ts +1 -0
  164. package/dist/components/views/StandaloneLayout.js +1717 -600
  165. package/dist/components/views/WidgetView.d.ts +1 -0
  166. package/dist/components/views/WidgetView.js +99 -31
  167. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
  168. package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
  169. package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
  170. package/dist/components/views/chrome/workspaceChrome.js +62 -27
  171. package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
  172. package/dist/components/views/panels/FilterToolbar.js +8 -5
  173. package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
  174. package/dist/components/views/panels/FilterToolbarControls.js +35 -20
  175. package/dist/components/views/panels/PlanningDrawer.d.ts +66 -49
  176. package/dist/components/views/panels/PlanningDrawer.js +983 -314
  177. package/dist/components/views/planningScope.js +7 -1
  178. package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
  179. package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
  180. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
  181. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
  182. package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
  183. package/dist/components/views/standalone/modals/HelpModal.js +3 -4
  184. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
  185. package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
  186. package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
  187. package/dist/config/applicationBaseUrl.d.ts +2 -0
  188. package/dist/config/applicationBaseUrl.js +23 -0
  189. package/dist/config/envSchema.d.ts +1 -1
  190. package/dist/config/envSchema.js +167 -5
  191. package/dist/config/localServiceCloudTarget.d.ts +10 -0
  192. package/dist/config/localServiceCloudTarget.js +76 -0
  193. package/dist/core/AdminAuditRetentionService.d.ts +43 -0
  194. package/dist/core/AdminAuditRetentionService.js +126 -0
  195. package/dist/core/AiProfileService.d.ts +35 -0
  196. package/dist/core/AiProfileService.js +511 -251
  197. package/dist/core/AttachmentLinkService.d.ts +10 -2
  198. package/dist/core/AttachmentLinkService.js +50 -15
  199. package/dist/core/AuthIdentityService.d.ts +6 -0
  200. package/dist/core/AuthIdentityService.js +38 -0
  201. package/dist/core/AuthTokenService.d.ts +1 -0
  202. package/dist/core/AuthTokenService.js +13 -0
  203. package/dist/core/DeletedTaskLifecycleService.d.ts +8 -2
  204. package/dist/core/DeletedTaskLifecycleService.js +145 -38
  205. package/dist/core/GlobalSettingsService.d.ts +3 -1
  206. package/dist/core/GlobalSettingsService.js +30 -4
  207. package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
  208. package/dist/core/InitiativeDurableMutationService.js +187 -0
  209. package/dist/core/McpTokenService.d.ts +5 -0
  210. package/dist/core/McpTokenService.js +91 -13
  211. package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
  212. package/dist/core/PlanningCommandPreparationService.js +149 -0
  213. package/dist/core/ScheduleCommandService.d.ts +76 -0
  214. package/dist/core/ScheduleCommandService.js +165 -0
  215. package/dist/core/SyncReconciliationService.d.ts +29 -6
  216. package/dist/core/SyncReconciliationService.js +256 -84
  217. package/dist/core/TaskActivityService.d.ts +22 -2
  218. package/dist/core/TaskActivityService.js +177 -29
  219. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +36 -0
  220. package/dist/core/TaskAttachmentLinksDurableMutationService.js +240 -0
  221. package/dist/core/TaskChecklistCommandService.d.ts +50 -0
  222. package/dist/core/TaskChecklistCommandService.js +111 -0
  223. package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
  224. package/dist/core/TaskDurableCreateMutationService.js +85 -0
  225. package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
  226. package/dist/core/TaskDurableDeleteMutationService.js +54 -0
  227. package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
  228. package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
  229. package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
  230. package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
  231. package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
  232. package/dist/core/TaskDurableRestoreMutationService.js +33 -0
  233. package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
  234. package/dist/core/TaskDurableStatusMutationService.js +247 -0
  235. package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
  236. package/dist/core/TaskDurableSyncMutationService.js +70 -0
  237. package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
  238. package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
  239. package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
  240. package/dist/core/TaskLifecycleCommandService.js +161 -0
  241. package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
  242. package/dist/core/TaskRootCommandPreparationService.js +103 -0
  243. package/dist/core/Taskforce.d.ts +542 -60
  244. package/dist/core/Taskforce.js +4220 -905
  245. package/dist/core/WorkflowAssignmentService.d.ts +40 -0
  246. package/dist/core/WorkflowAssignmentService.js +158 -0
  247. package/dist/core/WorkflowExecutionService.d.ts +69 -0
  248. package/dist/core/WorkflowExecutionService.js +342 -0
  249. package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
  250. package/dist/core/WorkflowTaskActivationService.js +63 -0
  251. package/dist/core/WorkflowTemplateService.d.ts +64 -0
  252. package/dist/core/WorkflowTemplateService.js +223 -0
  253. package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
  254. package/dist/core/WorkspaceLifecycleService.js +18 -0
  255. package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
  256. package/dist/core/WorkstreamDurableMutationService.js +184 -0
  257. package/dist/core/planningReferencePolicy.d.ts +14 -0
  258. package/dist/core/planningReferencePolicy.js +53 -0
  259. package/dist/core/taskReferencePolicy.js +24 -3
  260. package/dist/core/types.d.ts +12 -11
  261. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +33 -2
  262. package/dist/documentReviews/DocumentReviewCommentStore.js +125 -8
  263. package/dist/documentReviews/commandService.d.ts +51 -0
  264. package/dist/documentReviews/commandService.js +63 -0
  265. package/dist/documentReviews/service.d.ts +24 -1
  266. package/dist/documentReviews/service.js +354 -49
  267. package/dist/documentReviews/types.d.ts +18 -1
  268. package/dist/hooks/sync/bootstrap.d.ts +3 -7
  269. package/dist/hooks/sync/bootstrap.js +6 -14
  270. package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
  271. package/dist/hooks/sync/browserSyncAuthority.js +70 -0
  272. package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
  273. package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
  274. package/dist/hooks/sync/controlPlane.d.ts +1 -37
  275. package/dist/hooks/sync/controlPlane.js +1 -78
  276. package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
  277. package/dist/hooks/sync/lifecyclePolicy.js +1 -93
  278. package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
  279. package/dist/hooks/sync/orchestratorShared.js +70 -96
  280. package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
  281. package/dist/hooks/sync/pullLifecycle.js +1 -24
  282. package/dist/hooks/sync/realtime.d.ts +4 -1
  283. package/dist/hooks/sync/realtime.js +103 -3
  284. package/dist/hooks/sync/recovery.d.ts +1 -84
  285. package/dist/hooks/sync/recovery.js +1 -245
  286. package/dist/hooks/sync/transfers.d.ts +8 -129
  287. package/dist/hooks/sync/transfers.js +19 -581
  288. package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
  289. package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
  290. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
  291. package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
  292. package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
  293. package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
  294. package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
  295. package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
  296. package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
  297. package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
  298. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
  299. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
  300. package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
  301. package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
  302. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
  303. package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
  304. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
  305. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
  306. package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
  307. package/dist/hooks/sync/useSyncStatusActions.js +8 -3
  308. package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
  309. package/dist/hooks/tasks/taskHttpMutation.js +134 -0
  310. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
  311. package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
  312. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
  313. package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
  314. package/dist/hooks/tasks/useTaskFormActions.d.ts +20 -2
  315. package/dist/hooks/tasks/useTaskFormActions.js +339 -59
  316. package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
  317. package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
  318. package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
  319. package/dist/hooks/tasks/useTaskRelationships.js +5 -25
  320. package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
  321. package/dist/hooks/tasks/useTrashSelection.js +49 -0
  322. package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
  323. package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
  324. package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
  325. package/dist/hooks/ui/useSettingsModel.js +31 -15
  326. package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
  327. package/dist/hooks/ui/useSettingsPersistence.js +4 -8
  328. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
  329. package/dist/hooks/useFilterSort.d.ts +2 -2
  330. package/dist/hooks/useFilterSort.js +19 -15
  331. package/dist/hooks/useRealtimeSync.d.ts +10 -0
  332. package/dist/hooks/useRealtimeSync.js +57 -4
  333. package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
  334. package/dist/hooks/useSyncOrchestrator.js +963 -287
  335. package/dist/hooks/useTaskData.d.ts +11 -2
  336. package/dist/hooks/useTaskData.js +59 -26
  337. package/dist/hooks/useTaskMutations.d.ts +42 -5
  338. package/dist/hooks/useTaskMutations.js +750 -125
  339. package/dist/hooks/useTaskforce.d.ts +79 -74
  340. package/dist/hooks/useTaskforce.js +1205 -450
  341. package/dist/hooks/useUiNotice.d.ts +5 -1
  342. package/dist/hooks/useUiNotice.js +13 -2
  343. package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
  344. package/dist/hooks/useWorkspaceSyncController.js +159 -17
  345. package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
  346. package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
  347. package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
  348. package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
  349. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
  350. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
  351. package/dist/hooks/workspace/workspaceLocalState.d.ts +17 -6
  352. package/dist/hooks/workspace/workspaceLocalState.js +175 -5
  353. package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
  354. package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
  355. package/dist/localization/locales/en-US.d.ts +3 -3
  356. package/dist/localization/locales/en-US.js +3 -3
  357. package/dist/localization/locales/es-419.js +3 -3
  358. package/dist/localization/locales/pt-BR.js +3 -3
  359. package/dist/mcp/adminWorkspaceRegistrar.js +2 -30
  360. package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
  361. package/dist/mcp/aiProfileBootstrap.js +4 -0
  362. package/dist/mcp/canonicalAssetHelpers.d.ts +29 -4
  363. package/dist/mcp/canonicalAssetHelpers.js +138 -35
  364. package/dist/mcp/clientIntegrations.d.ts +4 -2
  365. package/dist/mcp/clientIntegrations.js +58 -57
  366. package/dist/mcp/clientRegistry.d.ts +30 -0
  367. package/dist/mcp/clientRegistry.js +134 -0
  368. package/dist/mcp/collaborationRegistrar.js +31 -15
  369. package/dist/mcp/documentAssetRegistrar.js +231 -56
  370. package/dist/mcp/documentContentCommand.d.ts +94 -0
  371. package/dist/mcp/documentContentCommand.js +226 -0
  372. package/dist/mcp/documentHelpers.d.ts +13 -65
  373. package/dist/mcp/documentHelpers.js +49 -62
  374. package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
  375. package/dist/mcp/durableTaskMutationRouter.js +217 -0
  376. package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
  377. package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
  378. package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
  379. package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
  380. package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
  381. package/dist/mcp/gitWorktreeRoots.js +19 -0
  382. package/dist/mcp/legacyServer.d.ts +1 -0
  383. package/dist/mcp/legacyServer.js +42 -0
  384. package/dist/mcp/localCliHealth.d.ts +56 -0
  385. package/dist/mcp/localCliHealth.js +170 -0
  386. package/dist/mcp/localServiceProxy.d.ts +23 -0
  387. package/dist/mcp/localServiceProxy.js +258 -0
  388. package/dist/mcp/mcpInputValidator.d.ts +17 -0
  389. package/dist/mcp/mcpInputValidator.js +58 -0
  390. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
  391. package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
  392. package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
  393. package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
  394. package/dist/mcp/proxyServer.d.ts +1 -0
  395. package/dist/mcp/proxyServer.js +2 -0
  396. package/dist/mcp/runtime.d.ts +98 -1
  397. package/dist/mcp/runtime.js +4682 -1927
  398. package/dist/mcp/server.js +29 -2
  399. package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
  400. package/dist/mcp/sharedLocalServiceGateD.js +344 -0
  401. package/dist/mcp/stdioLifecycle.d.ts +22 -0
  402. package/dist/mcp/stdioLifecycle.js +54 -0
  403. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +192 -0
  404. package/dist/mcp/taskAttachmentCommandAdapter.js +470 -0
  405. package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
  406. package/dist/mcp/taskAttachmentHelpers.js +74 -2
  407. package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
  408. package/dist/mcp/taskPlanCommand.d.ts +64 -0
  409. package/dist/mcp/taskPlanCommand.js +98 -0
  410. package/dist/mcp/taskPlanningRegistrar.js +240 -44
  411. package/dist/mcp/toolCallCompatibility.d.ts +6 -0
  412. package/dist/mcp/toolCallCompatibility.js +16 -0
  413. package/dist/mcp/toolCatalog.d.ts +3 -1
  414. package/dist/mcp/toolProfiles.d.ts +12 -1
  415. package/dist/mcp/toolProfiles.js +43 -0
  416. package/dist/mcp/toolRegistry.d.ts +17 -2
  417. package/dist/mcp/toolRegistry.js +26 -11
  418. package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
  419. package/dist/mcp/workflowExecutionRegistrar.js +51 -0
  420. package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
  421. package/dist/migrations/taskSchemaMigrations.js +1892 -64
  422. package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
  423. package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
  424. package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
  425. package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
  426. package/dist/plugins/vite.js +48 -17
  427. package/dist/public/Taskforce_Van.webp +0 -0
  428. package/dist/runtime/appGateDefinitions.d.ts +16 -10
  429. package/dist/runtime/appGateDefinitions.js +16 -10
  430. package/dist/runtime/appGates.d.ts +5 -4
  431. package/dist/runtime/appGates.js +4 -3
  432. package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
  433. package/dist/server/aiProfileAvatarAssets.js +159 -70
  434. package/dist/server/appAccess.d.ts +12 -0
  435. package/dist/server/appAccess.js +21 -0
  436. package/dist/server/auth.js +15 -1
  437. package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
  438. package/dist/server/authorizedWorkspaceAccess.js +40 -0
  439. package/dist/server/cloudCollectionRead.d.ts +25 -0
  440. package/dist/server/cloudCollectionRead.js +120 -0
  441. package/dist/server/cloudCollectionReadPool.d.ts +52 -0
  442. package/dist/server/cloudCollectionReadPool.js +140 -0
  443. package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
  444. package/dist/server/cloudCollectionReadWorker.js +36 -0
  445. package/dist/server/cors.d.ts +2 -1
  446. package/dist/server/cors.js +45 -8
  447. package/dist/server/email.d.ts +3 -1
  448. package/dist/server/email.js +46 -8
  449. package/dist/server/index.d.ts +27 -12
  450. package/dist/server/index.js +395 -86
  451. package/dist/server/localDataOwnerPermit.d.ts +18 -0
  452. package/dist/server/localDataOwnerPermit.js +58 -0
  453. package/dist/server/localDatabaseIdentity.d.ts +14 -0
  454. package/dist/server/localDatabaseIdentity.js +69 -0
  455. package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
  456. package/dist/server/localRealtimeFileInvalidation.js +7 -0
  457. package/dist/server/localServiceLease.d.ts +65 -0
  458. package/dist/server/localServiceLease.js +485 -0
  459. package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
  460. package/dist/server/localServiceOwnershipBootstrap.js +84 -0
  461. package/dist/server/localServiceSessions.d.ts +87 -0
  462. package/dist/server/localServiceSessions.js +309 -0
  463. package/dist/server/localServiceWindowsAcl.d.ts +8 -0
  464. package/dist/server/localServiceWindowsAcl.js +60 -0
  465. package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
  466. package/dist/server/localSyncProcessLockBootstrap.js +16 -0
  467. package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
  468. package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
  469. package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
  470. package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
  471. package/dist/server/rateLimit.d.ts +1 -0
  472. package/dist/server/rateLimit.js +16 -0
  473. package/dist/server/routes/admin.d.ts +2 -4
  474. package/dist/server/routes/admin.js +199 -337
  475. package/dist/server/routes/agentRoles.d.ts +13 -0
  476. package/dist/server/routes/agentRoles.js +273 -0
  477. package/dist/server/routes/agentSkills.d.ts +16 -0
  478. package/dist/server/routes/agentSkills.js +291 -0
  479. package/dist/server/routes/agents.d.ts +49 -0
  480. package/dist/server/routes/agents.js +1455 -0
  481. package/dist/server/routes/annotatedAttachments.js +46 -9
  482. package/dist/server/routes/assetAccess.d.ts +36 -0
  483. package/dist/server/routes/assetAccess.js +93 -0
  484. package/dist/server/routes/auth.d.ts +4 -3
  485. package/dist/server/routes/auth.js +236 -21
  486. package/dist/server/routes/authSupport.d.ts +3 -1
  487. package/dist/server/routes/authSupport.js +22 -8
  488. package/dist/server/routes/documentReviews.d.ts +2 -0
  489. package/dist/server/routes/documentReviews.js +155 -15
  490. package/dist/server/routes/documents.d.ts +6 -2
  491. package/dist/server/routes/documents.js +492 -151
  492. package/dist/server/routes/durableTaskHttpRouters.d.ts +167 -0
  493. package/dist/server/routes/durableTaskHttpRouters.js +89 -0
  494. package/dist/server/routes/localMcpHealth.d.ts +11 -0
  495. package/dist/server/routes/localMcpHealth.js +29 -0
  496. package/dist/server/routes/localService.d.ts +13 -0
  497. package/dist/server/routes/localService.js +446 -0
  498. package/dist/server/routes/localUpdate.d.ts +11 -0
  499. package/dist/server/routes/localUpdate.js +154 -0
  500. package/dist/server/routes/primitives.d.ts +29 -0
  501. package/dist/server/routes/primitives.js +18 -0
  502. package/dist/server/routes/resources.d.ts +1 -10
  503. package/dist/server/routes/resources.js +1 -153
  504. package/dist/server/routes/shared.d.ts +55 -2
  505. package/dist/server/routes/shared.js +506 -16
  506. package/dist/server/routes/sync.d.ts +2 -0
  507. package/dist/server/routes/sync.js +206 -272
  508. package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
  509. package/dist/server/routes/syncAuxRoutes.js +9 -4
  510. package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
  511. package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
  512. package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
  513. package/dist/server/routes/syncPullApplyRoutes.js +520 -17
  514. package/dist/server/routes/syncPushRoutes.d.ts +33 -4
  515. package/dist/server/routes/syncPushRoutes.js +251 -62
  516. package/dist/server/routes/syncRouteTypes.d.ts +1 -1
  517. package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
  518. package/dist/server/routes/syncSnapshotRoutes.js +95 -17
  519. package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
  520. package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
  521. package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
  522. package/dist/server/routes/syncV3FeedRoutes.js +464 -0
  523. package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
  524. package/dist/server/routes/syncV3LocalCaptureRoutes.js +915 -0
  525. package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
  526. package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
  527. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
  528. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
  529. package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
  530. package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
  531. package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
  532. package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
  533. package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
  534. package/dist/server/routes/syncV3OperationRoutes.js +1151 -0
  535. package/dist/server/routes/tasks.d.ts +0 -2
  536. package/dist/server/routes/tasks.js +1083 -236
  537. package/dist/server/routes/workflows.d.ts +26 -0
  538. package/dist/server/routes/workflows.js +500 -0
  539. package/dist/server/routes.d.ts +1 -6
  540. package/dist/server/routes.js +179 -342
  541. package/dist/server/smtpTransport.d.ts +11 -3
  542. package/dist/server/smtpTransport.js +9 -2
  543. package/dist/server/start.js +42 -10
  544. package/dist/service/localServiceCli.d.ts +33 -0
  545. package/dist/service/localServiceCli.js +376 -0
  546. package/dist/service/localServiceClientLifecycle.d.ts +25 -0
  547. package/dist/service/localServiceClientLifecycle.js +189 -0
  548. package/dist/service/localServiceOpen.d.ts +17 -0
  549. package/dist/service/localServiceOpen.js +27 -0
  550. package/dist/services/agentRoleResolver.d.ts +4 -0
  551. package/dist/services/agentRoleResolver.js +7 -0
  552. package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
  553. package/dist/services/aiProfileAvatarGenerationService.js +158 -0
  554. package/dist/services/avatarImageProvider.d.ts +33 -0
  555. package/dist/services/avatarImageProvider.js +140 -0
  556. package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
  557. package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
  558. package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
  559. package/dist/services/bedrockMantleModelGateway.js +81 -0
  560. package/dist/services/bedrockModelGateway.d.ts +26 -0
  561. package/dist/services/bedrockModelGateway.js +94 -0
  562. package/dist/services/modelGateway.d.ts +82 -0
  563. package/dist/services/modelGateway.js +61 -0
  564. package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
  565. package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
  566. package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
  567. package/dist/services/taskforceAgentMcpBridge.js +527 -0
  568. package/dist/shared/agentRoleDefinition.d.ts +34 -0
  569. package/dist/shared/agentRoleDefinition.js +207 -0
  570. package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
  571. package/dist/shared/aiProfileAvatarEligibility.js +27 -0
  572. package/dist/shared/aiProfileColors.d.ts +7 -0
  573. package/dist/shared/aiProfileColors.js +33 -0
  574. package/dist/shared/colorPalette.d.ts +3 -0
  575. package/dist/shared/colorPalette.js +20 -0
  576. package/dist/shared/commentProvenance.d.ts +4 -0
  577. package/dist/shared/commentProvenance.js +6 -0
  578. package/dist/shared/deletedTaskRetention.d.ts +2 -0
  579. package/dist/shared/deletedTaskRetention.js +7 -0
  580. package/dist/shared/passwordPolicy.d.ts +2 -1
  581. package/dist/shared/passwordPolicy.js +9 -0
  582. package/dist/shared/planningIdentity.d.ts +20 -0
  583. package/dist/shared/planningIdentity.js +79 -0
  584. package/dist/shared/taskDeepLinks.d.ts +28 -0
  585. package/dist/shared/taskDeepLinks.js +48 -0
  586. package/dist/shared/taskRestoreDestination.d.ts +2 -0
  587. package/dist/shared/taskRestoreDestination.js +5 -0
  588. package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
  589. package/dist/shared/taskforceAgentDefinition.js +434 -0
  590. package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
  591. package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
  592. package/dist/shared/taskforceAgentModels.d.ts +56 -0
  593. package/dist/shared/taskforceAgentModels.js +314 -0
  594. package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
  595. package/dist/shared/taskforceAgentRunContext.js +21 -0
  596. package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
  597. package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
  598. package/dist/shared/taskforceAgentSkill.d.ts +33 -0
  599. package/dist/shared/taskforceAgentSkill.js +149 -0
  600. package/dist/storage/agentRoleStore.d.ts +91 -0
  601. package/dist/storage/agentRoleStore.js +385 -0
  602. package/dist/storage/databaseAdapter.d.ts +1 -0
  603. package/dist/storage/databaseAdapter.js +7 -1
  604. package/dist/storage/documentIntegrity.d.ts +12 -3
  605. package/dist/storage/documentIntegrity.js +105 -27
  606. package/dist/storage/objectStorageClient.d.ts +10 -4
  607. package/dist/storage/objectStorageClient.js +73 -43
  608. package/dist/storage/postgresAdapter.d.ts +2 -1
  609. package/dist/storage/postgresAdapter.js +42 -6
  610. package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
  611. package/dist/storage/postgresRequestDiagnostics.js +24 -0
  612. package/dist/storage/postgresWorker.js +65 -1
  613. package/dist/storage/sqliteAdapter.d.ts +1 -1
  614. package/dist/storage/sqliteAdapter.js +7 -1
  615. package/dist/storage/sqliteWalHealth.d.ts +71 -0
  616. package/dist/storage/sqliteWalHealth.js +176 -0
  617. package/dist/storage/taskDataPath.d.ts +1 -0
  618. package/dist/storage/taskDataPath.js +20 -0
  619. package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
  620. package/dist/storage/taskforceAgentConversationStore.js +264 -0
  621. package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
  622. package/dist/storage/taskforceAgentSkillStore.js +355 -0
  623. package/dist/storage/taskforceAgentStore.d.ts +105 -0
  624. package/dist/storage/taskforceAgentStore.js +549 -0
  625. package/dist/storage/workflowStore.d.ts +223 -0
  626. package/dist/storage/workflowStore.js +1032 -0
  627. package/dist/storage/workspaceAssetStore.d.ts +102 -0
  628. package/dist/storage/workspaceAssetStore.js +488 -25
  629. package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
  630. package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
  631. package/dist/sync/cloudSyncApi.d.ts +329 -0
  632. package/dist/sync/cloudSyncApi.js +574 -1
  633. package/dist/sync/collaborationSyncPayload.d.ts +5 -1
  634. package/dist/sync/collaborationSyncPayload.js +213 -1
  635. package/dist/sync/collaborationSyncState.d.ts +23 -3
  636. package/dist/sync/collaborationSyncState.js +92 -3
  637. package/dist/sync/contentSyncPayload.d.ts +9 -0
  638. package/dist/sync/contentSyncPayload.js +29 -0
  639. package/dist/sync/contentSyncState.d.ts +79 -4
  640. package/dist/sync/contentSyncState.js +1113 -313
  641. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
  642. package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
  643. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
  644. package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
  645. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
  646. package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
  647. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
  648. package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
  649. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
  650. package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
  651. package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
  652. package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
  653. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
  654. package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
  655. package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
  656. package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
  657. package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
  658. package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
  659. package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
  660. package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
  661. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +216 -0
  662. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1436 -0
  663. package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
  664. package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
  665. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
  666. package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
  667. package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
  668. package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
  669. package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
  670. package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
  671. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
  672. package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
  673. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
  674. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
  675. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
  676. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
  677. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
  678. package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
  679. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
  680. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
  681. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
  682. package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
  683. package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
  684. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +740 -0
  685. package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
  686. package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
  687. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
  688. package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
  689. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
  690. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
  691. package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
  692. package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
  693. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
  694. package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
  695. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
  696. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
  697. package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
  698. package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
  699. package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
  700. package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
  701. package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
  702. package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
  703. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
  704. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
  705. package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
  706. package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
  707. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
  708. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
  709. package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
  710. package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
  711. package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
  712. package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
  713. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
  714. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
  715. package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
  716. package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
  717. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +109 -0
  718. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
  719. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
  720. package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
  721. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
  722. package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
  723. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
  724. package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
  725. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
  726. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +466 -0
  727. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
  728. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1147 -0
  729. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
  730. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
  731. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
  732. package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
  733. package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
  734. package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
  735. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
  736. package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
  737. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
  738. package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
  739. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
  740. package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
  741. package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
  742. package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
  743. package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
  744. package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
  745. package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
  746. package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
  747. package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
  748. package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
  749. package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
  750. package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
  751. package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
  752. package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
  753. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
  754. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +992 -0
  755. package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
  756. package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
  757. package/dist/sync/planningCanonicalFields.d.ts +41 -0
  758. package/dist/sync/planningCanonicalFields.js +211 -0
  759. package/dist/sync/planningSyncPayload.d.ts +5 -1
  760. package/dist/sync/planningSyncPayload.js +88 -4
  761. package/dist/sync/syncApplyHandlers.d.ts +100 -8
  762. package/dist/sync/syncApplyHandlers.js +845 -78
  763. package/dist/sync/syncResourceAdapters.d.ts +10 -0
  764. package/dist/sync/syncResourceAdapters.js +21 -1
  765. package/dist/sync/syncService.d.ts +57 -1
  766. package/dist/sync/syncService.js +1094 -138
  767. package/dist/sync/taskNestedContent.d.ts +2 -0
  768. package/dist/sync/taskNestedContent.js +8 -0
  769. package/dist/sync/taskSyncChangeKey.js +0 -1
  770. package/dist/sync/taskSyncPayload.d.ts +1 -1
  771. package/dist/sync/taskSyncPayload.js +20 -3
  772. package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
  773. package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
  774. package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
  775. package/dist/sync/v3/combinedFeedCapability.js +80 -0
  776. package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
  777. package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
  778. package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
  779. package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
  780. package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
  781. package/dist/sync/v3/durableOperationReplay.js +103 -0
  782. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +50 -0
  783. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +216 -0
  784. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
  785. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
  786. package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
  787. package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
  788. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
  789. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +333 -0
  790. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
  791. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
  792. package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
  793. package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
  794. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
  795. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
  796. package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
  797. package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
  798. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
  799. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
  800. package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
  801. package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
  802. package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
  803. package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
  804. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
  805. package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
  806. package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
  807. package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
  808. package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
  809. package/dist/sync/v3/initiativeCoexistence.js +148 -0
  810. package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
  811. package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
  812. package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
  813. package/dist/sync/v3/initiativeMutationPayload.js +144 -0
  814. package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
  815. package/dist/sync/v3/initiativeMutationService.js +206 -0
  816. package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
  817. package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
  818. package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
  819. package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
  820. package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
  821. package/dist/sync/v3/localInitiativeOutboxService.js +497 -0
  822. package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
  823. package/dist/sync/v3/localOperationIdentityStore.js +388 -0
  824. package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
  825. package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
  826. package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
  827. package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
  828. package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
  829. package/dist/sync/v3/localOutboxDispatcher.js +366 -0
  830. package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
  831. package/dist/sync/v3/localOutboxDrainClient.js +250 -0
  832. package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
  833. package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
  834. package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
  835. package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
  836. package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
  837. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
  838. package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
  839. package/dist/sync/v3/localSyncIdentityStore.js +43 -0
  840. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
  841. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +80 -0
  842. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +46 -0
  843. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +303 -0
  844. package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
  845. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
  846. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
  847. package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
  848. package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
  849. package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
  850. package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
  851. package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
  852. package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
  853. package/dist/sync/v3/localTaskCreateClient.js +209 -0
  854. package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
  855. package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
  856. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
  857. package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
  858. package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
  859. package/dist/sync/v3/localTaskDeleteClient.js +23 -0
  860. package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
  861. package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
  862. package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
  863. package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
  864. package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
  865. package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
  866. package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
  867. package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
  868. package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
  869. package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
  870. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
  871. package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
  872. package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
  873. package/dist/sync/v3/localTaskMetadataClient.js +30 -0
  874. package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
  875. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
  876. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
  877. package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
  878. package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
  879. package/dist/sync/v3/localTaskOperationClient.js +195 -0
  880. package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
  881. package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
  882. package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
  883. package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
  884. package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
  885. package/dist/sync/v3/localTaskRestoreClient.js +32 -0
  886. package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
  887. package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
  888. package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
  889. package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
  890. package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
  891. package/dist/sync/v3/localTaskStatusClient.js +35 -0
  892. package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
  893. package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
  894. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
  895. package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
  896. package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
  897. package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
  898. package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
  899. package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
  900. package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
  901. package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
  902. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
  903. package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
  904. package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
  905. package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
  906. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
  907. package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
  908. package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
  909. package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
  910. package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
  911. package/dist/sync/v3/localWorkstreamOutboxService.js +581 -0
  912. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
  913. package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
  914. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
  915. package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
  916. package/dist/sync/v3/planningActivation.d.ts +13 -0
  917. package/dist/sync/v3/planningActivation.js +33 -0
  918. package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
  919. package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
  920. package/dist/sync/v3/programScaffoldService.d.ts +143 -0
  921. package/dist/sync/v3/programScaffoldService.js +478 -0
  922. package/dist/sync/v3/syncDurabilityStore.d.ts +781 -0
  923. package/dist/sync/v3/syncDurabilityStore.js +4773 -0
  924. package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
  925. package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
  926. package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
  927. package/dist/sync/v3/taskActivityJournal.js +195 -0
  928. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
  929. package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
  930. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +112 -0
  931. package/dist/sync/v3/taskAttachmentLinksMutationService.js +218 -0
  932. package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
  933. package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
  934. package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
  935. package/dist/sync/v3/taskChecklistMutationService.js +156 -0
  936. package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
  937. package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
  938. package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
  939. package/dist/sync/v3/taskCommentMutationService.js +392 -0
  940. package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
  941. package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
  942. package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
  943. package/dist/sync/v3/taskCreateActivation.js +84 -0
  944. package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
  945. package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
  946. package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
  947. package/dist/sync/v3/taskCreateMutationService.js +283 -0
  948. package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
  949. package/dist/sync/v3/taskDeleteActivation.js +14 -0
  950. package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
  951. package/dist/sync/v3/taskDeleteMutationService.js +133 -0
  952. package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
  953. package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
  954. package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
  955. package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
  956. package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
  957. package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
  958. package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
  959. package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
  960. package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
  961. package/dist/sync/v3/taskMetadataActivation.js +38 -0
  962. package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
  963. package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
  964. package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
  965. package/dist/sync/v3/taskMetadataCoexistence.js +138 -0
  966. package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
  967. package/dist/sync/v3/taskMetadataMutationService.js +199 -0
  968. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
  969. package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
  970. package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
  971. package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
  972. package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
  973. package/dist/sync/v3/taskRestoreMutationService.js +179 -0
  974. package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
  975. package/dist/sync/v3/taskStatusActivation.js +15 -0
  976. package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
  977. package/dist/sync/v3/taskStatusMutationService.js +308 -0
  978. package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
  979. package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
  980. package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
  981. package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
  982. package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
  983. package/dist/sync/v3/taxonomyCoexistence.js +19 -0
  984. package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
  985. package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
  986. package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
  987. package/dist/sync/v3/taxonomyMutationService.js +106 -0
  988. package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
  989. package/dist/sync/v3/taxonomyStateMutation.js +49 -0
  990. package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
  991. package/dist/sync/v3/taxonomySyncPayload.js +199 -0
  992. package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
  993. package/dist/sync/v3/workflowAssignmentSync.js +213 -0
  994. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
  995. package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
  996. package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
  997. package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
  998. package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
  999. package/dist/sync/v3/workflowRuntimeSync.js +485 -0
  1000. package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
  1001. package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
  1002. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
  1003. package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
  1004. package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
  1005. package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
  1006. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
  1007. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +153 -0
  1008. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
  1009. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
  1010. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
  1011. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
  1012. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
  1013. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +357 -0
  1014. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
  1015. package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
  1016. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
  1017. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +541 -0
  1018. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
  1019. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1161 -0
  1020. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
  1021. package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
  1022. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +46 -0
  1023. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +621 -0
  1024. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +66 -0
  1025. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +527 -0
  1026. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
  1027. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +566 -0
  1028. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
  1029. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
  1030. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
  1031. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
  1032. package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
  1033. package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
  1034. package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
  1035. package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
  1036. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
  1037. package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
  1038. package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
  1039. package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
  1040. package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
  1041. package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
  1042. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
  1043. package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
  1044. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
  1045. package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
  1046. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
  1047. package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
  1048. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
  1049. package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
  1050. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
  1051. package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
  1052. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
  1053. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
  1054. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
  1055. package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
  1056. package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
  1057. package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
  1058. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
  1059. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
  1060. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
  1061. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
  1062. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
  1063. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
  1064. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
  1065. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
  1066. package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
  1067. package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
  1068. package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
  1069. package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
  1070. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +230 -0
  1071. package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
  1072. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
  1073. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
  1074. package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
  1075. package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
  1076. package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
  1077. package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
  1078. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
  1079. package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
  1080. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
  1081. package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
  1082. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
  1083. package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
  1084. package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
  1085. package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
  1086. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
  1087. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
  1088. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
  1089. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
  1090. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
  1091. package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
  1092. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
  1093. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
  1094. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
  1095. package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
  1096. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
  1097. package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
  1098. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
  1099. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
  1100. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
  1101. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
  1102. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
  1103. package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
  1104. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
  1105. package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
  1106. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
  1107. package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
  1108. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
  1109. package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
  1110. package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
  1111. package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
  1112. package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
  1113. package/dist/sync/v3/workstreamCoexistence.js +64 -0
  1114. package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
  1115. package/dist/sync/v3/workstreamMutationPayload.js +147 -0
  1116. package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
  1117. package/dist/sync/v3/workstreamMutationService.js +256 -0
  1118. package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
  1119. package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
  1120. package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
  1121. package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
  1122. package/dist/sync/workspaceContentManifest.d.ts +86 -0
  1123. package/dist/sync/workspaceContentManifest.js +123 -0
  1124. package/dist/sync/workspacePullFeed.d.ts +191 -2
  1125. package/dist/sync/workspacePullFeed.js +523 -135
  1126. package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
  1127. package/dist/sync/workspacePushPreparedPlan.js +1 -0
  1128. package/dist/sync/workspaceRepair.d.ts +17 -25
  1129. package/dist/sync/workspaceRepair.js +348 -25
  1130. package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
  1131. package/dist/sync/workspaceSyncContentDecryption.js +11 -0
  1132. package/dist/sync/workspaceSyncModel.d.ts +227 -5
  1133. package/dist/sync/workspaceSyncModel.js +398 -37
  1134. package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
  1135. package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
  1136. package/dist/sync/workspaceSyncState.d.ts +13 -0
  1137. package/dist/sync/workspaceSyncState.js +36 -0
  1138. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
  1139. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
  1140. package/dist/types.d.ts +31 -15
  1141. package/dist/types.js +1 -3
  1142. package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
  1143. package/dist/ui/ai-profile-clients/antigravity.png +0 -0
  1144. package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
  1145. package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
  1146. package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
  1147. package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
  1148. package/dist/ui/ai-profile-clients/cline.svg +16 -0
  1149. package/dist/ui/ai-profile-clients/codex.svg +1 -0
  1150. package/dist/ui/ai-profile-clients/copilot.png +0 -0
  1151. package/dist/ui/ai-profile-clients/cursor.svg +1 -0
  1152. package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
  1153. package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
  1154. package/dist/ui/ai-profile-clients/gemini.svg +10 -0
  1155. package/dist/ui/ai-profile-clients/grok.svg +31 -0
  1156. package/dist/ui/ai-profile-clients/kiro.svg +11 -0
  1157. package/dist/ui/ai-profile-clients/llama.svg +1 -0
  1158. package/dist/ui/ai-profile-clients/mistral.svg +1 -0
  1159. package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
  1160. package/dist/ui/ai-profile-clients/openclaw.png +0 -0
  1161. package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
  1162. package/dist/ui/ai-profile-clients/vscode.svg +41 -0
  1163. package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
  1164. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +1 -0
  1165. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +1 -0
  1166. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
  1167. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +3 -0
  1168. package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
  1169. package/dist/ui/assets/AssetTraySortControl-Kf1pelSy.js +1 -0
  1170. package/dist/ui/assets/ContextAttachmentManager-B8boOs6Q.js +3 -0
  1171. package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
  1172. package/dist/ui/assets/DocumentWorkspace-DXH4XUsB.js +261 -0
  1173. package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
  1174. package/dist/ui/assets/EntityActivityTimeline-BtSTq0ON.js +1 -0
  1175. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +1 -0
  1176. package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
  1177. package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
  1178. package/dist/ui/assets/PlansPage-ChqgxALc.js +1 -0
  1179. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +1 -0
  1180. package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
  1181. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +12 -0
  1182. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +21 -0
  1183. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
  1184. package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
  1185. package/dist/ui/assets/WorkflowManagerModule-DWFspC-o.js +1 -0
  1186. package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
  1187. package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
  1188. package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
  1189. package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
  1190. package/dist/ui/assets/index-BUplSsv_.js +7 -0
  1191. package/dist/ui/assets/index-gz2EXuoK.css +1 -0
  1192. package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
  1193. package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-BkFLXavV.js} +1 -1
  1194. package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
  1195. package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
  1196. package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
  1197. package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
  1198. package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
  1199. package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
  1200. package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
  1201. package/dist/ui/branding/logos/logo_light_bg.png +0 -0
  1202. package/dist/ui/images/Taskforce_Van.webp +0 -0
  1203. package/dist/ui/index.html +6 -6
  1204. package/dist/update/uiUpdateService.d.ts +43 -0
  1205. package/dist/update/uiUpdateService.js +149 -0
  1206. package/dist/update/updateCli.d.ts +15 -0
  1207. package/dist/update/updateCli.js +76 -0
  1208. package/dist/update/updateExecutor.d.ts +40 -0
  1209. package/dist/update/updateExecutor.js +474 -0
  1210. package/dist/update/updateStatus.d.ts +83 -0
  1211. package/dist/update/updateStatus.js +703 -0
  1212. package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
  1213. package/dist/utils/aiProfileAvatarPaths.js +52 -0
  1214. package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
  1215. package/dist/utils/aiProfileDefaultLogo.js +84 -0
  1216. package/dist/utils/aiProfileEvents.d.ts +9 -1
  1217. package/dist/utils/annotatedAttachments.d.ts +8 -0
  1218. package/dist/utils/annotatedAttachments.js +17 -1
  1219. package/dist/utils/assetTraySorting.d.ts +25 -0
  1220. package/dist/utils/assetTraySorting.js +83 -0
  1221. package/dist/utils/assignees.d.ts +5 -0
  1222. package/dist/utils/assignees.js +14 -9
  1223. package/dist/utils/authLogin.d.ts +10 -0
  1224. package/dist/utils/authLogin.js +8 -0
  1225. package/dist/utils/authSessionEvents.d.ts +2 -0
  1226. package/dist/utils/authSessionEvents.js +6 -0
  1227. package/dist/utils/avatarUpload.js +5 -5
  1228. package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
  1229. package/dist/utils/canonicalReferenceAttachments.js +42 -0
  1230. package/dist/utils/cloudAssetDisplay.d.ts +2 -0
  1231. package/dist/utils/cloudAssetDisplay.js +8 -0
  1232. package/dist/utils/constants.d.ts +4 -11
  1233. package/dist/utils/constants.js +6 -65
  1234. package/dist/utils/contextAttachmentPreview.d.ts +11 -0
  1235. package/dist/utils/contextAttachmentPreview.js +8 -0
  1236. package/dist/utils/contextAttachmentUpload.d.ts +10 -0
  1237. package/dist/utils/contextAttachmentUpload.js +151 -0
  1238. package/dist/utils/contextFiles.d.ts +1 -1
  1239. package/dist/utils/contextFiles.js +4 -4
  1240. package/dist/utils/documentNames.js +6 -4
  1241. package/dist/utils/entityReferences.d.ts +14 -0
  1242. package/dist/utils/entityReferences.js +21 -0
  1243. package/dist/utils/httpSetCookie.d.ts +3 -0
  1244. package/dist/utils/httpSetCookie.js +22 -0
  1245. package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
  1246. package/dist/utils/imageNoteStoragePaths.js +19 -0
  1247. package/dist/utils/imageReferences.d.ts +6 -0
  1248. package/dist/utils/imageReferences.js +1 -0
  1249. package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
  1250. package/dist/utils/planningArchiveOrchestrator.js +37 -0
  1251. package/dist/utils/planningArchivePresentation.d.ts +20 -0
  1252. package/dist/utils/planningArchivePresentation.js +23 -0
  1253. package/dist/utils/planningArchiveReadiness.d.ts +26 -0
  1254. package/dist/utils/planningArchiveReadiness.js +30 -0
  1255. package/dist/utils/planningFavorites.d.ts +7 -0
  1256. package/dist/utils/planningFavorites.js +34 -0
  1257. package/dist/utils/syncEventPresentation.js +53 -0
  1258. package/dist/utils/syncStatusPresentation.d.ts +25 -0
  1259. package/dist/utils/syncStatusPresentation.js +86 -5
  1260. package/dist/utils/taskActivity.d.ts +9 -2
  1261. package/dist/utils/taskActivity.js +61 -0
  1262. package/dist/utils/taskDraftDefaults.d.ts +0 -8
  1263. package/dist/utils/taskDraftDefaults.js +0 -4
  1264. package/dist/utils/taskEvents.d.ts +11 -0
  1265. package/dist/utils/taskEvents.js +6 -0
  1266. package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
  1267. package/dist/utils/taskHeaderQuickFilter.js +32 -0
  1268. package/dist/utils/taskInvalidation.d.ts +23 -0
  1269. package/dist/utils/taskInvalidation.js +67 -0
  1270. package/dist/utils/taskNormalization.d.ts +2 -1
  1271. package/dist/utils/taskNormalization.js +44 -18
  1272. package/dist/utils/taskReferences.d.ts +16 -0
  1273. package/dist/utils/taskReferences.js +63 -0
  1274. package/dist/utils/taskforceAgentEvents.d.ts +8 -0
  1275. package/dist/utils/taskforceAgentEvents.js +6 -0
  1276. package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
  1277. package/dist/utils/taskforceAgentSkillEvents.js +8 -0
  1278. package/dist/utils/uiNotice.d.ts +3 -0
  1279. package/dist/utils/uiNotice.js +1 -1
  1280. package/dist/utils/workspaceResourceEvents.d.ts +7 -0
  1281. package/dist/utils/workspaceResourceEvents.js +6 -0
  1282. package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
  1283. package/dist/utils/workspaceSyncPresentation.js +243 -6
  1284. package/package.json +74 -21
  1285. package/dist/components/features/AgentsModule.d.ts +0 -18
  1286. package/dist/components/features/AgentsModule.js +0 -479
  1287. package/dist/components/features/InitiativesModule.d.ts +0 -22
  1288. package/dist/components/features/InitiativesModule.js +0 -33
  1289. package/dist/components/features/WorkflowsModule.d.ts +0 -27
  1290. package/dist/components/features/WorkflowsModule.js +0 -21
  1291. package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
  1292. package/dist/components/features/settings/WorkflowEditor.js +0 -245
  1293. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
  1294. package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
  1295. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
  1296. package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
  1297. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
  1298. package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
  1299. package/dist/hooks/ui/useResourceExport.d.ts +0 -21
  1300. package/dist/hooks/ui/useResourceExport.js +0 -87
  1301. package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
  1302. package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
  1303. package/dist/mcp/clientProfileDefaults.d.ts +0 -12
  1304. package/dist/mcp/clientProfileDefaults.js +0 -41
  1305. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1306. package/dist/resources/templates/environments/aider.yaml +0 -14
  1307. package/dist/resources/templates/environments/antigravity.yaml +0 -10
  1308. package/dist/resources/templates/environments/claude.yaml +0 -10
  1309. package/dist/resources/templates/environments/cline.yaml +0 -10
  1310. package/dist/resources/templates/environments/codex.yaml +0 -13
  1311. package/dist/resources/templates/environments/copilot.yaml +0 -10
  1312. package/dist/resources/templates/environments/cursor.yaml +0 -9
  1313. package/dist/resources/templates/environments/gemini.yaml +0 -9
  1314. package/dist/resources/templates/environments/windsurf.yaml +0 -10
  1315. package/dist/resources/templates/workflow-sources/README.md +0 -9
  1316. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1317. package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1318. package/dist/resources/templates/workflows/collaborate.yaml +0 -109
  1319. package/dist/resources/templates/workflows/do.yaml +0 -87
  1320. package/dist/resources/templates/workflows/evaluate.yaml +0 -116
  1321. package/dist/resources/templates/workflows/execute.yaml +0 -156
  1322. package/dist/resources/templates/workflows/plan.yaml +0 -118
  1323. package/dist/resources/templates/workflows/review.yaml +0 -114
  1324. package/dist/services/formatTransformers.d.ts +0 -29
  1325. package/dist/services/formatTransformers.js +0 -56
  1326. package/dist/services/templateEngine.d.ts +0 -46
  1327. package/dist/services/templateEngine.js +0 -148
  1328. package/dist/shared/workflowDefaults.d.ts +0 -9
  1329. package/dist/shared/workflowDefaults.js +0 -11
  1330. package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
  1331. package/dist/ui/agent-logos/antigravity.jpeg +0 -0
  1332. package/dist/ui/agent-logos/chatgpt.png +0 -0
  1333. package/dist/ui/agent-logos/claude-code.jpeg +0 -0
  1334. package/dist/ui/agent-logos/codex.jpeg +0 -0
  1335. package/dist/ui/agent-logos/cursor.png +0 -0
  1336. package/dist/ui/agent-logos/openclaw.jpeg +0 -0
  1337. package/dist/ui/agent-logos/windsurf.png +0 -0
  1338. package/dist/ui/assets/AgentsModule-C4LcqhcZ.js +0 -1
  1339. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
  1340. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
  1341. package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
  1342. package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
  1343. package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
  1344. package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
  1345. package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
  1346. package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
  1347. package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
  1348. package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
  1349. package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
  1350. package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
  1351. package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
  1352. package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
  1353. package/dist/ui/assets/index--mh3pktj.js +0 -5
  1354. package/dist/ui/assets/index-BawaaEXS.css +0 -1
  1355. package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
  1356. package/dist/ui/branding/logos/logo_black_01.png +0 -0
  1357. package/dist/ui/branding/logos/logo_black_02.png +0 -0
  1358. package/dist/ui/branding/logos/logo_white_01.png +0 -0
  1359. package/dist/ui/branding/logos/logo_white_02.png +0 -0
  1360. package/scripts/generate-workflow-templates.mjs +0 -134
  1361. package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
  1362. package/src/resources/templates/environments/aider.yaml +0 -14
  1363. package/src/resources/templates/environments/antigravity.yaml +0 -10
  1364. package/src/resources/templates/environments/claude.yaml +0 -10
  1365. package/src/resources/templates/environments/cline.yaml +0 -10
  1366. package/src/resources/templates/environments/codex.yaml +0 -13
  1367. package/src/resources/templates/environments/copilot.yaml +0 -10
  1368. package/src/resources/templates/environments/cursor.yaml +0 -9
  1369. package/src/resources/templates/environments/gemini.yaml +0 -9
  1370. package/src/resources/templates/environments/windsurf.yaml +0 -10
  1371. package/src/resources/templates/workflow-sources/README.md +0 -9
  1372. package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
  1373. package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
  1374. package/src/resources/templates/workflows/collaborate.yaml +0 -109
  1375. package/src/resources/templates/workflows/do.yaml +0 -87
  1376. package/src/resources/templates/workflows/evaluate.yaml +0 -116
  1377. package/src/resources/templates/workflows/execute.yaml +0 -156
  1378. package/src/resources/templates/workflows/plan.yaml +0 -118
  1379. package/src/resources/templates/workflows/review.yaml +0 -114
  1380. /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
  1381. /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
  1382. /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
@@ -1,3 +1,5 @@
1
+ import { MIGRATION_COMPAT_ENABLED } from '../runtime/migrationFlags.js';
2
+ import { backfillLegacyTaskforceAgentDefinitions } from './taskforceAgentDefinitionMigration.js';
1
3
  function hasTable(db, tableName) {
2
4
  if (db.provider === 'postgres') {
3
5
  const row = db.prepare(`
@@ -28,11 +30,11 @@ export function ensureTenantSchema(db) {
28
30
  if (!hasCommentTenantColumn) {
29
31
  db.exec(`ALTER TABLE comments ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'default'`);
30
32
  }
31
- db.exec(`
33
+ db.transaction(() => db.exec(`
32
34
  CREATE INDEX IF NOT EXISTS idx_tasks_tenant ON tasks(tenant_id);
33
35
  CREATE INDEX IF NOT EXISTS idx_tasks_tenant_archived ON tasks(tenant_id, is_archived);
34
36
  CREATE INDEX IF NOT EXISTS idx_comments_tenant_task ON comments(tenant_id, task_id);
35
- `);
37
+ `))();
36
38
  }
37
39
  export function ensureScheduleTaskSchema(db) {
38
40
  const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
@@ -58,6 +60,16 @@ export function ensureScheduleTaskSchema(db) {
58
60
  CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date);
59
61
  `);
60
62
  }
63
+ export function ensureWorkstreamTaskOrderSchema(db) {
64
+ const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
65
+ if (!columns.some((column) => column.name === 'workstream_order')) {
66
+ db.exec(`ALTER TABLE tasks ADD COLUMN workstream_order INTEGER`);
67
+ }
68
+ db.exec(`
69
+ CREATE INDEX IF NOT EXISTS idx_tasks_workstream_order
70
+ ON tasks(tenant_id, workspace_id, workstream_id, workstream_order)
71
+ `);
72
+ }
61
73
  export function ensureAssigneeTaskSchema(db) {
62
74
  const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
63
75
  const hasAssigneeColumn = columns.some((c) => c.name === 'assignee');
@@ -67,6 +79,41 @@ export function ensureAssigneeTaskSchema(db) {
67
79
  }
68
80
  db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee)`);
69
81
  }
82
+ /** Permanently removes the retired task approach field from existing databases. */
83
+ export function ensureTaskApproachRemoved(db) {
84
+ const columnNames = db.provider === 'postgres'
85
+ ? new Set(db.prepare(`
86
+ SELECT column_name AS name
87
+ FROM information_schema.columns
88
+ WHERE table_name = 'tasks'
89
+ `).all().map((column) => column.name))
90
+ : new Set(db.prepare(`PRAGMA table_info(tasks)`).all().map((column) => column.name));
91
+ if (!columnNames.has('approach'))
92
+ return;
93
+ if (columnNames.has('taxonomies')) {
94
+ const rows = db.prepare(`SELECT id, taxonomies FROM tasks`).all();
95
+ const updateTaxonomies = db.prepare(`UPDATE tasks SET taxonomies = ? WHERE id = ?`);
96
+ for (const row of rows) {
97
+ if (!row.taxonomies)
98
+ continue;
99
+ try {
100
+ const taxonomies = JSON.parse(row.taxonomies);
101
+ if (!Object.prototype.hasOwnProperty.call(taxonomies, 'approach'))
102
+ continue;
103
+ delete taxonomies.approach;
104
+ updateTaxonomies.run(JSON.stringify(taxonomies), row.id);
105
+ }
106
+ catch {
107
+ // Preserve malformed legacy taxonomy payloads for separate data repair.
108
+ }
109
+ }
110
+ }
111
+ if (db.provider === 'postgres') {
112
+ db.exec(`ALTER TABLE tasks DROP COLUMN IF EXISTS approach`);
113
+ return;
114
+ }
115
+ db.exec(`ALTER TABLE tasks DROP COLUMN approach`);
116
+ }
70
117
  export function ensureTaskReferenceSchema(db) {
71
118
  const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
72
119
  const hasReferenceNumberColumn = columns.some((c) => c.name === 'reference_number');
@@ -156,6 +203,240 @@ export function ensureTaskReferenceSchema(db) {
156
203
  ON tasks(tenant_id, workspace_id, local_reference_number);
157
204
  `);
158
205
  }
206
+ const PLANNING_REFERENCE_DOMAINS = [
207
+ {
208
+ domain: 'initiative',
209
+ tableName: 'initiatives',
210
+ sequenceTableName: 'workspace_initiative_reference_sequences',
211
+ uniqueIndexName: 'idx_initiatives_workspace_reference',
212
+ },
213
+ {
214
+ domain: 'workstream',
215
+ tableName: 'workstreams',
216
+ sequenceTableName: 'workspace_workstream_reference_sequences',
217
+ uniqueIndexName: 'idx_workstreams_workspace_reference',
218
+ },
219
+ ];
220
+ /**
221
+ * Establishes one canonical planning reference per workspace before adding the
222
+ * database uniqueness constraint used by both ordinary and durable writes.
223
+ */
224
+ export function ensurePlanningReferenceSchema(db) {
225
+ const repair = db.transaction(() => {
226
+ const hasDurableOutbox = db.provider === 'postgres'
227
+ ? Boolean(db.prepare(`SELECT to_regclass('workspace_sync_outbox') AS name`).get()?.name)
228
+ : Boolean(db.prepare(`
229
+ SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'workspace_sync_outbox'
230
+ `).get()?.name);
231
+ for (const domain of PLANNING_REFERENCE_DOMAINS) {
232
+ const workspaceRows = db.prepare(`
233
+ SELECT DISTINCT
234
+ COALESCE(tenant_id, 'default') AS tenant_id,
235
+ COALESCE(workspace_id, 'default') AS workspace_id
236
+ FROM ${domain.tableName}
237
+ ORDER BY tenant_id ASC, workspace_id ASC
238
+ `).all();
239
+ const selectEntities = db.prepare(`
240
+ SELECT id, reference_number
241
+ FROM ${domain.tableName}
242
+ WHERE tenant_id = ? AND workspace_id = ?
243
+ ORDER BY created_at ASC, id ASC
244
+ `);
245
+ const updateReference = db.prepare(`
246
+ UPDATE ${domain.tableName}
247
+ SET reference_number = ?
248
+ WHERE tenant_id = ? AND workspace_id = ? AND id = ?
249
+ `);
250
+ const upsertSequence = db.prepare(`
251
+ INSERT INTO ${domain.sequenceTableName} (tenant_id, workspace_id, next_reference_number)
252
+ VALUES (?, ?, ?)
253
+ ON CONFLICT (tenant_id, workspace_id) DO UPDATE SET
254
+ next_reference_number = CASE
255
+ WHEN ${domain.sequenceTableName}.next_reference_number < EXCLUDED.next_reference_number
256
+ THEN EXCLUDED.next_reference_number
257
+ ELSE ${domain.sequenceTableName}.next_reference_number
258
+ END
259
+ `);
260
+ for (const workspaceRow of workspaceRows) {
261
+ const tenantId = String(workspaceRow.tenant_id || 'default').trim() || 'default';
262
+ const workspaceId = String(workspaceRow.workspace_id || 'default').trim() || 'default';
263
+ const entities = selectEntities.all(tenantId, workspaceId);
264
+ let provisionalIds = new Set();
265
+ if (hasDurableOutbox) {
266
+ const rows = db.prepare(`
267
+ SELECT entity_id
268
+ FROM workspace_sync_outbox
269
+ WHERE tenant_id = ? AND workspace_id = ?
270
+ AND domain = ? AND mutation_kind = 'create'
271
+ AND status IN ('pending', 'in_flight', 'blocked')
272
+ `).all(tenantId, workspaceId, domain.domain);
273
+ provisionalIds = new Set(rows.map((row) => String(row.entity_id || '').trim()).filter(Boolean));
274
+ }
275
+ const seen = new Set();
276
+ let maxReferenceNumber = 0;
277
+ const needsReference = [];
278
+ for (const entity of entities) {
279
+ const id = String(entity.id || '').trim();
280
+ if (!id)
281
+ continue;
282
+ if (provisionalIds.has(id)) {
283
+ if (entity.reference_number != null) {
284
+ updateReference.run(null, tenantId, workspaceId, id);
285
+ }
286
+ continue;
287
+ }
288
+ const numericReference = Number(entity.reference_number);
289
+ const referenceNumber = Number.isInteger(numericReference) && numericReference > 0
290
+ ? numericReference
291
+ : null;
292
+ if (referenceNumber && !seen.has(referenceNumber)) {
293
+ seen.add(referenceNumber);
294
+ maxReferenceNumber = Math.max(maxReferenceNumber, referenceNumber);
295
+ }
296
+ else {
297
+ needsReference.push(id);
298
+ }
299
+ }
300
+ for (const id of needsReference) {
301
+ maxReferenceNumber += 1;
302
+ updateReference.run(maxReferenceNumber, tenantId, workspaceId, id);
303
+ }
304
+ upsertSequence.run(tenantId, workspaceId, maxReferenceNumber);
305
+ }
306
+ db.exec(`
307
+ CREATE UNIQUE INDEX IF NOT EXISTS ${domain.uniqueIndexName}
308
+ ON ${domain.tableName}(tenant_id, workspace_id, reference_number)
309
+ `);
310
+ }
311
+ });
312
+ repair();
313
+ }
314
+ const CANONICAL_DOCUMENT_CONTENT_PATH = /^\/api\/taskforce\/documents\/([^/?#]+)\/content$/;
315
+ function inferPlanningAttachmentAssetId(pathValue) {
316
+ if (typeof pathValue !== 'string')
317
+ return null;
318
+ const encodedAssetId = pathValue.trim().match(CANONICAL_DOCUMENT_CONTENT_PATH)?.[1];
319
+ if (!encodedAssetId)
320
+ return null;
321
+ try {
322
+ const assetId = decodeURIComponent(encodedAssetId);
323
+ return assetId && assetId === assetId.trim() ? assetId : null;
324
+ }
325
+ catch {
326
+ return null;
327
+ }
328
+ }
329
+ /**
330
+ * Repairs the physical planning JSON representation after legacy v2 writers
331
+ * omitted assetId even though the exact document content path and canonical
332
+ * workspace asset link already identified the attachment. This is an
333
+ * idempotent invariant repair rather than a journaled product mutation: the
334
+ * normalized planning model already exposed the same canonical identity.
335
+ */
336
+ export function backfillPlanningAttachmentAssetIdentities(db, tenantId = 'default') {
337
+ const normalizedTenantId = String(tenantId || '').trim() || 'default';
338
+ const result = {
339
+ scannedAttachments: 0,
340
+ backfilledAttachments: 0,
341
+ updatedRows: 0,
342
+ };
343
+ const hasRequiredTables = ['initiatives', 'workstreams', 'workspace_assets', 'workspace_asset_links', 'system_settings']
344
+ .every((tableName) => hasTable(db, tableName));
345
+ if (!hasRequiredTables)
346
+ return result;
347
+ const verifyIdentity = db.prepare(`
348
+ SELECT 1 AS found
349
+ FROM workspace_assets a
350
+ INNER JOIN workspace_asset_links l
351
+ ON l.tenant_id = a.tenant_id
352
+ AND l.workspace_id = a.workspace_id
353
+ AND l.asset_id = a.asset_id
354
+ WHERE a.tenant_id = ? AND a.workspace_id = ? AND a.asset_id = ?
355
+ AND a.kind = 'document' AND a.deleted_at IS NULL
356
+ AND l.target_type = ? AND l.task_id = ? AND l.deleted_at IS NULL
357
+ LIMIT 1
358
+ `);
359
+ const upsertMigrationState = db.prepare(`
360
+ INSERT INTO system_settings (tenant_id, settings_key, payload, updated_at)
361
+ VALUES (?, 'migration.planning_attachment_asset_identity.v1', ?, ?)
362
+ ON CONFLICT (tenant_id, settings_key) DO UPDATE SET
363
+ payload = EXCLUDED.payload,
364
+ updated_at = EXCLUDED.updated_at
365
+ `);
366
+ const existingMigrationState = db.prepare(`
367
+ SELECT 1 AS found
368
+ FROM system_settings
369
+ WHERE tenant_id = ? AND settings_key = 'migration.planning_attachment_asset_identity.v1'
370
+ LIMIT 1
371
+ `).get(normalizedTenantId);
372
+ const repair = db.transaction(() => {
373
+ for (const domain of PLANNING_REFERENCE_DOMAINS) {
374
+ const rows = db.prepare(`
375
+ SELECT id, workspace_id, attachments_json
376
+ FROM ${domain.tableName}
377
+ WHERE tenant_id = ? AND attachments_json IS NOT NULL
378
+ ORDER BY workspace_id ASC, id ASC
379
+ `).all(normalizedTenantId);
380
+ const updateRow = db.prepare(`
381
+ UPDATE ${domain.tableName}
382
+ SET attachments_json = ?
383
+ WHERE tenant_id = ? AND workspace_id = ? AND id = ? AND attachments_json = ?
384
+ `);
385
+ for (const row of rows) {
386
+ const entityId = String(row.id || '').trim();
387
+ const workspaceId = String(row.workspace_id || '').trim();
388
+ if (!entityId || !workspaceId)
389
+ continue;
390
+ const sourceAttachmentsJson = String(row.attachments_json || '[]');
391
+ let attachments;
392
+ try {
393
+ attachments = JSON.parse(sourceAttachmentsJson);
394
+ }
395
+ catch {
396
+ continue;
397
+ }
398
+ if (!Array.isArray(attachments))
399
+ continue;
400
+ let changed = false;
401
+ const repaired = attachments.map((attachment) => {
402
+ if (!attachment || typeof attachment !== 'object' || Array.isArray(attachment))
403
+ return attachment;
404
+ result.scannedAttachments += 1;
405
+ const record = attachment;
406
+ if (typeof record.assetId === 'string' && record.assetId.trim())
407
+ return attachment;
408
+ const assetId = inferPlanningAttachmentAssetId(record.path);
409
+ if (!assetId)
410
+ return attachment;
411
+ const canonicalIdentity = verifyIdentity.get(normalizedTenantId, workspaceId, assetId, domain.domain, entityId);
412
+ if (!canonicalIdentity?.found) {
413
+ throw new Error(`Cannot backfill ${domain.domain} attachment ${entityId}: canonical asset/link identity is missing for ${assetId}.`);
414
+ }
415
+ changed = true;
416
+ result.backfilledAttachments += 1;
417
+ return { ...record, assetId };
418
+ });
419
+ if (!changed)
420
+ continue;
421
+ const updateResult = updateRow.run(JSON.stringify(repaired), normalizedTenantId, workspaceId, entityId, sourceAttachmentsJson);
422
+ if (Number(updateResult?.changes || 0) !== 1) {
423
+ throw new Error(`Cannot backfill ${domain.domain} attachment ${entityId}: attachments changed during migration.`);
424
+ }
425
+ result.updatedRows += 1;
426
+ }
427
+ }
428
+ if (result.backfilledAttachments > 0 || !existingMigrationState?.found) {
429
+ const now = new Date().toISOString();
430
+ upsertMigrationState.run(normalizedTenantId, JSON.stringify({
431
+ completedAt: now,
432
+ backfilledAttachments: result.backfilledAttachments,
433
+ updatedRows: result.updatedRows,
434
+ }), now);
435
+ }
436
+ });
437
+ repair();
438
+ return result;
439
+ }
159
440
  export function ensureWorkspaceSchema(db) {
160
441
  db.exec(`
161
442
  CREATE TABLE IF NOT EXISTS workspaces (
@@ -877,6 +1158,24 @@ export function ensureWorkspaceAssetsSchema(db) {
877
1158
  ON workspace_asset_links(tenant_id, workspace_id, task_id, deleted_at, updated_at);
878
1159
  CREATE INDEX IF NOT EXISTS idx_workspace_asset_links_asset
879
1160
  ON workspace_asset_links(tenant_id, workspace_id, asset_id, deleted_at, updated_at);
1161
+ CREATE INDEX IF NOT EXISTS idx_workspace_asset_links_workspace_updated
1162
+ ON workspace_asset_links(tenant_id, workspace_id, updated_at, asset_id);
1163
+
1164
+ CREATE TABLE IF NOT EXISTS workspace_asset_upload_drafts (
1165
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1166
+ workspace_id TEXT NOT NULL,
1167
+ draft_id TEXT NOT NULL,
1168
+ asset_id TEXT NOT NULL,
1169
+ storage_key TEXT NOT NULL,
1170
+ purpose TEXT NOT NULL,
1171
+ created_by_user_id TEXT NOT NULL,
1172
+ created_at TEXT NOT NULL,
1173
+ retired_at TEXT,
1174
+ PRIMARY KEY (tenant_id, workspace_id, draft_id, asset_id)
1175
+ );
1176
+
1177
+ CREATE INDEX IF NOT EXISTS idx_workspace_asset_upload_drafts_expiry
1178
+ ON workspace_asset_upload_drafts(tenant_id, workspace_id, retired_at, created_at);
880
1179
  `);
881
1180
  const linkColumns = db.prepare(`PRAGMA table_info(workspace_asset_links)`).all();
882
1181
  const hasDisplayNameColumn = linkColumns.some((c) => c.name === 'display_name');
@@ -991,97 +1290,1617 @@ export function ensureSyncEventsSchema(db) {
991
1290
  error_message TEXT,
992
1291
  change_count INTEGER,
993
1292
  request_ms INTEGER,
1293
+ details_json TEXT,
994
1294
  occurred_at TEXT NOT NULL
995
1295
  );
996
1296
  CREATE INDEX IF NOT EXISTS idx_sync_events_workspace_occurred
997
1297
  ON sync_events(tenant_id, workspace_id, occurred_at);
998
1298
  `);
1299
+ try {
1300
+ db.prepare(`SELECT details_json FROM sync_events LIMIT 1`).get();
1301
+ }
1302
+ catch {
1303
+ db.exec(`ALTER TABLE sync_events ADD COLUMN details_json TEXT`);
1304
+ }
999
1305
  }
1000
- export function ensureWorkspaceDocumentsSchema(db) {
1001
- db.exec(`
1002
- CREATE TABLE IF NOT EXISTS workspace_documents (
1306
+ /**
1307
+ * Creates the durable storage contract for the next workspace sync protocol.
1308
+ *
1309
+ * This migration intentionally does not route mutations through the journal or
1310
+ * outbox. Keeping schema installation behavior-neutral lets both runtimes ship
1311
+ * and verify the persistence contract before any sync path depends on it.
1312
+ */
1313
+ export function buildWorkspaceSyncDurabilitySchemaSql(provider) {
1314
+ const revisionType = provider === 'postgres' ? 'BIGINT' : 'INTEGER';
1315
+ return `
1316
+ CREATE TABLE IF NOT EXISTS workspace_sync_installation (
1317
+ installation_key TEXT PRIMARY KEY,
1318
+ client_id TEXT NOT NULL UNIQUE,
1319
+ created_at TEXT NOT NULL,
1320
+ updated_at TEXT NOT NULL
1321
+ );
1322
+
1323
+ CREATE TABLE IF NOT EXISTS workspace_sync_sequences (
1003
1324
  tenant_id TEXT NOT NULL DEFAULT 'default',
1004
1325
  workspace_id TEXT NOT NULL DEFAULT 'default',
1005
- path TEXT NOT NULL,
1006
- content_hash TEXT NOT NULL,
1326
+ last_sequence ${revisionType} NOT NULL DEFAULT 0,
1007
1327
  updated_at TEXT NOT NULL,
1008
- PRIMARY KEY (tenant_id, workspace_id, path)
1328
+ PRIMARY KEY (tenant_id, workspace_id)
1009
1329
  );
1010
- CREATE INDEX IF NOT EXISTS idx_workspace_documents_workspace_path
1011
- ON workspace_documents(tenant_id, workspace_id, path);
1012
- `);
1013
- }
1014
- export function ensureAnnotatedAttachmentSessionsSchema(db) {
1015
- db.exec(`
1016
- CREATE TABLE IF NOT EXISTS annotated_attachment_sessions (
1017
- id TEXT PRIMARY KEY,
1330
+
1331
+ CREATE TABLE IF NOT EXISTS workspace_sync_outbox_sequences (
1332
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1333
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1334
+ last_sequence ${revisionType} NOT NULL DEFAULT 0,
1335
+ updated_at TEXT NOT NULL,
1336
+ PRIMARY KEY (tenant_id, workspace_id)
1337
+ );
1338
+
1339
+ CREATE TABLE IF NOT EXISTS workspace_sync_domain_locks (
1340
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1341
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1342
+ domain TEXT NOT NULL,
1343
+ updated_at TEXT NOT NULL,
1344
+ PRIMARY KEY (tenant_id, workspace_id, domain)
1345
+ );
1346
+
1347
+ CREATE TABLE IF NOT EXISTS workspace_sync_task_create_guards (
1018
1348
  tenant_id TEXT NOT NULL DEFAULT 'default',
1019
1349
  workspace_id TEXT NOT NULL DEFAULT 'default',
1020
1350
  task_id TEXT NOT NULL,
1021
- base_image_asset_id TEXT NOT NULL,
1022
- title TEXT,
1023
- global_instruction TEXT,
1024
- annotations_json TEXT NOT NULL DEFAULT '[]',
1025
- created_by_actor_id TEXT,
1026
- updated_by_actor_id TEXT,
1027
1351
  created_at TEXT NOT NULL,
1352
+ PRIMARY KEY (tenant_id, workspace_id, task_id)
1353
+ );
1354
+
1355
+ CREATE TABLE IF NOT EXISTS workspace_sync_entity_revisions (
1356
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1357
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1358
+ domain TEXT NOT NULL,
1359
+ entity_id TEXT NOT NULL,
1360
+ contract_version INTEGER NOT NULL DEFAULT 3,
1361
+ entity_revision ${revisionType} NOT NULL DEFAULT 0,
1362
+ lifecycle_revision ${revisionType} NOT NULL DEFAULT 0,
1363
+ coexistence_owned INTEGER NOT NULL DEFAULT 1,
1364
+ metadata_owned INTEGER NOT NULL DEFAULT 0,
1365
+ reopen_assignee_owned INTEGER NOT NULL DEFAULT 0,
1366
+ last_sequence ${revisionType} NOT NULL,
1367
+ canonical_fingerprint TEXT NOT NULL,
1028
1368
  updated_at TEXT NOT NULL,
1029
- deleted_at TEXT
1369
+ PRIMARY KEY (tenant_id, workspace_id, domain, entity_id)
1030
1370
  );
1031
1371
 
1032
- CREATE INDEX IF NOT EXISTS idx_annotated_attachment_sessions_task
1033
- ON annotated_attachment_sessions(tenant_id, workspace_id, task_id, deleted_at, updated_at);
1034
- CREATE INDEX IF NOT EXISTS idx_annotated_attachment_sessions_image
1035
- ON annotated_attachment_sessions(tenant_id, workspace_id, base_image_asset_id, deleted_at, updated_at);
1036
- `);
1037
- }
1038
- export function ensureDocumentReviewSessionsSchema(db) {
1039
- db.exec(`
1040
- CREATE TABLE IF NOT EXISTS document_review_sessions (
1041
- id TEXT PRIMARY KEY,
1372
+ CREATE TABLE IF NOT EXISTS workspace_sync_journal (
1042
1373
  tenant_id TEXT NOT NULL DEFAULT 'default',
1043
1374
  workspace_id TEXT NOT NULL DEFAULT 'default',
1044
- asset_id TEXT NOT NULL,
1045
- document_id TEXT,
1046
- document_version INTEGER,
1047
- title TEXT,
1048
- status TEXT NOT NULL DEFAULT 'open',
1049
- comments_json TEXT NOT NULL DEFAULT '[]',
1050
- created_by_actor_id TEXT,
1051
- updated_by_actor_id TEXT,
1375
+ sequence ${revisionType} NOT NULL,
1376
+ contract_version INTEGER NOT NULL DEFAULT 3,
1377
+ operation_id TEXT NOT NULL,
1378
+ client_id TEXT NOT NULL,
1379
+ domain TEXT NOT NULL,
1380
+ entity_id TEXT NOT NULL,
1381
+ mutation_kind TEXT NOT NULL,
1382
+ entity_revision ${revisionType} NOT NULL,
1383
+ lifecycle_revision ${revisionType} NOT NULL,
1384
+ content_sha256 TEXT,
1385
+ size_bytes ${revisionType},
1386
+ payload_json TEXT NOT NULL,
1387
+ occurred_at TEXT NOT NULL,
1388
+ PRIMARY KEY (tenant_id, workspace_id, sequence)
1389
+ );
1390
+
1391
+ CREATE TABLE IF NOT EXISTS workspace_sync_operation_results (
1392
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1393
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1394
+ client_id TEXT NOT NULL,
1395
+ operation_id TEXT NOT NULL,
1396
+ contract_version INTEGER NOT NULL DEFAULT 3,
1397
+ request_fingerprint TEXT NOT NULL,
1398
+ status TEXT NOT NULL DEFAULT 'processing',
1399
+ response_json TEXT,
1400
+ accepted_sequence ${revisionType},
1401
+ lease_owner TEXT,
1402
+ lease_expires_at TEXT,
1052
1403
  created_at TEXT NOT NULL,
1053
1404
  updated_at TEXT NOT NULL,
1054
- deleted_at TEXT
1405
+ expires_at TEXT,
1406
+ PRIMARY KEY (tenant_id, workspace_id, client_id, operation_id)
1055
1407
  );
1056
1408
 
1057
- CREATE INDEX IF NOT EXISTS idx_document_review_sessions_asset
1058
- ON document_review_sessions(tenant_id, workspace_id, asset_id, deleted_at, updated_at);
1059
- CREATE INDEX IF NOT EXISTS idx_document_review_sessions_workspace
1060
- ON document_review_sessions(tenant_id, workspace_id, updated_at, id);
1409
+ CREATE TABLE IF NOT EXISTS workspace_sync_outbox (
1410
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1411
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1412
+ operation_id TEXT NOT NULL,
1413
+ contract_version INTEGER NOT NULL DEFAULT 3,
1414
+ client_id TEXT NOT NULL,
1415
+ dispatch_class TEXT NOT NULL DEFAULT 'ordinary',
1416
+ domain TEXT NOT NULL,
1417
+ entity_id TEXT NOT NULL,
1418
+ mutation_kind TEXT NOT NULL,
1419
+ owns_task_metadata INTEGER NOT NULL DEFAULT 0,
1420
+ owns_task_lifecycle INTEGER NOT NULL DEFAULT 0,
1421
+ owns_task_assignee INTEGER NOT NULL DEFAULT 0,
1422
+ base_entity_revision ${revisionType} NOT NULL DEFAULT 0,
1423
+ base_lifecycle_revision ${revisionType} NOT NULL DEFAULT 0,
1424
+ payload_json TEXT NOT NULL,
1425
+ payload_fingerprint TEXT NOT NULL,
1426
+ status TEXT NOT NULL DEFAULT 'pending',
1427
+ attempt_count INTEGER NOT NULL DEFAULT 0,
1428
+ initial_not_found_attempt_count INTEGER NOT NULL DEFAULT 0,
1429
+ enqueue_sequence ${revisionType} NOT NULL DEFAULT 0,
1430
+ rebase_before_first_attempt INTEGER NOT NULL DEFAULT 0,
1431
+ origin_assertion_recovery_count INTEGER NOT NULL DEFAULT 0,
1432
+ accepted_replay_recovery_count INTEGER NOT NULL DEFAULT 0,
1433
+ task_attachment_reference_metadata_recovery_count INTEGER NOT NULL DEFAULT 0,
1434
+ task_status_revision_rebase_count INTEGER NOT NULL DEFAULT 0,
1435
+ task_status_workflow_ack_recovery_count INTEGER NOT NULL DEFAULT 0,
1436
+ workstream_metadata_revision_rebase_count INTEGER NOT NULL DEFAULT 0,
1437
+ initiative_metadata_revision_rebase_count INTEGER NOT NULL DEFAULT 0,
1438
+ next_attempt_at TEXT NOT NULL,
1439
+ lease_owner TEXT,
1440
+ lease_expires_at TEXT,
1441
+ authoritative_response_json TEXT,
1442
+ accepted_sequence ${revisionType},
1443
+ last_error_code TEXT,
1444
+ last_error_message TEXT,
1445
+ recovery_batch_id TEXT,
1446
+ replay_of_client_id TEXT,
1447
+ replay_of_operation_id TEXT,
1448
+ superseded_at TEXT,
1449
+ created_at TEXT NOT NULL,
1450
+ updated_at TEXT NOT NULL,
1451
+ PRIMARY KEY (tenant_id, workspace_id, client_id, operation_id)
1452
+ );
1061
1453
 
1062
- CREATE TABLE IF NOT EXISTS document_review_comments (
1063
- id TEXT PRIMARY KEY,
1064
- session_id TEXT NOT NULL,
1454
+ CREATE TABLE IF NOT EXISTS workspace_sync_outbox_recoveries (
1065
1455
  tenant_id TEXT NOT NULL DEFAULT 'default',
1066
1456
  workspace_id TEXT NOT NULL DEFAULT 'default',
1067
- body TEXT NOT NULL,
1068
- anchor_json TEXT,
1069
- author_actor_id TEXT,
1070
- order_index INTEGER NOT NULL DEFAULT 0,
1457
+ recovery_batch_id TEXT NOT NULL,
1458
+ root_client_id TEXT NOT NULL,
1459
+ root_operation_id TEXT NOT NULL,
1460
+ state TEXT NOT NULL,
1461
+ baseline_marker TEXT,
1462
+ baseline_applied_at TEXT,
1463
+ replay_queued_at TEXT,
1464
+ completed_at TEXT,
1071
1465
  created_at TEXT NOT NULL,
1072
1466
  updated_at TEXT NOT NULL,
1073
- deleted_at TEXT
1467
+ PRIMARY KEY (tenant_id, workspace_id, recovery_batch_id)
1074
1468
  );
1075
1469
 
1076
- CREATE INDEX IF NOT EXISTS idx_document_review_comments_session
1077
- ON document_review_comments(tenant_id, workspace_id, session_id, deleted_at, order_index, created_at, id);
1078
- CREATE INDEX IF NOT EXISTS idx_document_review_comments_workspace
1079
- ON document_review_comments(tenant_id, workspace_id, updated_at, id);
1470
+ CREATE TABLE IF NOT EXISTS workspace_sync_outbox_targets (
1471
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1472
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1473
+ client_id TEXT NOT NULL,
1474
+ operation_id TEXT NOT NULL,
1475
+ domain TEXT NOT NULL,
1476
+ entity_id TEXT NOT NULL,
1477
+ mutation_kind TEXT NOT NULL,
1478
+ base_entity_revision ${revisionType} NOT NULL DEFAULT 0,
1479
+ base_lifecycle_revision ${revisionType} NOT NULL DEFAULT 0,
1480
+ owns_task_metadata INTEGER NOT NULL DEFAULT 0,
1481
+ owns_task_lifecycle INTEGER NOT NULL DEFAULT 0,
1482
+ owns_task_assignee INTEGER NOT NULL DEFAULT 0,
1483
+ created_at TEXT NOT NULL,
1484
+ PRIMARY KEY (tenant_id, workspace_id, client_id, operation_id, domain, entity_id)
1485
+ );
1486
+
1487
+ CREATE TABLE IF NOT EXISTS workspace_sync_task_taxonomy_ownership (
1488
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1489
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1490
+ task_id TEXT NOT NULL,
1491
+ created_at TEXT NOT NULL,
1492
+ PRIMARY KEY (tenant_id, workspace_id, task_id)
1493
+ );
1494
+
1495
+ CREATE TABLE IF NOT EXISTS workspace_sync_projection_state (
1496
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1497
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1498
+ projection_id TEXT NOT NULL,
1499
+ contract_version INTEGER NOT NULL DEFAULT 3,
1500
+ owner_mode TEXT NOT NULL DEFAULT 'v2',
1501
+ epoch ${revisionType} NOT NULL DEFAULT 0,
1502
+ coverage_profile_id TEXT,
1503
+ coverage_version INTEGER,
1504
+ coverage_digest TEXT,
1505
+ opaque_cursor TEXT,
1506
+ cycle_high_watermark ${revisionType},
1507
+ last_scanned_sequence ${revisionType},
1508
+ repair_snapshot_id TEXT,
1509
+ repair_expires_at TEXT,
1510
+ repair_snapshot_sequence ${revisionType},
1511
+ repair_epoch ${revisionType},
1512
+ repair_resume_cursor TEXT,
1513
+ repair_cursor TEXT,
1514
+ applied_snapshot_id TEXT,
1515
+ applied_page_digest TEXT,
1516
+ updated_at TEXT NOT NULL,
1517
+ PRIMARY KEY (tenant_id, workspace_id, projection_id)
1518
+ );
1519
+
1520
+ CREATE TABLE IF NOT EXISTS workspace_sync_projection_repair_entries (
1521
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1522
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1523
+ projection_id TEXT NOT NULL,
1524
+ epoch ${revisionType} NOT NULL,
1525
+ entity_id TEXT NOT NULL,
1526
+ sequence ${revisionType} NOT NULL,
1527
+ mutation_kind TEXT NOT NULL,
1528
+ entity_revision ${revisionType} NOT NULL,
1529
+ lifecycle_revision ${revisionType} NOT NULL,
1530
+ payload_fingerprint TEXT NOT NULL,
1531
+ payload_json TEXT NOT NULL,
1532
+ occurred_at TEXT NOT NULL,
1533
+ PRIMARY KEY (tenant_id, workspace_id, projection_id, epoch, entity_id)
1534
+ );
1535
+
1536
+ CREATE TABLE IF NOT EXISTS workspace_sync_coverage_repair_entries (
1537
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1538
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1539
+ coverage_id TEXT NOT NULL,
1540
+ epoch ${revisionType} NOT NULL,
1541
+ entry_index INTEGER NOT NULL,
1542
+ projection_id TEXT NOT NULL,
1543
+ domain TEXT NOT NULL,
1544
+ entity_id TEXT NOT NULL,
1545
+ sequence ${revisionType} NOT NULL,
1546
+ mutation_kind TEXT NOT NULL,
1547
+ entity_revision ${revisionType} NOT NULL,
1548
+ lifecycle_revision ${revisionType} NOT NULL,
1549
+ canonical_fingerprint TEXT,
1550
+ payload_fingerprint TEXT NOT NULL,
1551
+ payload_json TEXT NOT NULL,
1552
+ occurred_at TEXT NOT NULL,
1553
+ PRIMARY KEY (tenant_id, workspace_id, coverage_id, epoch, entry_index)
1554
+ );
1555
+
1556
+ CREATE TABLE IF NOT EXISTS workspace_sync_repair_snapshots (
1557
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1558
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1559
+ snapshot_id TEXT NOT NULL,
1560
+ contract_version INTEGER NOT NULL DEFAULT 3,
1561
+ coverage_profile_id TEXT NOT NULL,
1562
+ coverage_version INTEGER NOT NULL,
1563
+ coverage_digest TEXT NOT NULL,
1564
+ snapshot_sequence ${revisionType} NOT NULL,
1565
+ entry_count INTEGER NOT NULL,
1566
+ created_at TEXT NOT NULL,
1567
+ expires_at TEXT NOT NULL,
1568
+ PRIMARY KEY (tenant_id, workspace_id, snapshot_id)
1569
+ );
1570
+
1571
+ CREATE TABLE IF NOT EXISTS workspace_sync_repair_snapshot_entries (
1572
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1573
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1574
+ snapshot_id TEXT NOT NULL,
1575
+ entry_index INTEGER NOT NULL,
1576
+ projection_id TEXT NOT NULL,
1577
+ domain TEXT NOT NULL,
1578
+ entity_id TEXT NOT NULL,
1579
+ sequence ${revisionType} NOT NULL,
1580
+ mutation_kind TEXT NOT NULL,
1581
+ entity_revision ${revisionType} NOT NULL,
1582
+ lifecycle_revision ${revisionType} NOT NULL,
1583
+ canonical_fingerprint TEXT,
1584
+ payload_fingerprint TEXT NOT NULL,
1585
+ payload_json TEXT NOT NULL,
1586
+ occurred_at TEXT NOT NULL,
1587
+ PRIMARY KEY (tenant_id, workspace_id, snapshot_id, entry_index)
1588
+ );
1589
+
1590
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_versions (
1591
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1592
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1593
+ version_id TEXT NOT NULL,
1594
+ kind TEXT NOT NULL CHECK (kind IN ('document', 'asset')),
1595
+ logical_path TEXT NOT NULL,
1596
+ storage_provider TEXT NOT NULL CHECK (storage_provider IN ('local', 'r2')),
1597
+ physical_key TEXT NOT NULL,
1598
+ content_sha256 TEXT NOT NULL,
1599
+ size_bytes ${revisionType} NOT NULL,
1600
+ mime_type TEXT NOT NULL,
1601
+ state TEXT NOT NULL CHECK (state IN ('preparing', 'ready', 'published', 'retired', 'deleting', 'deleted')),
1602
+ created_at TEXT NOT NULL,
1603
+ ready_at TEXT,
1604
+ published_at TEXT,
1605
+ retired_at TEXT,
1606
+ gc_after TEXT,
1607
+ deleted_at TEXT,
1608
+ gc_attempt_count INTEGER NOT NULL DEFAULT 0,
1609
+ gc_next_attempt_at TEXT,
1610
+ gc_last_error TEXT,
1611
+ preparation_token TEXT,
1612
+ preparation_lease_until TEXT,
1613
+ storage_generation INTEGER NOT NULL DEFAULT 0,
1614
+ gc_claim_token TEXT,
1615
+ gc_claim_lease_until TEXT,
1616
+ gc_completed_claim_token TEXT,
1617
+ gc_quarantine_sweep_required INTEGER NOT NULL DEFAULT 0,
1618
+ gc_final_sweep_after TEXT,
1619
+ PRIMARY KEY (tenant_id, workspace_id, version_id)
1620
+ );
1621
+
1622
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_heads (
1623
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1624
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1625
+ kind TEXT NOT NULL CHECK (kind IN ('document', 'asset')),
1626
+ logical_path TEXT NOT NULL,
1627
+ version_id TEXT,
1628
+ source_updated_at TEXT NOT NULL,
1629
+ content_sha256 TEXT,
1630
+ size_bytes ${revisionType},
1631
+ published_at TEXT NOT NULL,
1632
+ deleted_at TEXT,
1633
+ PRIMARY KEY (tenant_id, workspace_id, kind, logical_path)
1634
+ );
1635
+
1636
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_preparation_attempts (
1637
+ tenant_id TEXT NOT NULL DEFAULT 'default',
1638
+ workspace_id TEXT NOT NULL DEFAULT 'default',
1639
+ version_id TEXT NOT NULL,
1640
+ preparation_token TEXT NOT NULL,
1641
+ storage_provider TEXT NOT NULL CHECK (storage_provider IN ('local', 'r2')),
1642
+ physical_key TEXT NOT NULL,
1643
+ storage_generation INTEGER NOT NULL,
1644
+ state TEXT NOT NULL CHECK (state IN ('preparing', 'current', 'cleanup_pending', 'deleting', 'deleted')),
1645
+ created_at TEXT NOT NULL,
1646
+ promoted_at TEXT,
1647
+ available_after TEXT NOT NULL,
1648
+ deleted_at TEXT,
1649
+ gc_attempt_count INTEGER NOT NULL DEFAULT 0,
1650
+ gc_next_attempt_at TEXT,
1651
+ gc_last_error TEXT,
1652
+ gc_claim_token TEXT,
1653
+ gc_claim_lease_until TEXT,
1654
+ gc_completed_claim_token TEXT,
1655
+ PRIMARY KEY (tenant_id, workspace_id, version_id, preparation_token)
1656
+ );
1657
+
1658
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_entity_revisions_sequence
1659
+ ON workspace_sync_entity_revisions(tenant_id, workspace_id, last_sequence);
1660
+
1661
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_journal_entity
1662
+ ON workspace_sync_journal(tenant_id, workspace_id, domain, entity_id, sequence);
1663
+
1664
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_journal_operation
1665
+ ON workspace_sync_journal(tenant_id, workspace_id, client_id, operation_id);
1666
+
1667
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_operation_results_updated
1668
+ ON workspace_sync_operation_results(tenant_id, workspace_id, updated_at);
1669
+
1670
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_outbox_dispatch
1671
+ ON workspace_sync_outbox(tenant_id, workspace_id, status, next_attempt_at, created_at);
1672
+
1673
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_outbox_entity
1674
+ ON workspace_sync_outbox(tenant_id, workspace_id, domain, entity_id, created_at);
1675
+
1676
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_outbox_targets_entity
1677
+ ON workspace_sync_outbox_targets(tenant_id, workspace_id, domain, entity_id);
1678
+
1679
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_projection_repair_page
1680
+ ON workspace_sync_projection_repair_entries(tenant_id, workspace_id, projection_id, epoch, entity_id);
1681
+
1682
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_sync_coverage_repair_entity
1683
+ ON workspace_sync_coverage_repair_entries(
1684
+ tenant_id, workspace_id, coverage_id, epoch, projection_id, domain, entity_id
1685
+ );
1686
+
1687
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshots_expiry
1688
+ ON workspace_sync_repair_snapshots(tenant_id, workspace_id, expires_at);
1689
+
1690
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshots_created
1691
+ ON workspace_sync_repair_snapshots(tenant_id, workspace_id, created_at);
1692
+
1693
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshot_entries_entity
1694
+ ON workspace_sync_repair_snapshot_entries(
1695
+ tenant_id, workspace_id, snapshot_id, domain, entity_id
1696
+ );
1697
+
1698
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_sync_content_versions_physical
1699
+ ON workspace_sync_content_versions(tenant_id, workspace_id, storage_provider, physical_key);
1700
+
1701
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_versions_state
1702
+ ON workspace_sync_content_versions(tenant_id, workspace_id, state, created_at);
1703
+
1704
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_versions_gc
1705
+ ON workspace_sync_content_versions(
1706
+ tenant_id, workspace_id, state, gc_after, gc_next_attempt_at, version_id
1707
+ );
1708
+
1709
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_heads_version
1710
+ ON workspace_sync_content_heads(tenant_id, workspace_id, version_id);
1711
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_heads_source_updated
1712
+ ON workspace_sync_content_heads(tenant_id, workspace_id, source_updated_at, logical_path);
1713
+
1714
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_sync_content_preparation_attempts_physical
1715
+ ON workspace_sync_content_preparation_attempts(
1716
+ tenant_id, workspace_id, storage_provider, physical_key
1717
+ );
1718
+
1719
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_preparation_attempts_gc
1720
+ ON workspace_sync_content_preparation_attempts(
1721
+ tenant_id, workspace_id, state, available_after, gc_next_attempt_at
1722
+ );
1723
+
1724
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_sync_content_preparation_attempts_current
1725
+ ON workspace_sync_content_preparation_attempts(tenant_id, workspace_id, version_id)
1726
+ WHERE state = 'current';
1727
+
1728
+ `;
1729
+ }
1730
+ export function ensureWorkspaceSyncDurabilitySchema(db) {
1731
+ db.exec(buildWorkspaceSyncDurabilitySchemaSql(db.provider));
1732
+ if (db.provider === 'sqlite' && hasTable(db, 'tasks')) {
1733
+ db.exec(`
1734
+ CREATE TRIGGER IF NOT EXISTS trg_tasks_v3_create_fence
1735
+ BEFORE INSERT ON tasks
1736
+ WHEN EXISTS (
1737
+ SELECT 1
1738
+ FROM workspace_sync_projection_state
1739
+ WHERE tenant_id = NEW.tenant_id
1740
+ AND workspace_id = NEW.workspace_id
1741
+ AND projection_id = 'coverage/task-planning-metadata-v1'
1742
+ AND owner_mode = 'v3'
1743
+ )
1744
+ AND NOT EXISTS (
1745
+ SELECT 1
1746
+ FROM workspace_sync_task_create_guards
1747
+ WHERE tenant_id = NEW.tenant_id
1748
+ AND workspace_id = NEW.workspace_id
1749
+ AND task_id = NEW.id
1750
+ )
1751
+ BEGIN
1752
+ SELECT RAISE(ABORT, 'TASK_DURABLE_SYNC_REQUIRED');
1753
+ END;
1754
+ `);
1755
+ }
1756
+ const coverageRepairColumns = db.prepare(`PRAGMA table_info(workspace_sync_coverage_repair_entries)`).all();
1757
+ if (!coverageRepairColumns.some((column) => column.name === 'canonical_fingerprint')) {
1758
+ db.exec(`ALTER TABLE workspace_sync_coverage_repair_entries ADD COLUMN canonical_fingerprint TEXT`);
1759
+ }
1760
+ const repairSnapshotEntryColumns = db.prepare(`PRAGMA table_info(workspace_sync_repair_snapshot_entries)`).all();
1761
+ if (!repairSnapshotEntryColumns.some((column) => column.name === 'canonical_fingerprint')) {
1762
+ db.exec(`ALTER TABLE workspace_sync_repair_snapshot_entries ADD COLUMN canonical_fingerprint TEXT`);
1763
+ }
1764
+ const contentVersionColumns = db.prepare(`PRAGMA table_info(workspace_sync_content_versions)`).all();
1765
+ if (!contentVersionColumns.some((column) => column.name === 'gc_claim_token')) {
1766
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN gc_claim_token TEXT`);
1767
+ }
1768
+ if (!contentVersionColumns.some((column) => column.name === 'gc_claim_lease_until')) {
1769
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN gc_claim_lease_until TEXT`);
1770
+ }
1771
+ if (!contentVersionColumns.some((column) => column.name === 'storage_generation')) {
1772
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN storage_generation INTEGER NOT NULL DEFAULT 0`);
1773
+ }
1774
+ if (!contentVersionColumns.some((column) => column.name === 'gc_completed_claim_token')) {
1775
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN gc_completed_claim_token TEXT`);
1776
+ }
1777
+ if (!contentVersionColumns.some((column) => column.name === 'gc_quarantine_sweep_required')) {
1778
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN gc_quarantine_sweep_required INTEGER NOT NULL DEFAULT 0`);
1779
+ }
1780
+ if (!contentVersionColumns.some((column) => column.name === 'gc_final_sweep_after')) {
1781
+ db.exec(`ALTER TABLE workspace_sync_content_versions ADD COLUMN gc_final_sweep_after TEXT`);
1782
+ }
1783
+ const outboxColumns = db.prepare(`PRAGMA table_info(workspace_sync_outbox)`).all();
1784
+ if (!outboxColumns.some((column) => column.name === 'dispatch_class')) {
1785
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN dispatch_class TEXT NOT NULL DEFAULT 'ordinary'`);
1786
+ }
1787
+ db.exec(db.provider === 'postgres' ? `
1788
+ UPDATE workspace_sync_outbox
1789
+ SET dispatch_class = 'legacy-adoption'
1790
+ WHERE dispatch_class = 'ordinary'
1791
+ AND status IN ('pending', 'in_flight', 'blocked')
1792
+ AND (
1793
+ (
1794
+ domain = 'task'
1795
+ AND mutation_kind = 'create'
1796
+ AND jsonb_typeof(payload_json::jsonb -> 'adoptedRoot') = 'object'
1797
+ AND payload_json::jsonb -> 'adoptedRoot' ->> 'id' = entity_id
1798
+ )
1799
+ OR (
1800
+ domain = 'task-relationship'
1801
+ AND mutation_kind IN ('link', 'unlink')
1802
+ AND jsonb_typeof(payload_json::jsonb -> 'adoptedRelationship') = 'object'
1803
+ AND payload_json::jsonb -> 'adoptedRelationship' ->> 'id' = entity_id
1804
+ )
1805
+ )
1806
+ ` : `
1807
+ UPDATE workspace_sync_outbox
1808
+ SET dispatch_class = 'legacy-adoption'
1809
+ WHERE dispatch_class = 'ordinary'
1810
+ AND status IN ('pending', 'in_flight', 'blocked')
1811
+ AND json_valid(payload_json) = 1
1812
+ AND (
1813
+ (
1814
+ domain = 'task'
1815
+ AND mutation_kind = 'create'
1816
+ AND json_type(payload_json, '$.adoptedRoot') = 'object'
1817
+ AND json_extract(payload_json, '$.adoptedRoot.id') = entity_id
1818
+ )
1819
+ OR (
1820
+ domain = 'task-relationship'
1821
+ AND mutation_kind IN ('link', 'unlink')
1822
+ AND json_type(payload_json, '$.adoptedRelationship') = 'object'
1823
+ AND json_extract(payload_json, '$.adoptedRelationship.id') = entity_id
1824
+ )
1825
+ )
1080
1826
  `);
1081
- const sessionRows = db.prepare(`
1082
- SELECT
1083
- id,
1084
- tenant_id,
1827
+ if (!outboxColumns.some((column) => column.name === 'initial_not_found_attempt_count')) {
1828
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN initial_not_found_attempt_count INTEGER NOT NULL DEFAULT 0`);
1829
+ }
1830
+ if (!outboxColumns.some((column) => column.name === 'owns_task_metadata')) {
1831
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN owns_task_metadata INTEGER NOT NULL DEFAULT 0`);
1832
+ }
1833
+ if (!outboxColumns.some((column) => column.name === 'owns_task_lifecycle')) {
1834
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN owns_task_lifecycle INTEGER NOT NULL DEFAULT 0`);
1835
+ }
1836
+ if (!outboxColumns.some((column) => column.name === 'owns_task_assignee')) {
1837
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN owns_task_assignee INTEGER NOT NULL DEFAULT 0`);
1838
+ }
1839
+ if (!outboxColumns.some((column) => column.name === 'enqueue_sequence')) {
1840
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN enqueue_sequence ${db.provider === 'postgres' ? 'BIGINT' : 'INTEGER'} NOT NULL DEFAULT 0`);
1841
+ }
1842
+ if (!outboxColumns.some((column) => column.name === 'rebase_before_first_attempt')) {
1843
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN rebase_before_first_attempt INTEGER NOT NULL DEFAULT 0`);
1844
+ }
1845
+ if (!outboxColumns.some((column) => column.name === 'origin_assertion_recovery_count')) {
1846
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN origin_assertion_recovery_count INTEGER NOT NULL DEFAULT 0`);
1847
+ }
1848
+ if (!outboxColumns.some((column) => column.name === 'accepted_replay_recovery_count')) {
1849
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN accepted_replay_recovery_count INTEGER NOT NULL DEFAULT 0`);
1850
+ }
1851
+ if (!outboxColumns.some((column) => column.name === 'task_attachment_reference_metadata_recovery_count')) {
1852
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN task_attachment_reference_metadata_recovery_count INTEGER NOT NULL DEFAULT 0`);
1853
+ }
1854
+ const needsTaskStatusRecoveryBudgetSplit = !outboxColumns.some((column) => column.name === 'task_status_revision_rebase_count') || !outboxColumns.some((column) => column.name === 'task_status_workflow_ack_recovery_count');
1855
+ if (!outboxColumns.some((column) => column.name === 'task_status_revision_rebase_count')) {
1856
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN task_status_revision_rebase_count INTEGER NOT NULL DEFAULT 0`);
1857
+ }
1858
+ if (!outboxColumns.some((column) => column.name === 'task_status_workflow_ack_recovery_count')) {
1859
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN task_status_workflow_ack_recovery_count INTEGER NOT NULL DEFAULT 0`);
1860
+ }
1861
+ if (needsTaskStatusRecoveryBudgetSplit) {
1862
+ // The former shared counter cannot reveal which recovery consumed it.
1863
+ // Preserve durable markers where available, then grant active task-status
1864
+ // rows one fresh, independently bounded accepted-replay attempt. A
1865
+ // partially applied migration can grant one extra replay, never a loop.
1866
+ db.exec(`
1867
+ UPDATE workspace_sync_outbox
1868
+ SET task_status_revision_rebase_count = CASE
1869
+ WHEN rebase_before_first_attempt = 1 THEN 1
1870
+ ELSE task_status_revision_rebase_count
1871
+ END,
1872
+ task_status_workflow_ack_recovery_count = CASE
1873
+ WHEN last_error_code = 'WORKSPACE_SYNC_TASK_STATUS_WORKFLOW_ACK_RECOVERY' THEN 1
1874
+ ELSE task_status_workflow_ack_recovery_count
1875
+ END,
1876
+ accepted_replay_recovery_count = 0
1877
+ WHERE domain = 'task'
1878
+ AND mutation_kind = 'set-status'
1879
+ AND status IN ('pending', 'in_flight', 'blocked')
1880
+ `);
1881
+ }
1882
+ if (!outboxColumns.some((column) => column.name === 'workstream_metadata_revision_rebase_count')) {
1883
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN workstream_metadata_revision_rebase_count INTEGER NOT NULL DEFAULT 0`);
1884
+ }
1885
+ if (!outboxColumns.some((column) => column.name === 'initiative_metadata_revision_rebase_count')) {
1886
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN initiative_metadata_revision_rebase_count INTEGER NOT NULL DEFAULT 0`);
1887
+ }
1888
+ if (!outboxColumns.some((column) => column.name === 'recovery_batch_id')) {
1889
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN recovery_batch_id TEXT`);
1890
+ }
1891
+ if (!outboxColumns.some((column) => column.name === 'replay_of_client_id')) {
1892
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN replay_of_client_id TEXT`);
1893
+ }
1894
+ if (!outboxColumns.some((column) => column.name === 'replay_of_operation_id')) {
1895
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN replay_of_operation_id TEXT`);
1896
+ }
1897
+ if (!outboxColumns.some((column) => column.name === 'superseded_at')) {
1898
+ db.exec(`ALTER TABLE workspace_sync_outbox ADD COLUMN superseded_at TEXT`);
1899
+ }
1900
+ db.exec(`
1901
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_outbox_entity_sequence
1902
+ ON workspace_sync_outbox(tenant_id, workspace_id, domain, entity_id, enqueue_sequence, status)
1903
+ `);
1904
+ db.exec(`
1905
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_outbox_recovery_batch
1906
+ ON workspace_sync_outbox(tenant_id, workspace_id, recovery_batch_id, enqueue_sequence)
1907
+ `);
1908
+ db.exec(`
1909
+ UPDATE workspace_sync_outbox
1910
+ SET owns_task_metadata = CASE
1911
+ WHEN domain = 'task' AND mutation_kind = 'metadata-update' THEN 1
1912
+ ELSE owns_task_metadata
1913
+ END,
1914
+ owns_task_lifecycle = CASE
1915
+ WHEN domain = 'task' AND mutation_kind IN ('archive', 'unarchive', 'complete', 'reopen') THEN 1
1916
+ ELSE owns_task_lifecycle
1917
+ END,
1918
+ owns_task_assignee = CASE
1919
+ WHEN domain = 'task' AND mutation_kind = 'reopen' THEN 1
1920
+ ELSE owns_task_assignee
1921
+ END
1922
+ WHERE status IN ('pending', 'in_flight', 'blocked')
1923
+ `);
1924
+ db.exec(`
1925
+ INSERT INTO workspace_sync_outbox_targets (
1926
+ tenant_id, workspace_id, client_id, operation_id, domain, entity_id,
1927
+ mutation_kind, base_entity_revision, base_lifecycle_revision,
1928
+ owns_task_metadata, owns_task_lifecycle, owns_task_assignee, created_at
1929
+ )
1930
+ SELECT tenant_id, workspace_id, client_id, operation_id, domain, entity_id,
1931
+ mutation_kind, base_entity_revision, base_lifecycle_revision,
1932
+ owns_task_metadata, owns_task_lifecycle, owns_task_assignee, created_at
1933
+ FROM workspace_sync_outbox
1934
+ WHERE 1 = 1
1935
+ ON CONFLICT (tenant_id, workspace_id, client_id, operation_id, domain, entity_id) DO NOTHING
1936
+ `);
1937
+ const projectionStateColumns = db.prepare(`PRAGMA table_info(workspace_sync_projection_state)`).all();
1938
+ if (!projectionStateColumns.some((column) => column.name === 'repair_snapshot_id')) {
1939
+ db.exec(`ALTER TABLE workspace_sync_projection_state ADD COLUMN repair_snapshot_id TEXT`);
1940
+ }
1941
+ if (!projectionStateColumns.some((column) => column.name === 'repair_expires_at')) {
1942
+ db.exec(`ALTER TABLE workspace_sync_projection_state ADD COLUMN repair_expires_at TEXT`);
1943
+ }
1944
+ if (!projectionStateColumns.some((column) => column.name === 'applied_snapshot_id')) {
1945
+ db.exec(`ALTER TABLE workspace_sync_projection_state ADD COLUMN applied_snapshot_id TEXT`);
1946
+ }
1947
+ if (!projectionStateColumns.some((column) => column.name === 'applied_page_digest')) {
1948
+ db.exec(`ALTER TABLE workspace_sync_projection_state ADD COLUMN applied_page_digest TEXT`);
1949
+ }
1950
+ const revisionColumns = db.prepare(`PRAGMA table_info(workspace_sync_entity_revisions)`).all();
1951
+ if (!revisionColumns.some((column) => column.name === 'coexistence_owned')) {
1952
+ db.exec(`ALTER TABLE workspace_sync_entity_revisions ADD COLUMN coexistence_owned INTEGER NOT NULL DEFAULT 1`);
1953
+ }
1954
+ db.exec(`
1955
+ UPDATE workspace_sync_entity_revisions
1956
+ SET coexistence_owned = 0
1957
+ WHERE EXISTS (
1958
+ SELECT 1 FROM workspace_sync_journal
1959
+ WHERE workspace_sync_journal.tenant_id = workspace_sync_entity_revisions.tenant_id
1960
+ AND workspace_sync_journal.workspace_id = workspace_sync_entity_revisions.workspace_id
1961
+ AND workspace_sync_journal.domain = workspace_sync_entity_revisions.domain
1962
+ AND workspace_sync_journal.entity_id = workspace_sync_entity_revisions.entity_id
1963
+ AND workspace_sync_journal.sequence = workspace_sync_entity_revisions.last_sequence
1964
+ AND workspace_sync_journal.client_id = 'sync-v3-repair'
1965
+ AND (
1966
+ workspace_sync_journal.operation_id LIKE 'repair-baseline-%'
1967
+ OR (
1968
+ workspace_sync_journal.domain = 'initiative'
1969
+ AND workspace_sync_journal.operation_id LIKE 'initiative-baseline-%'
1970
+ )
1971
+ )
1972
+ )
1973
+ `);
1974
+ if (!revisionColumns.some((column) => column.name === 'metadata_owned')) {
1975
+ db.exec(`ALTER TABLE workspace_sync_entity_revisions ADD COLUMN metadata_owned INTEGER NOT NULL DEFAULT 0`);
1976
+ }
1977
+ if (!revisionColumns.some((column) => column.name === 'reopen_assignee_owned')) {
1978
+ db.exec(`ALTER TABLE workspace_sync_entity_revisions ADD COLUMN reopen_assignee_owned INTEGER NOT NULL DEFAULT 0`);
1979
+ }
1980
+ db.exec(`
1981
+ UPDATE workspace_sync_entity_revisions
1982
+ SET metadata_owned = 1
1983
+ WHERE metadata_owned = 0
1984
+ AND EXISTS (
1985
+ SELECT 1
1986
+ FROM workspace_sync_journal
1987
+ WHERE workspace_sync_journal.tenant_id = workspace_sync_entity_revisions.tenant_id
1988
+ AND workspace_sync_journal.workspace_id = workspace_sync_entity_revisions.workspace_id
1989
+ AND workspace_sync_journal.domain = workspace_sync_entity_revisions.domain
1990
+ AND workspace_sync_journal.entity_id = workspace_sync_entity_revisions.entity_id
1991
+ AND workspace_sync_journal.mutation_kind IN ('metadata-update', 'create')
1992
+ )
1993
+ `);
1994
+ }
1995
+ export function ensureLocalSyncCoordinatorSchema(db) {
1996
+ db.exec(`
1997
+ CREATE TABLE IF NOT EXISTS local_sync_coordinator_state (
1998
+ coordinator_id TEXT PRIMARY KEY,
1999
+ active_workspace_id TEXT,
2000
+ coordinator_generation INTEGER NOT NULL DEFAULT 0,
2001
+ ownership_mode TEXT NOT NULL,
2002
+ desired_ownership_mode TEXT NOT NULL DEFAULT 'browser-gateway',
2003
+ transition_state TEXT NOT NULL,
2004
+ accepted_switch_command_id TEXT,
2005
+ target_workspace_id TEXT,
2006
+ requested_by_json TEXT,
2007
+ terminal_switch_result_json TEXT,
2008
+ terminal_transfer_result_json TEXT,
2009
+ accepted_transfer_command_id TEXT,
2010
+ transfer_target_mode TEXT,
2011
+ transfer_phase TEXT,
2012
+ transfer_version INTEGER,
2013
+ local_data_version INTEGER NOT NULL DEFAULT 0,
2014
+ updated_at TEXT NOT NULL
2015
+ );
2016
+
2017
+ CREATE TABLE IF NOT EXISTS local_sync_coordinator_commands (
2018
+ command_id TEXT PRIMARY KEY,
2019
+ workspace_id TEXT,
2020
+ expected_coordinator_generation INTEGER NOT NULL,
2021
+ command_type TEXT NOT NULL,
2022
+ command_version INTEGER NOT NULL,
2023
+ args_json TEXT NOT NULL,
2024
+ canonical_fingerprint TEXT NOT NULL,
2025
+ requested_by_json TEXT NOT NULL,
2026
+ requested_at TEXT NOT NULL,
2027
+ status TEXT NOT NULL,
2028
+ started_at TEXT,
2029
+ completed_at TEXT,
2030
+ result_json TEXT,
2031
+ error_code TEXT,
2032
+ error_message TEXT,
2033
+ updated_at TEXT NOT NULL
2034
+ );
2035
+
2036
+ CREATE INDEX IF NOT EXISTS idx_local_sync_coordinator_commands_status
2037
+ ON local_sync_coordinator_commands(status, requested_at);
2038
+
2039
+ CREATE INDEX IF NOT EXISTS idx_local_sync_coordinator_commands_workspace
2040
+ ON local_sync_coordinator_commands(workspace_id, requested_at);
2041
+
2042
+ CREATE INDEX IF NOT EXISTS idx_local_sync_coordinator_commands_terminal
2043
+ ON local_sync_coordinator_commands(status, completed_at, command_id);
2044
+
2045
+ CREATE TABLE IF NOT EXISTS local_sync_execution_permits (
2046
+ permit_id TEXT PRIMARY KEY,
2047
+ workspace_id TEXT NOT NULL,
2048
+ coordinator_generation INTEGER NOT NULL,
2049
+ server_instance_id TEXT NOT NULL,
2050
+ owner_mode TEXT NOT NULL DEFAULT 'browser-gateway',
2051
+ operation_class TEXT NOT NULL,
2052
+ operation_identity TEXT,
2053
+ last_committed_cursor_json TEXT,
2054
+ state TEXT NOT NULL,
2055
+ upstream_disposition TEXT,
2056
+ issued_at TEXT NOT NULL,
2057
+ deadline_at TEXT NOT NULL,
2058
+ last_transition_at TEXT NOT NULL,
2059
+ completed_at TEXT,
2060
+ error_code TEXT
2061
+ );
2062
+
2063
+ CREATE INDEX IF NOT EXISTS idx_local_sync_execution_permits_live
2064
+ ON local_sync_execution_permits(workspace_id, state, issued_at);
2065
+
2066
+ CREATE TABLE IF NOT EXISTS local_sync_recovery_obligations (
2067
+ obligation_id TEXT PRIMARY KEY,
2068
+ permit_id TEXT NOT NULL UNIQUE,
2069
+ workspace_id TEXT NOT NULL,
2070
+ operation_class TEXT NOT NULL,
2071
+ operation_identity TEXT,
2072
+ upstream_disposition TEXT NOT NULL,
2073
+ last_committed_cursor_json TEXT,
2074
+ required_action TEXT NOT NULL,
2075
+ created_at TEXT NOT NULL,
2076
+ resolved_at TEXT,
2077
+ resolved_boundary_json TEXT
2078
+ );
2079
+
2080
+ CREATE INDEX IF NOT EXISTS idx_local_sync_recovery_obligations_open
2081
+ ON local_sync_recovery_obligations(workspace_id, resolved_at, created_at);
2082
+
2083
+ CREATE TABLE IF NOT EXISTS local_sync_legacy_adoption_state (
2084
+ tenant_id TEXT NOT NULL,
2085
+ workspace_id TEXT NOT NULL,
2086
+ domain TEXT NOT NULL,
2087
+ projection_epoch INTEGER NOT NULL,
2088
+ settled_at TEXT NOT NULL,
2089
+ next_scan_at TEXT NOT NULL,
2090
+ PRIMARY KEY (tenant_id, workspace_id, domain)
2091
+ );
2092
+
2093
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_pull_obligations (
2094
+ tenant_id TEXT NOT NULL,
2095
+ workspace_id TEXT NOT NULL,
2096
+ kind TEXT NOT NULL,
2097
+ path TEXT NOT NULL,
2098
+ source_watermark TEXT NOT NULL,
2099
+ metadata_fingerprint TEXT NOT NULL,
2100
+ expected_sha256 TEXT NOT NULL,
2101
+ expected_size_bytes INTEGER NOT NULL,
2102
+ manifest_updated_at TEXT NOT NULL,
2103
+ attempts INTEGER NOT NULL DEFAULT 0,
2104
+ last_error TEXT,
2105
+ created_at TEXT NOT NULL,
2106
+ updated_at TEXT NOT NULL,
2107
+ resolved_at TEXT,
2108
+ PRIMARY KEY (tenant_id, workspace_id, kind, path)
2109
+ );
2110
+
2111
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_pull_obligations_open
2112
+ ON workspace_sync_content_pull_obligations(
2113
+ tenant_id, workspace_id, resolved_at, updated_at, kind, path
2114
+ );
2115
+
2116
+ CREATE TABLE IF NOT EXISTS workspace_sync_v3_attachment_apply_obligations (
2117
+ tenant_id TEXT NOT NULL,
2118
+ workspace_id TEXT NOT NULL,
2119
+ task_id TEXT NOT NULL,
2120
+ asset_ids_json TEXT NOT NULL,
2121
+ payload_json TEXT NOT NULL,
2122
+ canonical_fingerprint TEXT NOT NULL,
2123
+ source_sequence TEXT NOT NULL,
2124
+ entity_revision TEXT,
2125
+ lifecycle_revision TEXT,
2126
+ revision_fingerprint TEXT,
2127
+ attempts INTEGER NOT NULL DEFAULT 0,
2128
+ last_error TEXT,
2129
+ created_at TEXT NOT NULL,
2130
+ updated_at TEXT NOT NULL,
2131
+ next_attempt_at TEXT NOT NULL,
2132
+ resolved_at TEXT,
2133
+ PRIMARY KEY (tenant_id, workspace_id, task_id)
2134
+ );
2135
+
2136
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_v3_attachment_apply_obligations_open
2137
+ ON workspace_sync_v3_attachment_apply_obligations(
2138
+ tenant_id, workspace_id, resolved_at, next_attempt_at
2139
+ );
2140
+
2141
+ CREATE TABLE IF NOT EXISTS local_workspace_sync_runner_state (
2142
+ tenant_id TEXT NOT NULL,
2143
+ workspace_id TEXT NOT NULL,
2144
+ state_version INTEGER NOT NULL,
2145
+ coordinator_generation INTEGER NOT NULL,
2146
+ checkpoint_revision INTEGER NOT NULL,
2147
+ checkpoint_json TEXT NOT NULL,
2148
+ created_at TEXT NOT NULL,
2149
+ updated_at TEXT NOT NULL,
2150
+ PRIMARY KEY (tenant_id, workspace_id)
2151
+ );
2152
+
2153
+ CREATE INDEX IF NOT EXISTS idx_local_workspace_sync_runner_generation
2154
+ ON local_workspace_sync_runner_state(coordinator_generation, updated_at);
2155
+ `);
2156
+ const attachmentApplyColumns = db.provider === 'postgres'
2157
+ ? new Set(db.prepare(`
2158
+ SELECT column_name AS name
2159
+ FROM information_schema.columns
2160
+ WHERE table_schema = current_schema()
2161
+ AND table_name = 'workspace_sync_v3_attachment_apply_obligations'
2162
+ `).all().map((column) => column.name))
2163
+ : new Set(db.prepare(`
2164
+ PRAGMA table_info(workspace_sync_v3_attachment_apply_obligations)
2165
+ `).all().map((column) => column.name));
2166
+ if (!attachmentApplyColumns.has('entity_revision')) {
2167
+ db.exec(`ALTER TABLE workspace_sync_v3_attachment_apply_obligations ADD COLUMN entity_revision TEXT`);
2168
+ }
2169
+ if (!attachmentApplyColumns.has('lifecycle_revision')) {
2170
+ db.exec(`ALTER TABLE workspace_sync_v3_attachment_apply_obligations ADD COLUMN lifecycle_revision TEXT`);
2171
+ }
2172
+ if (!attachmentApplyColumns.has('revision_fingerprint')) {
2173
+ db.exec(`ALTER TABLE workspace_sync_v3_attachment_apply_obligations ADD COLUMN revision_fingerprint TEXT`);
2174
+ }
2175
+ const coordinatorStateColumns = db.provider === 'postgres'
2176
+ ? new Set(db.prepare(`
2177
+ SELECT column_name AS name
2178
+ FROM information_schema.columns
2179
+ WHERE table_schema = current_schema()
2180
+ AND table_name = 'local_sync_coordinator_state'
2181
+ `).all().map((column) => column.name))
2182
+ : new Set(db.prepare(`
2183
+ PRAGMA table_info(local_sync_coordinator_state)
2184
+ `).all().map((column) => column.name));
2185
+ if (!coordinatorStateColumns.has('accepted_transfer_command_id')) {
2186
+ db.exec(`ALTER TABLE local_sync_coordinator_state ADD COLUMN accepted_transfer_command_id TEXT`);
2187
+ }
2188
+ if (!coordinatorStateColumns.has('terminal_transfer_result_json')) {
2189
+ db.exec(`ALTER TABLE local_sync_coordinator_state ADD COLUMN terminal_transfer_result_json TEXT`);
2190
+ }
2191
+ if (!coordinatorStateColumns.has('transfer_target_mode')) {
2192
+ db.exec(`ALTER TABLE local_sync_coordinator_state ADD COLUMN transfer_target_mode TEXT`);
2193
+ }
2194
+ if (!coordinatorStateColumns.has('transfer_phase')) {
2195
+ db.exec(`ALTER TABLE local_sync_coordinator_state ADD COLUMN transfer_phase TEXT`);
2196
+ }
2197
+ if (!coordinatorStateColumns.has('transfer_version')) {
2198
+ db.exec(`ALTER TABLE local_sync_coordinator_state ADD COLUMN transfer_version INTEGER`);
2199
+ }
2200
+ if (!coordinatorStateColumns.has('local_data_version')) {
2201
+ db.exec(`
2202
+ ALTER TABLE local_sync_coordinator_state
2203
+ ADD COLUMN local_data_version INTEGER NOT NULL DEFAULT 0
2204
+ `);
2205
+ }
2206
+ if (!coordinatorStateColumns.has('desired_ownership_mode')) {
2207
+ db.transaction(() => {
2208
+ db.exec(`
2209
+ ALTER TABLE local_sync_coordinator_state
2210
+ ADD COLUMN desired_ownership_mode TEXT NOT NULL DEFAULT 'browser-gateway'
2211
+ `);
2212
+ const legacyStates = db.prepare(`
2213
+ SELECT coordinator_id, ownership_mode, transition_state,
2214
+ transfer_target_mode, terminal_transfer_result_json
2215
+ FROM local_sync_coordinator_state
2216
+ `).all();
2217
+ const updateDesiredOwner = db.prepare(`
2218
+ UPDATE local_sync_coordinator_state
2219
+ SET desired_ownership_mode = ?
2220
+ WHERE coordinator_id = ?
2221
+ `);
2222
+ for (const state of legacyStates) {
2223
+ let desiredOwner = 'browser-gateway';
2224
+ if (state.ownership_mode === 'server') {
2225
+ desiredOwner = 'server';
2226
+ }
2227
+ else if (state.transition_state === 'transferring-ownership'
2228
+ && state.transfer_target_mode === 'browser-gateway') {
2229
+ desiredOwner = 'server';
2230
+ }
2231
+ else if (state.ownership_mode === 'stopped'
2232
+ && state.terminal_transfer_result_json) {
2233
+ try {
2234
+ const terminal = JSON.parse(state.terminal_transfer_result_json);
2235
+ if ((terminal.status === 'succeeded' && terminal.targetMode === 'server')
2236
+ || (terminal.status === 'failed' && terminal.sourceMode === 'server')) {
2237
+ desiredOwner = 'server';
2238
+ }
2239
+ }
2240
+ catch {
2241
+ // Invalid historical evidence cannot safely opt into server recovery.
2242
+ }
2243
+ }
2244
+ updateDesiredOwner.run(desiredOwner, state.coordinator_id);
2245
+ }
2246
+ })();
2247
+ }
2248
+ const permitColumns = db.provider === 'postgres'
2249
+ ? new Set(db.prepare(`
2250
+ SELECT column_name AS name
2251
+ FROM information_schema.columns
2252
+ WHERE table_schema = current_schema()
2253
+ AND table_name = 'local_sync_execution_permits'
2254
+ `).all().map((column) => column.name))
2255
+ : new Set(db.prepare(`
2256
+ PRAGMA table_info(local_sync_execution_permits)
2257
+ `).all().map((column) => column.name));
2258
+ if (!permitColumns.has('last_committed_cursor_json')) {
2259
+ db.exec(`ALTER TABLE local_sync_execution_permits ADD COLUMN last_committed_cursor_json TEXT`);
2260
+ }
2261
+ if (!permitColumns.has('owner_mode')) {
2262
+ db.exec(`
2263
+ ALTER TABLE local_sync_execution_permits
2264
+ ADD COLUMN owner_mode TEXT NOT NULL DEFAULT 'browser-gateway'
2265
+ `);
2266
+ }
2267
+ const recoveryObligationColumns = db.provider === 'postgres'
2268
+ ? new Set(db.prepare(`
2269
+ SELECT column_name AS name
2270
+ FROM information_schema.columns
2271
+ WHERE table_schema = current_schema()
2272
+ AND table_name = 'local_sync_recovery_obligations'
2273
+ `).all().map((column) => column.name))
2274
+ : new Set(db.prepare(`
2275
+ PRAGMA table_info(local_sync_recovery_obligations)
2276
+ `).all().map((column) => column.name));
2277
+ if (!recoveryObligationColumns.has('resolved_boundary_json')) {
2278
+ db.exec(`
2279
+ ALTER TABLE local_sync_recovery_obligations
2280
+ ADD COLUMN resolved_boundary_json TEXT
2281
+ `);
2282
+ }
2283
+ }
2284
+ export function ensureWorkspaceDocumentsSchema(db) {
2285
+ db.exec(`
2286
+ CREATE TABLE IF NOT EXISTS workspace_documents (
2287
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2288
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2289
+ path TEXT NOT NULL,
2290
+ content_hash TEXT NOT NULL,
2291
+ updated_at TEXT NOT NULL,
2292
+ PRIMARY KEY (tenant_id, workspace_id, path)
2293
+ );
2294
+ CREATE INDEX IF NOT EXISTS idx_workspace_documents_workspace_path
2295
+ ON workspace_documents(tenant_id, workspace_id, path);
2296
+ `);
2297
+ }
2298
+ export function ensureAnnotatedAttachmentSessionsSchema(db) {
2299
+ db.exec(`
2300
+ CREATE TABLE IF NOT EXISTS annotated_attachment_sessions (
2301
+ id TEXT PRIMARY KEY,
2302
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2303
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2304
+ task_id TEXT NOT NULL,
2305
+ base_image_asset_id TEXT NOT NULL,
2306
+ title TEXT,
2307
+ global_instruction TEXT,
2308
+ annotations_json TEXT NOT NULL DEFAULT '[]',
2309
+ created_by_actor_id TEXT,
2310
+ updated_by_actor_id TEXT,
2311
+ created_at TEXT NOT NULL,
2312
+ updated_at TEXT NOT NULL,
2313
+ deleted_at TEXT
2314
+ );
2315
+
2316
+ CREATE INDEX IF NOT EXISTS idx_annotated_attachment_sessions_task
2317
+ ON annotated_attachment_sessions(tenant_id, workspace_id, task_id, deleted_at, updated_at);
2318
+ CREATE INDEX IF NOT EXISTS idx_annotated_attachment_sessions_image
2319
+ ON annotated_attachment_sessions(tenant_id, workspace_id, base_image_asset_id, deleted_at, updated_at);
2320
+ `);
2321
+ }
2322
+ export function ensureTaskforceAgentsSchema(db) {
2323
+ db.exec(`
2324
+ CREATE TABLE IF NOT EXISTS taskforce_agents (
2325
+ id TEXT PRIMARY KEY,
2326
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2327
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2328
+ name TEXT NOT NULL,
2329
+ model_provider TEXT NOT NULL DEFAULT 'taskforce_hq',
2330
+ provider_key TEXT NOT NULL DEFAULT 'anthropic',
2331
+ model_key TEXT NOT NULL DEFAULT 'anthropic.claude-sonnet-4-6',
2332
+ model_tier TEXT NOT NULL DEFAULT 'balanced',
2333
+ system_prompt TEXT NOT NULL,
2334
+ enabled INTEGER NOT NULL DEFAULT 1,
2335
+ lifecycle_status TEXT NOT NULL DEFAULT 'active',
2336
+ managed_profile_id TEXT,
2337
+ definition_json TEXT,
2338
+ definition_revision INTEGER NOT NULL DEFAULT 0,
2339
+ definition_hash TEXT,
2340
+ configuration_state TEXT NOT NULL DEFAULT 'needs-migration',
2341
+ configuration_issues_json TEXT NOT NULL DEFAULT '[]',
2342
+ created_by_user_id TEXT,
2343
+ updated_by_user_id TEXT,
2344
+ created_at TEXT NOT NULL,
2345
+ updated_at TEXT NOT NULL,
2346
+ deleted_at TEXT
2347
+ );
2348
+
2349
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agents_workspace
2350
+ ON taskforce_agents(tenant_id, workspace_id, deleted_at, updated_at);
2351
+
2352
+ CREATE TABLE IF NOT EXISTS agent_conversations (
2353
+ id TEXT PRIMARY KEY,
2354
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2355
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2356
+ agent_id TEXT NOT NULL,
2357
+ task_id TEXT,
2358
+ title TEXT NOT NULL DEFAULT 'Agent chat',
2359
+ messages_json TEXT NOT NULL DEFAULT '[]',
2360
+ model_provider TEXT,
2361
+ model_id TEXT,
2362
+ usage_json TEXT,
2363
+ latency_ms INTEGER,
2364
+ created_by_user_id TEXT,
2365
+ updated_by_user_id TEXT,
2366
+ created_at TEXT NOT NULL,
2367
+ updated_at TEXT NOT NULL,
2368
+ deleted_at TEXT
2369
+ );
2370
+
2371
+ CREATE INDEX IF NOT EXISTS idx_agent_conversations_agent
2372
+ ON agent_conversations(tenant_id, workspace_id, agent_id, deleted_at, updated_at);
2373
+ `);
2374
+ const agentColumns = db.provider === 'postgres'
2375
+ ? db.prepare(`
2376
+ SELECT column_name AS name
2377
+ FROM information_schema.columns
2378
+ WHERE table_name = 'taskforce_agents'
2379
+ `).all()
2380
+ : db.prepare(`PRAGMA table_info(taskforce_agents)`).all();
2381
+ const agentColumnNames = new Set(agentColumns.map((column) => column.name));
2382
+ const missingAgentColumns = [
2383
+ ['provider_key', `TEXT NOT NULL DEFAULT 'anthropic'`],
2384
+ ['model_key', `TEXT NOT NULL DEFAULT 'anthropic.claude-sonnet-4-6'`],
2385
+ ['lifecycle_status', `TEXT NOT NULL DEFAULT 'active'`],
2386
+ ['managed_profile_id', 'TEXT'],
2387
+ ['definition_json', 'TEXT'],
2388
+ ['definition_revision', 'INTEGER NOT NULL DEFAULT 0'],
2389
+ ['definition_hash', 'TEXT'],
2390
+ ['configuration_state', `TEXT NOT NULL DEFAULT 'needs-migration'`],
2391
+ ['configuration_issues_json', `TEXT NOT NULL DEFAULT '[]'`],
2392
+ ];
2393
+ for (const [columnName, columnDefinition] of missingAgentColumns) {
2394
+ if (agentColumnNames.has(columnName))
2395
+ continue;
2396
+ db.exec(db.provider === 'postgres'
2397
+ ? `ALTER TABLE taskforce_agents ADD COLUMN IF NOT EXISTS ${columnName} ${columnDefinition}`
2398
+ : `ALTER TABLE taskforce_agents ADD COLUMN ${columnName} ${columnDefinition}`);
2399
+ }
2400
+ if (MIGRATION_COMPAT_ENABLED)
2401
+ backfillLegacyTaskforceAgentDefinitions(db);
2402
+ const conversationColumns = db.provider === 'postgres'
2403
+ ? db.prepare(`
2404
+ SELECT column_name AS name
2405
+ FROM information_schema.columns
2406
+ WHERE table_name = 'agent_conversations'
2407
+ `).all()
2408
+ : db.prepare(`PRAGMA table_info(agent_conversations)`).all();
2409
+ const conversationColumnNames = new Set(conversationColumns.map((column) => column.name));
2410
+ if (!conversationColumnNames.has('task_id')) {
2411
+ db.exec(db.provider === 'postgres'
2412
+ ? `ALTER TABLE agent_conversations ADD COLUMN IF NOT EXISTS task_id TEXT`
2413
+ : `ALTER TABLE agent_conversations ADD COLUMN task_id TEXT`);
2414
+ }
2415
+ }
2416
+ export function ensureAgentRolesSchema(db) {
2417
+ db.exec(`
2418
+ CREATE TABLE IF NOT EXISTS agent_roles (
2419
+ id TEXT PRIMARY KEY,
2420
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2421
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2422
+ lifecycle_status TEXT NOT NULL DEFAULT 'active'
2423
+ CHECK (lifecycle_status IN ('active', 'retired')),
2424
+ current_revision INTEGER NOT NULL,
2425
+ current_content_hash TEXT NOT NULL,
2426
+ created_by_actor_id TEXT,
2427
+ updated_by_actor_id TEXT,
2428
+ created_at TEXT NOT NULL,
2429
+ updated_at TEXT NOT NULL,
2430
+ retired_at TEXT,
2431
+ deleted_at TEXT
2432
+ );
2433
+
2434
+ CREATE INDEX IF NOT EXISTS idx_agent_roles_workspace
2435
+ ON agent_roles(tenant_id, workspace_id, deleted_at, lifecycle_status, updated_at);
2436
+
2437
+ CREATE TABLE IF NOT EXISTS agent_role_revisions (
2438
+ role_id TEXT NOT NULL,
2439
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2440
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2441
+ revision INTEGER NOT NULL,
2442
+ definition_json TEXT NOT NULL,
2443
+ content_hash TEXT NOT NULL,
2444
+ created_by_actor_id TEXT,
2445
+ created_at TEXT NOT NULL,
2446
+ PRIMARY KEY (role_id, revision)
2447
+ );
2448
+
2449
+ CREATE INDEX IF NOT EXISTS idx_agent_role_revisions_workspace
2450
+ ON agent_role_revisions(tenant_id, workspace_id, role_id, revision);
2451
+ `);
2452
+ }
2453
+ export function ensureTaskforceAgentSkillsSchema(db) {
2454
+ db.exec(`
2455
+ CREATE TABLE IF NOT EXISTS taskforce_agent_skills (
2456
+ id TEXT PRIMARY KEY,
2457
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2458
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2459
+ name TEXT NOT NULL,
2460
+ lifecycle_status TEXT NOT NULL DEFAULT 'active'
2461
+ CHECK (lifecycle_status IN ('active', 'retired')),
2462
+ definition_json TEXT NOT NULL,
2463
+ revision_number INTEGER NOT NULL CHECK (revision_number >= 1),
2464
+ content_hash TEXT NOT NULL,
2465
+ created_by_actor_id TEXT,
2466
+ updated_by_actor_id TEXT,
2467
+ created_at TEXT NOT NULL,
2468
+ updated_at TEXT NOT NULL,
2469
+ retired_at TEXT,
2470
+ retired_by_actor_id TEXT
2471
+ );
2472
+
2473
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agent_skills_workspace
2474
+ ON taskforce_agent_skills(tenant_id, workspace_id, lifecycle_status, name);
2475
+
2476
+ CREATE TABLE IF NOT EXISTS taskforce_agent_skill_revisions (
2477
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2478
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2479
+ skill_id TEXT NOT NULL,
2480
+ revision_number INTEGER NOT NULL CHECK (revision_number >= 1),
2481
+ content_hash TEXT NOT NULL,
2482
+ definition_json TEXT NOT NULL,
2483
+ created_by_actor_id TEXT,
2484
+ created_at TEXT NOT NULL,
2485
+ PRIMARY KEY (tenant_id, workspace_id, skill_id, revision_number)
2486
+ );
2487
+
2488
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agent_skill_revisions_skill
2489
+ ON taskforce_agent_skill_revisions(tenant_id, workspace_id, skill_id, revision_number);
2490
+
2491
+ CREATE TABLE IF NOT EXISTS taskforce_agent_skill_events (
2492
+ id TEXT PRIMARY KEY,
2493
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2494
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2495
+ skill_id TEXT NOT NULL,
2496
+ event_type TEXT NOT NULL,
2497
+ actor_id TEXT,
2498
+ details_json TEXT NOT NULL DEFAULT '{}',
2499
+ created_at TEXT NOT NULL
2500
+ );
2501
+
2502
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agent_skill_events_skill
2503
+ ON taskforce_agent_skill_events(tenant_id, workspace_id, skill_id, created_at);
2504
+ `);
2505
+ }
2506
+ export function ensureWorkflowSchema(db) {
2507
+ db.exec(`
2508
+ CREATE TABLE IF NOT EXISTS workflow_templates (
2509
+ id TEXT PRIMARY KEY,
2510
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2511
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2512
+ name TEXT NOT NULL,
2513
+ description TEXT NOT NULL DEFAULT '',
2514
+ status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'retired')),
2515
+ created_by_actor_id TEXT,
2516
+ updated_by_actor_id TEXT,
2517
+ created_at TEXT NOT NULL,
2518
+ updated_at TEXT NOT NULL,
2519
+ deleted_at TEXT
2520
+ );
2521
+
2522
+ CREATE INDEX IF NOT EXISTS idx_workflow_templates_workspace
2523
+ ON workflow_templates(tenant_id, workspace_id, deleted_at, updated_at);
2524
+
2525
+ CREATE TABLE IF NOT EXISTS workflow_versions (
2526
+ id TEXT PRIMARY KEY,
2527
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2528
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2529
+ workflow_template_id TEXT NOT NULL,
2530
+ version_number INTEGER,
2531
+ status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published')),
2532
+ name TEXT NOT NULL,
2533
+ description TEXT NOT NULL DEFAULT '',
2534
+ created_by_actor_id TEXT,
2535
+ updated_by_actor_id TEXT,
2536
+ published_by_actor_id TEXT,
2537
+ created_at TEXT NOT NULL,
2538
+ updated_at TEXT NOT NULL,
2539
+ published_at TEXT,
2540
+ deleted_at TEXT,
2541
+ UNIQUE (id, workflow_template_id),
2542
+ CHECK (
2543
+ (status = 'draft' AND version_number IS NULL AND published_at IS NULL)
2544
+ OR (status = 'published' AND version_number IS NOT NULL AND version_number > 0 AND published_at IS NOT NULL)
2545
+ ),
2546
+ FOREIGN KEY (workflow_template_id) REFERENCES workflow_templates(id) ON DELETE RESTRICT
2547
+ );
2548
+
2549
+ CREATE INDEX IF NOT EXISTS idx_workflow_versions_template
2550
+ ON workflow_versions(tenant_id, workspace_id, workflow_template_id, status, updated_at);
2551
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_versions_published_number
2552
+ ON workflow_versions(tenant_id, workspace_id, workflow_template_id, version_number)
2553
+ WHERE status = 'published' AND deleted_at IS NULL;
2554
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_versions_single_draft
2555
+ ON workflow_versions(tenant_id, workspace_id, workflow_template_id)
2556
+ WHERE status = 'draft' AND deleted_at IS NULL;
2557
+
2558
+ CREATE TABLE IF NOT EXISTS workflow_steps (
2559
+ id TEXT PRIMARY KEY,
2560
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2561
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2562
+ workflow_version_id TEXT NOT NULL,
2563
+ position INTEGER NOT NULL CHECK (position >= 0),
2564
+ name TEXT NOT NULL,
2565
+ instructions TEXT NOT NULL DEFAULT '',
2566
+ owner_type TEXT CHECK (owner_type IS NULL OR owner_type IN ('user', 'agent')),
2567
+ owner_id TEXT,
2568
+ expected_artifact TEXT,
2569
+ requires_comment_evidence INTEGER NOT NULL DEFAULT 0 CHECK (requires_comment_evidence IN (0, 1)),
2570
+ is_required INTEGER NOT NULL DEFAULT 1 CHECK (is_required IN (0, 1)),
2571
+ created_at TEXT NOT NULL,
2572
+ updated_at TEXT NOT NULL,
2573
+ CHECK ((owner_type IS NULL AND owner_id IS NULL) OR (owner_type IS NOT NULL AND owner_id IS NOT NULL)),
2574
+ FOREIGN KEY (workflow_version_id) REFERENCES workflow_versions(id) ON DELETE RESTRICT
2575
+ );
2576
+
2577
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_steps_version_position
2578
+ ON workflow_steps(tenant_id, workspace_id, workflow_version_id, position);
2579
+
2580
+ CREATE TABLE IF NOT EXISTS workflow_executions (
2581
+ id TEXT PRIMARY KEY,
2582
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2583
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2584
+ task_id TEXT NOT NULL,
2585
+ workflow_template_id TEXT NOT NULL,
2586
+ workflow_version_id TEXT NOT NULL,
2587
+ status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'running', 'paused', 'completed', 'failed', 'ended')),
2588
+ current_step_id TEXT,
2589
+ created_by_actor_id TEXT,
2590
+ updated_by_actor_id TEXT,
2591
+ created_at TEXT NOT NULL,
2592
+ updated_at TEXT NOT NULL,
2593
+ started_at TEXT,
2594
+ completed_at TEXT,
2595
+ ended_at TEXT,
2596
+ deleted_at TEXT,
2597
+ FOREIGN KEY (workflow_template_id) REFERENCES workflow_templates(id) ON DELETE RESTRICT,
2598
+ FOREIGN KEY (workflow_version_id, workflow_template_id)
2599
+ REFERENCES workflow_versions(id, workflow_template_id) ON DELETE RESTRICT
2600
+ );
2601
+
2602
+ -- task_id intentionally remains a logical reference because Taskforce moves
2603
+ -- deleted tasks out of the active tasks table while retaining execution history.
2604
+
2605
+ CREATE INDEX IF NOT EXISTS idx_workflow_executions_task
2606
+ ON workflow_executions(tenant_id, workspace_id, task_id, updated_at);
2607
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_executions_one_active_per_task
2608
+ ON workflow_executions(tenant_id, workspace_id, task_id)
2609
+ WHERE status IN ('pending', 'running', 'paused') AND deleted_at IS NULL;
2610
+
2611
+ CREATE TABLE IF NOT EXISTS workflow_execution_events (
2612
+ id TEXT PRIMARY KEY,
2613
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2614
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2615
+ workflow_execution_id TEXT NOT NULL,
2616
+ sequence_number INTEGER NOT NULL CHECK (sequence_number >= 0),
2617
+ event_type TEXT NOT NULL CHECK (event_type IN (
2618
+ 'execution-created', 'execution-started', 'execution-paused',
2619
+ 'execution-resumed', 'execution-completed', 'execution-failed', 'execution-ended',
2620
+ 'step-completed', 'step-started'
2621
+ )),
2622
+ from_status TEXT CHECK (from_status IS NULL OR from_status IN ('pending', 'running', 'paused', 'completed', 'failed', 'ended')),
2623
+ to_status TEXT NOT NULL CHECK (to_status IN ('pending', 'running', 'paused', 'completed', 'failed', 'ended')),
2624
+ step_id TEXT,
2625
+ actor_id TEXT NOT NULL,
2626
+ idempotency_key TEXT,
2627
+ details_json TEXT NOT NULL DEFAULT '{}',
2628
+ created_at TEXT NOT NULL,
2629
+ FOREIGN KEY (workflow_execution_id) REFERENCES workflow_executions(id) ON DELETE RESTRICT
2630
+ );
2631
+
2632
+ CREATE INDEX IF NOT EXISTS idx_workflow_execution_events_execution
2633
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, sequence_number);
2634
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_execution_events_sequence
2635
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, sequence_number);
2636
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_execution_events_idempotency
2637
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, idempotency_key)
2638
+ WHERE idempotency_key IS NOT NULL;
2639
+
2640
+ INSERT INTO workflow_execution_events (
2641
+ id, tenant_id, workspace_id, workflow_execution_id, sequence_number, event_type,
2642
+ from_status, to_status, step_id, actor_id, idempotency_key,
2643
+ details_json, created_at
2644
+ )
2645
+ SELECT
2646
+ 'workflow-execution-event-initial-' || execution.id,
2647
+ execution.tenant_id,
2648
+ execution.workspace_id,
2649
+ execution.id,
2650
+ 0,
2651
+ 'execution-created',
2652
+ NULL,
2653
+ 'pending',
2654
+ NULL,
2655
+ COALESCE(execution.created_by_actor_id, 'system'),
2656
+ NULL,
2657
+ '{}',
2658
+ execution.created_at
2659
+ FROM workflow_executions execution
2660
+ WHERE NOT EXISTS (
2661
+ SELECT 1 FROM workflow_execution_events event
2662
+ WHERE event.tenant_id = execution.tenant_id
2663
+ AND event.workspace_id = execution.workspace_id
2664
+ AND event.workflow_execution_id = execution.id
2665
+ );
2666
+ `);
2667
+ ensureWorkflowStepEventTypes(db);
2668
+ if (db.provider !== 'postgres') {
2669
+ db.exec(`
2670
+ CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_update
2671
+ BEFORE UPDATE ON workflow_execution_events
2672
+ BEGIN
2673
+ SELECT RAISE(ABORT, 'Workflow execution events are append-only');
2674
+ END;
2675
+ CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_delete
2676
+ BEFORE DELETE ON workflow_execution_events
2677
+ BEGIN
2678
+ SELECT RAISE(ABORT, 'Workflow execution events are append-only');
2679
+ END;
2680
+ `);
2681
+ }
2682
+ else {
2683
+ db.exec(`
2684
+ CREATE OR REPLACE FUNCTION prevent_workflow_execution_event_mutation()
2685
+ RETURNS trigger AS $$
2686
+ BEGIN
2687
+ RAISE EXCEPTION 'Workflow execution events are append-only';
2688
+ END;
2689
+ $$ LANGUAGE plpgsql;
2690
+ DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_mutation ON workflow_execution_events;
2691
+ CREATE TRIGGER trg_workflow_execution_events_no_mutation
2692
+ BEFORE UPDATE OR DELETE ON workflow_execution_events
2693
+ FOR EACH ROW EXECUTE FUNCTION prevent_workflow_execution_event_mutation();
2694
+ `);
2695
+ }
2696
+ const workflowStepColumns = db.provider === 'postgres'
2697
+ ? new Set(db.prepare(`
2698
+ SELECT column_name AS name
2699
+ FROM information_schema.columns
2700
+ WHERE table_name = 'workflow_steps'
2701
+ `).all().map((column) => column.name))
2702
+ : new Set(db.prepare(`PRAGMA table_info(workflow_steps)`).all().map((column) => column.name));
2703
+ if (!workflowStepColumns.has('requires_comment_evidence')) {
2704
+ db.exec(`
2705
+ ALTER TABLE workflow_steps
2706
+ ADD COLUMN requires_comment_evidence INTEGER NOT NULL DEFAULT 0
2707
+ CHECK (requires_comment_evidence IN (0, 1))
2708
+ `);
2709
+ }
2710
+ }
2711
+ function ensureWorkflowStepEventTypes(db) {
2712
+ if (db.provider === 'postgres') {
2713
+ const row = db.prepare(`
2714
+ SELECT pg_get_constraintdef(constraint_row.oid) AS definition
2715
+ FROM pg_constraint constraint_row
2716
+ JOIN pg_class table_row ON table_row.oid = constraint_row.conrelid
2717
+ WHERE table_row.relname = 'workflow_execution_events'
2718
+ AND constraint_row.conname = 'workflow_execution_events_event_type_check'
2719
+ LIMIT 1
2720
+ `).get();
2721
+ if (String(row?.definition || '').includes('step-completed'))
2722
+ return;
2723
+ db.exec(`
2724
+ ALTER TABLE workflow_execution_events
2725
+ DROP CONSTRAINT IF EXISTS workflow_execution_events_event_type_check;
2726
+ ALTER TABLE workflow_execution_events
2727
+ ADD CONSTRAINT workflow_execution_events_event_type_check CHECK (event_type IN (
2728
+ 'execution-created', 'execution-started', 'execution-paused',
2729
+ 'execution-resumed', 'execution-completed', 'execution-failed', 'execution-ended',
2730
+ 'step-completed', 'step-started'
2731
+ ));
2732
+ `);
2733
+ return;
2734
+ }
2735
+ const table = db.prepare(`
2736
+ SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'workflow_execution_events'
2737
+ `).get();
2738
+ if (String(table?.sql || '').includes('step-completed'))
2739
+ return;
2740
+ db.transaction(() => db.exec(`
2741
+ DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_update;
2742
+ DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_delete;
2743
+ ALTER TABLE workflow_execution_events RENAME TO workflow_execution_events_legacy;
2744
+ CREATE TABLE workflow_execution_events (
2745
+ id TEXT PRIMARY KEY,
2746
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2747
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2748
+ workflow_execution_id TEXT NOT NULL,
2749
+ sequence_number INTEGER NOT NULL CHECK (sequence_number >= 0),
2750
+ event_type TEXT NOT NULL CHECK (event_type IN (
2751
+ 'execution-created', 'execution-started', 'execution-paused',
2752
+ 'execution-resumed', 'execution-completed', 'execution-failed', 'execution-ended',
2753
+ 'step-completed', 'step-started'
2754
+ )),
2755
+ from_status TEXT CHECK (from_status IS NULL OR from_status IN ('pending', 'running', 'paused', 'completed', 'failed', 'ended')),
2756
+ to_status TEXT NOT NULL CHECK (to_status IN ('pending', 'running', 'paused', 'completed', 'failed', 'ended')),
2757
+ step_id TEXT,
2758
+ actor_id TEXT NOT NULL,
2759
+ idempotency_key TEXT,
2760
+ details_json TEXT NOT NULL DEFAULT '{}',
2761
+ created_at TEXT NOT NULL,
2762
+ FOREIGN KEY (workflow_execution_id) REFERENCES workflow_executions(id) ON DELETE RESTRICT
2763
+ );
2764
+ INSERT INTO workflow_execution_events (
2765
+ id, tenant_id, workspace_id, workflow_execution_id, sequence_number, event_type,
2766
+ from_status, to_status, step_id, actor_id, idempotency_key, details_json, created_at
2767
+ ) SELECT
2768
+ id, tenant_id, workspace_id, workflow_execution_id, sequence_number, event_type,
2769
+ from_status, to_status, step_id, actor_id, idempotency_key, details_json, created_at
2770
+ FROM workflow_execution_events_legacy;
2771
+ DROP TABLE workflow_execution_events_legacy;
2772
+ CREATE INDEX IF NOT EXISTS idx_workflow_execution_events_execution
2773
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, sequence_number);
2774
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_execution_events_sequence
2775
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, sequence_number);
2776
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workflow_execution_events_idempotency
2777
+ ON workflow_execution_events(tenant_id, workspace_id, workflow_execution_id, idempotency_key)
2778
+ WHERE idempotency_key IS NOT NULL;
2779
+ `))();
2780
+ }
2781
+ export function ensureDocumentReviewSessionsSchema(db) {
2782
+ db.exec(`
2783
+ CREATE TABLE IF NOT EXISTS document_review_sessions (
2784
+ id TEXT PRIMARY KEY,
2785
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2786
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2787
+ asset_id TEXT NOT NULL,
2788
+ document_id TEXT,
2789
+ document_version INTEGER,
2790
+ title TEXT,
2791
+ status TEXT NOT NULL DEFAULT 'open',
2792
+ comments_json TEXT NOT NULL DEFAULT '[]',
2793
+ created_by_actor_id TEXT,
2794
+ updated_by_actor_id TEXT,
2795
+ created_at TEXT NOT NULL,
2796
+ updated_at TEXT NOT NULL,
2797
+ deleted_at TEXT
2798
+ );
2799
+
2800
+ CREATE INDEX IF NOT EXISTS idx_document_review_sessions_asset
2801
+ ON document_review_sessions(tenant_id, workspace_id, asset_id, deleted_at, updated_at);
2802
+ CREATE INDEX IF NOT EXISTS idx_document_review_sessions_workspace
2803
+ ON document_review_sessions(tenant_id, workspace_id, updated_at, id);
2804
+
2805
+ CREATE TABLE IF NOT EXISTS document_review_comments (
2806
+ id TEXT PRIMARY KEY,
2807
+ session_id TEXT NOT NULL,
2808
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2809
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2810
+ body TEXT NOT NULL,
2811
+ anchor_json TEXT,
2812
+ author_actor_id TEXT,
2813
+ updated_by_actor_id TEXT,
2814
+ deleted_by_actor_id TEXT,
2815
+ parent_comment_id TEXT,
2816
+ thread_status TEXT,
2817
+ thread_status_updated_at TEXT,
2818
+ resolved_at TEXT,
2819
+ resolved_by_actor_id TEXT,
2820
+ idempotency_key TEXT,
2821
+ idempotency_fingerprint TEXT,
2822
+ idempotency_actor_scope TEXT NOT NULL DEFAULT '',
2823
+ order_index INTEGER NOT NULL DEFAULT 0,
2824
+ created_at TEXT NOT NULL,
2825
+ updated_at TEXT NOT NULL,
2826
+ deleted_at TEXT
2827
+ );
2828
+
2829
+ CREATE INDEX IF NOT EXISTS idx_document_review_comments_session
2830
+ ON document_review_comments(tenant_id, workspace_id, session_id, deleted_at, order_index, created_at, id);
2831
+ CREATE INDEX IF NOT EXISTS idx_document_review_comments_workspace
2832
+ ON document_review_comments(tenant_id, workspace_id, updated_at, id);
2833
+ `);
2834
+ const commentColumnNames = db.provider === 'postgres'
2835
+ ? new Set(db.prepare(`
2836
+ SELECT column_name AS name
2837
+ FROM information_schema.columns
2838
+ WHERE table_schema = current_schema()
2839
+ AND table_name = 'document_review_comments'
2840
+ `).all().map((column) => column.name))
2841
+ : new Set(db.prepare(`PRAGMA table_info(document_review_comments)`).all().map((column) => column.name));
2842
+ const addCommentColumn = (name) => {
2843
+ const ifNotExists = db.provider === 'postgres' ? ' IF NOT EXISTS' : '';
2844
+ db.exec(`ALTER TABLE document_review_comments ADD COLUMN${ifNotExists} ${name} TEXT`);
2845
+ };
2846
+ if (!commentColumnNames.has('updated_by_actor_id')) {
2847
+ addCommentColumn('updated_by_actor_id');
2848
+ }
2849
+ if (!commentColumnNames.has('deleted_by_actor_id')) {
2850
+ addCommentColumn('deleted_by_actor_id');
2851
+ }
2852
+ if (!commentColumnNames.has('idempotency_key')) {
2853
+ addCommentColumn('idempotency_key');
2854
+ }
2855
+ if (!commentColumnNames.has('idempotency_fingerprint')) {
2856
+ addCommentColumn('idempotency_fingerprint');
2857
+ }
2858
+ if (!commentColumnNames.has('idempotency_actor_scope')) {
2859
+ const ifNotExists = db.provider === 'postgres' ? ' IF NOT EXISTS' : '';
2860
+ db.exec(`ALTER TABLE document_review_comments ADD COLUMN${ifNotExists} idempotency_actor_scope TEXT NOT NULL DEFAULT ''`);
2861
+ }
2862
+ db.exec(`
2863
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_document_review_comments_idempotency
2864
+ ON document_review_comments (
2865
+ tenant_id, workspace_id, idempotency_actor_scope, idempotency_key
2866
+ )
2867
+ `);
2868
+ if (!commentColumnNames.has('parent_comment_id')) {
2869
+ addCommentColumn('parent_comment_id');
2870
+ }
2871
+ if (!commentColumnNames.has('thread_status')) {
2872
+ addCommentColumn('thread_status');
2873
+ }
2874
+ if (!commentColumnNames.has('thread_status_updated_at')) {
2875
+ addCommentColumn('thread_status_updated_at');
2876
+ }
2877
+ if (!commentColumnNames.has('resolved_at')) {
2878
+ addCommentColumn('resolved_at');
2879
+ }
2880
+ if (!commentColumnNames.has('resolved_by_actor_id')) {
2881
+ addCommentColumn('resolved_by_actor_id');
2882
+ }
2883
+ db.exec(`
2884
+ UPDATE document_review_comments
2885
+ SET updated_by_actor_id = author_actor_id
2886
+ WHERE updated_by_actor_id IS NULL
2887
+ AND author_actor_id IS NOT NULL
2888
+ `);
2889
+ db.exec(`
2890
+ UPDATE document_review_comments
2891
+ SET thread_status = 'open',
2892
+ thread_status_updated_at = COALESCE(thread_status_updated_at, updated_at, created_at)
2893
+ WHERE parent_comment_id IS NULL
2894
+ AND (thread_status IS NULL OR thread_status = '')
2895
+ `);
2896
+ db.exec(`
2897
+ CREATE INDEX IF NOT EXISTS idx_document_review_comments_parent
2898
+ ON document_review_comments(tenant_id, workspace_id, session_id, parent_comment_id, deleted_at, order_index, created_at, id)
2899
+ `);
2900
+ const sessionRows = db.prepare(`
2901
+ SELECT
2902
+ id,
2903
+ tenant_id,
1085
2904
  workspace_id,
1086
2905
  comments_json
1087
2906
  FROM document_review_sessions
@@ -1104,11 +2923,13 @@ export function ensureDocumentReviewSessionsSchema(db) {
1104
2923
  body,
1105
2924
  anchor_json,
1106
2925
  author_actor_id,
2926
+ updated_by_actor_id,
2927
+ deleted_by_actor_id,
1107
2928
  order_index,
1108
2929
  created_at,
1109
2930
  updated_at,
1110
2931
  deleted_at
1111
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2932
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1112
2933
  `);
1113
2934
  for (const row of sessionRows) {
1114
2935
  const sessionId = String(row.id || '').trim();
@@ -1137,13 +2958,20 @@ export function ensureDocumentReviewSessionsSchema(db) {
1137
2958
  const anchorJson = record.anchor && typeof record.anchor === 'object' ? JSON.stringify(record.anchor) : null;
1138
2959
  const rawOrder = Number(record.order);
1139
2960
  const orderIndex = Number.isFinite(rawOrder) ? Math.max(0, Math.floor(rawOrder)) : index;
1140
- insertComment.run(commentId, sessionId, tenantId, workspaceId, body, anchorJson, String(record.authorActorId || '').trim() || null, orderIndex, createdAt, updatedAt, String(record.deletedAt || '').trim() || null);
2961
+ insertComment.run(commentId, sessionId, tenantId, workspaceId, body, anchorJson, String(record.authorActorId || '').trim() || null, String(record.updatedByActorId || record.authorActorId || '').trim() || null, String(record.deletedByActorId || '').trim() || null, orderIndex, createdAt, updatedAt, String(record.deletedAt || '').trim() || null);
1141
2962
  }
1142
2963
  }
1143
2964
  catch {
1144
2965
  continue;
1145
2966
  }
1146
2967
  }
2968
+ db.exec(`
2969
+ UPDATE document_review_comments
2970
+ SET thread_status = 'open',
2971
+ thread_status_updated_at = COALESCE(thread_status_updated_at, updated_at, created_at)
2972
+ WHERE parent_comment_id IS NULL
2973
+ AND (thread_status IS NULL OR thread_status = '')
2974
+ `);
1147
2975
  if (hasTable(db, 'workspace_memberships') && hasTable(db, 'users')) {
1148
2976
  const anonymousComments = db.prepare(`
1149
2977
  SELECT DISTINCT tenant_id, workspace_id