@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
@@ -2,91 +2,96 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import React from 'react';
3
3
  import { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';
4
4
  import { CSS } from '@dnd-kit/utilities';
5
- import { Bot, ChevronDown, ChevronLeft, ChevronRight, ClipboardList, Eye, EyeOff, Filter, Link2, Plus, Unlink, User, } from 'lucide-react';
5
+ import { ArrowUpDown, Archive, ChevronDown, ChevronLeft, ChevronRight, Eye, EyeOff, Filter, GripVertical, Kanban, Link2, Pencil, Plus, RotateCcw, Search, Star, Unlink, X, } from 'lucide-react';
6
6
  import styles from '../../../Taskforce.module.css';
7
7
  import panelStyles from './PlanningDrawer.module.css';
8
- import { ReferenceBadgeButton } from '../../ui/ReferenceBadgeButton';
9
8
  import { HierarchyActionBadge } from '../../ui/HierarchyActionBadge';
9
+ import { TaxonomyDropdown } from '../../ui/TaxonomyDropdown';
10
10
  import { DisclosureSectionHeader } from '../../ui/DisclosureSectionHeader';
11
- import { IconMap, getStatusDefinition, resolveColor } from '../../../utils/constants';
11
+ import { getStatusDefinition } from '../../../utils/constants';
12
12
  import { formatInitiativeReference, formatWorkstreamReference, } from '../../../utils/planningReferences.js';
13
- import { getEntityActivityItems } from '../../../utils/taskActivity';
14
- const DeferredEntityActivityTimeline = React.lazy(() => (import('../../activity/EntityActivityTimeline').then((module) => ({
15
- default: module.EntityActivityTimeline,
16
- }))));
17
- const DeferredContextAttachmentManager = React.lazy(() => (import('../../context/ContextAttachmentManager').then((module) => ({
18
- default: module.ContextAttachmentManager,
19
- }))));
20
- export const PLANNING_DRAWER_TREE_WIDTH_PX = 332;
13
+ import { resolvePlanningArchiveDetailState } from '../../../utils/planningArchivePresentation';
14
+ import { getTaskReferenceLabel, } from '../../../utils/taskReferences';
15
+ import { getPlanningFavoriteKey, } from '../../../utils/planningFavorites';
16
+ import { TASK_ASSIGNEE_UNASSIGNED_COLOR, TASK_ASSIGNEE_UNASSIGNED_ICON, } from '../../../utils/assignees';
17
+ import { PlanningEntityActivity, PlanningEntityContext, PlanningEntityDescription, } from '../../features/planning/PlanningEntityDetails';
18
+ import { PlanningEntitySummary, PlanningNoTasks, PlanningProgress, PlanningReferenceBadge, PlanningSummaryMeta, } from '../../features/planning/PlanningEntitySummary';
19
+ import { PlanningVisualIdentity } from '../../features/planning/PlanningVisualIdentity';
20
+ import { PlanningTaskCard } from '../../features/planning/PlanningTaskCard';
21
+ import { PlanningTaskArrangeControl } from '../../features/planning/PlanningTaskArrangeControl';
22
+ import planningDropdownStyles from '../../features/planning/PlanningDropdownControl.module.css';
23
+ import { PlanningTaskOrderList } from '../../features/planning/PlanningTaskOrderList';
24
+ import { arrangePlanningTasks, mergeVisiblePlanningTaskOrder, } from '../../features/planning/planningTaskArrangement';
25
+ import { PlanningArchiveConfirmation } from '../../features/planning/PlanningArchiveConfirmation';
26
+ import { PlanningUnlinkConfirmation, } from '../../features/planning/PlanningUnlinkConfirmation';
27
+ import { PlanningLinkPicker } from '../../features/planning/PlanningLinkPicker';
28
+ import { PlanningOwnerDropdown, normalizePlanningOwnerOptions, toPlanningAssigneeOption, } from '../../features/planning/PlanningOwnerDropdown';
29
+ import { buildPlanningNavigatorResults, matchesPlanningNavigatorItem, PLANNING_NAVIGATOR_SORT_OPTIONS, } from '../../features/planning/planningNavigator';
30
+ export { normalizePlanningOwnerOptions } from '../../features/planning/PlanningOwnerDropdown';
31
+ export const PLANNING_DRAWER_TREE_WIDTH_PX = 392;
21
32
  export const PLANNING_DRAWER_DETAIL_WIDTH_PX = 392;
22
33
  export const PLANNING_DRAWER_COLLAPSED_PANE_WIDTH_PX = 56;
34
+ export const PLANNING_DRAWER_WIDE_MIN_AVAILABLE_PX = 1280;
35
+ export const PLANNING_DRAWER_MEDIUM_MIN_AVAILABLE_PX = PLANNING_DRAWER_TREE_WIDTH_PX + PLANNING_DRAWER_DETAIL_WIDTH_PX;
36
+ export function resolvePlanningDrawerLayoutMode(viewportWidth, leftOffset = 0) {
37
+ const availableWidth = Math.max(0, viewportWidth - leftOffset);
38
+ if (availableWidth >= PLANNING_DRAWER_WIDE_MIN_AVAILABLE_PX)
39
+ return 'wide';
40
+ if (availableWidth >= PLANNING_DRAWER_MEDIUM_MIN_AVAILABLE_PX)
41
+ return 'medium';
42
+ return 'narrow';
43
+ }
44
+ function usePlanningDrawerViewport(leftOffset) {
45
+ const readViewportWidth = React.useCallback(() => (typeof window === 'undefined' ? PLANNING_DRAWER_WIDE_MIN_AVAILABLE_PX + leftOffset : window.innerWidth), [leftOffset]);
46
+ const [viewportWidth, setViewportWidth] = React.useState(readViewportWidth);
47
+ React.useEffect(() => {
48
+ const handleResize = () => setViewportWidth(readViewportWidth());
49
+ handleResize();
50
+ window.addEventListener('resize', handleResize);
51
+ return () => window.removeEventListener('resize', handleResize);
52
+ }, [readViewportWidth]);
53
+ return {
54
+ viewportWidth,
55
+ availableWidth: Math.max(0, viewportWidth - leftOffset),
56
+ layoutMode: resolvePlanningDrawerLayoutMode(viewportWidth, leftOffset),
57
+ };
58
+ }
23
59
  export function getPlanningDrawerWidthPx(treeCollapsed, hasPrimaryPane, primaryCollapsed, hasSecondaryPane, secondaryCollapsed) {
24
60
  return (treeCollapsed ? PLANNING_DRAWER_COLLAPSED_PANE_WIDTH_PX : PLANNING_DRAWER_TREE_WIDTH_PX)
25
61
  + (hasPrimaryPane ? (primaryCollapsed ? PLANNING_DRAWER_COLLAPSED_PANE_WIDTH_PX : PLANNING_DRAWER_DETAIL_WIDTH_PX) : 0)
26
62
  + (hasSecondaryPane ? (secondaryCollapsed ? PLANNING_DRAWER_COLLAPSED_PANE_WIDTH_PX : PLANNING_DRAWER_DETAIL_WIDTH_PX) : 0);
27
63
  }
28
- export function normalizePlanningOwnerOptions(options, selectedValue) {
29
- const selected = String(selectedValue || '').trim();
30
- const byIdentity = new Map();
31
- for (const option of options) {
32
- const value = String(option?.value || '').trim();
33
- if (!value || value === 'unassigned')
34
- continue;
35
- if (typeof option.archivedAt === 'string' && option.archivedAt.trim().length > 0)
36
- continue;
37
- const label = String(option.label || value).trim() || value;
38
- const kind = String(option.kind || '').trim().toLowerCase();
39
- const username = String(option.username || '').trim().toLowerCase();
40
- const identity = kind === 'agent'
41
- ? `agent:${username || label.toLowerCase()}`
42
- : `value:${value}`;
43
- if (!byIdentity.has(identity) || value === selected) {
44
- byIdentity.set(identity, { ...option, value, label });
45
- }
46
- }
47
- return Array.from(byIdentity.values()).sort((left, right) => (left.label.localeCompare(right.label, undefined, { sensitivity: 'base' })));
48
- }
49
- function formatTaskStatusLabel(status) {
50
- if (!status)
51
- return 'No status';
52
- return status
53
- .split(/[-_\s]+/g)
54
- .filter(Boolean)
55
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
56
- .join(' ');
64
+ function ArchiveVisibilityToggle({ visible, disabled, disabledLabel, itemLabel, onToggle, }) {
65
+ const actionLabel = visible ? `Hide archived ${itemLabel}` : `Show archived ${itemLabel}`;
66
+ const label = disabled ? (disabledLabel || `No archived ${itemLabel}`) : actionLabel;
67
+ return (_jsx("button", { type: "button", className: `tf-control-icon ${panelStyles.archiveVisibilityToggle} ${visible ? panelStyles.toggleActive : ''}`.trim(), title: label, "aria-label": label, "aria-pressed": visible, disabled: disabled, onClick: onToggle, children: visible ? _jsx(EyeOff, { size: 15, "aria-hidden": "true" }) : _jsx(Eye, { size: 15, "aria-hidden": "true" }) }));
57
68
  }
58
- function PlanningReferenceBadge({ label, entityType, interactive = true, }) {
59
- const [copied, setCopied] = React.useState(false);
60
- const handleClick = React.useCallback(async (event) => {
61
- event.stopPropagation();
62
- try {
63
- await navigator.clipboard.writeText(label);
64
- setCopied(true);
65
- window.setTimeout(() => setCopied(false), 1200);
66
- }
67
- catch {
68
- setCopied(false);
69
- }
70
- }, [label]);
71
- if (!interactive) {
72
- return (_jsx("span", { className: `${styles.taskIdBadge} ${panelStyles.referenceBadgeStatic}`.trim(), children: _jsx("span", { children: label }) }));
69
+ function countArchivedDetailChildren(detail) {
70
+ if (detail.type === 'initiative') {
71
+ return (detail.item.allWorkstreams || detail.item.workstreams)
72
+ .filter((workstream) => Boolean(workstream.isArchived)).length;
73
73
  }
74
- return (_jsx(ReferenceBadgeButton, { copied: copied, label: label, onClick: handleClick, title: `Copy ${entityType} reference`, ariaLabel: copied ? `Copied ${entityType} reference` : `Copy ${entityType} reference`, className: panelStyles.referenceBadgeButton, children: label }));
74
+ return (detail.item.tasks || []).filter((task) => Boolean(task.isArchived)).length;
75
75
  }
76
- function PlanningRow({ rowId, rowType, referenceLabel, title, meta, active, detailOpen = false, canExpand = false, expanded = false, onToggleExpand, onToggleScope, onToggleDetails, }) {
76
+ function PlanningRow({ rowId, rowType, referenceLabel, item, ownerOption, ownerOptions, workstreamCount, active, isArchived = false, detailOpen = false, canExpand = false, expanded = false, controlsId, onToggleExpand, onToggleScope, onOpenDetails, onChangeOwner, onChangeIdentity, initiativeLinkOptions = [], onLinkInitiative, favorite, favoriteReady, onToggleFavorite, onArchiveReady, hierarchyInteractions = true, }) {
77
+ const { title } = item;
78
+ const [archiveConfirmationVisible, setArchiveConfirmationVisible] = React.useState(false);
79
+ const [archiveBusy, setArchiveBusy] = React.useState(false);
80
+ const [initiativeLinkBusy, setInitiativeLinkBusy] = React.useState(false);
77
81
  const { active: dndActive } = useDndContext();
78
82
  const dragType = String(dndActive?.data?.current?.type || '');
79
- const canDropTask = rowType === 'workstream' && dragType === 'task-card';
80
- const canDropWorkstream = rowType === 'initiative' && dragType === 'planning-workstream';
83
+ const canDropTask = hierarchyInteractions && rowType === 'workstream' && dragType === 'task-card';
84
+ const canDropWorkstream = hierarchyInteractions && rowType === 'initiative' && dragType === 'planning-workstream';
81
85
  const droppableType = rowType === 'workstream' ? 'planning-workstream-target' : 'planning-initiative-target';
82
86
  const { setNodeRef: setDropRef, isOver, } = useDroppable({
83
87
  id: `${droppableType}:${rowId}`,
84
88
  data: rowType === 'workstream'
85
89
  ? { type: droppableType, workstreamId: rowId }
86
90
  : { type: droppableType, initiativeId: rowId },
91
+ disabled: !hierarchyInteractions,
87
92
  });
88
- const draggable = rowType === 'workstream';
89
- const { attributes, listeners, setNodeRef: setDragRef, transform, isDragging, } = useDraggable({
93
+ const draggable = hierarchyInteractions && rowType === 'workstream';
94
+ const { attributes, listeners, setNodeRef: setDragRef, setActivatorNodeRef, transform, isDragging, } = useDraggable({
90
95
  id: `planning-workstream:${rowId}`,
91
96
  data: { type: 'planning-workstream', workstreamId: rowId },
92
97
  disabled: !draggable,
@@ -95,79 +100,438 @@ function PlanningRow({ rowId, rowType, referenceLabel, title, meta, active, deta
95
100
  ? { transform: CSS.Translate.toString(transform) }
96
101
  : undefined;
97
102
  const showDropReady = canDropTask || canDropWorkstream;
98
- return (_jsxs("div", { ref: setDropRef, style: dragStyle, className: `${panelStyles.treeRow} ${detailOpen ? panelStyles.treeRowDetailOpen : ''} ${showDropReady ? panelStyles.treeRowDropReady : ''} ${isOver ? panelStyles.treeRowDropActive : ''} ${isDragging ? panelStyles.treeRowDragging : ''} ${showDropReady ? panelStyles.treeRowDropMode : ''}`, children: [canExpand ? (_jsx("button", { type: "button", className: panelStyles.treeChevron, onClick: onToggleExpand, title: expanded ? 'Collapse workstreams' : 'Expand workstreams', children: expanded ? _jsx(ChevronDown, { size: 15 }) : _jsx(ChevronRight, { size: 15 }) })) : (_jsx("span", { className: `${panelStyles.treeChevron} ${panelStyles.treeChevronPlaceholder}`, "aria-hidden": "true" })), _jsxs("div", { className: panelStyles.rowContent, children: [_jsxs("div", { className: panelStyles.rowTopRow, children: [referenceLabel ? (_jsx(PlanningReferenceBadge, { label: referenceLabel, entityType: rowType })) : _jsx("span", { "aria-hidden": "true" }), _jsx("button", { type: "button", className: `${panelStyles.detailsButton} ${active ? panelStyles.detailsButtonActive : ''}`, onClick: onToggleScope, title: active ? 'Clear board scope' : 'Scope board to this item', children: _jsx(Filter, { size: 14 }) })] }), _jsxs("button", { type: "button", ref: draggable ? setDragRef : undefined, className: panelStyles.rowButton, onClick: onToggleDetails, ...(draggable ? attributes : {}), ...(draggable ? listeners : {}), children: [_jsx("span", { className: panelStyles.rowTitle, children: title }), _jsx("span", { className: panelStyles.rowMeta, children: meta })] })] })] }));
103
+ const childType = rowType === 'initiative' ? 'workstreams' : 'tasks';
104
+ const expansionEnabled = canExpand && Boolean(onToggleExpand);
105
+ const expansionLabel = !canExpand
106
+ ? `No ${childType} for ${title}`
107
+ : `${expanded ? 'Collapse' : 'Expand'} ${childType} for ${title}`;
108
+ const archiveActionVisible = Boolean(item.archiveReady && !isArchived && onArchiveReady);
109
+ const rowActionRefs = React.useRef({});
110
+ const [activeRowActionId, setActiveRowActionId] = React.useState('favorite');
111
+ const enabledRowActionIds = React.useMemo(() => [
112
+ ...(favoriteReady ? ['favorite'] : []),
113
+ ...(archiveActionVisible ? ['archive'] : []),
114
+ 'scope',
115
+ ...(expansionEnabled ? ['disclosure'] : []),
116
+ ], [archiveActionVisible, expansionEnabled, favoriteReady]);
117
+ const effectiveActiveRowActionId = enabledRowActionIds.includes(activeRowActionId)
118
+ ? activeRowActionId
119
+ : enabledRowActionIds[0];
120
+ React.useEffect(() => {
121
+ if (effectiveActiveRowActionId && effectiveActiveRowActionId !== activeRowActionId) {
122
+ setActiveRowActionId(effectiveActiveRowActionId);
123
+ }
124
+ }, [activeRowActionId, effectiveActiveRowActionId]);
125
+ const handleRowActionFocus = React.useCallback((actionId) => {
126
+ setActiveRowActionId(actionId);
127
+ }, []);
128
+ const handleRowActionKeyDown = React.useCallback((event) => {
129
+ if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key))
130
+ return;
131
+ const actionButton = event.target.closest('[data-planning-row-action]');
132
+ const currentActionId = actionButton?.dataset.planningRowAction;
133
+ if (!currentActionId || !enabledRowActionIds.includes(currentActionId))
134
+ return;
135
+ event.preventDefault();
136
+ const currentIndex = enabledRowActionIds.indexOf(currentActionId);
137
+ const nextIndex = event.key === 'Home'
138
+ ? 0
139
+ : event.key === 'End'
140
+ ? enabledRowActionIds.length - 1
141
+ : event.key === 'ArrowRight'
142
+ ? (currentIndex + 1) % enabledRowActionIds.length
143
+ : (currentIndex - 1 + enabledRowActionIds.length) % enabledRowActionIds.length;
144
+ const nextActionId = enabledRowActionIds[nextIndex];
145
+ setActiveRowActionId(nextActionId);
146
+ rowActionRefs.current[nextActionId]?.focus();
147
+ }, [enabledRowActionIds]);
148
+ const handleConfirmArchive = async () => {
149
+ if (!onArchiveReady || archiveBusy)
150
+ return;
151
+ setArchiveBusy(true);
152
+ try {
153
+ const archived = await onArchiveReady();
154
+ if (archived)
155
+ setArchiveConfirmationVisible(false);
156
+ }
157
+ finally {
158
+ setArchiveBusy(false);
159
+ }
160
+ };
161
+ const handleLinkInitiative = async (option) => {
162
+ if (!onLinkInitiative || initiativeLinkBusy)
163
+ return;
164
+ setInitiativeLinkBusy(true);
165
+ try {
166
+ await onLinkInitiative(option);
167
+ }
168
+ finally {
169
+ setInitiativeLinkBusy(false);
170
+ }
171
+ };
172
+ const canLinkInitiative = rowType === 'workstream' && Boolean(onLinkInitiative);
173
+ const initiativeLinkDisabled = isArchived || initiativeLinkBusy || initiativeLinkOptions.length === 0;
174
+ const initiativeLinkTitle = isArchived
175
+ ? 'Unarchive this workstream before linking an initiative'
176
+ : initiativeLinkOptions.length === 0
177
+ ? 'No initiatives available'
178
+ : 'Link initiative';
179
+ return (_jsxs("div", { ref: setDragRef, style: dragStyle, className: `${panelStyles.treeRowShell} ${draggable ? panelStyles.treeRowShellDraggable : ''} ${isDragging ? panelStyles.treeRowDragging : ''} ${showDropReady ? panelStyles.treeRowShellDropMode : ''}`.trim(), "data-planning-draggable-row": draggable || undefined, children: [draggable ? (_jsx("div", { className: panelStyles.rowDragGutter, "data-planning-drag-gutter": "true", children: _jsx("button", { type: "button", ref: setActivatorNodeRef, className: panelStyles.dragHandle, title: "Drag onto an initiative to move this workstream", "aria-label": `Move workstream ${title} to an initiative`, "data-planning-drag-handle": "true", ...attributes, ...listeners, children: _jsx(GripVertical, { size: 15, "aria-hidden": "true" }) }) })) : null, _jsx("div", { ref: setDropRef, className: `${panelStyles.treeRow} ${isArchived ? panelStyles.treeRowArchived : ''} ${detailOpen ? panelStyles.treeRowDetailOpen : ''} ${showDropReady ? panelStyles.treeRowDropReady : ''} ${isOver ? panelStyles.treeRowDropActive : ''} ${showDropReady ? panelStyles.treeRowDropMode : ''}`, "data-board-scoped": active || undefined, children: _jsxs("div", { className: panelStyles.rowContent, children: [_jsxs("div", { className: panelStyles.rowTopRow, children: [_jsxs("div", { className: panelStyles.rowReferenceActions, children: [canLinkInitiative ? (_jsx(PlanningLinkPicker, { options: initiativeLinkOptions, entityLabel: "initiative", onSelect: (option) => void handleLinkInitiative(option), disabled: initiativeLinkDisabled, iconTrigger: true, triggerTitle: initiativeLinkTitle })) : null, _jsx(PlanningReferenceBadge, { label: referenceLabel || 'Reference pending', entityType: rowType, entityName: title, pending: !referenceLabel })] }), _jsxs("div", { className: panelStyles.rowActions, role: "toolbar", "aria-label": `${rowType === 'initiative' ? 'Initiative' : 'Workstream'} actions for ${title}`, "aria-orientation": "horizontal", onKeyDown: handleRowActionKeyDown, children: [_jsx("button", { type: "button", ref: (node) => {
180
+ rowActionRefs.current.favorite = node;
181
+ }, className: `tf-control-icon tf-control-icon-compact ${panelStyles.favoriteButton} ${favorite ? 'tf-control-icon-active' : ''}`.trim(), onClick: onToggleFavorite, onFocus: () => handleRowActionFocus('favorite'), disabled: !favoriteReady, tabIndex: effectiveActiveRowActionId === 'favorite' ? 0 : -1, "data-planning-row-action": "favorite", title: !favoriteReady
182
+ ? 'Loading Favorites'
183
+ : favorite ? `Remove ${rowType} from Favorites` : `Add ${rowType} to Favorites`, "aria-label": !favoriteReady
184
+ ? `Loading Favorites for ${rowType} ${title}`
185
+ : favorite ? `Remove ${rowType} ${title} from Favorites` : `Add ${rowType} ${title} to Favorites`, "aria-pressed": favorite, children: _jsx(Star, { size: 14, fill: favorite ? 'currentColor' : 'none', "aria-hidden": "true" }) }), archiveActionVisible ? (_jsx("button", { type: "button", ref: (node) => {
186
+ rowActionRefs.current.archive = node;
187
+ }, className: "tf-control-icon tf-control-icon-compact", onClick: () => setArchiveConfirmationVisible(true), onFocus: () => handleRowActionFocus('archive'), tabIndex: effectiveActiveRowActionId === 'archive' ? 0 : -1, "data-planning-row-action": "archive", title: `Archive completed ${rowType}`, "aria-label": `Archive completed ${rowType} ${title}`, "aria-expanded": archiveConfirmationVisible, children: _jsx(Archive, { size: 14, "aria-hidden": "true" }) })) : null, _jsx("button", { type: "button", ref: (node) => {
188
+ rowActionRefs.current.scope = node;
189
+ }, className: `tf-control-icon tf-control-icon-compact ${panelStyles.scopeButton} ${active ? 'tf-control-icon-active' : ''}`.trim(), onClick: onToggleScope, onFocus: () => handleRowActionFocus('scope'), tabIndex: effectiveActiveRowActionId === 'scope' ? 0 : -1, "data-planning-row-action": "scope", title: active ? 'Clear board scope' : 'Scope board to this item', "aria-label": active ? `Clear board scope for ${title}` : `Scope board to ${title}`, "aria-pressed": active, children: _jsx(Kanban, { size: 14, "aria-hidden": "true" }) }), _jsx("button", { type: "button", ref: (node) => {
190
+ rowActionRefs.current.disclosure = node;
191
+ }, className: `tf-control-icon tf-control-icon-compact ${panelStyles.treeChevron}`.trim(), onClick: expansionEnabled ? onToggleExpand : undefined, onFocus: () => handleRowActionFocus('disclosure'), tabIndex: effectiveActiveRowActionId === 'disclosure' ? 0 : -1, "data-planning-row-action": "disclosure", title: expansionLabel, "aria-label": expansionLabel, "aria-expanded": expansionEnabled ? expanded : false, "aria-controls": expansionEnabled && expanded ? controlsId : undefined, disabled: !expansionEnabled, children: expanded && expansionEnabled
192
+ ? _jsx(ChevronDown, { size: 14, "aria-hidden": "true" })
193
+ : _jsx(ChevronRight, { size: 14, "aria-hidden": "true" }) })] })] }), _jsx("div", { className: panelStyles.rowBody, children: _jsx("div", { role: "button", tabIndex: 0, className: panelStyles.rowButton, onClick: onOpenDetails, onKeyDown: (event) => {
194
+ if (event.key !== 'Enter' && event.key !== ' ')
195
+ return;
196
+ event.preventDefault();
197
+ onOpenDetails();
198
+ }, "aria-label": `View ${rowType} details for ${title}`, "aria-pressed": detailOpen, children: _jsx(PlanningEntitySummary, { item: item, entityType: rowType, workstreamCount: workstreamCount, ownerOption: ownerOption ? toPlanningAssigneeOption(ownerOption) : undefined, ownerOptions: ownerOptions.map(toPlanningAssigneeOption), onChangeOwner: onChangeOwner, onChangeIdentity: onChangeIdentity }) }) }), archiveConfirmationVisible ? (_jsx(PlanningArchiveConfirmation, { entityType: rowType, title: title, activeTaskCount: item.archiveActiveTaskCount, activeWorkstreamCount: item.archiveActiveWorkstreamCount, busy: archiveBusy, onCancel: () => setArchiveConfirmationVisible(false), onConfirm: () => void handleConfirmArchive() })) : null] }) })] }));
99
199
  }
100
- function CollapsedPane({ label, onExpand, }) {
101
- return (_jsx("div", { className: `${panelStyles.paneShell} ${panelStyles.collapsedPaneShell}`.trim(), children: _jsxs("div", { className: panelStyles.collapsedPaneHeader, children: [_jsx("button", { type: "button", className: "tf-control-icon", onClick: onExpand, title: `Expand ${label}`, children: _jsx(ChevronRight, { size: 16 }) }), _jsx("span", { className: panelStyles.collapsedPaneLabel, children: label })] }) }));
200
+ function PlanningTreeTaskCard({ task, assigneeOption, assigneeOptions, showTaskCardStatusLabel, onOpenTaskById, onChangeTaskAssignee, onSetTaskStatus, onArchivePlanningTask, }) {
201
+ const [archiveBusy, setArchiveBusy] = React.useState(false);
202
+ const status = getStatusDefinition(task.status).value;
203
+ const canArchive = !task.isArchived
204
+ && (status === 'done' || status === 'cancelled')
205
+ && Boolean(onArchivePlanningTask);
206
+ return (_jsx("div", { className: `${panelStyles.listItemButton} ${panelStyles.detailCardButton}`.trim(), children: _jsx(PlanningTaskCard, { task: task, assigneeOption: assigneeOption ? toPlanningAssigneeOption(assigneeOption) : undefined, assigneeOptions: assigneeOptions.map(toPlanningAssigneeOption), showStatusLabel: showTaskCardStatusLabel, onOpen: onOpenTaskById ? () => onOpenTaskById(task.id) : undefined, onAssigneeChange: onChangeTaskAssignee
207
+ ? (assignee) => onChangeTaskAssignee(task.id, assignee)
208
+ : undefined, onStatusChange: onSetTaskStatus ? (status) => onSetTaskStatus(task.id, status) : undefined, actions: canArchive ? (_jsx("button", { type: "button", className: "tf-control-icon tf-control-icon-compact", disabled: archiveBusy, onClick: async (event) => {
209
+ event.stopPropagation();
210
+ setArchiveBusy(true);
211
+ try {
212
+ await onArchivePlanningTask?.(task.id);
213
+ }
214
+ finally {
215
+ setArchiveBusy(false);
216
+ }
217
+ }, title: "Archive task", "aria-label": `Archive task ${getTaskReferenceLabel(task) || task.title}`, children: _jsx(Archive, { size: 14, "aria-hidden": "true" }) })) : undefined, compact: true }) }));
102
218
  }
103
- function DeferredPlanningPanelFallback() {
104
- return (_jsxs("div", { className: panelStyles.deferredPanelFallback, "aria-hidden": "true", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] }));
219
+ function CollapsedPane({ label, onExpand, muted = false, }) {
220
+ return (_jsx("div", { className: `${panelStyles.paneShell} ${panelStyles.collapsedPaneShell} ${muted ? panelStyles.collapsedPaneMuted : ''}`.trim(), "data-relationship-state": muted ? 'missing' : undefined, children: _jsxs("div", { className: panelStyles.collapsedPaneHeader, children: [_jsx("button", { type: "button", className: "tf-control-icon", onClick: onExpand, title: `Expand ${label}`, "aria-label": `Expand ${label} pane`, children: _jsx(ChevronRight, { size: 16, "aria-hidden": "true" }) }), _jsx("span", { className: panelStyles.collapsedPaneLabel, children: label })] }) }));
105
221
  }
106
- function PlanningDrawerList({ initiatives, standaloneWorkstreams, allStandaloneWorkstreams = standaloneWorkstreams, activeInitiativeId, activeWorkstreamId, expandedInitiativeIds, detail, secondaryPane, onCreateInitiative, onCreateWorkstream, onToggleInitiative, onSelectInitiative, onSelectWorkstream, onOpenInitiativeDetails, onOpenWorkstreamDetails, }) {
107
- const [showArchivedTrayWorkstreams, setShowArchivedTrayWorkstreams] = React.useState(false);
108
- const getInitiativeTreeWorkstreams = React.useCallback((initiative) => {
109
- if (!showArchivedTrayWorkstreams)
110
- return initiative.workstreams;
111
- const visibleIds = new Set(initiative.workstreams.map((workstream) => workstream.id));
112
- const archivedWorkstreams = (initiative.allWorkstreams || [])
113
- .filter((workstream) => Boolean(workstream.isArchived) && !visibleIds.has(workstream.id));
114
- return [...initiative.workstreams, ...archivedWorkstreams];
115
- }, [showArchivedTrayWorkstreams]);
116
- const standaloneTreeWorkstreams = React.useMemo(() => {
117
- if (!showArchivedTrayWorkstreams)
118
- return standaloneWorkstreams;
119
- const visibleIds = new Set(standaloneWorkstreams.map((workstream) => workstream.id));
120
- const archivedWorkstreams = allStandaloneWorkstreams
121
- .filter((workstream) => Boolean(workstream.isArchived) && !visibleIds.has(workstream.id));
122
- return [...standaloneWorkstreams, ...archivedWorkstreams];
123
- }, [allStandaloneWorkstreams, showArchivedTrayWorkstreams, standaloneWorkstreams]);
124
- const archivedTrayWorkstreamCount = React.useMemo(() => {
125
- const initiativeArchivedCount = initiatives.reduce((count, initiative) => (count + (initiative.allWorkstreams || []).filter((workstream) => Boolean(workstream.isArchived)).length), 0);
126
- const standaloneArchivedCount = allStandaloneWorkstreams
127
- .filter((workstream) => Boolean(workstream.isArchived)).length;
128
- return initiativeArchivedCount + standaloneArchivedCount;
129
- }, [allStandaloneWorkstreams, initiatives]);
130
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: panelStyles.sectionGroup, children: [_jsxs("div", { className: panelStyles.sectionHeaderRow, children: [_jsx("div", { className: panelStyles.sectionTitle, children: "Initiatives" }), _jsxs("div", { className: panelStyles.headerActionGroup, children: [archivedTrayWorkstreamCount > 0 ? (_jsx("button", { type: "button", className: `tf-control-icon ${showArchivedTrayWorkstreams ? panelStyles.toggleActive : ''}`.trim(), title: showArchivedTrayWorkstreams ? 'Hide archived workstreams in tray' : 'Show archived workstreams in tray', "aria-label": showArchivedTrayWorkstreams ? 'Hide archived workstreams in tray' : 'Show archived workstreams in tray', "aria-pressed": showArchivedTrayWorkstreams, onClick: () => setShowArchivedTrayWorkstreams((current) => !current), children: showArchivedTrayWorkstreams ? _jsx(EyeOff, { size: 15 }) : _jsx(Eye, { size: 15 }) })) : null, _jsx("button", { type: "button", className: "tf-control-icon", title: "Create initiative", "aria-label": "Create initiative", onClick: onCreateInitiative, children: _jsx(Plus, { size: 15 }) })] })] }), _jsx("div", { className: panelStyles.treeList, children: initiatives.length === 0 ? (_jsxs("div", { className: panelStyles.emptyPanel, children: [_jsx("div", { className: panelStyles.emptyPanelTitle, children: "No initiatives yet" }), _jsxs("div", { className: panelStyles.emptyPanelText, children: ["Initiatives give larger efforts a clear home without crowding the task board. Use the ", _jsx("code", { children: "+" }), " action above to create the first one."] })] })) : initiatives.map((initiative) => {
131
- const expanded = expandedInitiativeIds.has(initiative.id);
132
- const treeWorkstreams = getInitiativeTreeWorkstreams(initiative);
133
- const activeWorkstreamCount = initiative.workstreamCount || 0;
134
- const archivedWorkstreamCount = treeWorkstreams.filter((workstream) => Boolean(workstream.isArchived)).length;
135
- const workstreamMeta = showArchivedTrayWorkstreams && archivedWorkstreamCount > 0
136
- ? `${activeWorkstreamCount} workstreams + ${archivedWorkstreamCount} archived`
137
- : `${activeWorkstreamCount} workstreams`;
138
- const meta = `${workstreamMeta} • ${initiative.taskCount} tasks${initiative.isArchived ? ' • archived' : ''}`;
139
- return (_jsxs("div", { children: [_jsx(PlanningRow, { rowId: initiative.id, rowType: "initiative", referenceLabel: formatInitiativeReference(initiative), title: initiative.title, meta: meta, active: activeInitiativeId === initiative.id && !activeWorkstreamId, detailOpen: detail?.type === 'initiative' && detail.item.id === initiative.id, canExpand: treeWorkstreams.length > 0, expanded: expanded, onToggleExpand: () => onToggleInitiative(initiative.id), onToggleScope: () => onSelectInitiative(initiative.id), onToggleDetails: () => {
140
- if (detail?.type === 'initiative' && detail.item.id === initiative.id) {
141
- onOpenInitiativeDetails('');
142
- return;
143
- }
144
- onOpenInitiativeDetails(initiative.id);
145
- } }), expanded && treeWorkstreams.length > 0 && (_jsx("div", { className: panelStyles.treeChildren, children: treeWorkstreams.map((workstream) => (_jsx(PlanningRow, { rowId: workstream.id, rowType: "workstream", referenceLabel: formatWorkstreamReference(workstream), title: workstream.title, meta: `${workstream.taskCount} tasks • ${workstream.progressPercent}% complete${workstream.isArchived ? ' • archived' : ''}`, active: activeWorkstreamId === workstream.id, detailOpen: (detail?.type === 'workstream' && detail.item.id === workstream.id)
146
- || (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === workstream.id), onToggleScope: () => onSelectWorkstream(workstream.id, initiative.id), onToggleDetails: () => {
147
- if (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === workstream.id) {
148
- onOpenWorkstreamDetails('');
149
- return;
150
- }
151
- if (detail?.type === 'workstream' && detail.item.id === workstream.id) {
152
- onOpenWorkstreamDetails('');
153
- return;
154
- }
155
- onOpenWorkstreamDetails(workstream.id);
156
- } }, workstream.id))) }))] }, initiative.id));
157
- }) })] }), _jsxs("div", { className: panelStyles.sectionGroup, children: [_jsxs("div", { className: panelStyles.sectionHeaderRow, children: [_jsx("div", { className: panelStyles.sectionTitle, children: "Workstreams" }), _jsx("button", { type: "button", className: "tf-control-icon", title: "Create workstream", "aria-label": "Create workstream", onClick: onCreateWorkstream, children: _jsx(Plus, { size: 15 }) })] }), _jsx("div", { className: panelStyles.treeList, children: standaloneTreeWorkstreams.length === 0 ? (_jsxs("div", { className: panelStyles.emptyPanel, children: [_jsx("div", { className: panelStyles.emptyPanelTitle, children: "No standalone workstreams yet" }), _jsxs("div", { className: panelStyles.emptyPanelText, children: ["Smaller projects can still use workstreams without needing initiative-level structure. Use the ", _jsx("code", { children: "+" }), " action above to add one."] })] })) : standaloneTreeWorkstreams.map((workstream) => (_jsx(PlanningRow, { rowId: workstream.id, rowType: "workstream", referenceLabel: formatWorkstreamReference(workstream), title: workstream.title, meta: `${workstream.taskCount} tasks • ${workstream.progressPercent}% complete${workstream.isArchived ? ' • archived' : ''}`, active: activeWorkstreamId === workstream.id, detailOpen: (detail?.type === 'workstream' && detail.item.id === workstream.id)
158
- || (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === workstream.id), onToggleScope: () => onSelectWorkstream(workstream.id, null), onToggleDetails: () => {
159
- if (detail?.type === 'workstream' && detail.item.id === workstream.id) {
160
- onOpenWorkstreamDetails('');
161
- return;
162
- }
163
- onOpenWorkstreamDetails(workstream.id);
164
- } }, workstream.id))) })] })] }));
222
+ function RelationshipPane({ label, title, description, onCollapse, action, paneRef, }) {
223
+ const isEmptyState = !description && !action;
224
+ return (_jsxs("div", { ref: paneRef, "data-planning-pane": `${label.toLowerCase()}-relationship`, className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.detailPane}`.trim(), style: {
225
+ flex: `0 0 ${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
226
+ width: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
227
+ minWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
228
+ maxWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
229
+ }, children: [_jsxs("div", { className: panelStyles.paneHeader, children: [_jsx("h2", { className: panelStyles.paneHeaderLabel, tabIndex: -1, "data-planning-pane-heading": true, children: label }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapse, "aria-label": `Collapse ${label} pane`, title: `Collapse ${label} pane`, children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })] }), _jsx("div", { className: `${panelStyles.paneContent} ${isEmptyState ? panelStyles.relationshipPaneContentEmpty : ''}`.trim(), children: _jsxs("div", { className: `${panelStyles.relationshipState} ${isEmptyState ? panelStyles.relationshipStateEmpty : ''}`.trim(), "data-relationship-display": isEmptyState ? 'empty' : 'detail', children: [_jsx("span", { className: panelStyles.relationshipStateTitle, children: title }), description ? _jsx("p", { className: panelStyles.relationshipStateText, children: description }) : null, action ? (_jsx("button", { type: "button", className: "tf-button-secondary tf-button-compact", onClick: action.onClick, children: action.label })) : null] }) })] }));
230
+ }
231
+ function PlanningDrawerList({ initiatives, standaloneWorkstreams, planningLoadState, taskScope, showArchivedPlanning, currentOwnerId, assigneeOptions, showTaskCardStatusLabel = false, taskArrangeMode = 'execution', activeInitiativeId, activeWorkstreamId, navigatorSort, navigatorSortReady, onNavigatorSortChange, planningFavorites, onTogglePlanningFavorite, favoritesSectionCollapsed, initiativesSectionCollapsed, workstreamsSectionCollapsed, onToggleFavoritesSection, onToggleInitiativesSection, onToggleWorkstreamsSection, expandedInitiativeIds, detail, secondaryPane, onCreateInitiative, onCreateWorkstream, onToggleInitiative, onSelectInitiative, onSelectWorkstream, onOpenInitiativeDetails, onOpenWorkstreamDetails, onOpenNestedWorkstreamDetails, onOpenTaskById, onSetTaskStatus, onChangePlanningOwner, onChangePlanningIdentity = () => { }, onChangeTaskAssignee, onArchivePlanningTask, onArchiveResolvedWorkstream, onArchiveResolvedInitiative, linkOptions, onAssignInitiativeToWorkstream, onRetryPlanning, }) {
232
+ const [searchQuery, setSearchQuery] = React.useState('');
233
+ const [ownerFilter, setOwnerFilter] = React.useState('all');
234
+ const [filtersExpanded, setFiltersExpanded] = React.useState(false);
235
+ const [expandedWorkstreamIds, setExpandedWorkstreamIds] = React.useState(() => new Set());
236
+ const [expandedFavoriteBranchKeys, setExpandedFavoriteBranchKeys] = React.useState(() => new Set());
237
+ const assigneeOptionByValue = React.useMemo(() => new Map(assigneeOptions
238
+ .filter((option) => !String(option.archivedAt || '').trim())
239
+ .map((option) => [String(option.value || '').trim(), option])), [assigneeOptions]);
240
+ const ownerFilterLeadingOptions = React.useMemo(() => {
241
+ const normalizedCurrentOwnerId = String(currentOwnerId || '').trim();
242
+ const currentOwnerOption = normalizedCurrentOwnerId
243
+ ? normalizePlanningOwnerOptions(assigneeOptions, normalizedCurrentOwnerId)
244
+ .find((option) => option.value === normalizedCurrentOwnerId)
245
+ : undefined;
246
+ return [
247
+ {
248
+ value: 'all',
249
+ label: 'All owners',
250
+ icon: 'Users',
251
+ color: 'var(--text-secondary)',
252
+ kind: 'unassigned',
253
+ },
254
+ ...(normalizedCurrentOwnerId ? [{
255
+ ...currentOwnerOption,
256
+ value: 'mine',
257
+ label: 'Owned by me',
258
+ icon: currentOwnerOption?.icon || 'User',
259
+ color: currentOwnerOption?.color || 'var(--text-secondary)',
260
+ kind: currentOwnerOption?.kind || 'member',
261
+ }] : []),
262
+ {
263
+ value: 'unassigned',
264
+ label: 'Unassigned',
265
+ icon: TASK_ASSIGNEE_UNASSIGNED_ICON,
266
+ color: TASK_ASSIGNEE_UNASSIGNED_COLOR,
267
+ kind: 'unassigned',
268
+ },
269
+ ];
270
+ }, [assigneeOptions, currentOwnerId]);
271
+ const navigatorResults = React.useMemo(() => buildPlanningNavigatorResults({
272
+ initiatives,
273
+ standaloneWorkstreams,
274
+ showArchivedPlanning,
275
+ searchQuery,
276
+ ownerFilter,
277
+ currentOwnerId: String(currentOwnerId || ''),
278
+ sort: navigatorSort,
279
+ }), [currentOwnerId, initiatives, navigatorSort, ownerFilter, searchQuery, showArchivedPlanning, standaloneWorkstreams]);
280
+ const planningFavoriteKeys = React.useMemo(() => new Set(planningFavorites.map(getPlanningFavoriteKey)), [planningFavorites]);
281
+ const visibleFavorites = React.useMemo(() => {
282
+ const initiativeById = new Map(initiatives
283
+ .filter((initiative) => matchesPlanningNavigatorItem({
284
+ item: initiative,
285
+ entityType: 'initiative',
286
+ showArchivedPlanning,
287
+ searchQuery,
288
+ ownerFilter,
289
+ currentOwnerId: String(currentOwnerId || ''),
290
+ }))
291
+ .map((initiative) => [initiative.id, initiative]));
292
+ const workstreamById = new Map();
293
+ initiatives.forEach((initiative) => {
294
+ (initiative.allWorkstreams || initiative.workstreams).forEach((workstream) => {
295
+ if (!matchesPlanningNavigatorItem({
296
+ item: workstream,
297
+ entityType: 'workstream',
298
+ showArchivedPlanning,
299
+ searchQuery,
300
+ ownerFilter,
301
+ currentOwnerId: String(currentOwnerId || ''),
302
+ }))
303
+ return;
304
+ workstreamById.set(workstream.id, {
305
+ item: workstream,
306
+ parentInitiativeId: initiative.id,
307
+ });
308
+ });
309
+ });
310
+ standaloneWorkstreams.forEach((workstream) => {
311
+ if (!matchesPlanningNavigatorItem({
312
+ item: workstream,
313
+ entityType: 'workstream',
314
+ showArchivedPlanning,
315
+ searchQuery,
316
+ ownerFilter,
317
+ currentOwnerId: String(currentOwnerId || ''),
318
+ }))
319
+ return;
320
+ workstreamById.set(workstream.id, {
321
+ item: workstream,
322
+ parentInitiativeId: null,
323
+ });
324
+ });
325
+ return planningFavorites.reduce((favorites, favorite) => {
326
+ if (favorite.type === 'initiative') {
327
+ const item = initiativeById.get(favorite.id);
328
+ if (item)
329
+ favorites.push({ favorite, item, parentInitiativeId: null });
330
+ return favorites;
331
+ }
332
+ const match = workstreamById.get(favorite.id);
333
+ if (match)
334
+ favorites.push({ favorite, ...match });
335
+ return favorites;
336
+ }, []);
337
+ }, [
338
+ currentOwnerId,
339
+ initiatives,
340
+ ownerFilter,
341
+ planningFavorites,
342
+ searchQuery,
343
+ showArchivedPlanning,
344
+ standaloneWorkstreams,
345
+ ]);
346
+ if (taskScope === 'deleted') {
347
+ return (_jsxs("div", { className: panelStyles.scopeSummary, role: "status", children: [_jsx("strong", { children: "Planning is not shown in Trash" }), _jsx("span", { children: "Switch the task scope away from Trash to manage initiatives and workstreams." })] }));
348
+ }
349
+ if (planningLoadState.status === 'loading') {
350
+ return _jsx(PlanningLoadingState, {});
351
+ }
352
+ if (planningLoadState.status === 'error') {
353
+ return (_jsx(PlanningFailureState, { title: "Planning unavailable", message: planningLoadState.error || 'Planning could not be loaded.', retrying: planningLoadState.isRefreshing, onRetry: onRetryPlanning }));
354
+ }
355
+ const archivedInitiativeCount = initiatives.filter((initiative) => Boolean(initiative.isArchived)).length;
356
+ const archivedStandaloneWorkstreamCount = standaloneWorkstreams
357
+ .filter((workstream) => Boolean(workstream.isArchived)).length;
358
+ const hasPlanningEntities = initiatives.length > 0 || standaloneWorkstreams.length > 0;
359
+ const hasAdjustedNavigator = navigatorResults.hasCriteria || navigatorSort !== 'default';
360
+ const clearNavigator = () => {
361
+ setSearchQuery('');
362
+ setOwnerFilter('all');
363
+ if (navigatorSortReady)
364
+ onNavigatorSortChange('default');
365
+ };
366
+ const toggleWorkstreamTasks = (workstreamId) => {
367
+ setExpandedWorkstreamIds((current) => {
368
+ const next = new Set(current);
369
+ if (next.has(workstreamId))
370
+ next.delete(workstreamId);
371
+ else
372
+ next.add(workstreamId);
373
+ return next;
374
+ });
375
+ };
376
+ const toggleFavoriteBranch = (branchKey) => {
377
+ setExpandedFavoriteBranchKeys((current) => {
378
+ const next = new Set(current);
379
+ if (next.has(branchKey))
380
+ next.delete(branchKey);
381
+ else
382
+ next.add(branchKey);
383
+ return next;
384
+ });
385
+ };
386
+ const renderWorkstreamTasks = (workstream, expanded = expandedWorkstreamIds.has(workstream.id), controlsId = `planning-tasks-${workstream.id}`, ariaLabel = `Tasks in ${workstream.title}`) => {
387
+ if (!expanded)
388
+ return null;
389
+ const allTasks = workstream.tasks || [];
390
+ const visibleTasks = arrangePlanningTasks(showArchivedPlanning
391
+ ? allTasks
392
+ : allTasks.filter((task) => !task.isArchived), taskArrangeMode);
393
+ return (_jsx("ul", { id: controlsId, className: `${panelStyles.treeChildren} ${panelStyles.treeTaskChildren}`.trim(), "aria-label": ariaLabel, children: visibleTasks.length > 0 ? visibleTasks.map((task) => (_jsx("li", { children: _jsx(PlanningTreeTaskCard, { task: task, assigneeOption: task.assignee ? assigneeOptionByValue.get(task.assignee) : undefined, assigneeOptions: assigneeOptions, showTaskCardStatusLabel: showTaskCardStatusLabel, onOpenTaskById: onOpenTaskById, onSetTaskStatus: onSetTaskStatus, onChangeTaskAssignee: onChangeTaskAssignee, onArchivePlanningTask: onArchivePlanningTask }) }, task.id))) : (_jsx("li", { className: panelStyles.passiveGuidance, children: "Archived tasks are hidden." })) }));
394
+ };
395
+ const initiativeEmptyTitle = navigatorResults.hasCriteria
396
+ ? 'No matching initiatives'
397
+ : archivedInitiativeCount > 0 ? 'No active initiatives' : 'No initiatives yet';
398
+ const initiativeEmptyText = navigatorResults.hasCriteria
399
+ ? 'No initiatives match the current planning search and owner filter.'
400
+ : archivedInitiativeCount > 0
401
+ ? `${archivedInitiativeCount} archived ${archivedInitiativeCount === 1 ? 'initiative is' : 'initiatives are'} hidden. Use the archive visibility control above to view ${archivedInitiativeCount === 1 ? 'it' : 'them'}.`
402
+ : _jsxs(_Fragment, { children: ["Initiatives give larger efforts a clear home without crowding the task board. Use the ", _jsx("code", { children: "+" }), " action above to create the first one."] });
403
+ const workstreamEmptyTitle = navigatorResults.hasCriteria
404
+ ? 'No matching standalone workstreams'
405
+ : archivedStandaloneWorkstreamCount > 0 ? 'No active standalone workstreams' : 'No standalone workstreams yet';
406
+ const workstreamEmptyText = navigatorResults.hasCriteria
407
+ ? 'No standalone workstreams match the current planning search and owner filter.'
408
+ : archivedStandaloneWorkstreamCount > 0
409
+ ? `${archivedStandaloneWorkstreamCount} archived standalone ${archivedStandaloneWorkstreamCount === 1 ? 'workstream is' : 'workstreams are'} hidden. Use the archive visibility control above to view ${archivedStandaloneWorkstreamCount === 1 ? 'it' : 'them'}.`
410
+ : _jsxs(_Fragment, { children: ["Smaller projects can still use workstreams without needing initiative-level structure. Use the ", _jsx("code", { children: "+" }), " action above to add one."] });
411
+ return (_jsxs(_Fragment, { children: [planningLoadState.status === 'partial'
412
+ && planningLoadState.collections.initiatives === 'ready'
413
+ && planningLoadState.collections.workstreams === 'ready' ? (_jsx(PlanningFailureState, { compact: true, title: "Planning may be incomplete", message: planningLoadState.error || 'The latest planning refresh did not finish. Existing data is still shown.', retrying: planningLoadState.isRefreshing, onRetry: onRetryPlanning })) : null, hasPlanningEntities ? (_jsxs("div", { className: panelStyles.navigatorControls, children: [_jsxs("div", { className: panelStyles.navigatorSearchRow, children: [_jsxs("div", { className: panelStyles.navigatorSearch, children: [_jsx(Search, { size: 14, "aria-hidden": "true" }), _jsx("span", { className: panelStyles.visuallyHidden, children: "Search planning" }), _jsx("input", { type: "search", value: searchQuery, onChange: (event) => setSearchQuery(event.target.value), placeholder: "Search initiatives and workstreams", "aria-label": "Search planning" }), searchQuery ? (_jsx("button", { type: "button", className: panelStyles.navigatorClearSearch, onClick: () => setSearchQuery(''), "aria-label": "Clear planning search", title: "Clear search", children: _jsx(X, { size: 13, "aria-hidden": "true" }) })) : null] }), _jsx("button", { type: "button", className: `tf-control-icon ${filtersExpanded || ownerFilter !== 'all' || navigatorSort !== 'default' ? panelStyles.toggleActive : ''}`.trim(), "aria-label": "Filter and sort planning", title: "Filter and sort planning", "aria-expanded": filtersExpanded, "aria-controls": "planning-navigator-options", onClick: () => setFiltersExpanded((current) => !current), children: _jsx(Filter, { size: 15, "aria-hidden": "true" }) })] }), filtersExpanded ? (_jsxs("div", { id: "planning-navigator-options", className: panelStyles.navigatorOptions, children: [_jsxs("div", { className: panelStyles.navigatorOptionField, children: [_jsx("span", { className: panelStyles.navigatorOptionLabel, children: "Owner" }), _jsx(PlanningOwnerDropdown, { value: ownerFilter, options: assigneeOptions, leadingOptions: ownerFilterLeadingOptions, includeUnassigned: false, onChange: setOwnerFilter, disabled: false, ariaLabel: "Filter planning by owner", className: panelStyles.navigatorDropdown })] }), _jsxs("div", { className: panelStyles.navigatorOptionField, children: [_jsx("span", { className: panelStyles.navigatorOptionLabel, children: "Sort" }), _jsx(TaxonomyDropdown, { value: navigatorSort, options: PLANNING_NAVIGATOR_SORT_OPTIONS, onChange: (value) => onNavigatorSortChange(String(value)), disabled: !navigatorSortReady, ariaLabel: "Sort planning", className: panelStyles.navigatorDropdown, portalPanel: true, panelAlign: "start", triggerContent: (_jsxs("span", { className: panelStyles.navigatorDropdownTrigger, children: [_jsx(ArrowUpDown, { size: 14, "aria-hidden": "true" }), _jsx("span", { children: PLANNING_NAVIGATOR_SORT_OPTIONS.find((option) => option.value === navigatorSort)?.label })] })), renderOptionContent: (option) => option.label })] }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: clearNavigator, disabled: !hasAdjustedNavigator, "aria-label": "Reset planning filters and sort", title: "Reset planning filters and sort", children: _jsx(RotateCcw, { size: 14, "aria-hidden": "true" }) })] })) : null, _jsxs("span", { className: panelStyles.visuallyHidden, role: "status", "aria-live": "polite", children: [navigatorResults.resultCount, " planning ", navigatorResults.resultCount === 1 ? 'result' : 'results'] })] })) : null, navigatorResults.hasCriteria && navigatorResults.resultCount === 0 ? (_jsxs("div", { className: panelStyles.navigatorEmpty, role: "status", children: [_jsx("strong", { children: "No planning matches" }), _jsx("span", { children: "Try another title or reference, or clear the owner filter." }), _jsx("button", { type: "button", onClick: clearNavigator, children: "Clear search and filters" })] })) : (_jsxs(_Fragment, { children: [visibleFavorites.length > 0 ? (_jsxs("div", { className: panelStyles.sectionGroup, children: [_jsx(DisclosureSectionHeader, { label: "Favorites", count: visibleFavorites.length, expanded: !favoritesSectionCollapsed, expandedTitle: "Collapse favorites", collapsedTitle: "Expand favorites", onToggle: onToggleFavoritesSection, controlsId: "planning-favorites-section" }), _jsx("ul", { id: "planning-favorites-section", className: panelStyles.treeList, "aria-label": "Favorite planning items", hidden: favoritesSectionCollapsed, children: visibleFavorites.map(({ favorite, item, parentInitiativeId }) => {
414
+ const detailOpen = favorite.type === 'initiative'
415
+ ? detail?.type === 'initiative' && detail.item.id === item.id
416
+ : (detail?.type === 'workstream' && detail.item.id === item.id)
417
+ || (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === item.id);
418
+ const favoriteInitiative = favorite.type === 'initiative'
419
+ ? item
420
+ : null;
421
+ const favoriteWorkstream = favorite.type === 'workstream'
422
+ ? item
423
+ : null;
424
+ const initiativeWorkstreams = favoriteInitiative
425
+ ? favoriteInitiative.allWorkstreams || favoriteInitiative.workstreams
426
+ : [];
427
+ const visibleInitiativeWorkstreams = initiativeWorkstreams.filter((workstream) => (showArchivedPlanning || !workstream.isArchived));
428
+ const favoriteBranchKey = `favorite:${favorite.type}:${item.id}`;
429
+ const favoriteExpanded = expandedFavoriteBranchKeys.has(favoriteBranchKey);
430
+ const favoriteControlsId = `planning-${favoriteBranchKey.replaceAll(':', '-')}-children`;
431
+ return (_jsxs("li", { children: [_jsx(PlanningRow, { rowId: `favorite:${favorite.type}:${item.id}`, rowType: favorite.type, referenceLabel: favorite.type === 'initiative'
432
+ ? formatInitiativeReference(item)
433
+ : formatWorkstreamReference(item), item: item, ownerOption: item.ownerId ? assigneeOptionByValue.get(item.ownerId) : undefined, ownerOptions: assigneeOptions, onChangeOwner: (ownerId) => onChangePlanningOwner(favorite.type, item.id, ownerId === 'unassigned' ? '' : ownerId), onChangeIdentity: (patch) => onChangePlanningIdentity(favorite.type, item.id, patch), workstreamCount: favoriteInitiative
434
+ ? visibleInitiativeWorkstreams.length
435
+ : undefined, active: favorite.type === 'initiative'
436
+ ? activeInitiativeId === item.id && !activeWorkstreamId
437
+ : activeWorkstreamId === item.id, isArchived: Boolean(item.isArchived), detailOpen: detailOpen, canExpand: favorite.type === 'initiative'
438
+ ? initiativeWorkstreams.length > 0
439
+ : Boolean(favoriteWorkstream?.tasks?.length), expanded: favoriteExpanded, controlsId: favoriteControlsId, onToggleExpand: () => toggleFavoriteBranch(favoriteBranchKey), onToggleScope: () => {
440
+ if (favorite.type === 'initiative') {
441
+ onSelectInitiative(item.id);
442
+ }
443
+ else {
444
+ onSelectWorkstream(item.id, parentInitiativeId);
445
+ }
446
+ }, favoriteReady: navigatorSortReady, onOpenDetails: () => {
447
+ if (favorite.type === 'initiative') {
448
+ onOpenInitiativeDetails(item.id);
449
+ }
450
+ else if (parentInitiativeId) {
451
+ onOpenInitiativeDetails(parentInitiativeId);
452
+ onOpenNestedWorkstreamDetails(item.id);
453
+ }
454
+ else {
455
+ onOpenWorkstreamDetails(item.id);
456
+ }
457
+ }, favorite: true, onToggleFavorite: () => onTogglePlanningFavorite(favorite), onArchiveReady: favorite.type === 'initiative'
458
+ ? onArchiveResolvedInitiative
459
+ ? () => onArchiveResolvedInitiative(item.id)
460
+ : undefined
461
+ : onArchiveResolvedWorkstream
462
+ ? () => onArchiveResolvedWorkstream(item.id)
463
+ : undefined, hierarchyInteractions: false, initiativeLinkOptions: favorite.type === 'workstream' && !parentInitiativeId
464
+ ? linkOptions.initiatives
465
+ : undefined, onLinkInitiative: favorite.type === 'workstream' && !parentInitiativeId
466
+ ? (option) => onAssignInitiativeToWorkstream(item.id, option.referenceLabel)
467
+ : undefined }), favoriteInitiative && favoriteExpanded ? (_jsx("ul", { id: favoriteControlsId, className: panelStyles.treeChildren, "aria-label": `Workstreams in favorite ${favoriteInitiative.title}`, children: visibleInitiativeWorkstreams.length > 0
468
+ ? visibleInitiativeWorkstreams.map((workstream) => {
469
+ const childBranchKey = `${favoriteBranchKey}:workstream:${workstream.id}`;
470
+ const childExpanded = expandedFavoriteBranchKeys.has(childBranchKey);
471
+ const childControlsId = `planning-${childBranchKey.replaceAll(':', '-')}-children`;
472
+ return (_jsxs("li", { children: [_jsx(PlanningRow, { rowId: childBranchKey, rowType: "workstream", referenceLabel: formatWorkstreamReference(workstream), item: workstream, ownerOption: workstream.ownerId
473
+ ? assigneeOptionByValue.get(workstream.ownerId)
474
+ : undefined, ownerOptions: assigneeOptions, onChangeOwner: (ownerId) => onChangePlanningOwner('workstream', workstream.id, ownerId === 'unassigned' ? '' : ownerId), onChangeIdentity: (patch) => onChangePlanningIdentity('workstream', workstream.id, patch), active: activeWorkstreamId === workstream.id, isArchived: Boolean(workstream.isArchived), detailOpen: (detail?.type === 'workstream' && detail.item.id === workstream.id)
475
+ || (secondaryPane?.kind === 'detail'
476
+ && secondaryPane.detail.item.id === workstream.id), canExpand: Boolean(workstream.tasks?.length), expanded: childExpanded, controlsId: childControlsId, onToggleExpand: () => toggleFavoriteBranch(childBranchKey), onToggleScope: () => onSelectWorkstream(workstream.id, favoriteInitiative.id), onOpenDetails: () => {
477
+ onOpenInitiativeDetails(favoriteInitiative.id);
478
+ onOpenNestedWorkstreamDetails(workstream.id);
479
+ }, favorite: planningFavoriteKeys.has(getPlanningFavoriteKey({
480
+ type: 'workstream',
481
+ id: workstream.id,
482
+ })), favoriteReady: navigatorSortReady, onToggleFavorite: () => onTogglePlanningFavorite({
483
+ type: 'workstream',
484
+ id: workstream.id,
485
+ }), onArchiveReady: onArchiveResolvedWorkstream
486
+ ? () => onArchiveResolvedWorkstream(workstream.id)
487
+ : undefined, hierarchyInteractions: false }), renderWorkstreamTasks(workstream, childExpanded, childControlsId, `Tasks in favorite ${favoriteInitiative.title} / ${workstream.title}`)] }, workstream.id));
488
+ })
489
+ : (_jsx("li", { className: panelStyles.passiveGuidance, children: "Archived workstreams are hidden." })) })) : null, favoriteWorkstream
490
+ ? renderWorkstreamTasks(favoriteWorkstream, favoriteExpanded, favoriteControlsId, `Tasks in favorite ${favoriteWorkstream.title}`)
491
+ : null] }, getPlanningFavoriteKey(favorite)));
492
+ }) })] })) : null, _jsxs("div", { className: panelStyles.sectionGroup, children: [_jsx(DisclosureSectionHeader, { label: "Initiatives", count: navigatorResults.initiatives.length, showZeroCount: true, actions: (planningLoadState.collections.initiatives === 'ready' ? (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create initiative", "aria-label": "Create initiative", onClick: onCreateInitiative, children: _jsx(Plus, { size: 15 }) })) : null), expanded: !initiativesSectionCollapsed, expandedTitle: "Collapse initiatives", collapsedTitle: "Expand initiatives", onToggle: onToggleInitiativesSection, controlsId: !initiativesSectionCollapsed ? 'planning-initiatives-section' : undefined }), !initiativesSectionCollapsed ? (_jsx("ul", { id: "planning-initiatives-section", className: panelStyles.treeList, "aria-label": "Initiatives", children: planningLoadState.collections.initiatives === 'error' ? (_jsx("li", { children: _jsx(PlanningFailureState, { compact: true, title: "Initiatives unavailable", message: "Initiatives could not be loaded.", retrying: planningLoadState.isRefreshing, onRetry: onRetryPlanning }) })) : navigatorResults.initiatives.length === 0 ? (_jsxs("li", { className: panelStyles.emptyPanel, children: [_jsx("div", { className: panelStyles.emptyPanelTitle, children: initiativeEmptyTitle }), _jsx("div", { className: panelStyles.emptyPanelText, children: initiativeEmptyText })] })) : navigatorResults.initiatives.map(({ initiative, workstreams: resultWorkstreams }) => {
493
+ const allWorkstreams = initiative.allWorkstreams || initiative.workstreams;
494
+ const treeWorkstreams = showArchivedPlanning
495
+ ? allWorkstreams
496
+ : allWorkstreams.filter((workstream) => !workstream.isArchived);
497
+ const displayedWorkstreams = resultWorkstreams;
498
+ const expanded = navigatorResults.hasCriteria
499
+ ? displayedWorkstreams.length > 0
500
+ : expandedInitiativeIds.has(initiative.id);
501
+ return (_jsxs("li", { children: [_jsx(PlanningRow, { rowId: initiative.id, rowType: "initiative", referenceLabel: formatInitiativeReference(initiative), item: initiative, ownerOption: initiative.ownerId ? assigneeOptionByValue.get(initiative.ownerId) : undefined, ownerOptions: assigneeOptions, onChangeOwner: (ownerId) => onChangePlanningOwner('initiative', initiative.id, ownerId === 'unassigned' ? '' : ownerId), onChangeIdentity: (patch) => onChangePlanningIdentity('initiative', initiative.id, patch), workstreamCount: treeWorkstreams.length, active: activeInitiativeId === initiative.id && !activeWorkstreamId, isArchived: Boolean(initiative.isArchived), detailOpen: detail?.type === 'initiative' && detail.item.id === initiative.id, canExpand: allWorkstreams.length > 0, expanded: expanded, controlsId: `planning-children-${initiative.id}`, onToggleExpand: () => onToggleInitiative(initiative.id), onToggleScope: () => onSelectInitiative(initiative.id), onOpenDetails: () => onOpenInitiativeDetails(initiative.id), favorite: planningFavoriteKeys.has(getPlanningFavoriteKey({ type: 'initiative', id: initiative.id })), favoriteReady: navigatorSortReady, onToggleFavorite: () => onTogglePlanningFavorite({ type: 'initiative', id: initiative.id }), onArchiveReady: onArchiveResolvedInitiative
502
+ ? () => onArchiveResolvedInitiative(initiative.id)
503
+ : undefined }), expanded && displayedWorkstreams.length > 0 && (_jsx("ul", { id: `planning-children-${initiative.id}`, className: panelStyles.treeChildren, "aria-label": `Workstreams in ${initiative.title}`, children: displayedWorkstreams.map((workstream) => (_jsxs("li", { children: [_jsx(PlanningRow, { rowId: workstream.id, rowType: "workstream", referenceLabel: formatWorkstreamReference(workstream), item: workstream, ownerOption: workstream.ownerId ? assigneeOptionByValue.get(workstream.ownerId) : undefined, ownerOptions: assigneeOptions, onChangeOwner: (ownerId) => onChangePlanningOwner('workstream', workstream.id, ownerId === 'unassigned' ? '' : ownerId), onChangeIdentity: (patch) => onChangePlanningIdentity('workstream', workstream.id, patch), active: activeWorkstreamId === workstream.id, isArchived: Boolean(workstream.isArchived), detailOpen: (detail?.type === 'workstream' && detail.item.id === workstream.id)
504
+ || (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === workstream.id), canExpand: (workstream.tasks || []).length > 0, expanded: expandedWorkstreamIds.has(workstream.id), controlsId: `planning-tasks-${workstream.id}`, onToggleExpand: () => toggleWorkstreamTasks(workstream.id), onToggleScope: () => onSelectWorkstream(workstream.id, initiative.id), onOpenDetails: () => {
505
+ onOpenInitiativeDetails(initiative.id);
506
+ onOpenNestedWorkstreamDetails(workstream.id);
507
+ }, favorite: planningFavoriteKeys.has(getPlanningFavoriteKey({ type: 'workstream', id: workstream.id })), favoriteReady: navigatorSortReady, onToggleFavorite: () => onTogglePlanningFavorite({ type: 'workstream', id: workstream.id }), onArchiveReady: onArchiveResolvedWorkstream
508
+ ? () => onArchiveResolvedWorkstream(workstream.id)
509
+ : undefined }), renderWorkstreamTasks(workstream)] }, workstream.id))) }))] }, initiative.id));
510
+ }) })) : null] }), _jsxs("div", { className: panelStyles.sectionGroup, children: [_jsx(DisclosureSectionHeader, { label: "Workstreams", count: navigatorResults.standaloneWorkstreams.length, showZeroCount: true, actions: (planningLoadState.collections.workstreams === 'ready' ? (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create workstream", "aria-label": "Create workstream", onClick: onCreateWorkstream, children: _jsx(Plus, { size: 15 }) })) : null), expanded: !workstreamsSectionCollapsed, expandedTitle: "Collapse workstreams", collapsedTitle: "Expand workstreams", onToggle: onToggleWorkstreamsSection, controlsId: !workstreamsSectionCollapsed ? 'planning-workstreams-section' : undefined }), !workstreamsSectionCollapsed ? (_jsx("ul", { id: "planning-workstreams-section", className: panelStyles.treeList, "aria-label": "Standalone workstreams", children: planningLoadState.collections.workstreams === 'error' ? (_jsx("li", { children: _jsx(PlanningFailureState, { compact: true, title: "Workstreams unavailable", message: "Workstreams could not be loaded.", retrying: planningLoadState.isRefreshing, onRetry: onRetryPlanning }) })) : navigatorResults.standaloneWorkstreams.length === 0 ? (_jsxs("li", { className: panelStyles.emptyPanel, children: [_jsx("div", { className: panelStyles.emptyPanelTitle, children: workstreamEmptyTitle }), _jsx("div", { className: panelStyles.emptyPanelText, children: workstreamEmptyText })] })) : navigatorResults.standaloneWorkstreams.map((workstream) => (_jsxs("li", { children: [_jsx(PlanningRow, { rowId: workstream.id, rowType: "workstream", referenceLabel: formatWorkstreamReference(workstream), item: workstream, ownerOption: workstream.ownerId ? assigneeOptionByValue.get(workstream.ownerId) : undefined, ownerOptions: assigneeOptions, onChangeOwner: (ownerId) => onChangePlanningOwner('workstream', workstream.id, ownerId === 'unassigned' ? '' : ownerId), onChangeIdentity: (patch) => onChangePlanningIdentity('workstream', workstream.id, patch), active: activeWorkstreamId === workstream.id, isArchived: Boolean(workstream.isArchived), detailOpen: (detail?.type === 'workstream' && detail.item.id === workstream.id)
511
+ || (secondaryPane?.kind === 'detail' && secondaryPane.detail.item.id === workstream.id), canExpand: (workstream.tasks || []).length > 0, expanded: expandedWorkstreamIds.has(workstream.id), controlsId: `planning-tasks-${workstream.id}`, onToggleExpand: () => toggleWorkstreamTasks(workstream.id), onToggleScope: () => onSelectWorkstream(workstream.id, null), onOpenDetails: () => onOpenWorkstreamDetails(workstream.id), favorite: planningFavoriteKeys.has(getPlanningFavoriteKey({ type: 'workstream', id: workstream.id })), favoriteReady: navigatorSortReady, onToggleFavorite: () => onTogglePlanningFavorite({ type: 'workstream', id: workstream.id }), onArchiveReady: onArchiveResolvedWorkstream
512
+ ? () => onArchiveResolvedWorkstream(workstream.id)
513
+ : undefined, initiativeLinkOptions: linkOptions.initiatives, onLinkInitiative: (option) => onAssignInitiativeToWorkstream(workstream.id, option.referenceLabel) }), renderWorkstreamTasks(workstream)] }, workstream.id))) })) : null] })] }))] }));
514
+ }
515
+ function PlanningLoadingState() {
516
+ return (_jsxs("div", { className: panelStyles.loadingState, role: "status", "aria-live": "polite", children: [_jsx("span", { className: panelStyles.visuallyHidden, children: "Loading planning" }), [0, 1, 2].map((index) => (_jsxs("div", { className: panelStyles.loadingRow, "aria-hidden": "true", children: [_jsx("span", { className: panelStyles.loadingBadge }), _jsx("span", { className: panelStyles.loadingTitle }), _jsx("span", { className: panelStyles.loadingMeta })] }, index)))] }));
165
517
  }
