@taskforcehq/taskforce 0.3.170 → 0.3.301

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 (698) hide show
  1. package/README.md +71 -21
  2. package/dist/Taskforce.module.css +3394 -5981
  3. package/dist/TaskforceCore.CategoryFallback.test.js +5 -2
  4. package/dist/TaskforceCore.filter-persistence.test.js +402 -0
  5. package/dist/TaskforceCore.js +388 -71
  6. package/dist/TaskforceCore.routing.test.js +311 -0
  7. package/dist/TaskforceCore.test.js +3344 -615
  8. package/dist/TaskforceWidget.js +3 -2
  9. package/dist/__tests__/localizationCatalogs.test.js +48 -31
  10. package/dist/__tests__/workflowSimulation.test.js +2 -2
  11. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +60 -0
  12. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +324 -0
  13. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +278 -0
  14. package/dist/annotatedAttachments/payload.d.ts +2 -0
  15. package/dist/annotatedAttachments/payload.js +54 -0
  16. package/dist/annotatedAttachments/payload.test.js +67 -0
  17. package/dist/annotatedAttachments/service.d.ts +49 -0
  18. package/dist/annotatedAttachments/service.js +121 -0
  19. package/dist/annotatedAttachments/types.d.ts +86 -0
  20. package/dist/cli.js +74 -25
  21. package/dist/compat/deploymentCompat.d.ts +12 -0
  22. package/dist/compat/deploymentCompat.js +43 -0
  23. package/dist/compat/workspaceSyncCompat.d.ts +6 -0
  24. package/dist/compat/workspaceSyncCompat.js +79 -0
  25. package/dist/compat/workspaceSyncCompat.test.js +87 -0
  26. package/dist/components/features/AgentsModule.d.ts +5 -0
  27. package/dist/components/features/AgentsModule.js +131 -0
  28. package/dist/components/features/AgentsModule.test.js +102 -0
  29. package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +24 -0
  30. package/dist/components/features/AnnotatedAttachmentWorkspace.js +1942 -0
  31. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +2831 -0
  32. package/dist/components/features/DocumentGenerateModal.js +8 -16
  33. package/dist/components/features/DocumentIndex.d.ts +3 -4
  34. package/dist/components/features/DocumentIndex.js +22 -10
  35. package/dist/components/features/DocumentViewer.d.ts +6 -2
  36. package/dist/components/features/DocumentViewer.js +1000 -18
  37. package/dist/components/features/DocumentWorkspace.d.ts +40 -2
  38. package/dist/components/features/DocumentWorkspace.js +96 -16
  39. package/dist/components/features/DocumentWorkspace.test.js +1202 -0
  40. package/dist/components/features/InitiativesModule.d.ts +22 -0
  41. package/dist/components/features/InitiativesModule.js +33 -0
  42. package/dist/components/features/TaskSettings.d.ts +41 -32
  43. package/dist/components/features/TaskSettings.js +798 -313
  44. package/dist/components/features/TaskSettings.test.js +1221 -47
  45. package/dist/components/features/WorkflowsModule.d.ts +27 -0
  46. package/dist/components/features/WorkflowsModule.js +21 -0
  47. package/dist/components/features/documentWorkspaceFilters.d.ts +10 -0
  48. package/dist/components/features/documentWorkspaceFilters.js +11 -0
  49. package/dist/components/features/settings/CategoryManager.d.ts +2 -0
  50. package/dist/components/features/settings/CategoryManager.js +15 -8
  51. package/dist/components/features/settings/PriorityManager.d.ts +18 -0
  52. package/dist/components/features/settings/PriorityManager.js +51 -0
  53. package/dist/components/features/settings/TaxonomyEditor.d.ts +2 -1
  54. package/dist/components/features/settings/TaxonomyEditor.js +41 -18
  55. package/dist/components/features/settings/TaxonomyLibraryManager.d.ts +26 -0
  56. package/dist/components/features/settings/TaxonomyLibraryManager.js +301 -0
  57. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +141 -0
  58. package/dist/components/features/settings/TaxonomyManager.d.ts +35 -12
  59. package/dist/components/features/settings/TaxonomyManager.js +59 -27
  60. package/dist/components/features/settings/TypeManager.d.ts +11 -0
  61. package/dist/components/features/settings/TypeManager.js +48 -11
  62. package/dist/components/features/settings/{WorkflowEditorPrototype.d.ts → WorkflowEditor.d.ts} +2 -2
  63. package/dist/components/features/settings/{WorkflowEditorPrototype.js → WorkflowEditor.js} +3 -3
  64. package/dist/components/task/TaskActionHeader.d.ts +12 -2
  65. package/dist/components/task/TaskActionHeader.js +64 -8
  66. package/dist/components/task/TaskActionHeader.test.js +73 -0
  67. package/dist/components/task/TaskCard.d.ts +14 -16
  68. package/dist/components/task/TaskCard.js +144 -174
  69. package/dist/components/task/TaskCard.test.js +416 -64
  70. package/dist/components/task/TaskContextUpload.d.ts +6 -5
  71. package/dist/components/task/TaskContextUpload.js +199 -64
  72. package/dist/components/task/TaskContextUpload.test.js +331 -14
  73. package/dist/components/task/TaskForm.d.ts +23 -29
  74. package/dist/components/task/TaskForm.js +348 -169
  75. package/dist/components/task/TaskForm.test.js +419 -23
  76. package/dist/components/task/TaskKanban.d.ts +20 -21
  77. package/dist/components/task/TaskKanban.js +176 -316
  78. package/dist/components/task/TaskKanban.planning-drop.test.js +93 -0
  79. package/dist/components/task/TaskList.d.ts +22 -11
  80. package/dist/components/task/TaskList.js +98 -12
  81. package/dist/components/task/TaskList.test.js +206 -7
  82. package/dist/components/task/TaskReferenceBadge.d.ts +12 -0
  83. package/dist/components/task/TaskReferenceBadge.js +5 -0
  84. package/dist/components/task/TaskStatusActions.d.ts +12 -0
  85. package/dist/components/task/TaskStatusActions.js +18 -0
  86. package/dist/components/task/TaskStatusActions.test.js +45 -0
  87. package/dist/components/ui/ImageReferenceBadge.d.ts +12 -0
  88. package/dist/components/ui/ImageReferenceBadge.js +5 -0
  89. package/dist/components/ui/LevelSelector.d.ts +2 -1
  90. package/dist/components/ui/LevelSelector.js +2 -2
  91. package/dist/components/ui/Markdown.d.ts +1 -2
  92. package/dist/components/ui/Markdown.js +2 -13
  93. package/dist/components/ui/Modal.d.ts +3 -2
  94. package/dist/components/ui/Modal.js +4 -3
  95. package/dist/components/ui/MultiSelectFilter.d.ts +3 -1
  96. package/dist/components/ui/MultiSelectFilter.js +2 -2
  97. package/dist/components/ui/ReferenceBadgeButton.d.ts +13 -0
  98. package/dist/components/ui/ReferenceBadgeButton.js +6 -0
  99. package/dist/components/ui/TaxonomyDropdown.d.ts +7 -1
  100. package/dist/components/ui/TaxonomyDropdown.js +58 -23
  101. package/dist/components/ui/TopNoticeLayer.d.ts +7 -0
  102. package/dist/components/ui/TopNoticeLayer.js +14 -0
  103. package/dist/components/ui/TopNoticeLayer.test.js +25 -0
  104. package/dist/components/views/AppShellHeader.d.ts +13 -0
  105. package/dist/components/views/AppShellHeader.js +19 -0
  106. package/dist/components/views/AppShellHeader.test.js +21 -0
  107. package/dist/components/views/PlanComparisonPage.d.ts +73 -0
  108. package/dist/components/views/PlanComparisonPage.js +196 -0
  109. package/dist/components/views/PlanComparisonPage.test.js +251 -0
  110. package/dist/components/views/PlansPage.d.ts +14 -0
  111. package/dist/components/views/PlansPage.js +355 -0
  112. package/dist/components/views/StandaloneLayout.d.ts +2 -2
  113. package/dist/components/views/StandaloneLayout.js +2227 -1188
  114. package/dist/components/views/WidgetView.d.ts +2 -2
  115. package/dist/components/views/WidgetView.js +149 -43
  116. package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +57 -0
  117. package/dist/components/views/chrome/WorkspaceChromeSections.js +38 -0
  118. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +54 -0
  119. package/dist/components/views/chrome/workspaceChrome.d.ts +31 -0
  120. package/dist/components/views/chrome/workspaceChrome.js +108 -0
  121. package/dist/components/views/chrome/workspaceChrome.test.js +52 -0
  122. package/dist/components/views/panels/DocumentFilterToolbar.d.ts +10 -0
  123. package/dist/components/views/panels/DocumentFilterToolbar.js +7 -0
  124. package/dist/components/views/panels/DocumentFilterToolbar.test.js +19 -0
  125. package/dist/components/views/panels/FilterToolbar.d.ts +68 -0
  126. package/dist/components/views/panels/FilterToolbar.js +21 -0
  127. package/dist/components/views/panels/FilterToolbar.test.d.ts +1 -0
  128. package/dist/components/views/panels/FilterToolbar.test.js +45 -0
  129. package/dist/components/views/panels/FilterToolbarControls.d.ts +47 -0
  130. package/dist/components/views/panels/FilterToolbarControls.js +61 -0
  131. package/dist/components/views/panels/PlanningDrawer.d.ts +115 -0
  132. package/dist/components/views/panels/PlanningDrawer.js +220 -0
  133. package/dist/components/views/panels/ScheduleSidebar.d.ts +52 -0
  134. package/dist/components/views/panels/ScheduleSidebar.js +127 -0
  135. package/dist/components/views/panels/scheduleUtils.d.ts +14 -0
  136. package/dist/components/views/panels/scheduleUtils.js +79 -0
  137. package/dist/components/views/teamManagementAccess.d.ts +6 -0
  138. package/dist/components/views/teamManagementAccess.js +18 -0
  139. package/dist/components/views/teamManagementAccess.test.d.ts +1 -0
  140. package/dist/components/views/teamManagementAccess.test.js +44 -0
  141. package/dist/config/clientDeployment.d.ts +2 -0
  142. package/dist/config/clientDeployment.js +13 -0
  143. package/dist/config/cloudEnvironment.d.ts +15 -0
  144. package/dist/config/cloudEnvironment.js +60 -0
  145. package/dist/config/deployment.d.ts +20 -0
  146. package/dist/config/deployment.js +67 -0
  147. package/dist/config/deployment.test.d.ts +1 -0
  148. package/dist/config/deployment.test.js +88 -0
  149. package/dist/config/envSchema.js +36 -8
  150. package/dist/config/envSchema.test.js +28 -0
  151. package/dist/core/AiProfileService.d.ts +66 -0
  152. package/dist/core/AiProfileService.js +320 -0
  153. package/dist/core/AiProfileService.test.d.ts +1 -0
  154. package/dist/core/AiProfileService.test.js +164 -0
  155. package/dist/core/AiProfiles.test.d.ts +1 -0
  156. package/dist/core/AiProfiles.test.js +449 -0
  157. package/dist/core/AttachmentLinkService.d.ts +15 -0
  158. package/dist/core/AttachmentLinkService.js +157 -0
  159. package/dist/core/AuthTokenService.d.ts +44 -0
  160. package/dist/core/AuthTokenService.js +207 -0
  161. package/dist/core/CreatedBy.test.js +134 -6
  162. package/dist/core/DeletedTaskLifecycleService.d.ts +33 -0
  163. package/dist/core/DeletedTaskLifecycleService.js +158 -0
  164. package/dist/core/DeletedTaskTrash.test.d.ts +1 -0
  165. package/dist/core/DeletedTaskTrash.test.js +104 -0
  166. package/dist/core/EntitlementsPolicy.test.js +78 -5
  167. package/dist/core/GlobalSettingsService.d.ts +16 -0
  168. package/dist/core/GlobalSettingsService.js +370 -0
  169. package/dist/core/JsonBackupRuntime.test.d.ts +1 -0
  170. package/dist/core/JsonBackupRuntime.test.js +155 -0
  171. package/dist/core/McpTokenService.d.ts +118 -0
  172. package/dist/core/McpTokenService.js +921 -0
  173. package/dist/core/PlanEntitlementService.d.ts +201 -0
  174. package/dist/core/PlanEntitlementService.js +1442 -0
  175. package/dist/core/PlanVersionPolicy.test.d.ts +1 -0
  176. package/dist/core/PlanVersionPolicy.test.js +178 -0
  177. package/dist/core/PlanningEntities.test.d.ts +1 -0
  178. package/dist/core/PlanningEntities.test.js +95 -0
  179. package/dist/core/ScheduleFields.test.js +15 -19
  180. package/dist/core/SignupMonetizationSettings.test.d.ts +1 -0
  181. package/dist/core/SignupMonetizationSettings.test.js +159 -0
  182. package/dist/core/Stats.test.d.ts +1 -0
  183. package/dist/core/Stats.test.js +36 -0
  184. package/dist/core/SyncReconciliationService.d.ts +93 -0
  185. package/dist/core/SyncReconciliationService.js +406 -0
  186. package/dist/core/SystemAdmin.test.js +578 -13
  187. package/dist/core/TaskActivityService.d.ts +21 -0
  188. package/dist/core/TaskActivityService.js +130 -0
  189. package/dist/core/TaskAttachmentsCanonical.test.d.ts +1 -0
  190. package/dist/core/TaskAttachmentsCanonical.test.js +306 -0
  191. package/dist/core/TaskAuditTimeline.test.d.ts +1 -0
  192. package/dist/core/TaskAuditTimeline.test.js +132 -0
  193. package/dist/core/TaskTaxonomyValidation.test.js +338 -15
  194. package/dist/core/Taskforce.d.ts +930 -183
  195. package/dist/core/Taskforce.ids.test.js +252 -0
  196. package/dist/core/Taskforce.js +3848 -2532
  197. package/dist/core/Taskforce.mcpAuth.test.d.ts +1 -0
  198. package/dist/core/Taskforce.mcpAuth.test.js +343 -0
  199. package/dist/core/Taskforce.realtimeMutation.test.js +57 -2
  200. package/dist/core/TaxonomySettingsService.d.ts +18 -0
  201. package/dist/core/TaxonomySettingsService.js +162 -0
  202. package/dist/core/WorkspaceDelete.test.js +32 -13
  203. package/dist/core/WorkspaceLifecycleService.d.ts +11 -0
  204. package/dist/core/WorkspaceLifecycleService.js +88 -0
  205. package/dist/core/WorkspacePermissions.test.js +95 -0
  206. package/dist/core/WorkspacePlanMode.test.js +114 -1
  207. package/dist/core/WorkspacePreferenceService.d.ts +41 -0
  208. package/dist/core/WorkspacePreferenceService.js +246 -0
  209. package/dist/core/WorkspaceSyncSettings.test.d.ts +1 -0
  210. package/dist/core/WorkspaceSyncSettings.test.js +65 -0
  211. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +1 -0
  212. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +212 -0
  213. package/dist/core/shared.d.ts +36 -0
  214. package/dist/core/shared.js +128 -0
  215. package/dist/core/types.d.ts +614 -0
  216. package/dist/core/types.js +27 -0
  217. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +56 -0
  218. package/dist/documentReviews/DocumentReviewCommentStore.js +230 -0
  219. package/dist/documentReviews/DocumentReviewSessionStore.d.ts +52 -0
  220. package/dist/documentReviews/DocumentReviewSessionStore.js +193 -0
  221. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +1 -0
  222. package/dist/documentReviews/DocumentReviewSessionStore.test.js +127 -0
  223. package/dist/documentReviews/service.d.ts +68 -0
  224. package/dist/documentReviews/service.js +210 -0
  225. package/dist/documentReviews/types.d.ts +58 -0
  226. package/dist/documentReviews/types.js +1 -0
  227. package/dist/hooks/auth/useAuthGuardPolicy.d.ts +2 -0
  228. package/dist/hooks/auth/useAuthGuardPolicy.js +1 -0
  229. package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +15 -0
  230. package/dist/hooks/tasks/useCurrentTaskRelations.js +37 -0
  231. package/dist/hooks/tasks/useTaskActions.d.ts +3 -0
  232. package/dist/hooks/tasks/useTaskActions.js +2 -0
  233. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +65 -0
  234. package/dist/hooks/tasks/useTaskEditorNavigation.js +235 -0
  235. package/dist/hooks/tasks/useTaskFilters.d.ts +2 -0
  236. package/dist/hooks/tasks/useTaskFilters.js +2 -0
  237. package/dist/hooks/tasks/useTaskFormActions.d.ts +58 -0
  238. package/dist/hooks/tasks/useTaskFormActions.js +365 -0
  239. package/dist/hooks/tasks/useTaskRelationships.d.ts +16 -0
  240. package/dist/hooks/tasks/useTaskRelationships.js +64 -0
  241. package/dist/hooks/ui/useResourceExport.d.ts +19 -0
  242. package/dist/hooks/ui/useResourceExport.js +84 -0
  243. package/dist/hooks/ui/useSettingsModel.d.ts +203 -0
  244. package/dist/hooks/ui/useSettingsModel.js +125 -0
  245. package/dist/hooks/ui/useSettingsPersistence.d.ts +36 -0
  246. package/dist/hooks/ui/useSettingsPersistence.js +254 -0
  247. package/dist/hooks/ui/useSettingsTaxonomyManagement.d.ts +119 -0
  248. package/dist/hooks/ui/useSettingsTaxonomyManagement.js +536 -0
  249. package/dist/hooks/ui/useUiNotice.d.ts +1 -0
  250. package/dist/hooks/ui/useUiNotice.js +1 -0
  251. package/dist/hooks/ui/useWorkflowTemplates.d.ts +37 -0
  252. package/dist/hooks/ui/useWorkflowTemplates.js +111 -0
  253. package/dist/hooks/ui/useZenMode.d.ts +5 -0
  254. package/dist/hooks/ui/useZenMode.js +32 -0
  255. package/dist/hooks/useFilterSort.d.ts +60 -0
  256. package/dist/hooks/useFilterSort.js +362 -0
  257. package/dist/hooks/useFilterSort.test.d.ts +1 -0
  258. package/dist/hooks/useFilterSort.test.js +333 -0
  259. package/dist/hooks/useRealtimeSync.d.ts +1 -0
  260. package/dist/hooks/useRealtimeSync.js +24 -9
  261. package/dist/hooks/useRealtimeSync.test.js +28 -1
  262. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +1 -0
  263. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +34 -0
  264. package/dist/hooks/useSyncOrchestrator.d.ts +65 -103
  265. package/dist/hooks/useSyncOrchestrator.js +1538 -670
  266. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +700 -174
  267. package/dist/hooks/useTaskData.d.ts +35 -0
  268. package/dist/hooks/useTaskData.js +243 -0
  269. package/dist/hooks/useTaskData.test.d.ts +1 -0
  270. package/dist/hooks/useTaskData.test.js +180 -0
  271. package/dist/hooks/useTaskMutations.d.ts +46 -0
  272. package/dist/hooks/useTaskMutations.js +472 -0
  273. package/dist/hooks/useTaskMutations.test.d.ts +1 -0
  274. package/dist/hooks/useTaskMutations.test.js +80 -0
  275. package/dist/hooks/useTaskforce.contract.test.d.ts +1 -0
  276. package/dist/hooks/useTaskforce.contract.test.js +7 -0
  277. package/dist/hooks/useTaskforce.d.ts +260 -295
  278. package/dist/hooks/useTaskforce.js +1954 -2623
  279. package/dist/hooks/useTaskforce.priority-filters.test.js +6 -11
  280. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +1 -0
  281. package/dist/hooks/useTaskforce.sync-behavior.test.js +1120 -0
  282. package/dist/hooks/useUiNotice.d.ts +16 -0
  283. package/dist/hooks/useUiNotice.js +49 -0
  284. package/dist/hooks/useWorkspaceSyncController.d.ts +23 -46
  285. package/dist/hooks/useWorkspaceSyncController.js +280 -461
  286. package/dist/hooks/useWorkspaceSyncController.test.js +106 -199
  287. package/dist/hooks/workspace/useTaskforceApiRouting.d.ts +8 -0
  288. package/dist/hooks/workspace/useTaskforceApiRouting.js +91 -0
  289. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +1 -0
  290. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +60 -0
  291. package/dist/hooks/workspace/useWorkspaceSyncController.d.ts +1 -0
  292. package/dist/hooks/workspace/useWorkspaceSyncController.js +1 -0
  293. package/dist/hooks/workspace/workspaceLocalState.d.ts +30 -0
  294. package/dist/hooks/workspace/workspaceLocalState.js +101 -0
  295. package/dist/localization/locales/en-US.d.ts +1 -8
  296. package/dist/localization/locales/en-US.js +4 -11
  297. package/dist/localization/locales/es-419.js +2 -9
  298. package/dist/localization/locales/pt-BR.js +2 -9
  299. package/dist/localization/localizationCatalogs.test.d.ts +1 -0
  300. package/dist/localization/localizationCatalogs.test.js +37 -0
  301. package/dist/main.d.ts +1 -0
  302. package/dist/main.js +9 -15
  303. package/dist/mcp/clientIntegrations.d.ts +33 -0
  304. package/dist/mcp/clientIntegrations.js +199 -0
  305. package/dist/mcp/clientIntegrations.test.d.ts +1 -0
  306. package/dist/mcp/clientIntegrations.test.js +110 -0
  307. package/dist/mcp/index.d.ts +2 -0
  308. package/dist/mcp/index.js +2 -0
  309. package/dist/mcp/optionResolution.test.js +6 -2
  310. package/dist/mcp/runtime.d.ts +120 -0
  311. package/dist/mcp/runtime.js +5668 -0
  312. package/dist/mcp/runtime.test.d.ts +1 -0
  313. package/dist/mcp/runtime.test.js +3299 -0
  314. package/dist/mcp/server.js +2 -1793
  315. package/dist/mcp/structuredCommentValidation.test.d.ts +1 -0
  316. package/dist/{__tests__ → mcp}/structuredCommentValidation.test.js +1 -1
  317. package/dist/mcp/structuredDocValidation.js +1 -2
  318. package/dist/mcp/structuredDocValidation.test.d.ts +1 -0
  319. package/dist/{__tests__ → mcp}/structuredDocValidation.test.js +9 -4
  320. package/dist/mcp/toolRegistry.d.ts +570 -0
  321. package/dist/mcp/toolRegistry.js +90 -0
  322. package/dist/mcp/toolRegistry.test.d.ts +1 -0
  323. package/dist/mcp/toolRegistry.test.js +30 -0
  324. package/dist/migrations/billingSchemaParity.test.js +111 -0
  325. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  326. package/dist/migrations/taskSchemaMigrations.js +681 -39
  327. package/dist/migrations/taskSchemaMigrations.test.d.ts +1 -0
  328. package/dist/migrations/taskSchemaMigrations.test.js +210 -0
  329. package/dist/plugins/vite.js +13 -7
  330. package/dist/public/apple-touch-icon.png +0 -0
  331. package/dist/public/archive/phoenix/apple-touch-icon.png +0 -0
  332. package/dist/public/archive/phoenix/favicon.ico +0 -0
  333. package/dist/public/archive/phoenix/site.webmanifest +1 -0
  334. package/dist/public/favicon-96x96.png +0 -0
  335. package/dist/public/favicon.ico +0 -0
  336. package/dist/public/favicon.svg +17 -0
  337. package/dist/public/site.webmanifest +21 -1
  338. package/dist/public/web-app-manifest-192x192.png +0 -0
  339. package/dist/public/web-app-manifest-512x512.png +0 -0
  340. package/dist/releaseVersion.test.d.ts +1 -0
  341. package/dist/{__tests__/releaseVersion.test.js → releaseVersion.test.js} +1 -1
  342. package/dist/resources/templates/WORKFLOW_V2_POLICY.md +1 -1
  343. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +62 -52
  344. package/dist/resources/templates/workflows/collaborate.yaml +11 -5
  345. package/dist/resources/templates/workflows/do.yaml +8 -2
  346. package/dist/resources/templates/workflows/evaluate.yaml +13 -7
  347. package/dist/resources/templates/workflows/execute.yaml +40 -23
  348. package/dist/resources/templates/workflows/plan.yaml +15 -8
  349. package/dist/resources/templates/workflows/review.yaml +14 -8
  350. package/dist/runtime/appGateDefinitions.d.ts +32 -0
  351. package/dist/runtime/appGateDefinitions.js +32 -0
  352. package/dist/runtime/appGates.d.ts +29 -0
  353. package/dist/runtime/appGates.js +53 -0
  354. package/dist/runtime/appGates.test.d.ts +1 -0
  355. package/dist/runtime/appGates.test.js +42 -0
  356. package/dist/runtime/migrationFlags.d.ts +1 -0
  357. package/dist/runtime/migrationFlags.js +1 -0
  358. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +1 -0
  359. package/dist/server/annotatedAttachmentsRoutes.test.js +473 -0
  360. package/dist/server/auth.js +14 -2
  361. package/dist/server/auth.test.js +21 -1
  362. package/dist/server/cors.js +11 -5
  363. package/dist/server/cors.test.js +6 -0
  364. package/dist/server/documentReviewRoutes.test.d.ts +1 -0
  365. package/dist/server/documentReviewRoutes.test.js +157 -0
  366. package/dist/server/index.cookieProxy.test.js +46 -1
  367. package/dist/server/index.d.ts +20 -0
  368. package/dist/server/index.js +168 -41
  369. package/dist/server/index.rateLimit.test.js +6 -0
  370. package/dist/server/index.test.js +133 -2
  371. package/dist/server/mockStripe.d.ts +72 -0
  372. package/dist/server/mockStripe.js +357 -0
  373. package/dist/server/realtimeSyncWs.js +4 -0
  374. package/dist/server/routes/admin.d.ts +114 -0
  375. package/dist/server/routes/admin.js +2226 -0
  376. package/dist/server/routes/annotatedAttachments.d.ts +24 -0
  377. package/dist/server/routes/annotatedAttachments.js +235 -0
  378. package/dist/server/routes/auth.d.ts +61 -0
  379. package/dist/server/routes/auth.js +1296 -0
  380. package/dist/server/{routes.billing.d.ts → routes/billing.d.ts} +3 -2
  381. package/dist/server/routes/billing.js +2001 -0
  382. package/dist/server/routes/billing.test.d.ts +1 -0
  383. package/dist/server/routes/billing.test.js +1631 -0
  384. package/dist/server/routes/documentReviews.d.ts +11 -0
  385. package/dist/server/routes/documentReviews.js +191 -0
  386. package/dist/server/routes/documents.d.ts +118 -0
  387. package/dist/server/routes/documents.js +1113 -0
  388. package/dist/server/routes/resources.d.ts +25 -0
  389. package/dist/server/routes/resources.js +225 -0
  390. package/dist/server/routes/shared.d.ts +35 -0
  391. package/dist/server/routes/shared.js +305 -0
  392. package/dist/server/routes/shared.test.d.ts +1 -0
  393. package/dist/server/routes/shared.test.js +32 -0
  394. package/dist/server/{routes.sync.d.ts → routes/sync.d.ts} +5 -5
  395. package/dist/server/routes/sync.integration.test.d.ts +1 -0
  396. package/dist/server/routes/sync.integration.test.js +2003 -0
  397. package/dist/server/routes/sync.js +3143 -0
  398. package/dist/server/routes/tasks.d.ts +72 -0
  399. package/dist/server/routes/tasks.js +1252 -0
  400. package/dist/server/routes/workspaces.d.ts +32 -0
  401. package/dist/server/routes/workspaces.js +307 -0
  402. package/dist/server/routes.d.ts +8 -9
  403. package/dist/server/routes.js +968 -4092
  404. package/dist/server/routes.test.js +9043 -2415
  405. package/dist/server/runtimeMode.d.ts +1 -1
  406. package/dist/server/runtimeMode.js +3 -18
  407. package/dist/server/runtimeMode.test.js +3 -3
  408. package/dist/server/securityHeaders.d.ts +1 -1
  409. package/dist/server/securityHeaders.js +65 -6
  410. package/dist/server/securityHeaders.test.js +40 -2
  411. package/dist/services/templateEngine.test.d.ts +1 -0
  412. package/dist/{__tests__ → services}/templateEngine.test.js +1 -1
  413. package/dist/services/templates.test.d.ts +1 -0
  414. package/dist/{__tests__ → services}/templates.test.js +1 -1
  415. package/dist/services/workflowDocumentFixtures.test.d.ts +1 -0
  416. package/dist/{__tests__ → services}/workflowDocumentFixtures.test.js +4 -4
  417. package/dist/services/workflowExportMatrix.test.d.ts +1 -0
  418. package/dist/{__tests__ → services}/workflowExportMatrix.test.js +1 -1
  419. package/dist/services/workflowExportSnapshots.test.d.ts +1 -0
  420. package/dist/services/workflowGeneration.test.d.ts +1 -0
  421. package/dist/services/workflowSimulation.test.d.ts +1 -0
  422. package/dist/services/workflowSimulation.test.js +113 -0
  423. package/dist/services/workflowV2Policy.test.d.ts +1 -0
  424. package/dist/{__tests__ → services}/workflowV2Policy.test.js +2 -2
  425. package/dist/shared/aiProfileSurfaceType.d.ts +9 -0
  426. package/dist/shared/aiProfileSurfaceType.js +49 -0
  427. package/dist/shared/customTaxonomyLibrary.d.ts +11 -0
  428. package/dist/shared/customTaxonomyLibrary.js +276 -0
  429. package/dist/shared/customTaxonomyLibrary.test.d.ts +1 -0
  430. package/dist/shared/customTaxonomyLibrary.test.js +20 -0
  431. package/dist/shared/taxonomyCatalog.d.ts +19 -0
  432. package/dist/shared/taxonomyCatalog.js +36 -0
  433. package/dist/shared/taxonomyDefaults.d.ts +29 -0
  434. package/dist/shared/taxonomyDefaults.js +26 -0
  435. package/dist/shared/taxonomyLibrary.d.ts +15 -0
  436. package/dist/shared/taxonomyLibrary.js +98 -0
  437. package/dist/shared/taxonomyLibrary.test.d.ts +1 -0
  438. package/dist/shared/taxonomyLibrary.test.js +26 -0
  439. package/dist/shared/taxonomyState.d.ts +36 -0
  440. package/dist/shared/taxonomyState.js +73 -0
  441. package/dist/shared/taxonomyState.test.d.ts +1 -0
  442. package/dist/shared/taxonomyState.test.js +71 -0
  443. package/dist/shared/workflowDefaults.d.ts +9 -0
  444. package/dist/shared/workflowDefaults.js +11 -0
  445. package/dist/storage/documentIntegrity.d.ts +2 -0
  446. package/dist/storage/documentIntegrity.js +34 -17
  447. package/dist/storage/documentPurge.d.ts +2 -1
  448. package/dist/storage/documentPurge.js +35 -8
  449. package/dist/storage/index.d.ts +4 -0
  450. package/dist/storage/index.js +2 -0
  451. package/dist/storage/objectStorage.d.ts +1 -1
  452. package/dist/storage/objectStorageClient.d.ts +6 -4
  453. package/dist/storage/objectStorageClient.js +77 -29
  454. package/dist/storage/objectStorageClient.test.d.ts +1 -0
  455. package/dist/storage/objectStorageClient.test.js +57 -0
  456. package/dist/storage/objectStorageConfig.js +3 -1
  457. package/dist/storage/objectStorageConfig.test.d.ts +1 -0
  458. package/dist/storage/objectStorageConfig.test.js +38 -0
  459. package/dist/storage/postgresAdapter.d.ts +5 -0
  460. package/dist/storage/postgresAdapter.js +2 -2
  461. package/dist/storage/postgresAdapter.test.d.ts +1 -0
  462. package/dist/storage/postgresAdapter.test.js +29 -0
  463. package/dist/storage/taskAssetStore.d.ts +7 -4
  464. package/dist/storage/taskAssetStore.js +65 -60
  465. package/dist/storage/workspaceAssetStore.d.ts +122 -0
  466. package/dist/storage/workspaceAssetStore.js +496 -0
  467. package/dist/storage/workspaceAssetStore.test.d.ts +1 -0
  468. package/dist/storage/workspaceAssetStore.test.js +501 -0
  469. package/dist/sync/cloudSyncApi.d.ts +33 -2
  470. package/dist/sync/cloudSyncApi.js +37 -15
  471. package/dist/sync/cloudSyncApi.test.js +60 -3
  472. package/dist/sync/index.d.ts +2 -0
  473. package/dist/sync/index.js +3 -0
  474. package/dist/sync/syncService.d.ts +25 -0
  475. package/dist/sync/syncService.js +184 -16
  476. package/dist/sync/syncService.test.js +289 -25
  477. package/dist/sync/workspaceRepair.d.ts +114 -0
  478. package/dist/sync/workspaceRepair.js +566 -0
  479. package/dist/sync/workspaceSyncModel.d.ts +230 -2
  480. package/dist/sync/workspaceSyncModel.js +456 -17
  481. package/dist/sync/workspaceSyncModel.test.js +642 -0
  482. package/dist/sync/workspaceSyncState.d.ts +12 -0
  483. package/dist/sync/workspaceSyncState.js +12 -0
  484. package/dist/sync/workspaceSyncSurface.d.ts +33 -0
  485. package/dist/sync/workspaceSyncSurface.js +74 -0
  486. package/dist/types.d.ts +143 -18
  487. package/dist/types.js +9 -24
  488. package/dist/ui/assets/AgentsModule-Bdq3T1Ts.js +1 -0
  489. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +1 -0
  490. package/dist/ui/assets/AnnotatedAttachmentWorkspace-jKUVo-PJ.js +3 -0
  491. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +1 -0
  492. package/dist/ui/assets/DocumentWorkspace-DuQa-uIC.js +250 -0
  493. package/dist/ui/assets/InitiativesModule-C8Pi2VTk.js +1 -0
  494. package/dist/ui/assets/PlansPage-B6BDECSi.js +1 -0
  495. package/dist/ui/assets/PlansPage-BlVC_lRq.css +1 -0
  496. package/dist/ui/assets/TaskSettings-BwB9NtmJ.css +1 -0
  497. package/dist/ui/assets/TaskSettings-DUJgRTPU.js +8 -0
  498. package/dist/ui/assets/WorkflowsModule-b6TLuHwJ.js +5 -0
  499. package/dist/ui/assets/index-BiiF1cLQ.css +1 -0
  500. package/dist/ui/assets/index-xBWLPOEb.js +6 -0
  501. package/dist/ui/assets/vendor-dnd-DRzYolkg.js +5 -0
  502. package/dist/ui/assets/{vendor-icons-ZFG3SGwo.js → vendor-icons-QZyhEwgT.js} +1 -1
  503. package/dist/ui/assets/{vendor-markdown-CKYkQHfj.js → vendor-markdown-BUxTU7dS.js} +1 -1
  504. package/dist/ui/assets/vendor-react-CKJs5o3c.js +61 -0
  505. package/dist/ui/assets/vendor-router-BbWMxlnO.js +3 -0
  506. package/dist/ui/branding/logos/logo.png +0 -0
  507. package/dist/ui/branding/logos/logo_dark.svg +27 -0
  508. package/dist/ui/branding/logos/logo_favicon.svg +35 -0
  509. package/dist/ui/branding/logos/logo_light.svg +27 -0
  510. package/dist/ui/favicon/apple-touch-icon.png +0 -0
  511. package/dist/ui/favicon/archive/phoenix/apple-touch-icon.png +0 -0
  512. package/dist/ui/favicon/archive/phoenix/favicon.ico +0 -0
  513. package/dist/ui/favicon/archive/phoenix/site.webmanifest +1 -0
  514. package/dist/ui/favicon/favicon-96x96.png +0 -0
  515. package/dist/ui/favicon/favicon.ico +0 -0
  516. package/dist/ui/favicon/favicon.svg +17 -0
  517. package/dist/ui/favicon/site.webmanifest +21 -1
  518. package/dist/ui/favicon/web-app-manifest-192x192.png +0 -0
  519. package/dist/ui/favicon/web-app-manifest-512x512.png +0 -0
  520. package/dist/ui/index.html +10 -7
  521. package/dist/ui/product/screen_01.png +0 -0
  522. package/dist/ui/product/screen_02.png +0 -0
  523. package/dist/ui/product/screen_03.png +0 -0
  524. package/dist/utils/annotatedAttachments.d.ts +20 -0
  525. package/dist/utils/annotatedAttachments.js +74 -0
  526. package/dist/utils/annotatedAttachments.test.d.ts +1 -0
  527. package/dist/utils/annotatedAttachments.test.js +108 -0
  528. package/dist/utils/assignees.d.ts +26 -0
  529. package/dist/utils/assignees.js +132 -0
  530. package/dist/utils/canonicalAssetKind.d.ts +16 -0
  531. package/dist/utils/canonicalAssetKind.js +39 -0
  532. package/dist/utils/canonicalAssetKind.test.d.ts +1 -0
  533. package/dist/utils/canonicalAssetKind.test.js +24 -0
  534. package/dist/utils/coalescedRefresh.d.ts +5 -0
  535. package/dist/utils/coalescedRefresh.js +16 -0
  536. package/dist/utils/coalescedRefresh.test.d.ts +1 -0
  537. package/dist/utils/coalescedRefresh.test.js +30 -0
  538. package/dist/utils/constants.d.ts +16 -3
  539. package/dist/utils/constants.icons.test.js +2 -1
  540. package/dist/utils/constants.js +70 -13
  541. package/dist/utils/contextAssetEvents.d.ts +7 -0
  542. package/dist/utils/contextAssetEvents.js +6 -0
  543. package/dist/utils/contextFiles.d.ts +14 -3
  544. package/dist/utils/contextFiles.js +40 -8
  545. package/dist/utils/documentManagerApi.d.ts +6 -0
  546. package/dist/utils/documentManagerApi.js +19 -0
  547. package/dist/utils/documentNames.d.ts +24 -0
  548. package/dist/utils/documentNames.js +91 -0
  549. package/dist/utils/documentReferences.d.ts +9 -0
  550. package/dist/utils/documentReferences.js +11 -0
  551. package/dist/utils/entityReferences.d.ts +9 -0
  552. package/dist/utils/entityReferences.js +32 -0
  553. package/dist/utils/imageReferences.d.ts +9 -0
  554. package/dist/utils/imageReferences.js +11 -0
  555. package/dist/utils/planParser.d.ts +2 -2
  556. package/dist/utils/planParser.js +11 -11
  557. package/dist/utils/planParser.test.d.ts +1 -0
  558. package/dist/{__tests__ → utils}/planParser.test.js +22 -22
  559. package/dist/utils/planningReferences.d.ts +17 -0
  560. package/dist/utils/planningReferences.js +30 -0
  561. package/dist/utils/planningReferences.test.d.ts +1 -0
  562. package/dist/utils/planningReferences.test.js +17 -0
  563. package/dist/utils/taskActivity.d.ts +9 -0
  564. package/dist/utils/taskActivity.js +147 -0
  565. package/dist/utils/taskActivity.test.d.ts +1 -0
  566. package/dist/utils/taskActivity.test.js +34 -0
  567. package/dist/utils/taskDraftDefaults.d.ts +21 -0
  568. package/dist/utils/taskDraftDefaults.js +40 -0
  569. package/dist/utils/taskDraftDefaults.test.d.ts +1 -0
  570. package/dist/utils/taskDraftDefaults.test.js +34 -0
  571. package/dist/utils/taskNormalization.d.ts +25 -0
  572. package/dist/utils/taskNormalization.js +161 -0
  573. package/dist/utils/taskNormalization.test.d.ts +1 -0
  574. package/dist/utils/taskNormalization.test.js +158 -0
  575. package/dist/utils/taskReferences.d.ts +5 -0
  576. package/dist/utils/taskReferences.js +11 -0
  577. package/dist/utils/taskforceApiClient.d.ts +2 -0
  578. package/dist/utils/taskforceApiClient.js +101 -3
  579. package/dist/utils/taskforceApiClient.test.d.ts +1 -0
  580. package/dist/utils/taskforceApiClient.test.js +44 -0
  581. package/dist/utils/taxonomyFilterOptions.d.ts +2 -0
  582. package/dist/utils/taxonomyFilterOptions.js +17 -0
  583. package/dist/utils/taxonomyFormDefaults.d.ts +3 -0
  584. package/dist/utils/taxonomyFormDefaults.js +28 -0
  585. package/dist/utils/taxonomyFormDefaults.test.d.ts +1 -0
  586. package/dist/utils/taxonomyFormDefaults.test.js +63 -0
  587. package/dist/utils/taxonomyLifecycle.d.ts +3 -0
  588. package/dist/utils/taxonomyLifecycle.js +17 -0
  589. package/dist/utils/taxonomySorting.d.ts +7 -0
  590. package/dist/utils/taxonomySorting.js +74 -0
  591. package/dist/utils/theme.d.ts +15 -0
  592. package/dist/utils/theme.js +23 -0
  593. package/dist/utils/uiNotice.d.ts +7 -0
  594. package/dist/utils/uiNotice.js +6 -0
  595. package/dist/utils/uiNotice.test.d.ts +1 -0
  596. package/dist/utils/uiNotice.test.js +18 -0
  597. package/dist/utils/workspaceIdentity.d.ts +14 -0
  598. package/dist/utils/workspaceIdentity.js +21 -0
  599. package/dist/utils/workspaceIdentity.test.js +30 -1
  600. package/dist/utils/workspaceSyncPresentation.d.ts +20 -0
  601. package/dist/utils/workspaceSyncPresentation.js +21 -0
  602. package/dist/utils/workspaceSyncPresentation.test.d.ts +1 -0
  603. package/dist/utils/workspaceSyncPresentation.test.js +36 -0
  604. package/package.json +30 -23
  605. package/scripts/bootstrap-playwright-auth.mjs +155 -0
  606. package/scripts/check-compat-boundaries.mjs +41 -0
  607. package/scripts/check-env.ts +9 -2
  608. package/scripts/debug-login.mjs +32 -0
  609. package/scripts/deploy-prod.sh +41 -0
  610. package/scripts/deploy-staging.sh +23 -0
  611. package/scripts/migrate-planning-model.ts +233 -0
  612. package/scripts/migrate-task-data-assets.mjs +408 -0
  613. package/scripts/playwright-auth.sh +11 -0
  614. package/scripts/run-dev-proxy.sh +2 -0
  615. package/scripts/update-homebrew-formula.sh +2 -2
  616. package/scripts/with-esbuild.sh +11 -0
  617. package/src/resources/templates/WORKFLOW_V2_POLICY.md +1 -1
  618. package/src/resources/templates/workflow-sources/workflowDocs.mjs +62 -52
  619. package/src/resources/templates/workflows/collaborate.yaml +11 -5
  620. package/src/resources/templates/workflows/do.yaml +8 -2
  621. package/src/resources/templates/workflows/evaluate.yaml +13 -7
  622. package/src/resources/templates/workflows/execute.yaml +40 -23
  623. package/src/resources/templates/workflows/plan.yaml +15 -8
  624. package/src/resources/templates/workflows/review.yaml +14 -8
  625. package/dist/TaskforceScreenshot.d.ts +0 -11
  626. package/dist/TaskforceScreenshot.js +0 -113
  627. package/dist/compat/priorityCompat.d.ts +0 -2
  628. package/dist/compat/priorityCompat.js +0 -24
  629. package/dist/components/features/settings/TaxonomyManager 2.d.ts +0 -52
  630. package/dist/components/features/settings/TaxonomyManager 2.js +0 -75
  631. package/dist/components/task/TaskKanban 2.d.ts +0 -76
  632. package/dist/components/task/TaskKanban 2.js +0 -1004
  633. package/dist/components/task/TaskScreenshotSection.d.ts +0 -15
  634. package/dist/components/task/TaskScreenshotSection.js +0 -22
  635. package/dist/components/views/StandaloneLayout 2.d.ts +0 -8
  636. package/dist/components/views/StandaloneLayout 2.js +0 -1660
  637. package/dist/core/InitiativeTemplates.test.js +0 -50
  638. package/dist/core/ParentLifecycle.test.js +0 -98
  639. package/dist/migrations/clientMigrations.d.ts +0 -9
  640. package/dist/migrations/clientMigrations.js +0 -74
  641. package/dist/migrations/flags.d.ts +0 -6
  642. package/dist/migrations/flags.js +0 -8
  643. package/dist/migrations/taskMigrations.d.ts +0 -71
  644. package/dist/migrations/taskMigrations.js +0 -236
  645. package/dist/migrations/taskMigrations.test.js +0 -34
  646. package/dist/server/routes.billing.js +0 -991
  647. package/dist/server/routes.billing.test.js +0 -387
  648. package/dist/server/routes.sync.integration.test.js +0 -470
  649. package/dist/server/routes.sync.js +0 -1141
  650. package/dist/soak/syncSoakHarness.d.ts +0 -6
  651. package/dist/soak/syncSoakHarness.js +0 -10
  652. package/dist/ui/assets/index-0W5vyCpn.css +0 -1
  653. package/dist/ui/assets/index-MCZuNNfn.js +0 -23
  654. package/dist/ui/assets/logo_white_01-0Vx-iIIv.png +0 -0
  655. package/dist/ui/assets/vendor-dnd-BI1K77C1.js +0 -5
  656. package/dist/ui/assets/vendor-react-DdIDsh7f.js +0 -9
  657. package/dist/ui/assets/vendor-router-BtiNU7Dl.js +0 -3
  658. package/dist/utils/taskHierarchy.d.ts +0 -4
  659. package/dist/utils/taskHierarchy.js +0 -69
  660. package/dist/utils/taskHierarchy.test.js +0 -38
  661. package/dist/utils/taskParenting.d.ts +0 -3
  662. package/dist/utils/taskParenting.js +0 -24
  663. package/dist/utils/taskParenting.test.js +0 -21
  664. package/dist/utils/taskRelations.d.ts +0 -6
  665. package/dist/utils/taskRelations.js +0 -24
  666. package/dist/utils/taskRelations.test.js +0 -34
  667. package/scripts/check-compat-boundaries.js +0 -48
  668. /package/dist/{__tests__/planParser.test.d.ts → TaskforceCore.filter-persistence.test.d.ts} +0 -0
  669. /package/dist/{__tests__/releaseVersion.test.d.ts → TaskforceCore.routing.test.d.ts} +0 -0
  670. /package/dist/{__tests__/structuredCommentValidation.test.d.ts → annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts} +0 -0
  671. /package/dist/{__tests__/structuredDocValidation.test.d.ts → annotatedAttachments/payload.test.d.ts} +0 -0
  672. /package/dist/{__tests__/templateEngine.test.d.ts → annotatedAttachments/types.js} +0 -0
  673. /package/dist/{__tests__/templates.test.d.ts → compat/workspaceSyncCompat.test.d.ts} +0 -0
  674. /package/dist/{__tests__/workflowDocumentFixtures.test.d.ts → components/features/AgentsModule.test.d.ts} +0 -0
  675. /package/dist/{__tests__/workflowExportMatrix.test.d.ts → components/features/AnnotatedAttachmentWorkspace.test.d.ts} +0 -0
  676. /package/dist/{__tests__/workflowExportSnapshots.test.d.ts → components/features/DocumentWorkspace.test.d.ts} +0 -0
  677. /package/dist/{__tests__/workflowGeneration.test.d.ts → components/features/settings/TaxonomyLibraryManager.test.d.ts} +0 -0
  678. /package/dist/{__tests__/workflowV2Policy.test.d.ts → components/task/TaskActionHeader.test.d.ts} +0 -0
  679. /package/dist/{core/InitiativeTemplates.test.d.ts → components/task/TaskKanban.planning-drop.test.d.ts} +0 -0
  680. /package/dist/{core/ParentLifecycle.test.d.ts → components/task/TaskStatusActions.test.d.ts} +0 -0
  681. /package/dist/{migrations/taskMigrations.test.d.ts → components/ui/TopNoticeLayer.test.d.ts} +0 -0
  682. /package/dist/{server/routes.billing.test.d.ts → components/views/AppShellHeader.test.d.ts} +0 -0
  683. /package/dist/{server/routes.sync.integration.test.d.ts → components/views/PlanComparisonPage.test.d.ts} +0 -0
  684. /package/dist/{utils/taskHierarchy.test.d.ts → components/views/chrome/WorkspaceChromeSections.test.d.ts} +0 -0
  685. /package/dist/{utils/taskParenting.test.d.ts → components/views/chrome/workspaceChrome.test.d.ts} +0 -0
  686. /package/dist/{utils/taskRelations.test.d.ts → components/views/panels/DocumentFilterToolbar.test.d.ts} +0 -0
  687. /package/dist/public/{android-chrome-192x192.png → archive/phoenix/android-chrome-192x192.png} +0 -0
  688. /package/dist/public/{android-chrome-512x512.png → archive/phoenix/android-chrome-512x512.png} +0 -0
  689. /package/dist/public/{favicon-16x16.png → archive/phoenix/favicon-16x16.png} +0 -0
  690. /package/dist/public/{favicon-32x32.png → archive/phoenix/favicon-32x32.png} +0 -0
  691. /package/dist/public/{favicon.png → archive/phoenix/favicon.png} +0 -0
  692. /package/dist/{__tests__ → services}/workflowExportSnapshots.test.js +0 -0
  693. /package/dist/{__tests__ → services}/workflowGeneration.test.js +0 -0
  694. /package/dist/ui/favicon/{android-chrome-192x192.png → archive/phoenix/android-chrome-192x192.png} +0 -0
  695. /package/dist/ui/favicon/{android-chrome-512x512.png → archive/phoenix/android-chrome-512x512.png} +0 -0
  696. /package/dist/ui/favicon/{favicon-16x16.png → archive/phoenix/favicon-16x16.png} +0 -0
  697. /package/dist/ui/favicon/{favicon-32x32.png → archive/phoenix/favicon-32x32.png} +0 -0
  698. /package/dist/ui/favicon/{favicon.png → archive/phoenix/favicon.png} +0 -0
