@taskforcehq/taskforce 0.3.324 → 0.3.327
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.
- package/LICENSE.md +68 -0
- package/README.md +19 -0
- package/dist/Taskforce.module.css +2191 -540
- package/dist/TaskforceCore.d.ts +1 -0
- package/dist/TaskforceCore.js +65 -22
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.d.ts +1 -0
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +3 -2
- package/dist/annotatedAttachments/commandService.d.ts +68 -0
- package/dist/annotatedAttachments/commandService.js +348 -0
- package/dist/annotatedAttachments/service.d.ts +2 -0
- package/dist/annotatedAttachments/service.js +13 -12
- package/dist/cli.js +158 -9
- package/dist/cliOpenPort.d.ts +1 -0
- package/dist/cliOpenPort.js +4 -0
- package/dist/compat/taskforceAgentDefinitionCompat.d.ts +12 -0
- package/dist/compat/taskforceAgentDefinitionCompat.js +25 -0
- package/dist/compat/workspaceSyncCompat.js +6 -2
- package/dist/compat/workspaceSyncV3CombinedCoverageCompat.d.ts +6 -0
- package/dist/compat/workspaceSyncV3CombinedCoverageCompat.js +22 -0
- package/dist/compat/workspaceSyncV3OperationCompat.d.ts +7 -0
- package/dist/compat/workspaceSyncV3OperationCompat.js +30 -0
- package/dist/components/activity/EntityActivityTimeline.d.ts +10 -2
- package/dist/components/activity/EntityActivityTimeline.js +73 -35
- package/dist/components/context/AttachmentPreviewHost.d.ts +6 -0
- package/dist/components/context/AttachmentPreviewHost.js +222 -0
- package/dist/components/context/ContextAttachmentManager.d.ts +4 -0
- package/dist/components/context/ContextAttachmentManager.js +418 -208
- package/dist/components/features/AiProfilesModule.d.ts +24 -0
- package/dist/components/features/AiProfilesModule.js +744 -0
- package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +4 -1
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +351 -79
- package/dist/components/features/DocumentGenerateModal.js +23 -5
- package/dist/components/features/DocumentIndex.d.ts +19 -1
- package/dist/components/features/DocumentIndex.js +104 -15
- package/dist/components/features/DocumentViewer.d.ts +9 -1
- package/dist/components/features/DocumentViewer.js +721 -100
- package/dist/components/features/DocumentWorkspace.d.ts +37 -2
- package/dist/components/features/DocumentWorkspace.js +21 -6
- package/dist/components/features/TaskSettings.d.ts +6 -27
- package/dist/components/features/TaskSettings.js +257 -151
- package/dist/components/features/TaskforceAgentsModule.d.ts +36 -0
- package/dist/components/features/TaskforceAgentsModule.js +1782 -0
- package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.d.ts +94 -0
- package/dist/components/features/agentBehavior/AgentBehaviorManagerShared.js +70 -0
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +65 -0
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +115 -0
- package/dist/components/features/agentRoles/RoleManagerPanel.d.ts +4 -0
- package/dist/components/features/agentRoles/RoleManagerPanel.js +382 -0
- package/dist/components/features/agentSkills/SkillManagerPanel.d.ts +5 -0
- package/dist/components/features/agentSkills/SkillManagerPanel.js +355 -0
- package/dist/components/features/documentWorkspaceModel.d.ts +16 -4
- package/dist/components/features/documentWorkspaceModel.js +30 -5
- package/dist/components/features/planning/PlanningArchiveConfirmation.d.ts +9 -0
- package/dist/components/features/planning/PlanningArchiveConfirmation.js +19 -0
- package/dist/components/features/planning/PlanningCardIdentity.d.ts +12 -0
- package/dist/components/features/planning/PlanningCardIdentity.js +44 -0
- package/dist/components/features/planning/PlanningEntityDetails.d.ts +36 -0
- package/dist/components/features/planning/PlanningEntityDetails.js +131 -0
- package/dist/components/features/planning/PlanningEntitySummary.d.ts +44 -0
- package/dist/components/features/planning/PlanningEntitySummary.js +97 -0
- package/dist/components/features/planning/PlanningLinkPicker.d.ts +9 -0
- package/dist/components/features/planning/PlanningLinkPicker.js +26 -0
- package/dist/components/features/planning/PlanningModule.d.ts +6 -0
- package/dist/components/features/planning/PlanningModule.js +571 -0
- package/dist/components/features/planning/PlanningOwnerDropdown.d.ts +27 -0
- package/dist/components/features/planning/PlanningOwnerDropdown.js +80 -0
- package/dist/components/features/planning/PlanningTaskArrangeControl.d.ts +5 -0
- package/dist/components/features/planning/PlanningTaskArrangeControl.js +11 -0
- package/dist/components/features/planning/PlanningTaskCard.d.ts +20 -0
- package/dist/components/features/planning/PlanningTaskCard.js +26 -0
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +10 -0
- package/dist/components/features/planning/PlanningTaskOrderList.js +52 -0
- package/dist/components/features/planning/PlanningUnlinkConfirmation.d.ts +15 -0
- package/dist/components/features/planning/PlanningUnlinkConfirmation.js +7 -0
- package/dist/components/features/planning/planningCreateIntent.d.ts +10 -0
- package/dist/components/features/planning/planningCreateIntent.js +16 -0
- package/dist/components/features/planning/planningNavigator.d.ts +33 -0
- package/dist/components/features/planning/planningNavigator.js +96 -0
- package/dist/components/features/planning/planningTaskArrangement.d.ts +18 -0
- package/dist/components/features/planning/planningTaskArrangement.js +106 -0
- package/dist/components/features/planning/planningWorkspaceModel.d.ts +121 -0
- package/dist/components/features/planning/planningWorkspaceModel.js +5 -0
- package/dist/components/features/settings/CategoryManager.js +2 -2
- package/dist/components/features/settings/TaxonomyEditor.js +1 -1
- package/dist/components/features/settings/TaxonomyManager.js +1 -1
- package/dist/components/features/settings/TypeManager.js +1 -1
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.d.ts +10 -0
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +175 -0
- package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.d.ts +27 -0
- package/dist/components/features/taskforceAgentAssignments/agentBehaviorCatalogApi.js +24 -0
- package/dist/components/features/taskforceAgentEditorModel.d.ts +109 -0
- package/dist/components/features/taskforceAgentEditorModel.js +145 -0
- package/dist/components/features/useDocumentWorkspaceController.d.ts +20 -1
- package/dist/components/features/useDocumentWorkspaceController.js +106 -21
- package/dist/components/features/workflowManager/WorkflowManagerModule.d.ts +11 -0
- package/dist/components/features/workflowManager/WorkflowManagerModule.js +313 -0
- package/dist/components/features/workflowManager/WorkflowPublishDialog.d.ts +11 -0
- package/dist/components/features/workflowManager/WorkflowPublishDialog.js +8 -0
- package/dist/components/features/workflowManager/types.d.ts +74 -0
- package/dist/components/features/workflowManager/types.js +1 -0
- package/dist/components/features/workflowManager/useWorkflowManager.d.ts +30 -0
- package/dist/components/features/workflowManager/useWorkflowManager.js +213 -0
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +52 -0
- package/dist/components/features/workflowManager/workflowManagerApi.js +142 -0
- package/dist/components/task/TaskActionHeader.d.ts +6 -3
- package/dist/components/task/TaskActionHeader.js +46 -53
- package/dist/components/task/TaskCard.d.ts +10 -2
- package/dist/components/task/TaskCard.js +103 -54
- package/dist/components/task/TaskContextUpload.d.ts +1 -0
- package/dist/components/task/TaskContextUpload.js +3 -2
- package/dist/components/task/TaskForm.d.ts +12 -17
- package/dist/components/task/TaskForm.js +544 -199
- package/dist/components/task/TaskImageReviews.d.ts +8 -0
- package/dist/components/task/TaskImageReviews.js +47 -0
- package/dist/components/task/TaskKanban.d.ts +11 -12
- package/dist/components/task/TaskKanban.js +70 -18
- package/dist/components/task/TaskList.d.ts +9 -8
- package/dist/components/task/TaskList.js +46 -32
- package/dist/components/task/TaskReferenceBadge.d.ts +2 -1
- package/dist/components/task/TaskReferenceBadge.js +3 -2
- package/dist/components/task/TaskStatusActions.d.ts +3 -1
- package/dist/components/task/TaskStatusActions.js +17 -6
- package/dist/components/task/TaskWorkflowAssignmentField.d.ts +18 -0
- package/dist/components/task/TaskWorkflowAssignmentField.js +362 -0
- package/dist/components/task/TaskWorkstreamPicker.d.ts +8 -0
- package/dist/components/task/TaskWorkstreamPicker.js +24 -0
- package/dist/components/task/TrashRestoreControls.d.ts +18 -0
- package/dist/components/task/TrashRestoreControls.js +71 -0
- package/dist/components/ui/AiIdentityRosterCard.d.ts +20 -0
- package/dist/components/ui/AiIdentityRosterCard.js +5 -0
- package/dist/components/ui/AssetTraySortControl.d.ts +10 -0
- package/dist/components/ui/AssetTraySortControl.js +38 -0
- package/dist/components/ui/AssigneeIdentity.d.ts +12 -0
- package/dist/components/ui/AssigneeIdentity.js +41 -0
- package/dist/components/ui/DiscardChangesDialog.d.ts +10 -0
- package/dist/components/ui/DiscardChangesDialog.js +7 -0
- package/dist/components/ui/DisclosureSectionHeader.d.ts +4 -1
- package/dist/components/ui/DisclosureSectionHeader.js +2 -2
- package/dist/components/ui/EditableAvatarButton.d.ts +6 -1
- package/dist/components/ui/EditableAvatarButton.js +6 -5
- package/dist/components/ui/HierarchyActionBadge.d.ts +2 -1
- package/dist/components/ui/HierarchyActionBadge.js +2 -2
- package/dist/components/ui/Markdown.d.ts +13 -3
- package/dist/components/ui/Markdown.fixture.d.ts +1 -0
- package/dist/components/ui/Markdown.fixture.js +23 -0
- package/dist/components/ui/Markdown.js +158 -68
- package/dist/components/ui/Modal.d.ts +3 -1
- package/dist/components/ui/Modal.js +85 -19
- package/dist/components/ui/MultiSelectFilter.d.ts +9 -2
- package/dist/components/ui/MultiSelectFilter.js +26 -5
- package/dist/components/ui/ReferenceBadgeButton.js +2 -3
- package/dist/components/ui/TaxonomyDropdown.d.ts +10 -1
- package/dist/components/ui/TaxonomyDropdown.js +149 -58
- package/dist/components/ui/TopNoticeLayer.d.ts +2 -1
- package/dist/components/ui/TopNoticeLayer.js +5 -2
- package/dist/components/ui/useFallbackImageUrl.d.ts +4 -0
- package/dist/components/ui/useFallbackImageUrl.js +20 -0
- package/dist/components/views/AppShellHeader.js +2 -2
- package/dist/components/views/StandaloneLayout.d.ts +1 -0
- package/dist/components/views/StandaloneLayout.js +1684 -620
- package/dist/components/views/WidgetView.d.ts +1 -0
- package/dist/components/views/WidgetView.js +95 -30
- package/dist/components/views/chrome/WorkspaceChromeSections.d.ts +4 -2
- package/dist/components/views/chrome/WorkspaceChromeSections.js +3 -6
- package/dist/components/views/chrome/workspaceChrome.d.ts +5 -8
- package/dist/components/views/chrome/workspaceChrome.js +62 -27
- package/dist/components/views/panels/FilterToolbar.d.ts +4 -3
- package/dist/components/views/panels/FilterToolbar.js +8 -5
- package/dist/components/views/panels/FilterToolbarControls.d.ts +11 -2
- package/dist/components/views/panels/FilterToolbarControls.js +35 -20
- package/dist/components/views/panels/PlanningDrawer.d.ts +62 -51
- package/dist/components/views/panels/PlanningDrawer.js +993 -314
- package/dist/components/views/planningScope.d.ts +4 -0
- package/dist/components/views/planningScope.js +12 -1
- package/dist/components/views/standalone/modals/AccountSettingsModal.d.ts +62 -0
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +197 -0
- package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +7 -2
- package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +56 -9
- package/dist/components/views/standalone/modals/HelpModal.d.ts +1 -2
- package/dist/components/views/standalone/modals/HelpModal.js +3 -4
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +8 -9
- package/dist/components/views/standalone/modals/SyncStatusModal.js +85 -25
- package/dist/components/views/standalone/modals/TeamManagementModal.js +1 -1
- package/dist/config/applicationBaseUrl.d.ts +2 -0
- package/dist/config/applicationBaseUrl.js +23 -0
- package/dist/config/envSchema.d.ts +1 -1
- package/dist/config/envSchema.js +166 -5
- package/dist/core/AdminAuditRetentionService.d.ts +43 -0
- package/dist/core/AdminAuditRetentionService.js +126 -0
- package/dist/core/AiProfileService.d.ts +34 -0
- package/dist/core/AiProfileService.js +516 -252
- package/dist/core/AttachmentLinkService.d.ts +10 -2
- package/dist/core/AttachmentLinkService.js +44 -12
- package/dist/core/AuthIdentityService.d.ts +6 -0
- package/dist/core/AuthIdentityService.js +38 -0
- package/dist/core/AuthTokenService.d.ts +1 -0
- package/dist/core/AuthTokenService.js +13 -0
- package/dist/core/DeletedTaskLifecycleService.d.ts +4 -2
- package/dist/core/DeletedTaskLifecycleService.js +124 -38
- package/dist/core/GlobalSettingsService.d.ts +3 -1
- package/dist/core/GlobalSettingsService.js +30 -4
- package/dist/core/InitiativeDurableMutationService.d.ts +89 -0
- package/dist/core/InitiativeDurableMutationService.js +187 -0
- package/dist/core/McpTokenService.d.ts +1 -0
- package/dist/core/McpTokenService.js +39 -13
- package/dist/core/PlanningCommandPreparationService.d.ts +60 -0
- package/dist/core/PlanningCommandPreparationService.js +149 -0
- package/dist/core/ScheduleCommandService.d.ts +76 -0
- package/dist/core/ScheduleCommandService.js +165 -0
- package/dist/core/SyncReconciliationService.d.ts +29 -6
- package/dist/core/SyncReconciliationService.js +256 -84
- package/dist/core/TaskActivityService.d.ts +22 -2
- package/dist/core/TaskActivityService.js +177 -29
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +31 -0
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +231 -0
- package/dist/core/TaskChecklistCommandService.d.ts +50 -0
- package/dist/core/TaskChecklistCommandService.js +111 -0
- package/dist/core/TaskDurableCreateMutationService.d.ts +38 -0
- package/dist/core/TaskDurableCreateMutationService.js +85 -0
- package/dist/core/TaskDurableDeleteMutationService.d.ts +47 -0
- package/dist/core/TaskDurableDeleteMutationService.js +54 -0
- package/dist/core/TaskDurableLifecycleMutationService.d.ts +38 -0
- package/dist/core/TaskDurableLifecycleMutationService.js +42 -0
- package/dist/core/TaskDurableRelationshipMutationService.d.ts +58 -0
- package/dist/core/TaskDurableRelationshipMutationService.js +66 -0
- package/dist/core/TaskDurableRestoreMutationService.d.ts +31 -0
- package/dist/core/TaskDurableRestoreMutationService.js +33 -0
- package/dist/core/TaskDurableStatusMutationService.d.ts +74 -0
- package/dist/core/TaskDurableStatusMutationService.js +247 -0
- package/dist/core/TaskDurableSyncMutationService.d.ts +34 -0
- package/dist/core/TaskDurableSyncMutationService.js +70 -0
- package/dist/core/TaskDurableWorkflowMutationService.d.ts +48 -0
- package/dist/core/TaskDurableWorkflowMutationService.js +59 -0
- package/dist/core/TaskLifecycleCommandService.d.ts +101 -0
- package/dist/core/TaskLifecycleCommandService.js +161 -0
- package/dist/core/TaskRootCommandPreparationService.d.ts +35 -0
- package/dist/core/TaskRootCommandPreparationService.js +103 -0
- package/dist/core/Taskforce.d.ts +479 -59
- package/dist/core/Taskforce.js +3671 -841
- package/dist/core/WorkflowAssignmentService.d.ts +40 -0
- package/dist/core/WorkflowAssignmentService.js +158 -0
- package/dist/core/WorkflowExecutionService.d.ts +69 -0
- package/dist/core/WorkflowExecutionService.js +342 -0
- package/dist/core/WorkflowTaskActivationService.d.ts +32 -0
- package/dist/core/WorkflowTaskActivationService.js +63 -0
- package/dist/core/WorkflowTemplateService.d.ts +64 -0
- package/dist/core/WorkflowTemplateService.js +223 -0
- package/dist/core/WorkspaceLifecycleService.d.ts +1 -0
- package/dist/core/WorkspaceLifecycleService.js +18 -0
- package/dist/core/WorkstreamDurableMutationService.d.ts +90 -0
- package/dist/core/WorkstreamDurableMutationService.js +184 -0
- package/dist/core/planningReferencePolicy.d.ts +14 -0
- package/dist/core/planningReferencePolicy.js +53 -0
- package/dist/core/taskReferencePolicy.js +24 -3
- package/dist/core/types.d.ts +10 -10
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +22 -2
- package/dist/documentReviews/DocumentReviewCommentStore.js +92 -8
- package/dist/documentReviews/commandService.d.ts +51 -0
- package/dist/documentReviews/commandService.js +63 -0
- package/dist/documentReviews/service.d.ts +20 -1
- package/dist/documentReviews/service.js +234 -24
- package/dist/documentReviews/types.d.ts +18 -1
- package/dist/hooks/sync/bootstrap.d.ts +3 -7
- package/dist/hooks/sync/bootstrap.js +6 -14
- package/dist/hooks/sync/browserSyncAuthority.d.ts +21 -0
- package/dist/hooks/sync/browserSyncAuthority.js +70 -0
- package/dist/hooks/sync/browserSyncRemoteServices.d.ts +29 -0
- package/dist/hooks/sync/browserSyncRemoteServices.js +58 -0
- package/dist/hooks/sync/controlPlane.d.ts +1 -37
- package/dist/hooks/sync/controlPlane.js +1 -78
- package/dist/hooks/sync/lifecyclePolicy.d.ts +1 -45
- package/dist/hooks/sync/lifecyclePolicy.js +1 -93
- package/dist/hooks/sync/orchestratorShared.d.ts +9 -3
- package/dist/hooks/sync/orchestratorShared.js +70 -96
- package/dist/hooks/sync/pullLifecycle.d.ts +1 -31
- package/dist/hooks/sync/pullLifecycle.js +1 -24
- package/dist/hooks/sync/realtime.d.ts +4 -1
- package/dist/hooks/sync/realtime.js +103 -3
- package/dist/hooks/sync/recovery.d.ts +1 -84
- package/dist/hooks/sync/recovery.js +1 -245
- package/dist/hooks/sync/transfers.d.ts +8 -129
- package/dist/hooks/sync/transfers.js +19 -581
- package/dist/hooks/sync/useDataVersionRefresh.d.ts +6 -1
- package/dist/hooks/sync/useDataVersionRefresh.js +127 -12
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +14 -0
- package/dist/hooks/sync/useDurableLocalOutboxDrain.js +208 -0
- package/dist/hooks/sync/useDurableTaskCreateMutation.d.ts +15 -0
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +152 -0
- package/dist/hooks/sync/useDurableTaskDeleteMutation.d.ts +11 -0
- package/dist/hooks/sync/useDurableTaskDeleteMutation.js +21 -0
- package/dist/hooks/sync/useDurableTaskLifecycleMutation.d.ts +12 -0
- package/dist/hooks/sync/useDurableTaskLifecycleMutation.js +22 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +14 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +24 -0
- package/dist/hooks/sync/useDurableTaskRestoreMutation.d.ts +12 -0
- package/dist/hooks/sync/useDurableTaskRestoreMutation.js +24 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +18 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.js +23 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +23 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +414 -0
- package/dist/hooks/sync/useSyncStatusActions.d.ts +2 -1
- package/dist/hooks/sync/useSyncStatusActions.js +8 -3
- package/dist/hooks/tasks/taskHttpMutation.d.ts +25 -0
- package/dist/hooks/tasks/taskHttpMutation.js +134 -0
- package/dist/hooks/tasks/useCurrentTaskRelations.d.ts +6 -1
- package/dist/hooks/tasks/useCurrentTaskRelations.js +32 -6
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +4 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +9 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +17 -2
- package/dist/hooks/tasks/useTaskFormActions.js +309 -55
- package/dist/hooks/tasks/useTaskReferenceContract.d.ts +5 -0
- package/dist/hooks/tasks/useTaskReferenceContract.js +17 -0
- package/dist/hooks/tasks/useTaskRelationships.d.ts +1 -3
- package/dist/hooks/tasks/useTaskRelationships.js +5 -25
- package/dist/hooks/tasks/useTrashSelection.d.ts +12 -0
- package/dist/hooks/tasks/useTrashSelection.js +49 -0
- package/dist/hooks/ui/useInitiativeTemplates.d.ts +24 -0
- package/dist/hooks/ui/useInitiativeTemplates.js +22 -0
- package/dist/hooks/ui/useSettingsModel.d.ts +5 -29
- package/dist/hooks/ui/useSettingsModel.js +31 -15
- package/dist/hooks/ui/useSettingsPersistence.d.ts +0 -1
- package/dist/hooks/ui/useSettingsPersistence.js +4 -8
- package/dist/hooks/ui/useSettingsTaxonomyManagement.js +31 -0
- package/dist/hooks/useFilterSort.d.ts +2 -2
- package/dist/hooks/useFilterSort.js +19 -15
- package/dist/hooks/useRealtimeSync.d.ts +10 -0
- package/dist/hooks/useRealtimeSync.js +57 -4
- package/dist/hooks/useSyncOrchestrator.d.ts +32 -1
- package/dist/hooks/useSyncOrchestrator.js +963 -287
- package/dist/hooks/useTaskData.d.ts +11 -2
- package/dist/hooks/useTaskData.js +59 -26
- package/dist/hooks/useTaskMutations.d.ts +42 -5
- package/dist/hooks/useTaskMutations.js +750 -125
- package/dist/hooks/useTaskforce.d.ts +114 -118
- package/dist/hooks/useTaskforce.js +1106 -396
- package/dist/hooks/useUiNotice.d.ts +5 -1
- package/dist/hooks/useUiNotice.js +13 -2
- package/dist/hooks/useWorkspaceSyncController.d.ts +9 -0
- package/dist/hooks/useWorkspaceSyncController.js +159 -17
- package/dist/hooks/workspace/usePersistedAppUiState.d.ts +74 -0
- package/dist/hooks/workspace/usePersistedAppUiState.js +325 -0
- package/dist/hooks/workspace/usePersistedLayoutUiState.d.ts +76 -0
- package/dist/hooks/workspace/usePersistedLayoutUiState.js +479 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +2 -7
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +42 -31
- package/dist/hooks/workspace/workspaceLocalState.d.ts +42 -6
- package/dist/hooks/workspace/workspaceLocalState.js +213 -5
- package/dist/hooks/workstreams/workstreamHttpMutation.d.ts +23 -0
- package/dist/hooks/workstreams/workstreamHttpMutation.js +134 -0
- package/dist/localization/locales/en-US.d.ts +3 -3
- package/dist/localization/locales/en-US.js +3 -3
- package/dist/localization/locales/es-419.js +3 -3
- package/dist/localization/locales/pt-BR.js +3 -3
- package/dist/mcp/adminWorkspaceRegistrar.js +2 -40
- package/dist/mcp/aiProfileBootstrap.d.ts +3 -0
- package/dist/mcp/aiProfileBootstrap.js +4 -0
- package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
- package/dist/mcp/canonicalAssetHelpers.js +104 -35
- package/dist/mcp/clientIntegrations.d.ts +4 -2
- package/dist/mcp/clientIntegrations.js +104 -53
- package/dist/mcp/clientRegistry.d.ts +30 -0
- package/dist/mcp/clientRegistry.js +134 -0
- package/dist/mcp/collaborationRegistrar.js +21 -7
- package/dist/mcp/documentAssetRegistrar.js +227 -107
- package/dist/mcp/documentContentCommand.d.ts +94 -0
- package/dist/mcp/documentContentCommand.js +226 -0
- package/dist/mcp/documentHelpers.d.ts +14 -59
- package/dist/mcp/documentHelpers.js +52 -61
- package/dist/mcp/durableTaskMutationRouter.d.ts +65 -0
- package/dist/mcp/durableTaskMutationRouter.js +217 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.d.ts +38 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +168 -0
- package/dist/mcp/durableTaskRootMutationRouter.d.ts +64 -0
- package/dist/mcp/durableTaskRootMutationRouter.js +226 -0
- package/dist/mcp/gitWorktreeRoots.d.ts +2 -0
- package/dist/mcp/gitWorktreeRoots.js +19 -0
- package/dist/mcp/legacyServer.d.ts +1 -0
- package/dist/mcp/legacyServer.js +42 -0
- package/dist/mcp/localCliHealth.d.ts +56 -0
- package/dist/mcp/localCliHealth.js +170 -0
- package/dist/mcp/localServiceProxy.d.ts +23 -0
- package/dist/mcp/localServiceProxy.js +255 -0
- package/dist/mcp/mcpInputValidator.d.ts +17 -0
- package/dist/mcp/mcpInputValidator.js +58 -0
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +127 -0
- package/dist/mcp/planningAttachmentCommandAdapter.js +188 -0
- package/dist/mcp/programScaffoldCommandAdapter.d.ts +6 -0
- package/dist/mcp/programScaffoldCommandAdapter.js +39 -0
- package/dist/mcp/proxyServer.d.ts +1 -0
- package/dist/mcp/proxyServer.js +2 -0
- package/dist/mcp/runtime.d.ts +86 -1
- package/dist/mcp/runtime.js +4562 -2270
- package/dist/mcp/server.js +29 -2
- package/dist/mcp/sharedLocalServiceGateD.d.ts +115 -0
- package/dist/mcp/sharedLocalServiceGateD.js +344 -0
- package/dist/mcp/stdioLifecycle.d.ts +22 -0
- package/dist/mcp/stdioLifecycle.js +54 -0
- package/dist/mcp/taskAttachmentCommandAdapter.d.ts +190 -0
- package/dist/mcp/taskAttachmentCommandAdapter.js +464 -0
- package/dist/mcp/taskAttachmentHelpers.d.ts +8 -6
- package/dist/mcp/taskAttachmentHelpers.js +74 -2
- package/dist/mcp/taskAttachmentTypes.d.ts +26 -5
- package/dist/mcp/taskPlanCommand.d.ts +64 -0
- package/dist/mcp/taskPlanCommand.js +98 -0
- package/dist/mcp/taskPlanningRegistrar.js +253 -101
- package/dist/mcp/toolCallCompatibility.d.ts +6 -0
- package/dist/mcp/toolCallCompatibility.js +16 -0
- package/dist/mcp/toolCatalog.d.ts +3 -1
- package/dist/mcp/toolProfiles.d.ts +18 -0
- package/dist/mcp/toolProfiles.js +79 -0
- package/dist/mcp/toolRegistry.d.ts +102 -609
- package/dist/mcp/toolRegistry.js +108 -88
- package/dist/mcp/workflowExecutionRegistrar.d.ts +2 -0
- package/dist/mcp/workflowExecutionRegistrar.js +51 -0
- package/dist/migrations/taskSchemaMigrations.d.ts +35 -0
- package/dist/migrations/taskSchemaMigrations.js +1797 -4
- package/dist/migrations/taskUpdatedAtSyncDriftMigration.d.ts +20 -0
- package/dist/migrations/taskUpdatedAtSyncDriftMigration.js +153 -0
- package/dist/migrations/taskforceAgentDefinitionMigration.d.ts +26 -0
- package/dist/migrations/taskforceAgentDefinitionMigration.js +116 -0
- package/dist/plugins/vite.js +48 -17
- package/dist/public/Taskforce_Van.webp +0 -0
- package/dist/runtime/appGateDefinitions.d.ts +16 -10
- package/dist/runtime/appGateDefinitions.js +16 -10
- package/dist/runtime/appGates.d.ts +5 -4
- package/dist/runtime/appGates.js +4 -3
- package/dist/server/aiProfileAvatarAssets.d.ts +11 -8
- package/dist/server/aiProfileAvatarAssets.js +159 -70
- package/dist/server/auth.js +15 -1
- package/dist/server/cors.d.ts +2 -1
- package/dist/server/cors.js +45 -8
- package/dist/server/email.d.ts +3 -1
- package/dist/server/email.js +46 -8
- package/dist/server/index.d.ts +24 -1
- package/dist/server/index.js +342 -46
- package/dist/server/localDataOwnerPermit.d.ts +18 -0
- package/dist/server/localDataOwnerPermit.js +58 -0
- package/dist/server/localDatabaseIdentity.d.ts +14 -0
- package/dist/server/localDatabaseIdentity.js +69 -0
- package/dist/server/localRealtimeFileInvalidation.d.ts +1 -0
- package/dist/server/localRealtimeFileInvalidation.js +7 -0
- package/dist/server/localServiceLease.d.ts +62 -0
- package/dist/server/localServiceLease.js +477 -0
- package/dist/server/localServiceOwnershipBootstrap.d.ts +19 -0
- package/dist/server/localServiceOwnershipBootstrap.js +84 -0
- package/dist/server/localServiceSessions.d.ts +87 -0
- package/dist/server/localServiceSessions.js +309 -0
- package/dist/server/localServiceWindowsAcl.d.ts +8 -0
- package/dist/server/localServiceWindowsAcl.js +60 -0
- package/dist/server/localSyncProcessLockBootstrap.d.ts +3 -0
- package/dist/server/localSyncProcessLockBootstrap.js +16 -0
- package/dist/server/localWorkspaceSyncServerComposition.d.ts +59 -0
- package/dist/server/localWorkspaceSyncServerComposition.js +91 -0
- package/dist/server/localWorkspaceSyncServerRuntime.d.ts +119 -0
- package/dist/server/localWorkspaceSyncServerRuntime.js +1163 -0
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +16 -0
- package/dist/server/routes/admin.d.ts +2 -4
- package/dist/server/routes/admin.js +199 -337
- package/dist/server/routes/agentRoles.d.ts +13 -0
- package/dist/server/routes/agentRoles.js +273 -0
- package/dist/server/routes/agentSkills.d.ts +16 -0
- package/dist/server/routes/agentSkills.js +291 -0
- package/dist/server/routes/agents.d.ts +49 -0
- package/dist/server/routes/agents.js +1455 -0
- package/dist/server/routes/annotatedAttachments.js +46 -9
- package/dist/server/routes/assetAccess.d.ts +36 -0
- package/dist/server/routes/assetAccess.js +93 -0
- package/dist/server/routes/auth.d.ts +4 -3
- package/dist/server/routes/auth.js +236 -21
- package/dist/server/routes/authSupport.d.ts +3 -1
- package/dist/server/routes/authSupport.js +22 -8
- package/dist/server/routes/documentReviews.d.ts +2 -0
- package/dist/server/routes/documentReviews.js +155 -15
- package/dist/server/routes/documents.d.ts +1 -0
- package/dist/server/routes/documents.js +335 -141
- package/dist/server/routes/durableTaskHttpRouters.d.ts +165 -0
- package/dist/server/routes/durableTaskHttpRouters.js +89 -0
- package/dist/server/routes/localMcpHealth.d.ts +11 -0
- package/dist/server/routes/localMcpHealth.js +29 -0
- package/dist/server/routes/localService.d.ts +13 -0
- package/dist/server/routes/localService.js +444 -0
- package/dist/server/routes/localUpdate.d.ts +11 -0
- package/dist/server/routes/localUpdate.js +154 -0
- package/dist/server/routes/primitives.d.ts +27 -0
- package/dist/server/routes/primitives.js +18 -0
- package/dist/server/routes/resources.d.ts +1 -10
- package/dist/server/routes/resources.js +1 -153
- package/dist/server/routes/shared.d.ts +31 -2
- package/dist/server/routes/shared.js +394 -0
- package/dist/server/routes/sync.d.ts +2 -0
- package/dist/server/routes/sync.js +184 -272
- package/dist/server/routes/syncAuxRoutes.d.ts +3 -1
- package/dist/server/routes/syncAuxRoutes.js +9 -4
- package/dist/server/routes/syncCoordinatorLocalRoutes.d.ts +6 -0
- package/dist/server/routes/syncCoordinatorLocalRoutes.js +867 -0
- package/dist/server/routes/syncPullApplyRoutes.d.ts +29 -1
- package/dist/server/routes/syncPullApplyRoutes.js +520 -17
- package/dist/server/routes/syncPushRoutes.d.ts +33 -4
- package/dist/server/routes/syncPushRoutes.js +251 -62
- package/dist/server/routes/syncRouteTypes.d.ts +1 -1
- package/dist/server/routes/syncSnapshotRoutes.d.ts +15 -7
- package/dist/server/routes/syncSnapshotRoutes.js +95 -17
- package/dist/server/routes/syncV3DiagnosticsRoutes.d.ts +14 -0
- package/dist/server/routes/syncV3DiagnosticsRoutes.js +72 -0
- package/dist/server/routes/syncV3FeedRoutes.d.ts +20 -0
- package/dist/server/routes/syncV3FeedRoutes.js +462 -0
- package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +897 -0
- package/dist/server/routes/syncV3LocalDispatchRoutes.d.ts +17 -0
- package/dist/server/routes/syncV3LocalDispatchRoutes.js +280 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +17 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +493 -0
- package/dist/server/routes/syncV3LocalOwnershipRoutes.d.ts +10 -0
- package/dist/server/routes/syncV3LocalOwnershipRoutes.js +51 -0
- package/dist/server/routes/syncV3LocalRecoveryRoutes.d.ts +12 -0
- package/dist/server/routes/syncV3LocalRecoveryRoutes.js +78 -0
- package/dist/server/routes/syncV3OperationRoutes.d.ts +35 -0
- package/dist/server/routes/syncV3OperationRoutes.js +1136 -0
- package/dist/server/routes/tasks.d.ts +0 -2
- package/dist/server/routes/tasks.js +932 -195
- package/dist/server/routes/workflows.d.ts +26 -0
- package/dist/server/routes/workflows.js +500 -0
- package/dist/server/routes.d.ts +1 -6
- package/dist/server/routes.js +148 -339
- package/dist/server/smtpTransport.d.ts +11 -3
- package/dist/server/smtpTransport.js +9 -2
- package/dist/server/start.js +42 -10
- package/dist/service/localServiceCli.d.ts +33 -0
- package/dist/service/localServiceCli.js +365 -0
- package/dist/service/localServiceClientLifecycle.d.ts +25 -0
- package/dist/service/localServiceClientLifecycle.js +128 -0
- package/dist/service/localServiceOpen.d.ts +17 -0
- package/dist/service/localServiceOpen.js +27 -0
- package/dist/services/agentRoleResolver.d.ts +4 -0
- package/dist/services/agentRoleResolver.js +7 -0
- package/dist/services/aiProfileAvatarGenerationService.d.ts +41 -0
- package/dist/services/aiProfileAvatarGenerationService.js +158 -0
- package/dist/services/avatarImageProvider.d.ts +33 -0
- package/dist/services/avatarImageProvider.js +140 -0
- package/dist/services/bedrockAnthropicMessagesModelGateway.d.ts +24 -0
- package/dist/services/bedrockAnthropicMessagesModelGateway.js +95 -0
- package/dist/services/bedrockMantleModelGateway.d.ts +43 -0
- package/dist/services/bedrockMantleModelGateway.js +81 -0
- package/dist/services/bedrockModelGateway.d.ts +26 -0
- package/dist/services/bedrockModelGateway.js +94 -0
- package/dist/services/modelGateway.d.ts +82 -0
- package/dist/services/modelGateway.js +61 -0
- package/dist/services/taskforceAgentAvatarImageProvider.d.ts +8 -0
- package/dist/services/taskforceAgentAvatarImageProvider.js +24 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +77 -0
- package/dist/services/taskforceAgentMcpBridge.js +527 -0
- package/dist/shared/agentRoleDefinition.d.ts +34 -0
- package/dist/shared/agentRoleDefinition.js +207 -0
- package/dist/shared/aiProfileAvatarEligibility.d.ts +10 -0
- package/dist/shared/aiProfileAvatarEligibility.js +27 -0
- package/dist/shared/aiProfileColors.d.ts +7 -0
- package/dist/shared/aiProfileColors.js +33 -0
- package/dist/shared/colorPalette.d.ts +3 -0
- package/dist/shared/colorPalette.js +20 -0
- package/dist/shared/commentProvenance.d.ts +4 -0
- package/dist/shared/commentProvenance.js +6 -0
- package/dist/shared/deletedTaskRetention.d.ts +2 -0
- package/dist/shared/deletedTaskRetention.js +7 -0
- package/dist/shared/passwordPolicy.d.ts +2 -1
- package/dist/shared/passwordPolicy.js +9 -0
- package/dist/shared/taskDeepLinks.d.ts +28 -0
- package/dist/shared/taskDeepLinks.js +48 -0
- package/dist/shared/taskRestoreDestination.d.ts +2 -0
- package/dist/shared/taskRestoreDestination.js +5 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +88 -0
- package/dist/shared/taskforceAgentDefinition.js +434 -0
- package/dist/shared/taskforceAgentExecutionSnapshot.d.ts +50 -0
- package/dist/shared/taskforceAgentExecutionSnapshot.js +68 -0
- package/dist/shared/taskforceAgentModels.d.ts +56 -0
- package/dist/shared/taskforceAgentModels.js +314 -0
- package/dist/shared/taskforceAgentRunContext.d.ts +23 -0
- package/dist/shared/taskforceAgentRunContext.js +21 -0
- package/dist/shared/taskforceAgentRuntimeResolution.d.ts +31 -0
- package/dist/shared/taskforceAgentRuntimeResolution.js +72 -0
- package/dist/shared/taskforceAgentSkill.d.ts +33 -0
- package/dist/shared/taskforceAgentSkill.js +149 -0
- package/dist/shared/taxonomyLibrary.js +1 -1
- package/dist/storage/agentRoleStore.d.ts +91 -0
- package/dist/storage/agentRoleStore.js +385 -0
- package/dist/storage/databaseAdapter.d.ts +1 -0
- package/dist/storage/databaseAdapter.js +7 -1
- package/dist/storage/documentIntegrity.d.ts +12 -3
- package/dist/storage/documentIntegrity.js +105 -27
- package/dist/storage/objectStorageClient.d.ts +10 -4
- package/dist/storage/objectStorageClient.js +73 -43
- package/dist/storage/postgresAdapter.d.ts +2 -1
- package/dist/storage/postgresAdapter.js +38 -6
- package/dist/storage/postgresWorker.js +65 -1
- package/dist/storage/sqliteAdapter.d.ts +1 -1
- package/dist/storage/sqliteAdapter.js +7 -1
- package/dist/storage/sqliteWalHealth.d.ts +71 -0
- package/dist/storage/sqliteWalHealth.js +176 -0
- package/dist/storage/taskDataPath.d.ts +1 -0
- package/dist/storage/taskDataPath.js +20 -0
- package/dist/storage/taskforceAgentConversationStore.d.ts +66 -0
- package/dist/storage/taskforceAgentConversationStore.js +264 -0
- package/dist/storage/taskforceAgentSkillStore.d.ts +93 -0
- package/dist/storage/taskforceAgentSkillStore.js +355 -0
- package/dist/storage/taskforceAgentStore.d.ts +105 -0
- package/dist/storage/taskforceAgentStore.js +549 -0
- package/dist/storage/workflowStore.d.ts +223 -0
- package/dist/storage/workflowStore.js +1032 -0
- package/dist/storage/workspaceAssetStore.d.ts +70 -0
- package/dist/storage/workspaceAssetStore.js +418 -25
- package/dist/sync/aiProfileAvatarSyncPaths.d.ts +14 -0
- package/dist/sync/aiProfileAvatarSyncPaths.js +56 -0
- package/dist/sync/cloudSyncApi.d.ts +329 -0
- package/dist/sync/cloudSyncApi.js +596 -4
- package/dist/sync/collaborationSyncPayload.d.ts +5 -1
- package/dist/sync/collaborationSyncPayload.js +213 -1
- package/dist/sync/collaborationSyncState.d.ts +23 -3
- package/dist/sync/collaborationSyncState.js +92 -3
- package/dist/sync/contentSyncPayload.d.ts +9 -0
- package/dist/sync/contentSyncPayload.js +29 -0
- package/dist/sync/contentSyncState.d.ts +79 -4
- package/dist/sync/contentSyncState.js +1113 -313
- package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.d.ts +39 -0
- package/dist/sync/coordinator/localSyncBrowserApplyPermitContext.js +234 -0
- package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.d.ts +7 -0
- package/dist/sync/coordinator/localSyncBrowserAuthorityCapability.js +10 -0
- package/dist/sync/coordinator/localSyncCommittedApplyPolicy.d.ts +7 -0
- package/dist/sync/coordinator/localSyncCommittedApplyPolicy.js +41 -0
- package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.d.ts +178 -0
- package/dist/sync/coordinator/localSyncCoordinatorBrowserClient.js +131 -0
- package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.d.ts +25 -0
- package/dist/sync/coordinator/localSyncCoordinatorCommandLifecycle.js +200 -0
- package/dist/sync/coordinator/localSyncCoordinatorHost.d.ts +84 -0
- package/dist/sync/coordinator/localSyncCoordinatorHost.js +435 -0
- package/dist/sync/coordinator/localSyncCoordinatorRouteServices.d.ts +33 -0
- package/dist/sync/coordinator/localSyncCoordinatorRouteServices.js +1 -0
- package/dist/sync/coordinator/localSyncCoordinatorStore.d.ts +122 -0
- package/dist/sync/coordinator/localSyncCoordinatorStore.js +1039 -0
- package/dist/sync/coordinator/localSyncCoordinatorTypes.d.ts +82 -0
- package/dist/sync/coordinator/localSyncCoordinatorTypes.js +9 -0
- package/dist/sync/coordinator/localSyncDispatchTracker.d.ts +15 -0
- package/dist/sync/coordinator/localSyncDispatchTracker.js +68 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +200 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1388 -0
- package/dist/sync/coordinator/localSyncExecutionPermitTypes.d.ts +52 -0
- package/dist/sync/coordinator/localSyncExecutionPermitTypes.js +8 -0
- package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.d.ts +33 -0
- package/dist/sync/coordinator/localSyncOwnershipDrainBarrier.js +83 -0
- package/dist/sync/coordinator/localSyncPermitTransactionHooks.d.ts +9 -0
- package/dist/sync/coordinator/localSyncPermitTransactionHooks.js +27 -0
- package/dist/sync/coordinator/localSyncProcessLock.d.ts +12 -0
- package/dist/sync/coordinator/localSyncProcessLock.js +212 -0
- package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.d.ts +17 -0
- package/dist/sync/coordinator/localSyncV3DispatchRecoveryReconciler.js +82 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +134 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +981 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +189 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +961 -0
- package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.d.ts +19 -0
- package/dist/sync/coordinator/workspaceSyncCloudCredentialValidator.js +83 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +117 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +323 -0
- package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.d.ts +11 -0
- package/dist/sync/coordinator/workspaceSyncLocalAccessBootstrap.js +51 -0
- package/dist/sync/coordinator/workspaceSyncTransportGateway.d.ts +139 -0
- package/dist/sync/coordinator/workspaceSyncTransportGateway.js +738 -0
- package/dist/sync/engine/localWorkspaceContentManifestService.d.ts +21 -0
- package/dist/sync/engine/localWorkspaceContentManifestService.js +44 -0
- package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.d.ts +36 -0
- package/dist/sync/engine/workspaceSyncAtomicLocalPublisher.js +203 -0
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +21 -0
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.js +13 -0
- package/dist/sync/engine/workspaceSyncContentPullObligationStore.d.ts +65 -0
- package/dist/sync/engine/workspaceSyncContentPullObligationStore.js +160 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +216 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +1068 -0
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.d.ts +28 -0
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +543 -0
- package/dist/sync/engine/workspaceSyncEngineContracts.d.ts +78 -0
- package/dist/sync/engine/workspaceSyncEngineContracts.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineControlPlane.d.ts +37 -0
- package/dist/sync/engine/workspaceSyncEngineControlPlane.js +79 -0
- package/dist/sync/engine/workspaceSyncEngineIdentity.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineIdentity.js +4 -0
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.d.ts +68 -0
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +180 -0
- package/dist/sync/engine/workspaceSyncEngineLocalApply.d.ts +72 -0
- package/dist/sync/engine/workspaceSyncEngineLocalApply.js +132 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +70 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +25 -0
- package/dist/sync/engine/workspaceSyncEngineParity.d.ts +8 -0
- package/dist/sync/engine/workspaceSyncEngineParity.js +7 -0
- package/dist/sync/engine/workspaceSyncEnginePullPolicy.d.ts +32 -0
- package/dist/sync/engine/workspaceSyncEnginePullPolicy.js +27 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +20 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +87 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.d.ts +56 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +288 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +104 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +21 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +61 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +59 -0
- package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.d.ts +28 -0
- package/dist/sync/engine/workspaceSyncEngineServerApplyBoundary.js +86 -0
- package/dist/sync/engine/workspaceSyncEngineServerLocalServices.d.ts +73 -0
- package/dist/sync/engine/workspaceSyncEngineServerLocalServices.js +452 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +23 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +451 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1124 -0
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.d.ts +63 -0
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +276 -0
- package/dist/sync/engine/workspaceSyncEngineTransferCompletion.d.ts +20 -0
- package/dist/sync/engine/workspaceSyncEngineTransferCompletion.js +37 -0
- package/dist/sync/engine/workspaceSyncEngineTransferTypes.d.ts +7 -0
- package/dist/sync/engine/workspaceSyncEngineTransferTypes.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +240 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +1184 -0
- package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.d.ts +39 -0
- package/dist/sync/engine/workspaceSyncEngineV3LocalFeedApply.js +39 -0
- package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.d.ts +25 -0
- package/dist/sync/engine/workspaceSyncImmutableContentGcRunner.js +83 -0
- package/dist/sync/engine/workspaceSyncImmutableContentProvider.d.ts +71 -0
- package/dist/sync/engine/workspaceSyncImmutableContentProvider.js +209 -0
- package/dist/sync/engine/workspaceSyncImmutableContentStager.d.ts +32 -0
- package/dist/sync/engine/workspaceSyncImmutableContentStager.js +202 -0
- package/dist/sync/engine/workspaceSyncPublishedContentResolver.d.ts +43 -0
- package/dist/sync/engine/workspaceSyncPublishedContentResolver.js +142 -0
- package/dist/sync/engine/workspaceSyncServerContentRuntime.d.ts +26 -0
- package/dist/sync/engine/workspaceSyncServerContentRuntime.js +41 -0
- package/dist/sync/engine/workspaceSyncServerDataServices.d.ts +44 -0
- package/dist/sync/engine/workspaceSyncServerDataServices.js +143 -0
- package/dist/sync/engine/workspaceSyncTransferEvidence.d.ts +39 -0
- package/dist/sync/engine/workspaceSyncTransferEvidence.js +45 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +44 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +990 -0
- package/dist/sync/engine/workspaceSyncV2PreparedContent.d.ts +82 -0
- package/dist/sync/engine/workspaceSyncV2PreparedContent.js +219 -0
- package/dist/sync/planningCanonicalFields.d.ts +41 -0
- package/dist/sync/planningCanonicalFields.js +211 -0
- package/dist/sync/planningSyncPayload.d.ts +5 -1
- package/dist/sync/planningSyncPayload.js +88 -4
- package/dist/sync/syncApplyHandlers.d.ts +98 -8
- package/dist/sync/syncApplyHandlers.js +816 -78
- package/dist/sync/syncResourceAdapters.d.ts +10 -0
- package/dist/sync/syncResourceAdapters.js +21 -1
- package/dist/sync/syncService.d.ts +57 -1
- package/dist/sync/syncService.js +1085 -138
- package/dist/sync/taskNestedContent.d.ts +2 -0
- package/dist/sync/taskNestedContent.js +8 -0
- package/dist/sync/taskSyncChangeKey.js +0 -1
- package/dist/sync/taskSyncPayload.d.ts +0 -1
- package/dist/sync/taskSyncPayload.js +14 -3
- package/dist/sync/v3/canonicalWorkspaceSyncJson.d.ts +2 -0
- package/dist/sync/v3/canonicalWorkspaceSyncJson.js +26 -0
- package/dist/sync/v3/combinedFeedCapability.d.ts +21 -0
- package/dist/sync/v3/combinedFeedCapability.js +80 -0
- package/dist/sync/v3/combinedFeedPrerequisites.d.ts +18 -0
- package/dist/sync/v3/combinedFeedPrerequisites.js +184 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.d.ts +61 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +287 -0
- package/dist/sync/v3/durableOperationReplay.d.ts +36 -0
- package/dist/sync/v3/durableOperationReplay.js +103 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +49 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +198 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +47 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +182 -0
- package/dist/sync/v3/durableTaskCommentMutationRouter.d.ts +47 -0
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +191 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +60 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +320 -0
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +40 -0
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +518 -0
- package/dist/sync/v3/durableTaxonomyMutationRouter.d.ts +63 -0
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +289 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +77 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +361 -0
- package/dist/sync/v3/durableWorkstreamMutationRouter.d.ts +61 -0
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +287 -0
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.d.ts +42 -0
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +122 -0
- package/dist/sync/v3/entityEventLegacyAdoptionContract.d.ts +6 -0
- package/dist/sync/v3/entityEventLegacyAdoptionContract.js +6 -0
- package/dist/sync/v3/entityEventLegacyAdoptionService.d.ts +62 -0
- package/dist/sync/v3/entityEventLegacyAdoptionService.js +180 -0
- package/dist/sync/v3/initiativeActivityAuthoritativeRevision.d.ts +11 -0
- package/dist/sync/v3/initiativeActivityAuthoritativeRevision.js +23 -0
- package/dist/sync/v3/initiativeActivityIdentity.d.ts +8 -0
- package/dist/sync/v3/initiativeActivityIdentity.js +14 -0
- package/dist/sync/v3/initiativeCoexistence.d.ts +26 -0
- package/dist/sync/v3/initiativeCoexistence.js +148 -0
- package/dist/sync/v3/initiativeFeedActivationCapability.d.ts +6 -0
- package/dist/sync/v3/initiativeFeedActivationCapability.js +16 -0
- package/dist/sync/v3/initiativeMutationPayload.d.ts +26 -0
- package/dist/sync/v3/initiativeMutationPayload.js +144 -0
- package/dist/sync/v3/initiativeMutationService.d.ts +62 -0
- package/dist/sync/v3/initiativeMutationService.js +206 -0
- package/dist/sync/v3/localEntityEventLegacyAdoption.d.ts +31 -0
- package/dist/sync/v3/localEntityEventLegacyAdoption.js +607 -0
- package/dist/sync/v3/localInitiativeOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localInitiativeOutboxHandler.js +88 -0
- package/dist/sync/v3/localInitiativeOutboxService.d.ts +50 -0
- package/dist/sync/v3/localInitiativeOutboxService.js +495 -0
- package/dist/sync/v3/localOperationIdentityStore.d.ts +81 -0
- package/dist/sync/v3/localOperationIdentityStore.js +388 -0
- package/dist/sync/v3/localOutboxDispatchCapability.d.ts +7 -0
- package/dist/sync/v3/localOutboxDispatchCapability.js +13 -0
- package/dist/sync/v3/localOutboxDispatchRuntime.d.ts +16 -0
- package/dist/sync/v3/localOutboxDispatchRuntime.js +269 -0
- package/dist/sync/v3/localOutboxDispatcher.d.ts +53 -0
- package/dist/sync/v3/localOutboxDispatcher.js +362 -0
- package/dist/sync/v3/localOutboxDrainClient.d.ts +50 -0
- package/dist/sync/v3/localOutboxDrainClient.js +250 -0
- package/dist/sync/v3/localOutboxOperationHandler.d.ts +31 -0
- package/dist/sync/v3/localOutboxOperationHandler.js +10 -0
- package/dist/sync/v3/localOutboxRecoveryClient.d.ts +14 -0
- package/dist/sync/v3/localOutboxRecoveryClient.js +45 -0
- package/dist/sync/v3/localOutboxRecoveryPreparationService.d.ts +12 -0
- package/dist/sync/v3/localOutboxRecoveryPreparationService.js +151 -0
- package/dist/sync/v3/localSyncIdentityStore.d.ts +9 -0
- package/dist/sync/v3/localSyncIdentityStore.js +43 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.d.ts +10 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +70 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +45 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +291 -0
- package/dist/sync/v3/localTaskChecklistOutboxHandler.d.ts +10 -0
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +54 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +47 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +221 -0
- package/dist/sync/v3/localTaskCommentOutboxHandler.d.ts +10 -0
- package/dist/sync/v3/localTaskCommentOutboxHandler.js +94 -0
- package/dist/sync/v3/localTaskCommentOutboxService.d.ts +75 -0
- package/dist/sync/v3/localTaskCommentOutboxService.js +391 -0
- package/dist/sync/v3/localTaskCreateClient.d.ts +27 -0
- package/dist/sync/v3/localTaskCreateClient.js +209 -0
- package/dist/sync/v3/localTaskCreateOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskCreateOutboxHandler.js +147 -0
- package/dist/sync/v3/localTaskCreateOutboxService.d.ts +77 -0
- package/dist/sync/v3/localTaskCreateOutboxService.js +397 -0
- package/dist/sync/v3/localTaskDeleteClient.d.ts +10 -0
- package/dist/sync/v3/localTaskDeleteClient.js +23 -0
- package/dist/sync/v3/localTaskDeleteOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskDeleteOutboxHandler.js +54 -0
- package/dist/sync/v3/localTaskDeleteOutboxService.d.ts +38 -0
- package/dist/sync/v3/localTaskDeleteOutboxService.js +235 -0
- package/dist/sync/v3/localTaskLegacyRootAdoption.d.ts +28 -0
- package/dist/sync/v3/localTaskLegacyRootAdoption.js +219 -0
- package/dist/sync/v3/localTaskLifecycleClient.d.ts +49 -0
- package/dist/sync/v3/localTaskLifecycleClient.js +57 -0
- package/dist/sync/v3/localTaskLifecycleOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskLifecycleOutboxHandler.js +94 -0
- package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +60 -0
- package/dist/sync/v3/localTaskLifecycleOutboxService.js +304 -0
- package/dist/sync/v3/localTaskMetadataClient.d.ts +13 -0
- package/dist/sync/v3/localTaskMetadataClient.js +30 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +70 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +48 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +229 -0
- package/dist/sync/v3/localTaskOperationClient.d.ts +72 -0
- package/dist/sync/v3/localTaskOperationClient.js +195 -0
- package/dist/sync/v3/localTaskRelationshipOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskRelationshipOutboxHandler.js +114 -0
- package/dist/sync/v3/localTaskRelationshipOutboxService.d.ts +45 -0
- package/dist/sync/v3/localTaskRelationshipOutboxService.js +192 -0
- package/dist/sync/v3/localTaskRestoreClient.d.ts +13 -0
- package/dist/sync/v3/localTaskRestoreClient.js +32 -0
- package/dist/sync/v3/localTaskRestoreOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskRestoreOutboxHandler.js +41 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.d.ts +56 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +323 -0
- package/dist/sync/v3/localTaskStatusClient.d.ts +17 -0
- package/dist/sync/v3/localTaskStatusClient.js +35 -0
- package/dist/sync/v3/localTaskStatusOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localTaskStatusOutboxHandler.js +75 -0
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +53 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +422 -0
- package/dist/sync/v3/localTaxonomyCompositeOutboxService.d.ts +34 -0
- package/dist/sync/v3/localTaxonomyCompositeOutboxService.js +290 -0
- package/dist/sync/v3/localTaxonomyOutboxHandler.d.ts +9 -0
- package/dist/sync/v3/localTaxonomyOutboxHandler.js +106 -0
- package/dist/sync/v3/localTaxonomyOutboxService.d.ts +30 -0
- package/dist/sync/v3/localTaxonomyOutboxService.js +181 -0
- package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localWorkflowRuntimeOutboxHandler.js +113 -0
- package/dist/sync/v3/localWorkflowRuntimeOutboxService.d.ts +37 -0
- package/dist/sync/v3/localWorkflowRuntimeOutboxService.js +330 -0
- package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.d.ts +63 -0
- package/dist/sync/v3/localWorkspaceSyncServerOutboxDispatcher.js +264 -0
- package/dist/sync/v3/localWorkstreamOutboxHandler.d.ts +8 -0
- package/dist/sync/v3/localWorkstreamOutboxHandler.js +102 -0
- package/dist/sync/v3/localWorkstreamOutboxService.d.ts +52 -0
- package/dist/sync/v3/localWorkstreamOutboxService.js +579 -0
- package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.d.ts +10 -0
- package/dist/sync/v3/localWorkstreamTaskOrderOutboxHandler.js +57 -0
- package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.d.ts +30 -0
- package/dist/sync/v3/localWorkstreamTaskOrderOutboxService.js +128 -0
- package/dist/sync/v3/planningActivation.d.ts +13 -0
- package/dist/sync/v3/planningActivation.js +33 -0
- package/dist/sync/v3/planningAttachmentActivityValidation.d.ts +9 -0
- package/dist/sync/v3/planningAttachmentActivityValidation.js +87 -0
- package/dist/sync/v3/programScaffoldService.d.ts +143 -0
- package/dist/sync/v3/programScaffoldService.js +478 -0
- package/dist/sync/v3/syncDurabilityStore.d.ts +773 -0
- package/dist/sync/v3/syncDurabilityStore.js +4635 -0
- package/dist/sync/v3/taskActivityAuthoritativeRevision.d.ts +16 -0
- package/dist/sync/v3/taskActivityAuthoritativeRevision.js +67 -0
- package/dist/sync/v3/taskActivityJournal.d.ts +20 -0
- package/dist/sync/v3/taskActivityJournal.js +195 -0
- package/dist/sync/v3/taskAttachmentLinksActivityIdentity.d.ts +6 -0
- package/dist/sync/v3/taskAttachmentLinksActivityIdentity.js +14 -0
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +111 -0
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +202 -0
- package/dist/sync/v3/taskChecklistActivityIdentity.d.ts +6 -0
- package/dist/sync/v3/taskChecklistActivityIdentity.js +14 -0
- package/dist/sync/v3/taskChecklistMutationService.d.ts +92 -0
- package/dist/sync/v3/taskChecklistMutationService.js +156 -0
- package/dist/sync/v3/taskCommentActivityIdentity.d.ts +7 -0
- package/dist/sync/v3/taskCommentActivityIdentity.js +15 -0
- package/dist/sync/v3/taskCommentMutationService.d.ts +150 -0
- package/dist/sync/v3/taskCommentMutationService.js +392 -0
- package/dist/sync/v3/taskCommentReconcileProvenance.d.ts +58 -0
- package/dist/sync/v3/taskCommentReconcileProvenance.js +170 -0
- package/dist/sync/v3/taskCreateActivation.d.ts +19 -0
- package/dist/sync/v3/taskCreateActivation.js +84 -0
- package/dist/sync/v3/taskCreateActivityIdentity.d.ts +7 -0
- package/dist/sync/v3/taskCreateActivityIdentity.js +18 -0
- package/dist/sync/v3/taskCreateMutationService.d.ts +103 -0
- package/dist/sync/v3/taskCreateMutationService.js +283 -0
- package/dist/sync/v3/taskDeleteActivation.d.ts +7 -0
- package/dist/sync/v3/taskDeleteActivation.js +14 -0
- package/dist/sync/v3/taskDeleteMutationService.d.ts +35 -0
- package/dist/sync/v3/taskDeleteMutationService.js +133 -0
- package/dist/sync/v3/taskLegacyRootAdoptionService.d.ts +78 -0
- package/dist/sync/v3/taskLegacyRootAdoptionService.js +175 -0
- package/dist/sync/v3/taskLifecycleActivityIdentity.d.ts +9 -0
- package/dist/sync/v3/taskLifecycleActivityIdentity.js +18 -0
- package/dist/sync/v3/taskLifecycleMutationPayload.d.ts +5 -0
- package/dist/sync/v3/taskLifecycleMutationPayload.js +28 -0
- package/dist/sync/v3/taskLifecycleMutationService.d.ts +66 -0
- package/dist/sync/v3/taskLifecycleMutationService.js +92 -0
- package/dist/sync/v3/taskMetadataActivation.d.ts +12 -0
- package/dist/sync/v3/taskMetadataActivation.js +38 -0
- package/dist/sync/v3/taskMetadataActivityIdentity.d.ts +7 -0
- package/dist/sync/v3/taskMetadataActivityIdentity.js +18 -0
- package/dist/sync/v3/taskMetadataCoexistence.d.ts +37 -0
- package/dist/sync/v3/taskMetadataCoexistence.js +134 -0
- package/dist/sync/v3/taskMetadataMutationService.d.ts +71 -0
- package/dist/sync/v3/taskMetadataMutationService.js +199 -0
- package/dist/sync/v3/taskRelationshipLegacyAdoptionService.d.ts +48 -0
- package/dist/sync/v3/taskRelationshipLegacyAdoptionService.js +164 -0
- package/dist/sync/v3/taskRelationshipMutationService.d.ts +50 -0
- package/dist/sync/v3/taskRelationshipMutationService.js +148 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +90 -0
- package/dist/sync/v3/taskRestoreMutationService.js +179 -0
- package/dist/sync/v3/taskStatusActivation.d.ts +7 -0
- package/dist/sync/v3/taskStatusActivation.js +15 -0
- package/dist/sync/v3/taskStatusMutationService.d.ts +76 -0
- package/dist/sync/v3/taskStatusMutationService.js +308 -0
- package/dist/sync/v3/taskWorkflowMutationPayload.d.ts +4 -0
- package/dist/sync/v3/taskWorkflowMutationPayload.js +22 -0
- package/dist/sync/v3/taskWorkflowMutationService.d.ts +64 -0
- package/dist/sync/v3/taskWorkflowMutationService.js +102 -0
- package/dist/sync/v3/taxonomyCoexistence.d.ts +10 -0
- package/dist/sync/v3/taxonomyCoexistence.js +19 -0
- package/dist/sync/v3/taxonomyCompositeMutationService.d.ts +110 -0
- package/dist/sync/v3/taxonomyCompositeMutationService.js +304 -0
- package/dist/sync/v3/taxonomyMutationService.d.ts +57 -0
- package/dist/sync/v3/taxonomyMutationService.js +106 -0
- package/dist/sync/v3/taxonomyStateMutation.d.ts +22 -0
- package/dist/sync/v3/taxonomyStateMutation.js +49 -0
- package/dist/sync/v3/taxonomySyncPayload.d.ts +9 -0
- package/dist/sync/v3/taxonomySyncPayload.js +199 -0
- package/dist/sync/v3/workflowAssignmentSync.d.ts +22 -0
- package/dist/sync/v3/workflowAssignmentSync.js +213 -0
- package/dist/sync/v3/workflowRuntimeMutationService.d.ts +89 -0
- package/dist/sync/v3/workflowRuntimeMutationService.js +359 -0
- package/dist/sync/v3/workflowRuntimeOperationIdentity.d.ts +13 -0
- package/dist/sync/v3/workflowRuntimeOperationIdentity.js +35 -0
- package/dist/sync/v3/workflowRuntimeSync.d.ts +141 -0
- package/dist/sync/v3/workflowRuntimeSync.js +485 -0
- package/dist/sync/v3/workspaceSyncJournalReader.d.ts +43 -0
- package/dist/sync/v3/workspaceSyncJournalReader.js +45 -0
- package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.d.ts +28 -0
- package/dist/sync/v3/workspaceSyncLocalOwnershipSnapshot.js +81 -0
- package/dist/sync/v3/workspaceSyncPayloadFingerprint.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncPayloadFingerprint.js +5 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +161 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +83 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +161 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +90 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +65 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +356 -0
- package/dist/sync/v3/workspaceSyncV3CombinedCoverage.d.ts +51 -0
- package/dist/sync/v3/workspaceSyncV3CombinedCoverage.js +171 -0
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.d.ts +43 -0
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +535 -0
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1149 -0
- package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.d.ts +96 -0
- package/dist/sync/v3/workspaceSyncV3CombinedProjectionState.js +672 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +42 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +598 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +65 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +505 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +511 -0
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +45 -0
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +125 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.d.ts +13 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +34 -0
- package/dist/sync/v3/workspaceSyncV3CursorEncoding.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CursorEncoding.js +6 -0
- package/dist/sync/v3/workspaceSyncV3DomainAdmission.d.ts +43 -0
- package/dist/sync/v3/workspaceSyncV3DomainAdmission.js +118 -0
- package/dist/sync/v3/workspaceSyncV3Feed.d.ts +95 -0
- package/dist/sync/v3/workspaceSyncV3Feed.js +243 -0
- package/dist/sync/v3/workspaceSyncV3FeedApply.d.ts +13 -0
- package/dist/sync/v3/workspaceSyncV3FeedApply.js +67 -0
- package/dist/sync/v3/workspaceSyncV3FeedClientContract.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3FeedClientContract.js +46 -0
- package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3FeedCursorKeys.js +58 -0
- package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.d.ts +31 -0
- package/dist/sync/v3/workspaceSyncV3FeedOrchestrator.js +228 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +32 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.js +21 -0
- package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.d.ts +36 -0
- package/dist/sync/v3/workspaceSyncV3InitiativeLocalApply.js +163 -0
- package/dist/sync/v3/workspaceSyncV3InitiativeRepair.d.ts +33 -0
- package/dist/sync/v3/workspaceSyncV3InitiativeRepair.js +118 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +45 -0
- package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.d.ts +27 -0
- package/dist/sync/v3/workspaceSyncV3LocalOutboxStatus.js +83 -0
- package/dist/sync/v3/workspaceSyncV3NestedCoverage.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3NestedCoverage.js +40 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +83 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +325 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +59 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +302 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +47 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +329 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +19 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +41 -0
- package/dist/sync/v3/workspaceSyncV3NestedWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3NestedWireContract.js +16 -0
- package/dist/sync/v3/workspaceSyncV3OperationProjection.d.ts +8 -0
- package/dist/sync/v3/workspaceSyncV3OperationProjection.js +52 -0
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +229 -0
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.js +1 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +165 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +414 -0
- package/dist/sync/v3/workspaceSyncV3OriginActor.d.ts +36 -0
- package/dist/sync/v3/workspaceSyncV3OriginActor.js +61 -0
- package/dist/sync/v3/workspaceSyncV3OriginAssertion.d.ts +46 -0
- package/dist/sync/v3/workspaceSyncV3OriginAssertion.js +121 -0
- package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3OriginAssertionHeader.js +1 -0
- package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3PlanningOrderCoverage.js +34 -0
- package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3PlanningOrderWireContract.js +10 -0
- package/dist/sync/v3/workspaceSyncV3ProjectionState.d.ts +105 -0
- package/dist/sync/v3/workspaceSyncV3ProjectionState.js +467 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.d.ts +56 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +250 -0
- package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.d.ts +30 -0
- package/dist/sync/v3/workspaceSyncV3TaskRelationshipProjection.js +142 -0
- package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +40 -0
- package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +246 -0
- package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.d.ts +39 -0
- package/dist/sync/v3/workspaceSyncV3TaxonomyFeedProjection.js +185 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowCoverage.js +36 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +143 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeProjection.js +195 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowWireContract.js +12 -0
- package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.d.ts +4 -0
- package/dist/sync/v3/workspaceSyncV3WorkstreamProjection.js +98 -0
- package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkstreamTaskOrderProjection.js +72 -0
- package/dist/sync/v3/workstreamActivityAuthoritativeRevision.d.ts +11 -0
- package/dist/sync/v3/workstreamActivityAuthoritativeRevision.js +23 -0
- package/dist/sync/v3/workstreamActivityIdentity.d.ts +8 -0
- package/dist/sync/v3/workstreamActivityIdentity.js +14 -0
- package/dist/sync/v3/workstreamCoexistence.d.ts +19 -0
- package/dist/sync/v3/workstreamCoexistence.js +64 -0
- package/dist/sync/v3/workstreamMutationPayload.d.ts +27 -0
- package/dist/sync/v3/workstreamMutationPayload.js +147 -0
- package/dist/sync/v3/workstreamMutationService.d.ts +72 -0
- package/dist/sync/v3/workstreamMutationService.js +256 -0
- package/dist/sync/v3/workstreamTaskOrderMutationService.d.ts +55 -0
- package/dist/sync/v3/workstreamTaskOrderMutationService.js +110 -0
- package/dist/sync/v3/workstreamTaskOrderSync.d.ts +14 -0
- package/dist/sync/v3/workstreamTaskOrderSync.js +25 -0
- package/dist/sync/workspaceContentManifest.d.ts +86 -0
- package/dist/sync/workspaceContentManifest.js +123 -0
- package/dist/sync/workspacePullFeed.d.ts +186 -2
- package/dist/sync/workspacePullFeed.js +513 -136
- package/dist/sync/workspacePushPreparedPlan.d.ts +21 -0
- package/dist/sync/workspacePushPreparedPlan.js +1 -0
- package/dist/sync/workspaceRepair.d.ts +17 -25
- package/dist/sync/workspaceRepair.js +348 -25
- package/dist/sync/workspaceSyncContentDecryption.d.ts +6 -0
- package/dist/sync/workspaceSyncContentDecryption.js +11 -0
- package/dist/sync/workspaceSyncModel.d.ts +216 -5
- package/dist/sync/workspaceSyncModel.js +371 -35
- package/dist/sync/workspaceSyncSnapshotProjection.d.ts +11 -0
- package/dist/sync/workspaceSyncSnapshotProjection.js +101 -0
- package/dist/sync/workspaceSyncState.d.ts +13 -0
- package/dist/sync/workspaceSyncState.js +36 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +106 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +193 -0
- package/dist/types.d.ts +23 -15
- package/dist/types.js +2 -4
- package/dist/ui/ai-profile-clients/amazon-nova.svg +1 -0
- package/dist/ui/ai-profile-clients/antigravity.png +0 -0
- package/dist/ui/ai-profile-clients/chatgpt.svg +10 -0
- package/dist/ui/ai-profile-clients/claude-chat.svg +1 -0
- package/dist/ui/ai-profile-clients/claude-code.svg +15 -0
- package/dist/ui/ai-profile-clients/cline-app-icon-light.png +0 -0
- package/dist/ui/ai-profile-clients/cline.svg +16 -0
- package/dist/ui/ai-profile-clients/codex.svg +1 -0
- package/dist/ui/ai-profile-clients/copilot.png +0 -0
- package/dist/ui/ai-profile-clients/cursor.svg +1 -0
- package/dist/ui/ai-profile-clients/deepseek.svg +1 -0
- package/dist/ui/ai-profile-clients/gemini-cli-icon.png +0 -0
- package/dist/ui/ai-profile-clients/gemini.svg +10 -0
- package/dist/ui/ai-profile-clients/grok.svg +31 -0
- package/dist/ui/ai-profile-clients/kiro.svg +11 -0
- package/dist/ui/ai-profile-clients/llama.svg +1 -0
- package/dist/ui/ai-profile-clients/mistral.svg +1 -0
- package/dist/ui/ai-profile-clients/ms_copilot.jpeg +0 -0
- package/dist/ui/ai-profile-clients/openclaw.png +0 -0
- package/dist/ui/ai-profile-clients/perplexity.svg +1 -0
- package/dist/ui/ai-profile-clients/vscode.svg +41 -0
- package/dist/ui/ai-profile-clients/windsurf.svg +11 -0
- package/dist/ui/assets/AiIdentityRosterCard-DB1BLO_j.js +1 -0
- package/dist/ui/assets/AiProfilesModule-DPxQeF9N.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DHNYaNg6.js +3 -0
- package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
- package/dist/ui/assets/AssetTraySortControl-DphbyHVc.js +1 -0
- package/dist/ui/assets/ContextAttachmentManager-CMxSzHqc.js +3 -0
- package/dist/ui/assets/DocumentWorkspace-BC7sy5TG.js +261 -0
- package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
- package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
- package/dist/ui/assets/EntityActivityTimeline-pJ2ZjZ-k.js +1 -0
- package/dist/ui/assets/PlanningModule-CeTqXMMz.css +1 -0
- package/dist/ui/assets/PlanningModule-t5GbvVR9.js +1 -0
- package/dist/ui/assets/PlansPage-BVH_NfgT.js +1 -0
- package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
- package/dist/ui/assets/TaskContextUpload-Ds4LnDzV.css +1 -0
- package/dist/ui/assets/TaskContextUpload-bl4fOOUz.js +1 -0
- package/dist/ui/assets/TaskSettings-xVsxSa0g.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-CkAxW19K.js +21 -0
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
- package/dist/ui/assets/WorkflowManagerModule-BKqIGVnF.js +1 -0
- package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
- package/dist/ui/assets/antigravity-DRKQga2U.png +0 -0
- package/dist/ui/assets/cursor-BM_3k4Y4.svg +1 -0
- package/dist/ui/assets/gemini-cli-icon-dBAVjCcn.png +0 -0
- package/dist/ui/assets/grok-BuodbWaG.svg +31 -0
- package/dist/ui/assets/index-BzJlVnNS.css +1 -0
- package/dist/ui/assets/index-Cx7vZJHL.js +7 -0
- package/dist/ui/assets/{vendor-dnd-DRzYolkg.js → vendor-dnd-CJ-AjP-Y.js} +1 -1
- package/dist/ui/assets/{vendor-icons-CLnehDTw.js → vendor-icons-B8ZNsH1g.js} +1 -1
- package/dist/ui/assets/{vendor-markdown-BUxTU7dS.js → vendor-markdown-_lhNCyq-.js} +9 -9
- package/dist/ui/assets/vendor-router-AqJMU8Lz.js +3 -0
- package/dist/ui/assets/vscode-C_7wk1WI.svg +41 -0
- package/dist/ui/branding/logos/logo_dark_bg.png +0 -0
- package/dist/ui/branding/logos/logo_favicon_dark.png +0 -0
- package/dist/ui/branding/logos/logo_favicon_dark.svg +56 -0
- package/dist/ui/branding/logos/logo_favicon_light.png +0 -0
- package/dist/ui/branding/logos/logo_light_bg.png +0 -0
- package/dist/ui/images/Taskforce_Van.webp +0 -0
- package/dist/ui/index.html +6 -6
- package/dist/update/uiUpdateService.d.ts +43 -0
- package/dist/update/uiUpdateService.js +149 -0
- package/dist/update/updateCli.d.ts +15 -0
- package/dist/update/updateCli.js +76 -0
- package/dist/update/updateExecutor.d.ts +40 -0
- package/dist/update/updateExecutor.js +474 -0
- package/dist/update/updateStatus.d.ts +83 -0
- package/dist/update/updateStatus.js +703 -0
- package/dist/utils/aiProfileAvatarPaths.d.ts +14 -0
- package/dist/utils/aiProfileAvatarPaths.js +52 -0
- package/dist/utils/aiProfileDefaultLogo.d.ts +7 -0
- package/dist/utils/aiProfileDefaultLogo.js +84 -0
- package/dist/utils/aiProfileEvents.d.ts +9 -1
- package/dist/utils/annotatedAttachments.d.ts +8 -0
- package/dist/utils/annotatedAttachments.js +17 -1
- package/dist/utils/assetTraySorting.d.ts +25 -0
- package/dist/utils/assetTraySorting.js +83 -0
- package/dist/utils/assignees.d.ts +5 -0
- package/dist/utils/assignees.js +14 -9
- package/dist/utils/authLogin.d.ts +10 -0
- package/dist/utils/authLogin.js +8 -0
- package/dist/utils/authSessionEvents.d.ts +2 -0
- package/dist/utils/authSessionEvents.js +6 -0
- package/dist/utils/avatarUpload.js +5 -5
- package/dist/utils/canonicalReferenceAttachments.d.ts +12 -0
- package/dist/utils/canonicalReferenceAttachments.js +42 -0
- package/dist/utils/cloudAssetDisplay.d.ts +2 -0
- package/dist/utils/cloudAssetDisplay.js +8 -0
- package/dist/utils/constants.d.ts +4 -11
- package/dist/utils/constants.js +5 -64
- package/dist/utils/contextAttachmentPreview.d.ts +11 -0
- package/dist/utils/contextAttachmentPreview.js +8 -0
- package/dist/utils/contextAttachmentUpload.d.ts +8 -0
- package/dist/utils/contextAttachmentUpload.js +144 -0
- package/dist/utils/documentNames.js +6 -4
- package/dist/utils/entityReferences.d.ts +14 -0
- package/dist/utils/entityReferences.js +21 -0
- package/dist/utils/httpSetCookie.d.ts +3 -0
- package/dist/utils/httpSetCookie.js +22 -0
- package/dist/utils/imageNoteStoragePaths.d.ts +3 -0
- package/dist/utils/imageNoteStoragePaths.js +19 -0
- package/dist/utils/imageReferences.d.ts +6 -0
- package/dist/utils/imageReferences.js +1 -0
- package/dist/utils/planningArchiveOrchestrator.d.ts +23 -0
- package/dist/utils/planningArchiveOrchestrator.js +37 -0
- package/dist/utils/planningArchivePresentation.d.ts +20 -0
- package/dist/utils/planningArchivePresentation.js +23 -0
- package/dist/utils/planningArchiveReadiness.d.ts +26 -0
- package/dist/utils/planningArchiveReadiness.js +30 -0
- package/dist/utils/planningFavorites.d.ts +7 -0
- package/dist/utils/planningFavorites.js +34 -0
- package/dist/utils/syncEventPresentation.js +53 -0
- package/dist/utils/syncStatusPresentation.d.ts +25 -0
- package/dist/utils/syncStatusPresentation.js +86 -5
- package/dist/utils/taskActivity.d.ts +9 -2
- package/dist/utils/taskActivity.js +61 -0
- package/dist/utils/taskDraftDefaults.d.ts +0 -8
- package/dist/utils/taskDraftDefaults.js +0 -4
- package/dist/utils/taskEvents.d.ts +11 -0
- package/dist/utils/taskEvents.js +6 -0
- package/dist/utils/taskHeaderQuickFilter.d.ts +14 -0
- package/dist/utils/taskHeaderQuickFilter.js +32 -0
- package/dist/utils/taskInvalidation.d.ts +23 -0
- package/dist/utils/taskInvalidation.js +67 -0
- package/dist/utils/taskNormalization.d.ts +2 -1
- package/dist/utils/taskNormalization.js +44 -18
- package/dist/utils/taskReferences.d.ts +16 -0
- package/dist/utils/taskReferences.js +63 -0
- package/dist/utils/taskforceAgentEvents.d.ts +8 -0
- package/dist/utils/taskforceAgentEvents.js +6 -0
- package/dist/utils/taskforceAgentSkillEvents.d.ts +7 -0
- package/dist/utils/taskforceAgentSkillEvents.js +8 -0
- package/dist/utils/theme.js +1 -1
- package/dist/utils/uiNotice.d.ts +3 -0
- package/dist/utils/uiNotice.js +1 -1
- package/dist/utils/workspaceResourceEvents.d.ts +7 -0
- package/dist/utils/workspaceResourceEvents.js +6 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +24 -0
- package/dist/utils/workspaceSyncPresentation.js +243 -6
- package/package.json +69 -21
- package/dist/components/features/AgentsModule.d.ts +0 -18
- package/dist/components/features/AgentsModule.js +0 -479
- package/dist/components/features/InitiativesModule.d.ts +0 -22
- package/dist/components/features/InitiativesModule.js +0 -33
- package/dist/components/features/WorkflowsModule.d.ts +0 -27
- package/dist/components/features/WorkflowsModule.js +0 -21
- package/dist/components/features/settings/WorkflowEditor.d.ts +0 -15
- package/dist/components/features/settings/WorkflowEditor.js +0 -245
- package/dist/components/views/panels/DocumentFilterToolbar.d.ts +0 -10
- package/dist/components/views/panels/DocumentFilterToolbar.js +0 -7
- package/dist/components/views/standalone/modals/AccountHubModal.d.ts +0 -61
- package/dist/components/views/standalone/modals/AccountHubModal.js +0 -108
- package/dist/components/views/standalone/modals/EditProfileModal.d.ts +0 -19
- package/dist/components/views/standalone/modals/EditProfileModal.js +0 -11
- package/dist/hooks/ui/useResourceExport.d.ts +0 -21
- package/dist/hooks/ui/useResourceExport.js +0 -87
- package/dist/hooks/ui/useWorkflowTemplates.d.ts +0 -37
- package/dist/hooks/ui/useWorkflowTemplates.js +0 -116
- package/dist/mcp/clientProfileDefaults.d.ts +0 -12
- package/dist/mcp/clientProfileDefaults.js +0 -37
- package/dist/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
- package/dist/resources/templates/environments/aider.yaml +0 -14
- package/dist/resources/templates/environments/antigravity.yaml +0 -10
- package/dist/resources/templates/environments/claude.yaml +0 -10
- package/dist/resources/templates/environments/cline.yaml +0 -10
- package/dist/resources/templates/environments/codex.yaml +0 -13
- package/dist/resources/templates/environments/copilot.yaml +0 -10
- package/dist/resources/templates/environments/cursor.yaml +0 -9
- package/dist/resources/templates/environments/gemini.yaml +0 -9
- package/dist/resources/templates/environments/windsurf.yaml +0 -10
- package/dist/resources/templates/workflow-sources/README.md +0 -9
- package/dist/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
- package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
- package/dist/resources/templates/workflows/collaborate.yaml +0 -110
- package/dist/resources/templates/workflows/do.yaml +0 -88
- package/dist/resources/templates/workflows/evaluate.yaml +0 -117
- package/dist/resources/templates/workflows/execute.yaml +0 -159
- package/dist/resources/templates/workflows/plan.yaml +0 -119
- package/dist/resources/templates/workflows/review.yaml +0 -115
- package/dist/services/formatTransformers.d.ts +0 -29
- package/dist/services/formatTransformers.js +0 -56
- package/dist/services/templateEngine.d.ts +0 -46
- package/dist/services/templateEngine.js +0 -148
- package/dist/shared/workflowDefaults.d.ts +0 -9
- package/dist/shared/workflowDefaults.js +0 -11
- package/dist/ui/agent-logos/Gemini CLI.jpeg +0 -0
- package/dist/ui/agent-logos/antigravity.jpeg +0 -0
- package/dist/ui/agent-logos/chatgpt.png +0 -0
- package/dist/ui/agent-logos/claude-code.jpeg +0 -0
- package/dist/ui/agent-logos/codex.jpeg +0 -0
- package/dist/ui/agent-logos/cursor.png +0 -0
- package/dist/ui/agent-logos/openclaw.jpeg +0 -0
- package/dist/ui/agent-logos/windsurf.png +0 -0
- package/dist/ui/assets/AgentsModule-DvkbUHi0.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-jhOhxqHT.js +0 -3
- package/dist/ui/assets/ContextAttachmentManager-BAmEyLHL.js +0 -3
- package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
- package/dist/ui/assets/DocumentWorkspace-X-CpD5OO.js +0 -252
- package/dist/ui/assets/EntityActivityTimeline-DD33onAC.js +0 -1
- package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
- package/dist/ui/assets/InitiativesModule-5nDXtIjf.js +0 -1
- package/dist/ui/assets/PlansPage-B8nDR1hQ.js +0 -1
- package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
- package/dist/ui/assets/TaskContextUpload-DrGrXJHm.js +0 -1
- package/dist/ui/assets/TaskSettings-BXVvZZwH.js +0 -9
- package/dist/ui/assets/WorkflowsModule-DWCGhEWT.js +0 -5
- package/dist/ui/assets/documentReferences-Crup321p.js +0 -1
- package/dist/ui/assets/index-B9k24Aym.js +0 -5
- package/dist/ui/assets/index-DNeR5dYW.css +0 -1
- package/dist/ui/assets/vendor-router-BbWMxlnO.js +0 -3
- package/dist/ui/branding/logos/logo_black_01.png +0 -0
- package/dist/ui/branding/logos/logo_black_02.png +0 -0
- package/dist/ui/branding/logos/logo_white_01.png +0 -0
- package/dist/ui/branding/logos/logo_white_02.png +0 -0
- package/scripts/generate-workflow-templates.mjs +0 -134
- package/src/resources/templates/WORKFLOW_V2_POLICY.md +0 -55
- package/src/resources/templates/environments/aider.yaml +0 -14
- package/src/resources/templates/environments/antigravity.yaml +0 -10
- package/src/resources/templates/environments/claude.yaml +0 -10
- package/src/resources/templates/environments/cline.yaml +0 -10
- package/src/resources/templates/environments/codex.yaml +0 -13
- package/src/resources/templates/environments/copilot.yaml +0 -10
- package/src/resources/templates/environments/cursor.yaml +0 -9
- package/src/resources/templates/environments/gemini.yaml +0 -9
- package/src/resources/templates/environments/windsurf.yaml +0 -10
- package/src/resources/templates/workflow-sources/README.md +0 -9
- package/src/resources/templates/workflow-sources/workflowDocs.mjs +0 -530
- package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +0 -1
- package/src/resources/templates/workflows/collaborate.yaml +0 -110
- package/src/resources/templates/workflows/do.yaml +0 -88
- package/src/resources/templates/workflows/evaluate.yaml +0 -117
- package/src/resources/templates/workflows/execute.yaml +0 -159
- package/src/resources/templates/workflows/plan.yaml +0 -119
- package/src/resources/templates/workflows/review.yaml +0 -115
- /package/dist/ui/branding/logos/{logo_dark.svg → logo_dark_no_bg.svg} +0 -0
- /package/dist/ui/branding/logos/{logo_favicon.svg → logo_favicon_light.svg} +0 -0
- /package/dist/ui/branding/logos/{logo_light.svg → logo_light_no_bg.svg} +0 -0
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* === SECTION: Auth State === Line ~426 — isAuthenticated, authBlocked, userId, beta access
|
|
14
14
|
* === SECTION: Bootstrap State === Line ~442 — bootstrapPhase, setupState, runtimeCapabilities
|
|
15
15
|
* === SECTION: Fetch Intercept === Line ~490 — window.fetch patch for cloud API routing
|
|
16
|
-
* === SECTION:
|
|
17
|
-
* === SECTION: Export State === Line ~678 — exportEnvironment, exportWorkflowsPath
|
|
16
|
+
* === SECTION: Initiative Templates === Line ~577 — fetchInitiativeTemplates
|
|
18
17
|
* === SECTION: Task State === Line ~1065 — tasks, archivedTasks, editingTaskId
|
|
19
18
|
* === SECTION: Filter & Sort State === Line ~1394 — searchQuery, filterCategories, sortBy, sortOrder
|
|
20
19
|
* === SECTION: UI State === Line ~1469 — uiStateReady, persisted UI preferences
|
|
@@ -40,20 +39,20 @@ import { getSupportedLocales, initializeLocale } from '../localization';
|
|
|
40
39
|
import { WORKSPACE_BOOTSTRAP_SCOPE, isReservedWorkspaceId, resolveWorkspaceSelectionScopeForRuntime, resolveWorkspaceUiStateScopeForRuntime } from '../utils/workspaceIdentity';
|
|
41
40
|
import { resolveRuntimeModeContract } from '../shared/runtimeContract';
|
|
42
41
|
import { DEFAULT_TYPE_VALUE } from '../shared/taxonomyDefaults.js';
|
|
43
|
-
import { cloneDefaultWorkflowDefinitions } from '../shared/workflowDefaults.js';
|
|
44
42
|
import { resolveClientDeploymentConfig } from '../config/clientDeployment';
|
|
45
43
|
import { resolveTaskforceMcpBaseUrlFromBaseUrl } from '../config/cloudEnvironment';
|
|
46
44
|
import { buildBootstrapTraceId, withBootstrapTraceHeader } from '../utils/bootstrapTrace';
|
|
45
|
+
import { buildTaskforceCredentialLoginPayload } from '../utils/authLogin';
|
|
47
46
|
import { createDefaultAssigneeOptions } from '../utils/assignees';
|
|
48
47
|
import { persistLocalMutationActorUserId, readLocalMutationActorUserId } from '../utils/taskforceApiClient';
|
|
48
|
+
import { resolveWorkspaceSyncV3CombinedWireContract, } from '../sync/v3/workspaceSyncV3CombinedWireContract.js';
|
|
49
49
|
import { useSyncOrchestrator } from './useSyncOrchestrator';
|
|
50
50
|
import { useRealtimeSync } from './useRealtimeSync';
|
|
51
51
|
import { useUiNotice } from './ui/useUiNotice';
|
|
52
|
-
import { useResourceExport } from './ui/useResourceExport';
|
|
53
52
|
import { useSettingsModel } from './ui/useSettingsModel';
|
|
54
53
|
import { useSettingsPersistence } from './ui/useSettingsPersistence';
|
|
55
54
|
import { useSettingsTaxonomyManagement } from './ui/useSettingsTaxonomyManagement';
|
|
56
|
-
import {
|
|
55
|
+
import { useInitiativeTemplates } from './ui/useInitiativeTemplates';
|
|
57
56
|
import { useZenMode } from './ui/useZenMode';
|
|
58
57
|
import { useTaskData } from './useTaskData';
|
|
59
58
|
import { useCurrentTaskRelations } from './tasks/useCurrentTaskRelations';
|
|
@@ -62,13 +61,25 @@ import { useTaskFilters } from './tasks/useTaskFilters';
|
|
|
62
61
|
import { useTaskFormActions } from './tasks/useTaskFormActions';
|
|
63
62
|
import { useTaskRelationships } from './tasks/useTaskRelationships';
|
|
64
63
|
import { useTaskActions } from './tasks/useTaskActions';
|
|
65
|
-
import { clearPersistedWorkspaceId, logBootstrapDebug,
|
|
64
|
+
import { clearPersistedWorkspaceId, logBootstrapDebug, readPersistedWorkspaceId, writePersistedWorkspaceId } from './workspace/workspaceLocalState';
|
|
66
65
|
import { useTaskforceApiRouting } from './workspace/useTaskforceApiRouting';
|
|
67
66
|
import { useTaskforceAuthBootstrap } from './auth/useTaskforceAuthBootstrap';
|
|
68
67
|
import { deriveAuthGuardPolicy } from './auth/useAuthGuardPolicy';
|
|
69
68
|
import { useTaskforceWorkspaceBootstrap } from './workspace/useTaskforceWorkspaceBootstrap';
|
|
69
|
+
import { usePersistedAppUiState } from './workspace/usePersistedAppUiState';
|
|
70
70
|
import { useDataVersionRefresh } from './sync/useDataVersionRefresh';
|
|
71
|
+
import { useDurableTaskMetadataMutation } from './sync/useDurableTaskMetadataMutation';
|
|
72
|
+
import { useDurableTaskCreateMutation } from './sync/useDurableTaskCreateMutation';
|
|
73
|
+
import { useDurableTaskStatusMutation } from './sync/useDurableTaskStatusMutation';
|
|
74
|
+
import { useDurableTaskLifecycleMutation } from './sync/useDurableTaskLifecycleMutation';
|
|
75
|
+
import { useDurableTaskDeleteMutation } from './sync/useDurableTaskDeleteMutation';
|
|
76
|
+
import { useDurableTaskRestoreMutation } from './sync/useDurableTaskRestoreMutation';
|
|
71
77
|
import { BOOTSTRAP_REQUEST_TIMEOUT_MS } from './bootstrapTimeouts';
|
|
78
|
+
import { TASKFORCE_TASKS_MUTATED_EVENT } from '../utils/taskEvents';
|
|
79
|
+
import { createTaskInvalidationScope, mergeTaskInvalidationScopes, resolveTaskInvalidationHighlightIds, resolveRealtimeTaskInvalidation, } from '../utils/taskInvalidation';
|
|
80
|
+
import { createCloudWorkstreamHttpMutationClient, fetchWorkstreamHttpMutation, isConclusiveWorkstreamHttpResponse, selectCreatedWorkstreamAfterRefresh, } from './workstreams/workstreamHttpMutation';
|
|
81
|
+
import { dispatchTaskforceWorkspaceResourcesInvalidated } from '../utils/workspaceResourceEvents';
|
|
82
|
+
import { dispatchTaskforceAuthSessionChanged } from '../utils/authSessionEvents';
|
|
72
83
|
function upsertEntityById(items, nextItem) {
|
|
73
84
|
const existingIndex = items.findIndex((item) => item.id === nextItem.id);
|
|
74
85
|
if (existingIndex === -1) {
|
|
@@ -76,6 +87,17 @@ function upsertEntityById(items, nextItem) {
|
|
|
76
87
|
}
|
|
77
88
|
return items.map((item, index) => (index === existingIndex ? nextItem : item));
|
|
78
89
|
}
|
|
90
|
+
function createInitialPlanningLoadState() {
|
|
91
|
+
return {
|
|
92
|
+
status: 'loading',
|
|
93
|
+
error: null,
|
|
94
|
+
isRefreshing: false,
|
|
95
|
+
collections: {
|
|
96
|
+
initiatives: 'loading',
|
|
97
|
+
workstreams: 'loading',
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
79
101
|
const ENV_DEPLOYMENT = resolveClientDeploymentConfig(import.meta.env);
|
|
80
102
|
const DEFAULT_CLOUD_APP_ORIGIN = (() => {
|
|
81
103
|
const configuredBase = ENV_DEPLOYMENT.baseUrl;
|
|
@@ -120,7 +142,7 @@ function createBootstrapTimeoutError(timeoutMs) {
|
|
|
120
142
|
timeoutError.name = 'BootstrapTimeoutError';
|
|
121
143
|
return timeoutError;
|
|
122
144
|
}
|
|
123
|
-
function sanitizePlanningBootstrapPayload(input) {
|
|
145
|
+
export function sanitizePlanningBootstrapPayload(input) {
|
|
124
146
|
const payload = input && typeof input === 'object' ? input : {};
|
|
125
147
|
const initiatives = Array.isArray(payload.initiatives)
|
|
126
148
|
? payload.initiatives.filter((item) => Boolean(item && typeof item === 'object' && typeof item.id === 'string'))
|
|
@@ -147,8 +169,15 @@ function sanitizePlanningBootstrapPayload(input) {
|
|
|
147
169
|
.map((task) => ({
|
|
148
170
|
id: String(task.id || '').trim(),
|
|
149
171
|
referenceNumber: typeof task.referenceNumber === 'number' ? task.referenceNumber : null,
|
|
172
|
+
localReferenceNumber: typeof task.localReferenceNumber === 'number' ? task.localReferenceNumber : null,
|
|
173
|
+
referenceLabel: typeof task.referenceLabel === 'string'
|
|
174
|
+
? task.referenceLabel.trim() || undefined
|
|
175
|
+
: undefined,
|
|
150
176
|
title: String(task.title || '').trim() || 'Untitled Task',
|
|
151
177
|
status: typeof task.status === 'string' ? task.status : null,
|
|
178
|
+
assignee: typeof task.assignee === 'string' ? task.assignee : null,
|
|
179
|
+
attachmentCount: Math.max(0, Number(task.attachmentCount) || 0),
|
|
180
|
+
isArchived: Boolean(task.isArchived),
|
|
152
181
|
})),
|
|
153
182
|
}];
|
|
154
183
|
})
|
|
@@ -159,7 +188,7 @@ function sanitizePlanningBootstrapPayload(input) {
|
|
|
159
188
|
workstreamTaskSummaries,
|
|
160
189
|
};
|
|
161
190
|
}
|
|
162
|
-
export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, onClose }) {
|
|
191
|
+
export function useTaskforce({ config = {}, initialTaskId, initialActivityEntryId, requestedWorkspaceId, onTaskCountChange, onClose }) {
|
|
163
192
|
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
164
193
|
const { categories, types, apiEndpoint, apiBaseUrl, cloudAuthBaseUrl, cloudMcpBaseUrl, wsBaseUrl, shortcut: configShortcut } = mergedConfig;
|
|
165
194
|
const runtimeHost = typeof window !== 'undefined'
|
|
@@ -178,7 +207,18 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
178
207
|
cloudAuthViaLocalProxy: false,
|
|
179
208
|
authSource: '',
|
|
180
209
|
workspaceMode: '',
|
|
181
|
-
workspaceSwitchingEnabled: null
|
|
210
|
+
workspaceSwitchingEnabled: null,
|
|
211
|
+
syncV3TaskMetadataActivation: false,
|
|
212
|
+
syncV3TaskCreateActivation: false,
|
|
213
|
+
syncV3TaskStatusActivation: false,
|
|
214
|
+
syncV3TaskDeleteActivation: false,
|
|
215
|
+
syncV3TaskCloudHttpRootActivation: false,
|
|
216
|
+
syncV3LocalOutboxDispatch: false,
|
|
217
|
+
localCoordinatorBrowserAuthorityGate: false,
|
|
218
|
+
syncV3InitiativeFeedActivation: undefined,
|
|
219
|
+
syncV3CombinedFeedRouteAvailable: undefined,
|
|
220
|
+
syncV3CombinedFeedActivation: undefined,
|
|
221
|
+
syncV3CombinedFeedCoverage: undefined
|
|
182
222
|
});
|
|
183
223
|
const [runtimeConfigReady, setRuntimeConfigReady] = useState(false);
|
|
184
224
|
const normalizeBaseUrl = useCallback((value) => {
|
|
@@ -194,7 +234,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
194
234
|
try {
|
|
195
235
|
const res = await fetch('/api/taskforce/auth/runtime-config', {
|
|
196
236
|
method: 'GET',
|
|
197
|
-
credentials: 'include'
|
|
237
|
+
credentials: 'include',
|
|
238
|
+
cache: 'no-store',
|
|
198
239
|
});
|
|
199
240
|
if (!res.ok)
|
|
200
241
|
return;
|
|
@@ -209,6 +250,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
209
250
|
? workspaceModeRaw
|
|
210
251
|
: (runtimeModeHint === 'cloud' ? 'multi-cloud' : 'single-local');
|
|
211
252
|
setRuntimeMode(runtimeModeHint);
|
|
253
|
+
const combinedFeedWire = resolveWorkspaceSyncV3CombinedWireContract(cfg.syncV3?.combinedFeed?.coverage || {});
|
|
212
254
|
setRuntimeConfigOverride({
|
|
213
255
|
cloudEnvironment: typeof cfg.cloudEnvironment === 'string'
|
|
214
256
|
? String(cfg.cloudEnvironment).trim().toLowerCase()
|
|
@@ -224,7 +266,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
224
266
|
workspaceMode,
|
|
225
267
|
workspaceSwitchingEnabled: typeof cfg.workspaceSwitchingEnabled === 'boolean'
|
|
226
268
|
? Boolean(cfg.workspaceSwitchingEnabled)
|
|
227
|
-
: (workspaceMode === 'multi-cloud')
|
|
269
|
+
: (workspaceMode === 'multi-cloud'),
|
|
270
|
+
syncV3TaskMetadataActivation: cfg.syncV3?.taskMetadataActivation === true,
|
|
271
|
+
syncV3TaskCreateActivation: cfg.syncV3?.taskCreateActivation === true,
|
|
272
|
+
syncV3TaskStatusActivation: cfg.syncV3?.taskStatusActivation === true,
|
|
273
|
+
syncV3TaskDeleteActivation: cfg.syncV3?.taskDeleteActivation === true,
|
|
274
|
+
syncV3TaskCloudHttpRootActivation: cfg.syncV3?.taskCloudHttpRootActivation === true,
|
|
275
|
+
syncV3LocalOutboxDispatch: cfg.syncV3?.localOutboxDispatch === true,
|
|
276
|
+
localCoordinatorBrowserAuthorityGate: cfg.syncV3?.localCoordinatorBrowserAuthorityGate === true,
|
|
277
|
+
syncV3InitiativeFeedActivation: typeof cfg.syncV3?.initiativeFeedActivation === 'boolean'
|
|
278
|
+
? cfg.syncV3.initiativeFeedActivation
|
|
279
|
+
: undefined,
|
|
280
|
+
syncV3CombinedFeedRouteAvailable: typeof cfg.syncV3?.combinedFeed?.routeAvailable === 'boolean'
|
|
281
|
+
? cfg.syncV3.combinedFeed.routeAvailable
|
|
282
|
+
: undefined,
|
|
283
|
+
syncV3CombinedFeedActivation: typeof cfg.syncV3?.combinedFeed?.activationReady === 'boolean'
|
|
284
|
+
? cfg.syncV3.combinedFeed.activationReady
|
|
285
|
+
: undefined,
|
|
286
|
+
syncV3CombinedFeedCoverage: combinedFeedWire?.coverage,
|
|
228
287
|
});
|
|
229
288
|
}
|
|
230
289
|
catch {
|
|
@@ -379,6 +438,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
379
438
|
const [isOpen, setIsOpen] = useState(false);
|
|
380
439
|
const [showArchive, setShowArchive] = useState(false);
|
|
381
440
|
const [taskScope, setTaskScope] = useState('open');
|
|
441
|
+
const [compressedCards, setCompressedCards] = useState(false);
|
|
382
442
|
// Settings state
|
|
383
443
|
const [currentTheme, setCurrentTheme] = useState(normalizeTaskforceTheme(mergedConfig.theme) || DEFAULT_TASKFORCE_THEME);
|
|
384
444
|
const [globalTheme, setGlobalTheme] = useState(normalizeTaskforceTheme(mergedConfig.theme) || DEFAULT_TASKFORCE_THEME);
|
|
@@ -463,7 +523,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
463
523
|
if (!nextWorkspaceId)
|
|
464
524
|
return;
|
|
465
525
|
const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim();
|
|
466
|
-
if (previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
|
|
526
|
+
if (!options?.skipTransitionReset && previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
|
|
467
527
|
workspaceTransitionEpochRef.current += 1;
|
|
468
528
|
setWorkspaceTransitionEpoch(workspaceTransitionEpochRef.current);
|
|
469
529
|
}
|
|
@@ -494,6 +554,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
494
554
|
workspaceId: String(currentWorkspaceIdRef.current || 'default').trim() || 'default',
|
|
495
555
|
epoch: workspaceTransitionEpochRef.current
|
|
496
556
|
}), []);
|
|
557
|
+
const getCurrentWorkspaceId = useCallback(() => currentWorkspaceIdRef.current, []);
|
|
497
558
|
const isWorkspaceRequestStale = useCallback((requestState) => {
|
|
498
559
|
const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
499
560
|
return liveWorkspaceId !== requestState.workspaceId || workspaceTransitionEpochRef.current !== requestState.epoch;
|
|
@@ -540,7 +601,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
540
601
|
const [buildInfo, setBuildInfo] = useState(null);
|
|
541
602
|
const [keyShortcut, setKeyShortcut] = useState(mergedConfig.shortcut || 'Alt+T');
|
|
542
603
|
const [priorities, setPriorities] = useState(mergedConfig.priorities || []);
|
|
543
|
-
const [approaches] = useState(cloneDefaultWorkflowDefinitions());
|
|
544
604
|
const [mcpHostRoot, setMcpHostRoot] = useState('');
|
|
545
605
|
const [jsonBackupEnabled, setJsonBackupEnabled] = useState(false);
|
|
546
606
|
const [globalJsonBackupEnabled, setGlobalJsonBackupEnabled] = useState(false);
|
|
@@ -558,7 +618,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
558
618
|
});
|
|
559
619
|
const [manualComplexityEnabled, setManualComplexityEnabled] = useState(false);
|
|
560
620
|
const [checklistDropdownEnabled, setChecklistDropdownEnabled] = useState(true);
|
|
561
|
-
const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(
|
|
621
|
+
const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(false);
|
|
562
622
|
const [serverHostRoot, setServerHostRoot] = useState('');
|
|
563
623
|
const [returnTab, setReturnTab] = useState(null);
|
|
564
624
|
useTaskforceApiRouting({
|
|
@@ -566,22 +626,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
566
626
|
resolveApiUrl,
|
|
567
627
|
runtimeMode
|
|
568
628
|
});
|
|
569
|
-
const {
|
|
629
|
+
const { initiativeTemplates, fetchInitiativeTemplates } = useInitiativeTemplates({
|
|
570
630
|
shouldDeferProtectedApiCalls,
|
|
571
631
|
shouldBlockProtectedApiCalls
|
|
572
632
|
});
|
|
573
633
|
const { zenMode, setZenModeState, toggleZenMode } = useZenMode();
|
|
574
|
-
const { exportEnvironment, setExportEnvironment, availableEnvironments, loadAvailableEnvironments, exportWorkflowsPath, setExportWorkflowsPath, exportingResource, exportResult, handleExportWorkflows } = useResourceExport({
|
|
575
|
-
storagePath,
|
|
576
|
-
shouldDeferProtectedApiCalls,
|
|
577
|
-
shouldBlockProtectedApiCalls
|
|
578
|
-
});
|
|
579
634
|
// Unsaved Changes Modal State
|
|
580
635
|
const [unsavedModalOpen, setUnsavedModalOpen] = useState(false);
|
|
581
636
|
const [pendingNavigation, setPendingNavigation] = useState(null);
|
|
582
637
|
// === SECTION: UI Notice ===
|
|
583
638
|
// Delegated to useUiNotice — see src/hooks/useUiNotice.ts
|
|
584
639
|
const { uiNotice, pushNotice, clearNotice } = useUiNotice();
|
|
640
|
+
const uiNoticeRef = useRef(uiNotice);
|
|
641
|
+
uiNoticeRef.current = uiNotice;
|
|
585
642
|
const [taskReturnTrail, setTaskReturnTrail] = useState([]);
|
|
586
643
|
const tasksScrollRef = useRef(null);
|
|
587
644
|
const [tasksScrollPos, setTasksScrollPos] = useState(0);
|
|
@@ -600,9 +657,21 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
600
657
|
const [initiatives, setInitiatives] = useState([]);
|
|
601
658
|
const [workstreams, setWorkstreams] = useState([]);
|
|
602
659
|
const [planningBootstrapTaskSummaries, setPlanningBootstrapTaskSummaries] = useState([]);
|
|
660
|
+
const [planningLoadState, setPlanningLoadState] = useState(createInitialPlanningLoadState);
|
|
603
661
|
const [deletedTasks, setDeletedTasks] = useState([]);
|
|
662
|
+
const [archiveHydratedWorkspaceId, setArchiveHydratedWorkspaceId] = useState(null);
|
|
663
|
+
const [deletedHydratedWorkspaceId, setDeletedHydratedWorkspaceId] = useState(null);
|
|
664
|
+
const [archiveLookupSettledKeys, setArchiveLookupSettledKeys] = useState(() => new Set());
|
|
665
|
+
const archiveHydrationRequestRef = useRef(null);
|
|
666
|
+
const deletedHydrationRequestRef = useRef(null);
|
|
604
667
|
const [loadingTasks, setLoadingTasks] = useState(false);
|
|
605
668
|
const [editingTaskId, setEditingTaskId] = useState(null);
|
|
669
|
+
const [pendingOpenTaskId, setPendingOpenTaskId] = useState(null);
|
|
670
|
+
const setPendingOpenTaskIdFromPersistedState = useCallback((taskId) => {
|
|
671
|
+
if (String(initialTaskId || '').trim())
|
|
672
|
+
return;
|
|
673
|
+
setPendingOpenTaskId(taskId);
|
|
674
|
+
}, [initialTaskId]);
|
|
606
675
|
const [showMarkdownHelp, setShowMarkdownHelp] = useState(false);
|
|
607
676
|
// copiedId is managed by useTaskMutations below.
|
|
608
677
|
// Custom categories
|
|
@@ -768,6 +837,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
768
837
|
// Form state
|
|
769
838
|
const [loading, setLoading] = useState(false);
|
|
770
839
|
const [error, setError] = useState('');
|
|
840
|
+
const clearTaskError = useCallback(() => setError(''), []);
|
|
771
841
|
const AUTH_REQUIRED_ERROR = 'Authentication required. Sign in to continue.';
|
|
772
842
|
const [referenceDataLoaded, setReferenceDataLoaded] = useState(false);
|
|
773
843
|
const [assigneeOptionsLoaded, setAssigneeOptionsLoaded] = useState(false);
|
|
@@ -788,7 +858,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
788
858
|
setTasks,
|
|
789
859
|
setArchivedTasks,
|
|
790
860
|
setLoadingTasks,
|
|
791
|
-
getCurrentWorkspaceId
|
|
861
|
+
getCurrentWorkspaceId,
|
|
792
862
|
workspaceResetKey: `${currentWorkspaceId}:${workspaceTransitionEpoch}`,
|
|
793
863
|
shouldDeferProtectedApiCalls,
|
|
794
864
|
shouldBlockProtectedApiCalls,
|
|
@@ -799,36 +869,37 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
799
869
|
if (workspaceTransitionEpoch === 0)
|
|
800
870
|
return;
|
|
801
871
|
referenceDataRequestRef.current = null;
|
|
802
|
-
lastLoadedUiStateKeyRef.current = '';
|
|
803
872
|
lastAssigneeOptionsLoadKeyRef.current = '';
|
|
804
873
|
lastConfigRefreshKeyRef.current = '';
|
|
805
874
|
lastWorkspaceSyncStateLoadKeyRef.current = '';
|
|
806
875
|
lastTaskSurfaceLoadKeyRef.current = '';
|
|
807
876
|
lastSettingsSurfaceLoadKeyRef.current = '';
|
|
808
|
-
setUiStateReady(false);
|
|
809
877
|
setReferenceDataLoaded(false);
|
|
810
878
|
setAssigneeOptions(createDefaultAssigneeOptions());
|
|
811
879
|
setAssigneeOptionsLoaded(false);
|
|
812
880
|
setDeletedTasks([]);
|
|
881
|
+
setArchiveHydratedWorkspaceId(null);
|
|
882
|
+
setDeletedHydratedWorkspaceId(null);
|
|
883
|
+
setArchiveLookupSettledKeys(new Set());
|
|
884
|
+
archiveHydrationRequestRef.current = null;
|
|
885
|
+
deletedHydrationRequestRef.current = null;
|
|
813
886
|
setTasks([]);
|
|
814
887
|
setArchivedTasks([]);
|
|
888
|
+
setInitiatives([]);
|
|
889
|
+
setWorkstreams([]);
|
|
890
|
+
setPlanningBootstrapTaskSummaries([]);
|
|
891
|
+
setPlanningLoadState(createInitialPlanningLoadState());
|
|
892
|
+
setPendingOpenTaskId(null);
|
|
815
893
|
setLoadingTasks(false);
|
|
816
|
-
if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
|
|
817
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
818
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
819
|
-
}
|
|
820
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
821
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
822
|
-
archiveBootstrapTimerRef.current = null;
|
|
823
|
-
}
|
|
824
894
|
}, [setArchivedTasks, setLoadingTasks, setTasks, workspaceTransitionEpoch]);
|
|
825
895
|
const fetchDeletedTasks = useCallback(async (isSilent = false, options) => {
|
|
826
896
|
const ignoreAuthGuard = options?.ignoreAuthGuard === true;
|
|
827
897
|
if (!ignoreAuthGuard && (shouldDeferProtectedApiCalls || shouldBlockProtectedApiCalls))
|
|
828
|
-
return;
|
|
898
|
+
return false;
|
|
829
899
|
if (!isSilent)
|
|
830
900
|
setLoadingTasks(true);
|
|
831
901
|
const requestState = getWorkspaceRequestState();
|
|
902
|
+
deletedTasksAbortRef.current?.abort('superseded');
|
|
832
903
|
const abortController = new AbortController();
|
|
833
904
|
deletedTasksAbortRef.current = abortController;
|
|
834
905
|
try {
|
|
@@ -839,16 +910,20 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
839
910
|
if (res.status === 401) {
|
|
840
911
|
handleUnauthorized();
|
|
841
912
|
setDeletedTasks([]);
|
|
842
|
-
return;
|
|
913
|
+
return false;
|
|
843
914
|
}
|
|
844
915
|
if (res.status === 404) {
|
|
845
|
-
|
|
846
|
-
|
|
916
|
+
if (!isWorkspaceRequestStale(requestState)) {
|
|
917
|
+
setDeletedTasks([]);
|
|
918
|
+
setDeletedHydratedWorkspaceId(requestState.workspaceId);
|
|
919
|
+
return true;
|
|
920
|
+
}
|
|
921
|
+
return false;
|
|
847
922
|
}
|
|
848
923
|
if (res.ok) {
|
|
849
924
|
const data = await res.json();
|
|
850
925
|
if (isWorkspaceRequestStale(requestState)) {
|
|
851
|
-
return;
|
|
926
|
+
return false;
|
|
852
927
|
}
|
|
853
928
|
const sanitized = Array.isArray(data?.deleted)
|
|
854
929
|
? data.deleted
|
|
@@ -866,12 +941,16 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
866
941
|
.filter((entry) => Boolean(entry))
|
|
867
942
|
: [];
|
|
868
943
|
setDeletedTasks(sanitized);
|
|
944
|
+
setDeletedHydratedWorkspaceId(requestState.workspaceId);
|
|
945
|
+
return true;
|
|
869
946
|
}
|
|
947
|
+
return false;
|
|
870
948
|
}
|
|
871
949
|
catch (err) {
|
|
872
950
|
if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
|
|
873
|
-
return;
|
|
951
|
+
return false;
|
|
874
952
|
console.error('[Taskforce] Failed to fetch deleted tasks:', err);
|
|
953
|
+
return false;
|
|
875
954
|
}
|
|
876
955
|
finally {
|
|
877
956
|
if (deletedTasksAbortRef.current === abortController) {
|
|
@@ -900,6 +979,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
900
979
|
}
|
|
901
980
|
const abortController = new AbortController();
|
|
902
981
|
planningEntitiesAbortRef.current = abortController;
|
|
982
|
+
setPlanningLoadState((current) => ({
|
|
983
|
+
...current,
|
|
984
|
+
isRefreshing: true,
|
|
985
|
+
}));
|
|
903
986
|
try {
|
|
904
987
|
const planningTraceId = buildBootstrapTraceId({
|
|
905
988
|
workspaceId: requestState.workspaceId,
|
|
@@ -936,19 +1019,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
936
1019
|
}
|
|
937
1020
|
};
|
|
938
1021
|
let bootstrapPayload = null;
|
|
1022
|
+
let collectionStatus = {
|
|
1023
|
+
initiatives: 'ready',
|
|
1024
|
+
workstreams: 'ready',
|
|
1025
|
+
};
|
|
939
1026
|
const bootstrapRes = await fetchPlanningRoute('/api/taskforce/planning/bootstrap');
|
|
940
1027
|
if (bootstrapRes?.status === 401) {
|
|
941
1028
|
handleUnauthorized();
|
|
942
1029
|
setInitiatives([]);
|
|
943
1030
|
setWorkstreams([]);
|
|
944
1031
|
setPlanningBootstrapTaskSummaries([]);
|
|
1032
|
+
setPlanningLoadState({
|
|
1033
|
+
status: 'error',
|
|
1034
|
+
error: 'Sign in again to load Planning.',
|
|
1035
|
+
isRefreshing: false,
|
|
1036
|
+
collections: { initiatives: 'error', workstreams: 'error' },
|
|
1037
|
+
});
|
|
945
1038
|
return;
|
|
946
1039
|
}
|
|
947
1040
|
if (bootstrapRes === null) {
|
|
948
1041
|
throw createBootstrapTimeoutError(PLANNING_BOOTSTRAP_REQUEST_TIMEOUT_MS);
|
|
949
1042
|
}
|
|
950
1043
|
if (bootstrapRes.ok) {
|
|
951
|
-
|
|
1044
|
+
const bootstrapData = await bootstrapRes.json().catch(() => null);
|
|
1045
|
+
if (!bootstrapData
|
|
1046
|
+
|| !Array.isArray(bootstrapData.initiatives)
|
|
1047
|
+
|| !Array.isArray(bootstrapData.workstreams)) {
|
|
1048
|
+
throw new Error('Planning returned an incomplete response.');
|
|
1049
|
+
}
|
|
1050
|
+
bootstrapPayload = sanitizePlanningBootstrapPayload(bootstrapData);
|
|
952
1051
|
}
|
|
953
1052
|
else {
|
|
954
1053
|
const [initiativesRes, workstreamsRes] = await Promise.all([
|
|
@@ -963,15 +1062,41 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
963
1062
|
setInitiatives([]);
|
|
964
1063
|
setWorkstreams([]);
|
|
965
1064
|
setPlanningBootstrapTaskSummaries([]);
|
|
1065
|
+
setPlanningLoadState({
|
|
1066
|
+
status: 'error',
|
|
1067
|
+
error: 'Sign in again to load Planning.',
|
|
1068
|
+
isRefreshing: false,
|
|
1069
|
+
collections: { initiatives: 'error', workstreams: 'error' },
|
|
1070
|
+
});
|
|
966
1071
|
return;
|
|
967
1072
|
}
|
|
968
|
-
const
|
|
969
|
-
|
|
970
|
-
|
|
1073
|
+
const readCollection = async (response, key) => {
|
|
1074
|
+
if (!response.ok)
|
|
1075
|
+
return { items: [], status: 'error' };
|
|
1076
|
+
const data = await response.json().catch(() => null);
|
|
1077
|
+
const items = Array.isArray(data)
|
|
1078
|
+
? data
|
|
1079
|
+
: data && typeof data === 'object' && Array.isArray(data[key])
|
|
1080
|
+
? data[key]
|
|
1081
|
+
: null;
|
|
1082
|
+
return items
|
|
1083
|
+
? { items, status: 'ready' }
|
|
1084
|
+
: { items: [], status: 'error' };
|
|
1085
|
+
};
|
|
1086
|
+
const [initiativeResult, workstreamResult] = await Promise.all([
|
|
1087
|
+
readCollection(initiativesRes, 'initiatives'),
|
|
1088
|
+
readCollection(workstreamsRes, 'workstreams'),
|
|
971
1089
|
]);
|
|
1090
|
+
collectionStatus = {
|
|
1091
|
+
initiatives: initiativeResult.status,
|
|
1092
|
+
workstreams: workstreamResult.status,
|
|
1093
|
+
};
|
|
1094
|
+
if (collectionStatus.initiatives === 'error' && collectionStatus.workstreams === 'error') {
|
|
1095
|
+
throw new Error('Planning could not be loaded.');
|
|
1096
|
+
}
|
|
972
1097
|
bootstrapPayload = sanitizePlanningBootstrapPayload({
|
|
973
|
-
initiatives:
|
|
974
|
-
workstreams:
|
|
1098
|
+
initiatives: initiativeResult.items,
|
|
1099
|
+
workstreams: workstreamResult.items,
|
|
975
1100
|
workstreamTaskSummaries: [],
|
|
976
1101
|
});
|
|
977
1102
|
}
|
|
@@ -981,6 +1106,14 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
981
1106
|
setInitiatives(bootstrapPayload.initiatives);
|
|
982
1107
|
setWorkstreams(bootstrapPayload.workstreams);
|
|
983
1108
|
setPlanningBootstrapTaskSummaries(bootstrapPayload.workstreamTaskSummaries);
|
|
1109
|
+
const isPartial = collectionStatus.initiatives === 'error' || collectionStatus.workstreams === 'error';
|
|
1110
|
+
const isEmpty = bootstrapPayload.initiatives.length === 0 && bootstrapPayload.workstreams.length === 0;
|
|
1111
|
+
setPlanningLoadState({
|
|
1112
|
+
status: isPartial ? 'partial' : isEmpty ? 'empty' : 'ready',
|
|
1113
|
+
error: isPartial ? 'Some planning data could not be loaded.' : null,
|
|
1114
|
+
isRefreshing: false,
|
|
1115
|
+
collections: collectionStatus,
|
|
1116
|
+
});
|
|
984
1117
|
}
|
|
985
1118
|
catch (err) {
|
|
986
1119
|
if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
|
|
@@ -997,6 +1130,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
997
1130
|
else {
|
|
998
1131
|
console.error('[Taskforce] Failed to fetch planning entities:', err);
|
|
999
1132
|
}
|
|
1133
|
+
if (!isWorkspaceRequestStale(requestState)) {
|
|
1134
|
+
const hasExistingPlanningData = initiatives.length > 0 || workstreams.length > 0;
|
|
1135
|
+
setPlanningLoadState((current) => ({
|
|
1136
|
+
status: hasExistingPlanningData ? 'partial' : 'error',
|
|
1137
|
+
error: err instanceof Error && err.message
|
|
1138
|
+
? err.message
|
|
1139
|
+
: 'Planning could not be loaded.',
|
|
1140
|
+
isRefreshing: false,
|
|
1141
|
+
collections: hasExistingPlanningData
|
|
1142
|
+
? current.collections
|
|
1143
|
+
: { initiatives: 'error', workstreams: 'error' },
|
|
1144
|
+
}));
|
|
1145
|
+
}
|
|
1000
1146
|
if (typeof window !== 'undefined'
|
|
1001
1147
|
&& !isWorkspaceRequestStale(requestState)
|
|
1002
1148
|
&& initiatives.length === 0
|
|
@@ -1024,31 +1170,167 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1024
1170
|
shouldBlockProtectedApiCalls,
|
|
1025
1171
|
workstreams.length,
|
|
1026
1172
|
]);
|
|
1173
|
+
const fetchPlanningEntityDetail = useCallback(async (entityType, id) => {
|
|
1174
|
+
const normalizedId = String(id || '').trim();
|
|
1175
|
+
if (!normalizedId) {
|
|
1176
|
+
throw new Error(`Cannot load ${entityType} details without an id.`);
|
|
1177
|
+
}
|
|
1178
|
+
const requestState = getWorkspaceRequestState();
|
|
1179
|
+
const res = await fetch(`/api/taskforce/${entityType}/${encodeURIComponent(normalizedId)}`);
|
|
1180
|
+
const data = await res.json().catch(() => ({}));
|
|
1181
|
+
if (!res.ok) {
|
|
1182
|
+
throw new Error(data?.error || `Failed to load ${entityType} details (${res.status})`);
|
|
1183
|
+
}
|
|
1184
|
+
const entity = data;
|
|
1185
|
+
if (!isWorkspaceRequestStale(requestState)) {
|
|
1186
|
+
if (entityType === 'initiative') {
|
|
1187
|
+
setInitiatives((current) => upsertEntityById(current, entity));
|
|
1188
|
+
}
|
|
1189
|
+
else {
|
|
1190
|
+
setWorkstreams((current) => upsertEntityById(current, entity));
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
return entity;
|
|
1194
|
+
}, [getWorkspaceRequestState, isWorkspaceRequestStale]);
|
|
1027
1195
|
const fetchTasks = useCallback(async (isSilent = false, options) => {
|
|
1028
1196
|
await fetchTasksBase(isSilent, options);
|
|
1029
1197
|
}, [fetchTasksBase]);
|
|
1030
1198
|
const fetchArchive = useCallback(async (isSilent = false, options) => {
|
|
1031
|
-
|
|
1199
|
+
const requestWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1200
|
+
const loaded = await fetchArchiveBase(isSilent, options);
|
|
1201
|
+
const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1202
|
+
if (loaded && liveWorkspaceId === requestWorkspaceId) {
|
|
1203
|
+
setArchiveHydratedWorkspaceId(requestWorkspaceId);
|
|
1204
|
+
}
|
|
1205
|
+
return loaded;
|
|
1032
1206
|
}, [fetchArchiveBase]);
|
|
1207
|
+
const ensureArchiveHydrated = useCallback((isSilent = true, options) => {
|
|
1208
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1209
|
+
if (archiveHydratedWorkspaceId === workspaceId)
|
|
1210
|
+
return Promise.resolve(true);
|
|
1211
|
+
const pending = archiveHydrationRequestRef.current;
|
|
1212
|
+
if (pending?.workspaceId === workspaceId)
|
|
1213
|
+
return pending.promise;
|
|
1214
|
+
const promise = fetchArchive(isSilent, options).finally(() => {
|
|
1215
|
+
if (archiveHydrationRequestRef.current?.promise === promise) {
|
|
1216
|
+
archiveHydrationRequestRef.current = null;
|
|
1217
|
+
}
|
|
1218
|
+
});
|
|
1219
|
+
archiveHydrationRequestRef.current = { workspaceId, promise };
|
|
1220
|
+
return promise;
|
|
1221
|
+
}, [archiveHydratedWorkspaceId, fetchArchive]);
|
|
1222
|
+
const ensureDeletedTasksHydrated = useCallback((isSilent = true, options) => {
|
|
1223
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1224
|
+
if (deletedHydratedWorkspaceId === workspaceId)
|
|
1225
|
+
return Promise.resolve(true);
|
|
1226
|
+
const pending = deletedHydrationRequestRef.current;
|
|
1227
|
+
if (pending?.workspaceId === workspaceId)
|
|
1228
|
+
return pending.promise;
|
|
1229
|
+
const promise = fetchDeletedTasks(isSilent, options).finally(() => {
|
|
1230
|
+
if (deletedHydrationRequestRef.current?.promise === promise) {
|
|
1231
|
+
deletedHydrationRequestRef.current = null;
|
|
1232
|
+
}
|
|
1233
|
+
});
|
|
1234
|
+
deletedHydrationRequestRef.current = { workspaceId, promise };
|
|
1235
|
+
return promise;
|
|
1236
|
+
}, [deletedHydratedWorkspaceId, fetchDeletedTasks]);
|
|
1237
|
+
const refreshArchiveIfHydrated = useCallback(() => {
|
|
1238
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1239
|
+
if (archiveHydratedWorkspaceId !== workspaceId)
|
|
1240
|
+
return Promise.resolve(false);
|
|
1241
|
+
return fetchArchive(true);
|
|
1242
|
+
}, [archiveHydratedWorkspaceId, fetchArchive]);
|
|
1243
|
+
const refreshDeletedTasksIfHydrated = useCallback((isSilent = true) => {
|
|
1244
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1245
|
+
if (deletedHydratedWorkspaceId !== workspaceId)
|
|
1246
|
+
return Promise.resolve(false);
|
|
1247
|
+
return fetchDeletedTasks(isSilent);
|
|
1248
|
+
}, [deletedHydratedWorkspaceId, fetchDeletedTasks]);
|
|
1033
1249
|
const refreshTaskCollections = useCallback(async (options) => {
|
|
1034
1250
|
const isSilent = options?.isSilent !== false;
|
|
1035
1251
|
const ignoreAuthGuard = options?.ignoreAuthGuard === true;
|
|
1252
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1253
|
+
const includeArchive = archiveHydratedWorkspaceId === workspaceId;
|
|
1254
|
+
const includeDeleted = deletedHydratedWorkspaceId === workspaceId;
|
|
1036
1255
|
await Promise.all([
|
|
1037
|
-
refreshTaskCollectionsBase({
|
|
1038
|
-
|
|
1256
|
+
refreshTaskCollectionsBase({
|
|
1257
|
+
isSilent,
|
|
1258
|
+
ignoreAuthGuard,
|
|
1259
|
+
includeArchive,
|
|
1260
|
+
highlightChangedTaskIds: options?.highlightChangedTaskIds,
|
|
1261
|
+
}),
|
|
1262
|
+
includeDeleted
|
|
1263
|
+
? fetchDeletedTasks(isSilent, { ignoreAuthGuard })
|
|
1264
|
+
: Promise.resolve(false),
|
|
1039
1265
|
fetchPlanningEntities({ ignoreAuthGuard }),
|
|
1040
1266
|
]);
|
|
1041
|
-
}, [
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1267
|
+
}, [
|
|
1268
|
+
archiveHydratedWorkspaceId,
|
|
1269
|
+
deletedHydratedWorkspaceId,
|
|
1270
|
+
fetchDeletedTasks,
|
|
1271
|
+
fetchPlanningEntities,
|
|
1272
|
+
refreshTaskCollectionsBase
|
|
1273
|
+
]);
|
|
1274
|
+
const taskInvalidationInFlightRef = useRef(false);
|
|
1275
|
+
const pendingTaskInvalidationRef = useRef(null);
|
|
1276
|
+
const archiveHydratedWorkspaceIdRef = useRef(archiveHydratedWorkspaceId);
|
|
1277
|
+
const deletedHydratedWorkspaceIdRef = useRef(deletedHydratedWorkspaceId);
|
|
1278
|
+
const invalidationTaskRefreshRef = useRef(refreshTaskCollectionsFromInvalidationBase);
|
|
1279
|
+
const invalidationDeletedRefreshRef = useRef(fetchDeletedTasks);
|
|
1280
|
+
const invalidationPlanningRefreshRef = useRef(fetchPlanningEntities);
|
|
1281
|
+
archiveHydratedWorkspaceIdRef.current = archiveHydratedWorkspaceId;
|
|
1282
|
+
deletedHydratedWorkspaceIdRef.current = deletedHydratedWorkspaceId;
|
|
1283
|
+
invalidationTaskRefreshRef.current = refreshTaskCollectionsFromInvalidationBase;
|
|
1284
|
+
invalidationDeletedRefreshRef.current = fetchDeletedTasks;
|
|
1285
|
+
invalidationPlanningRefreshRef.current = fetchPlanningEntities;
|
|
1286
|
+
const refreshTaskCollectionsFromInvalidation = useCallback(async (scope) => {
|
|
1287
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1288
|
+
const pending = pendingTaskInvalidationRef.current;
|
|
1289
|
+
pendingTaskInvalidationRef.current = {
|
|
1290
|
+
workspaceId,
|
|
1291
|
+
scope: pending?.workspaceId === workspaceId
|
|
1292
|
+
? mergeTaskInvalidationScopes(pending.scope, scope)
|
|
1293
|
+
: scope,
|
|
1294
|
+
};
|
|
1295
|
+
if (taskInvalidationInFlightRef.current)
|
|
1296
|
+
return;
|
|
1297
|
+
taskInvalidationInFlightRef.current = true;
|
|
1298
|
+
try {
|
|
1299
|
+
while (pendingTaskInvalidationRef.current) {
|
|
1300
|
+
const next = pendingTaskInvalidationRef.current;
|
|
1301
|
+
pendingTaskInvalidationRef.current = null;
|
|
1302
|
+
const requestWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
1303
|
+
if (next.workspaceId !== requestWorkspaceId)
|
|
1304
|
+
continue;
|
|
1305
|
+
const collections = new Set(next.scope.collections);
|
|
1306
|
+
const includeActive = collections.has('active');
|
|
1307
|
+
const includeArchive = collections.has('archive')
|
|
1308
|
+
&& archiveHydratedWorkspaceIdRef.current === requestWorkspaceId;
|
|
1309
|
+
const includeDeleted = collections.has('deleted')
|
|
1310
|
+
&& deletedHydratedWorkspaceIdRef.current === requestWorkspaceId;
|
|
1311
|
+
const highlightChangedTaskIds = resolveTaskInvalidationHighlightIds(next.scope);
|
|
1312
|
+
await Promise.all([
|
|
1313
|
+
includeActive || includeArchive
|
|
1314
|
+
? invalidationTaskRefreshRef.current({
|
|
1315
|
+
includeActive,
|
|
1316
|
+
includeArchive,
|
|
1317
|
+
highlightChangedTaskIds,
|
|
1318
|
+
})
|
|
1319
|
+
: Promise.resolve(),
|
|
1320
|
+
includeDeleted ? invalidationDeletedRefreshRef.current(true) : Promise.resolve(false),
|
|
1321
|
+
collections.has('planning') ? invalidationPlanningRefreshRef.current() : Promise.resolve(),
|
|
1322
|
+
]);
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
finally {
|
|
1326
|
+
taskInvalidationInFlightRef.current = false;
|
|
1327
|
+
}
|
|
1328
|
+
}, []);
|
|
1047
1329
|
const setUserGlobalSyncStatusRef = useRef(() => undefined);
|
|
1048
1330
|
const setUserGlobalSyncErrorRef = useRef(() => undefined);
|
|
1049
1331
|
const checkAuthSessionImplRef = useRef(async () => false);
|
|
1050
1332
|
const checkAuthSession = useCallback((options) => checkAuthSessionImplRef.current(options), []);
|
|
1051
|
-
const { userGlobalSyncStatus, setUserGlobalSyncStatus, userGlobalSyncError, setUserGlobalSyncError, workspaceLastPullAt, workspaceLastPushAt, workspaceLastErrorAt, workspaceLastErrorMessage, workspaceLastSuccessfulSyncAt, workspaceCloudSyncEnabled, workspaceSyncPhase, workspaceSyncSetupIntent, workspaceSyncStatus, workspaceSyncSummary, workspaceSyncRecommendedAction, workspaceSyncBusy, workspaceSyncPendingChanges, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, persistWorkspaceSyncPatch, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot, syncUserGlobalSettings, buildWorkspaceSyncSignature, pushWorkspaceChangesToCloud, saveWorkspaceCloudSyncSettings, retryUserGlobalSettingsSync, retryWorkspaceCloudSync, resetWorkspaceSyncCursorAndPull, getWorkspaceSyncDiagnostics } = useSyncOrchestrator({
|
|
1333
|
+
const { userGlobalSyncStatus, setUserGlobalSyncStatus, userGlobalSyncError, setUserGlobalSyncError, workspaceLastPullAt, workspaceLastPushAt, workspaceLastErrorAt, workspaceLastErrorMessage, workspaceLastSuccessfulSyncAt, workspaceCloudSyncEnabled, workspaceSyncPhase, workspaceSyncSetupIntent, workspaceSyncStatus, workspaceSyncSummary, workspaceSyncRecommendedAction, workspaceSyncBusy, workspaceSyncPendingChanges, workspaceTaskRelationships, localCoordinatorDataVersion, localCoordinatorStatus, switchLocalCoordinatorWorkspace, transferLocalCoordinatorOwnership, workspacePushInFlightRef, workspacePullInFlightRef, workspaceLastPushedSignatureRef, workspacePendingSignatureRef, workspaceLastPushedTaskIdsRef, workspaceDeletedTaskIdsRef, workspaceDeletedTaskWatermarksRef, workspacePullCursorRef, clearWorkspaceRetry, persistWorkspaceSyncPatch, loadWorkspaceSyncState, applyWorkspaceSyncStateSnapshot, syncUserGlobalSettings, buildWorkspaceSyncSignature, pushWorkspaceChangesToCloud, saveWorkspaceCloudSyncSettings, retryUserGlobalSettingsSync, retryWorkspaceCloudSync, resetWorkspaceSyncCursorAndPull, getWorkspaceSyncDiagnostics } = useSyncOrchestrator({
|
|
1052
1334
|
currentWorkspaceId,
|
|
1053
1335
|
cloudAuthConfigured,
|
|
1054
1336
|
runtimeMode,
|
|
@@ -1059,6 +1341,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1059
1341
|
resolveCloudAuthUrl,
|
|
1060
1342
|
resolveWebSocketUrl,
|
|
1061
1343
|
realtimeSyncEnabled,
|
|
1344
|
+
localOutboxDispatchEnabled: runtimeConfigOverride.syncV3LocalOutboxDispatch,
|
|
1345
|
+
localCoordinatorBrowserAuthorityGateEnabled: runtimeConfigOverride.localCoordinatorBrowserAuthorityGate,
|
|
1346
|
+
initiativeFeedActivationEnabled: runtimeConfigOverride.syncV3InitiativeFeedActivation,
|
|
1347
|
+
combinedFeedActivationEnabled: runtimeConfigOverride.syncV3CombinedFeedActivation,
|
|
1348
|
+
combinedFeedCoverage: runtimeConfigOverride.syncV3CombinedFeedCoverage,
|
|
1062
1349
|
tasks,
|
|
1063
1350
|
archivedTasks,
|
|
1064
1351
|
deletedTasks,
|
|
@@ -1093,20 +1380,50 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1093
1380
|
const [priority, setPriority] = useState(2);
|
|
1094
1381
|
const [complexity, setComplexity] = useState(3);
|
|
1095
1382
|
const [status, setStatus] = useState('task');
|
|
1096
|
-
const [approach, setApproach] = useState('default');
|
|
1097
1383
|
const [assignee, setAssignee] = useState('unassigned');
|
|
1098
1384
|
const [scheduledDate, setScheduledDate] = useState('');
|
|
1099
1385
|
const [dueDate, setDueDate] = useState('');
|
|
1100
1386
|
const [workstreamInput, setWorkstreamInput] = useState('');
|
|
1101
1387
|
const [title, setTitle] = useState('');
|
|
1102
1388
|
const [description, setDescription] = useState('');
|
|
1389
|
+
const titleDraftRef = useRef(title);
|
|
1390
|
+
const descriptionDraftRef = useRef(description);
|
|
1391
|
+
const textDraftOccupiedRef = useRef(false);
|
|
1392
|
+
const [textDraftOccupied, setTextDraftOccupied] = useState(false);
|
|
1393
|
+
const refreshTextDraftOccupied = useCallback(() => {
|
|
1394
|
+
const occupied = titleDraftRef.current.trim() !== '' || descriptionDraftRef.current.trim() !== '';
|
|
1395
|
+
if (occupied === textDraftOccupiedRef.current)
|
|
1396
|
+
return;
|
|
1397
|
+
textDraftOccupiedRef.current = occupied;
|
|
1398
|
+
setTextDraftOccupied(occupied);
|
|
1399
|
+
}, []);
|
|
1400
|
+
const setTitleDraft = useCallback((value) => {
|
|
1401
|
+
titleDraftRef.current = value;
|
|
1402
|
+
refreshTextDraftOccupied();
|
|
1403
|
+
}, [refreshTextDraftOccupied]);
|
|
1404
|
+
const setDescriptionDraft = useCallback((value) => {
|
|
1405
|
+
descriptionDraftRef.current = value;
|
|
1406
|
+
refreshTextDraftOccupied();
|
|
1407
|
+
}, [refreshTextDraftOccupied]);
|
|
1408
|
+
const getTitleDraft = useCallback(() => titleDraftRef.current, []);
|
|
1409
|
+
const getDescriptionDraft = useCallback(() => descriptionDraftRef.current, []);
|
|
1410
|
+
useEffect(() => {
|
|
1411
|
+
titleDraftRef.current = title;
|
|
1412
|
+
refreshTextDraftOccupied();
|
|
1413
|
+
}, [refreshTextDraftOccupied, title]);
|
|
1414
|
+
useEffect(() => {
|
|
1415
|
+
descriptionDraftRef.current = description;
|
|
1416
|
+
refreshTextDraftOccupied();
|
|
1417
|
+
}, [description, refreshTextDraftOccupied]);
|
|
1103
1418
|
const [checklistItems, setChecklistItems] = useState([]);
|
|
1104
1419
|
const [comments, setComments] = useState([]);
|
|
1105
1420
|
const [newCommentText, setNewCommentText] = useState('');
|
|
1106
1421
|
const [formTaxonomies, setFormTaxonomies] = useState({});
|
|
1107
1422
|
const commentsEndRef = useRef(null);
|
|
1108
|
-
const [showChecklist, setShowChecklist] = useState(false);
|
|
1109
1423
|
const [lastUsedCategory, setLastUsedCategory] = useState('');
|
|
1424
|
+
const [taskforceAgentId, setTaskforceAgentId] = useState('');
|
|
1425
|
+
const [taskforceAgentConversationId, setTaskforceAgentConversationId] = useState('');
|
|
1426
|
+
const [taskforceAgentConversationByAgentId, setTaskforceAgentConversationByAgentId] = useState({});
|
|
1110
1427
|
useEffect(() => {
|
|
1111
1428
|
if (editingTaskId)
|
|
1112
1429
|
return;
|
|
@@ -1175,37 +1492,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1175
1492
|
});
|
|
1176
1493
|
checkAuthSessionImplRef.current = checkAuthSessionImpl;
|
|
1177
1494
|
const [activeWorkspaceModule, setActiveWorkspaceModuleState] = useState('tasks');
|
|
1178
|
-
const [showComments, setShowComments] = useState(false);
|
|
1179
1495
|
const [descriptionFocused, setDescriptionFocused] = useState(false);
|
|
1180
1496
|
const [isCapturingScreenshot, setIsCapturingScreenshot] = useState(false);
|
|
1181
1497
|
const [attachments, setAttachments] = useState([]);
|
|
1182
1498
|
const [attachmentsDirty, setAttachmentsDirty] = useState(false);
|
|
1183
1499
|
const dataVersionRef = useRef(null);
|
|
1184
|
-
const
|
|
1185
|
-
const archiveBootstrapTimerRef = useRef(null);
|
|
1500
|
+
const ambiguousRealtimeConfirmationTimerRef = useRef(null);
|
|
1186
1501
|
const skippedInitialTaskTabRefreshRef = useRef(false);
|
|
1187
1502
|
const authSessionResolvedRef = useRef(authSessionResolved);
|
|
1188
1503
|
const authRequiredForApiRef = useRef(authRequiredForApi);
|
|
1189
1504
|
const isAuthenticatedRef = useRef(isAuthenticated);
|
|
1190
|
-
const hasLoadedUiStateRef = useRef(false);
|
|
1191
|
-
const lastLoadedUiStateKeyRef = useRef('');
|
|
1192
1505
|
const lastAssigneeOptionsLoadKeyRef = useRef('');
|
|
1193
1506
|
const lastConfigRefreshKeyRef = useRef('');
|
|
1194
1507
|
const lastWorkspaceSyncStateLoadKeyRef = useRef('');
|
|
1195
1508
|
const lastTaskSurfaceLoadKeyRef = useRef('');
|
|
1196
1509
|
const lastSettingsSurfaceLoadKeyRef = useRef('');
|
|
1197
|
-
const skipNextUiStatePersistRef = useRef(false);
|
|
1198
|
-
const activeWorkspaceModuleOverridePendingRef = useRef(false);
|
|
1199
1510
|
const referenceDataRequestRef = useRef(null);
|
|
1200
1511
|
const workspaceListHydratedRef = useRef(false);
|
|
1201
1512
|
const hasBootstrappedDataRef = useRef(false);
|
|
1202
|
-
const [uiStateReady, setUiStateReady] = useState(false);
|
|
1203
|
-
const setActiveWorkspaceModule = useCallback((nextModule) => {
|
|
1204
|
-
if (!uiStateReady) {
|
|
1205
|
-
activeWorkspaceModuleOverridePendingRef.current = true;
|
|
1206
|
-
}
|
|
1207
|
-
setActiveWorkspaceModuleState(nextModule);
|
|
1208
|
-
}, [uiStateReady]);
|
|
1209
1513
|
const { handleSaveSettings, handleSaveTheme, handleSaveGlobalTheme, handleJsonBackupEnabledChange, handleSaveGlobalJsonBackupEnabled, handleSaveGlobalWeekStartsOn, handleSaveLocale, handleManualComplexityEnabledChange, handleChecklistDropdownEnabledChange, handleShowTaskCardStatusLabelChange, handleResetProjectToGlobal } = useSettingsPersistence({
|
|
1210
1514
|
keyShortcut,
|
|
1211
1515
|
themeUseGlobalDefault,
|
|
@@ -1223,8 +1527,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1223
1527
|
setLocale,
|
|
1224
1528
|
setManualComplexityEnabled,
|
|
1225
1529
|
setChecklistDropdownEnabled,
|
|
1226
|
-
setShowTaskCardStatusLabel
|
|
1227
|
-
setShowChecklist
|
|
1530
|
+
setShowTaskCardStatusLabel
|
|
1228
1531
|
});
|
|
1229
1532
|
useEffect(() => {
|
|
1230
1533
|
if (runtimeMode !== 'cloud')
|
|
@@ -1238,180 +1541,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1238
1541
|
authRequiredForApiRef.current = authRequiredForApi;
|
|
1239
1542
|
isAuthenticatedRef.current = isAuthenticated;
|
|
1240
1543
|
}, [authSessionResolved, authRequiredForApi, isAuthenticated]);
|
|
1241
|
-
const
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
if (!options?.skipActiveWorkspaceModule) {
|
|
1252
|
-
if (typeof state.activeWorkspaceModule === 'string') {
|
|
1253
|
-
setActiveWorkspaceModuleState(state.activeWorkspaceModule);
|
|
1254
|
-
}
|
|
1255
|
-
else if (state.groupBy === 'docs') {
|
|
1256
|
-
setActiveWorkspaceModuleState('docs');
|
|
1257
|
-
}
|
|
1258
|
-
}
|
|
1259
|
-
if (state.groupBy && state.groupBy !== 'docs')
|
|
1260
|
-
setGroupBy(state.groupBy);
|
|
1261
|
-
if (state.emptyColumnMode === 'show' || state.emptyColumnMode === 'collapse' || state.emptyColumnMode === 'hide')
|
|
1262
|
-
setEmptyColumnMode(state.emptyColumnMode);
|
|
1263
|
-
if (typeof state.zenMode === 'boolean')
|
|
1264
|
-
setZenModeState(state.zenMode);
|
|
1265
|
-
if (typeof state.searchQuery === 'string')
|
|
1266
|
-
setSearchQuery(state.searchQuery);
|
|
1267
|
-
if (Array.isArray(state.filterCategories))
|
|
1268
|
-
setFilterCategories(state.filterCategories);
|
|
1269
|
-
if (Array.isArray(state.filterPriorities))
|
|
1270
|
-
setFilterPriorities(state.filterPriorities);
|
|
1271
|
-
if (Array.isArray(state.filterTypes))
|
|
1272
|
-
setFilterTypes(state.filterTypes);
|
|
1273
|
-
if (Array.isArray(state.filterStatus))
|
|
1274
|
-
setFilterStatus(state.filterStatus);
|
|
1275
|
-
if (Array.isArray(state.filterAssignees))
|
|
1276
|
-
setFilterAssignees(state.filterAssignees);
|
|
1277
|
-
if (typeof state.filterAssigneesAllSelected === 'boolean')
|
|
1278
|
-
setFilterAssigneesAllSelected(state.filterAssigneesAllSelected);
|
|
1279
|
-
if (state.filterTaxonomies && typeof state.filterTaxonomies === 'object')
|
|
1280
|
-
setFilterTaxonomies(state.filterTaxonomies);
|
|
1281
|
-
if (state.sortBy === 'created' || state.sortBy === 'priority' || state.sortBy === 'updated' || state.sortBy === 'complexity')
|
|
1282
|
-
setSortBy(state.sortBy);
|
|
1283
|
-
if (state.sortOrder === 'asc' || state.sortOrder === 'desc')
|
|
1284
|
-
setSortOrder(state.sortOrder);
|
|
1285
|
-
if (typeof state.hasInitedFilters === 'boolean') {
|
|
1286
|
-
setHasInitedFilters(state.hasInitedFilters);
|
|
1287
|
-
}
|
|
1288
|
-
else if (hasPersistedFilterState) {
|
|
1289
|
-
setHasInitedFilters(true);
|
|
1290
|
-
}
|
|
1291
|
-
if (typeof state.showChecklist === 'boolean')
|
|
1292
|
-
setShowChecklist(state.showChecklist);
|
|
1293
|
-
if (typeof state.lastCategory === 'string')
|
|
1294
|
-
setLastUsedCategory(state.lastCategory);
|
|
1295
|
-
if (typeof state.exportEnvironment === 'string' && state.exportEnvironment.trim().length > 0) {
|
|
1296
|
-
setExportEnvironment(state.exportEnvironment.trim());
|
|
1297
|
-
}
|
|
1298
|
-
}, []);
|
|
1299
|
-
const loadPersistedUiState = useCallback(async (workspaceIdOverride) => {
|
|
1300
|
-
const targetWorkspaceId = String(workspaceIdOverride || currentWorkspaceIdRef.current || currentWorkspaceId || 'default').trim() || 'default';
|
|
1301
|
-
const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${targetWorkspaceId}`;
|
|
1302
|
-
try {
|
|
1303
|
-
const res = await fetch(`/api/taskforce/ui-state?key=app&workspaceId=${encodeURIComponent(targetWorkspaceId)}`, {
|
|
1304
|
-
method: 'GET',
|
|
1305
|
-
credentials: 'include'
|
|
1306
|
-
});
|
|
1307
|
-
const data = res.ok ? await res.json().catch(() => ({})) : {};
|
|
1308
|
-
const serverState = (data?.state && typeof data.state === 'object')
|
|
1309
|
-
? data.state
|
|
1310
|
-
: null;
|
|
1311
|
-
const localState = readPersistedAppUiState(workspaceUiStateScope);
|
|
1312
|
-
const state = serverState || localState
|
|
1313
|
-
? {
|
|
1314
|
-
...(localState || {}),
|
|
1315
|
-
...(serverState || {})
|
|
1316
|
-
}
|
|
1317
|
-
: null;
|
|
1318
|
-
if (currentWorkspaceIdRef.current !== targetWorkspaceId) {
|
|
1319
|
-
return;
|
|
1320
|
-
}
|
|
1321
|
-
applyPersistedUiState(state, {
|
|
1322
|
-
skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
|
|
1323
|
-
});
|
|
1324
|
-
lastLoadedUiStateKeyRef.current = uiStateLoadKey;
|
|
1325
|
-
}
|
|
1326
|
-
catch {
|
|
1327
|
-
const localState = readPersistedAppUiState(workspaceUiStateScope);
|
|
1328
|
-
if (currentWorkspaceIdRef.current === targetWorkspaceId) {
|
|
1329
|
-
applyPersistedUiState(localState, {
|
|
1330
|
-
skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
|
|
1331
|
-
});
|
|
1332
|
-
lastLoadedUiStateKeyRef.current = uiStateLoadKey;
|
|
1333
|
-
}
|
|
1334
|
-
}
|
|
1335
|
-
finally {
|
|
1336
|
-
if (currentWorkspaceIdRef.current !== targetWorkspaceId)
|
|
1337
|
-
return;
|
|
1338
|
-
activeWorkspaceModuleOverridePendingRef.current = false;
|
|
1339
|
-
skipNextUiStatePersistRef.current = true;
|
|
1340
|
-
setUiStateReady(true);
|
|
1341
|
-
}
|
|
1342
|
-
}, [applyPersistedUiState, currentWorkspaceId, runtimeMode, workspaceUiStateScope]);
|
|
1343
|
-
useEffect(() => {
|
|
1344
|
-
const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${currentWorkspaceId}`;
|
|
1345
|
-
if (!hasLoadedUiStateRef.current)
|
|
1346
|
-
return;
|
|
1347
|
-
if (lastLoadedUiStateKeyRef.current === uiStateLoadKey)
|
|
1348
|
-
return;
|
|
1349
|
-
setUiStateReady(false);
|
|
1350
|
-
void loadPersistedUiState(currentWorkspaceId);
|
|
1351
|
-
}, [currentWorkspaceId, loadPersistedUiState, runtimeMode, workspaceUiStateScope]);
|
|
1352
|
-
useEffect(() => {
|
|
1353
|
-
if (!uiStateReady)
|
|
1354
|
-
return;
|
|
1355
|
-
if (skipNextUiStatePersistRef.current) {
|
|
1356
|
-
skipNextUiStatePersistRef.current = false;
|
|
1357
|
-
return;
|
|
1358
|
-
}
|
|
1359
|
-
const uiStateSnapshot = {
|
|
1360
|
-
groupBy,
|
|
1361
|
-
activeWorkspaceModule,
|
|
1362
|
-
emptyColumnMode,
|
|
1363
|
-
zenMode,
|
|
1364
|
-
searchQuery,
|
|
1365
|
-
filterCategories,
|
|
1366
|
-
filterPriorities,
|
|
1367
|
-
filterTypes,
|
|
1368
|
-
filterStatus,
|
|
1369
|
-
filterAssignees,
|
|
1370
|
-
filterAssigneesAllSelected,
|
|
1371
|
-
filterTaxonomies,
|
|
1372
|
-
sortBy,
|
|
1373
|
-
sortOrder,
|
|
1374
|
-
hasInitedFilters,
|
|
1375
|
-
showChecklist,
|
|
1376
|
-
lastCategory: lastUsedCategory || '',
|
|
1377
|
-
exportEnvironment
|
|
1378
|
-
};
|
|
1379
|
-
writePersistedAppUiState(uiStateSnapshot, workspaceUiStateScope);
|
|
1380
|
-
const timeoutId = window.setTimeout(async () => {
|
|
1381
|
-
try {
|
|
1382
|
-
await persistRemoteUiState({
|
|
1383
|
-
stateKey: 'app',
|
|
1384
|
-
workspaceId: currentWorkspaceIdRef.current,
|
|
1385
|
-
patch: uiStateSnapshot
|
|
1386
|
-
});
|
|
1387
|
-
}
|
|
1388
|
-
catch {
|
|
1389
|
-
// ignore persistence errors
|
|
1390
|
-
}
|
|
1391
|
-
}, 250);
|
|
1392
|
-
return () => window.clearTimeout(timeoutId);
|
|
1393
|
-
}, [
|
|
1394
|
-
uiStateReady,
|
|
1395
|
-
groupBy,
|
|
1544
|
+
const { hasLoadedUiStateRef, loadPersistedUiState, resetPersistedUiStateLoad, setActiveWorkspaceModule, uiStateReady } = usePersistedAppUiState({
|
|
1545
|
+
runtimeMode,
|
|
1546
|
+
workspaceUiStateScope,
|
|
1547
|
+
currentWorkspaceId,
|
|
1548
|
+
currentWorkspaceIdRef,
|
|
1549
|
+
referenceDataLoaded,
|
|
1550
|
+
activeCategories,
|
|
1551
|
+
activeTypes,
|
|
1552
|
+
priorities,
|
|
1553
|
+
taxonomies,
|
|
1396
1554
|
activeWorkspaceModule,
|
|
1555
|
+
setActiveWorkspaceModuleState,
|
|
1556
|
+
groupBy,
|
|
1557
|
+
setGroupBy,
|
|
1397
1558
|
emptyColumnMode,
|
|
1559
|
+
setEmptyColumnMode,
|
|
1560
|
+
taskScope,
|
|
1561
|
+
setTaskScope,
|
|
1562
|
+
openTaskId: editingTaskId,
|
|
1563
|
+
setPendingOpenTaskId: setPendingOpenTaskIdFromPersistedState,
|
|
1564
|
+
compressedCards,
|
|
1565
|
+
setCompressedCards,
|
|
1398
1566
|
zenMode,
|
|
1567
|
+
setZenModeState,
|
|
1399
1568
|
searchQuery,
|
|
1569
|
+
setSearchQuery,
|
|
1570
|
+
collapsedCategories,
|
|
1571
|
+
setCollapsedCategories,
|
|
1400
1572
|
filterCategories,
|
|
1573
|
+
setFilterCategories,
|
|
1401
1574
|
filterPriorities,
|
|
1575
|
+
setFilterPriorities,
|
|
1402
1576
|
filterTypes,
|
|
1577
|
+
setFilterTypes,
|
|
1403
1578
|
filterStatus,
|
|
1579
|
+
setFilterStatus,
|
|
1404
1580
|
filterAssignees,
|
|
1581
|
+
setFilterAssignees,
|
|
1405
1582
|
filterAssigneesAllSelected,
|
|
1583
|
+
setFilterAssigneesAllSelected,
|
|
1406
1584
|
filterTaxonomies,
|
|
1585
|
+
setFilterTaxonomies,
|
|
1407
1586
|
sortBy,
|
|
1587
|
+
setSortBy,
|
|
1408
1588
|
sortOrder,
|
|
1589
|
+
setSortOrder,
|
|
1409
1590
|
hasInitedFilters,
|
|
1410
|
-
|
|
1591
|
+
setHasInitedFilters,
|
|
1411
1592
|
lastUsedCategory,
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1593
|
+
setLastUsedCategory,
|
|
1594
|
+
taskforceAgentId,
|
|
1595
|
+
setTaskforceAgentId,
|
|
1596
|
+
taskforceAgentConversationId,
|
|
1597
|
+
setTaskforceAgentConversationId,
|
|
1598
|
+
taskforceAgentConversationByAgentId,
|
|
1599
|
+
setTaskforceAgentConversationByAgentId
|
|
1600
|
+
});
|
|
1415
1601
|
const applyBootstrapConfig = useCallback((data) => {
|
|
1416
1602
|
const nextRuntimeMode = data.runtimeMode === 'cloud' ? 'cloud' : 'local';
|
|
1417
1603
|
const nextAuthRequiredForApi = Boolean(data.authRequiredForApi);
|
|
@@ -1434,7 +1620,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1434
1620
|
if (typeof data.workspaceId === 'string' && data.workspaceId.trim().length > 0) {
|
|
1435
1621
|
const nextWorkspaceId = data.workspaceId.trim();
|
|
1436
1622
|
if (nextRuntimeMode === 'local') {
|
|
1437
|
-
|
|
1623
|
+
const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim() || 'default';
|
|
1624
|
+
commitCurrentWorkspaceId(nextWorkspaceId, {
|
|
1625
|
+
skipTransitionReset: !configLoaded && previousWorkspaceId === 'default'
|
|
1626
|
+
});
|
|
1438
1627
|
}
|
|
1439
1628
|
else {
|
|
1440
1629
|
applyResolvedWorkspaceId(nextWorkspaceId);
|
|
@@ -1537,9 +1726,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1537
1726
|
setShowTaskCardStatusLabel(data.showTaskCardStatusLabel);
|
|
1538
1727
|
}
|
|
1539
1728
|
else {
|
|
1540
|
-
setShowTaskCardStatusLabel(
|
|
1729
|
+
setShowTaskCardStatusLabel(false);
|
|
1541
1730
|
}
|
|
1542
|
-
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId]);
|
|
1731
|
+
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId, configLoaded, currentWorkspaceIdRef]);
|
|
1543
1732
|
const fetchBuildInfo = useCallback(async () => {
|
|
1544
1733
|
const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
1545
1734
|
try {
|
|
@@ -1582,9 +1771,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1582
1771
|
fetchBuildInfo,
|
|
1583
1772
|
markBootstrapPhase,
|
|
1584
1773
|
markBootstrapStalled,
|
|
1585
|
-
fetchWorkflows,
|
|
1586
1774
|
fetchInitiativeTemplates,
|
|
1587
|
-
loadAvailableEnvironments,
|
|
1588
1775
|
setReferenceDataLoaded,
|
|
1589
1776
|
setCustomCategories,
|
|
1590
1777
|
setCustomTypes,
|
|
@@ -1635,11 +1822,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1635
1822
|
settingsSection,
|
|
1636
1823
|
workspaceBootstrapPending,
|
|
1637
1824
|
fetchTasks,
|
|
1638
|
-
fetchArchive,
|
|
1639
1825
|
fetchPlanningEntities,
|
|
1640
1826
|
refreshTaskCollections,
|
|
1641
1827
|
loadWorkspaceSyncState,
|
|
1642
|
-
|
|
1828
|
+
switchLocalCoordinatorWorkspace,
|
|
1643
1829
|
hasBootstrappedDataRef
|
|
1644
1830
|
});
|
|
1645
1831
|
const refreshSetupContext = useCallback(async () => {
|
|
@@ -1695,8 +1881,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1695
1881
|
const result = await runCloudBootstrap({
|
|
1696
1882
|
reason: 'post-plans',
|
|
1697
1883
|
ignoreAuthGuard: true,
|
|
1698
|
-
tasksSilent: true
|
|
1699
|
-
includeDeferredArchive: false
|
|
1884
|
+
tasksSilent: true
|
|
1700
1885
|
});
|
|
1701
1886
|
if (!result.authenticated) {
|
|
1702
1887
|
return { success: false, destination: 'login', error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1743,8 +1928,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1743
1928
|
const result = await runCloudBootstrap({
|
|
1744
1929
|
reason,
|
|
1745
1930
|
ignoreAuthGuard: true,
|
|
1746
|
-
tasksSilent: true
|
|
1747
|
-
includeDeferredArchive: false
|
|
1931
|
+
tasksSilent: true
|
|
1748
1932
|
});
|
|
1749
1933
|
if (!result.authenticated) {
|
|
1750
1934
|
return { success: false, error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1925,7 +2109,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1925
2109
|
method: 'POST',
|
|
1926
2110
|
headers: { 'Content-Type': 'application/json' },
|
|
1927
2111
|
credentials: 'include',
|
|
1928
|
-
body: JSON.stringify({
|
|
2112
|
+
body: JSON.stringify(buildTaskforceCredentialLoginPayload({
|
|
2113
|
+
email: trimmedEmail,
|
|
2114
|
+
password: rawPassword,
|
|
2115
|
+
activeWorkspaceId: currentWorkspaceIdRef.current,
|
|
2116
|
+
}))
|
|
1929
2117
|
});
|
|
1930
2118
|
const data = await res.json().catch(() => ({}));
|
|
1931
2119
|
if (!res.ok || !data?.success) {
|
|
@@ -1936,24 +2124,34 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1936
2124
|
if (!entry.success) {
|
|
1937
2125
|
return { success: false, error: entry.error || 'Unable to resolve workspace after sign in.', code: entry.code };
|
|
1938
2126
|
}
|
|
2127
|
+
dispatchTaskforceAuthSessionChanged();
|
|
1939
2128
|
return { success: true, workspaceSetupRequired: entry.workspaceSetupRequired === true };
|
|
1940
2129
|
}
|
|
1941
2130
|
catch {
|
|
1942
2131
|
return { success: false, error: 'Sign in failed.' };
|
|
1943
2132
|
}
|
|
1944
|
-
}, [resolveCloudAuthUrl, cloudAuthConfigured, resolvePostAuthCloudEntry]);
|
|
2133
|
+
}, [resolveCloudAuthUrl, cloudAuthConfigured, currentWorkspaceIdRef, resolvePostAuthCloudEntry]);
|
|
1945
2134
|
/**
|
|
1946
2135
|
* Initiates an OAuth login (or invite-claim) flow by redirecting the browser
|
|
1947
2136
|
* to the provider's authorisation URL via the server-side start route.
|
|
1948
2137
|
*
|
|
1949
2138
|
* @param provider - 'google' | 'github' | 'apple'
|
|
1950
2139
|
* @param returnTo - Optional relative path to redirect back to after auth (defaults to '/').
|
|
1951
|
-
|
|
2140
|
+
* @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
|
|
1952
2141
|
*/
|
|
1953
2142
|
const beginOAuthLogin = useCallback((provider, returnTo, inviteToken) => {
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
2143
|
+
let sanitizedReturnTo = '/';
|
|
2144
|
+
try {
|
|
2145
|
+
const parsedReturnTo = new URL(String(returnTo || '/'), 'https://taskforce.local');
|
|
2146
|
+
if (parsedReturnTo.origin === 'https://taskforce.local'
|
|
2147
|
+
&& String(returnTo || '/').startsWith('/')
|
|
2148
|
+
&& !String(returnTo || '/').startsWith('//')) {
|
|
2149
|
+
sanitizedReturnTo = `${parsedReturnTo.pathname}${parsedReturnTo.search}${parsedReturnTo.hash}`;
|
|
2150
|
+
}
|
|
2151
|
+
}
|
|
2152
|
+
catch {
|
|
2153
|
+
sanitizedReturnTo = '/';
|
|
2154
|
+
}
|
|
1957
2155
|
let path = `/api/taskforce/auth/oauth/${encodeURIComponent(provider)}/start?return_to=${encodeURIComponent(sanitizedReturnTo)}`;
|
|
1958
2156
|
if (inviteToken) {
|
|
1959
2157
|
path += `&invite_token=${encodeURIComponent(inviteToken)}`;
|
|
@@ -2353,7 +2551,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2353
2551
|
if (!cloudAuthConfigured)
|
|
2354
2552
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2355
2553
|
try {
|
|
2356
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2554
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods'), {
|
|
2357
2555
|
credentials: 'include'
|
|
2358
2556
|
});
|
|
2359
2557
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2370,7 +2568,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2370
2568
|
if (!cloudAuthConfigured)
|
|
2371
2569
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2372
2570
|
try {
|
|
2373
|
-
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/
|
|
2571
|
+
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/auth/login-methods/${encodeURIComponent(provider)}`), {
|
|
2374
2572
|
method: 'DELETE',
|
|
2375
2573
|
credentials: 'include'
|
|
2376
2574
|
});
|
|
@@ -2388,7 +2586,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2388
2586
|
if (!cloudAuthConfigured)
|
|
2389
2587
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2390
2588
|
try {
|
|
2391
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2589
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods/password'), {
|
|
2392
2590
|
method: 'POST',
|
|
2393
2591
|
headers: { 'Content-Type': 'application/json' },
|
|
2394
2592
|
credentials: 'include',
|
|
@@ -2404,6 +2602,28 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2404
2602
|
return { success: false, error: 'Failed to add password.' };
|
|
2405
2603
|
}
|
|
2406
2604
|
}, [resolveCloudAuthUrl, cloudAuthConfigured]);
|
|
2605
|
+
const changePassword = useCallback(async (currentPassword, newPassword) => {
|
|
2606
|
+
if (!cloudAuthConfigured)
|
|
2607
|
+
return { success: false, error: 'Cloud auth not configured.' };
|
|
2608
|
+
try {
|
|
2609
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/password/change'), {
|
|
2610
|
+
method: 'POST',
|
|
2611
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2612
|
+
credentials: 'include',
|
|
2613
|
+
body: JSON.stringify({ currentPassword, newPassword })
|
|
2614
|
+
});
|
|
2615
|
+
const data = await res.json().catch(() => ({}));
|
|
2616
|
+
if (!res.ok || !data?.success) {
|
|
2617
|
+
return { success: false, error: data?.error || 'Failed to change password.', code: data?.code };
|
|
2618
|
+
}
|
|
2619
|
+
await checkAuthSession({ force: true });
|
|
2620
|
+
dispatchTaskforceAuthSessionChanged();
|
|
2621
|
+
return { success: true };
|
|
2622
|
+
}
|
|
2623
|
+
catch {
|
|
2624
|
+
return { success: false, error: 'Failed to change password.' };
|
|
2625
|
+
}
|
|
2626
|
+
}, [resolveCloudAuthUrl, cloudAuthConfigured, checkAuthSession]);
|
|
2407
2627
|
const beginOAuthLink = useCallback((provider, returnTo) => {
|
|
2408
2628
|
const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
|
|
2409
2629
|
? returnTo
|
|
@@ -2414,13 +2634,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2414
2634
|
const resetCloudLogoutClientState = useCallback(() => {
|
|
2415
2635
|
abortWorkspaceScopedRequests();
|
|
2416
2636
|
referenceDataRequestRef.current = null;
|
|
2417
|
-
lastLoadedUiStateKeyRef.current = '';
|
|
2418
2637
|
lastAssigneeOptionsLoadKeyRef.current = '';
|
|
2419
2638
|
lastConfigRefreshKeyRef.current = '';
|
|
2420
2639
|
lastWorkspaceSyncStateLoadKeyRef.current = '';
|
|
2421
2640
|
lastTaskSurfaceLoadKeyRef.current = '';
|
|
2422
2641
|
lastSettingsSurfaceLoadKeyRef.current = '';
|
|
2423
|
-
|
|
2642
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2424
2643
|
setReferenceDataLoaded(false);
|
|
2425
2644
|
setAssigneeOptions(createDefaultAssigneeOptions());
|
|
2426
2645
|
setAssigneeOptionsLoaded(false);
|
|
@@ -2430,16 +2649,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2430
2649
|
setInitiatives([]);
|
|
2431
2650
|
setWorkstreams([]);
|
|
2432
2651
|
setPlanningBootstrapTaskSummaries([]);
|
|
2652
|
+
setPlanningLoadState(createInitialPlanningLoadState());
|
|
2433
2653
|
setLoadingTasks(false);
|
|
2434
|
-
|
|
2435
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
2436
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
2437
|
-
}
|
|
2438
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2439
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
2440
|
-
archiveBootstrapTimerRef.current = null;
|
|
2441
|
-
}
|
|
2442
|
-
}, [abortWorkspaceScopedRequests, setArchivedTasks, setTasks]);
|
|
2654
|
+
}, [abortWorkspaceScopedRequests, resetPersistedUiStateLoad, setArchivedTasks, setTasks]);
|
|
2443
2655
|
const logout = useCallback(async () => {
|
|
2444
2656
|
try {
|
|
2445
2657
|
if (cloudAuthConfigured) {
|
|
@@ -2475,7 +2687,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2475
2687
|
setSetupState(null);
|
|
2476
2688
|
setBootstrapPhase('idle');
|
|
2477
2689
|
setBootstrapError(null);
|
|
2478
|
-
|
|
2690
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2479
2691
|
if (runtimeMode !== 'local') {
|
|
2480
2692
|
clearPersistedWorkspaceId(workspaceSelectionScope);
|
|
2481
2693
|
}
|
|
@@ -2511,29 +2723,64 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2511
2723
|
fetchTasks,
|
|
2512
2724
|
resetCloudLogoutClientState
|
|
2513
2725
|
]);
|
|
2726
|
+
const initiativeTemplateOperationRef = useRef(null);
|
|
2727
|
+
const runInitiativeMutation = useCallback(async (url, init, operationIdOverride) => {
|
|
2728
|
+
if (!globalThis.crypto?.randomUUID)
|
|
2729
|
+
throw new Error('Secure initiative operation identity generation is unavailable.');
|
|
2730
|
+
const operationId = operationIdOverride || `operation-${globalThis.crypto.randomUUID()}`;
|
|
2731
|
+
const requestInit = {
|
|
2732
|
+
...init,
|
|
2733
|
+
headers: { ...(init.headers || {}), 'x-taskforce-operation-id': operationId },
|
|
2734
|
+
};
|
|
2735
|
+
try {
|
|
2736
|
+
return await fetch(url, requestInit);
|
|
2737
|
+
}
|
|
2738
|
+
catch {
|
|
2739
|
+
return fetch(url, requestInit);
|
|
2740
|
+
}
|
|
2741
|
+
}, []);
|
|
2742
|
+
const workstreamHttpMutationClient = useMemo(() => createCloudWorkstreamHttpMutationClient(), []);
|
|
2514
2743
|
const createInitiativeFromTemplate = useCallback(async (payload) => {
|
|
2515
2744
|
try {
|
|
2516
|
-
const
|
|
2745
|
+
const requestBody = JSON.stringify(payload);
|
|
2746
|
+
if (initiativeTemplateOperationRef.current?.requestBody !== requestBody) {
|
|
2747
|
+
if (!globalThis.crypto?.randomUUID) {
|
|
2748
|
+
throw new Error('Secure initiative operation identity generation is unavailable.');
|
|
2749
|
+
}
|
|
2750
|
+
initiativeTemplateOperationRef.current = {
|
|
2751
|
+
requestBody,
|
|
2752
|
+
operationId: `operation-${globalThis.crypto.randomUUID()}`,
|
|
2753
|
+
};
|
|
2754
|
+
}
|
|
2755
|
+
const res = await runInitiativeMutation('/api/taskforce/initiative-templates/create', {
|
|
2517
2756
|
method: 'POST',
|
|
2518
2757
|
headers: { 'Content-Type': 'application/json' },
|
|
2519
|
-
body:
|
|
2520
|
-
});
|
|
2758
|
+
body: requestBody
|
|
2759
|
+
}, initiativeTemplateOperationRef.current.operationId);
|
|
2521
2760
|
const data = await res.json().catch(() => ({}));
|
|
2522
2761
|
if (!res.ok || !data?.success) {
|
|
2523
2762
|
return { success: false, error: data?.error || `Create failed (${res.status})` };
|
|
2524
2763
|
}
|
|
2764
|
+
initiativeTemplateOperationRef.current = null;
|
|
2525
2765
|
await fetchTasks(true);
|
|
2526
2766
|
return { success: true, result: data?.results };
|
|
2527
2767
|
}
|
|
2528
2768
|
catch (error) {
|
|
2529
2769
|
return { success: false, error: error.message };
|
|
2530
2770
|
}
|
|
2531
|
-
}, [fetchTasks]);
|
|
2771
|
+
}, [fetchTasks, runInitiativeMutation]);
|
|
2532
2772
|
const createInitiative = useCallback(async (payload) => {
|
|
2533
|
-
|
|
2773
|
+
if (!globalThis.crypto?.randomUUID)
|
|
2774
|
+
throw new Error('Secure initiative identity generation is unavailable.');
|
|
2775
|
+
const stablePayload = {
|
|
2776
|
+
...(payload || {}),
|
|
2777
|
+
id: payload?.id || `initiative-${globalThis.crypto.randomUUID()}`,
|
|
2778
|
+
createdAt: payload?.createdAt || new Date().toISOString(),
|
|
2779
|
+
};
|
|
2780
|
+
const res = await runInitiativeMutation('/api/taskforce/initiative', {
|
|
2534
2781
|
method: 'POST',
|
|
2535
2782
|
headers: { 'Content-Type': 'application/json' },
|
|
2536
|
-
body: JSON.stringify(
|
|
2783
|
+
body: JSON.stringify(stablePayload)
|
|
2537
2784
|
});
|
|
2538
2785
|
const data = await res.json().catch(() => ({}));
|
|
2539
2786
|
if (!res.ok) {
|
|
@@ -2542,9 +2789,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2542
2789
|
await fetchPlanningEntities();
|
|
2543
2790
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2544
2791
|
return data;
|
|
2545
|
-
}, [fetchPlanningEntities]);
|
|
2792
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2546
2793
|
const updateInitiative = useCallback(async (id, payload) => {
|
|
2547
|
-
const res = await
|
|
2794
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
|
|
2548
2795
|
method: 'PATCH',
|
|
2549
2796
|
headers: { 'Content-Type': 'application/json' },
|
|
2550
2797
|
body: JSON.stringify(payload || {})
|
|
@@ -2556,83 +2803,176 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2556
2803
|
await fetchPlanningEntities();
|
|
2557
2804
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2558
2805
|
return data;
|
|
2806
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2807
|
+
const refreshPlanningEntitiesInBackground = useCallback(() => {
|
|
2808
|
+
void fetchPlanningEntities();
|
|
2559
2809
|
}, [fetchPlanningEntities]);
|
|
2560
2810
|
const archiveInitiative = useCallback(async (id) => {
|
|
2561
|
-
const res = await
|
|
2811
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
|
|
2562
2812
|
method: 'POST',
|
|
2563
2813
|
});
|
|
2564
2814
|
const data = await res.json().catch(() => ({}));
|
|
2565
2815
|
if (!res.ok) {
|
|
2566
2816
|
throw new Error(data?.error || `Failed to archive initiative (${res.status})`);
|
|
2567
2817
|
}
|
|
2568
|
-
await fetchPlanningEntities();
|
|
2569
2818
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2819
|
+
refreshPlanningEntitiesInBackground();
|
|
2570
2820
|
return data;
|
|
2571
|
-
}, [
|
|
2821
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2572
2822
|
const unarchiveInitiative = useCallback(async (id) => {
|
|
2573
|
-
const res = await
|
|
2823
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
|
|
2574
2824
|
method: 'POST',
|
|
2575
2825
|
});
|
|
2576
2826
|
const data = await res.json().catch(() => ({}));
|
|
2577
2827
|
if (!res.ok) {
|
|
2578
2828
|
throw new Error(data?.error || `Failed to unarchive initiative (${res.status})`);
|
|
2579
2829
|
}
|
|
2580
|
-
await fetchPlanningEntities();
|
|
2581
2830
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2831
|
+
refreshPlanningEntitiesInBackground();
|
|
2582
2832
|
return data;
|
|
2583
|
-
}, [
|
|
2833
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2584
2834
|
const createWorkstream = useCallback(async (payload) => {
|
|
2585
|
-
const
|
|
2835
|
+
const attempt = await workstreamHttpMutationClient.prepareCreate(currentWorkspaceIdRef.current || 'default', (payload || {}));
|
|
2836
|
+
const res = await fetchWorkstreamHttpMutation('/api/taskforce/workstream', {
|
|
2586
2837
|
method: 'POST',
|
|
2587
2838
|
headers: { 'Content-Type': 'application/json' },
|
|
2588
|
-
body: JSON.stringify(
|
|
2589
|
-
});
|
|
2839
|
+
body: JSON.stringify(attempt.body)
|
|
2840
|
+
}, attempt.operationId);
|
|
2841
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2590
2842
|
const data = await res.json().catch(() => ({}));
|
|
2591
2843
|
if (!res.ok) {
|
|
2592
|
-
|
|
2844
|
+
if (conclusiveRejection) {
|
|
2845
|
+
await workstreamHttpMutationClient.abandonCreate(attempt.fingerprint, attempt.operationId);
|
|
2846
|
+
}
|
|
2847
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2848
|
+
throw new Error(`${data?.error || `Failed to create workstream (${res.status})`}${retryGuidance}`);
|
|
2593
2849
|
}
|
|
2850
|
+
if (data?.id !== attempt.body.id)
|
|
2851
|
+
throw new Error('Created workstream identity did not match the retained request identity.');
|
|
2852
|
+
await workstreamHttpMutationClient.confirmCreate(attempt.fingerprint, attempt.operationId);
|
|
2594
2853
|
await fetchPlanningEntities();
|
|
2595
|
-
setWorkstreams((current) =>
|
|
2854
|
+
setWorkstreams((current) => {
|
|
2855
|
+
const created = selectCreatedWorkstreamAfterRefresh(current, data);
|
|
2856
|
+
return created ? upsertEntityById(current, created) : current;
|
|
2857
|
+
});
|
|
2596
2858
|
return data;
|
|
2597
|
-
}, [fetchPlanningEntities]);
|
|
2859
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient]);
|
|
2598
2860
|
const updateWorkstream = useCallback(async (id, payload) => {
|
|
2599
|
-
const
|
|
2861
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}`;
|
|
2862
|
+
const body = (payload || {});
|
|
2863
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
2864
|
+
const observedState = observed ? {
|
|
2865
|
+
updatedAt: observed.updatedAt || null,
|
|
2866
|
+
initiativeId: observed.initiativeId || null,
|
|
2867
|
+
ownerId: observed.ownerId || null,
|
|
2868
|
+
isArchived: Boolean(observed.isArchived),
|
|
2869
|
+
} : null;
|
|
2870
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, observedState);
|
|
2871
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2600
2872
|
method: 'PATCH',
|
|
2601
2873
|
headers: { 'Content-Type': 'application/json' },
|
|
2602
|
-
body: JSON.stringify(
|
|
2603
|
-
});
|
|
2874
|
+
body: JSON.stringify(body)
|
|
2875
|
+
}, attempt.operationId);
|
|
2876
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2604
2877
|
const data = await res.json().catch(() => ({}));
|
|
2605
2878
|
if (!res.ok) {
|
|
2606
|
-
|
|
2879
|
+
if (conclusiveRejection) {
|
|
2880
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2881
|
+
}
|
|
2882
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2883
|
+
throw new Error(`${data?.error || `Failed to update workstream (${res.status})`}${retryGuidance}`);
|
|
2607
2884
|
}
|
|
2885
|
+
if (data?.id !== id)
|
|
2886
|
+
throw new Error('Updated workstream identity did not match the requested workstream.');
|
|
2887
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2608
2888
|
await fetchPlanningEntities();
|
|
2609
2889
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2610
2890
|
return data;
|
|
2611
|
-
}, [fetchPlanningEntities]);
|
|
2891
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2892
|
+
const reorderWorkstreamTasks = useCallback(async (workstreamId, taskIds) => {
|
|
2893
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(workstreamId)}/task-order`;
|
|
2894
|
+
const body = { taskIds };
|
|
2895
|
+
const observed = workstreams.find((workstream) => workstream.id === workstreamId);
|
|
2896
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, {
|
|
2897
|
+
updatedAt: observed?.updatedAt || null,
|
|
2898
|
+
workstreamId,
|
|
2899
|
+
});
|
|
2900
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2901
|
+
method: 'POST',
|
|
2902
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2903
|
+
body: JSON.stringify(body),
|
|
2904
|
+
}, attempt.operationId);
|
|
2905
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2906
|
+
const data = await res.json().catch(() => ({}));
|
|
2907
|
+
if (!res.ok) {
|
|
2908
|
+
if (conclusiveRejection) {
|
|
2909
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2910
|
+
}
|
|
2911
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2912
|
+
throw new Error(`${data?.error || `Failed to reorder workstream tasks (${res.status})`}${retryGuidance}`);
|
|
2913
|
+
}
|
|
2914
|
+
if (data?.workstreamId !== workstreamId || !Array.isArray(data?.taskIds)) {
|
|
2915
|
+
throw new Error('Reordered workstream task response did not match the request.');
|
|
2916
|
+
}
|
|
2917
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2918
|
+
const orderById = new Map(data.taskIds.map((taskId, index) => [taskId, (index + 1) * 1024]));
|
|
2919
|
+
setTasks((current) => current.map((task) => orderById.has(task.id)
|
|
2920
|
+
? { ...task, workstreamOrder: orderById.get(task.id) }
|
|
2921
|
+
: task));
|
|
2922
|
+
await fetchPlanningEntities();
|
|
2923
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2612
2924
|
const archiveWorkstream = useCallback(async (id) => {
|
|
2613
|
-
const
|
|
2925
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/archive`;
|
|
2926
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
2927
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
|
|
2928
|
+
updatedAt: observed.updatedAt || null,
|
|
2929
|
+
isArchived: Boolean(observed.isArchived),
|
|
2930
|
+
} : null);
|
|
2931
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2614
2932
|
method: 'POST',
|
|
2615
|
-
});
|
|
2933
|
+
}, attempt.operationId);
|
|
2934
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2616
2935
|
const data = await res.json().catch(() => ({}));
|
|
2617
2936
|
if (!res.ok) {
|
|
2618
|
-
|
|
2937
|
+
if (conclusiveRejection) {
|
|
2938
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2939
|
+
}
|
|
2940
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2941
|
+
throw new Error(`${data?.error || `Failed to archive workstream (${res.status})`}${retryGuidance}`);
|
|
2619
2942
|
}
|
|
2943
|
+
if (data?.id !== id)
|
|
2944
|
+
throw new Error('Archived workstream identity did not match the requested workstream.');
|
|
2945
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2620
2946
|
await fetchPlanningEntities();
|
|
2621
2947
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2622
2948
|
return data;
|
|
2623
|
-
}, [fetchPlanningEntities]);
|
|
2949
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2624
2950
|
const unarchiveWorkstream = useCallback(async (id) => {
|
|
2625
|
-
const
|
|
2951
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`;
|
|
2952
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
2953
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
|
|
2954
|
+
updatedAt: observed.updatedAt || null,
|
|
2955
|
+
isArchived: Boolean(observed.isArchived),
|
|
2956
|
+
} : null);
|
|
2957
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2626
2958
|
method: 'POST',
|
|
2627
|
-
});
|
|
2959
|
+
}, attempt.operationId);
|
|
2960
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2628
2961
|
const data = await res.json().catch(() => ({}));
|
|
2629
2962
|
if (!res.ok) {
|
|
2630
|
-
|
|
2963
|
+
if (conclusiveRejection) {
|
|
2964
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2965
|
+
}
|
|
2966
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2967
|
+
throw new Error(`${data?.error || `Failed to unarchive workstream (${res.status})`}${retryGuidance}`);
|
|
2631
2968
|
}
|
|
2969
|
+
if (data?.id !== id)
|
|
2970
|
+
throw new Error('Unarchived workstream identity did not match the requested workstream.');
|
|
2971
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2632
2972
|
await fetchPlanningEntities();
|
|
2633
2973
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2634
2974
|
return data;
|
|
2635
|
-
}, [fetchPlanningEntities]);
|
|
2975
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2636
2976
|
// Initialize auth once, then bootstrap protected data once auth gates are settled.
|
|
2637
2977
|
const hasInitializedAuthRef = useRef(false);
|
|
2638
2978
|
useEffect(() => {
|
|
@@ -2708,23 +3048,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2708
3048
|
onTaskCountChange(tasks.length);
|
|
2709
3049
|
}
|
|
2710
3050
|
}, [tasks.length, onTaskCountChange]);
|
|
2711
|
-
const
|
|
2712
|
-
|
|
3051
|
+
const deepLinkRouteKey = useMemo(() => {
|
|
3052
|
+
const taskId = String(initialTaskId || '').trim();
|
|
3053
|
+
if (!taskId)
|
|
3054
|
+
return '';
|
|
3055
|
+
return [
|
|
3056
|
+
String(requestedWorkspaceId || '').trim(),
|
|
3057
|
+
taskId,
|
|
3058
|
+
String(initialActivityEntryId || '').trim()
|
|
3059
|
+
].join(':');
|
|
3060
|
+
}, [initialActivityEntryId, initialTaskId, requestedWorkspaceId]);
|
|
3061
|
+
const deepLinkRouteKeyRef = useRef(deepLinkRouteKey);
|
|
3062
|
+
deepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3063
|
+
const handledDeepLinkRouteKeyRef = useRef(null);
|
|
3064
|
+
const failedDeepLinkRouteKeyRef = useRef(null);
|
|
3065
|
+
const deepLinkWorkspaceSwitchRef = useRef(null);
|
|
3066
|
+
const deepLinkFailureNoticeOwnerKeyRef = useRef(null);
|
|
3067
|
+
const deepLinkCollectionLookupRef = useRef(null);
|
|
3068
|
+
const deepLinkArchiveSettledRef = useRef(new Set());
|
|
3069
|
+
const deepLinkDeletedSettledRef = useRef(new Set());
|
|
3070
|
+
const deepLinkRetryCountsRef = useRef(new Map());
|
|
3071
|
+
const deepLinkRetryTimerRef = useRef(null);
|
|
3072
|
+
const deepLinkWorkspaceSwitchRetryTimerRef = useRef(null);
|
|
3073
|
+
const [deepLinkRetryNonce, setDeepLinkRetryNonce] = useState(0);
|
|
2713
3074
|
useEffect(() => {
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
3075
|
+
const previousFailureNoticeOwnerKey = deepLinkFailureNoticeOwnerKeyRef.current;
|
|
3076
|
+
if (previousFailureNoticeOwnerKey
|
|
3077
|
+
&& uiNoticeRef.current?.ownerKey === previousFailureNoticeOwnerKey) {
|
|
3078
|
+
clearNotice();
|
|
3079
|
+
}
|
|
3080
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3081
|
+
handledDeepLinkRouteKeyRef.current = null;
|
|
3082
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3083
|
+
deepLinkWorkspaceSwitchRef.current = null;
|
|
3084
|
+
deepLinkCollectionLookupRef.current = null;
|
|
3085
|
+
deepLinkArchiveSettledRef.current.clear();
|
|
3086
|
+
deepLinkDeletedSettledRef.current.clear();
|
|
3087
|
+
deepLinkRetryCountsRef.current.clear();
|
|
3088
|
+
if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3089
|
+
window.clearTimeout(deepLinkRetryTimerRef.current);
|
|
3090
|
+
deepLinkRetryTimerRef.current = null;
|
|
3091
|
+
}
|
|
3092
|
+
if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3093
|
+
window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
|
|
3094
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
3095
|
+
}
|
|
3096
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3097
|
+
}, [clearNotice, deepLinkRouteKey]);
|
|
3098
|
+
useEffect(() => () => {
|
|
3099
|
+
if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3100
|
+
window.clearTimeout(deepLinkRetryTimerRef.current);
|
|
3101
|
+
deepLinkRetryTimerRef.current = null;
|
|
3102
|
+
}
|
|
3103
|
+
if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3104
|
+
window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
|
|
3105
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
2717
3106
|
}
|
|
2718
|
-
|
|
2719
|
-
return;
|
|
2720
|
-
}
|
|
2721
|
-
const task = tasks.find(t => t.id.endsWith(initialTaskId) || t.id === initialTaskId);
|
|
2722
|
-
if (task) {
|
|
2723
|
-
handledInitialTaskIdRef.current = initialTaskId;
|
|
2724
|
-
handleEdit(task);
|
|
2725
|
-
setActiveTab('add');
|
|
2726
|
-
}
|
|
2727
|
-
}, [initialTaskId, tasks]);
|
|
3107
|
+
}, []);
|
|
2728
3108
|
// Update active category logic
|
|
2729
3109
|
const hasInitedCategoryRef = useRef(false);
|
|
2730
3110
|
useEffect(() => {
|
|
@@ -2750,7 +3130,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2750
3130
|
}, [configLoaded, activeCategories, category, getPreferredCategoryValue, lastUsedCategory]);
|
|
2751
3131
|
// Sanitize tasks with invalid categories
|
|
2752
3132
|
useEffect(() => {
|
|
2753
|
-
if (!configLoaded || activeCategories.length === 0)
|
|
3133
|
+
if (!configLoaded || !referenceDataLoaded || activeCategories.length === 0)
|
|
2754
3134
|
return;
|
|
2755
3135
|
const needsSanitization = (t) => {
|
|
2756
3136
|
return !activeCategories.some(c => c.value === t.category);
|
|
@@ -2767,31 +3147,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2767
3147
|
setArchivedTasks(prev => prev.map(t => needsSanitization(t) ? { ...t, category: defaultCategory } : t));
|
|
2768
3148
|
}
|
|
2769
3149
|
}
|
|
2770
|
-
}, [configLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
|
|
2771
|
-
useEffect(() => {
|
|
2772
|
-
return () => {
|
|
2773
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2774
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
2775
|
-
archiveBootstrapTimerRef.current = null;
|
|
2776
|
-
}
|
|
2777
|
-
if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2778
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
2779
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
2780
|
-
}
|
|
2781
|
-
};
|
|
2782
|
-
}, []);
|
|
3150
|
+
}, [configLoaded, referenceDataLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
|
|
2783
3151
|
// HMR Listener for Real-Time Updates
|
|
2784
3152
|
useEffect(() => {
|
|
2785
3153
|
if (import.meta.hot) {
|
|
2786
3154
|
import.meta.hot.on('taskforce:update', () => {
|
|
2787
3155
|
// console.log('[Taskforce] Received HMR update, refreshing data...');
|
|
2788
|
-
void refreshTaskCollections({ isSilent: true });
|
|
3156
|
+
void refreshTaskCollections({ isSilent: true, highlightChangedTaskIds: [] });
|
|
2789
3157
|
});
|
|
2790
3158
|
}
|
|
2791
3159
|
}, [refreshTaskCollections]);
|
|
2792
3160
|
const refreshTaskCollectionsForDataVersion = useCallback(async () => {
|
|
2793
|
-
await refreshTaskCollectionsFromInvalidation();
|
|
3161
|
+
await refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(['active', 'archive', 'deleted', 'planning'], { ambiguous: true }));
|
|
2794
3162
|
}, [refreshTaskCollectionsFromInvalidation]);
|
|
3163
|
+
useEffect(() => {
|
|
3164
|
+
if (typeof window === 'undefined')
|
|
3165
|
+
return;
|
|
3166
|
+
const handleTaskforceTasksMutated = (event) => {
|
|
3167
|
+
const detail = event.detail;
|
|
3168
|
+
const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
|
|
3169
|
+
if (eventWorkspaceId !== currentWorkspaceId)
|
|
3170
|
+
return;
|
|
3171
|
+
if (detail?.authoritativeTask)
|
|
3172
|
+
return;
|
|
3173
|
+
void refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(detail?.affectedCollections?.length
|
|
3174
|
+
? detail.affectedCollections
|
|
3175
|
+
: ['active', 'archive'], { taskIds: detail?.taskId ? [detail.taskId] : [] }));
|
|
3176
|
+
};
|
|
3177
|
+
window.addEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
|
|
3178
|
+
return () => {
|
|
3179
|
+
window.removeEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
|
|
3180
|
+
};
|
|
3181
|
+
}, [currentWorkspaceId, refreshTaskCollectionsFromInvalidation]);
|
|
2795
3182
|
const normalizedRealtimeWorkspaceId = String(currentWorkspaceId || '').trim();
|
|
2796
3183
|
const normalizedRealtimeUserId = String(authUserId || '').trim();
|
|
2797
3184
|
const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
|
|
@@ -2804,23 +3191,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2804
3191
|
&& normalizedRealtimeWorkspaceId
|
|
2805
3192
|
&& !isReservedWorkspaceId(normalizedRealtimeWorkspaceId)
|
|
2806
3193
|
&& realtimeSocketUrl);
|
|
2807
|
-
|
|
3194
|
+
useEffect(() => {
|
|
3195
|
+
return () => {
|
|
3196
|
+
if (ambiguousRealtimeConfirmationTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3197
|
+
window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
|
|
3198
|
+
ambiguousRealtimeConfirmationTimerRef.current = null;
|
|
3199
|
+
}
|
|
3200
|
+
};
|
|
3201
|
+
}, [currentWorkspaceId]);
|
|
3202
|
+
const handleCloudRealtimeSignal = useCallback((signal) => {
|
|
2808
3203
|
if (runtimeMode !== 'cloud')
|
|
2809
3204
|
return;
|
|
2810
|
-
|
|
2811
|
-
|
|
3205
|
+
dispatchTaskforceWorkspaceResourcesInvalidated({
|
|
3206
|
+
workspaceId: normalizedRealtimeWorkspaceId,
|
|
3207
|
+
source: 'realtime',
|
|
3208
|
+
});
|
|
3209
|
+
const scope = resolveRealtimeTaskInvalidation(signal.type, signal.invalidations);
|
|
3210
|
+
if (scope.collections.length === 0)
|
|
2812
3211
|
return;
|
|
2813
|
-
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
2821
|
-
void refreshTaskCollectionsFromInvalidation();
|
|
3212
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
3213
|
+
if (!scope.ambiguous || typeof window === 'undefined')
|
|
3214
|
+
return;
|
|
3215
|
+
if (ambiguousRealtimeConfirmationTimerRef.current !== null) {
|
|
3216
|
+
window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
|
|
3217
|
+
}
|
|
3218
|
+
ambiguousRealtimeConfirmationTimerRef.current = window.setTimeout(() => {
|
|
3219
|
+
ambiguousRealtimeConfirmationTimerRef.current = null;
|
|
3220
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
2822
3221
|
}, 250);
|
|
2823
|
-
}, [runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
3222
|
+
}, [normalizedRealtimeWorkspaceId, runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
2824
3223
|
useRealtimeSync({
|
|
2825
3224
|
enabled: cloudRealtimeEnabled,
|
|
2826
3225
|
workspaceId: normalizedRealtimeWorkspaceId,
|
|
@@ -2830,6 +3229,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2830
3229
|
});
|
|
2831
3230
|
// Fallback sync for cross-process writes (e.g., MCP tools) that may miss watcher/websocket events.
|
|
2832
3231
|
useDataVersionRefresh({
|
|
3232
|
+
workspaceId: currentWorkspaceId,
|
|
2833
3233
|
isOpen,
|
|
2834
3234
|
authBlocked,
|
|
2835
3235
|
authRequiredForApi,
|
|
@@ -2840,7 +3240,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2840
3240
|
authRequiredForApiRef,
|
|
2841
3241
|
isAuthenticatedRef,
|
|
2842
3242
|
dataVersionRef,
|
|
2843
|
-
refreshTaskCollectionsForDataVersion
|
|
3243
|
+
refreshTaskCollectionsForDataVersion,
|
|
3244
|
+
coordinatorDataVersion: localCoordinatorDataVersion,
|
|
2844
3245
|
});
|
|
2845
3246
|
const relationshipTasks = useMemo(() => {
|
|
2846
3247
|
const byId = new Map();
|
|
@@ -2865,21 +3266,31 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2865
3266
|
return;
|
|
2866
3267
|
if (activeTab === 'tasks') {
|
|
2867
3268
|
const loadKey = `${currentWorkspaceId}:${activeTab}:${showArchive ? 'archive' : 'active'}:${taskScope}`;
|
|
3269
|
+
const requiresArchive = showArchive || taskScope === 'archived';
|
|
3270
|
+
const requiresDeleted = taskScope === 'deleted';
|
|
2868
3271
|
if (!skippedInitialTaskTabRefreshRef.current) {
|
|
2869
3272
|
skippedInitialTaskTabRefreshRef.current = true;
|
|
2870
3273
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
3274
|
+
if (requiresArchive) {
|
|
3275
|
+
void ensureArchiveHydrated(false);
|
|
3276
|
+
}
|
|
3277
|
+
if (requiresDeleted) {
|
|
3278
|
+
void ensureDeletedTasksHydrated(false);
|
|
3279
|
+
}
|
|
2871
3280
|
return;
|
|
2872
3281
|
}
|
|
2873
3282
|
if (lastTaskSurfaceLoadKeyRef.current === loadKey)
|
|
2874
3283
|
return;
|
|
2875
3284
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
2876
|
-
|
|
3285
|
+
if (!requiresArchive && !requiresDeleted) {
|
|
3286
|
+
fetchTasks();
|
|
3287
|
+
}
|
|
2877
3288
|
fetchPlanningEntities();
|
|
2878
|
-
if (
|
|
2879
|
-
|
|
3289
|
+
if (requiresArchive) {
|
|
3290
|
+
void ensureArchiveHydrated(false);
|
|
2880
3291
|
}
|
|
2881
|
-
if (
|
|
2882
|
-
|
|
3292
|
+
if (requiresDeleted) {
|
|
3293
|
+
void ensureDeletedTasksHydrated(false);
|
|
2883
3294
|
}
|
|
2884
3295
|
return;
|
|
2885
3296
|
}
|
|
@@ -2889,9 +3300,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2889
3300
|
return;
|
|
2890
3301
|
lastSettingsSurfaceLoadKeyRef.current = loadKey;
|
|
2891
3302
|
fetchConfig();
|
|
2892
|
-
if (settingsSection === 'commands' || settingsSection === 'resources') {
|
|
2893
|
-
fetchWorkflows();
|
|
2894
|
-
}
|
|
2895
3303
|
}
|
|
2896
3304
|
}, [
|
|
2897
3305
|
currentWorkspaceId,
|
|
@@ -2902,10 +3310,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2902
3310
|
taskScope,
|
|
2903
3311
|
fetchTasks,
|
|
2904
3312
|
fetchPlanningEntities,
|
|
2905
|
-
|
|
2906
|
-
|
|
3313
|
+
ensureArchiveHydrated,
|
|
3314
|
+
ensureDeletedTasksHydrated,
|
|
2907
3315
|
fetchConfig,
|
|
2908
|
-
fetchWorkflows,
|
|
2909
3316
|
shouldDeferProtectedApiCalls,
|
|
2910
3317
|
shouldBlockProtectedApiCalls,
|
|
2911
3318
|
workspaceBootstrapPending
|
|
@@ -2998,7 +3405,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2998
3405
|
}
|
|
2999
3406
|
setActiveTab__internal(tab);
|
|
3000
3407
|
}, [activeTab]);
|
|
3001
|
-
const flushAutoSaveRef = useRef(async () =>
|
|
3408
|
+
const flushAutoSaveRef = useRef(async () => true);
|
|
3002
3409
|
const { handleNavigation, handleClose, resetForm, resolveTaskIdInput, resolveWorkstreamIdInput, handleEdit, handleOpenTaskById, returnToPreviousTask, clearReturnToParentTask } = useTaskEditorNavigation({
|
|
3003
3410
|
activeCategories,
|
|
3004
3411
|
activeTypes,
|
|
@@ -3009,7 +3416,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3009
3416
|
description,
|
|
3010
3417
|
editingTaskId,
|
|
3011
3418
|
flushPendingAutoSave: () => flushAutoSaveRef.current(),
|
|
3419
|
+
getDescriptionDraft,
|
|
3012
3420
|
getPreferredCategoryValue,
|
|
3421
|
+
getTitleDraft,
|
|
3013
3422
|
lastUsedCategory,
|
|
3014
3423
|
newCommentText,
|
|
3015
3424
|
relationshipTasks,
|
|
@@ -3017,7 +3426,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3017
3426
|
showArchive,
|
|
3018
3427
|
taxonomies,
|
|
3019
3428
|
setActiveTab,
|
|
3020
|
-
setApproach,
|
|
3021
3429
|
setAssignee,
|
|
3022
3430
|
setAttachments,
|
|
3023
3431
|
setAttachmentsDirty,
|
|
@@ -3045,9 +3453,302 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3045
3453
|
taskReturnTrail,
|
|
3046
3454
|
title,
|
|
3047
3455
|
});
|
|
3456
|
+
useEffect(() => {
|
|
3457
|
+
const normalizedTaskId = String(pendingOpenTaskId || '').trim();
|
|
3458
|
+
if (!uiStateReady || !normalizedTaskId)
|
|
3459
|
+
return;
|
|
3460
|
+
if (editingTaskId === normalizedTaskId) {
|
|
3461
|
+
setPendingOpenTaskId(null);
|
|
3462
|
+
return;
|
|
3463
|
+
}
|
|
3464
|
+
if (loadingTasks || workspaceBootstrapPending)
|
|
3465
|
+
return;
|
|
3466
|
+
const matchesTask = (task) => (task.id === normalizedTaskId || task.id.endsWith(normalizedTaskId));
|
|
3467
|
+
const target = relationshipTasks.find(matchesTask);
|
|
3468
|
+
if (target) {
|
|
3469
|
+
handleOpenTaskById(normalizedTaskId);
|
|
3470
|
+
setPendingOpenTaskId(null);
|
|
3471
|
+
return;
|
|
3472
|
+
}
|
|
3473
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3474
|
+
const archiveLookupKey = `${workspaceId}:${normalizedTaskId}`;
|
|
3475
|
+
if (archiveHydratedWorkspaceId !== workspaceId && !archiveLookupSettledKeys.has(archiveLookupKey)) {
|
|
3476
|
+
void ensureArchiveHydrated(true).finally(() => {
|
|
3477
|
+
const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3478
|
+
if (liveWorkspaceId === workspaceId) {
|
|
3479
|
+
setArchiveLookupSettledKeys((current) => {
|
|
3480
|
+
if (current.has(archiveLookupKey))
|
|
3481
|
+
return current;
|
|
3482
|
+
return new Set(current).add(archiveLookupKey);
|
|
3483
|
+
});
|
|
3484
|
+
}
|
|
3485
|
+
});
|
|
3486
|
+
return;
|
|
3487
|
+
}
|
|
3488
|
+
const deletedTarget = deletedRelationshipTasks.find(matchesTask);
|
|
3489
|
+
if (deletedTarget) {
|
|
3490
|
+
handleEdit(deletedTarget);
|
|
3491
|
+
setPendingOpenTaskId(null);
|
|
3492
|
+
return;
|
|
3493
|
+
}
|
|
3494
|
+
if (deletedHydratedWorkspaceId !== workspaceId) {
|
|
3495
|
+
void ensureDeletedTasksHydrated(true);
|
|
3496
|
+
return;
|
|
3497
|
+
}
|
|
3498
|
+
setPendingOpenTaskId(null);
|
|
3499
|
+
}, [
|
|
3500
|
+
archiveHydratedWorkspaceId,
|
|
3501
|
+
archiveLookupSettledKeys,
|
|
3502
|
+
deletedHydratedWorkspaceId,
|
|
3503
|
+
deletedRelationshipTasks,
|
|
3504
|
+
editingTaskId,
|
|
3505
|
+
ensureArchiveHydrated,
|
|
3506
|
+
ensureDeletedTasksHydrated,
|
|
3507
|
+
handleEdit,
|
|
3508
|
+
handleOpenTaskById,
|
|
3509
|
+
loadingTasks,
|
|
3510
|
+
pendingOpenTaskId,
|
|
3511
|
+
relationshipTasks,
|
|
3512
|
+
uiStateReady,
|
|
3513
|
+
workspaceBootstrapPending
|
|
3514
|
+
]);
|
|
3515
|
+
// Deep links are workspace-scoped. In cloud mode, switch to the explicit
|
|
3516
|
+
// workspace before looking up the task. Local runtimes never cross their
|
|
3517
|
+
// configured workspace boundary.
|
|
3518
|
+
useEffect(() => {
|
|
3519
|
+
const normalizedTaskId = String(initialTaskId || '').trim();
|
|
3520
|
+
if (!normalizedTaskId || !deepLinkRouteKey)
|
|
3521
|
+
return;
|
|
3522
|
+
if (handledDeepLinkRouteKeyRef.current === deepLinkRouteKey
|
|
3523
|
+
|| !runtimeConfigReady
|
|
3524
|
+
|| !configLoaded
|
|
3525
|
+
|| !uiStateReady
|
|
3526
|
+
|| loadingTasks
|
|
3527
|
+
|| workspaceBootstrapPending) {
|
|
3528
|
+
return;
|
|
3529
|
+
}
|
|
3530
|
+
const explicitWorkspaceId = String(requestedWorkspaceId || '').trim();
|
|
3531
|
+
const activeWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3532
|
+
const clearOwnedFailureNotice = () => {
|
|
3533
|
+
const ownerKey = deepLinkFailureNoticeOwnerKeyRef.current;
|
|
3534
|
+
if (ownerKey && uiNoticeRef.current?.ownerKey === ownerKey) {
|
|
3535
|
+
clearNotice();
|
|
3536
|
+
}
|
|
3537
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3538
|
+
};
|
|
3539
|
+
if (explicitWorkspaceId && explicitWorkspaceId !== activeWorkspaceId) {
|
|
3540
|
+
if (failedDeepLinkRouteKeyRef.current === deepLinkRouteKey)
|
|
3541
|
+
return;
|
|
3542
|
+
if (runtimeMode !== 'cloud' || !workspaceSwitchingEnabled) {
|
|
3543
|
+
if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
|
|
3544
|
+
failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3545
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
|
|
3546
|
+
}
|
|
3547
|
+
return;
|
|
3548
|
+
}
|
|
3549
|
+
if (!authSessionResolved || !isAuthenticated || authBlocked)
|
|
3550
|
+
return;
|
|
3551
|
+
if (deepLinkWorkspaceSwitchRef.current === deepLinkRouteKey
|
|
3552
|
+
|| deepLinkWorkspaceSwitchRetryTimerRef.current !== null) {
|
|
3553
|
+
return;
|
|
3554
|
+
}
|
|
3555
|
+
const routeKeyAtStart = deepLinkRouteKey;
|
|
3556
|
+
const switchRetryKey = `${routeKeyAtStart}:workspace`;
|
|
3557
|
+
deepLinkWorkspaceSwitchRef.current = routeKeyAtStart;
|
|
3558
|
+
void switchWorkspace(explicitWorkspaceId).then((result) => {
|
|
3559
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3560
|
+
return;
|
|
3561
|
+
if (!result.success) {
|
|
3562
|
+
const attemptCount = (deepLinkRetryCountsRef.current.get(switchRetryKey) || 0) + 1;
|
|
3563
|
+
deepLinkRetryCountsRef.current.set(switchRetryKey, attemptCount);
|
|
3564
|
+
if (attemptCount < 2 && typeof window !== 'undefined') {
|
|
3565
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = window.setTimeout(() => {
|
|
3566
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
3567
|
+
if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
|
|
3568
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3569
|
+
}
|
|
3570
|
+
}, 500);
|
|
3571
|
+
return;
|
|
3572
|
+
}
|
|
3573
|
+
failedDeepLinkRouteKeyRef.current = routeKeyAtStart;
|
|
3574
|
+
const failureNoticeOwnerKey = `deep-link-workspace:${routeKeyAtStart}`;
|
|
3575
|
+
deepLinkFailureNoticeOwnerKeyRef.current = failureNoticeOwnerKey;
|
|
3576
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000, {
|
|
3577
|
+
label: 'Retry',
|
|
3578
|
+
onAction: () => {
|
|
3579
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3580
|
+
return;
|
|
3581
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3582
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3583
|
+
deepLinkRetryCountsRef.current.delete(switchRetryKey);
|
|
3584
|
+
clearNotice();
|
|
3585
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3586
|
+
},
|
|
3587
|
+
ownerKey: failureNoticeOwnerKey
|
|
3588
|
+
});
|
|
3589
|
+
}
|
|
3590
|
+
}).finally(() => {
|
|
3591
|
+
if (deepLinkWorkspaceSwitchRef.current === routeKeyAtStart) {
|
|
3592
|
+
deepLinkWorkspaceSwitchRef.current = null;
|
|
3593
|
+
}
|
|
3594
|
+
});
|
|
3595
|
+
return;
|
|
3596
|
+
}
|
|
3597
|
+
const resolveTarget = (items) => {
|
|
3598
|
+
const exact = items.find((task) => task.id === normalizedTaskId);
|
|
3599
|
+
if (exact || explicitWorkspaceId)
|
|
3600
|
+
return exact;
|
|
3601
|
+
const legacySuffixMatches = items.filter((task) => task.id.endsWith(normalizedTaskId));
|
|
3602
|
+
return legacySuffixMatches.length === 1 ? legacySuffixMatches[0] : undefined;
|
|
3603
|
+
};
|
|
3604
|
+
const target = resolveTarget(relationshipTasks);
|
|
3605
|
+
if (target) {
|
|
3606
|
+
clearOwnedFailureNotice();
|
|
3607
|
+
handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3608
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3609
|
+
if (editingTaskId !== target.id) {
|
|
3610
|
+
if (target.isArchived)
|
|
3611
|
+
setShowArchive(true);
|
|
3612
|
+
handleEdit(target);
|
|
3613
|
+
}
|
|
3614
|
+
return;
|
|
3615
|
+
}
|
|
3616
|
+
const scheduleCollectionLookup = (collection, lookup, settledRoutes) => {
|
|
3617
|
+
const lookupKey = `${deepLinkRouteKey}:${collection}`;
|
|
3618
|
+
if (deepLinkCollectionLookupRef.current === lookupKey
|
|
3619
|
+
|| deepLinkRetryTimerRef.current !== null) {
|
|
3620
|
+
return;
|
|
3621
|
+
}
|
|
3622
|
+
deepLinkCollectionLookupRef.current = lookupKey;
|
|
3623
|
+
const routeKeyAtStart = deepLinkRouteKey;
|
|
3624
|
+
void lookup().then((loaded) => {
|
|
3625
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3626
|
+
return;
|
|
3627
|
+
if (loaded) {
|
|
3628
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3629
|
+
return;
|
|
3630
|
+
}
|
|
3631
|
+
const attemptCount = (deepLinkRetryCountsRef.current.get(lookupKey) || 0) + 1;
|
|
3632
|
+
deepLinkRetryCountsRef.current.set(lookupKey, attemptCount);
|
|
3633
|
+
if (attemptCount >= 2) {
|
|
3634
|
+
settledRoutes.add(routeKeyAtStart);
|
|
3635
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3636
|
+
return;
|
|
3637
|
+
}
|
|
3638
|
+
if (typeof window !== 'undefined') {
|
|
3639
|
+
deepLinkRetryTimerRef.current = window.setTimeout(() => {
|
|
3640
|
+
deepLinkRetryTimerRef.current = null;
|
|
3641
|
+
if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
|
|
3642
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3643
|
+
}
|
|
3644
|
+
}, 500);
|
|
3645
|
+
}
|
|
3646
|
+
}).finally(() => {
|
|
3647
|
+
if (deepLinkCollectionLookupRef.current === lookupKey) {
|
|
3648
|
+
deepLinkCollectionLookupRef.current = null;
|
|
3649
|
+
}
|
|
3650
|
+
});
|
|
3651
|
+
};
|
|
3652
|
+
if (archiveHydratedWorkspaceId !== activeWorkspaceId
|
|
3653
|
+
&& !deepLinkArchiveSettledRef.current.has(deepLinkRouteKey)) {
|
|
3654
|
+
scheduleCollectionLookup('archive', () => ensureArchiveHydrated(true), deepLinkArchiveSettledRef.current);
|
|
3655
|
+
return;
|
|
3656
|
+
}
|
|
3657
|
+
const deletedTarget = resolveTarget(deletedRelationshipTasks);
|
|
3658
|
+
if (deletedTarget) {
|
|
3659
|
+
clearOwnedFailureNotice();
|
|
3660
|
+
handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3661
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3662
|
+
handleEdit(deletedTarget);
|
|
3663
|
+
return;
|
|
3664
|
+
}
|
|
3665
|
+
if (deletedHydratedWorkspaceId !== activeWorkspaceId
|
|
3666
|
+
&& !deepLinkDeletedSettledRef.current.has(deepLinkRouteKey)) {
|
|
3667
|
+
scheduleCollectionLookup('deleted', () => ensureDeletedTasksHydrated(true), deepLinkDeletedSettledRef.current);
|
|
3668
|
+
return;
|
|
3669
|
+
}
|
|
3670
|
+
if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
|
|
3671
|
+
failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3672
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
|
|
3673
|
+
}
|
|
3674
|
+
}, [
|
|
3675
|
+
archiveHydratedWorkspaceId,
|
|
3676
|
+
authBlocked,
|
|
3677
|
+
authSessionResolved,
|
|
3678
|
+
clearNotice,
|
|
3679
|
+
configLoaded,
|
|
3680
|
+
currentWorkspaceIdRef,
|
|
3681
|
+
deepLinkRetryNonce,
|
|
3682
|
+
deepLinkRouteKey,
|
|
3683
|
+
deletedHydratedWorkspaceId,
|
|
3684
|
+
deletedRelationshipTasks,
|
|
3685
|
+
editingTaskId,
|
|
3686
|
+
ensureArchiveHydrated,
|
|
3687
|
+
ensureDeletedTasksHydrated,
|
|
3688
|
+
handleEdit,
|
|
3689
|
+
initialTaskId,
|
|
3690
|
+
isAuthenticated,
|
|
3691
|
+
loadingTasks,
|
|
3692
|
+
pushNotice,
|
|
3693
|
+
relationshipTasks,
|
|
3694
|
+
requestedWorkspaceId,
|
|
3695
|
+
runtimeConfigReady,
|
|
3696
|
+
runtimeMode,
|
|
3697
|
+
setShowArchive,
|
|
3698
|
+
switchWorkspace,
|
|
3699
|
+
uiStateReady,
|
|
3700
|
+
workspaceBootstrapPending,
|
|
3701
|
+
workspaceSwitchingEnabled
|
|
3702
|
+
]);
|
|
3048
3703
|
// === SECTION: Task CRUD ===
|
|
3049
3704
|
// Pure mutation callbacks are managed by useTaskMutations.
|
|
3050
|
-
const
|
|
3705
|
+
const mutateTaskMetadata = useDurableTaskMetadataMutation({
|
|
3706
|
+
enabled: runtimeConfigOverride.syncV3TaskMetadataActivation
|
|
3707
|
+
&& runtimeMode === 'local',
|
|
3708
|
+
workspaceId: currentWorkspaceId,
|
|
3709
|
+
isAuthenticated,
|
|
3710
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3711
|
+
});
|
|
3712
|
+
const createTaskDurably = useDurableTaskCreateMutation({
|
|
3713
|
+
localRuntime: runtimeMode === 'local',
|
|
3714
|
+
enabled: runtimeConfigOverride.syncV3TaskCreateActivation
|
|
3715
|
+
&& runtimeMode === 'local',
|
|
3716
|
+
workspaceId: currentWorkspaceId,
|
|
3717
|
+
isAuthenticated,
|
|
3718
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3719
|
+
});
|
|
3720
|
+
const taskStatusActivationEnabled = runtimeConfigOverride.syncV3TaskStatusActivation
|
|
3721
|
+
&& runtimeMode === 'local';
|
|
3722
|
+
const mutateTaskStatus = useDurableTaskStatusMutation({
|
|
3723
|
+
enabled: taskStatusActivationEnabled,
|
|
3724
|
+
workspaceId: currentWorkspaceId,
|
|
3725
|
+
isAuthenticated,
|
|
3726
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3727
|
+
});
|
|
3728
|
+
const mutateTaskLifecycle = useDurableTaskLifecycleMutation({
|
|
3729
|
+
// Always probe the local durable lifecycle boundary. The route returns
|
|
3730
|
+
// an explicit disabled result for v2-owned workspaces, but persisted
|
|
3731
|
+
// v3 ownership must survive a process restart with incomplete flags.
|
|
3732
|
+
enabled: runtimeMode === 'local',
|
|
3733
|
+
workspaceId: currentWorkspaceId,
|
|
3734
|
+
isAuthenticated,
|
|
3735
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3736
|
+
});
|
|
3737
|
+
const taskDeleteActivationEnabled = runtimeConfigOverride.syncV3TaskDeleteActivation
|
|
3738
|
+
&& runtimeMode === 'local';
|
|
3739
|
+
const mutateTaskDelete = useDurableTaskDeleteMutation({
|
|
3740
|
+
enabled: taskDeleteActivationEnabled,
|
|
3741
|
+
workspaceId: currentWorkspaceId,
|
|
3742
|
+
isAuthenticated,
|
|
3743
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3744
|
+
});
|
|
3745
|
+
const mutateTaskRestore = useDurableTaskRestoreMutation({
|
|
3746
|
+
enabled: taskDeleteActivationEnabled,
|
|
3747
|
+
workspaceId: currentWorkspaceId,
|
|
3748
|
+
isAuthenticated,
|
|
3749
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3750
|
+
});
|
|
3751
|
+
const { copiedId, handleDelete, handleUpdateTask, handleSetStatus, handleToggleComplete, handleToggleCancel, handleToggleInProgress, handleToggleReview, handleArchiveTask, handleBulkArchive, handleUnarchive, handleRestoreDeletedTask, handleRestoreSelectedDeletedTasks, handlePermanentlyDeleteDeletedTask, handleEmptyDeletedTasks, handleCopyId, queueWorkspaceSyncFromAuthoritativeTaskState, } = useTaskActions({
|
|
3051
3752
|
tasks,
|
|
3052
3753
|
archivedTasks,
|
|
3053
3754
|
editingTaskId,
|
|
@@ -3058,8 +3759,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3058
3759
|
resetForm,
|
|
3059
3760
|
setActiveTab,
|
|
3060
3761
|
fetchTasks,
|
|
3061
|
-
fetchArchive,
|
|
3062
|
-
fetchDeletedTasks,
|
|
3762
|
+
fetchArchive: refreshArchiveIfHydrated,
|
|
3763
|
+
fetchDeletedTasks: refreshDeletedTasksIfHydrated,
|
|
3063
3764
|
mergeTaskFromServer,
|
|
3064
3765
|
pushNotice,
|
|
3065
3766
|
cloudAuthConfigured,
|
|
@@ -3071,12 +3772,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3071
3772
|
workspacePendingSignatureRef,
|
|
3072
3773
|
workspaceDeletedTaskIdsRef,
|
|
3073
3774
|
workspaceDeletedTaskWatermarksRef,
|
|
3775
|
+
mutateTaskMetadata,
|
|
3776
|
+
mutateTaskStatus,
|
|
3777
|
+
mutateTaskLifecycle,
|
|
3778
|
+
mutateTaskDelete,
|
|
3779
|
+
mutateTaskRestore,
|
|
3780
|
+
durableTaskMetadataActivationEnabled: runtimeConfigOverride.syncV3TaskMetadataActivation
|
|
3781
|
+
&& runtimeMode === 'local',
|
|
3782
|
+
durableTaskStatusActivationEnabled: taskStatusActivationEnabled,
|
|
3783
|
+
durableTaskDeleteActivationEnabled: taskDeleteActivationEnabled,
|
|
3784
|
+
durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
|
|
3785
|
+
workspaceId: currentWorkspaceId,
|
|
3074
3786
|
});
|
|
3075
3787
|
const { autoSaveState, flushAutoSave, scheduleWarningPrompt, handleSubmit, confirmScheduleWarning, cancelScheduleWarning, handleAddComment } = useTaskFormActions({
|
|
3076
3788
|
activeCategories,
|
|
3077
3789
|
activeTab,
|
|
3078
3790
|
apiEndpoint,
|
|
3079
|
-
approach,
|
|
3080
3791
|
assignee,
|
|
3081
3792
|
attachments,
|
|
3082
3793
|
attachmentsDirty,
|
|
@@ -3086,16 +3797,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3086
3797
|
complexity,
|
|
3087
3798
|
description,
|
|
3088
3799
|
dueDate,
|
|
3800
|
+
createTaskDurably,
|
|
3801
|
+
durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
|
|
3802
|
+
workspaceId: currentWorkspaceId,
|
|
3803
|
+
updateTask: handleUpdateTask,
|
|
3089
3804
|
editingTaskId,
|
|
3090
3805
|
fetchTasks,
|
|
3091
3806
|
formTaxonomies,
|
|
3807
|
+
getDescriptionDraft,
|
|
3092
3808
|
getPreferredCategoryValue,
|
|
3809
|
+
getTitleDraft,
|
|
3093
3810
|
mergeTaskFromServer,
|
|
3811
|
+
onTaskCreated: handleEdit,
|
|
3094
3812
|
workstreamInput,
|
|
3095
3813
|
priority,
|
|
3096
3814
|
pushNotice,
|
|
3097
3815
|
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3098
3816
|
relationshipTasks,
|
|
3817
|
+
supplementalTasks: deletedRelationshipTasks,
|
|
3099
3818
|
resetForm,
|
|
3100
3819
|
resolveWorkstreamIdInput,
|
|
3101
3820
|
scheduledDate,
|
|
@@ -3109,6 +3828,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3109
3828
|
status,
|
|
3110
3829
|
title,
|
|
3111
3830
|
taxonomies,
|
|
3831
|
+
textDraftOccupied,
|
|
3112
3832
|
type
|
|
3113
3833
|
});
|
|
3114
3834
|
useEffect(() => {
|
|
@@ -3116,21 +3836,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3116
3836
|
}, [flushAutoSave]);
|
|
3117
3837
|
const { handleSetWorkstreamForCurrentTask, } = useTaskRelationships({
|
|
3118
3838
|
editingTaskId,
|
|
3119
|
-
mergeTaskFromServer,
|
|
3120
3839
|
workstreamInput,
|
|
3121
3840
|
pushNotice,
|
|
3122
|
-
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3123
3841
|
relationshipTasks,
|
|
3124
3842
|
resolveWorkstreamIdInput,
|
|
3125
3843
|
setError,
|
|
3126
|
-
|
|
3844
|
+
updateTask: handleUpdateTask
|
|
3127
3845
|
});
|
|
3128
3846
|
const { currentTask, currentTaskWorkstream, currentTaskInitiative, } = useCurrentTaskRelations({
|
|
3129
3847
|
editingTaskId,
|
|
3130
3848
|
relationshipTasks,
|
|
3131
3849
|
initiatives,
|
|
3132
3850
|
workstreams,
|
|
3851
|
+
workstreamInput,
|
|
3852
|
+
resolveWorkstreamIdInput,
|
|
3133
3853
|
supplementalTasks: deletedRelationshipTasks,
|
|
3854
|
+
assignee,
|
|
3855
|
+
setAssignee,
|
|
3856
|
+
setChecklistItems,
|
|
3134
3857
|
setComments
|
|
3135
3858
|
});
|
|
3136
3859
|
const settingsModel = useSettingsModel({
|
|
@@ -3154,12 +3877,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3154
3877
|
manualComplexityEnabled,
|
|
3155
3878
|
checklistDropdownEnabled,
|
|
3156
3879
|
showTaskCardStatusLabel,
|
|
3157
|
-
exportWorkflowsPath,
|
|
3158
|
-
exportingResource,
|
|
3159
|
-
exportResult,
|
|
3160
3880
|
pathSaved,
|
|
3161
3881
|
settingsSection,
|
|
3162
|
-
exportEnvironment,
|
|
3163
3882
|
setupState,
|
|
3164
3883
|
buildInfo,
|
|
3165
3884
|
saveSetupMode,
|
|
@@ -3177,19 +3896,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3177
3896
|
handleShowTaskCardStatusLabelChange,
|
|
3178
3897
|
handleResetProjectToGlobal,
|
|
3179
3898
|
handleSaveSettings,
|
|
3180
|
-
setExportWorkflowsPath,
|
|
3181
|
-
setExportEnvironment,
|
|
3182
|
-
availableWorkflows,
|
|
3183
3899
|
initiativeTemplates,
|
|
3184
|
-
availableEnvironments,
|
|
3185
|
-
fetchWorkflows,
|
|
3186
3900
|
fetchInitiativeTemplates,
|
|
3187
3901
|
createInitiativeFromTemplate,
|
|
3188
|
-
fetchWorkflowTemplate,
|
|
3189
|
-
fetchWorkflowOverrideNames,
|
|
3190
|
-
saveWorkflowTemplateDraft,
|
|
3191
|
-
resetWorkflowTemplateDraft,
|
|
3192
|
-
handleExportWorkflows,
|
|
3193
3902
|
setShowFolderBrowser,
|
|
3194
3903
|
setBrowserTarget,
|
|
3195
3904
|
fetchFolders,
|
|
@@ -3346,6 +4055,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3346
4055
|
workspaceSyncRecommendedAction,
|
|
3347
4056
|
workspaceSyncBusy,
|
|
3348
4057
|
workspaceSyncPendingChanges,
|
|
4058
|
+
localCoordinatorStatus,
|
|
4059
|
+
transferLocalCoordinatorOwnership,
|
|
3349
4060
|
retryUserGlobalSettingsSync,
|
|
3350
4061
|
retryWorkspaceCloudSync,
|
|
3351
4062
|
resetWorkspaceSyncCursorAndPull,
|
|
@@ -3382,6 +4093,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3382
4093
|
fetchLoginMethods,
|
|
3383
4094
|
unlinkLoginMethod,
|
|
3384
4095
|
addPasswordToAccount,
|
|
4096
|
+
changePassword,
|
|
3385
4097
|
beginOAuthLink,
|
|
3386
4098
|
registerWithCredentials,
|
|
3387
4099
|
updateCurrentUserProfile,
|
|
@@ -3413,15 +4125,17 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3413
4125
|
tasks,
|
|
3414
4126
|
loadingTasks,
|
|
3415
4127
|
archivedTasks,
|
|
4128
|
+
archiveHydratedWorkspaceId,
|
|
3416
4129
|
initiatives,
|
|
3417
4130
|
workstreams,
|
|
3418
4131
|
planningBootstrapTaskSummaries,
|
|
4132
|
+
planningLoadState,
|
|
4133
|
+
workspaceTaskRelationships,
|
|
3419
4134
|
deletedTasks,
|
|
3420
4135
|
activeCategories,
|
|
3421
4136
|
activeTypes,
|
|
3422
4137
|
priorities,
|
|
3423
4138
|
taxonomyDisplayLabels,
|
|
3424
|
-
approaches,
|
|
3425
4139
|
taxonomies,
|
|
3426
4140
|
// Filtering
|
|
3427
4141
|
searchQuery,
|
|
@@ -3448,6 +4162,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3448
4162
|
setShowArchive,
|
|
3449
4163
|
taskScope,
|
|
3450
4164
|
setTaskScope,
|
|
4165
|
+
compressedCards,
|
|
4166
|
+
setCompressedCards,
|
|
3451
4167
|
clearFilters,
|
|
3452
4168
|
filteredTasks,
|
|
3453
4169
|
searchAgnosticTasks,
|
|
@@ -3458,8 +4174,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3458
4174
|
// Actions
|
|
3459
4175
|
fetchTasks,
|
|
3460
4176
|
fetchArchive,
|
|
4177
|
+
ensureArchiveHydrated,
|
|
3461
4178
|
fetchDeletedTasks,
|
|
3462
4179
|
fetchPlanningEntities,
|
|
4180
|
+
fetchPlanningEntityDetail,
|
|
3463
4181
|
fetchAssigneeOptions,
|
|
3464
4182
|
createInitiative,
|
|
3465
4183
|
updateInitiative,
|
|
@@ -3469,6 +4187,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3469
4187
|
updateWorkstream,
|
|
3470
4188
|
archiveWorkstream,
|
|
3471
4189
|
unarchiveWorkstream,
|
|
4190
|
+
reorderWorkstreamTasks,
|
|
3472
4191
|
handleEdit,
|
|
3473
4192
|
handleDelete,
|
|
3474
4193
|
handleCopyId,
|
|
@@ -3480,17 +4199,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3480
4199
|
handleBulkArchive,
|
|
3481
4200
|
handleUnarchive,
|
|
3482
4201
|
handleRestoreDeletedTask,
|
|
4202
|
+
handleRestoreSelectedDeletedTasks,
|
|
3483
4203
|
handlePermanentlyDeleteDeletedTask,
|
|
3484
4204
|
handleEmptyDeletedTasks,
|
|
3485
4205
|
handleUpdateTask,
|
|
4206
|
+
handleSetStatus,
|
|
3486
4207
|
// Form State
|
|
3487
4208
|
editingTaskId,
|
|
3488
4209
|
loading,
|
|
3489
4210
|
error,
|
|
4211
|
+
clearTaskError,
|
|
3490
4212
|
title,
|
|
3491
4213
|
setTitle,
|
|
4214
|
+
setTitleDraft,
|
|
3492
4215
|
description,
|
|
3493
4216
|
setDescription,
|
|
4217
|
+
setDescriptionDraft,
|
|
3494
4218
|
checklistItems,
|
|
3495
4219
|
setChecklistItems,
|
|
3496
4220
|
category,
|
|
@@ -3503,8 +4227,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3503
4227
|
setComplexity,
|
|
3504
4228
|
status,
|
|
3505
4229
|
setStatus,
|
|
3506
|
-
approach,
|
|
3507
|
-
setApproach,
|
|
3508
4230
|
assignee,
|
|
3509
4231
|
setAssignee,
|
|
3510
4232
|
scheduledDate,
|
|
@@ -3526,10 +4248,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3526
4248
|
setDescriptionFocused,
|
|
3527
4249
|
showMarkdownHelp,
|
|
3528
4250
|
setShowMarkdownHelp,
|
|
3529
|
-
showChecklist,
|
|
3530
|
-
setShowChecklist,
|
|
3531
|
-
showComments,
|
|
3532
|
-
setShowComments,
|
|
3533
4251
|
isCapturingScreenshot,
|
|
3534
4252
|
setIsCapturingScreenshot,
|
|
3535
4253
|
// Form Actions
|
|
@@ -3561,13 +4279,13 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3561
4279
|
cancelScheduleWarning,
|
|
3562
4280
|
tasksScrollRef,
|
|
3563
4281
|
setTasksScrollPos, // Export if needed
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
4282
|
+
taskforceAgentId,
|
|
4283
|
+
setTaskforceAgentId,
|
|
4284
|
+
taskforceAgentConversationId,
|
|
4285
|
+
setTaskforceAgentConversationId,
|
|
4286
|
+
taskforceAgentConversationByAgentId,
|
|
4287
|
+
setTaskforceAgentConversationByAgentId,
|
|
4288
|
+
uiStateReady,
|
|
3571
4289
|
// Categories & Types & Taxonomies mgmt
|
|
3572
4290
|
handleUpdateCategory,
|
|
3573
4291
|
handleRemoveCategory,
|
|
@@ -3595,17 +4313,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3595
4313
|
currentTask,
|
|
3596
4314
|
currentTaskWorkstream,
|
|
3597
4315
|
currentTaskInitiative,
|
|
3598
|
-
availableWorkflows,
|
|
3599
4316
|
initiativeTemplates,
|
|
3600
|
-
availableEnvironments,
|
|
3601
|
-
fetchWorkflows,
|
|
3602
4317
|
fetchInitiativeTemplates,
|
|
3603
4318
|
createInitiativeFromTemplate,
|
|
3604
|
-
fetchWorkflowTemplate,
|
|
3605
|
-
fetchWorkflowOverrideNames,
|
|
3606
|
-
saveWorkflowTemplateDraft,
|
|
3607
|
-
resetWorkflowTemplateDraft,
|
|
3608
|
-
onExportWorkflows: handleExportWorkflows,
|
|
3609
4319
|
settingsModel
|
|
3610
4320
|
};
|
|
3611
4321
|
}
|