166
- function PlanningDrawerDetailView({ detail, currentWorkspaceId, onOpenNestedWorkstreamDetails, onEdit, onArchive, onUnarchive, onCreateTaskInWorkstream, onCreateWorkstreamInInitiative, onOpenTaskById, onRemoveTaskFromWorkstream, onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference, onAttachWorkstreamToInitiativeByReference, onAddPlanningContextFile, onRemovePlanningContextFile, onUpdatePlanningContextCaption, parentInitiative = null, assigneeOptions, }) {
167
- const [attachReference, setAttachReference] = React.useState('');
518
+ function PlanningFailureState({ title, message, retrying, onRetry, compact = false, }) {
519
+ return (_jsxs("div", { className: `${panelStyles.failureState} ${compact ? panelStyles.failureStateCompact : ''} tf-surface-inset`.trim(), role: "alert", children: [_jsxs("div", { className: panelStyles.failureCopy, children: [_jsx("strong", { children: title }), _jsx("span", { children: message })] }), _jsx("button", { type: "button", className: "tf-button-ghost tf-button-compact", disabled: retrying, onClick: onRetry, children: retrying ? 'Retrying…' : 'Retry' })] }));
520
+ }
521
+ function PlanningDrawerDetailView({ detail, showArchivedChildren, inlineEditor, selectedChildWorkstreamId, currentWorkspaceId, currentActorId, theme, onOpenNestedWorkstreamDetails, onArchivePlanningTask, onArchiveResolvedWorkstream, onArchiveResolvedEntity, onEdit, onChangeOwner, onChangePlanningOwner, onChangePlanningIdentity, onArchive, onUnarchive, onCreateTaskInWorkstream, onCreateWorkstreamInInitiative, onOpenTaskById, onChangeTaskAssignee, taskReferences, onAssignTaskToWorkstream, onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference, onAttachWorkstreamToInitiativeByReference, onAddPlanningContextFile, onRemovePlanningContextFile, onUpdatePlanningContextCaption, parentInitiative = null, assigneeOptions, linkOptions, showTaskCardStatusLabel = false, taskArrangeMode = 'execution', onTaskArrangeModeChange = () => { }, onReorderWorkstreamTasks, onSetTaskStatus, hydrationState, onRetryHydration, }) {
522
+ const inlineEditorFormId = React.useId();
168
523
  const [isAttachingReference, setIsAttachingReference] = React.useState(false);
169
- const [showArchivedChildren, setShowArchivedChildren] = React.useState(false);
170
- const [showRecentActivity, setShowRecentActivity] = React.useState(true);
524
+ const [showParentLinkPicker, setShowParentLinkPicker] = React.useState(false);
525
+ const [pendingUnlink, setPendingUnlink] = React.useState(null);
526
+ const [relationshipRecovery, setRelationshipRecovery] = React.useState(null);
527
+ const [isChangingRelationship, setIsChangingRelationship] = React.useState(false);
528
+ const [pendingArchiveWorkstreamId, setPendingArchiveWorkstreamId] = React.useState(null);
529
+ const [archiveWorkstreamBusy, setArchiveWorkstreamBusy] = React.useState(false);
530
+ const [archiveEntityConfirmationVisible, setArchiveEntityConfirmationVisible] = React.useState(false);
531
+ const [archiveEntityBusy, setArchiveEntityBusy] = React.useState(false);
532
+ const [archivingTaskId, setArchivingTaskId] = React.useState(null);
533
+ const [ownerValue, setOwnerValue] = React.useState(String(detail.item.ownerId || ''));
534
+ const [isSavingOwner, setIsSavingOwner] = React.useState(false);
171
535
  const { active } = useDndContext();
172
536
  const dragType = String(active?.data?.current?.type || '');
173
537
  const canDropTask = detail.type === 'workstream' && dragType === 'task-card';
@@ -193,32 +557,82 @@ function PlanningDrawerDetailView({ detail, currentWorkspaceId, onOpenNestedWork
193
557
  return [];
194
558
  return detail.item.tasks || [];
195
559
  }, [detail.item, detail.type]);
196
- const archivedChildCount = detail.type === 'initiative'
197
- ? childItems.filter((workstream) => Boolean(workstream.isArchived)).length
198
- : taskItems.filter((task) => Boolean(task.isArchived)).length;
560
+ const assigneeOptionByValue = React.useMemo(() => new Map(assigneeOptions
561
+ .filter((option) => !String(option.archivedAt || '').trim())
562
+ .map((option) => [String(option.value || '').trim(), option])), [assigneeOptions]);
199
563
  const visibleChildItems = showArchivedChildren
200
564
  ? childItems
201
565
  : childItems.filter((workstream) => !workstream.isArchived);
202
- const visibleTaskItems = showArchivedChildren
566
+ const visibleTaskItems = arrangePlanningTasks(showArchivedChildren
203
567
  ? taskItems
204
- : taskItems.filter((task) => !task.isArchived);
568
+ : taskItems.filter((task) => !task.isArchived), taskArrangeMode);
569
+ const visibleChildCount = detail.type === 'initiative'
570
+ ? visibleChildItems.length
571
+ : visibleTaskItems.length;
205
572
  const detailLabel = detail.type === 'initiative' ? 'Initiative' : 'Workstream';
206
573
  const detailReferenceLabel = detail.type === 'initiative'
207
574
  ? formatInitiativeReference(detail.item)
208
575
  : formatWorkstreamReference(detail.item);
576
+ const archiveDetailState = resolvePlanningArchiveDetailState({
577
+ entityType: detail.type,
578
+ isArchived: detail.item.isArchived,
579
+ taskCount: detail.item.taskCount,
580
+ completedTaskCount: detail.item.completedTaskCount,
581
+ archiveReady: detail.item.archiveReady,
582
+ activeWorkstreamCount: detail.item.archiveActiveWorkstreamCount,
583
+ });
584
+ const archiveActionLabel = archiveDetailState.mode === 'archived'
585
+ ? `Unarchive ${detailLabel.toLowerCase()}`
586
+ : archiveDetailState.mode === 'blocked'
587
+ ? `Archive unavailable — active ${archiveDetailState.remainingKind === 'task' ? 'tasks' : 'workstreams'} remain`
588
+ : archiveDetailState.mode === 'checking'
589
+ ? 'Archive availability is still loading'
590
+ : `Archive ${detailLabel.toLowerCase()}`;
209
591
  React.useEffect(() => {
210
- setAttachReference('');
211
592
  setIsAttachingReference(false);
212
- setShowArchivedChildren(false);
213
- setShowRecentActivity(true);
593
+ setShowParentLinkPicker(false);
594
+ setPendingUnlink(null);
595
+ setRelationshipRecovery(null);
596
+ setIsChangingRelationship(false);
597
+ setArchiveEntityConfirmationVisible(false);
214
598
  }, [detail.item.id, detail.type]);
599
+ React.useEffect(() => {
600
+ setOwnerValue(String(detail.item.ownerId || ''));
601
+ }, [detail.item.id, detail.item.ownerId, detail.type]);
602
+ const handleOwnerChange = React.useCallback(async (nextOwnerId) => {
603
+ if (!onChangeOwner || isSavingOwner || nextOwnerId === ownerValue)
604
+ return;
605
+ const previousOwnerId = ownerValue;
606
+ setOwnerValue(nextOwnerId);
607
+ setIsSavingOwner(true);
608
+ try {
609
+ await onChangeOwner(nextOwnerId);
610
+ }
611
+ catch {
612
+ setOwnerValue(previousOwnerId);
613
+ }
614
+ finally {
615
+ setIsSavingOwner(false);
616
+ }
617
+ }, [isSavingOwner, onChangeOwner, ownerValue]);
618
+ const handleConfirmArchiveEntity = React.useCallback(async () => {
619
+ if (!onArchiveResolvedEntity || archiveEntityBusy)
620
+ return;
621
+ setArchiveEntityBusy(true);
622
+ try {
623
+ const archived = await onArchiveResolvedEntity(detail.item.id);
624
+ if (archived)
625
+ setArchiveEntityConfirmationVisible(false);
626
+ }
627
+ finally {
628
+ setArchiveEntityBusy(false);
629
+ }
630
+ }, [archiveEntityBusy, detail.item.id, onArchiveResolvedEntity]);
215
631
  const hasAttachReferenceHandler = detail.type === 'initiative'
216
632
  ? Boolean(onAttachWorkstreamToInitiativeByReference)
217
633
  : Boolean(onAttachTaskToWorkstreamByReference);
218
- const canAttachReference = Boolean(attachReference.trim()) && hasAttachReferenceHandler && !isAttachingReference;
219
- const handleAttachReference = React.useCallback(async () => {
220
- const value = attachReference.trim();
221
- if (!value || isAttachingReference)
634
+ const handleAttachReference = React.useCallback(async (option) => {
635
+ if (isAttachingReference)
222
636
  return;
223
637
  const attach = detail.type === 'initiative'
224
638
  ? onAttachWorkstreamToInitiativeByReference
@@ -227,211 +641,447 @@ function PlanningDrawerDetailView({ detail, currentWorkspaceId, onOpenNestedWork
227
641
  return;
228
642
  setIsAttachingReference(true);
229
643
  try {
230
- const result = await attach(detail.item.id, value);
231
- if (result !== false)
232
- setAttachReference('');
644
+ await attach(detail.item.id, option.referenceLabel);
233
645
  }
234
646
  finally {
235
647
  setIsAttachingReference(false);
236
648
  }
237
649
  }, [
238
- attachReference,
239
650
  detail.item.id,
240
651
  detail.type,
241
652
  isAttachingReference,
242
653
  onAttachTaskToWorkstreamByReference,
243
654
  onAttachWorkstreamToInitiativeByReference,
244
655
  ]);
245
- const attachActionLabel = detail.type === 'initiative'
246
- ? 'Attach workstream to initiative'
247
- : 'Attach task to workstream';
248
- const archivedToggleLabel = detail.type === 'initiative' ? 'archived workstreams' : 'archived tasks';
656
+ const handleLinkInitiative = React.useCallback(async (option) => {
657
+ if (!onAssignInitiativeToWorkstream || detail.type !== 'workstream' || isChangingRelationship)
658
+ return;
659
+ setIsChangingRelationship(true);
660
+ try {
661
+ const result = await onAssignInitiativeToWorkstream(detail.item.id, option.referenceLabel);
662
+ if (result !== false)
663
+ setShowParentLinkPicker(false);
664
+ }
665
+ finally {
666
+ setIsChangingRelationship(false);
667
+ }
668
+ }, [detail.item.id, detail.type, isChangingRelationship, onAssignInitiativeToWorkstream]);
249
669
  const parentInitiativeReferenceLabel = detail.type === 'workstream' && parentInitiative
250
670
  ? formatInitiativeReference(parentInitiative)
251
671
  : '';
252
- const actorOptionByValue = React.useMemo(() => {
253
- const map = new Map();
254
- for (const option of assigneeOptions) {
255
- const value = String(option.value || '').trim();
256
- if (!value)
257
- continue;
258
- map.set(value, option);
259
- map.set(value.toLowerCase(), option);
672
+ const linkedChildIds = React.useMemo(() => new Set(detail.type === 'initiative'
673
+ ? childItems.map((workstream) => workstream.id)
674
+ : taskItems.map((task) => task.id)), [childItems, detail.type, taskItems]);
675
+ const availableLinkOptions = React.useMemo(() => (detail.type === 'initiative' ? linkOptions.workstreams : linkOptions.tasks).filter((option) => !linkedChildIds.has(option.id)), [detail.type, linkOptions.tasks, linkOptions.workstreams, linkedChildIds]);
676
+ const handleConfirmUnlink = React.useCallback(async () => {
677
+ if (!pendingUnlink || isChangingRelationship)
678
+ return;
679
+ setIsChangingRelationship(true);
680
+ try {
681
+ if (pendingUnlink.entityType === 'workstream') {
682
+ if (!onAssignInitiativeToWorkstream)
683
+ return;
684
+ const restoreInitiativeReference = detail.type === 'initiative'
685
+ ? detailReferenceLabel
686
+ : parentInitiativeReferenceLabel;
687
+ const result = await onAssignInitiativeToWorkstream?.(pendingUnlink.id, null);
688
+ if (result === false)
689
+ return;
690
+ setRelationshipRecovery({
691
+ entityType: pendingUnlink.entityType,
692
+ id: pendingUnlink.id,
693
+ message: `${pendingUnlink.referenceLabel} removed from its initiative.`,
694
+ onUndo: async () => {
695
+ if (!restoreInitiativeReference)
696
+ return;
697
+ const undoResult = await onAssignInitiativeToWorkstream?.(pendingUnlink.id, restoreInitiativeReference);
698
+ if (undoResult !== false)
699
+ setRelationshipRecovery(null);
700
+ },
701
+ });
702
+ }
703
+ else {
704
+ if (!onAssignTaskToWorkstream)
705
+ return;
706
+ const result = await onAssignTaskToWorkstream(pendingUnlink.id, null);
707
+ if (result === false)
708
+ return;
709
+ setRelationshipRecovery({
710
+ entityType: pendingUnlink.entityType,
711
+ id: pendingUnlink.id,
712
+ message: `${pendingUnlink.referenceLabel} removed from this workstream.`,
713
+ onUndo: async () => {
714
+ const undoResult = await onAssignTaskToWorkstream(pendingUnlink.id, detail.item.id);
715
+ if (undoResult !== false)
716
+ setRelationshipRecovery(null);
717
+ },
718
+ });
719
+ }
720
+ setPendingUnlink(null);
260
721
  }
261
- return map;
262
- }, [assigneeOptions]);
263
- const resolveActorLabel = React.useCallback((actorId, actorType, actorLabel) => {
264
- if (actorLabel && actorLabel.trim())
265
- return actorLabel.trim();
266
- const raw = String(actorId || '').trim();
267
- if (!raw)
268
- return actorType === 'ai' ? 'AI Agent' : 'You';
269
- const option = actorOptionByValue.get(raw) || actorOptionByValue.get(raw.toLowerCase());
270
- if (option?.label)
271
- return option.label;
272
- if (actorType === 'ai')
273
- return raw;
274
- return raw;
275
- }, [actorOptionByValue]);
276
- const resolveActivityActorPresentation = React.useCallback((input) => {
277
- const actorRef = String(input.actorId || '').trim();
278
- const option = actorOptionByValue.get(actorRef) || actorOptionByValue.get(actorRef.toLowerCase());
279
- const resolvedActor = input.actorProfile || option || null;
280
- const resolvedKind = input.actorType === 'system'
281
- ? 'system'
282
- : input.actorType === 'ai' || resolvedActor?.kind === 'ai' || option?.kind === 'agent'
283
- ? 'agent'
284
- : input.actorType === 'human' || resolvedActor?.kind === 'human' || option?.kind === 'member'
285
- ? 'member'
286
- : input.fallbackKind || 'member';
287
- const iconName = String(resolvedActor && 'icon' in resolvedActor && resolvedActor.icon
288
- ? resolvedActor.icon
289
- : resolvedKind === 'agent'
290
- ? 'Bot'
291
- : resolvedKind === 'member'
292
- ? 'User'
293
- : 'ClipboardList');
294
- const ActorIcon = IconMap[iconName]
295
- || (resolvedKind === 'agent' ? Bot : resolvedKind === 'member' ? User : ClipboardList);
296
- return {
297
- kind: resolvedKind,
298
- label: resolvedKind === 'system'
299
- ? 'System'
300
- : resolveActorLabel(actorRef, resolvedKind === 'agent' ? 'ai' : 'human', resolvedActor && 'label' in resolvedActor ? resolvedActor.label || null : null),
301
- color: resolvedActor && 'color' in resolvedActor ? resolvedActor.color || undefined : undefined,
302
- ActorIcon,
303
- };
304
- }, [actorOptionByValue, resolveActorLabel]);
305
- const formatActivityFieldValue = React.useCallback((field, value) => {
306
- const normalizedValue = String(value || '').trim();
307
- if (!normalizedValue)
308
- return undefined;
309
- if (field === 'ownerId') {
310
- return actorOptionByValue.get(normalizedValue)?.label
311
- || actorOptionByValue.get(normalizedValue.toLowerCase())?.label
312
- || normalizedValue;
722
+ finally {
723
+ setIsChangingRelationship(false);
313
724
  }
314
- if (field === 'initiativeId' && parentInitiative && normalizedValue === parentInitiative.id) {
315
- return formatInitiativeReference(parentInitiative) || parentInitiative.title;
725
+ }, [
726
+ detail.item.id,
727
+ detail.type,
728
+ detailReferenceLabel,
729
+ isChangingRelationship,
730
+ onAssignInitiativeToWorkstream,
731
+ onAssignTaskToWorkstream,
732
+ parentInitiativeReferenceLabel,
733
+ pendingUnlink,
734
+ ]);
735
+ const handleUndoRelationship = React.useCallback(async () => {
736
+ if (!relationshipRecovery || isChangingRelationship)
737
+ return;
738
+ setIsChangingRelationship(true);
739
+ try {
740
+ await relationshipRecovery.onUndo();
316
741
  }
317
- return undefined;
318
- }, [actorOptionByValue, parentInitiative]);
319
- const activityItems = React.useMemo(() => getEntityActivityItems({
320
- activity: detail.item.activity,
321
- comments: detail.item.comments,
322
- }), [detail.item.activity, detail.item.comments]);
323
- const activityCount = activityItems.length;
324
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: panelStyles.detailHero, children: [detailReferenceLabel ? (_jsxs("div", { className: panelStyles.detailReferenceRow, children: [detail.type === 'workstream' ? (_jsxs(_Fragment, { children: [_jsx(HierarchyActionBadge, { onClick: (event) => {
325
- event.stopPropagation();
326
- if (parentInitiativeReferenceLabel) {
327
- onAssignInitiativeToWorkstream?.(detail.item.id, null);
328
- return;
329
- }
330
- onEdit();
331
- }, title: parentInitiativeReferenceLabel ? 'Remove from initiative' : 'Attach to initiative', ariaLabel: parentInitiativeReferenceLabel ? 'Remove from initiative' : 'Attach to initiative', children: parentInitiativeReferenceLabel ? _jsx(Unlink, { size: 13 }) : _jsx(Link2, { size: 13 }) }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" }), parentInitiativeReferenceLabel ? (_jsxs(_Fragment, { children: [_jsx(PlanningReferenceBadge, { label: parentInitiativeReferenceLabel, entityType: "initiative" }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" })] })) : null] })) : null, _jsx(PlanningReferenceBadge, { label: detailReferenceLabel, entityType: detail.type })] })) : null, _jsx("h3", { className: panelStyles.detailTitle, children: detail.item.title }), _jsx("p", { className: panelStyles.detailDescription, children: detail.item.description?.trim() || (detail.type === 'initiative'
332
- ? 'A top-level planning container that groups related workstreams.'
333
- : 'A coordination lane that groups related tasks and keeps execution organized.') }), _jsx("div", { className: panelStyles.progressTrack, "aria-label": `${detail.item.progressPercent}% complete`, children: _jsx("div", { className: panelStyles.progressFill, style: { width: `${detail.item.progressPercent}%` } }) }), _jsxs("div", { className: panelStyles.detailActionRow, children: [_jsx("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: onEdit, children: _jsxs("span", { children: ["Edit ", detailLabel] }) }), detail.item.isArchived ? (_jsx("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: onUnarchive, children: _jsx("span", { children: "Unarchive" }) })) : (_jsx("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: onArchive, children: _jsx("span", { children: "Archive" }) }))] })] }), _jsxs("div", { className: panelStyles.metricGrid, children: [_jsxs("div", { className: panelStyles.metricCard, children: [_jsx("span", { className: panelStyles.metricValue, children: detail.item.taskCount }), _jsx("span", { className: panelStyles.metricLabel, children: "Tasks in scope" })] }), _jsxs("div", { className: panelStyles.metricCard, children: [_jsx("span", { className: panelStyles.metricValue, children: detail.item.completedTaskCount }), _jsx("span", { className: panelStyles.metricLabel, children: "Done / terminal" })] }), _jsxs("div", { className: panelStyles.metricCard, children: [_jsx("span", { className: panelStyles.metricValue, children: detail.item.ownerLabel || 'Unassigned' }), _jsx("span", { className: panelStyles.metricLabel, children: "Owner" })] }), _jsxs("div", { className: panelStyles.metricCard, children: [_jsx("span", { className: panelStyles.metricValue, children: (detail.item.commentCount || 0) + (detail.item.attachmentCount || 0) }), _jsx("span", { className: panelStyles.metricLabel, children: "Context items" })] })] }), _jsxs("div", { ref: setChildDropRef, className: `${panelStyles.listCard} ${canDropTask || canDropWorkstream ? panelStyles.sectionDropReady : ''} ${isChildDropOver ? panelStyles.sectionDropActive : ''} ${canDropTask || canDropWorkstream ? panelStyles.sectionDropMode : ''}`.trim(), children: [_jsxs("div", { className: panelStyles.sectionHeaderRow, children: [_jsx("div", { className: panelStyles.sectionTitle, children: childLabel }), _jsxs("div", { className: panelStyles.headerActionGroup, children: [archivedChildCount > 0 ? (_jsx("button", { type: "button", className: `tf-control-icon ${showArchivedChildren ? panelStyles.toggleActive : ''}`.trim(), title: showArchivedChildren ? `Hide ${archivedToggleLabel}` : `Show ${archivedToggleLabel}`, "aria-label": showArchivedChildren ? `Hide ${archivedToggleLabel}` : `Show ${archivedToggleLabel}`, "aria-pressed": showArchivedChildren, onClick: () => setShowArchivedChildren((current) => !current), children: showArchivedChildren ? _jsx(EyeOff, { size: 15 }) : _jsx(Eye, { size: 15 }) })) : null, detail.type === 'initiative' ? (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create workstream in this initiative", "aria-label": "Create workstream in this initiative", onClick: () => onCreateWorkstreamInInitiative?.(detail.item.id), children: _jsx(Plus, { size: 15 }) })) : (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create task in this workstream", "aria-label": "Create task in this workstream", onClick: () => onCreateTaskInWorkstream?.(detail.item.id), children: _jsx(Plus, { size: 15 }) }))] })] }), _jsxs("div", { className: panelStyles.attachReferenceRow, children: [_jsx(HierarchyActionBadge, { onClick: (event) => {
334
- event.stopPropagation();
335
- void handleAttachReference();
336
- }, disabled: !canAttachReference, title: attachActionLabel, ariaLabel: attachActionLabel, children: _jsx(Link2, { size: 13 }) }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" }), _jsx("input", { type: "text", className: `${styles.input} ${panelStyles.attachReferenceInput}`.trim(), placeholder: detail.type === 'initiative'
337
- ? 'Paste workstream reference (e.g. WS-123)'
338
- : 'Paste task reference (e.g. T-123)', disabled: isAttachingReference, value: attachReference, onChange: (event) => setAttachReference(event.target.value), onKeyDown: (event) => {
339
- if (event.key === 'Enter') {
340
- event.preventDefault();
341
- void handleAttachReference();
342
- }
343
- } }), _jsx("button", { type: "button", className: panelStyles.attachReferenceSubmit, disabled: !canAttachReference, onClick: () => void handleAttachReference(), children: isAttachingReference ? 'Attaching' : 'Attach' })] }), detail.type === 'initiative' ? (visibleChildItems.length > 0 ? visibleChildItems.map((workstream) => {
742
+ finally {
743
+ setIsChangingRelationship(false);
744
+ }
745
+ }, [isChangingRelationship, relationshipRecovery]);
746
+ const renderRelationshipFeedback = React.useCallback((entityType, entityId) => {
747
+ if (relationshipRecovery?.entityType === entityType && relationshipRecovery.id === entityId) {
748
+ return (_jsxs("div", { className: panelStyles.relationshipRecovery, role: "status", children: [_jsx("span", { children: relationshipRecovery.message }), _jsx("button", { type: "button", className: "tf-button-ghost tf-button-compact", disabled: isChangingRelationship, onClick: () => void handleUndoRelationship(), children: isChangingRelationship ? 'Restoring…' : 'Undo' })] }));
749
+ }
750
+ return null;
751
+ }, [handleUndoRelationship, isChangingRelationship, relationshipRecovery]);
752
+ const detachedRelationshipRecovery = relationshipRecovery && !linkedChildIds.has(relationshipRecovery.id) ? (_jsxs("div", { className: panelStyles.relationshipRecovery, role: "status", children: [_jsx("span", { children: relationshipRecovery.message }), _jsx("button", { type: "button", className: "tf-button-ghost tf-button-compact", disabled: isChangingRelationship, onClick: () => void handleUndoRelationship(), children: isChangingRelationship ? 'Restoring…' : 'Undo' })] })) : null;
753
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: panelStyles.detailHero, children: [_jsxs("div", { className: panelStyles.detailTopRow, children: [_jsxs("div", { className: panelStyles.detailReferenceRow, children: [detail.type === 'workstream' ? (_jsx(_Fragment, { children: parentInitiativeReferenceLabel ? (_jsxs(_Fragment, { children: [_jsx(PlanningReferenceBadge, { label: parentInitiativeReferenceLabel, entityType: "initiative", entityName: parentInitiative?.title }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" }), !inlineEditor ? (_jsx(HierarchyActionBadge, { disabled: !onAssignInitiativeToWorkstream, onClick: () => {
754
+ setPendingUnlink({
755
+ entityType: 'workstream',
756
+ id: detail.item.id,
757
+ referenceLabel: detailReferenceLabel,
758
+ title: detail.item.title,
759
+ parentLabel: parentInitiative
760
+ ? `${formatInitiativeReference(parentInitiative)} ${parentInitiative.title}`.trim()
761
+ : parentInitiativeReferenceLabel,
762
+ });
763
+ }, title: "Unlink workstream from initiative", ariaLabel: "Unlink workstream from initiative", children: _jsx(Unlink, { size: 14, "aria-hidden": "true" }) })) : null] })) : null })) : null, detail.type === 'workstream'
764
+ && !parentInitiativeReferenceLabel
765
+ && !inlineEditor ? (_jsx(HierarchyActionBadge, { disabled: !onAssignInitiativeToWorkstream, onClick: () => setShowParentLinkPicker(true), title: "Link initiative", ariaLabel: "Link initiative", ariaExpanded: showParentLinkPicker, children: _jsx(Link2, { size: 14, "aria-hidden": "true" }) })) : null, _jsx(PlanningReferenceBadge, { label: detailReferenceLabel || 'Reference pending', entityType: detail.type, entityName: detail.item.title, pending: !detailReferenceLabel })] }), _jsx("div", { className: panelStyles.detailTopActions, children: inlineEditor ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "tf-button-ghost tf-button-compact", onClick: inlineEditor.onCancel, disabled: inlineEditor.isSubmitting, children: "Cancel" }), _jsx("button", { type: "submit", form: inlineEditorFormId, className: "tf-button-primary tf-button-compact", disabled: inlineEditor.isSubmitting, children: inlineEditor.isSubmitting ? 'Saving…' : 'Save' })] })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "tf-control-icon", disabled: archiveDetailState.mode === 'blocked' || archiveDetailState.mode === 'checking', onClick: () => {
766
+ if (archiveDetailState.mode === 'archived') {
767
+ onUnarchive?.();
768
+ }
769
+ else if (archiveDetailState.mode === 'empty') {
770
+ onArchive?.();
771
+ }
772
+ else if (archiveDetailState.mode === 'ready') {
773
+ setArchiveEntityConfirmationVisible(true);
774
+ }
775
+ }, title: archiveActionLabel, "aria-label": archiveActionLabel, "aria-expanded": archiveDetailState.mode === 'ready'
776
+ ? archiveEntityConfirmationVisible
777
+ : undefined, children: archiveDetailState.mode === 'archived'
778
+ ? _jsx(RotateCcw, { size: 14, "aria-hidden": "true" })
779
+ : _jsx(Archive, { size: 14, "aria-hidden": "true" }) }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: () => {
780
+ setShowParentLinkPicker(false);
781
+ onEdit();
782
+ }, title: `Edit ${detailLabel.toLowerCase()} details`, "aria-label": `Edit ${detailLabel.toLowerCase()} details`, children: _jsx(Pencil, { size: 14, "aria-hidden": "true" }) })] })) })] }), archiveEntityConfirmationVisible && archiveDetailState.mode === 'ready' ? (_jsx(PlanningArchiveConfirmation, { entityType: detail.type, title: detail.item.title, activeTaskCount: detail.item.archiveActiveTaskCount, activeWorkstreamCount: detail.item.archiveActiveWorkstreamCount, busy: archiveEntityBusy, onCancel: () => setArchiveEntityConfirmationVisible(false), onConfirm: () => void handleConfirmArchiveEntity() })) : null, detail.type === 'workstream' ? renderRelationshipFeedback('workstream', detail.item.id) : null, detail.type === 'workstream' && !parentInitiativeReferenceLabel && showParentLinkPicker ? (_jsxs("div", { className: panelStyles.relationshipPickerRow, role: "group", "aria-label": "Link workstream to initiative", children: [_jsx(PlanningLinkPicker, { options: linkOptions.initiatives, entityLabel: "initiative", onSelect: handleLinkInitiative, disabled: !onAssignInitiativeToWorkstream || isChangingRelationship }), _jsx("button", { type: "button", className: "tf-control-icon tf-control-icon-compact", disabled: isChangingRelationship, onClick: () => setShowParentLinkPicker(false), title: "Cancel initiative link", "aria-label": "Cancel initiative link", children: _jsx(X, { size: 14, "aria-hidden": "true" }) })] })) : null, inlineEditor ? (_jsx(PlanningDrawerEditor, { editor: inlineEditor.editor, draftTitle: inlineEditor.draftTitle, draftDescription: inlineEditor.draftDescription, draftOwner: inlineEditor.draftOwner, draftInitiativeId: inlineEditor.draftInitiativeId, assigneeOptions: assigneeOptions, initiativeLinkOptions: linkOptions.initiatives, draftInitiativeSummary: inlineEditor.draftInitiativeSummary, onChangeDraftTitle: inlineEditor.onChangeDraftTitle, onChangeDraftDescription: inlineEditor.onChangeDraftDescription, onChangeDraftOwner: inlineEditor.onChangeDraftOwner, onChangeDraftInitiativeId: inlineEditor.onChangeDraftInitiativeId, onCancel: inlineEditor.onCancel, onSubmit: inlineEditor.onSubmit, isSubmitting: inlineEditor.isSubmitting, inline: true, formId: inlineEditorFormId })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: panelStyles.detailTitleRow, children: [_jsx(PlanningVisualIdentity, { entityType: detail.type, entityId: detail.item.id, icon: detail.item.icon, color: detail.item.color, size: "detail", disabled: Boolean(detail.item.isArchived), onChange: onChangePlanningIdentity
783
+ ? (patch) => onChangePlanningIdentity(detail.type, detail.item.id, patch)
784
+ : undefined }), _jsx("h3", { className: panelStyles.detailTitle, children: detail.item.title })] }), _jsx(PlanningEntityDescription, { description: detail.item.description, label: detailLabel, taskReferences: taskReferences, className: `${panelStyles.detailDescription} ${styles.appScrollbar} tf-scrollbar`.trim(), markdownClassName: panelStyles.detailDescriptionMarkdown })] })), _jsxs("div", { className: panelStyles.detailOwnerField, children: [_jsx("span", { className: panelStyles.detailOwnerLabel, children: "Owner" }), _jsx(PlanningOwnerDropdown, { value: ownerValue, disabled: !onChangeOwner || isSavingOwner, onChange: (nextOwnerId) => void handleOwnerChange(nextOwnerId), ariaLabel: `${detailLabel} owner`, options: assigneeOptions, className: `${planningDropdownStyles.control} ${panelStyles.ownerSelect}` })] }), detail.item.taskCount > 0 ? (_jsx(PlanningProgress, { value: detail.item.progressPercent, label: `${detail.item.progressPercent}% resolved`, statusCounts: detail.item.statusCounts })) : (_jsx(PlanningNoTasks, {})), _jsx(PlanningSummaryMeta, { item: detail.item, workstreamCount: detail.type === 'initiative'
785
+ ? detail.item.workstreamCount ?? detail.item.workstreams.length
786
+ : undefined, className: panelStyles.detailSummaryMeta }), detail.item.taskCount > 0 ? (_jsx("span", { className: panelStyles.passiveGuidance, children: "Lifetime progress includes archived tasks." })) : null] }), _jsxs("div", { ref: setChildDropRef, className: `${panelStyles.listCard} ${canDropTask || canDropWorkstream ? panelStyles.sectionDropReady : ''} ${isChildDropOver ? panelStyles.sectionDropActive : ''} ${canDropTask || canDropWorkstream ? panelStyles.sectionDropMode : ''}`.trim(), children: [_jsxs("div", { className: panelStyles.sectionHeaderRow, children: [_jsxs("div", { className: panelStyles.sectionTitle, children: [childLabel, " (", visibleChildCount, ")"] }), _jsx("div", { className: panelStyles.headerActionGroup, children: detail.type === 'initiative' ? (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create workstream in this initiative", "aria-label": "Create workstream in this initiative", onClick: () => onCreateWorkstreamInInitiative?.(detail.item.id), children: _jsx(Plus, { size: 15 }) })) : (_jsx("button", { type: "button", className: "tf-control-icon", title: "Create task in this workstream", "aria-label": "Create task in this workstream", onClick: () => onCreateTaskInWorkstream?.(detail.item.id), children: _jsx(Plus, { size: 15 }) })) })] }), _jsx("div", { className: panelStyles.linkPickerRow, children: _jsx(PlanningLinkPicker, { options: availableLinkOptions, entityLabel: detail.type === 'initiative' ? 'workstream' : 'task', onSelect: handleAttachReference, disabled: !hasAttachReferenceHandler || isAttachingReference }) }), detail.type === 'workstream' ? (_jsx(PlanningTaskArrangeControl, { value: taskArrangeMode, onChange: onTaskArrangeModeChange })) : null, detail.type === 'initiative' ? (visibleChildItems.length > 0 ? visibleChildItems.map((workstream) => {
344
787
  const workstreamReferenceLabel = formatWorkstreamReference(workstream);
345
788
  const handleOpenWorkstream = () => onOpenNestedWorkstreamDetails?.(workstream.id);
346
- return (_jsx("div", { className: `${panelStyles.listItemButton} ${panelStyles.detailCardButton}`.trim(), children: _jsxs("div", { className: `${panelStyles.listItem} ${panelStyles.detailChildCard} ${workstream.isArchived ? panelStyles.detailChildCardArchived : ''}`.trim(), children: [_jsx("div", { className: panelStyles.detailChildCardTopRow, children: _jsxs("div", { className: panelStyles.detailChildReferenceRow, children: [_jsx(HierarchyActionBadge, { onClick: (event) => {
347
- event.stopPropagation();
348
- onAssignInitiativeToWorkstream?.(workstream.id, null);
349
- }, title: "Remove from initiative", ariaLabel: "Remove from initiative", children: _jsx(Unlink, { size: 13 }) }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" }), workstreamReferenceLabel ? (_jsx(PlanningReferenceBadge, { label: workstreamReferenceLabel, entityType: "workstream" })) : _jsx("span", { "aria-hidden": "true" })] }) }), _jsxs("div", { role: "button", tabIndex: 0, className: panelStyles.listItemText, onClick: handleOpenWorkstream, onKeyDown: (event) => {
350
- if (event.key !== 'Enter' && event.key !== ' ')
351
- return;
352
- event.preventDefault();
353
- handleOpenWorkstream();
354
- }, children: [_jsx("span", { className: panelStyles.listItemTitle, children: workstream.title }), _jsxs("span", { className: panelStyles.listItemMeta, children: [workstream.taskCount, " tasks \u2022 ", workstream.progressPercent, "% complete", workstream.isArchived ? ' • archived' : ''] })] })] }) }, workstream.id));
355
- }) : (_jsxs("div", { className: panelStyles.emptyPanel, children: [_jsx("div", { className: panelStyles.emptyPanelTitle, children: "No workstreams yet" }), _jsx("div", { className: panelStyles.emptyPanelText, children: "Add the first workstream to break the initiative into clearer lanes of execution." })] }))) : (visibleTaskItems.length > 0 ? [...visibleTaskItems]
356
- .sort((left, right) => {
357
- const leftDone = getStatusDefinition(left.status).value === 'done';
358
- const rightDone = getStatusDefinition(right.status).value === 'done';
359
- if (leftDone === rightDone)
360
- return 0;
361
- return leftDone ? 1 : -1;
362
- })
363
- .map((task) => {
364
- const referenceLabel = task.referenceNumber ? `T-${task.referenceNumber}` : '';
365
- const statusDefinition = getStatusDefinition(task.status);
366
- const StatusIcon = IconMap[statusDefinition.icon || 'Square'];
367
- const statusColor = resolveColor(statusDefinition.color) || 'var(--text-secondary)';
368
- const handleOpenTask = () => onOpenTaskById?.(task.id);
369
- const taskMeta = `${formatTaskStatusLabel(task.status)}${task.isArchived ? ' • archived' : ''}`;
370
- return (_jsx("div", { className: `${panelStyles.listItemButton} ${panelStyles.detailCardButton}`.trim(), children: _jsxs("div", { className: `${panelStyles.listItem} ${panelStyles.detailChildCard} ${task.isArchived ? panelStyles.detailChildCardArchived : ''}`.trim(), children: [_jsxs("div", { className: panelStyles.detailChildCardTopRow, children: [_jsxs("div", { className: panelStyles.detailChildReferenceRow, children: [_jsx(HierarchyActionBadge, { onClick: (event) => {
789
+ const isSelected = selectedChildWorkstreamId === workstream.id;
790
+ const archiveConfirmationVisible = pendingArchiveWorkstreamId === workstream.id;
791
+ const handleConfirmArchiveWorkstream = async () => {
792
+ if (!onArchiveResolvedWorkstream || archiveWorkstreamBusy)
793
+ return;
794
+ setArchiveWorkstreamBusy(true);
795
+ try {
796
+ const archived = await onArchiveResolvedWorkstream(workstream.id);
797
+ if (archived)
798
+ setPendingArchiveWorkstreamId(null);
799
+ }
800
+ finally {
801
+ setArchiveWorkstreamBusy(false);
802
+ }
803
+ };
804
+ return (_jsx("div", { className: `${panelStyles.listItemButton} ${panelStyles.detailCardButton}`.trim(), children: _jsxs("div", { className: `${panelStyles.listItem} ${panelStyles.detailChildCard} ${isSelected ? panelStyles.detailChildCardSelected : ''} ${workstream.isArchived ? panelStyles.detailChildCardArchived : ''}`.trim(), children: [_jsxs("div", { className: panelStyles.detailChildCardTopRow, children: [_jsxs("div", { className: panelStyles.detailChildReferenceRow, children: [_jsx(HierarchyActionBadge, { disabled: !onAssignInitiativeToWorkstream, onClick: (event) => {
371
805
  event.stopPropagation();
372
- onRemoveTaskFromWorkstream?.(task.id, detail.item.id);
373
- }, title: "Remove from workstream", ariaLabel: "Remove from workstream", children: _jsx(Unlink, { size: 13 }) }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" }), referenceLabel ? (_jsx(PlanningReferenceBadge, { label: referenceLabel, entityType: "task" })) : _jsx("span", { "aria-hidden": "true" })] }), _jsx("span", { className: panelStyles.taskStatusIcon, style: {
374
- color: statusColor,
375
- }, "aria-label": statusDefinition.shortLabel || formatTaskStatusLabel(task.status), title: statusDefinition.shortLabel || formatTaskStatusLabel(task.status), children: StatusIcon ? _jsx(StatusIcon, { size: 18, strokeWidth: 2.4 }) : null })] }), _jsxs("div", { role: "button", tabIndex: 0, className: panelStyles.listItemText, onClick: handleOpenTask, onKeyDown: (event) => {
806
+ setPendingUnlink({
807
+ entityType: 'workstream',
808
+ id: workstream.id,
809
+ referenceLabel: workstreamReferenceLabel,
810
+ title: workstream.title,
811
+ parentLabel: `${detailReferenceLabel} ${detail.item.title}`.trim(),
812
+ });
813
+ }, title: `Unlink ${workstreamReferenceLabel || workstream.title} from initiative`, ariaLabel: `Unlink ${workstreamReferenceLabel || workstream.title} from initiative`, children: _jsx(Unlink, { size: 14, "aria-hidden": "true" }) }), workstreamReferenceLabel ? (_jsx(PlanningReferenceBadge, { label: workstreamReferenceLabel, entityType: "workstream", entityName: workstream.title })) : _jsx("span", { "aria-hidden": "true" })] }), _jsx("div", { className: panelStyles.detailChildActions, onClick: (event) => event.stopPropagation(), children: workstream.archiveReady && !workstream.isArchived && onArchiveResolvedWorkstream ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: () => setPendingArchiveWorkstreamId(workstream.id), title: "Archive completed workstream", "aria-label": `Archive completed workstream ${workstream.title}`, "aria-expanded": archiveConfirmationVisible, children: _jsx(Archive, { size: 14, "aria-hidden": "true" }) })) : null })] }), renderRelationshipFeedback('workstream', workstream.id), archiveConfirmationVisible ? (_jsx(PlanningArchiveConfirmation, { entityType: "workstream", title: workstream.title, activeTaskCount: workstream.archiveActiveTaskCount, busy: archiveWorkstreamBusy, onCancel: () => setPendingArchiveWorkstreamId(null), onConfirm: () => void handleConfirmArchiveWorkstream() })) : null, _jsx("div", { role: "button", tabIndex: 0, "aria-current": isSelected ? 'true' : undefined, className: panelStyles.listItemText, onClick: handleOpenWorkstream, onKeyDown: (event) => {
376
814
  if (event.key !== 'Enter' && event.key !== ' ')
377
815
  return;
378
816
  event.preventDefault();
379
- handleOpenTask();
380
- }, children: [_jsx("span", { className: panelStyles.listItemTitle, children: task.title }), _jsx("span", { className: panelStyles.listItemMeta, children: taskMeta })] })] }) }, task.id));
381
- }) : (_jsxs("div", { className: panelStyles.sectionNote, children: ["No tasks are linked to this workstream yet. Use the ", _jsx("code", { children: "+" }), " action above to add the first one."] })))] }), _jsx("div", { className: panelStyles.listCard, children: _jsx(React.Suspense, { fallback: _jsx(DeferredPlanningPanelFallback, {}), children: _jsx(DeferredContextAttachmentManager, { ownerType: detail.type, ownerId: detail.item.id, ownerReferenceLabel: detailReferenceLabel, workspaceId: currentWorkspaceId, attachments: detail.item.attachments || [], onAddAttachment: (file) => onAddPlanningContextFile?.(detail.type, detail.item.id, file), onRemoveAttachment: (index) => onRemovePlanningContextFile?.(detail.type, detail.item.id, index), onUpdateAttachmentCaption: (index, caption) => (onUpdatePlanningContextCaption?.(detail.type, detail.item.id, index, caption)) }) }) }), _jsxs("div", { className: panelStyles.listCard, children: [_jsx(DisclosureSectionHeader, { label: "Recent Activity", count: activityCount, showZeroCount: true, expanded: showRecentActivity, expandedTitle: "Hide recent activity", collapsedTitle: "Show recent activity", onToggle: () => setShowRecentActivity((current) => !current) }), showRecentActivity ? (_jsx(React.Suspense, { fallback: _jsx(DeferredPlanningPanelFallback, {}), children: _jsx(DeferredEntityActivityTimeline, { activity: detail.item.activity, comments: detail.item.comments, formatFieldValue: formatActivityFieldValue, resolveActorPresentation: resolveActivityActorPresentation, onOpenTaskById: onOpenTaskById, emptyMessage: `No ${detail.type} activity yet.`, listClassName: panelStyles.activityTimelineList, emptyClassName: panelStyles.activityTimelineEmpty }) })) : null] })] }));
817
+ handleOpenWorkstream();
818
+ }, children: _jsx(PlanningEntitySummary, { item: workstream, entityType: "workstream", ownerOption: workstream.ownerId && assigneeOptionByValue.has(workstream.ownerId)
819
+ ? toPlanningAssigneeOption(assigneeOptionByValue.get(workstream.ownerId))
820
+ : undefined, ownerOptions: assigneeOptions.map(toPlanningAssigneeOption), onChangeOwner: onChangePlanningOwner
821
+ ? (ownerId) => onChangePlanningOwner('workstream', workstream.id, ownerId === 'unassigned' ? '' : ownerId)
822
+ : undefined, onChangeIdentity: onChangePlanningIdentity
823
+ ? (patch) => onChangePlanningIdentity('workstream', workstream.id, patch)
824
+ : undefined }) })] }) }, workstream.id));
825
+ }) : (_jsx("div", { className: panelStyles.passiveGuidance, children: "No workstreams are linked to this initiative." }))) : (visibleTaskItems.length > 0 ? (_jsx(PlanningTaskOrderList, { tasks: visibleTaskItems, mode: taskArrangeMode, onReorder: onReorderWorkstreamTasks
826
+ ? (taskIds) => onReorderWorkstreamTasks(detail.item.id, mergeVisiblePlanningTaskOrder(arrangePlanningTasks(taskItems, 'execution'), taskIds))
827
+ : undefined, children: (task) => {
828
+ const referenceLabel = getTaskReferenceLabel(task) || task.id;
829
+ const statusDefinition = getStatusDefinition(task.status);
830
+ return (_jsx("div", { className: `${panelStyles.listItemButton} ${panelStyles.detailCardButton}`.trim(), children: _jsx(PlanningTaskCard, { task: task, assigneeOption: task.assignee && assigneeOptionByValue.has(task.assignee)
831
+ ? toPlanningAssigneeOption(assigneeOptionByValue.get(task.assignee))
832
+ : undefined, assigneeOptions: assigneeOptions.map(toPlanningAssigneeOption), showStatusLabel: showTaskCardStatusLabel, onOpen: onOpenTaskById ? () => onOpenTaskById(task.id) : undefined, onAssigneeChange: onChangeTaskAssignee
833
+ ? (assignee) => onChangeTaskAssignee(task.id, assignee)
834
+ : undefined, onStatusChange: onSetTaskStatus ? (status) => onSetTaskStatus(task.id, status) : undefined, feedback: renderRelationshipFeedback('task', task.id), referenceAction: (_jsx(HierarchyActionBadge, { disabled: !onAssignTaskToWorkstream, onClick: (event) => {
835
+ event.stopPropagation();
836
+ setPendingUnlink({
837
+ entityType: 'task',
838
+ id: task.id,
839
+ referenceLabel,
840
+ title: task.title,
841
+ parentLabel: `${detailReferenceLabel} ${detail.item.title}`.trim(),
842
+ });
843
+ }, title: `Unlink ${referenceLabel || task.title} from workstream`, ariaLabel: `Unlink ${referenceLabel || task.title} from workstream`, children: _jsx(Unlink, { size: 14, "aria-hidden": "true" }) })), actions: !task.isArchived
844
+ && (statusDefinition.value === 'done' || statusDefinition.value === 'cancelled')
845
+ && onArchivePlanningTask ? (_jsx("button", { type: "button", className: "tf-control-icon", disabled: archivingTaskId === task.id, onClick: async (event) => {
846
+ event.stopPropagation();
847
+ setArchivingTaskId(task.id);
848
+ try {
849
+ await onArchivePlanningTask(task.id);
850
+ }
851
+ finally {
852
+ setArchivingTaskId(null);
853
+ }
854
+ }, title: "Archive task", "aria-label": `Archive task ${referenceLabel || task.title}`, children: _jsx(Archive, { size: 14, "aria-hidden": "true" }) })) : undefined }) }, task.id));
855
+ } })) : (_jsx("div", { className: panelStyles.passiveGuidance, children: "No tasks are linked to this workstream." }))), detachedRelationshipRecovery] }), _jsx("div", { className: panelStyles.listCard, children: _jsx(PlanningEntityContext, { entityType: detail.type, entityId: detail.item.id, referenceLabel: detailReferenceLabel, workspaceId: currentWorkspaceId, attachments: detail.item.attachments, readOnly: Boolean(detail.item.isArchived), onAddAttachment: (file) => onAddPlanningContextFile?.(detail.type, detail.item.id, file), onRemoveAttachment: (index) => onRemovePlanningContextFile?.(detail.type, detail.item.id, index), onUpdateAttachmentCaption: (index, caption) => (onUpdatePlanningContextCaption?.(detail.type, detail.item.id, index, caption)) }) }), _jsx("div", { className: panelStyles.listCard, children: _jsx(PlanningEntityActivity, { entityType: detail.type, item: detail.item, assigneeOptions: assigneeOptions.map(toPlanningAssigneeOption), currentActorId: currentActorId, taskReferences: taskReferences, parentInitiative: parentInitiative, listClassName: panelStyles.activityTimelineList, emptyClassName: panelStyles.activityTimelineEmpty, hydrationState: hydrationState, onRetryHydration: onRetryHydration }) }), _jsx(PlanningUnlinkConfirmation, { item: pendingUnlink, busy: isChangingRelationship, theme: theme, onCancel: () => setPendingUnlink(null), onConfirm: () => void handleConfirmUnlink() })] }));
382
856
  }