@@ -6,27 +6,49 @@ import { CSS } from '@dnd-kit/utilities';
6
6
  import { createPortal } from 'react-dom';
7
7
  import styles from '../../Taskforce.module.css';
8
8
  import { TaskCard } from './TaskCard';
9
- import { isDropInCenterZone } from '../../utils/taskDragZones';
10
- import { shouldPromptReparent, wouldCreateParentCycle } from '../../utils/taskParenting';
11
- import { buildHierarchyDepthMap } from '../../utils/taskHierarchy';
12
- import { sortChildTasksForDisplay } from '../../utils/taskRelations';
9
+ import { compareTasksBySortKey } from '../../utils/taxonomySorting.js';
13
10
  import * as Icons from 'lucide-react';
14
11
  import { IconMap, resolveColor } from '../../utils/constants';
15
12
  const EXPIRED_CARD_ID_PREFIX = 'expired::';
16
- export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery, copiedId, availableSpecialists, taxonomies, priorities, approaches, onUpdateTask, onTaskClick, onOpenTaskById, onCopyId, onToggleInProgress, onToggleReview, onToggleComplete, onToggleCancel, onArchiveTask, onUnarchive, onDelete, onUnlinkChildTask, onClearParentTask, allTasks = [], hierarchyTasks = [], onAddTaskToColumn, emptyColumnMode = 'show', filterCategories = [], filterTypes = [], filterPriorities = [], filterStatus = [], filterAssignees = ['agent', 'user', 'unassigned'], assigneeFilterEnabled = false, scheduleFilteredTaskIds, categories = [], compressed = false, recentlyChangedTaskIds = [], scheduleDates, onScheduleDaySelected, onScheduleParentDrop, hierarchyChildOrderMode = 'manual', persistedScrollLeft, onScrollLeftChange, sortBy = 'created', sortOrder = 'desc' }) {
13
+ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery, copiedId, taxonomies, types, priorities, approaches, assigneeOptions = [], onUpdateTask, onTaskClick, onOpenTaskById, onCopyId, onToggleInProgress, onToggleReview, onToggleComplete, onToggleCancel, onSetStatus, onArchiveTask, onUnarchive, onDelete, allTasks = [], onAddTaskToColumn, emptyColumnMode = 'show', filterCategories = [], filterTypes = [], filterPriorities = [], filterStatus = [], filterAssignees = [], scheduleFilteredTaskIds, categories = [], compressed = false, readOnlyMode = null, recentlyChangedTaskIds = [], scheduleDates, onScheduleDaySelected, persistedScrollLeft, onScrollLeftChange, sortBy = 'created', sortOrder = 'desc', planningDropTargets = null, onAssignTaskToWorkstream, onAssignWorkstreamToInitiative, showTaskCardStatusLabel = true, workstreams = [], initiatives = [], }) {
17
14
  const [activeId, setActiveId] = useState(null);
18
- const [recentlyLinkedParentIds, setRecentlyLinkedParentIds] = useState([]);
19
- const [currentParentDropTargetId, setCurrentParentDropTargetId] = useState(null);
20
15
  const [isHeaderPanning, setIsHeaderPanning] = useState(false);
21
16
  const [headerPanEnabled, setHeaderPanEnabled] = useState(false);
22
17
  const changedTaskIdSet = useMemo(() => new Set(recentlyChangedTaskIds), [recentlyChangedTaskIds]);
18
+ const workstreamById = useMemo(() => new Map(workstreams.map((workstream) => [workstream.id, workstream])), [workstreams]);
19
+ const initiativeById = useMemo(() => new Map(initiatives.map((initiative) => [initiative.id, initiative])), [initiatives]);
20
+ const resolveTaskHierarchy = useCallback((task) => {
21
+ const taskWorkstream = task.workstreamId ? workstreamById.get(task.workstreamId) || null : null;
22
+ const taskInitiative = taskWorkstream?.initiativeId ? initiativeById.get(taskWorkstream.initiativeId) || null : null;
23
+ return { taskWorkstream, taskInitiative };
24
+ }, [initiativeById, workstreamById]);
23
25
  const taskIdSet = useMemo(() => new Set(tasks.map(t => t.id)), [tasks]);
24
26
  const getTaskIdFromCardId = useCallback((cardId) => (cardId.startsWith(EXPIRED_CARD_ID_PREFIX)
25
27
  ? cardId.slice(EXPIRED_CARD_ID_PREFIX.length)
26
28
  : cardId), []);
27
29
  const isTaskCardId = useCallback((id) => taskIdSet.has(getTaskIdFromCardId(id)), [taskIdSet, getTaskIdFromCardId]);
28
30
  const scheduleFilteredTaskIdSet = useMemo(() => new Set(scheduleFilteredTaskIds || []), [scheduleFilteredTaskIds]);
29
- const linkFeedbackTimersRef = useRef(new Map());
31
+ const lastPlanningOverRef = useRef(null);
32
+ const resolveActiveDragMeta = useCallback((activeLike) => {
33
+ const current = activeLike?.data?.current || {};
34
+ const activeId = String(activeLike?.id || '');
35
+ let taskId = String(current.taskId || '');
36
+ let workstreamId = String(current.workstreamId || '');
37
+ if (!taskId && activeId && isTaskCardId(activeId)) {
38
+ taskId = getTaskIdFromCardId(activeId);
39
+ }
40
+ if (!workstreamId && activeId.startsWith('planning-workstream:')) {
41
+ workstreamId = activeId.slice('planning-workstream:'.length);
42
+ }
43
+ let type = String(current.type || '');
44
+ if (!type) {
45
+ if (taskId)
46
+ type = 'task-card';
47
+ else if (workstreamId)
48
+ type = 'planning-workstream';
49
+ }
50
+ return { activeId, type, taskId, workstreamId };
51
+ }, [getTaskIdFromCardId, isTaskCardId]);
30
52
  // Sensors
31
53
  const sensors = useSensors(useSensor(PointerSensor, {
32
54
  activationConstraint: {
@@ -111,35 +133,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
111
133
  ]);
112
134
  return dateToColumn.get(scheduledDate) || '__offweek';
113
135
  };
114
- const hierarchyDepthSource = hierarchyTasks.length > 0
115
- ? hierarchyTasks
116
- : (allTasks.length > 0 ? allTasks : tasks);
117
- const hierarchyDepthMap = useMemo(() => buildHierarchyDepthMap(hierarchyDepthSource), [hierarchyDepthSource]);
118
- const hierarchyParentIdSet = useMemo(() => {
119
- const set = new Set();
120
- for (const task of hierarchyDepthSource) {
121
- if (task.parentTaskId)
122
- set.add(task.parentTaskId);
123
- }
124
- return set;
125
- }, [hierarchyDepthSource]);
126
- const childrenByParentId = useMemo(() => {
127
- const map = new Map();
128
- for (const task of hierarchyDepthSource) {
129
- if (!task.parentTaskId)
130
- continue;
131
- const list = map.get(task.parentTaskId) || [];
132
- list.push(task);
133
- map.set(task.parentTaskId, list);
134
- }
135
- return map;
136
- }, [hierarchyDepthSource]);
137
- const getHierarchyColumnValue = (task) => {
138
- const isStandalone = !task.parentTaskId && !hierarchyParentIdSet.has(task.id);
139
- if (isStandalone)
140
- return 'standalone';
141
- return String((hierarchyDepthMap.get(task.id) ?? 0) + 1);
142
- };
143
136
  const columnLookup = useMemo(() => {
144
137
  const map = new Map();
145
138
  for (const column of kanbanColumns) {
@@ -154,7 +147,7 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
154
147
  const columnTotals = useMemo(() => {
155
148
  const counts = {};
156
149
  kanbanColumns.forEach(col => { counts[String(col.value)] = 0; });
157
- const totalsSource = groupBy === 'hierarchy' ? tasks : allTasks;
150
+ const totalsSource = allTasks.length > 0 ? allTasks : tasks;
158
151
  totalsSource.forEach(task => {
159
152
  let stringValue = '';
160
153
  if (groupBy === 'status') {
@@ -163,9 +156,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
163
156
  else if (groupBy === 'schedule') {
164
157
  stringValue = getScheduleColumnValue(task);
165
158
  }
166
- else if (groupBy === 'hierarchy') {
167
- stringValue = getHierarchyColumnValue(task);
168
- }
169
159
  else {
170
160
  const rawValue = task[groupBy];
171
161
  stringValue = String(rawValue ?? '');
@@ -183,7 +173,7 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
183
173
  }
184
174
  });
185
175
  return counts;
186
- }, [allTasks, tasks, kanbanColumns, groupBy, hierarchyDepthMap, columnLookup, hierarchyParentIdSet, todayDateOnly]);
176
+ }, [allTasks, tasks, kanbanColumns, groupBy, columnLookup, todayDateOnly]);
187
177
  // Group items by the groupBy field
188
178
  const groupedTasks = useMemo(() => {
189
179
  const groups = {};
@@ -200,9 +190,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
200
190
  else if (groupBy === 'schedule') {
201
191
  stringValue = getScheduleColumnValue(task);
202
192
  }
203
- else if (groupBy === 'hierarchy') {
204
- stringValue = getHierarchyColumnValue(task);
205
- }
206
193
  else {
207
194
  const rawValue = task[groupBy];
208
195
  // Fix: Use ?? to allow 0 as a valid value
@@ -237,32 +224,7 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
237
224
  return String(a.createdAt || '').localeCompare(String(b.createdAt || ''));
238
225
  };
239
226
  const compareByHeaderSort = (a, b) => {
240
- let comparison = 0;
241
- if (sortBy === 'created') {
242
- comparison = new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
243
- }
244
- else if (sortBy === 'updated') {
245
- const aUpdated = a.updatedAt || a.createdAt;
246
- const bUpdated = b.updatedAt || b.createdAt;
247
- comparison = new Date(bUpdated).getTime() - new Date(aUpdated).getTime();
248
- }
249
- else if (sortBy === 'priority') {
250
- const priorityA = typeof a.priority === 'number' ? a.priority : 2;
251
- const priorityB = typeof b.priority === 'number' ? b.priority : 2;
252
- comparison = priorityB - priorityA;
253
- if (comparison === 0) {
254
- comparison = new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
255
- }
256
- }
257
- else if (sortBy === 'complexity') {
258
- const complexityA = typeof a.complexity === 'number' ? a.complexity : 3;
259
- const complexityB = typeof b.complexity === 'number' ? b.complexity : 3;
260
- comparison = complexityB - complexityA;
261
- if (comparison === 0) {
262
- comparison = new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
263
- }
264
- }
265
- return sortOrder === 'desc' ? comparison : -comparison;
227
+ return compareTasksBySortKey(a, b, sortBy, sortOrder, taxonomies);
266
228
  };
267
229
  Object.keys(groups).forEach((key) => {
268
230
  if (key === 'backlog' || key === 'expired') {
@@ -272,70 +234,8 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
272
234
  groups[key].sort(sortByScheduleOrder);
273
235
  });
274
236
  }
275
- else if (groupBy === 'hierarchy' && hierarchyChildOrderMode === 'manual') {
276
- const depthSource = hierarchyDepthSource;
277
- const sourceIndexById = new Map();
278
- depthSource.forEach((task, index) => sourceIndexById.set(task.id, index));
279
- const sourceTaskById = new Map();
280
- depthSource.forEach((task) => sourceTaskById.set(task.id, task));
281
- const sourceChildrenByParent = new Map();
282
- depthSource.forEach((task) => {
283
- if (!task.parentTaskId)
284
- return;
285
- const siblings = sourceChildrenByParent.get(task.parentTaskId) || [];
286
- siblings.push(task);
287
- sourceChildrenByParent.set(task.parentTaskId, siblings);
288
- });
289
- sourceChildrenByParent.forEach((siblings, parentId) => {
290
- sourceChildrenByParent.set(parentId, sortChildTasksForDisplay(siblings));
291
- });
292
- const roots = depthSource.filter((task) => !task.parentTaskId || !sourceTaskById.has(task.parentTaskId));
293
- roots.sort((a, b) => {
294
- const idxA = sourceIndexById.get(a.id) ?? Number.MAX_SAFE_INTEGER;
295
- const idxB = sourceIndexById.get(b.id) ?? Number.MAX_SAFE_INTEGER;
296
- return idxA - idxB;
297
- });
298
- const pathByTaskId = new Map();
299
- const visited = new Set();
300
- const assignPaths = (task, path) => {
301
- if (visited.has(task.id))
302
- return;
303
- visited.add(task.id);
304
- pathByTaskId.set(task.id, path);
305
- const children = sourceChildrenByParent.get(task.id) || [];
306
- children.forEach((child, index) => {
307
- assignPaths(child, [...path, index]);
308
- });
309
- };
310
- roots.forEach((root, index) => {
311
- assignPaths(root, [index]);
312
- });
313
- depthSource.forEach((task) => {
314
- if (!pathByTaskId.has(task.id)) {
315
- const fallbackIndex = sourceIndexById.get(task.id) ?? Number.MAX_SAFE_INTEGER;
316
- pathByTaskId.set(task.id, [Number.MAX_SAFE_INTEGER, fallbackIndex]);
317
- }
318
- });
319
- const compareHierarchyPath = (a, b) => {
320
- const pathA = pathByTaskId.get(a.id) || [Number.MAX_SAFE_INTEGER];
321
- const pathB = pathByTaskId.get(b.id) || [Number.MAX_SAFE_INTEGER];
322
- const maxLen = Math.max(pathA.length, pathB.length);
323
- for (let i = 0; i < maxLen; i += 1) {
324
- const segA = pathA[i] ?? -1;
325
- const segB = pathB[i] ?? -1;
326
- if (segA !== segB)
327
- return segA - segB;
328
- }
329
- const idxA = sourceIndexById.get(a.id) ?? Number.MAX_SAFE_INTEGER;
330
- const idxB = sourceIndexById.get(b.id) ?? Number.MAX_SAFE_INTEGER;
331
- return idxA - idxB;
332
- };
333
- Object.keys(groups).forEach((key) => {
334
- groups[key].sort(compareHierarchyPath);
335
- });
336
- }
337
237
  return groups;
338
- }, [tasks, kanbanColumns, groupBy, hierarchyDepthMap, columnLookup, hierarchyParentIdSet, scheduleFilteredTaskIdSet, todayDateOnly, hierarchyChildOrderMode, hierarchyDepthSource, sortBy, sortOrder]);
238
+ }, [tasks, allTasks, kanbanColumns, groupBy, columnLookup, scheduleFilteredTaskIdSet, todayDateOnly, sortBy, sortOrder]);
339
239
  const activeTaskId = activeId ? getTaskIdFromCardId(activeId) : null;
340
240
  const activeTaskOverlay = activeTaskId ? tasks.find(t => t.id === activeTaskId) : null;
341
241
  // Scroll Syncing Refs and Logic
@@ -364,7 +264,7 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
364
264
  return !filterStatus.includes(String(columnValue));
365
265
  }
366
266
  if (groupBy === 'assignee')
367
- return assigneeFilterEnabled && !filterAssignees.includes(String(columnValue));
267
+ return !filterAssignees.includes(String(columnValue));
368
268
  return false;
369
269
  };
