@taskforcehq/taskforce 0.3.326 → 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 +2173 -561
- 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 +232 -143
- 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 +9 -10
- 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 +1662 -598
- 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 +60 -49
- package/dist/components/views/panels/PlanningDrawer.js +978 -313
- package/dist/components/views/planningScope.js +7 -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 +510 -251
- 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 +1102 -449
- 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 +17 -6
- package/dist/hooks/workspace/workspaceLocalState.js +175 -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 -30
- 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 +58 -57
- package/dist/mcp/clientRegistry.d.ts +30 -0
- package/dist/mcp/clientRegistry.js +134 -0
- package/dist/mcp/collaborationRegistrar.js +20 -6
- package/dist/mcp/documentAssetRegistrar.js +220 -52
- package/dist/mcp/documentContentCommand.d.ts +94 -0
- package/dist/mcp/documentContentCommand.js +226 -0
- package/dist/mcp/documentHelpers.d.ts +13 -65
- package/dist/mcp/documentHelpers.js +49 -62
- 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 +82 -1
- package/dist/mcp/runtime.js +4285 -1925
- 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 +215 -27
- 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 +12 -1
- package/dist/mcp/toolProfiles.js +43 -0
- package/dist/mcp/toolRegistry.d.ts +17 -2
- package/dist/mcp/toolRegistry.js +24 -9
- 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/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 +574 -1
- 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 +1 -3
- 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/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 -41
- 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 -109
- package/dist/resources/templates/workflows/do.yaml +0 -87
- package/dist/resources/templates/workflows/evaluate.yaml +0 -116
- package/dist/resources/templates/workflows/execute.yaml +0 -156
- package/dist/resources/templates/workflows/plan.yaml +0 -118
- package/dist/resources/templates/workflows/review.yaml +0 -114
- 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-C4LcqhcZ.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-B-Dq22d2.js +0 -3
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +0 -1
- package/dist/ui/assets/ContextAttachmentManager-DsXPTvi-.js +0 -3
- package/dist/ui/assets/DocumentWorkspace-CxA1wO3U.js +0 -252
- package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +0 -1
- package/dist/ui/assets/EntityActivityTimeline-B8nSe8l3.js +0 -1
- package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +0 -1
- package/dist/ui/assets/InitiativesModule-VY95v38E.js +0 -1
- package/dist/ui/assets/PlansPage-CQbKDv1a.js +0 -1
- package/dist/ui/assets/PlansPage-DeAzWYTb.css +0 -1
- package/dist/ui/assets/TaskContextUpload-DvDlNpHC.js +0 -1
- package/dist/ui/assets/TaskSettings-CUWbYYtP.js +0 -12
- package/dist/ui/assets/WorkflowsModule-CgM3Jako.js +0 -5
- package/dist/ui/assets/documentReferences-Do9YjrS3.js +0 -1
- package/dist/ui/assets/index--mh3pktj.js +0 -5
- package/dist/ui/assets/index-BawaaEXS.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 -109
- package/src/resources/templates/workflows/do.yaml +0 -87
- package/src/resources/templates/workflows/evaluate.yaml +0 -116
- package/src/resources/templates/workflows/execute.yaml +0 -156
- package/src/resources/templates/workflows/plan.yaml +0 -118
- package/src/resources/templates/workflows/review.yaml +0 -114
- /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 {
|
|
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);
|
|
@@ -442,7 +502,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
442
502
|
const authSessionLastCheckedAtRef = useRef(0);
|
|
443
503
|
const authSessionLastResultRef = useRef(hasOptimisticLocalAuth);
|
|
444
504
|
const currentWorkspaceIdRef = useRef(currentWorkspaceId);
|
|
445
|
-
const pendingPersistedTaxonomyUiStateRef = useRef(null);
|
|
446
505
|
const explicitWorkspaceSelectionRef = useRef(null);
|
|
447
506
|
const workspaceTransitionEpochRef = useRef(0);
|
|
448
507
|
const bootstrapTraceSeedRef = useRef((() => {
|
|
@@ -464,7 +523,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
464
523
|
if (!nextWorkspaceId)
|
|
465
524
|
return;
|
|
466
525
|
const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim();
|
|
467
|
-
if (previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
|
|
526
|
+
if (!options?.skipTransitionReset && previousWorkspaceId && previousWorkspaceId !== nextWorkspaceId) {
|
|
468
527
|
workspaceTransitionEpochRef.current += 1;
|
|
469
528
|
setWorkspaceTransitionEpoch(workspaceTransitionEpochRef.current);
|
|
470
529
|
}
|
|
@@ -495,6 +554,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
495
554
|
workspaceId: String(currentWorkspaceIdRef.current || 'default').trim() || 'default',
|
|
496
555
|
epoch: workspaceTransitionEpochRef.current
|
|
497
556
|
}), []);
|
|
557
|
+
const getCurrentWorkspaceId = useCallback(() => currentWorkspaceIdRef.current, []);
|
|
498
558
|
const isWorkspaceRequestStale = useCallback((requestState) => {
|
|
499
559
|
const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
500
560
|
return liveWorkspaceId !== requestState.workspaceId || workspaceTransitionEpochRef.current !== requestState.epoch;
|
|
@@ -541,7 +601,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
541
601
|
const [buildInfo, setBuildInfo] = useState(null);
|
|
542
602
|
const [keyShortcut, setKeyShortcut] = useState(mergedConfig.shortcut || 'Alt+T');
|
|
543
603
|
const [priorities, setPriorities] = useState(mergedConfig.priorities || []);
|
|
544
|
-
const [approaches] = useState(cloneDefaultWorkflowDefinitions());
|
|
545
604
|
const [mcpHostRoot, setMcpHostRoot] = useState('');
|
|
546
605
|
const [jsonBackupEnabled, setJsonBackupEnabled] = useState(false);
|
|
547
606
|
const [globalJsonBackupEnabled, setGlobalJsonBackupEnabled] = useState(false);
|
|
@@ -559,7 +618,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
559
618
|
});
|
|
560
619
|
const [manualComplexityEnabled, setManualComplexityEnabled] = useState(false);
|
|
561
620
|
const [checklistDropdownEnabled, setChecklistDropdownEnabled] = useState(true);
|
|
562
|
-
const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(
|
|
621
|
+
const [showTaskCardStatusLabel, setShowTaskCardStatusLabel] = useState(false);
|
|
563
622
|
const [serverHostRoot, setServerHostRoot] = useState('');
|
|
564
623
|
const [returnTab, setReturnTab] = useState(null);
|
|
565
624
|
useTaskforceApiRouting({
|
|
@@ -567,22 +626,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
567
626
|
resolveApiUrl,
|
|
568
627
|
runtimeMode
|
|
569
628
|
});
|
|
570
|
-
const {
|
|
629
|
+
const { initiativeTemplates, fetchInitiativeTemplates } = useInitiativeTemplates({
|
|
571
630
|
shouldDeferProtectedApiCalls,
|
|
572
631
|
shouldBlockProtectedApiCalls
|
|
573
632
|
});
|
|
574
633
|
const { zenMode, setZenModeState, toggleZenMode } = useZenMode();
|
|
575
|
-
const { exportEnvironment, setExportEnvironment, availableEnvironments, loadAvailableEnvironments, exportWorkflowsPath, setExportWorkflowsPath, exportingResource, exportResult, handleExportWorkflows } = useResourceExport({
|
|
576
|
-
storagePath,
|
|
577
|
-
shouldDeferProtectedApiCalls,
|
|
578
|
-
shouldBlockProtectedApiCalls
|
|
579
|
-
});
|
|
580
634
|
// Unsaved Changes Modal State
|
|
581
635
|
const [unsavedModalOpen, setUnsavedModalOpen] = useState(false);
|
|
582
636
|
const [pendingNavigation, setPendingNavigation] = useState(null);
|
|
583
637
|
// === SECTION: UI Notice ===
|
|
584
638
|
// Delegated to useUiNotice — see src/hooks/useUiNotice.ts
|
|
585
639
|
const { uiNotice, pushNotice, clearNotice } = useUiNotice();
|
|
640
|
+
const uiNoticeRef = useRef(uiNotice);
|
|
641
|
+
uiNoticeRef.current = uiNotice;
|
|
586
642
|
const [taskReturnTrail, setTaskReturnTrail] = useState([]);
|
|
587
643
|
const tasksScrollRef = useRef(null);
|
|
588
644
|
const [tasksScrollPos, setTasksScrollPos] = useState(0);
|
|
@@ -601,9 +657,21 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
601
657
|
const [initiatives, setInitiatives] = useState([]);
|
|
602
658
|
const [workstreams, setWorkstreams] = useState([]);
|
|
603
659
|
const [planningBootstrapTaskSummaries, setPlanningBootstrapTaskSummaries] = useState([]);
|
|
660
|
+
const [planningLoadState, setPlanningLoadState] = useState(createInitialPlanningLoadState);
|
|
604
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);
|
|
605
667
|
const [loadingTasks, setLoadingTasks] = useState(false);
|
|
606
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]);
|
|
607
675
|
const [showMarkdownHelp, setShowMarkdownHelp] = useState(false);
|
|
608
676
|
// copiedId is managed by useTaskMutations below.
|
|
609
677
|
// Custom categories
|
|
@@ -769,6 +837,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
769
837
|
// Form state
|
|
770
838
|
const [loading, setLoading] = useState(false);
|
|
771
839
|
const [error, setError] = useState('');
|
|
840
|
+
const clearTaskError = useCallback(() => setError(''), []);
|
|
772
841
|
const AUTH_REQUIRED_ERROR = 'Authentication required. Sign in to continue.';
|
|
773
842
|
const [referenceDataLoaded, setReferenceDataLoaded] = useState(false);
|
|
774
843
|
const [assigneeOptionsLoaded, setAssigneeOptionsLoaded] = useState(false);
|
|
@@ -789,7 +858,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
789
858
|
setTasks,
|
|
790
859
|
setArchivedTasks,
|
|
791
860
|
setLoadingTasks,
|
|
792
|
-
getCurrentWorkspaceId
|
|
861
|
+
getCurrentWorkspaceId,
|
|
793
862
|
workspaceResetKey: `${currentWorkspaceId}:${workspaceTransitionEpoch}`,
|
|
794
863
|
shouldDeferProtectedApiCalls,
|
|
795
864
|
shouldBlockProtectedApiCalls,
|
|
@@ -800,36 +869,37 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
800
869
|
if (workspaceTransitionEpoch === 0)
|
|
801
870
|
return;
|
|
802
871
|
referenceDataRequestRef.current = null;
|
|
803
|
-
lastLoadedUiStateKeyRef.current = '';
|
|
804
872
|
lastAssigneeOptionsLoadKeyRef.current = '';
|
|
805
873
|
lastConfigRefreshKeyRef.current = '';
|
|
806
874
|
lastWorkspaceSyncStateLoadKeyRef.current = '';
|
|
807
875
|
lastTaskSurfaceLoadKeyRef.current = '';
|
|
808
876
|
lastSettingsSurfaceLoadKeyRef.current = '';
|
|
809
|
-
setUiStateReady(false);
|
|
810
877
|
setReferenceDataLoaded(false);
|
|
811
878
|
setAssigneeOptions(createDefaultAssigneeOptions());
|
|
812
879
|
setAssigneeOptionsLoaded(false);
|
|
813
880
|
setDeletedTasks([]);
|
|
881
|
+
setArchiveHydratedWorkspaceId(null);
|
|
882
|
+
setDeletedHydratedWorkspaceId(null);
|
|
883
|
+
setArchiveLookupSettledKeys(new Set());
|
|
884
|
+
archiveHydrationRequestRef.current = null;
|
|
885
|
+
deletedHydrationRequestRef.current = null;
|
|
814
886
|
setTasks([]);
|
|
815
887
|
setArchivedTasks([]);
|
|
888
|
+
setInitiatives([]);
|
|
889
|
+
setWorkstreams([]);
|
|
890
|
+
setPlanningBootstrapTaskSummaries([]);
|
|
891
|
+
setPlanningLoadState(createInitialPlanningLoadState());
|
|
892
|
+
setPendingOpenTaskId(null);
|
|
816
893
|
setLoadingTasks(false);
|
|
817
|
-
if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
|
|
818
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
819
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
820
|
-
}
|
|
821
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
822
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
823
|
-
archiveBootstrapTimerRef.current = null;
|
|
824
|
-
}
|
|
825
894
|
}, [setArchivedTasks, setLoadingTasks, setTasks, workspaceTransitionEpoch]);
|
|
826
895
|
const fetchDeletedTasks = useCallback(async (isSilent = false, options) => {
|
|
827
896
|
const ignoreAuthGuard = options?.ignoreAuthGuard === true;
|
|
828
897
|
if (!ignoreAuthGuard && (shouldDeferProtectedApiCalls || shouldBlockProtectedApiCalls))
|
|
829
|
-
return;
|
|
898
|
+
return false;
|
|
830
899
|
if (!isSilent)
|
|
831
900
|
setLoadingTasks(true);
|
|
832
901
|
const requestState = getWorkspaceRequestState();
|
|
902
|
+
deletedTasksAbortRef.current?.abort('superseded');
|
|
833
903
|
const abortController = new AbortController();
|
|
834
904
|
deletedTasksAbortRef.current = abortController;
|
|
835
905
|
try {
|
|
@@ -840,16 +910,20 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
840
910
|
if (res.status === 401) {
|
|
841
911
|
handleUnauthorized();
|
|
842
912
|
setDeletedTasks([]);
|
|
843
|
-
return;
|
|
913
|
+
return false;
|
|
844
914
|
}
|
|
845
915
|
if (res.status === 404) {
|
|
846
|
-
|
|
847
|
-
|
|
916
|
+
if (!isWorkspaceRequestStale(requestState)) {
|
|
917
|
+
setDeletedTasks([]);
|
|
918
|
+
setDeletedHydratedWorkspaceId(requestState.workspaceId);
|
|
919
|
+
return true;
|
|
920
|
+
}
|
|
921
|
+
return false;
|
|
848
922
|
}
|
|
849
923
|
if (res.ok) {
|
|
850
924
|
const data = await res.json();
|
|
851
925
|
if (isWorkspaceRequestStale(requestState)) {
|
|
852
|
-
return;
|
|
926
|
+
return false;
|
|
853
927
|
}
|
|
854
928
|
const sanitized = Array.isArray(data?.deleted)
|
|
855
929
|
? data.deleted
|
|
@@ -867,12 +941,16 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
867
941
|
.filter((entry) => Boolean(entry))
|
|
868
942
|
: [];
|
|
869
943
|
setDeletedTasks(sanitized);
|
|
944
|
+
setDeletedHydratedWorkspaceId(requestState.workspaceId);
|
|
945
|
+
return true;
|
|
870
946
|
}
|
|
947
|
+
return false;
|
|
871
948
|
}
|
|
872
949
|
catch (err) {
|
|
873
950
|
if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
|
|
874
|
-
return;
|
|
951
|
+
return false;
|
|
875
952
|
console.error('[Taskforce] Failed to fetch deleted tasks:', err);
|
|
953
|
+
return false;
|
|
876
954
|
}
|
|
877
955
|
finally {
|
|
878
956
|
if (deletedTasksAbortRef.current === abortController) {
|
|
@@ -901,6 +979,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
901
979
|
}
|
|
902
980
|
const abortController = new AbortController();
|
|
903
981
|
planningEntitiesAbortRef.current = abortController;
|
|
982
|
+
setPlanningLoadState((current) => ({
|
|
983
|
+
...current,
|
|
984
|
+
isRefreshing: true,
|
|
985
|
+
}));
|
|
904
986
|
try {
|
|
905
987
|
const planningTraceId = buildBootstrapTraceId({
|
|
906
988
|
workspaceId: requestState.workspaceId,
|
|
@@ -937,19 +1019,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
937
1019
|
}
|
|
938
1020
|
};
|
|
939
1021
|
let bootstrapPayload = null;
|
|
1022
|
+
let collectionStatus = {
|
|
1023
|
+
initiatives: 'ready',
|
|
1024
|
+
workstreams: 'ready',
|
|
1025
|
+
};
|
|
940
1026
|
const bootstrapRes = await fetchPlanningRoute('/api/taskforce/planning/bootstrap');
|
|
941
1027
|
if (bootstrapRes?.status === 401) {
|
|
942
1028
|
handleUnauthorized();
|
|
943
1029
|
setInitiatives([]);
|
|
944
1030
|
setWorkstreams([]);
|
|
945
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
|
+
});
|
|
946
1038
|
return;
|
|
947
1039
|
}
|
|
948
1040
|
if (bootstrapRes === null) {
|
|
949
1041
|
throw createBootstrapTimeoutError(PLANNING_BOOTSTRAP_REQUEST_TIMEOUT_MS);
|
|
950
1042
|
}
|
|
951
1043
|
if (bootstrapRes.ok) {
|
|
952
|
-
|
|
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);
|
|
953
1051
|
}
|
|
954
1052
|
else {
|
|
955
1053
|
const [initiativesRes, workstreamsRes] = await Promise.all([
|
|
@@ -964,15 +1062,41 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
964
1062
|
setInitiatives([]);
|
|
965
1063
|
setWorkstreams([]);
|
|
966
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
|
+
});
|
|
967
1071
|
return;
|
|
968
1072
|
}
|
|
969
|
-
const
|
|
970
|
-
|
|
971
|
-
|
|
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'),
|
|
972
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
|
+
}
|
|
973
1097
|
bootstrapPayload = sanitizePlanningBootstrapPayload({
|
|
974
|
-
initiatives:
|
|
975
|
-
workstreams:
|
|
1098
|
+
initiatives: initiativeResult.items,
|
|
1099
|
+
workstreams: workstreamResult.items,
|
|
976
1100
|
workstreamTaskSummaries: [],
|
|
977
1101
|
});
|
|
978
1102
|
}
|
|
@@ -982,6 +1106,14 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
982
1106
|
setInitiatives(bootstrapPayload.initiatives);
|
|
983
1107
|
setWorkstreams(bootstrapPayload.workstreams);
|
|
984
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
|
+
});
|
|
985
1117
|
}
|
|
986
1118
|
catch (err) {
|
|
987
1119
|
if (isExpectedWorkspaceAbortFailure(err, abortController.signal) || isAbortError(err))
|
|
@@ -998,6 +1130,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
998
1130
|
else {
|
|
999
1131
|
console.error('[Taskforce] Failed to fetch planning entities:', err);
|
|
1000
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
|
+
}
|
|
1001
1146
|
if (typeof window !== 'undefined'
|
|
1002
1147
|
&& !isWorkspaceRequestStale(requestState)
|
|
1003
1148
|
&& initiatives.length === 0
|
|
@@ -1025,31 +1170,167 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1025
1170
|
shouldBlockProtectedApiCalls,
|
|
1026
1171
|
workstreams.length,
|
|
1027
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]);
|
|
1028
1195
|
const fetchTasks = useCallback(async (isSilent = false, options) => {
|
|
1029
1196
|
await fetchTasksBase(isSilent, options);
|
|
1030
1197
|
}, [fetchTasksBase]);
|
|
1031
1198
|
const fetchArchive = useCallback(async (isSilent = false, options) => {
|
|
1032
|
-
|
|
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;
|
|
1033
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]);
|
|
1034
1249
|
const refreshTaskCollections = useCallback(async (options) => {
|
|
1035
1250
|
const isSilent = options?.isSilent !== false;
|
|
1036
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;
|
|
1037
1255
|
await Promise.all([
|
|
1038
|
-
refreshTaskCollectionsBase({
|
|
1039
|
-
|
|
1256
|
+
refreshTaskCollectionsBase({
|
|
1257
|
+
isSilent,
|
|
1258
|
+
ignoreAuthGuard,
|
|
1259
|
+
includeArchive,
|
|
1260
|
+
highlightChangedTaskIds: options?.highlightChangedTaskIds,
|
|
1261
|
+
}),
|
|
1262
|
+
includeDeleted
|
|
1263
|
+
? fetchDeletedTasks(isSilent, { ignoreAuthGuard })
|
|
1264
|
+
: Promise.resolve(false),
|
|
1040
1265
|
fetchPlanningEntities({ ignoreAuthGuard }),
|
|
1041
1266
|
]);
|
|
1042
|
-
}, [
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
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
|
+
}, []);
|
|
1048
1329
|
const setUserGlobalSyncStatusRef = useRef(() => undefined);
|
|
1049
1330
|
const setUserGlobalSyncErrorRef = useRef(() => undefined);
|
|
1050
1331
|
const checkAuthSessionImplRef = useRef(async () => false);
|
|
1051
1332
|
const checkAuthSession = useCallback((options) => checkAuthSessionImplRef.current(options), []);
|
|
1052
|
-
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({
|
|
1053
1334
|
currentWorkspaceId,
|
|
1054
1335
|
cloudAuthConfigured,
|
|
1055
1336
|
runtimeMode,
|
|
@@ -1060,6 +1341,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1060
1341
|
resolveCloudAuthUrl,
|
|
1061
1342
|
resolveWebSocketUrl,
|
|
1062
1343
|
realtimeSyncEnabled,
|
|
1344
|
+
localOutboxDispatchEnabled: runtimeConfigOverride.syncV3LocalOutboxDispatch,
|
|
1345
|
+
localCoordinatorBrowserAuthorityGateEnabled: runtimeConfigOverride.localCoordinatorBrowserAuthorityGate,
|
|
1346
|
+
initiativeFeedActivationEnabled: runtimeConfigOverride.syncV3InitiativeFeedActivation,
|
|
1347
|
+
combinedFeedActivationEnabled: runtimeConfigOverride.syncV3CombinedFeedActivation,
|
|
1348
|
+
combinedFeedCoverage: runtimeConfigOverride.syncV3CombinedFeedCoverage,
|
|
1063
1349
|
tasks,
|
|
1064
1350
|
archivedTasks,
|
|
1065
1351
|
deletedTasks,
|
|
@@ -1094,20 +1380,50 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1094
1380
|
const [priority, setPriority] = useState(2);
|
|
1095
1381
|
const [complexity, setComplexity] = useState(3);
|
|
1096
1382
|
const [status, setStatus] = useState('task');
|
|
1097
|
-
const [approach, setApproach] = useState('default');
|
|
1098
1383
|
const [assignee, setAssignee] = useState('unassigned');
|
|
1099
1384
|
const [scheduledDate, setScheduledDate] = useState('');
|
|
1100
1385
|
const [dueDate, setDueDate] = useState('');
|
|
1101
1386
|
const [workstreamInput, setWorkstreamInput] = useState('');
|
|
1102
1387
|
const [title, setTitle] = useState('');
|
|
1103
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]);
|
|
1104
1418
|
const [checklistItems, setChecklistItems] = useState([]);
|
|
1105
1419
|
const [comments, setComments] = useState([]);
|
|
1106
1420
|
const [newCommentText, setNewCommentText] = useState('');
|
|
1107
1421
|
const [formTaxonomies, setFormTaxonomies] = useState({});
|
|
1108
1422
|
const commentsEndRef = useRef(null);
|
|
1109
|
-
const [showChecklist, setShowChecklist] = useState(false);
|
|
1110
1423
|
const [lastUsedCategory, setLastUsedCategory] = useState('');
|
|
1424
|
+
const [taskforceAgentId, setTaskforceAgentId] = useState('');
|
|
1425
|
+
const [taskforceAgentConversationId, setTaskforceAgentConversationId] = useState('');
|
|
1426
|
+
const [taskforceAgentConversationByAgentId, setTaskforceAgentConversationByAgentId] = useState({});
|
|
1111
1427
|
useEffect(() => {
|
|
1112
1428
|
if (editingTaskId)
|
|
1113
1429
|
return;
|
|
@@ -1176,37 +1492,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1176
1492
|
});
|
|
1177
1493
|
checkAuthSessionImplRef.current = checkAuthSessionImpl;
|
|
1178
1494
|
const [activeWorkspaceModule, setActiveWorkspaceModuleState] = useState('tasks');
|
|
1179
|
-
const [showComments, setShowComments] = useState(false);
|
|
1180
1495
|
const [descriptionFocused, setDescriptionFocused] = useState(false);
|
|
1181
1496
|
const [isCapturingScreenshot, setIsCapturingScreenshot] = useState(false);
|
|
1182
1497
|
const [attachments, setAttachments] = useState([]);
|
|
1183
1498
|
const [attachmentsDirty, setAttachmentsDirty] = useState(false);
|
|
1184
1499
|
const dataVersionRef = useRef(null);
|
|
1185
|
-
const
|
|
1186
|
-
const archiveBootstrapTimerRef = useRef(null);
|
|
1500
|
+
const ambiguousRealtimeConfirmationTimerRef = useRef(null);
|
|
1187
1501
|
const skippedInitialTaskTabRefreshRef = useRef(false);
|
|
1188
1502
|
const authSessionResolvedRef = useRef(authSessionResolved);
|
|
1189
1503
|
const authRequiredForApiRef = useRef(authRequiredForApi);
|
|
1190
1504
|
const isAuthenticatedRef = useRef(isAuthenticated);
|
|
1191
|
-
const hasLoadedUiStateRef = useRef(false);
|
|
1192
|
-
const lastLoadedUiStateKeyRef = useRef('');
|
|
1193
1505
|
const lastAssigneeOptionsLoadKeyRef = useRef('');
|
|
1194
1506
|
const lastConfigRefreshKeyRef = useRef('');
|
|
1195
1507
|
const lastWorkspaceSyncStateLoadKeyRef = useRef('');
|
|
1196
1508
|
const lastTaskSurfaceLoadKeyRef = useRef('');
|
|
1197
1509
|
const lastSettingsSurfaceLoadKeyRef = useRef('');
|
|
1198
|
-
const skipNextUiStatePersistRef = useRef(false);
|
|
1199
|
-
const activeWorkspaceModuleOverridePendingRef = useRef(false);
|
|
1200
1510
|
const referenceDataRequestRef = useRef(null);
|
|
1201
1511
|
const workspaceListHydratedRef = useRef(false);
|
|
1202
1512
|
const hasBootstrappedDataRef = useRef(false);
|
|
1203
|
-
const [uiStateReady, setUiStateReady] = useState(false);
|
|
1204
|
-
const setActiveWorkspaceModule = useCallback((nextModule) => {
|
|
1205
|
-
if (!uiStateReady) {
|
|
1206
|
-
activeWorkspaceModuleOverridePendingRef.current = true;
|
|
1207
|
-
}
|
|
1208
|
-
setActiveWorkspaceModuleState(nextModule);
|
|
1209
|
-
}, [uiStateReady]);
|
|
1210
1513
|
const { handleSaveSettings, handleSaveTheme, handleSaveGlobalTheme, handleJsonBackupEnabledChange, handleSaveGlobalJsonBackupEnabled, handleSaveGlobalWeekStartsOn, handleSaveLocale, handleManualComplexityEnabledChange, handleChecklistDropdownEnabledChange, handleShowTaskCardStatusLabelChange, handleResetProjectToGlobal } = useSettingsPersistence({
|
|
1211
1514
|
keyShortcut,
|
|
1212
1515
|
themeUseGlobalDefault,
|
|
@@ -1224,8 +1527,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1224
1527
|
setLocale,
|
|
1225
1528
|
setManualComplexityEnabled,
|
|
1226
1529
|
setChecklistDropdownEnabled,
|
|
1227
|
-
setShowTaskCardStatusLabel
|
|
1228
|
-
setShowChecklist
|
|
1530
|
+
setShowTaskCardStatusLabel
|
|
1229
1531
|
});
|
|
1230
1532
|
useEffect(() => {
|
|
1231
1533
|
if (runtimeMode !== 'cloud')
|
|
@@ -1239,233 +1541,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1239
1541
|
authRequiredForApiRef.current = authRequiredForApi;
|
|
1240
1542
|
isAuthenticatedRef.current = isAuthenticated;
|
|
1241
1543
|
}, [authSessionResolved, authRequiredForApi, isAuthenticated]);
|
|
1242
|
-
const
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
pendingPersistedTaxonomyUiStateRef.current = null;
|
|
1253
|
-
return;
|
|
1254
|
-
}
|
|
1255
|
-
const hasPersistedTaxonomyFilterState = Array.isArray(state.filterCategories)
|
|
1256
|
-
|| Array.isArray(state.filterPriorities)
|
|
1257
|
-
|| Array.isArray(state.filterTypes)
|
|
1258
|
-
|| (state.filterTaxonomies && typeof state.filterTaxonomies === 'object');
|
|
1259
|
-
if (!hasPersistedTaxonomyFilterState) {
|
|
1260
|
-
pendingPersistedTaxonomyUiStateRef.current = null;
|
|
1261
|
-
}
|
|
1262
|
-
const hasPersistedFilterState = Array.isArray(state.filterCategories)
|
|
1263
|
-
|| Array.isArray(state.filterPriorities)
|
|
1264
|
-
|| Array.isArray(state.filterTypes)
|
|
1265
|
-
|| Array.isArray(state.filterStatus)
|
|
1266
|
-
|| Array.isArray(state.filterAssignees)
|
|
1267
|
-
|| typeof state.filterAssigneesAllSelected === 'boolean'
|
|
1268
|
-
|| (state.filterTaxonomies && typeof state.filterTaxonomies === 'object');
|
|
1269
|
-
const canCompareTaxonomySignature = currentFilterTaxonomySignature !== null;
|
|
1270
|
-
if (hasPersistedTaxonomyFilterState && !canCompareTaxonomySignature) {
|
|
1271
|
-
pendingPersistedTaxonomyUiStateRef.current = {
|
|
1272
|
-
state,
|
|
1273
|
-
skipActiveWorkspaceModule: options?.skipActiveWorkspaceModule
|
|
1274
|
-
};
|
|
1275
|
-
}
|
|
1276
|
-
const canApplyTaxonomyFilters = hasPersistedTaxonomyFilterState
|
|
1277
|
-
&& canCompareTaxonomySignature
|
|
1278
|
-
&& areFilterTaxonomySignaturesEqual(state.filterTaxonomySignature, currentFilterTaxonomySignature);
|
|
1279
|
-
const shouldResetTaxonomyFilters = hasPersistedTaxonomyFilterState
|
|
1280
|
-
&& canCompareTaxonomySignature
|
|
1281
|
-
&& !canApplyTaxonomyFilters;
|
|
1282
|
-
const taxonomyFiltersAreReady = !hasPersistedTaxonomyFilterState || canApplyTaxonomyFilters || shouldResetTaxonomyFilters;
|
|
1283
|
-
if (!options?.skipActiveWorkspaceModule) {
|
|
1284
|
-
if (typeof state.activeWorkspaceModule === 'string') {
|
|
1285
|
-
setActiveWorkspaceModuleState(state.activeWorkspaceModule);
|
|
1286
|
-
}
|
|
1287
|
-
else if (state.groupBy === 'docs') {
|
|
1288
|
-
setActiveWorkspaceModuleState('docs');
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
if (state.groupBy && state.groupBy !== 'docs')
|
|
1292
|
-
setGroupBy(state.groupBy);
|
|
1293
|
-
if (state.emptyColumnMode === 'show' || state.emptyColumnMode === 'collapse' || state.emptyColumnMode === 'hide')
|
|
1294
|
-
setEmptyColumnMode(state.emptyColumnMode);
|
|
1295
|
-
if (typeof state.zenMode === 'boolean')
|
|
1296
|
-
setZenModeState(state.zenMode);
|
|
1297
|
-
if (typeof state.searchQuery === 'string')
|
|
1298
|
-
setSearchQuery(state.searchQuery);
|
|
1299
|
-
if (canApplyTaxonomyFilters) {
|
|
1300
|
-
if (Array.isArray(state.filterCategories))
|
|
1301
|
-
setFilterCategories(state.filterCategories);
|
|
1302
|
-
if (Array.isArray(state.filterPriorities))
|
|
1303
|
-
setFilterPriorities(state.filterPriorities);
|
|
1304
|
-
if (Array.isArray(state.filterTypes))
|
|
1305
|
-
setFilterTypes(state.filterTypes);
|
|
1306
|
-
if (state.filterTaxonomies && typeof state.filterTaxonomies === 'object')
|
|
1307
|
-
setFilterTaxonomies(state.filterTaxonomies);
|
|
1308
|
-
}
|
|
1309
|
-
else if (shouldResetTaxonomyFilters) {
|
|
1310
|
-
setFilterCategories(activeCategories.map((category) => category.value));
|
|
1311
|
-
setFilterPriorities(priorities.map((priority) => priority.value));
|
|
1312
|
-
setFilterTypes(activeTypes.map((type) => type.value));
|
|
1313
|
-
setFilterTaxonomies({});
|
|
1314
|
-
}
|
|
1315
|
-
if (Array.isArray(state.filterStatus))
|
|
1316
|
-
setFilterStatus(state.filterStatus);
|
|
1317
|
-
if (Array.isArray(state.filterAssignees))
|
|
1318
|
-
setFilterAssignees(state.filterAssignees);
|
|
1319
|
-
if (typeof state.filterAssigneesAllSelected === 'boolean')
|
|
1320
|
-
setFilterAssigneesAllSelected(state.filterAssigneesAllSelected);
|
|
1321
|
-
if (state.sortBy === 'created' || state.sortBy === 'priority' || state.sortBy === 'updated' || state.sortBy === 'complexity')
|
|
1322
|
-
setSortBy(state.sortBy);
|
|
1323
|
-
if (state.sortOrder === 'asc' || state.sortOrder === 'desc')
|
|
1324
|
-
setSortOrder(state.sortOrder);
|
|
1325
|
-
if (shouldResetTaxonomyFilters) {
|
|
1326
|
-
setHasInitedFilters(true);
|
|
1327
|
-
}
|
|
1328
|
-
else if (typeof state.hasInitedFilters === 'boolean' && taxonomyFiltersAreReady) {
|
|
1329
|
-
setHasInitedFilters(state.hasInitedFilters);
|
|
1330
|
-
}
|
|
1331
|
-
else if (hasPersistedFilterState && taxonomyFiltersAreReady) {
|
|
1332
|
-
setHasInitedFilters(true);
|
|
1333
|
-
}
|
|
1334
|
-
if (typeof state.showChecklist === 'boolean')
|
|
1335
|
-
setShowChecklist(state.showChecklist);
|
|
1336
|
-
if (typeof state.lastCategory === 'string')
|
|
1337
|
-
setLastUsedCategory(state.lastCategory);
|
|
1338
|
-
if (typeof state.exportEnvironment === 'string' && state.exportEnvironment.trim().length > 0) {
|
|
1339
|
-
setExportEnvironment(state.exportEnvironment.trim());
|
|
1340
|
-
}
|
|
1341
|
-
}, [activeCategories, activeTypes, currentFilterTaxonomySignature, priorities]);
|
|
1342
|
-
useEffect(() => {
|
|
1343
|
-
if (!currentFilterTaxonomySignature || !pendingPersistedTaxonomyUiStateRef.current)
|
|
1344
|
-
return;
|
|
1345
|
-
const pending = pendingPersistedTaxonomyUiStateRef.current;
|
|
1346
|
-
pendingPersistedTaxonomyUiStateRef.current = null;
|
|
1347
|
-
applyPersistedUiState(pending.state, {
|
|
1348
|
-
skipActiveWorkspaceModule: pending.skipActiveWorkspaceModule
|
|
1349
|
-
});
|
|
1350
|
-
}, [applyPersistedUiState, currentFilterTaxonomySignature]);
|
|
1351
|
-
const loadPersistedUiState = useCallback(async (workspaceIdOverride) => {
|
|
1352
|
-
const targetWorkspaceId = String(workspaceIdOverride || currentWorkspaceIdRef.current || currentWorkspaceId || 'default').trim() || 'default';
|
|
1353
|
-
const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${targetWorkspaceId}`;
|
|
1354
|
-
try {
|
|
1355
|
-
const res = await fetch(`/api/taskforce/ui-state?key=app&workspaceId=${encodeURIComponent(targetWorkspaceId)}`, {
|
|
1356
|
-
method: 'GET',
|
|
1357
|
-
credentials: 'include'
|
|
1358
|
-
});
|
|
1359
|
-
const data = res.ok ? await res.json().catch(() => ({})) : {};
|
|
1360
|
-
const serverState = (data?.state && typeof data.state === 'object')
|
|
1361
|
-
? data.state
|
|
1362
|
-
: null;
|
|
1363
|
-
const localState = readPersistedAppUiState(workspaceUiStateScope);
|
|
1364
|
-
const state = serverState || localState
|
|
1365
|
-
? {
|
|
1366
|
-
...(localState || {}),
|
|
1367
|
-
...(serverState || {})
|
|
1368
|
-
}
|
|
1369
|
-
: null;
|
|
1370
|
-
if (currentWorkspaceIdRef.current !== targetWorkspaceId) {
|
|
1371
|
-
return;
|
|
1372
|
-
}
|
|
1373
|
-
applyPersistedUiState(state, {
|
|
1374
|
-
skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
|
|
1375
|
-
});
|
|
1376
|
-
lastLoadedUiStateKeyRef.current = uiStateLoadKey;
|
|
1377
|
-
}
|
|
1378
|
-
catch {
|
|
1379
|
-
const localState = readPersistedAppUiState(workspaceUiStateScope);
|
|
1380
|
-
if (currentWorkspaceIdRef.current === targetWorkspaceId) {
|
|
1381
|
-
applyPersistedUiState(localState, {
|
|
1382
|
-
skipActiveWorkspaceModule: activeWorkspaceModuleOverridePendingRef.current
|
|
1383
|
-
});
|
|
1384
|
-
lastLoadedUiStateKeyRef.current = uiStateLoadKey;
|
|
1385
|
-
}
|
|
1386
|
-
}
|
|
1387
|
-
finally {
|
|
1388
|
-
if (currentWorkspaceIdRef.current !== targetWorkspaceId)
|
|
1389
|
-
return;
|
|
1390
|
-
activeWorkspaceModuleOverridePendingRef.current = false;
|
|
1391
|
-
skipNextUiStatePersistRef.current = true;
|
|
1392
|
-
setUiStateReady(true);
|
|
1393
|
-
}
|
|
1394
|
-
}, [applyPersistedUiState, currentWorkspaceId, runtimeMode, workspaceUiStateScope]);
|
|
1395
|
-
useEffect(() => {
|
|
1396
|
-
const uiStateLoadKey = `${runtimeMode}:${workspaceUiStateScope}:${currentWorkspaceId}`;
|
|
1397
|
-
if (!hasLoadedUiStateRef.current)
|
|
1398
|
-
return;
|
|
1399
|
-
if (lastLoadedUiStateKeyRef.current === uiStateLoadKey)
|
|
1400
|
-
return;
|
|
1401
|
-
setUiStateReady(false);
|
|
1402
|
-
void loadPersistedUiState(currentWorkspaceId);
|
|
1403
|
-
}, [currentWorkspaceId, loadPersistedUiState, runtimeMode, workspaceUiStateScope]);
|
|
1404
|
-
useEffect(() => {
|
|
1405
|
-
if (!uiStateReady)
|
|
1406
|
-
return;
|
|
1407
|
-
if (skipNextUiStatePersistRef.current) {
|
|
1408
|
-
skipNextUiStatePersistRef.current = false;
|
|
1409
|
-
return;
|
|
1410
|
-
}
|
|
1411
|
-
const uiStateSnapshot = {
|
|
1412
|
-
groupBy,
|
|
1413
|
-
activeWorkspaceModule,
|
|
1414
|
-
emptyColumnMode,
|
|
1415
|
-
zenMode,
|
|
1416
|
-
searchQuery,
|
|
1417
|
-
filterCategories,
|
|
1418
|
-
filterPriorities,
|
|
1419
|
-
filterTypes,
|
|
1420
|
-
filterStatus,
|
|
1421
|
-
filterAssignees,
|
|
1422
|
-
filterAssigneesAllSelected,
|
|
1423
|
-
filterTaxonomies,
|
|
1424
|
-
...(currentFilterTaxonomySignature ? { filterTaxonomySignature: currentFilterTaxonomySignature } : {}),
|
|
1425
|
-
sortBy,
|
|
1426
|
-
sortOrder,
|
|
1427
|
-
hasInitedFilters,
|
|
1428
|
-
showChecklist,
|
|
1429
|
-
lastCategory: lastUsedCategory || '',
|
|
1430
|
-
exportEnvironment
|
|
1431
|
-
};
|
|
1432
|
-
writePersistedAppUiState(uiStateSnapshot, workspaceUiStateScope);
|
|
1433
|
-
const timeoutId = window.setTimeout(async () => {
|
|
1434
|
-
try {
|
|
1435
|
-
await persistRemoteUiState({
|
|
1436
|
-
stateKey: 'app',
|
|
1437
|
-
workspaceId: currentWorkspaceIdRef.current,
|
|
1438
|
-
patch: uiStateSnapshot
|
|
1439
|
-
});
|
|
1440
|
-
}
|
|
1441
|
-
catch {
|
|
1442
|
-
// ignore persistence errors
|
|
1443
|
-
}
|
|
1444
|
-
}, 250);
|
|
1445
|
-
return () => window.clearTimeout(timeoutId);
|
|
1446
|
-
}, [
|
|
1447
|
-
uiStateReady,
|
|
1448
|
-
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,
|
|
1449
1554
|
activeWorkspaceModule,
|
|
1555
|
+
setActiveWorkspaceModuleState,
|
|
1556
|
+
groupBy,
|
|
1557
|
+
setGroupBy,
|
|
1450
1558
|
emptyColumnMode,
|
|
1559
|
+
setEmptyColumnMode,
|
|
1560
|
+
taskScope,
|
|
1561
|
+
setTaskScope,
|
|
1562
|
+
openTaskId: editingTaskId,
|
|
1563
|
+
setPendingOpenTaskId: setPendingOpenTaskIdFromPersistedState,
|
|
1564
|
+
compressedCards,
|
|
1565
|
+
setCompressedCards,
|
|
1451
1566
|
zenMode,
|
|
1567
|
+
setZenModeState,
|
|
1452
1568
|
searchQuery,
|
|
1569
|
+
setSearchQuery,
|
|
1570
|
+
collapsedCategories,
|
|
1571
|
+
setCollapsedCategories,
|
|
1453
1572
|
filterCategories,
|
|
1573
|
+
setFilterCategories,
|
|
1454
1574
|
filterPriorities,
|
|
1575
|
+
setFilterPriorities,
|
|
1455
1576
|
filterTypes,
|
|
1577
|
+
setFilterTypes,
|
|
1456
1578
|
filterStatus,
|
|
1579
|
+
setFilterStatus,
|
|
1457
1580
|
filterAssignees,
|
|
1581
|
+
setFilterAssignees,
|
|
1458
1582
|
filterAssigneesAllSelected,
|
|
1583
|
+
setFilterAssigneesAllSelected,
|
|
1459
1584
|
filterTaxonomies,
|
|
1460
|
-
|
|
1585
|
+
setFilterTaxonomies,
|
|
1461
1586
|
sortBy,
|
|
1587
|
+
setSortBy,
|
|
1462
1588
|
sortOrder,
|
|
1589
|
+
setSortOrder,
|
|
1463
1590
|
hasInitedFilters,
|
|
1464
|
-
|
|
1591
|
+
setHasInitedFilters,
|
|
1465
1592
|
lastUsedCategory,
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1593
|
+
setLastUsedCategory,
|
|
1594
|
+
taskforceAgentId,
|
|
1595
|
+
setTaskforceAgentId,
|
|
1596
|
+
taskforceAgentConversationId,
|
|
1597
|
+
setTaskforceAgentConversationId,
|
|
1598
|
+
taskforceAgentConversationByAgentId,
|
|
1599
|
+
setTaskforceAgentConversationByAgentId
|
|
1600
|
+
});
|
|
1469
1601
|
const applyBootstrapConfig = useCallback((data) => {
|
|
1470
1602
|
const nextRuntimeMode = data.runtimeMode === 'cloud' ? 'cloud' : 'local';
|
|
1471
1603
|
const nextAuthRequiredForApi = Boolean(data.authRequiredForApi);
|
|
@@ -1488,7 +1620,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1488
1620
|
if (typeof data.workspaceId === 'string' && data.workspaceId.trim().length > 0) {
|
|
1489
1621
|
const nextWorkspaceId = data.workspaceId.trim();
|
|
1490
1622
|
if (nextRuntimeMode === 'local') {
|
|
1491
|
-
|
|
1623
|
+
const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim() || 'default';
|
|
1624
|
+
commitCurrentWorkspaceId(nextWorkspaceId, {
|
|
1625
|
+
skipTransitionReset: !configLoaded && previousWorkspaceId === 'default'
|
|
1626
|
+
});
|
|
1492
1627
|
}
|
|
1493
1628
|
else {
|
|
1494
1629
|
applyResolvedWorkspaceId(nextWorkspaceId);
|
|
@@ -1591,9 +1726,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1591
1726
|
setShowTaskCardStatusLabel(data.showTaskCardStatusLabel);
|
|
1592
1727
|
}
|
|
1593
1728
|
else {
|
|
1594
|
-
setShowTaskCardStatusLabel(
|
|
1729
|
+
setShowTaskCardStatusLabel(false);
|
|
1595
1730
|
}
|
|
1596
|
-
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId]);
|
|
1731
|
+
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId, configLoaded, currentWorkspaceIdRef]);
|
|
1597
1732
|
const fetchBuildInfo = useCallback(async () => {
|
|
1598
1733
|
const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
1599
1734
|
try {
|
|
@@ -1636,9 +1771,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1636
1771
|
fetchBuildInfo,
|
|
1637
1772
|
markBootstrapPhase,
|
|
1638
1773
|
markBootstrapStalled,
|
|
1639
|
-
fetchWorkflows,
|
|
1640
1774
|
fetchInitiativeTemplates,
|
|
1641
|
-
loadAvailableEnvironments,
|
|
1642
1775
|
setReferenceDataLoaded,
|
|
1643
1776
|
setCustomCategories,
|
|
1644
1777
|
setCustomTypes,
|
|
@@ -1689,11 +1822,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1689
1822
|
settingsSection,
|
|
1690
1823
|
workspaceBootstrapPending,
|
|
1691
1824
|
fetchTasks,
|
|
1692
|
-
fetchArchive,
|
|
1693
1825
|
fetchPlanningEntities,
|
|
1694
1826
|
refreshTaskCollections,
|
|
1695
1827
|
loadWorkspaceSyncState,
|
|
1696
|
-
|
|
1828
|
+
switchLocalCoordinatorWorkspace,
|
|
1697
1829
|
hasBootstrappedDataRef
|
|
1698
1830
|
});
|
|
1699
1831
|
const refreshSetupContext = useCallback(async () => {
|
|
@@ -1749,8 +1881,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1749
1881
|
const result = await runCloudBootstrap({
|
|
1750
1882
|
reason: 'post-plans',
|
|
1751
1883
|
ignoreAuthGuard: true,
|
|
1752
|
-
tasksSilent: true
|
|
1753
|
-
includeDeferredArchive: false
|
|
1884
|
+
tasksSilent: true
|
|
1754
1885
|
});
|
|
1755
1886
|
if (!result.authenticated) {
|
|
1756
1887
|
return { success: false, destination: 'login', error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1797,8 +1928,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1797
1928
|
const result = await runCloudBootstrap({
|
|
1798
1929
|
reason,
|
|
1799
1930
|
ignoreAuthGuard: true,
|
|
1800
|
-
tasksSilent: true
|
|
1801
|
-
includeDeferredArchive: false
|
|
1931
|
+
tasksSilent: true
|
|
1802
1932
|
});
|
|
1803
1933
|
if (!result.authenticated) {
|
|
1804
1934
|
return { success: false, error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1979,7 +2109,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1979
2109
|
method: 'POST',
|
|
1980
2110
|
headers: { 'Content-Type': 'application/json' },
|
|
1981
2111
|
credentials: 'include',
|
|
1982
|
-
body: JSON.stringify({
|
|
2112
|
+
body: JSON.stringify(buildTaskforceCredentialLoginPayload({
|
|
2113
|
+
email: trimmedEmail,
|
|
2114
|
+
password: rawPassword,
|
|
2115
|
+
activeWorkspaceId: currentWorkspaceIdRef.current,
|
|
2116
|
+
}))
|
|
1983
2117
|
});
|
|
1984
2118
|
const data = await res.json().catch(() => ({}));
|
|
1985
2119
|
if (!res.ok || !data?.success) {
|
|
@@ -1990,24 +2124,34 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1990
2124
|
if (!entry.success) {
|
|
1991
2125
|
return { success: false, error: entry.error || 'Unable to resolve workspace after sign in.', code: entry.code };
|
|
1992
2126
|
}
|
|
2127
|
+
dispatchTaskforceAuthSessionChanged();
|
|
1993
2128
|
return { success: true, workspaceSetupRequired: entry.workspaceSetupRequired === true };
|
|
1994
2129
|
}
|
|
1995
2130
|
catch {
|
|
1996
2131
|
return { success: false, error: 'Sign in failed.' };
|
|
1997
2132
|
}
|
|
1998
|
-
}, [resolveCloudAuthUrl, cloudAuthConfigured, resolvePostAuthCloudEntry]);
|
|
2133
|
+
}, [resolveCloudAuthUrl, cloudAuthConfigured, currentWorkspaceIdRef, resolvePostAuthCloudEntry]);
|
|
1999
2134
|
/**
|
|
2000
2135
|
* Initiates an OAuth login (or invite-claim) flow by redirecting the browser
|
|
2001
2136
|
* to the provider's authorisation URL via the server-side start route.
|
|
2002
2137
|
*
|
|
2003
2138
|
* @param provider - 'google' | 'github' | 'apple'
|
|
2004
2139
|
* @param returnTo - Optional relative path to redirect back to after auth (defaults to '/').
|
|
2005
|
-
|
|
2140
|
+
* @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
|
|
2006
2141
|
*/
|
|
2007
2142
|
const beginOAuthLogin = useCallback((provider, returnTo, inviteToken) => {
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
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
|
+
}
|
|
2011
2155
|
let path = `/api/taskforce/auth/oauth/${encodeURIComponent(provider)}/start?return_to=${encodeURIComponent(sanitizedReturnTo)}`;
|
|
2012
2156
|
if (inviteToken) {
|
|
2013
2157
|
path += `&invite_token=${encodeURIComponent(inviteToken)}`;
|
|
@@ -2407,7 +2551,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2407
2551
|
if (!cloudAuthConfigured)
|
|
2408
2552
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2409
2553
|
try {
|
|
2410
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2554
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods'), {
|
|
2411
2555
|
credentials: 'include'
|
|
2412
2556
|
});
|
|
2413
2557
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2424,7 +2568,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2424
2568
|
if (!cloudAuthConfigured)
|
|
2425
2569
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2426
2570
|
try {
|
|
2427
|
-
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/
|
|
2571
|
+
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/auth/login-methods/${encodeURIComponent(provider)}`), {
|
|
2428
2572
|
method: 'DELETE',
|
|
2429
2573
|
credentials: 'include'
|
|
2430
2574
|
});
|
|
@@ -2442,7 +2586,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2442
2586
|
if (!cloudAuthConfigured)
|
|
2443
2587
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2444
2588
|
try {
|
|
2445
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2589
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods/password'), {
|
|
2446
2590
|
method: 'POST',
|
|
2447
2591
|
headers: { 'Content-Type': 'application/json' },
|
|
2448
2592
|
credentials: 'include',
|
|
@@ -2458,6 +2602,28 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2458
2602
|
return { success: false, error: 'Failed to add password.' };
|
|
2459
2603
|
}
|
|
2460
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]);
|
|
2461
2627
|
const beginOAuthLink = useCallback((provider, returnTo) => {
|
|
2462
2628
|
const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
|
|
2463
2629
|
? returnTo
|
|
@@ -2468,13 +2634,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2468
2634
|
const resetCloudLogoutClientState = useCallback(() => {
|
|
2469
2635
|
abortWorkspaceScopedRequests();
|
|
2470
2636
|
referenceDataRequestRef.current = null;
|
|
2471
|
-
lastLoadedUiStateKeyRef.current = '';
|
|
2472
2637
|
lastAssigneeOptionsLoadKeyRef.current = '';
|
|
2473
2638
|
lastConfigRefreshKeyRef.current = '';
|
|
2474
2639
|
lastWorkspaceSyncStateLoadKeyRef.current = '';
|
|
2475
2640
|
lastTaskSurfaceLoadKeyRef.current = '';
|
|
2476
2641
|
lastSettingsSurfaceLoadKeyRef.current = '';
|
|
2477
|
-
|
|
2642
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2478
2643
|
setReferenceDataLoaded(false);
|
|
2479
2644
|
setAssigneeOptions(createDefaultAssigneeOptions());
|
|
2480
2645
|
setAssigneeOptionsLoaded(false);
|
|
@@ -2484,16 +2649,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2484
2649
|
setInitiatives([]);
|
|
2485
2650
|
setWorkstreams([]);
|
|
2486
2651
|
setPlanningBootstrapTaskSummaries([]);
|
|
2652
|
+
setPlanningLoadState(createInitialPlanningLoadState());
|
|
2487
2653
|
setLoadingTasks(false);
|
|
2488
|
-
|
|
2489
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
2490
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
2491
|
-
}
|
|
2492
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2493
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
2494
|
-
archiveBootstrapTimerRef.current = null;
|
|
2495
|
-
}
|
|
2496
|
-
}, [abortWorkspaceScopedRequests, setArchivedTasks, setTasks]);
|
|
2654
|
+
}, [abortWorkspaceScopedRequests, resetPersistedUiStateLoad, setArchivedTasks, setTasks]);
|
|
2497
2655
|
const logout = useCallback(async () => {
|
|
2498
2656
|
try {
|
|
2499
2657
|
if (cloudAuthConfigured) {
|
|
@@ -2529,7 +2687,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2529
2687
|
setSetupState(null);
|
|
2530
2688
|
setBootstrapPhase('idle');
|
|
2531
2689
|
setBootstrapError(null);
|
|
2532
|
-
|
|
2690
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2533
2691
|
if (runtimeMode !== 'local') {
|
|
2534
2692
|
clearPersistedWorkspaceId(workspaceSelectionScope);
|
|
2535
2693
|
}
|
|
@@ -2565,29 +2723,64 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2565
2723
|
fetchTasks,
|
|
2566
2724
|
resetCloudLogoutClientState
|
|
2567
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(), []);
|
|
2568
2743
|
const createInitiativeFromTemplate = useCallback(async (payload) => {
|
|
2569
2744
|
try {
|
|
2570
|
-
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', {
|
|
2571
2756
|
method: 'POST',
|
|
2572
2757
|
headers: { 'Content-Type': 'application/json' },
|
|
2573
|
-
body:
|
|
2574
|
-
});
|
|
2758
|
+
body: requestBody
|
|
2759
|
+
}, initiativeTemplateOperationRef.current.operationId);
|
|
2575
2760
|
const data = await res.json().catch(() => ({}));
|
|
2576
2761
|
if (!res.ok || !data?.success) {
|
|
2577
2762
|
return { success: false, error: data?.error || `Create failed (${res.status})` };
|
|
2578
2763
|
}
|
|
2764
|
+
initiativeTemplateOperationRef.current = null;
|
|
2579
2765
|
await fetchTasks(true);
|
|
2580
2766
|
return { success: true, result: data?.results };
|
|
2581
2767
|
}
|
|
2582
2768
|
catch (error) {
|
|
2583
2769
|
return { success: false, error: error.message };
|
|
2584
2770
|
}
|
|
2585
|
-
}, [fetchTasks]);
|
|
2771
|
+
}, [fetchTasks, runInitiativeMutation]);
|
|
2586
2772
|
const createInitiative = useCallback(async (payload) => {
|
|
2587
|
-
|
|
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', {
|
|
2588
2781
|
method: 'POST',
|
|
2589
2782
|
headers: { 'Content-Type': 'application/json' },
|
|
2590
|
-
body: JSON.stringify(
|
|
2783
|
+
body: JSON.stringify(stablePayload)
|
|
2591
2784
|
});
|
|
2592
2785
|
const data = await res.json().catch(() => ({}));
|
|
2593
2786
|
if (!res.ok) {
|
|
@@ -2596,9 +2789,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2596
2789
|
await fetchPlanningEntities();
|
|
2597
2790
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2598
2791
|
return data;
|
|
2599
|
-
}, [fetchPlanningEntities]);
|
|
2792
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2600
2793
|
const updateInitiative = useCallback(async (id, payload) => {
|
|
2601
|
-
const res = await
|
|
2794
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
|
|
2602
2795
|
method: 'PATCH',
|
|
2603
2796
|
headers: { 'Content-Type': 'application/json' },
|
|
2604
2797
|
body: JSON.stringify(payload || {})
|
|
@@ -2610,12 +2803,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2610
2803
|
await fetchPlanningEntities();
|
|
2611
2804
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2612
2805
|
return data;
|
|
2613
|
-
}, [fetchPlanningEntities]);
|
|
2806
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2614
2807
|
const refreshPlanningEntitiesInBackground = useCallback(() => {
|
|
2615
2808
|
void fetchPlanningEntities();
|
|
2616
2809
|
}, [fetchPlanningEntities]);
|
|
2617
2810
|
const archiveInitiative = useCallback(async (id) => {
|
|
2618
|
-
const res = await
|
|
2811
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
|
|
2619
2812
|
method: 'POST',
|
|
2620
2813
|
});
|
|
2621
2814
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2625,9 +2818,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2625
2818
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2626
2819
|
refreshPlanningEntitiesInBackground();
|
|
2627
2820
|
return data;
|
|
2628
|
-
}, [refreshPlanningEntitiesInBackground]);
|
|
2821
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2629
2822
|
const unarchiveInitiative = useCallback(async (id) => {
|
|
2630
|
-
const res = await
|
|
2823
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
|
|
2631
2824
|
method: 'POST',
|
|
2632
2825
|
});
|
|
2633
2826
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2637,59 +2830,149 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2637
2830
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2638
2831
|
refreshPlanningEntitiesInBackground();
|
|
2639
2832
|
return data;
|
|
2640
|
-
}, [refreshPlanningEntitiesInBackground]);
|
|
2833
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2641
2834
|
const createWorkstream = useCallback(async (payload) => {
|
|
2642
|
-
const
|
|
2835
|
+
const attempt = await workstreamHttpMutationClient.prepareCreate(currentWorkspaceIdRef.current || 'default', (payload || {}));
|
|
2836
|
+
const res = await fetchWorkstreamHttpMutation('/api/taskforce/workstream', {
|
|
2643
2837
|
method: 'POST',
|
|
2644
2838
|
headers: { 'Content-Type': 'application/json' },
|
|
2645
|
-
body: JSON.stringify(
|
|
2646
|
-
});
|
|
2839
|
+
body: JSON.stringify(attempt.body)
|
|
2840
|
+
}, attempt.operationId);
|
|
2841
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2647
2842
|
const data = await res.json().catch(() => ({}));
|
|
2648
2843
|
if (!res.ok) {
|
|
2649
|
-
|
|
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}`);
|
|
2650
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);
|
|
2651
2853
|
await fetchPlanningEntities();
|
|
2652
|
-
setWorkstreams((current) =>
|
|
2854
|
+
setWorkstreams((current) => {
|
|
2855
|
+
const created = selectCreatedWorkstreamAfterRefresh(current, data);
|
|
2856
|
+
return created ? upsertEntityById(current, created) : current;
|
|
2857
|
+
});
|
|
2653
2858
|
return data;
|
|
2654
|
-
}, [fetchPlanningEntities]);
|
|
2859
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient]);
|
|
2655
2860
|
const updateWorkstream = useCallback(async (id, payload) => {
|
|
2656
|
-
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, {
|
|
2657
2872
|
method: 'PATCH',
|
|
2658
2873
|
headers: { 'Content-Type': 'application/json' },
|
|
2659
|
-
body: JSON.stringify(
|
|
2660
|
-
});
|
|
2874
|
+
body: JSON.stringify(body)
|
|
2875
|
+
}, attempt.operationId);
|
|
2876
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2661
2877
|
const data = await res.json().catch(() => ({}));
|
|
2662
2878
|
if (!res.ok) {
|
|
2663
|
-
|
|
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}`);
|
|
2664
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);
|
|
2665
2888
|
await fetchPlanningEntities();
|
|
2666
2889
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2667
2890
|
return data;
|
|
2668
|
-
}, [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]);
|
|
2669
2924
|
const archiveWorkstream = useCallback(async (id) => {
|
|
2670
|
-
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, {
|
|
2671
2932
|
method: 'POST',
|
|
2672
|
-
});
|
|
2933
|
+
}, attempt.operationId);
|
|
2934
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2673
2935
|
const data = await res.json().catch(() => ({}));
|
|
2674
2936
|
if (!res.ok) {
|
|
2675
|
-
|
|
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}`);
|
|
2676
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);
|
|
2677
2946
|
await fetchPlanningEntities();
|
|
2678
2947
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2679
2948
|
return data;
|
|
2680
|
-
}, [fetchPlanningEntities]);
|
|
2949
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2681
2950
|
const unarchiveWorkstream = useCallback(async (id) => {
|
|
2682
|
-
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, {
|
|
2683
2958
|
method: 'POST',
|
|
2684
|
-
});
|
|
2959
|
+
}, attempt.operationId);
|
|
2960
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2685
2961
|
const data = await res.json().catch(() => ({}));
|
|
2686
2962
|
if (!res.ok) {
|
|
2687
|
-
|
|
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}`);
|
|
2688
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);
|
|
2689
2972
|
await fetchPlanningEntities();
|
|
2690
2973
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2691
2974
|
return data;
|
|
2692
|
-
}, [fetchPlanningEntities]);
|
|
2975
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2693
2976
|
// Initialize auth once, then bootstrap protected data once auth gates are settled.
|
|
2694
2977
|
const hasInitializedAuthRef = useRef(false);
|
|
2695
2978
|
useEffect(() => {
|
|
@@ -2765,23 +3048,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2765
3048
|
onTaskCountChange(tasks.length);
|
|
2766
3049
|
}
|
|
2767
3050
|
}, [tasks.length, onTaskCountChange]);
|
|
2768
|
-
const
|
|
2769
|
-
|
|
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);
|
|
2770
3074
|
useEffect(() => {
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
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;
|
|
2777
3106
|
}
|
|
2778
|
-
|
|
2779
|
-
if (task) {
|
|
2780
|
-
handledInitialTaskIdRef.current = initialTaskId;
|
|
2781
|
-
handleEdit(task);
|
|
2782
|
-
setActiveTab('add');
|
|
2783
|
-
}
|
|
2784
|
-
}, [initialTaskId, tasks]);
|
|
3107
|
+
}, []);
|
|
2785
3108
|
// Update active category logic
|
|
2786
3109
|
const hasInitedCategoryRef = useRef(false);
|
|
2787
3110
|
useEffect(() => {
|
|
@@ -2807,7 +3130,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2807
3130
|
}, [configLoaded, activeCategories, category, getPreferredCategoryValue, lastUsedCategory]);
|
|
2808
3131
|
// Sanitize tasks with invalid categories
|
|
2809
3132
|
useEffect(() => {
|
|
2810
|
-
if (!configLoaded || activeCategories.length === 0)
|
|
3133
|
+
if (!configLoaded || !referenceDataLoaded || activeCategories.length === 0)
|
|
2811
3134
|
return;
|
|
2812
3135
|
const needsSanitization = (t) => {
|
|
2813
3136
|
return !activeCategories.some(c => c.value === t.category);
|
|
@@ -2824,31 +3147,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2824
3147
|
setArchivedTasks(prev => prev.map(t => needsSanitization(t) ? { ...t, category: defaultCategory } : t));
|
|
2825
3148
|
}
|
|
2826
3149
|
}
|
|
2827
|
-
}, [configLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
|
|
2828
|
-
useEffect(() => {
|
|
2829
|
-
return () => {
|
|
2830
|
-
if (archiveBootstrapTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2831
|
-
window.clearTimeout(archiveBootstrapTimerRef.current);
|
|
2832
|
-
archiveBootstrapTimerRef.current = null;
|
|
2833
|
-
}
|
|
2834
|
-
if (cloudRealtimeFollowUpRefreshTimerRef.current !== null && typeof window !== 'undefined') {
|
|
2835
|
-
window.clearTimeout(cloudRealtimeFollowUpRefreshTimerRef.current);
|
|
2836
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
2837
|
-
}
|
|
2838
|
-
};
|
|
2839
|
-
}, []);
|
|
3150
|
+
}, [configLoaded, referenceDataLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
|
|
2840
3151
|
// HMR Listener for Real-Time Updates
|
|
2841
3152
|
useEffect(() => {
|
|
2842
3153
|
if (import.meta.hot) {
|
|
2843
3154
|
import.meta.hot.on('taskforce:update', () => {
|
|
2844
3155
|
// console.log('[Taskforce] Received HMR update, refreshing data...');
|
|
2845
|
-
void refreshTaskCollections({ isSilent: true });
|
|
3156
|
+
void refreshTaskCollections({ isSilent: true, highlightChangedTaskIds: [] });
|
|
2846
3157
|
});
|
|
2847
3158
|
}
|
|
2848
3159
|
}, [refreshTaskCollections]);
|
|
2849
3160
|
const refreshTaskCollectionsForDataVersion = useCallback(async () => {
|
|
2850
|
-
await refreshTaskCollectionsFromInvalidation();
|
|
3161
|
+
await refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(['active', 'archive', 'deleted', 'planning'], { ambiguous: true }));
|
|
2851
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]);
|
|
2852
3182
|
const normalizedRealtimeWorkspaceId = String(currentWorkspaceId || '').trim();
|
|
2853
3183
|
const normalizedRealtimeUserId = String(authUserId || '').trim();
|
|
2854
3184
|
const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
|
|
@@ -2861,23 +3191,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2861
3191
|
&& normalizedRealtimeWorkspaceId
|
|
2862
3192
|
&& !isReservedWorkspaceId(normalizedRealtimeWorkspaceId)
|
|
2863
3193
|
&& realtimeSocketUrl);
|
|
2864
|
-
|
|
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) => {
|
|
2865
3203
|
if (runtimeMode !== 'cloud')
|
|
2866
3204
|
return;
|
|
2867
|
-
|
|
2868
|
-
|
|
3205
|
+
dispatchTaskforceWorkspaceResourcesInvalidated({
|
|
3206
|
+
workspaceId: normalizedRealtimeWorkspaceId,
|
|
3207
|
+
source: 'realtime',
|
|
3208
|
+
});
|
|
3209
|
+
const scope = resolveRealtimeTaskInvalidation(signal.type, signal.invalidations);
|
|
3210
|
+
if (scope.collections.length === 0)
|
|
3211
|
+
return;
|
|
3212
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
3213
|
+
if (!scope.ambiguous || typeof window === 'undefined')
|
|
2869
3214
|
return;
|
|
2870
|
-
if (
|
|
2871
|
-
window.clearTimeout(
|
|
2872
|
-
}
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = window.setTimeout(() => {
|
|
2877
|
-
cloudRealtimeFollowUpRefreshTimerRef.current = null;
|
|
2878
|
-
void refreshTaskCollectionsFromInvalidation();
|
|
3215
|
+
if (ambiguousRealtimeConfirmationTimerRef.current !== null) {
|
|
3216
|
+
window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
|
|
3217
|
+
}
|
|
3218
|
+
ambiguousRealtimeConfirmationTimerRef.current = window.setTimeout(() => {
|
|
3219
|
+
ambiguousRealtimeConfirmationTimerRef.current = null;
|
|
3220
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
2879
3221
|
}, 250);
|
|
2880
|
-
}, [runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
3222
|
+
}, [normalizedRealtimeWorkspaceId, runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
2881
3223
|
useRealtimeSync({
|
|
2882
3224
|
enabled: cloudRealtimeEnabled,
|
|
2883
3225
|
workspaceId: normalizedRealtimeWorkspaceId,
|
|
@@ -2887,6 +3229,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2887
3229
|
});
|
|
2888
3230
|
// Fallback sync for cross-process writes (e.g., MCP tools) that may miss watcher/websocket events.
|
|
2889
3231
|
useDataVersionRefresh({
|
|
3232
|
+
workspaceId: currentWorkspaceId,
|
|
2890
3233
|
isOpen,
|
|
2891
3234
|
authBlocked,
|
|
2892
3235
|
authRequiredForApi,
|
|
@@ -2897,7 +3240,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2897
3240
|
authRequiredForApiRef,
|
|
2898
3241
|
isAuthenticatedRef,
|
|
2899
3242
|
dataVersionRef,
|
|
2900
|
-
refreshTaskCollectionsForDataVersion
|
|
3243
|
+
refreshTaskCollectionsForDataVersion,
|
|
3244
|
+
coordinatorDataVersion: localCoordinatorDataVersion,
|
|
2901
3245
|
});
|
|
2902
3246
|
const relationshipTasks = useMemo(() => {
|
|
2903
3247
|
const byId = new Map();
|
|
@@ -2922,21 +3266,31 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2922
3266
|
return;
|
|
2923
3267
|
if (activeTab === 'tasks') {
|
|
2924
3268
|
const loadKey = `${currentWorkspaceId}:${activeTab}:${showArchive ? 'archive' : 'active'}:${taskScope}`;
|
|
3269
|
+
const requiresArchive = showArchive || taskScope === 'archived';
|
|
3270
|
+
const requiresDeleted = taskScope === 'deleted';
|
|
2925
3271
|
if (!skippedInitialTaskTabRefreshRef.current) {
|
|
2926
3272
|
skippedInitialTaskTabRefreshRef.current = true;
|
|
2927
3273
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
3274
|
+
if (requiresArchive) {
|
|
3275
|
+
void ensureArchiveHydrated(false);
|
|
3276
|
+
}
|
|
3277
|
+
if (requiresDeleted) {
|
|
3278
|
+
void ensureDeletedTasksHydrated(false);
|
|
3279
|
+
}
|
|
2928
3280
|
return;
|
|
2929
3281
|
}
|
|
2930
3282
|
if (lastTaskSurfaceLoadKeyRef.current === loadKey)
|
|
2931
3283
|
return;
|
|
2932
3284
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
2933
|
-
|
|
3285
|
+
if (!requiresArchive && !requiresDeleted) {
|
|
3286
|
+
fetchTasks();
|
|
3287
|
+
}
|
|
2934
3288
|
fetchPlanningEntities();
|
|
2935
|
-
if (
|
|
2936
|
-
|
|
3289
|
+
if (requiresArchive) {
|
|
3290
|
+
void ensureArchiveHydrated(false);
|
|
2937
3291
|
}
|
|
2938
|
-
if (
|
|
2939
|
-
|
|
3292
|
+
if (requiresDeleted) {
|
|
3293
|
+
void ensureDeletedTasksHydrated(false);
|
|
2940
3294
|
}
|
|
2941
3295
|
return;
|
|
2942
3296
|
}
|
|
@@ -2946,9 +3300,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2946
3300
|
return;
|
|
2947
3301
|
lastSettingsSurfaceLoadKeyRef.current = loadKey;
|
|
2948
3302
|
fetchConfig();
|
|
2949
|
-
if (settingsSection === 'commands' || settingsSection === 'resources') {
|
|
2950
|
-
fetchWorkflows();
|
|
2951
|
-
}
|
|
2952
3303
|
}
|
|
2953
3304
|
}, [
|
|
2954
3305
|
currentWorkspaceId,
|
|
@@ -2959,10 +3310,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2959
3310
|
taskScope,
|
|
2960
3311
|
fetchTasks,
|
|
2961
3312
|
fetchPlanningEntities,
|
|
2962
|
-
|
|
2963
|
-
|
|
3313
|
+
ensureArchiveHydrated,
|
|
3314
|
+
ensureDeletedTasksHydrated,
|
|
2964
3315
|
fetchConfig,
|
|
2965
|
-
fetchWorkflows,
|
|
2966
3316
|
shouldDeferProtectedApiCalls,
|
|
2967
3317
|
shouldBlockProtectedApiCalls,
|
|
2968
3318
|
workspaceBootstrapPending
|
|
@@ -3055,7 +3405,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3055
3405
|
}
|
|
3056
3406
|
setActiveTab__internal(tab);
|
|
3057
3407
|
}, [activeTab]);
|
|
3058
|
-
const flushAutoSaveRef = useRef(async () =>
|
|
3408
|
+
const flushAutoSaveRef = useRef(async () => true);
|
|
3059
3409
|
const { handleNavigation, handleClose, resetForm, resolveTaskIdInput, resolveWorkstreamIdInput, handleEdit, handleOpenTaskById, returnToPreviousTask, clearReturnToParentTask } = useTaskEditorNavigation({
|
|
3060
3410
|
activeCategories,
|
|
3061
3411
|
activeTypes,
|
|
@@ -3066,7 +3416,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3066
3416
|
description,
|
|
3067
3417
|
editingTaskId,
|
|
3068
3418
|
flushPendingAutoSave: () => flushAutoSaveRef.current(),
|
|
3419
|
+
getDescriptionDraft,
|
|
3069
3420
|
getPreferredCategoryValue,
|
|
3421
|
+
getTitleDraft,
|
|
3070
3422
|
lastUsedCategory,
|
|
3071
3423
|
newCommentText,
|
|
3072
3424
|
relationshipTasks,
|
|
@@ -3074,7 +3426,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3074
3426
|
showArchive,
|
|
3075
3427
|
taxonomies,
|
|
3076
3428
|
setActiveTab,
|
|
3077
|
-
setApproach,
|
|
3078
3429
|
setAssignee,
|
|
3079
3430
|
setAttachments,
|
|
3080
3431
|
setAttachmentsDirty,
|
|
@@ -3102,9 +3453,302 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3102
3453
|
taskReturnTrail,
|
|
3103
3454
|
title,
|
|
3104
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
|
+
]);
|
|
3105
3703
|
// === SECTION: Task CRUD ===
|
|
3106
3704
|
// Pure mutation callbacks are managed by useTaskMutations.
|
|
3107
|
-
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({
|
|
3108
3752
|
tasks,
|
|
3109
3753
|
archivedTasks,
|
|
3110
3754
|
editingTaskId,
|
|
@@ -3115,8 +3759,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3115
3759
|
resetForm,
|
|
3116
3760
|
setActiveTab,
|
|
3117
3761
|
fetchTasks,
|
|
3118
|
-
fetchArchive,
|
|
3119
|
-
fetchDeletedTasks,
|
|
3762
|
+
fetchArchive: refreshArchiveIfHydrated,
|
|
3763
|
+
fetchDeletedTasks: refreshDeletedTasksIfHydrated,
|
|
3120
3764
|
mergeTaskFromServer,
|
|
3121
3765
|
pushNotice,
|
|
3122
3766
|
cloudAuthConfigured,
|
|
@@ -3128,12 +3772,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3128
3772
|
workspacePendingSignatureRef,
|
|
3129
3773
|
workspaceDeletedTaskIdsRef,
|
|
3130
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,
|
|
3131
3786
|
});
|
|
3132
3787
|
const { autoSaveState, flushAutoSave, scheduleWarningPrompt, handleSubmit, confirmScheduleWarning, cancelScheduleWarning, handleAddComment } = useTaskFormActions({
|
|
3133
3788
|
activeCategories,
|
|
3134
3789
|
activeTab,
|
|
3135
3790
|
apiEndpoint,
|
|
3136
|
-
approach,
|
|
3137
3791
|
assignee,
|
|
3138
3792
|
attachments,
|
|
3139
3793
|
attachmentsDirty,
|
|
@@ -3143,16 +3797,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3143
3797
|
complexity,
|
|
3144
3798
|
description,
|
|
3145
3799
|
dueDate,
|
|
3800
|
+
createTaskDurably,
|
|
3801
|
+
durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
|
|
3802
|
+
workspaceId: currentWorkspaceId,
|
|
3803
|
+
updateTask: handleUpdateTask,
|
|
3146
3804
|
editingTaskId,
|
|
3147
3805
|
fetchTasks,
|
|
3148
3806
|
formTaxonomies,
|
|
3807
|
+
getDescriptionDraft,
|
|
3149
3808
|
getPreferredCategoryValue,
|
|
3809
|
+
getTitleDraft,
|
|
3150
3810
|
mergeTaskFromServer,
|
|
3811
|
+
onTaskCreated: handleEdit,
|
|
3151
3812
|
workstreamInput,
|
|
3152
3813
|
priority,
|
|
3153
3814
|
pushNotice,
|
|
3154
3815
|
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3155
3816
|
relationshipTasks,
|
|
3817
|
+
supplementalTasks: deletedRelationshipTasks,
|
|
3156
3818
|
resetForm,
|
|
3157
3819
|
resolveWorkstreamIdInput,
|
|
3158
3820
|
scheduledDate,
|
|
@@ -3166,6 +3828,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3166
3828
|
status,
|
|
3167
3829
|
title,
|
|
3168
3830
|
taxonomies,
|
|
3831
|
+
textDraftOccupied,
|
|
3169
3832
|
type
|
|
3170
3833
|
});
|
|
3171
3834
|
useEffect(() => {
|
|
@@ -3173,21 +3836,24 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3173
3836
|
}, [flushAutoSave]);
|
|
3174
3837
|
const { handleSetWorkstreamForCurrentTask, } = useTaskRelationships({
|
|
3175
3838
|
editingTaskId,
|
|
3176
|
-
mergeTaskFromServer,
|
|
3177
3839
|
workstreamInput,
|
|
3178
3840
|
pushNotice,
|
|
3179
|
-
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3180
3841
|
relationshipTasks,
|
|
3181
3842
|
resolveWorkstreamIdInput,
|
|
3182
3843
|
setError,
|
|
3183
|
-
|
|
3844
|
+
updateTask: handleUpdateTask
|
|
3184
3845
|
});
|
|
3185
3846
|
const { currentTask, currentTaskWorkstream, currentTaskInitiative, } = useCurrentTaskRelations({
|
|
3186
3847
|
editingTaskId,
|
|
3187
3848
|
relationshipTasks,
|
|
3188
3849
|
initiatives,
|
|
3189
3850
|
workstreams,
|
|
3851
|
+
workstreamInput,
|
|
3852
|
+
resolveWorkstreamIdInput,
|
|
3190
3853
|
supplementalTasks: deletedRelationshipTasks,
|
|
3854
|
+
assignee,
|
|
3855
|
+
setAssignee,
|
|
3856
|
+
setChecklistItems,
|
|
3191
3857
|
setComments
|
|
3192
3858
|
});
|
|
3193
3859
|
const settingsModel = useSettingsModel({
|
|
@@ -3211,12 +3877,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3211
3877
|
manualComplexityEnabled,
|
|
3212
3878
|
checklistDropdownEnabled,
|
|
3213
3879
|
showTaskCardStatusLabel,
|
|
3214
|
-
exportWorkflowsPath,
|
|
3215
|
-
exportingResource,
|
|
3216
|
-
exportResult,
|
|
3217
3880
|
pathSaved,
|
|
3218
3881
|
settingsSection,
|
|
3219
|
-
exportEnvironment,
|
|
3220
3882
|
setupState,
|
|
3221
3883
|
buildInfo,
|
|
3222
3884
|
saveSetupMode,
|
|
@@ -3234,19 +3896,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3234
3896
|
handleShowTaskCardStatusLabelChange,
|
|
3235
3897
|
handleResetProjectToGlobal,
|
|
3236
3898
|
handleSaveSettings,
|
|
3237
|
-
setExportWorkflowsPath,
|
|
3238
|
-
setExportEnvironment,
|
|
3239
|
-
availableWorkflows,
|
|
3240
3899
|
initiativeTemplates,
|
|
3241
|
-
availableEnvironments,
|
|
3242
|
-
fetchWorkflows,
|
|
3243
3900
|
fetchInitiativeTemplates,
|
|
3244
3901
|
createInitiativeFromTemplate,
|
|
3245
|
-
fetchWorkflowTemplate,
|
|
3246
|
-
fetchWorkflowOverrideNames,
|
|
3247
|
-
saveWorkflowTemplateDraft,
|
|
3248
|
-
resetWorkflowTemplateDraft,
|
|
3249
|
-
handleExportWorkflows,
|
|
3250
3902
|
setShowFolderBrowser,
|
|
3251
3903
|
setBrowserTarget,
|
|
3252
3904
|
fetchFolders,
|
|
@@ -3403,6 +4055,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3403
4055
|
workspaceSyncRecommendedAction,
|
|
3404
4056
|
workspaceSyncBusy,
|
|
3405
4057
|
workspaceSyncPendingChanges,
|
|
4058
|
+
localCoordinatorStatus,
|
|
4059
|
+
transferLocalCoordinatorOwnership,
|
|
3406
4060
|
retryUserGlobalSettingsSync,
|
|
3407
4061
|
retryWorkspaceCloudSync,
|
|
3408
4062
|
resetWorkspaceSyncCursorAndPull,
|
|
@@ -3439,6 +4093,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3439
4093
|
fetchLoginMethods,
|
|
3440
4094
|
unlinkLoginMethod,
|
|
3441
4095
|
addPasswordToAccount,
|
|
4096
|
+
changePassword,
|
|
3442
4097
|
beginOAuthLink,
|
|
3443
4098
|
registerWithCredentials,
|
|
3444
4099
|
updateCurrentUserProfile,
|
|
@@ -3470,15 +4125,17 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3470
4125
|
tasks,
|
|
3471
4126
|
loadingTasks,
|
|
3472
4127
|
archivedTasks,
|
|
4128
|
+
archiveHydratedWorkspaceId,
|
|
3473
4129
|
initiatives,
|
|
3474
4130
|
workstreams,
|
|
3475
4131
|
planningBootstrapTaskSummaries,
|
|
4132
|
+
planningLoadState,
|
|
4133
|
+
workspaceTaskRelationships,
|
|
3476
4134
|
deletedTasks,
|
|
3477
4135
|
activeCategories,
|
|
3478
4136
|
activeTypes,
|
|
3479
4137
|
priorities,
|
|
3480
4138
|
taxonomyDisplayLabels,
|
|
3481
|
-
approaches,
|
|
3482
4139
|
taxonomies,
|
|
3483
4140
|
// Filtering
|
|
3484
4141
|
searchQuery,
|
|
@@ -3505,6 +4162,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3505
4162
|
setShowArchive,
|
|
3506
4163
|
taskScope,
|
|
3507
4164
|
setTaskScope,
|
|
4165
|
+
compressedCards,
|
|
4166
|
+
setCompressedCards,
|
|
3508
4167
|
clearFilters,
|
|
3509
4168
|
filteredTasks,
|
|
3510
4169
|
searchAgnosticTasks,
|
|
@@ -3515,8 +4174,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3515
4174
|
// Actions
|
|
3516
4175
|
fetchTasks,
|
|
3517
4176
|
fetchArchive,
|
|
4177
|
+
ensureArchiveHydrated,
|
|
3518
4178
|
fetchDeletedTasks,
|
|
3519
4179
|
fetchPlanningEntities,
|
|
4180
|
+
fetchPlanningEntityDetail,
|
|
3520
4181
|
fetchAssigneeOptions,
|
|
3521
4182
|
createInitiative,
|
|
3522
4183
|
updateInitiative,
|
|
@@ -3526,6 +4187,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3526
4187
|
updateWorkstream,
|
|
3527
4188
|
archiveWorkstream,
|
|
3528
4189
|
unarchiveWorkstream,
|
|
4190
|
+
reorderWorkstreamTasks,
|
|
3529
4191
|
handleEdit,
|
|
3530
4192
|
handleDelete,
|
|
3531
4193
|
handleCopyId,
|
|
@@ -3537,17 +4199,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3537
4199
|
handleBulkArchive,
|
|
3538
4200
|
handleUnarchive,
|
|
3539
4201
|
handleRestoreDeletedTask,
|
|
4202
|
+
handleRestoreSelectedDeletedTasks,
|
|
3540
4203
|
handlePermanentlyDeleteDeletedTask,
|
|
3541
4204
|
handleEmptyDeletedTasks,
|
|
3542
4205
|
handleUpdateTask,
|
|
4206
|
+
handleSetStatus,
|
|
3543
4207
|
// Form State
|
|
3544
4208
|
editingTaskId,
|
|
3545
4209
|
loading,
|
|
3546
4210
|
error,
|
|
4211
|
+
clearTaskError,
|
|
3547
4212
|
title,
|
|
3548
4213
|
setTitle,
|
|
4214
|
+
setTitleDraft,
|
|
3549
4215
|
description,
|
|
3550
4216
|
setDescription,
|
|
4217
|
+
setDescriptionDraft,
|
|
3551
4218
|
checklistItems,
|
|
3552
4219
|
setChecklistItems,
|
|
3553
4220
|
category,
|
|
@@ -3560,8 +4227,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3560
4227
|
setComplexity,
|
|
3561
4228
|
status,
|
|
3562
4229
|
setStatus,
|
|
3563
|
-
approach,
|
|
3564
|
-
setApproach,
|
|
3565
4230
|
assignee,
|
|
3566
4231
|
setAssignee,
|
|
3567
4232
|
scheduledDate,
|
|
@@ -3583,10 +4248,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3583
4248
|
setDescriptionFocused,
|
|
3584
4249
|
showMarkdownHelp,
|
|
3585
4250
|
setShowMarkdownHelp,
|
|
3586
|
-
showChecklist,
|
|
3587
|
-
setShowChecklist,
|
|
3588
|
-
showComments,
|
|
3589
|
-
setShowComments,
|
|
3590
4251
|
isCapturingScreenshot,
|
|
3591
4252
|
setIsCapturingScreenshot,
|
|
3592
4253
|
// Form Actions
|
|
@@ -3618,13 +4279,13 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3618
4279
|
cancelScheduleWarning,
|
|
3619
4280
|
tasksScrollRef,
|
|
3620
4281
|
setTasksScrollPos, // Export if needed
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
4282
|
+
taskforceAgentId,
|
|
4283
|
+
setTaskforceAgentId,
|
|
4284
|
+
taskforceAgentConversationId,
|
|
4285
|
+
setTaskforceAgentConversationId,
|
|
4286
|
+
taskforceAgentConversationByAgentId,
|
|
4287
|
+
setTaskforceAgentConversationByAgentId,
|
|
4288
|
+
uiStateReady,
|
|
3628
4289
|
// Categories & Types & Taxonomies mgmt
|
|
3629
4290
|
handleUpdateCategory,
|
|
3630
4291
|
handleRemoveCategory,
|
|
@@ -3652,17 +4313,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3652
4313
|
currentTask,
|
|
3653
4314
|
currentTaskWorkstream,
|
|
3654
4315
|
currentTaskInitiative,
|
|
3655
|
-
availableWorkflows,
|
|
3656
4316
|
initiativeTemplates,
|
|
3657
|
-
availableEnvironments,
|
|
3658
|
-
fetchWorkflows,
|
|
3659
4317
|
fetchInitiativeTemplates,
|
|
3660
4318
|
createInitiativeFromTemplate,
|
|
3661
|
-
fetchWorkflowTemplate,
|
|
3662
|
-
fetchWorkflowOverrideNames,
|
|
3663
|
-
saveWorkflowTemplateDraft,
|
|
3664
|
-
resetWorkflowTemplateDraft,
|
|
3665
|
-
onExportWorkflows: handleExportWorkflows,
|
|
3666
4319
|
settingsModel
|
|
3667
4320
|
};
|
|
3668
4321
|
}
|