383
- function PlanningDrawerEditor({ editor, draftTitle, draftDescription, draftOwner, draftInitiativeId, assigneeOptions, draftInitiativeSummary, onChangeDraftTitle, onChangeDraftDescription, onChangeDraftOwner, onChangeDraftInitiativeId, onCancel, onSubmit, isSubmitting, onAssignInitiativeToWorkstream, }) {
857
+ function PlanningDrawerEditor({ editor, draftTitle, draftDescription, draftOwner, draftInitiativeId, draftIcon, draftColor, assigneeOptions, initiativeLinkOptions, draftInitiativeSummary, onChangeDraftTitle, onChangeDraftDescription, onChangeDraftOwner, onChangeDraftInitiativeId, onChangeDraftIcon, onChangeDraftColor, onCancel, onSubmit, isSubmitting, inline = false, formId, }) {
384
858
  const entityLabel = editor.entityType === 'initiative' ? 'Initiative' : 'Workstream';
859
+ const titleInputId = React.useId();
860
+ const titleErrorId = React.useId();
861
+ const descriptionInputId = React.useId();
862
+ const titleInputRef = React.useRef(null);
863
+ const [titleError, setTitleError] = React.useState(null);
385
864
  const submitLabel = isSubmitting
386
865
  ? (editor.mode === 'create' ? `Creating ${entityLabel}...` : `Saving ${entityLabel}...`)
387
866
  : (editor.mode === 'create' ? `Create ${entityLabel}` : `Save ${entityLabel}`);
388
- const ownerOptions = React.useMemo(() => normalizePlanningOwnerOptions(assigneeOptions, draftOwner), [assigneeOptions, draftOwner]);
389
867
  const handleSubmit = React.useCallback((event) => {
390
868
  event.preventDefault();
869
+ if (!draftTitle.trim()) {
870
+ setTitleError(`${entityLabel} title is required.`);
871
+ titleInputRef.current?.focus();
872
+ return;
873
+ }
874
+ setTitleError(null);
391
875
  onSubmit();
392
- }, [onSubmit]);
393
- const handleSetInitiative = React.useCallback(() => {
394
- if (editor.mode !== 'edit' || editor.entityType !== 'workstream')
876
+ }, [draftTitle, entityLabel, onSubmit]);
877
+ const handleKeyDown = React.useCallback((event) => {
878
+ if (!inline || event.key !== 'Escape' || isSubmitting)
395
879
  return;
396
- onAssignInitiativeToWorkstream?.(editor.targetId);
397
- }, [editor, onAssignInitiativeToWorkstream]);
398
- return (_jsxs("form", { className: panelStyles.editorCard, onSubmit: handleSubmit, children: [_jsxs("div", { className: panelStyles.editorField, children: [_jsx("label", { className: panelStyles.editorLabel, children: "Title" }), _jsx("input", { className: styles.input, disabled: isSubmitting, value: draftTitle, onChange: (event) => onChangeDraftTitle(event.target.value), placeholder: editor.entityType === 'initiative' ? 'Q3 Product Launch' : 'Content Production' })] }), _jsxs("div", { className: panelStyles.editorField, children: [_jsx("label", { className: panelStyles.editorLabel, children: "Description" }), _jsx("textarea", { className: styles.textarea, disabled: isSubmitting, value: draftDescription, onChange: (event) => onChangeDraftDescription(event.target.value), placeholder: editor.entityType === 'initiative'
880
+ event.preventDefault();
881
+ onCancel();
882
+ }, [inline, isSubmitting, onCancel]);
883
+ return (_jsxs("form", { id: formId, className: `${panelStyles.editorCard} ${inline ? panelStyles.inlineEditorCard : ''}`.trim(), onSubmit: handleSubmit, onKeyDown: handleKeyDown, noValidate: true, children: [editor.mode === 'create' && onChangeDraftIcon && onChangeDraftColor ? (_jsxs("div", { className: panelStyles.editorIdentityField, children: [_jsx(PlanningVisualIdentity, { entityType: editor.entityType, entityId: "create-preview", icon: draftIcon, color: draftColor || 'blue', size: "detail", onChange: (patch) => {
884
+ if (Object.prototype.hasOwnProperty.call(patch, 'icon'))
885
+ onChangeDraftIcon(patch.icon ?? null);
886
+ if (Object.prototype.hasOwnProperty.call(patch, 'color'))
887
+ onChangeDraftColor(patch.color ?? null);
888
+ } }), _jsx("span", { children: "Choose an icon and color" })] })) : null, _jsxs("div", { className: panelStyles.editorField, children: [_jsxs("label", { className: panelStyles.editorLabel, htmlFor: titleInputId, children: [entityLabel, " title"] }), _jsx("input", { ref: titleInputRef, id: titleInputId, "data-planning-editor-title": true, className: styles.input, disabled: isSubmitting, required: true, "aria-invalid": titleError ? 'true' : undefined, "aria-describedby": titleError ? titleErrorId : undefined, value: draftTitle, onChange: (event) => {
889
+ if (titleError)
890
+ setTitleError(null);
891
+ onChangeDraftTitle(event.target.value);
892
+ }, placeholder: editor.entityType === 'initiative' ? 'Enter initiative title' : 'Enter workstream title' }), titleError ? _jsx("p", { id: titleErrorId, className: "tf-text-error", children: titleError }) : null] }), _jsxs("div", { className: panelStyles.editorField, children: [_jsxs("label", { className: panelStyles.editorLabel, htmlFor: descriptionInputId, children: [entityLabel, " description"] }), _jsx("textarea", { id: descriptionInputId, className: styles.textarea, disabled: isSubmitting, value: draftDescription, onChange: (event) => onChangeDraftDescription(event.target.value), placeholder: editor.entityType === 'initiative'
399
893
  ? 'Describe the broader outcome this initiative is meant to achieve.'
400
- : 'Describe the lane of work this workstream will coordinate.', rows: 5 })] }), editor.entityType === 'workstream' && (_jsxs("div", { className: panelStyles.editorField, children: [_jsx("label", { className: panelStyles.editorLabel, children: "Initiative" }), draftInitiativeSummary && (_jsxs("div", { className: panelStyles.editorHint, children: ["Current: ", draftInitiativeSummary.title] })), _jsxs("div", { className: panelStyles.attachReferenceRow, children: [editor.mode === 'edit' && (_jsxs(_Fragment, { children: [_jsx(HierarchyActionBadge, { onClick: (event) => {
401
- event.stopPropagation();
402
- handleSetInitiative();
403
- }, disabled: isSubmitting || !draftInitiativeId.trim(), title: "Attach workstream to initiative", ariaLabel: "Attach workstream to initiative", children: _jsx(Link2, { size: 13 }) }), _jsx("span", { className: styles.taskHierarchyDivider, children: "/" })] })), _jsx("input", { type: "text", className: `${styles.input} ${panelStyles.attachReferenceInput}`.trim(), disabled: isSubmitting, placeholder: "Paste initiative reference (e.g. IN-123)", value: draftInitiativeId, onChange: (event) => onChangeDraftInitiativeId(event.target.value), onKeyDown: (event) => {
404
- if (event.key !== 'Enter')
405
- return;
406
- event.preventDefault();
407
- handleSetInitiative();
408
- } })] })] })), _jsxs("div", { className: panelStyles.editorField, children: [_jsx("label", { className: panelStyles.editorLabel, children: "Owner" }), _jsxs("select", { className: `${styles.select} ${styles.groupBySelect}`, disabled: isSubmitting, value: draftOwner, onChange: (event) => onChangeDraftOwner(event.target.value), children: [_jsx("option", { value: "", children: "Unassigned" }), ownerOptions.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value)))] })] }), _jsxs("div", { className: panelStyles.editorActions, children: [_jsx("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: onCancel, disabled: isSubmitting, children: "Cancel" }), _jsx("button", { type: "submit", className: styles.primaryUpdateBtn, disabled: isSubmitting, children: submitLabel })] })] }));
894
+ : 'Describe the lane of work this workstream will coordinate.', rows: 5 })] }), editor.entityType === 'workstream' && (_jsxs("div", { className: panelStyles.editorField, children: [_jsx("span", { className: panelStyles.editorLabel, children: "Initiative" }), _jsxs("div", { className: panelStyles.editorRelationshipRow, children: [_jsx(PlanningLinkPicker, { options: initiativeLinkOptions, selectedId: draftInitiativeSummary?.id || '', entityLabel: "initiative", disabled: isSubmitting, onSelect: (option) => onChangeDraftInitiativeId(option.referenceLabel) }), draftInitiativeId.trim() ? (_jsx("button", { type: "button", className: "tf-button-ghost tf-button-compact", disabled: isSubmitting, onClick: () => onChangeDraftInitiativeId(''), children: "Remove" })) : null] })] })), !inline ? _jsxs("div", { className: panelStyles.editorField, children: [_jsxs("span", { className: panelStyles.editorLabel, children: [entityLabel, " owner"] }), _jsx(PlanningOwnerDropdown, { disabled: isSubmitting, value: draftOwner, onChange: onChangeDraftOwner, ariaLabel: `${entityLabel} owner`, options: assigneeOptions, className: panelStyles.editorSelect })] }) : null, !inline ? _jsxs("div", { className: panelStyles.editorActions, children: [_jsx("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: onCancel, disabled: isSubmitting, children: "Cancel" }), _jsx("button", { type: "submit", className: styles.primaryUpdateBtn, disabled: isSubmitting, children: submitLabel })] }) : null] }));
409
895
  }
410
- export function PlanningDrawer({ open, leftOffset = 0, initiatives, standaloneWorkstreams, allStandaloneWorkstreams, activeInitiativeId, activeWorkstreamId, expandedInitiativeIds, detail, editor, secondaryPane, currentWorkspaceId, assigneeOptions, draftInitiativeSummary, draftTitle, draftDescription, draftOwner, draftInitiativeId, onChangeDraftTitle, onChangeDraftDescription, onChangeDraftOwner, onChangeDraftInitiativeId, onCollapseTreePane, onExpandTreePane, onCollapsePrimaryPane, onExpandPrimaryPane, onCollapseSecondaryPane, onExpandSecondaryPane, onBackFromSecondary, treeCollapsed, primaryCollapsed, secondaryCollapsed, onCancelEditor, onSubmitEditor, isSubmittingEditor, onCreateInitiative, onCreateWorkstream, onToggleInitiative, onSelectInitiative, onSelectWorkstream, onOpenInitiativeDetails, onOpenWorkstreamDetails, onOpenNestedWorkstreamDetails, onEditInitiative, onEditWorkstream, onArchiveInitiative, onUnarchiveInitiative, onArchiveWorkstream, onUnarchiveWorkstream, onCreateTaskInWorkstream, onCreateWorkstreamInInitiative, onAssignInitiativeToWorkstream, onOpenTaskById, onRemoveTaskFromWorkstream, onAttachTaskToWorkstreamByReference, onAttachWorkstreamToInitiativeByReference, onAddPlanningContextFile, onRemovePlanningContextFile, onUpdatePlanningContextCaption, }) {
411
- const hasPrimaryPane = Boolean(detail || editor);
896
+ export function PlanningDrawer({ open, leftOffset = 0, returnFocusRef, onWidthChange, initiatives, standaloneWorkstreams, planningLoadState, onRetryPlanning, taskScope, activeInitiativeId, activeWorkstreamId, navigatorSort, navigatorSortReady, onNavigatorSortChange, taskArrangeMode = 'execution', onTaskArrangeModeChange = () => { }, onReorderWorkstreamTasks, planningFavorites, onTogglePlanningFavorite, favoritesSectionCollapsed, initiativesSectionCollapsed, workstreamsSectionCollapsed, onToggleFavoritesSection, onToggleInitiativesSection, onToggleWorkstreamsSection, expandedInitiativeIds, detail, editor, secondaryEditor = null, secondaryPane, primaryHydrationState, secondaryHydrationState, onRetryPrimaryHydration, onRetrySecondaryHydration, currentWorkspaceId, currentOwnerId, theme, assigneeOptions, linkOptions, showTaskCardStatusLabel = false, draftInitiativeSummary, draftTitle, draftDescription, draftOwner, draftInitiativeId, draftIcon = null, draftColor = null, onChangeDraftTitle, onChangeDraftDescription, onChangeDraftOwner, onChangeDraftInitiativeId, onChangeDraftIcon = () => { }, onChangeDraftColor = () => { }, onCollapseTreePane, onExpandTreePane, onCollapsePrimaryPane, onExpandPrimaryPane, onCollapseSecondaryPane, onExpandSecondaryPane, onBackFromSecondary, treeCollapsed, primaryCollapsed, secondaryCollapsed, onCancelEditor, onCancelSecondaryEditor, onSubmitEditor, isSubmittingEditor, onCreateInitiative, onCreateWorkstream, onToggleInitiative, onSelectInitiative, onSelectWorkstream, onOpenInitiativeDetails, onOpenWorkstreamDetails, onOpenNestedWorkstreamDetails, onEditInitiative, onEditWorkstream, onChangePlanningOwner, onChangePlanningIdentity = () => { }, onChangeTaskAssignee, onArchiveInitiative, onUnarchiveInitiative, onArchiveWorkstream, onUnarchiveWorkstream, onArchivePlanningTask, onArchiveResolvedWorkstream, onArchiveResolvedInitiative, onCreateTaskInWorkstream, onCreateWorkstreamInInitiative, onAssignInitiativeToWorkstream, onOpenTaskById, onSetTaskStatus, taskReferences, onAssignTaskToWorkstream, onAttachTaskToWorkstreamByReference, onAttachWorkstreamToInitiativeByReference, onAddPlanningContextFile, onRemovePlanningContextFile, onUpdatePlanningContextCaption, }) {
897
+ const primaryInlineEditor = editor?.mode === 'edit'
898
+ && detail
899
+ && editor.entityType === detail.type
900
+ && editor.targetId === detail.item.id
901
+ ? editor
902
+ : null;
903
+ const secondaryInlineEditor = secondaryEditor?.mode === 'edit'
904
+ && secondaryPane?.kind === 'detail'
905
+ && secondaryEditor.entityType === secondaryPane.detail.type
906
+ && secondaryEditor.targetId === secondaryPane.detail.item.id
907
+ ? secondaryEditor
908
+ : null;
909
+ const dedicatedPrimaryEditor = editor && !primaryInlineEditor ? editor : null;
910
+ const hasPrimaryPane = Boolean(detail || dedicatedPrimaryEditor);
412
911
  const hasSecondaryPane = Boolean(secondaryPane);
413
- const drawerWidth = getPlanningDrawerWidthPx(treeCollapsed, hasPrimaryPane, primaryCollapsed, hasSecondaryPane, secondaryCollapsed);
414
- const primaryPaneLabel = editor
415
- ? (editor.entityType === 'initiative'
416
- ? (editor.mode === 'create' ? 'New Initiative' : 'Edit Initiative')
417
- : (editor.mode === 'create' ? 'New Workstream' : 'Edit Workstream'))
912
+ const primaryEntityType = dedicatedPrimaryEditor?.entityType || detail?.type || null;
913
+ const primaryIsInitiative = primaryEntityType === 'initiative';
914
+ const primaryIsWorkstream = primaryEntityType === 'workstream';
915
+ const [initiativeRelationshipExpanded, setInitiativeRelationshipExpanded] = React.useState(false);
916
+ const [workstreamRelationshipExpanded, setWorkstreamRelationshipExpanded] = React.useState(false);
917
+ const [showArchivedPlanning, setShowArchivedPlanning] = React.useState(false);
918
+ const [archivedDetailVisibility, setArchivedDetailVisibility] = React.useState({ initiative: false, workstream: false });
919
+ const archivedPlanningItemCount = React.useMemo(() => {
920
+ const allWorkstreams = [
921
+ ...initiatives.flatMap((initiative) => initiative.allWorkstreams || initiative.workstreams),
922
+ ...standaloneWorkstreams,
923
+ ];
924
+ return initiatives.filter((initiative) => Boolean(initiative.isArchived)).length
925
+ + allWorkstreams.filter((workstream) => Boolean(workstream.isArchived)).length
926
+ + allWorkstreams.reduce((count, workstream) => (count + (workstream.tasks || []).filter((task) => Boolean(task.isArchived)).length), 0);
927
+ }, [initiatives, standaloneWorkstreams]);
928
+ const { availableWidth, layoutMode } = usePlanningDrawerViewport(leftOffset);
929
+ const wideLayout = layoutMode === 'wide';
930
+ const effectiveTreeCollapsed = wideLayout && treeCollapsed;
931
+ const effectivePrimaryCollapsed = wideLayout && primaryCollapsed;
932
+ const effectiveSecondaryCollapsed = wideLayout && secondaryCollapsed;
933
+ const initiativeSlotCollapsed = primaryIsInitiative
934
+ ? effectivePrimaryCollapsed
935
+ : !initiativeRelationshipExpanded;
936
+ const workstreamSlotCollapsed = primaryIsWorkstream
937
+ ? effectivePrimaryCollapsed
938
+ : hasSecondaryPane
939
+ ? effectiveSecondaryCollapsed
940
+ : !workstreamRelationshipExpanded;
941
+ const wideDrawerWidth = getPlanningDrawerWidthPx(effectiveTreeCollapsed, true, initiativeSlotCollapsed, true, workstreamSlotCollapsed);
942
+ const showTreePane = layoutMode !== 'narrow' || (!hasPrimaryPane && !hasSecondaryPane);
943
+ const showPrimaryPane = hasPrimaryPane && (wideLayout || !hasSecondaryPane);
944
+ const showSecondaryPane = hasSecondaryPane;
945
+ const adaptiveHasDetailPane = showPrimaryPane || showSecondaryPane;
946
+ const requestedDrawerWidth = wideLayout
947
+ ? wideDrawerWidth
948
+ : layoutMode === 'medium'
949
+ ? PLANNING_DRAWER_TREE_WIDTH_PX + (adaptiveHasDetailPane ? PLANNING_DRAWER_DETAIL_WIDTH_PX : 0)
950
+ : availableWidth;
951
+ const drawerWidth = Math.max(0, Math.min(requestedDrawerWidth, availableWidth));
952
+ const adaptiveDetailWidth = Math.max(0, drawerWidth - (showTreePane ? PLANNING_DRAWER_TREE_WIDTH_PX : 0));
953
+ const primaryPaneLabel = dedicatedPrimaryEditor
954
+ ? (dedicatedPrimaryEditor.entityType === 'initiative'
955
+ ? (dedicatedPrimaryEditor.mode === 'create' ? 'New Initiative' : 'Edit Initiative')
956
+ : (dedicatedPrimaryEditor.mode === 'create' ? 'New Workstream' : 'Edit Workstream'))
418
957
  : (detail?.type === 'initiative' ? 'Initiative' : 'Workstream');
419
958
  const secondaryPaneLabel = secondaryPane?.kind === 'editor'
420
959
  ? (secondaryPane.editor.mode === 'create' ? 'New Workstream' : 'Edit Workstream')
421
960
  : 'Workstream';
961
+ const primaryArchiveDetail = dedicatedPrimaryEditor ? null : detail;
962
+ const secondaryArchiveDetail = secondaryPane?.kind === 'detail' ? secondaryPane.detail : null;
963
+ const toggleArchivedDetailVisibility = React.useCallback((entityType) => {
964
+ setArchivedDetailVisibility((current) => ({
965
+ ...current,
966
+ [entityType]: !current[entityType],
967
+ }));
968
+ }, []);
422
969
  const resolveParentInitiative = React.useCallback((workstream) => {
423
970
  const initiativeId = String(workstream.initiativeId || '').trim();
424
971
  if (!initiativeId)
425
972
  return null;
426
973
  return initiatives.find((initiative) => initiative.id === initiativeId) || null;
427
974
  }, [initiatives]);
428
- return (_jsx("aside", { style: {
975
+ const treePaneRef = React.useRef(null);
976
+ const primaryPaneRef = React.useRef(null);
977
+ const secondaryPaneRef = React.useRef(null);
978
+ const initiativeRelationshipPaneRef = React.useRef(null);
979
+ const workstreamRelationshipPaneRef = React.useRef(null);
980
+ const previousOpenRef = React.useRef(open);
981
+ const previousFocusKeyRef = React.useRef('');
982
+ const focusKey = secondaryInlineEditor
983
+ ? `secondary:inline-editor:${secondaryInlineEditor.targetId}`
984
+ : secondaryPane
985
+ ? `secondary:${secondaryPane.kind}:${secondaryPane.kind === 'detail' ? secondaryPane.detail.item.id : `${secondaryPane.editor.mode}:${secondaryPane.editor.entityType}:${secondaryPane.editor.mode === 'edit' ? secondaryPane.editor.targetId : ''}`}`
986
+ : primaryInlineEditor
987
+ ? `primary:inline-editor:${primaryInlineEditor.targetId}`
988
+ : dedicatedPrimaryEditor
989
+ ? `primary:editor:${dedicatedPrimaryEditor.mode}:${dedicatedPrimaryEditor.entityType}:${dedicatedPrimaryEditor.mode === 'edit' ? dedicatedPrimaryEditor.targetId : ''}`
990
+ : detail
991
+ ? `primary:detail:${detail.type}:${detail.item.id}`
992
+ : 'tree';
993
+ React.useEffect(() => {
994
+ const wasOpen = previousOpenRef.current;
995
+ previousOpenRef.current = open;
996
+ if (wasOpen && !open) {
997
+ returnFocusRef?.current?.focus();
998
+ previousFocusKeyRef.current = '';
999
+ return;
1000
+ }
1001
+ if (!open || (wasOpen && previousFocusKeyRef.current === focusKey))
1002
+ return;
1003
+ previousFocusKeyRef.current = focusKey;
1004
+ const pane = showSecondaryPane
1005
+ ? secondaryPaneRef.current
1006
+ : showPrimaryPane
1007
+ ? primaryPaneRef.current
1008
+ : treePaneRef.current;
1009
+ const frame = window.requestAnimationFrame(() => {
1010
+ const target = pane?.querySelector('[data-planning-editor-title]')
1011
+ || pane?.querySelector('[data-planning-pane-heading]');
1012
+ target?.focus();
1013
+ });
1014
+ return () => window.cancelAnimationFrame(frame);
1015
+ }, [focusKey, open, returnFocusRef, showPrimaryPane, showSecondaryPane]);
1016
+ const handleBackFromPrimary = React.useCallback(() => {
1017
+ if (editor) {
1018
+ onCancelEditor();
1019
+ return;
1020
+ }
1021
+ if (detail?.type === 'initiative')
1022
+ onOpenInitiativeDetails('');
1023
+ if (detail?.type === 'workstream')
1024
+ onOpenWorkstreamDetails('');
1025
+ }, [detail, editor, onCancelEditor, onOpenInitiativeDetails, onOpenWorkstreamDetails]);
1026
+ const paneWidthStyle = React.useCallback((width) => ({
1027
+ flex: `0 0 ${width}px`,
1028
+ width: `${width}px`,
1029
+ minWidth: `${width}px`,
1030
+ maxWidth: `${width}px`,
1031
+ }), []);
1032
+ React.useEffect(() => {
1033
+ onWidthChange?.(drawerWidth);
1034
+ }, [drawerWidth, onWidthChange]);
1035
+ React.useEffect(() => {
1036
+ if (!initiativeRelationshipExpanded)
1037
+ return;
1038
+ initiativeRelationshipPaneRef.current
1039
+ ?.querySelector('[data-planning-pane-heading]')
1040
+ ?.focus();
1041
+ }, [initiativeRelationshipExpanded]);
1042
+ React.useEffect(() => {
1043
+ if (!workstreamRelationshipExpanded)
1044
+ return;
1045
+ workstreamRelationshipPaneRef.current
1046
+ ?.querySelector('[data-planning-pane-heading]')
1047
+ ?.focus();
1048
+ }, [workstreamRelationshipExpanded]);
1049
+ const directWorkstream = detail?.type === 'workstream' ? detail.item : null;
1050
+ const parentInitiative = directWorkstream ? resolveParentInitiative(directWorkstream) : draftInitiativeSummary;
1051
+ const hasInitiativeRelationship = Boolean(parentInitiative || String(directWorkstream?.initiativeId || '').trim());
1052
+ const initiativeRelationship = parentInitiative
1053
+ ? {
1054
+ title: parentInitiative.title,
1055
+ description: directWorkstream
1056
+ ? `${directWorkstream.title} belongs to this initiative.`
1057
+ : 'This workstream will belong to the selected initiative.',
1058
+ action: directWorkstream
1059
+ ? { label: 'Open initiative', onClick: () => onOpenInitiativeDetails(parentInitiative.id) }
1060
+ : undefined,
1061
+ }
1062
+ : directWorkstream && hasInitiativeRelationship
1063
+ ? {
1064
+ title: 'Initiative unavailable',
1065
+ description: `${directWorkstream.title} is assigned to an initiative that is not available in the current planning data.`,
1066
+ }
1067
+ : directWorkstream
1068
+ ? {
1069
+ title: 'Not linked to an initiative',
1070
+ }
1071
+ : {
1072
+ title: 'No initiative selected',
1073
+ };
1074
+ const workstreamRelationship = {
1075
+ title: 'No workstream selected',
1076
+ };
1077
+ return (_jsx("aside", { className: panelStyles.drawer, "aria-label": "Planning", "aria-hidden": !open, inert: !open, "data-layout": layoutMode, style: {
429
1078
  position: 'absolute',
430
1079
  top: 0,
431
1080
  left: open ? `${leftOffset}px` : `${leftOffset - drawerWidth - 24}px`,
432
1081
  bottom: 0,
433
1082
  width: `${drawerWidth}px`,
434
- minWidth: `${drawerWidth}px`,
1083
+ minWidth: 0,
1084
+ maxWidth: `calc(100vw - ${leftOffset}px)`,
435
1085
  borderRight: '1px solid var(--border-color)',
436
1086
  background: 'var(--bg-secondary)',
437
1087
  boxSizing: 'border-box',
@@ -442,26 +1092,45 @@ export function PlanningDrawer({ open, leftOffset = 0, initiatives, standaloneWo
442
1092
  pointerEvents: open ? 'auto' : 'none',
443
1093
  transition: 'left 220ms cubic-bezier(0.4, 0, 0.2, 1)',
444
1094
  willChange: 'left',
445
- }, children: _jsxs("div", { className: panelStyles.drawerBody, children: [treeCollapsed ? (_jsx(CollapsedPane, { label: "Planning", onExpand: onExpandTreePane })) : (_jsxs("div", { className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.treePane} ${hasPrimaryPane && !primaryCollapsed ? panelStyles.treePaneSplit : ''}`.trim(), style: {
446
- flex: `0 0 ${PLANNING_DRAWER_TREE_WIDTH_PX}px`,
447
- width: `${PLANNING_DRAWER_TREE_WIDTH_PX}px`,
448
- minWidth: `${PLANNING_DRAWER_TREE_WIDTH_PX}px`,
449
- maxWidth: `${PLANNING_DRAWER_TREE_WIDTH_PX}px`,
450
- }, children: [_jsxs("div", { className: panelStyles.paneHeader, children: [_jsx("span", { className: panelStyles.paneHeaderLabel, children: "Planning" }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapseTreePane, children: _jsx(ChevronLeft, { size: 16 }) })] }), _jsx("div", { className: panelStyles.paneContent, children: _jsx(PlanningDrawerList, { initiatives: initiatives, standaloneWorkstreams: standaloneWorkstreams, allStandaloneWorkstreams: allStandaloneWorkstreams, activeInitiativeId: activeInitiativeId, activeWorkstreamId: activeWorkstreamId, expandedInitiativeIds: expandedInitiativeIds, detail: detail, secondaryPane: secondaryPane, onCreateInitiative: onCreateInitiative, onCreateWorkstream: onCreateWorkstream, onToggleInitiative: onToggleInitiative, onSelectInitiative: onSelectInitiative, onSelectWorkstream: onSelectWorkstream, onOpenInitiativeDetails: onOpenInitiativeDetails, onOpenWorkstreamDetails: onOpenWorkstreamDetails }) })] })), hasPrimaryPane && (primaryCollapsed ? (_jsx(CollapsedPane, { label: primaryPaneLabel, onExpand: onExpandPrimaryPane })) : (_jsxs("div", { className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.detailPane}`.trim(), style: {
451
- flex: `0 0 ${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
452
- width: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
453
- minWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
454
- maxWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
455
- }, children: [_jsxs("div", { className: panelStyles.paneHeader, children: [_jsx("span", { className: panelStyles.paneHeaderLabel, children: primaryPaneLabel }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapsePrimaryPane, children: _jsx(ChevronLeft, { size: 16 }) })] }), _jsx("div", { className: panelStyles.paneContent, children: editor ? (_jsx(PlanningDrawerEditor, { editor: editor, draftTitle: draftTitle, draftDescription: draftDescription, draftOwner: draftOwner, draftInitiativeId: draftInitiativeId, assigneeOptions: assigneeOptions, draftInitiativeSummary: draftInitiativeSummary, onChangeDraftTitle: onChangeDraftTitle, onChangeDraftDescription: onChangeDraftDescription, onChangeDraftOwner: onChangeDraftOwner, onChangeDraftInitiativeId: onChangeDraftInitiativeId, onCancel: onCancelEditor, onSubmit: onSubmitEditor, isSubmitting: isSubmittingEditor, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream })) : detail ? (_jsx(PlanningDrawerDetailView, { detail: detail, currentWorkspaceId: currentWorkspaceId, assigneeOptions: assigneeOptions, onOpenNestedWorkstreamDetails: detail.type === 'initiative' ? onOpenNestedWorkstreamDetails : undefined, onCreateTaskInWorkstream: detail.type === 'workstream' ? onCreateTaskInWorkstream : undefined, onCreateWorkstreamInInitiative: detail.type === 'initiative' ? onCreateWorkstreamInInitiative : undefined, onOpenTaskById: detail.type === 'workstream' ? onOpenTaskById : undefined, onRemoveTaskFromWorkstream: detail.type === 'workstream' ? onRemoveTaskFromWorkstream : undefined, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference: detail.type === 'workstream' ? onAttachTaskToWorkstreamByReference : undefined, onAttachWorkstreamToInitiativeByReference: detail.type === 'initiative' ? onAttachWorkstreamToInitiativeByReference : undefined, parentInitiative: detail.type === 'workstream' ? resolveParentInitiative(detail.item) : null, onEdit: () => detail.type === 'initiative'
1095
+ }, children: _jsxs("div", { className: panelStyles.drawerBody, children: [showTreePane && (effectiveTreeCollapsed ? (_jsx(CollapsedPane, { label: "Planning", onExpand: onExpandTreePane })) : (_jsxs("div", { ref: treePaneRef, "data-planning-pane": "tree", className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.treePane} ${hasPrimaryPane && !primaryCollapsed ? panelStyles.treePaneSplit : ''}`.trim(), style: paneWidthStyle(layoutMode === 'narrow' ? drawerWidth : PLANNING_DRAWER_TREE_WIDTH_PX), children: [_jsxs("div", { className: panelStyles.paneHeader, children: [_jsx("h2", { className: panelStyles.paneHeaderLabel, tabIndex: -1, "data-planning-pane-heading": true, children: "Planning" }), _jsxs("div", { className: panelStyles.headerActionGroup, children: [_jsx(ArchiveVisibilityToggle, { visible: showArchivedPlanning, disabled: taskScope === 'deleted' || archivedPlanningItemCount === 0, disabledLabel: taskScope === 'deleted' ? 'Archive visibility unavailable in Trash' : undefined, itemLabel: "planning items", onToggle: () => setShowArchivedPlanning((current) => !current) }), wideLayout ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapseTreePane, "aria-label": "Collapse Planning pane", title: "Collapse Planning pane", children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })) : null] })] }), _jsx("div", { className: panelStyles.paneContent, "aria-busy": planningLoadState.status === 'loading' || planningLoadState.isRefreshing, children: _jsx(PlanningDrawerList, { initiatives: initiatives, standaloneWorkstreams: standaloneWorkstreams, planningLoadState: planningLoadState, taskScope: taskScope, showArchivedPlanning: showArchivedPlanning, currentOwnerId: currentOwnerId, assigneeOptions: assigneeOptions, showTaskCardStatusLabel: showTaskCardStatusLabel, taskArrangeMode: taskArrangeMode, activeInitiativeId: activeInitiativeId, activeWorkstreamId: activeWorkstreamId, navigatorSort: navigatorSort, navigatorSortReady: navigatorSortReady, onNavigatorSortChange: onNavigatorSortChange, planningFavorites: planningFavorites, onTogglePlanningFavorite: onTogglePlanningFavorite, favoritesSectionCollapsed: favoritesSectionCollapsed, initiativesSectionCollapsed: initiativesSectionCollapsed, workstreamsSectionCollapsed: workstreamsSectionCollapsed, onToggleFavoritesSection: onToggleFavoritesSection, onToggleInitiativesSection: onToggleInitiativesSection, onToggleWorkstreamsSection: onToggleWorkstreamsSection, expandedInitiativeIds: expandedInitiativeIds, detail: detail, secondaryPane: secondaryPane, onCreateInitiative: onCreateInitiative, onCreateWorkstream: onCreateWorkstream, onToggleInitiative: onToggleInitiative, onSelectInitiative: onSelectInitiative, onSelectWorkstream: onSelectWorkstream, onOpenInitiativeDetails: onOpenInitiativeDetails, onOpenWorkstreamDetails: onOpenWorkstreamDetails, onOpenNestedWorkstreamDetails: onOpenNestedWorkstreamDetails, onOpenTaskById: onOpenTaskById, onSetTaskStatus: onSetTaskStatus, onChangePlanningOwner: onChangePlanningOwner, onChangePlanningIdentity: onChangePlanningIdentity, onChangeTaskAssignee: onChangeTaskAssignee, onArchivePlanningTask: onArchivePlanningTask, onArchiveResolvedWorkstream: onArchiveResolvedWorkstream, onArchiveResolvedInitiative: onArchiveResolvedInitiative, linkOptions: linkOptions, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream, onRetryPlanning: onRetryPlanning }) })] }))), wideLayout && !primaryIsInitiative && (initiativeRelationshipExpanded ? (_jsx(RelationshipPane, { label: "Initiative", title: initiativeRelationship.title, description: initiativeRelationship.description, action: initiativeRelationship.action, onCollapse: () => setInitiativeRelationshipExpanded(false), paneRef: initiativeRelationshipPaneRef })) : (_jsx(CollapsedPane, { label: "Initiative", muted: !hasInitiativeRelationship, onExpand: () => setInitiativeRelationshipExpanded(true) }))), showPrimaryPane && (effectivePrimaryCollapsed ? (_jsx(CollapsedPane, { label: primaryEntityType === 'initiative' ? 'Initiative' : 'Workstream', onExpand: onExpandPrimaryPane })) : (_jsxs("div", { ref: primaryPaneRef, "data-planning-pane": "primary", className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.detailPane}`.trim(), style: paneWidthStyle(wideLayout ? PLANNING_DRAWER_DETAIL_WIDTH_PX : adaptiveDetailWidth), children: [_jsxs("div", { className: panelStyles.paneHeader, children: [layoutMode === 'narrow' ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: handleBackFromPrimary, "aria-label": "Back to Planning", title: "Back to Planning", children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })) : null, _jsx("h2", { className: panelStyles.paneHeaderLabel, tabIndex: -1, "data-planning-pane-heading": true, children: primaryPaneLabel }), _jsxs("div", { className: panelStyles.headerActionGroup, children: [primaryArchiveDetail ? (_jsx(ArchiveVisibilityToggle, { visible: archivedDetailVisibility[primaryArchiveDetail.type], disabled: countArchivedDetailChildren(primaryArchiveDetail) === 0, itemLabel: primaryArchiveDetail.type === 'initiative' ? 'workstreams' : 'tasks', onToggle: () => toggleArchivedDetailVisibility(primaryArchiveDetail.type) })) : null, wideLayout ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapsePrimaryPane, "aria-label": `Collapse ${primaryPaneLabel} pane`, title: `Collapse ${primaryPaneLabel} pane`, children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })) : null] })] }), _jsx("div", { className: panelStyles.paneContent, "aria-busy": primaryHydrationState?.status === 'loading', children: dedicatedPrimaryEditor ? (_jsx(PlanningDrawerEditor, { editor: dedicatedPrimaryEditor, draftTitle: draftTitle, draftDescription: draftDescription, draftOwner: draftOwner, draftInitiativeId: draftInitiativeId, draftIcon: draftIcon, draftColor: draftColor, assigneeOptions: assigneeOptions, initiativeLinkOptions: linkOptions.initiatives, draftInitiativeSummary: draftInitiativeSummary, onChangeDraftTitle: onChangeDraftTitle, onChangeDraftDescription: onChangeDraftDescription, onChangeDraftOwner: onChangeDraftOwner, onChangeDraftInitiativeId: onChangeDraftInitiativeId, onChangeDraftIcon: onChangeDraftIcon, onChangeDraftColor: onChangeDraftColor, onCancel: onCancelEditor, onSubmit: onSubmitEditor, isSubmitting: isSubmittingEditor })) : detail ? (_jsx(PlanningDrawerDetailView, { detail: detail, showArchivedChildren: archivedDetailVisibility[detail.type], inlineEditor: primaryInlineEditor ? {
1096
+ editor: primaryInlineEditor,
1097
+ draftTitle,
1098
+ draftDescription,
1099
+ draftOwner,
1100
+ draftInitiativeId,
1101
+ draftInitiativeSummary,
1102
+ onChangeDraftTitle,
1103
+ onChangeDraftDescription,
1104
+ onChangeDraftOwner,
1105
+ onChangeDraftInitiativeId,
1106
+ onCancel: onCancelEditor,
1107
+ onSubmit: onSubmitEditor,
1108
+ isSubmitting: isSubmittingEditor,
1109
+ } : null, selectedChildWorkstreamId: secondaryPane?.kind === 'detail'
1110
+ ? secondaryPane.detail.item.id
1111
+ : null, currentWorkspaceId: currentWorkspaceId, currentActorId: currentOwnerId, theme: theme, assigneeOptions: assigneeOptions, linkOptions: linkOptions, showTaskCardStatusLabel: showTaskCardStatusLabel, taskArrangeMode: taskArrangeMode, onTaskArrangeModeChange: onTaskArrangeModeChange, onReorderWorkstreamTasks: onReorderWorkstreamTasks, hydrationState: primaryHydrationState, onRetryHydration: onRetryPrimaryHydration, onSetTaskStatus: detail.type === 'workstream' ? onSetTaskStatus : undefined, onArchivePlanningTask: detail.type === 'workstream' ? onArchivePlanningTask : undefined, onArchiveResolvedWorkstream: detail.type === 'initiative' ? onArchiveResolvedWorkstream : undefined, onArchiveResolvedEntity: detail.type === 'initiative'
1112
+ ? onArchiveResolvedInitiative
1113
+ : onArchiveResolvedWorkstream, onOpenNestedWorkstreamDetails: detail.type === 'initiative' ? onOpenNestedWorkstreamDetails : undefined, onCreateTaskInWorkstream: detail.type === 'workstream' ? onCreateTaskInWorkstream : undefined, onCreateWorkstreamInInitiative: detail.type === 'initiative' ? onCreateWorkstreamInInitiative : undefined, onOpenTaskById: detail.type === 'workstream' ? onOpenTaskById : undefined, onChangeTaskAssignee: detail.type === 'workstream' ? onChangeTaskAssignee : undefined, taskReferences: taskReferences, onAssignTaskToWorkstream: detail.type === 'workstream' ? onAssignTaskToWorkstream : undefined, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference: detail.type === 'workstream' ? onAttachTaskToWorkstreamByReference : undefined, onAttachWorkstreamToInitiativeByReference: detail.type === 'initiative' ? onAttachWorkstreamToInitiativeByReference : undefined, parentInitiative: detail.type === 'workstream' ? resolveParentInitiative(detail.item) : null, onEdit: () => detail.type === 'initiative'
456
1114
  ? onEditInitiative(detail.item.id)
457
- : onEditWorkstream(detail.item.id), onArchive: () => detail.type === 'initiative'
1115
+ : onEditWorkstream(detail.item.id), onChangeOwner: (ownerId) => onChangePlanningOwner(detail.type, detail.item.id, ownerId), onChangePlanningOwner: onChangePlanningOwner, onChangePlanningIdentity: onChangePlanningIdentity, onArchive: () => detail.type === 'initiative'
458
1116
  ? onArchiveInitiative(detail.item.id)
459
1117
  : onArchiveWorkstream(detail.item.id), onUnarchive: () => detail.type === 'initiative'
460
1118
  ? onUnarchiveInitiative(detail.item.id)
461
- : onUnarchiveWorkstream(detail.item.id), onAddPlanningContextFile: onAddPlanningContextFile, onRemovePlanningContextFile: onRemovePlanningContextFile, onUpdatePlanningContextCaption: onUpdatePlanningContextCaption })) : null })] }))), hasSecondaryPane && (secondaryCollapsed ? (_jsx(CollapsedPane, { label: secondaryPaneLabel, onExpand: onExpandSecondaryPane })) : (_jsxs("div", { className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.detailPane}`.trim(), style: {
462
- flex: `0 0 ${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
463
- width: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
464
- minWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
465
- maxWidth: `${PLANNING_DRAWER_DETAIL_WIDTH_PX}px`,
466
- }, children: [_jsxs("div", { className: panelStyles.paneHeader, children: [_jsx("span", { className: panelStyles.paneHeaderLabel, children: secondaryPaneLabel }), _jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapseSecondaryPane, children: _jsx(ChevronLeft, { size: 16 }) })] }), _jsx("div", { className: panelStyles.paneContent, children: secondaryPane?.kind === 'editor' ? (_jsx(PlanningDrawerEditor, { editor: secondaryPane.editor, draftTitle: draftTitle, draftDescription: draftDescription, draftOwner: draftOwner, draftInitiativeId: draftInitiativeId, assigneeOptions: assigneeOptions, draftInitiativeSummary: draftInitiativeSummary, onChangeDraftTitle: onChangeDraftTitle, onChangeDraftDescription: onChangeDraftDescription, onChangeDraftOwner: onChangeDraftOwner, onChangeDraftInitiativeId: onChangeDraftInitiativeId, onCancel: onBackFromSecondary, onSubmit: onSubmitEditor, isSubmitting: isSubmittingEditor, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream })) : secondaryPane ? (_jsx(PlanningDrawerDetailView, { detail: secondaryPane.detail, currentWorkspaceId: currentWorkspaceId, assigneeOptions: assigneeOptions, onCreateTaskInWorkstream: onCreateTaskInWorkstream, onOpenTaskById: onOpenTaskById, onRemoveTaskFromWorkstream: onRemoveTaskFromWorkstream, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference: onAttachTaskToWorkstreamByReference, parentInitiative: resolveParentInitiative(secondaryPane.detail.item), onEdit: () => onEditWorkstream(secondaryPane.detail.item.id), onArchive: () => onArchiveWorkstream(secondaryPane.detail.item.id), onUnarchive: () => onUnarchiveWorkstream(secondaryPane.detail.item.id), onAddPlanningContextFile: onAddPlanningContextFile, onRemovePlanningContextFile: onRemovePlanningContextFile, onUpdatePlanningContextCaption: onUpdatePlanningContextCaption })) : null })] })))] }) }));
1119
+ : onUnarchiveWorkstream(detail.item.id), onAddPlanningContextFile: onAddPlanningContextFile, onRemovePlanningContextFile: onRemovePlanningContextFile, onUpdatePlanningContextCaption: onUpdatePlanningContextCaption })) : null })] }))), wideLayout && !primaryIsWorkstream && !hasSecondaryPane && (workstreamRelationshipExpanded ? (_jsx(RelationshipPane, { label: "Workstream", title: workstreamRelationship.title, description: workstreamRelationship.description, action: workstreamRelationship.action, onCollapse: () => setWorkstreamRelationshipExpanded(false), paneRef: workstreamRelationshipPaneRef })) : (_jsx(CollapsedPane, { label: "Workstream", muted: true, onExpand: () => setWorkstreamRelationshipExpanded(true) }))), showSecondaryPane && (effectiveSecondaryCollapsed ? (_jsx(CollapsedPane, { label: "Workstream", onExpand: onExpandSecondaryPane })) : (_jsxs("div", { ref: secondaryPaneRef, "data-planning-pane": "secondary", className: `${panelStyles.paneShell} ${styles.appScrollbar} tf-scrollbar ${panelStyles.detailPane}`.trim(), style: paneWidthStyle(wideLayout ? PLANNING_DRAWER_DETAIL_WIDTH_PX : adaptiveDetailWidth), children: [_jsxs("div", { className: panelStyles.paneHeader, children: [!wideLayout ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: secondaryInlineEditor
1120
+ ? (onCancelSecondaryEditor || onBackFromSecondary)
1121
+ : onBackFromSecondary, "aria-label": secondaryInlineEditor ? 'Cancel workstream editing' : `Back to ${primaryPaneLabel}`, title: secondaryInlineEditor ? 'Cancel workstream editing' : `Back to ${primaryPaneLabel}`, children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })) : null, _jsx("h2", { className: panelStyles.paneHeaderLabel, tabIndex: -1, "data-planning-pane-heading": true, children: secondaryPaneLabel }), _jsxs("div", { className: panelStyles.headerActionGroup, children: [secondaryArchiveDetail ? (_jsx(ArchiveVisibilityToggle, { visible: archivedDetailVisibility.workstream, disabled: countArchivedDetailChildren(secondaryArchiveDetail) === 0, itemLabel: "tasks", onToggle: () => toggleArchivedDetailVisibility('workstream') })) : null, wideLayout ? (_jsx("button", { type: "button", className: "tf-control-icon", onClick: onCollapseSecondaryPane, "aria-label": `Collapse ${secondaryPaneLabel} pane`, title: `Collapse ${secondaryPaneLabel} pane`, children: _jsx(ChevronLeft, { size: 16, "aria-hidden": "true" }) })) : null] })] }), _jsx("div", { className: panelStyles.paneContent, "aria-busy": secondaryHydrationState?.status === 'loading', children: secondaryPane?.kind === 'editor' ? (_jsx(PlanningDrawerEditor, { editor: secondaryPane.editor, draftTitle: draftTitle, draftDescription: draftDescription, draftOwner: draftOwner, draftInitiativeId: draftInitiativeId, draftIcon: draftIcon, draftColor: draftColor, assigneeOptions: assigneeOptions, initiativeLinkOptions: linkOptions.initiatives, draftInitiativeSummary: draftInitiativeSummary, onChangeDraftTitle: onChangeDraftTitle, onChangeDraftDescription: onChangeDraftDescription, onChangeDraftOwner: onChangeDraftOwner, onChangeDraftInitiativeId: onChangeDraftInitiativeId, onChangeDraftIcon: onChangeDraftIcon, onChangeDraftColor: onChangeDraftColor, onCancel: onBackFromSecondary, onSubmit: onSubmitEditor, isSubmitting: isSubmittingEditor })) : secondaryPane ? (_jsx(PlanningDrawerDetailView, { detail: secondaryPane.detail, showArchivedChildren: archivedDetailVisibility.workstream, inlineEditor: secondaryInlineEditor ? {
1122
+ editor: secondaryInlineEditor,
1123
+ draftTitle,
1124
+ draftDescription,
1125
+ draftOwner,
1126
+ draftInitiativeId,
1127
+ draftInitiativeSummary,
1128
+ onChangeDraftTitle,
1129
+ onChangeDraftDescription,
1130
+ onChangeDraftOwner,
1131
+ onChangeDraftInitiativeId,
1132
+ onCancel: onCancelSecondaryEditor || onBackFromSecondary,
1133
+ onSubmit: onSubmitEditor,
1134
+ isSubmitting: isSubmittingEditor,
1135
+ } : null, currentWorkspaceId: currentWorkspaceId, currentActorId: currentOwnerId, theme: theme, assigneeOptions: assigneeOptions, linkOptions: linkOptions, showTaskCardStatusLabel: showTaskCardStatusLabel, taskArrangeMode: taskArrangeMode, onTaskArrangeModeChange: onTaskArrangeModeChange, onReorderWorkstreamTasks: onReorderWorkstreamTasks, hydrationState: secondaryHydrationState, onRetryHydration: onRetrySecondaryHydration, onSetTaskStatus: onSetTaskStatus, onArchivePlanningTask: onArchivePlanningTask, onArchiveResolvedEntity: onArchiveResolvedWorkstream, onCreateTaskInWorkstream: onCreateTaskInWorkstream, onOpenTaskById: onOpenTaskById, onChangeTaskAssignee: onChangeTaskAssignee, taskReferences: taskReferences, onAssignTaskToWorkstream: onAssignTaskToWorkstream, onAssignInitiativeToWorkstream: onAssignInitiativeToWorkstream, onAttachTaskToWorkstreamByReference: onAttachTaskToWorkstreamByReference, parentInitiative: resolveParentInitiative(secondaryPane.detail.item), onEdit: () => onEditWorkstream(secondaryPane.detail.item.id), onChangeOwner: (ownerId) => onChangePlanningOwner('workstream', secondaryPane.detail.item.id, ownerId), onChangePlanningOwner: onChangePlanningOwner, onChangePlanningIdentity: onChangePlanningIdentity, onArchive: () => onArchiveWorkstream(secondaryPane.detail.item.id), onUnarchive: () => onUnarchiveWorkstream(secondaryPane.detail.item.id), onAddPlanningContextFile: onAddPlanningContextFile, onRemovePlanningContextFile: onRemovePlanningContextFile, onUpdatePlanningContextCaption: onUpdatePlanningContextCaption })) : null })] })))] }) }));
467
1136
  }