370
270
  const totalWidth = useMemo(() => {
@@ -499,12 +399,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
499
399
  document.body.style.userSelect = '';
500
400
  };
501
401
  }, [isHeaderPanning]);
502
- useEffect(() => {
503
- return () => {
504
- linkFeedbackTimersRef.current.forEach((timerId) => window.clearTimeout(timerId));
505
- linkFeedbackTimersRef.current.clear();
506
- };
507
- }, []);
508
402
  const handleHeaderPointerDown = (event) => {
509
403
  if (!headerPanEnabled)
510
404
  return;
@@ -520,34 +414,50 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
520
414
  };
521
415
  const handleDragStart = (event) => {
522
416
  setActiveId(event.active.id);
523
- setCurrentParentDropTargetId(null);
524
417
  };
525
418
  const handleDragOver = (event) => {
526
- if (groupBy === 'schedule') {
527
- setCurrentParentDropTargetId(null);
528
- return;
419
+ const activeMeta = resolveActiveDragMeta(event.active);
420
+ const overType = String(event.over?.data?.current?.type || '');
421
+ if (activeMeta.type === 'task-card' && overType.startsWith('planning-')) {
422
+ lastPlanningOverRef.current = `${String(event.over?.id || '')}:${overType}`;
529
423
  }
530
- const { active, over } = event;
531
- if (!over) {
532
- setCurrentParentDropTargetId(null);
533
- return;
534
- }
535
- const activeId = String(active.id);
536
- const overId = String(over.id);
537
- const activeTaskId = getTaskIdFromCardId(activeId);
538
- const overTaskId = getTaskIdFromCardId(overId);
539
- const activeTask = tasks.find(t => t.id === activeTaskId);
540
- const overTask = tasks.find(t => t.id === overTaskId);
541
- if (!activeTask || !overTask || activeTask.id === overTask.id) {
542
- setCurrentParentDropTargetId(null);
543
- return;
424
+ else if (lastPlanningOverRef.current) {
425
+ lastPlanningOverRef.current = null;
544
426
  }
545
- setCurrentParentDropTargetId(overTask.id);
427
+ return;
546
428
  };
547
429
  const handleDragEnd = (event) => {
548
430
  const { active, over } = event;
431
+ lastPlanningOverRef.current = null;
549
432
  setActiveId(null);
550
- setCurrentParentDropTargetId(null);
433
+ const activeMeta = resolveActiveDragMeta(active);
434
+ const activeType = activeMeta.type;
435
+ const overType = String(over?.data?.current?.type || '');
436
+ const activeTaskDataId = activeMeta.taskId;
437
+ const activeWorkstreamDataId = activeMeta.workstreamId;
438
+ const overWorkstreamDataId = String(over?.data?.current?.workstreamId || '');
439
+ const overInitiativeDataId = String(over?.data?.current?.initiativeId || '');
440
+ if (activeType === 'task-card') {
441
+ if (overType === 'planning-workstream-target' && activeTaskDataId && overWorkstreamDataId) {
442
+ void onAssignTaskToWorkstream?.(activeTaskDataId, overWorkstreamDataId);
443
+ return;
444
+ }
445
+ if (overType === 'planning-task-unlink' && activeTaskDataId) {
446
+ void onAssignTaskToWorkstream?.(activeTaskDataId, null);
447
+ return;
448
+ }
449
+ }
450
+ if (activeType === 'planning-workstream') {
451
+ if (overType === 'planning-initiative-target' && activeWorkstreamDataId && overInitiativeDataId) {
452
+ void onAssignWorkstreamToInitiative?.(activeWorkstreamDataId, overInitiativeDataId);
453
+ return;
454
+ }
455
+ if (overType === 'planning-workstream-unlink' && activeWorkstreamDataId) {
456
+ void onAssignWorkstreamToInitiative?.(activeWorkstreamDataId, null);
457
+ return;
458
+ }
459
+ return;
460
+ }
551
461
  const activeId = String(active.id);
552
462
  const overId = over ? String(over.id) : null;
553
463
  const activeTaskId = getTaskIdFromCardId(activeId);
@@ -555,41 +465,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
555
465
  const activeTask = tasks.find(t => t.id === activeTaskId);
556
466
  if (!activeTask || !overId)
557
467
  return;
558
- const overTask = overTaskId ? tasks.find(t => t.id === overTaskId) : undefined;
559
- if (groupBy !== 'schedule' && overTask && overTask.id !== activeTask.id) {
560
- const overRect = over?.rect;
561
- const translatedActiveRect = active.rect.current.translated;
562
- const initialActiveRect = active.rect.current.initial;
563
- const activeRect = translatedActiveRect || initialActiveRect;
564
- if (overRect && activeRect) {
565
- const droppedInCenterZone = isDropInCenterZone(overRect, activeRect);
566
- if (droppedInCenterZone) {
567
- if (activeTask.parentTaskId === overTask.id)
568
- return;
569
- const relationshipTasks = allTasks.length > 0 ? allTasks : tasks;
570
- if (wouldCreateParentCycle(activeTask.id, overTask.id, relationshipTasks)) {
571
- window.alert(`Cannot link child ${activeTask.id} to parent ${overTask.id}: link would create a cycle.`);
572
- return;
573
- }
574
- if (shouldPromptReparent(activeTask.parentTaskId, overTask.id)) {
575
- const confirmed = window.confirm(`Task ${activeTask.id} is already parented to ${activeTask.parentTaskId}. Re-parent it to ${overTask.id}?`);
576
- if (!confirmed)
577
- return;
578
- }
579
- onUpdateTask(activeTask.id, { parentTaskId: overTask.id });
580
- setRecentlyLinkedParentIds((prev) => Array.from(new Set([...prev, overTask.id])));
581
- const existing = linkFeedbackTimersRef.current.get(overTask.id);
582
- if (existing)
583
- window.clearTimeout(existing);
584
- const timerId = window.setTimeout(() => {
585
- linkFeedbackTimersRef.current.delete(overTask.id);
586
- setRecentlyLinkedParentIds((prev) => prev.filter((id) => id !== overTask.id));
587
- }, 1800);
588
- linkFeedbackTimersRef.current.set(overTask.id, timerId);
589
- return;
590
- }
591
- }
592
- }
593
468
  // Find the container (column) we dropped into
594
469
  // If we dropped over a task, findContainer resolves to that task's column
595
470
  // If we dropped over a column (empty or not), it resolves to the column ID
@@ -604,18 +479,13 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
604
479
  const column = columnLookup.get(containerId)
605
480
  || kanbanColumns.find(c => String(c.value) === containerId || c.label === containerId);
606
481
  if (column) {
607
- if (groupBy === 'hierarchy') {
608
- // Hierarchy columns are derived from relationships, not directly writable fields.
609
- // Re-parenting remains card-to-card only.
610
- return;
611
- }
612
482
  if (groupBy === 'schedule') {
613
483
  const targetColumn = String(column.value);
614
484
  const scheduleKeys = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
615
485
  const isScheduleReorderColumn = targetColumn === 'backlog' || targetColumn === 'expired' || scheduleKeys.includes(targetColumn);
616
486
  const buildInsertIndex = (targetTasks) => {
617
487
  let insertAt = targetTasks.length;
618
- const candidateOverTaskId = overTask?.id || (overId && isTaskCardId(overId) ? getTaskIdFromCardId(overId) : null);
488
+ const candidateOverTaskId = overId && isTaskCardId(overId) ? getTaskIdFromCardId(overId) : null;
619
489
  if (!candidateOverTaskId || !taskIdSet.has(candidateOverTaskId))
620
490
  return insertAt;
621
491
  const overTaskId = candidateOverTaskId;
@@ -705,32 +575,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
705
575
  return;
706
576
  }
707
577
  const scheduledWeekKey = scheduleContext.parseToIsoWeekKey(scheduledDate);
708
- if (childrenByParentId.has(activeTask.id)) {
709
- const stack = [...(childrenByParentId.get(activeTask.id) || [])];
710
- const descendants = [];
711
- while (stack.length > 0) {
712
- const next = stack.shift();
713
- descendants.push(next);
714
- const children = childrenByParentId.get(next.id) || [];
715
- if (children.length > 0)
716
- stack.push(...children);
717
- }
718
- const leafDescendants = descendants.filter((task) => !childrenByParentId.has(task.id));
719
- const activeLeafDescendants = leafDescendants.filter((task) => !task.isArchived && task.status !== 'done' && task.status !== 'cancelled');
720
- const toSchedule = activeLeafDescendants.filter((task) => !task.scheduledDate);
721
- const alreadyScheduledLeafCount = Math.max(0, activeLeafDescendants.length - toSchedule.length);
722
- onScheduleParentDrop?.({
723
- parentTaskId: activeTask.id,
724
- parentTitle: activeTask.title,
725
- targetColumn: targetColumn,
726
- targetDate: scheduledDate,
727
- toScheduleLeafTaskIds: toSchedule.map((task) => task.id),
728
- alreadyScheduledLeafCount,
729
- totalLeafDescendants: activeLeafDescendants.length
730
- });
731
- onScheduleDaySelected?.(scheduledDate);
732
- return;
733
- }
734
578
  const pendingUpdates = new Map();
735
579
  const targetTasks = (groupedTasks[targetColumn] || []).filter(t => t.id !== activeTaskId);
736
580
  const insertAt = buildInsertIndex(targetTasks);
@@ -838,9 +682,6 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
838
682
  else if (groupBy === 'schedule') {
839
683
  val = getScheduleColumnValue(task);
840
684
  }
841
- else if (groupBy === 'hierarchy') {
842
- val = getHierarchyColumnValue(task);
843
- }
844
685
  else {
845
686
  val = String(task[groupBy] ?? '');
846
687
  }
@@ -859,111 +700,116 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
859
700
  }),
860
701
  };
861
702
  const customCollisionDetection = (args) => {
862
- // First, look for collisions with the pointer (mouse cursor)
863
- // This is crucial for collapsed columns which are narrow
864
- const pointerCollisions = pointerWithin(args);
865
- // If we have pointer collisions, user is explicitly hovering over something
866
- if (pointerCollisions.length > 0) {
867
- const pointerCoords = args.pointerCoordinates;
868
- if (!pointerCoords)
869
- return [pointerCollisions[0]];
870
- // Prefer task cards over columns when both collide.
871
- const taskCollisions = pointerCollisions.filter((c) => {
872
- const id = String(c.id);
873
- return isTaskCardId(id) && id !== activeId;
874
- });
875
- if (taskCollisions.length === 0) {
876
- // Pointer is often between cards (gap), where only column collision exists.
877
- // Constrain nearest-task fallback to the column under pointer to avoid cross-column/day drift.
878
- const columnCollisions = pointerCollisions.filter((c) => {
703
+ try {
704
+ // First, look for collisions with the pointer (mouse cursor)
705
+ // This is crucial for collapsed columns which are narrow
706
+ const pointerCollisions = pointerWithin(args);
707
+ // If we have pointer collisions, user is explicitly hovering over something
708
+ if (pointerCollisions.length > 0) {
709
+ const planningCollision = pointerCollisions.find((collision) => String(collision.id).startsWith('planning-'));
710
+ if (planningCollision) {
711
+ return [planningCollision];
712
+ }
713
+ const pointerCoords = args.pointerCoordinates;
714
+ if (!pointerCoords)
715
+ return [pointerCollisions[0]];
716
+ // Prefer task cards over columns when both collide.
717
+ const taskCollisions = pointerCollisions.filter((c) => {
879
718
  const id = String(c.id);
880
- return !isTaskCardId(id);
719
+ return isTaskCardId(id) && id !== activeId;
881
720
  });
882
- const hoveredColumnCollision = columnCollisions.find((collision) => {
883
- const mapped = findContainer(String(collision.id));
884
- return Boolean(mapped);
885
- }) || null;
886
- const hoveredColumnId = hoveredColumnCollision
887
- ? findContainer(String(hoveredColumnCollision.id))
888
- : null;
889
- const taskDroppables = (args.droppableContainers || []).filter((container) => {
890
- const id = String(container.id);
891
- if (!isTaskCardId(id) || id === activeId)
892
- return false;
893
- if (!hoveredColumnId)
894
- return true;
895
- return findContainer(id) === hoveredColumnId;
896
- });
897
- if (taskDroppables.length > 0) {
898
- const nearestTask = closestCorners({
899
- ...args,
900
- droppableContainers: taskDroppables
721
+ if (taskCollisions.length === 0) {
722
+ // Pointer is often between cards (gap), where only column collision exists.
723
+ // Constrain nearest-task fallback to the column under pointer to avoid cross-column/day drift.
724
+ const columnCollisions = pointerCollisions.filter((c) => {
725
+ const id = String(c.id);
726
+ return !isTaskCardId(id);
727
+ });
728
+ const hoveredColumnCollision = columnCollisions.find((collision) => {
729
+ const mapped = findContainer(String(collision.id));
730
+ return Boolean(mapped);
731
+ }) || null;
732
+ const hoveredColumnId = hoveredColumnCollision
733
+ ? findContainer(String(hoveredColumnCollision.id))
734
+ : null;
735
+ const taskDroppables = (args.droppableContainers || []).filter((container) => {
736
+ const id = String(container.id);
737
+ if (!isTaskCardId(id) || id === activeId)
738
+ return false;
739
+ if (!hoveredColumnId)
740
+ return true;
741
+ return findContainer(id) === hoveredColumnId;
901
742
  });
902
- if (nearestTask.length > 0) {
903
- return [nearestTask[0]];
743
+ if (taskDroppables.length > 0) {
744
+ const nearestTask = closestCorners({
745
+ ...args,
746
+ droppableContainers: taskDroppables
747
+ });
748
+ if (nearestTask.length > 0) {
749
+ return [nearestTask[0]];
750
+ }
904
751
  }
752
+ if (hoveredColumnCollision) {
753
+ return [hoveredColumnCollision];
754
+ }
755
+ return [pointerCollisions[0]];
905
756
  }
906
- if (hoveredColumnCollision) {
907
- return [hoveredColumnCollision];
908
- }
909
- return [pointerCollisions[0]];
910
- }
911
- const candidates = taskCollisions;
912
- let best = candidates[0];
913
- let bestDistance = Number.POSITIVE_INFINITY;
914
- for (const collision of candidates) {
915
- const rect = args.droppableRects?.get(collision.id);
916
- if (!rect)
917
- continue;
918
- const centerX = rect.left + rect.width / 2;
919
- const centerY = rect.top + rect.height / 2;
920
- const dx = pointerCoords.x - centerX;
921
- const dy = pointerCoords.y - centerY;
922
- const distance = dx * dx + dy * dy;
923
- if (distance < bestDistance) {
924
- bestDistance = distance;
925
- best = collision;
757
+ const candidates = taskCollisions;
758
+ let best = candidates[0];
759
+ let bestDistance = Number.POSITIVE_INFINITY;
760
+ for (const collision of candidates) {
761
+ const rect = args.droppableRects?.get(collision.id);
762
+ if (!rect)
763
+ continue;
764
+ const centerX = rect.left + rect.width / 2;
765
+ const centerY = rect.top + rect.height / 2;
766
+ const dx = pointerCoords.x - centerX;
767
+ const dy = pointerCoords.y - centerY;
768
+ const distance = dx * dx + dy * dy;
769
+ if (distance < bestDistance) {
770
+ bestDistance = distance;
771
+ best = collision;
772
+ }
926
773
  }
774
+ return [best];
927
775
  }
928
- return [best];
776
+ // Fallback to closestCorners for other cases (like keyboard or large overlaps)
777
+ return closestCorners(args);
778
+ }
779
+ catch (error) {
780
+ console.error('[TaskKanban] collision detection error', error);
781
+ return [];
929
782
  }
930
- // Fallback to closestCorners for other cases (like keyboard or large overlaps)
931
- return closestCorners(args);
932
783
  };
933
784
  const commonCardProps = {
934
785
  searchQuery,
935
786
  copiedId,
936
- // Use a stable relationship source so parent/child UI does not disappear
937
- // when list filters hide related tasks from the board.
938
- allTasks: hierarchyTasks.length > 0
939
- ? hierarchyTasks
940
- : (allTasks.length > 0 ? allTasks : tasks),
941
- availableSpecialists,
942
787
  taxonomies,
788
+ types,
943
789
  priorities,
944
790
  approaches,
791
+ assigneeOptions,
945
792
  onCopyId,
946
793
  onToggleInProgress,
947
794
  onToggleReview,
948
795
  onToggleComplete,
949
796
  onToggleCancel,
797
+ onSetStatus,
950
798
  onArchiveTask,
951
799
  onUnarchive,
952
800
  onDelete,
953
801
  onOpenTaskById,
954
- onUnlinkChildTask,
955
- onClearParentTask,
956
802
  categories,
803
+ readOnlyMode,
957
804
  changedTaskIdSet,
958
- linkedParentIdSet: new Set(recentlyLinkedParentIds),
959
- parentDropTargetId: currentParentDropTargetId,
805
+ resolveTaskHierarchy,
960
806
  groupBy,
961
- scheduleParentIdSet: hierarchyParentIdSet
807
+ showStatusLabel: showTaskCardStatusLabel
962
808
  };
963
- return (_jsxs(DndContext, { sensors: sensors, collisionDetection: customCollisionDetection, onDragStart: handleDragStart, onDragOver: handleDragOver, onDragEnd: handleDragEnd, onDragCancel: () => {
809
+ return (_jsxs(DndContext, { sensors: sensors, collisionDetection: customCollisionDetection, onDragStart: handleDragStart, onDragOver: handleDragOver, onDragEnd: handleDragEnd, onDragCancel: (event) => {
810
+ lastPlanningOverRef.current = null;
964
811
  setActiveId(null);
965
- setCurrentParentDropTargetId(null);
966
- }, children: [_jsxs("div", { className: styles.kanbanWrapper, children: [_jsx("div", { ref: topScrollRef, className: styles.kanbanTopScroll, children: _jsx("div", { className: styles.kanbanTopScrollSpacer, style: { width: `${totalWidth}px` } }) }), _jsx("div", { className: styles.kanbanContainer, ref: containerRef, children: kanbanColumns.map((column) => {
812
+ }, children: [planningDropTargets, _jsxs("div", { className: styles.kanbanWrapper, children: [_jsx("div", { ref: topScrollRef, className: `${styles.kanbanTopScroll} tf-scrollbar`, children: _jsx("div", { className: styles.kanbanTopScrollSpacer, style: { width: `${totalWidth}px` } }) }), _jsx("div", { className: styles.kanbanContainer, ref: containerRef, children: kanbanColumns.map((column) => {
967
813
  const columnTasks = groupedTasks[String(column.value)] || [];
968
814
  const isExplicitlyHidden = getIsColumnHidden(column.value, column.label);
969
815
  const isAutoHidden = groupBy !== 'schedule' && emptyColumnMode === 'hide' && columnTasks.length === 0;
@@ -979,7 +825,10 @@ export function TaskKanban({ tasks, columns: kanbanColumns, groupBy, searchQuery
979
825
  if (isExplicitlyHidden || isAutoHidden)
980
826
  return null;
981
827
  return (_jsx(KanbanColumn, { id: String(column.value), title: column.label, color: column.color, icon: column.icon, tasks: columnTasks, activeId: activeId, activeTaskId: activeTaskId, totalCount: columnTotals[String(column.value)], onAddTask: () => onAddTaskToColumn?.(groupBy, column.value), onTaskClick: onTaskClick, commonCardProps: commonCardProps, collapseEmpty: emptyColumnMode === 'collapse', compressed: compressed, onHeaderPointerDown: handleHeaderPointerDown, isHeaderPanning: isHeaderPanning, headerPanEnabled: headerPanEnabled, stickyLeft: stickyLeft, stickyZIndex: stickyZIndex, isPast: !!column.isPast, isSelected: !!column.isSelected, isWeekend: !!column.isWeekend, disableSorting: false, scheduleDate: groupBy === 'schedule' ? scheduleContext.dates[String(column.value)] : undefined, onScheduleDaySelected: onScheduleDaySelected }, String(column.value)));
982
- }) })] }), createPortal(_jsx(DragOverlay, { dropAnimation: dropAnimation, children: activeTaskOverlay ? (_jsx(TaskCard, { task: activeTaskOverlay, isOverlay: true, ...commonCardProps, isArchived: activeTaskOverlay.isArchived, categories: categories, compressed: compressed, isRecentlyChanged: changedTaskIdSet.has(activeTaskOverlay.id) })) : null }), document.body)] }));
828
+ }) })] }), createPortal(_jsx(DragOverlay, { dropAnimation: dropAnimation, children: activeTaskOverlay ? ((() => {
829
+ const { taskWorkstream, taskInitiative } = resolveTaskHierarchy(activeTaskOverlay);
830
+ return (_jsx(TaskCard, { task: activeTaskOverlay, taskWorkstream: taskWorkstream, taskInitiative: taskInitiative, isOverlay: true, ...commonCardProps, isArchived: activeTaskOverlay.isArchived, categories: categories, compressed: compressed, isRecentlyChanged: changedTaskIdSet.has(activeTaskOverlay.id) }));
831
+ })()) : null }), document.body)] }));
983
832
  }
984
833
  function KanbanColumn({ id, title, color, icon, tasks, activeId = null, activeTaskId = null, totalCount, onAddTask, onTaskClick, commonCardProps, collapseEmpty, compressed, onHeaderPointerDown, isHeaderPanning = false, headerPanEnabled = false, stickyLeft, stickyZIndex, isPast = false, isSelected = false, isWeekend = false, disableSorting = false, scheduleDate, onScheduleDaySelected }) {
985
834
  const { setNodeRef } = useDroppable({
@@ -999,7 +848,7 @@ function KanbanColumn({ id, title, color, icon, tasks, activeId = null, activeTa
999
848
  const target = event.target;
1000
849
  if (!target)
1001
850
  return;
1002
- if (target.closest(`.${styles.taskItem}`) || target.closest(`.${styles.kanbanCardWrapper}`))
851
+ if (target.closest('[data-task-card="true"]') || target.closest(`.${styles.kanbanCardWrapper}`))
1003
852
  return;
1004
853
  onScheduleDaySelected(scheduleDate);
1005
854
  };
@@ -1007,11 +856,21 @@ function KanbanColumn({ id, title, color, icon, tasks, activeId = null, activeTa
1007
856
  const IconComp = icon && IconMap[icon] ? IconMap[icon] : Icons.Folder;
1008
857
  const resolvedColor = resolveColor(color) || 'var(--color-purple)';
1009
858
  return _jsx(IconComp, { size: 16, style: { color: resolvedColor } });
1010
- })(), !isCollapsed && _jsx("span", { style: { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }, children: title })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px', flexShrink: 0 }, children: [(!isCollapsed || totalCount > 0) && (_jsx("span", { className: styles.kanbanCount, children: isCollapsed ? totalCount : `${tasks.length} / ${totalCount}` })), _jsx("button", { className: styles.kanbanQuickAdd, onClick: (e) => { e.stopPropagation(); onAddTask(); }, title: `Add task to ${title}`, "data-no-header-pan": "true", children: _jsx(Icons.Plus, { size: 14 }) })] })] }), _jsx("div", { className: styles.kanbanDroppable, children: _jsx("div", { className: styles.kanbanDroppableScroll, ref: scrollRef, children: disableSorting ? (visibleTasks.map((task) => (_jsx("div", { className: styles.kanbanCardWrapper, children: _jsx(TaskCard, { task: task, onClick: onTaskClick, ...commonCardProps, isArchived: task.isArchived, compressed: compressed, isRecentlyChanged: false }) }, task.id)))) : (_jsx(SortableContext, { id: id, items: visibleTasks.map((t) => toSortableId(t.id)), strategy: verticalListSortingStrategy, children: visibleTasks.map((task) => (_jsx(SortableTaskCard, { sortableId: toSortableId(task.id), task: task, onClick: onTaskClick, commonCardProps: commonCardProps, compressed: compressed, isRecentlyChanged: commonCardProps.changedTaskIdSet?.has(task.id) }, toSortableId(task.id)))) })) }) })] }));
859
+ })(), !isCollapsed && _jsx("span", { style: { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }, children: title })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px', flexShrink: 0 }, children: [(!isCollapsed || totalCount > 0) && (_jsx("span", { className: styles.kanbanCount, children: isCollapsed ? totalCount : `${tasks.length} / ${totalCount}` })), !commonCardProps.readOnlyMode && (_jsx("button", { className: "tf-control-icon tf-control-icon-compact", onClick: (e) => { e.stopPropagation(); onAddTask(); }, title: `Add task to ${title}`, "aria-label": `Add task to ${title}`, "data-no-header-pan": "true", children: _jsx(Icons.Plus, { size: 14 }) }))] })] }), _jsx("div", { className: styles.kanbanDroppable, children: _jsx("div", { className: `${styles.kanbanDroppableScroll} ${styles.appScrollbar} tf-scrollbar`, ref: scrollRef, children: disableSorting ? (visibleTasks.map((task) => (_jsx("div", { className: styles.kanbanCardWrapper, children: (() => {
860
+ const { taskWorkstream, taskInitiative } = commonCardProps.resolveTaskHierarchy?.(task) || {};
861
+ return (_jsx(TaskCard, { task: task, taskWorkstream: taskWorkstream, taskInitiative: taskInitiative, onClick: onTaskClick, ...commonCardProps, isArchived: task.isArchived, readOnlyMode: commonCardProps.readOnlyMode || null, compressed: compressed, isRecentlyChanged: false }));
862
+ })() }, task.id)))) : (_jsx(SortableContext, { id: id, items: visibleTasks.map((t) => toSortableId(t.id)), strategy: verticalListSortingStrategy, children: visibleTasks.map((task) => (_jsx(SortableTaskCard, { sortableId: toSortableId(task.id), task: task, onClick: onTaskClick, commonCardProps: commonCardProps, compressed: compressed, isRecentlyChanged: commonCardProps.changedTaskIdSet?.has(task.id) }, toSortableId(task.id)))) })) }) })] }));
1011
863
  }
1012
864
  function SortableTaskCard({ sortableId, task, onClick, commonCardProps, compressed, isRecentlyChanged = false }) {
1013
- const dragDisabled = false;
1014
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: sortableId, disabled: dragDisabled });
865
+ const dragDisabled = Boolean(commonCardProps?.readOnlyMode);
866
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
867
+ id: sortableId,
868
+ disabled: dragDisabled,
869
+ data: {
870
+ type: 'task-card',
871
+ taskId: task.id,
872
+ },
873
+ });
1015
874
  const style = {
1016
875
  transform: CSS.Transform.toString(transform),
1017
876
  transition,
@@ -1019,8 +878,9 @@ function SortableTaskCard({ sortableId, task, onClick, commonCardProps, compress
1019
878
  pointerEvents: isDragging ? 'none' : 'auto',
1020
879
  };
1021
880
  const isScheduleMode = commonCardProps?.groupBy === 'schedule';
1022
- const isGlowActive = !isScheduleMode && (isRecentlyChanged
1023
- || commonCardProps?.parentDropTargetId === task.id
1024
- || !!commonCardProps?.linkedParentIdSet?.has(task.id));
1025
- return (_jsx("div", { ref: setNodeRef, style: style, ...(dragDisabled ? {} : attributes), ...(dragDisabled ? {} : listeners), className: `${styles.kanbanCardWrapper} ${isGlowActive ? styles.kanbanCardWrapperRaised : ''}`, children: _jsx(TaskCard, { task: task, onClick: onClick, ...commonCardProps, isArchived: task.isArchived, compressed: compressed, isRecentlyChanged: isScheduleMode ? false : isRecentlyChanged }) }));
881
+ const isGlowActive = !isScheduleMode && isRecentlyChanged;
882
+ return (_jsx("div", { ref: setNodeRef, style: style, ...(dragDisabled ? {} : attributes), ...(dragDisabled ? {} : listeners), className: `${styles.kanbanCardWrapper} ${isGlowActive ? styles.kanbanCardWrapperRaised : ''}`, children: (() => {
883
+ const { taskWorkstream, taskInitiative } = commonCardProps.resolveTaskHierarchy?.(task) || {};
884
+ return (_jsx(TaskCard, { task: task, taskWorkstream: taskWorkstream, taskInitiative: taskInitiative, onClick: onClick, ...commonCardProps, isArchived: task.isArchived, readOnlyMode: commonCardProps?.readOnlyMode || null, compressed: compressed, isRecentlyChanged: isScheduleMode ? false : isRecentlyChanged }));
885
+ })() }));
1026
886
  }