@taskforcehq/taskforce 0.3.326 → 0.3.328
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +68 -0
- package/README.md +19 -0
- package/dist/Taskforce.module.css +2168 -585
- 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 +83 -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 +7 -0
- package/dist/components/context/ContextAttachmentManager.js +514 -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 +46 -0
- package/dist/components/features/planning/PlanningEntitySummary.js +98 -0
- package/dist/components/features/planning/PlanningLinkPicker.d.ts +11 -0
- package/dist/components/features/planning/PlanningLinkPicker.js +28 -0
- package/dist/components/features/planning/PlanningModule.d.ts +6 -0
- package/dist/components/features/planning/PlanningModule.js +588 -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/PlanningVisualIdentity.d.ts +14 -0
- package/dist/components/features/planning/PlanningVisualIdentity.js +106 -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 +132 -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 +7 -3
- package/dist/components/task/TaskActionHeader.js +46 -53
- package/dist/components/task/TaskCard.d.ts +10 -2
- package/dist/components/task/TaskCard.js +138 -56
- package/dist/components/task/TaskContextUpload.d.ts +4 -0
- package/dist/components/task/TaskContextUpload.js +3 -2
- package/dist/components/task/TaskForm.d.ts +16 -17
- package/dist/components/task/TaskForm.js +569 -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 +27 -7
- 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 +25 -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/DocumentTypeIcon.d.ts +7 -0
- package/dist/components/ui/DocumentTypeIcon.js +8 -0
- 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 +18 -1
- package/dist/components/ui/TaxonomyDropdown.js +177 -59
- 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 +1717 -600
- package/dist/components/views/WidgetView.d.ts +1 -0
- package/dist/components/views/WidgetView.js +99 -31
- 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 +66 -49
- package/dist/components/views/panels/PlanningDrawer.js +983 -314
- 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 +167 -5
- package/dist/config/localServiceCloudTarget.d.ts +10 -0
- package/dist/config/localServiceCloudTarget.js +76 -0
- package/dist/core/AdminAuditRetentionService.d.ts +43 -0
- package/dist/core/AdminAuditRetentionService.js +126 -0
- package/dist/core/AiProfileService.d.ts +35 -0
- package/dist/core/AiProfileService.js +511 -251
- package/dist/core/AttachmentLinkService.d.ts +10 -2
- package/dist/core/AttachmentLinkService.js +50 -15
- 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 +8 -2
- package/dist/core/DeletedTaskLifecycleService.js +145 -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 +5 -0
- package/dist/core/McpTokenService.js +91 -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 +36 -0
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +240 -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 +542 -60
- package/dist/core/Taskforce.js +4220 -905
- 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 +12 -11
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +33 -2
- package/dist/documentReviews/DocumentReviewCommentStore.js +125 -8
- package/dist/documentReviews/commandService.d.ts +51 -0
- package/dist/documentReviews/commandService.js +63 -0
- package/dist/documentReviews/service.d.ts +24 -1
- package/dist/documentReviews/service.js +354 -49
- 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 +20 -2
- package/dist/hooks/tasks/useTaskFormActions.js +339 -59
- 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 +79 -74
- package/dist/hooks/useTaskforce.js +1205 -450
- 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 +29 -4
- package/dist/mcp/canonicalAssetHelpers.js +138 -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 +31 -15
- package/dist/mcp/documentAssetRegistrar.js +231 -56
- 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 +258 -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 +98 -1
- package/dist/mcp/runtime.js +4682 -1927
- 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 +192 -0
- package/dist/mcp/taskAttachmentCommandAdapter.js +470 -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 +240 -44
- 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 +26 -11
- 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 +1892 -64
- 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/appAccess.d.ts +12 -0
- package/dist/server/appAccess.js +21 -0
- package/dist/server/auth.js +15 -1
- package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
- package/dist/server/authorizedWorkspaceAccess.js +40 -0
- package/dist/server/cloudCollectionRead.d.ts +25 -0
- package/dist/server/cloudCollectionRead.js +120 -0
- package/dist/server/cloudCollectionReadPool.d.ts +52 -0
- package/dist/server/cloudCollectionReadPool.js +140 -0
- package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
- package/dist/server/cloudCollectionReadWorker.js +36 -0
- 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 +27 -12
- package/dist/server/index.js +395 -86
- 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 +65 -0
- package/dist/server/localServiceLease.js +485 -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 +6 -2
- package/dist/server/routes/documents.js +492 -151
- package/dist/server/routes/durableTaskHttpRouters.d.ts +167 -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 +446 -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 +29 -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 +55 -2
- package/dist/server/routes/shared.js +506 -16
- package/dist/server/routes/sync.d.ts +2 -0
- package/dist/server/routes/sync.js +206 -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 +464 -0
- package/dist/server/routes/syncV3LocalCaptureRoutes.d.ts +37 -0
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +915 -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 +1151 -0
- package/dist/server/routes/tasks.d.ts +0 -2
- package/dist/server/routes/tasks.js +1083 -236
- 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 +179 -342
- 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 +376 -0
- package/dist/service/localServiceClientLifecycle.d.ts +25 -0
- package/dist/service/localServiceClientLifecycle.js +189 -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/planningIdentity.d.ts +20 -0
- package/dist/shared/planningIdentity.js +79 -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 +42 -6
- package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
- package/dist/storage/postgresRequestDiagnostics.js +24 -0
- 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 +102 -0
- package/dist/storage/workspaceAssetStore.js +488 -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 +216 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +1436 -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 +740 -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 +109 -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 +466 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +125 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +1147 -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 +992 -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 +100 -8
- package/dist/sync/syncApplyHandlers.js +845 -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 +1094 -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 +1 -1
- package/dist/sync/taskSyncPayload.js +20 -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 +50 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +216 -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 +333 -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 +497 -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 +366 -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 +80 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +46 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +303 -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 +581 -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 +781 -0
- package/dist/sync/v3/syncDurabilityStore.js +4773 -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 +112 -0
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +218 -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 +138 -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 +153 -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 +357 -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 +541 -0
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.d.ts +50 -0
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +1161 -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 +46 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +621 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +66 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +527 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +78 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +566 -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 +230 -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/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -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 +191 -2
- package/dist/sync/workspacePullFeed.js +523 -135
- 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 +227 -5
- package/dist/sync/workspaceSyncModel.js +398 -37
- 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 +31 -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-MZs7lVED.js +1 -0
- package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +3 -0
- package/dist/ui/assets/AssetTraySortControl-B9k5caQW.css +1 -0
- package/dist/ui/assets/AssetTraySortControl-Kf1pelSy.js +1 -0
- package/dist/ui/assets/ContextAttachmentManager-B8boOs6Q.js +3 -0
- package/dist/ui/assets/DocumentWorkspace-BIBGBfd7.css +1 -0
- package/dist/ui/assets/DocumentWorkspace-DXH4XUsB.js +261 -0
- package/dist/ui/assets/EntityActivityTimeline-BfJbZRdl.css +1 -0
- package/dist/ui/assets/EntityActivityTimeline-BtSTq0ON.js +1 -0
- package/dist/ui/assets/PlanningModule-BPVyEa-f.js +1 -0
- package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
- package/dist/ui/assets/PlansPage-C2nkK2Bp.css +1 -0
- package/dist/ui/assets/PlansPage-ChqgxALc.js +1 -0
- package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +1 -0
- package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
- package/dist/ui/assets/TaskSettings-g4ECKNOz.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +21 -0
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +1 -0
- package/dist/ui/assets/WorkflowManagerModule-DF10XENz.css +1 -0
- package/dist/ui/assets/WorkflowManagerModule-DWFspC-o.js +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-BUplSsv_.js +7 -0
- package/dist/ui/assets/index-gz2EXuoK.css +1 -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-BkFLXavV.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 +6 -65
- package/dist/utils/contextAttachmentPreview.d.ts +11 -0
- package/dist/utils/contextAttachmentPreview.js +8 -0
- package/dist/utils/contextAttachmentUpload.d.ts +10 -0
- package/dist/utils/contextAttachmentUpload.js +151 -0
- package/dist/utils/contextFiles.d.ts +1 -1
- package/dist/utils/contextFiles.js +4 -4
- 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 +74 -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,63 @@ 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
|
-
const
|
|
1497
|
+
const attachmentsDraftRef = useRef([]);
|
|
1498
|
+
const [attachments, setAttachmentsState] = useState([]);
|
|
1499
|
+
const setAttachments = useCallback((next) => {
|
|
1500
|
+
const nextAttachments = typeof next === 'function'
|
|
1501
|
+
? next(attachmentsDraftRef.current)
|
|
1502
|
+
: next;
|
|
1503
|
+
attachmentsDraftRef.current = nextAttachments;
|
|
1504
|
+
setAttachmentsState(nextAttachments);
|
|
1505
|
+
}, []);
|
|
1506
|
+
const getAttachmentsDraft = useCallback(() => [...attachmentsDraftRef.current], []);
|
|
1507
|
+
const pendingDescriptionImageUploadRef = useRef(null);
|
|
1508
|
+
const [descriptionImageUploadPending, setDescriptionImageUploadPending] = useState(false);
|
|
1509
|
+
const createDescriptionImageDraftId = useCallback(() => (`task-description-${globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random().toString(16).slice(2)}`}`), []);
|
|
1510
|
+
const descriptionImageDraftIdRef = useRef(createDescriptionImageDraftId());
|
|
1511
|
+
const [descriptionImageDraftId, setDescriptionImageDraftId] = useState(descriptionImageDraftIdRef.current);
|
|
1512
|
+
const rotateDescriptionImageDraftId = useCallback(() => {
|
|
1513
|
+
const nextDraftId = createDescriptionImageDraftId();
|
|
1514
|
+
descriptionImageDraftIdRef.current = nextDraftId;
|
|
1515
|
+
setDescriptionImageDraftId(nextDraftId);
|
|
1516
|
+
}, [createDescriptionImageDraftId]);
|
|
1517
|
+
const registerDescriptionImageUpload = useCallback((upload) => {
|
|
1518
|
+
pendingDescriptionImageUploadRef.current = upload;
|
|
1519
|
+
setDescriptionImageUploadPending(true);
|
|
1520
|
+
void upload.then(() => {
|
|
1521
|
+
if (pendingDescriptionImageUploadRef.current !== upload)
|
|
1522
|
+
return;
|
|
1523
|
+
pendingDescriptionImageUploadRef.current = null;
|
|
1524
|
+
setDescriptionImageUploadPending(false);
|
|
1525
|
+
}, () => {
|
|
1526
|
+
if (pendingDescriptionImageUploadRef.current !== upload)
|
|
1527
|
+
return;
|
|
1528
|
+
pendingDescriptionImageUploadRef.current = null;
|
|
1529
|
+
setDescriptionImageUploadPending(false);
|
|
1530
|
+
});
|
|
1531
|
+
}, []);
|
|
1532
|
+
const awaitPendingDescriptionImageUpload = useCallback(async () => {
|
|
1533
|
+
const upload = pendingDescriptionImageUploadRef.current;
|
|
1534
|
+
if (upload)
|
|
1535
|
+
await upload;
|
|
1536
|
+
}, []);
|
|
1183
1537
|
const [attachmentsDirty, setAttachmentsDirty] = useState(false);
|
|
1184
1538
|
const dataVersionRef = useRef(null);
|
|
1185
|
-
const
|
|
1186
|
-
const archiveBootstrapTimerRef = useRef(null);
|
|
1539
|
+
const ambiguousRealtimeConfirmationTimerRef = useRef(null);
|
|
1187
1540
|
const skippedInitialTaskTabRefreshRef = useRef(false);
|
|
1188
1541
|
const authSessionResolvedRef = useRef(authSessionResolved);
|
|
1189
1542
|
const authRequiredForApiRef = useRef(authRequiredForApi);
|
|
1190
1543
|
const isAuthenticatedRef = useRef(isAuthenticated);
|
|
1191
|
-
const hasLoadedUiStateRef = useRef(false);
|
|
1192
|
-
const lastLoadedUiStateKeyRef = useRef('');
|
|
1193
1544
|
const lastAssigneeOptionsLoadKeyRef = useRef('');
|
|
1194
1545
|
const lastConfigRefreshKeyRef = useRef('');
|
|
1195
1546
|
const lastWorkspaceSyncStateLoadKeyRef = useRef('');
|
|
1196
1547
|
const lastTaskSurfaceLoadKeyRef = useRef('');
|
|
1197
1548
|
const lastSettingsSurfaceLoadKeyRef = useRef('');
|
|
1198
|
-
const skipNextUiStatePersistRef = useRef(false);
|
|
1199
|
-
const activeWorkspaceModuleOverridePendingRef = useRef(false);
|
|
1200
1549
|
const referenceDataRequestRef = useRef(null);
|
|
1201
1550
|
const workspaceListHydratedRef = useRef(false);
|
|
1202
1551
|
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
1552
|
const { handleSaveSettings, handleSaveTheme, handleSaveGlobalTheme, handleJsonBackupEnabledChange, handleSaveGlobalJsonBackupEnabled, handleSaveGlobalWeekStartsOn, handleSaveLocale, handleManualComplexityEnabledChange, handleChecklistDropdownEnabledChange, handleShowTaskCardStatusLabelChange, handleResetProjectToGlobal } = useSettingsPersistence({
|
|
1211
1553
|
keyShortcut,
|
|
1212
1554
|
themeUseGlobalDefault,
|
|
@@ -1224,8 +1566,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1224
1566
|
setLocale,
|
|
1225
1567
|
setManualComplexityEnabled,
|
|
1226
1568
|
setChecklistDropdownEnabled,
|
|
1227
|
-
setShowTaskCardStatusLabel
|
|
1228
|
-
setShowChecklist
|
|
1569
|
+
setShowTaskCardStatusLabel
|
|
1229
1570
|
});
|
|
1230
1571
|
useEffect(() => {
|
|
1231
1572
|
if (runtimeMode !== 'cloud')
|
|
@@ -1239,233 +1580,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1239
1580
|
authRequiredForApiRef.current = authRequiredForApi;
|
|
1240
1581
|
isAuthenticatedRef.current = isAuthenticated;
|
|
1241
1582
|
}, [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,
|
|
1583
|
+
const { hasLoadedUiStateRef, loadPersistedUiState, resetPersistedUiStateLoad, setActiveWorkspaceModule, uiStateReady } = usePersistedAppUiState({
|
|
1584
|
+
runtimeMode,
|
|
1585
|
+
workspaceUiStateScope,
|
|
1586
|
+
currentWorkspaceId,
|
|
1587
|
+
currentWorkspaceIdRef,
|
|
1588
|
+
referenceDataLoaded,
|
|
1589
|
+
activeCategories,
|
|
1590
|
+
activeTypes,
|
|
1591
|
+
priorities,
|
|
1592
|
+
taxonomies,
|
|
1449
1593
|
activeWorkspaceModule,
|
|
1594
|
+
setActiveWorkspaceModuleState,
|
|
1595
|
+
groupBy,
|
|
1596
|
+
setGroupBy,
|
|
1450
1597
|
emptyColumnMode,
|
|
1598
|
+
setEmptyColumnMode,
|
|
1599
|
+
taskScope,
|
|
1600
|
+
setTaskScope,
|
|
1601
|
+
openTaskId: editingTaskId,
|
|
1602
|
+
setPendingOpenTaskId: setPendingOpenTaskIdFromPersistedState,
|
|
1603
|
+
compressedCards,
|
|
1604
|
+
setCompressedCards,
|
|
1451
1605
|
zenMode,
|
|
1606
|
+
setZenModeState,
|
|
1452
1607
|
searchQuery,
|
|
1608
|
+
setSearchQuery,
|
|
1609
|
+
collapsedCategories,
|
|
1610
|
+
setCollapsedCategories,
|
|
1453
1611
|
filterCategories,
|
|
1612
|
+
setFilterCategories,
|
|
1454
1613
|
filterPriorities,
|
|
1614
|
+
setFilterPriorities,
|
|
1455
1615
|
filterTypes,
|
|
1616
|
+
setFilterTypes,
|
|
1456
1617
|
filterStatus,
|
|
1618
|
+
setFilterStatus,
|
|
1457
1619
|
filterAssignees,
|
|
1620
|
+
setFilterAssignees,
|
|
1458
1621
|
filterAssigneesAllSelected,
|
|
1622
|
+
setFilterAssigneesAllSelected,
|
|
1459
1623
|
filterTaxonomies,
|
|
1460
|
-
|
|
1624
|
+
setFilterTaxonomies,
|
|
1461
1625
|
sortBy,
|
|
1626
|
+
setSortBy,
|
|
1462
1627
|
sortOrder,
|
|
1628
|
+
setSortOrder,
|
|
1463
1629
|
hasInitedFilters,
|
|
1464
|
-
|
|
1630
|
+
setHasInitedFilters,
|
|
1465
1631
|
lastUsedCategory,
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1632
|
+
setLastUsedCategory,
|
|
1633
|
+
taskforceAgentId,
|
|
1634
|
+
setTaskforceAgentId,
|
|
1635
|
+
taskforceAgentConversationId,
|
|
1636
|
+
setTaskforceAgentConversationId,
|
|
1637
|
+
taskforceAgentConversationByAgentId,
|
|
1638
|
+
setTaskforceAgentConversationByAgentId
|
|
1639
|
+
});
|
|
1469
1640
|
const applyBootstrapConfig = useCallback((data) => {
|
|
1470
1641
|
const nextRuntimeMode = data.runtimeMode === 'cloud' ? 'cloud' : 'local';
|
|
1471
1642
|
const nextAuthRequiredForApi = Boolean(data.authRequiredForApi);
|
|
@@ -1488,7 +1659,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1488
1659
|
if (typeof data.workspaceId === 'string' && data.workspaceId.trim().length > 0) {
|
|
1489
1660
|
const nextWorkspaceId = data.workspaceId.trim();
|
|
1490
1661
|
if (nextRuntimeMode === 'local') {
|
|
1491
|
-
|
|
1662
|
+
const previousWorkspaceId = String(currentWorkspaceIdRef.current || '').trim() || 'default';
|
|
1663
|
+
commitCurrentWorkspaceId(nextWorkspaceId, {
|
|
1664
|
+
skipTransitionReset: !configLoaded && previousWorkspaceId === 'default'
|
|
1665
|
+
});
|
|
1492
1666
|
}
|
|
1493
1667
|
else {
|
|
1494
1668
|
applyResolvedWorkspaceId(nextWorkspaceId);
|
|
@@ -1591,9 +1765,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1591
1765
|
setShowTaskCardStatusLabel(data.showTaskCardStatusLabel);
|
|
1592
1766
|
}
|
|
1593
1767
|
else {
|
|
1594
|
-
setShowTaskCardStatusLabel(
|
|
1768
|
+
setShowTaskCardStatusLabel(false);
|
|
1595
1769
|
}
|
|
1596
|
-
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId]);
|
|
1770
|
+
}, [applyResolvedWorkspaceId, commitCurrentWorkspaceId, configLoaded, currentWorkspaceIdRef]);
|
|
1597
1771
|
const fetchBuildInfo = useCallback(async () => {
|
|
1598
1772
|
const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
1599
1773
|
try {
|
|
@@ -1636,9 +1810,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1636
1810
|
fetchBuildInfo,
|
|
1637
1811
|
markBootstrapPhase,
|
|
1638
1812
|
markBootstrapStalled,
|
|
1639
|
-
fetchWorkflows,
|
|
1640
1813
|
fetchInitiativeTemplates,
|
|
1641
|
-
loadAvailableEnvironments,
|
|
1642
1814
|
setReferenceDataLoaded,
|
|
1643
1815
|
setCustomCategories,
|
|
1644
1816
|
setCustomTypes,
|
|
@@ -1689,11 +1861,10 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1689
1861
|
settingsSection,
|
|
1690
1862
|
workspaceBootstrapPending,
|
|
1691
1863
|
fetchTasks,
|
|
1692
|
-
fetchArchive,
|
|
1693
1864
|
fetchPlanningEntities,
|
|
1694
1865
|
refreshTaskCollections,
|
|
1695
1866
|
loadWorkspaceSyncState,
|
|
1696
|
-
|
|
1867
|
+
switchLocalCoordinatorWorkspace,
|
|
1697
1868
|
hasBootstrappedDataRef
|
|
1698
1869
|
});
|
|
1699
1870
|
const refreshSetupContext = useCallback(async () => {
|
|
@@ -1749,8 +1920,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1749
1920
|
const result = await runCloudBootstrap({
|
|
1750
1921
|
reason: 'post-plans',
|
|
1751
1922
|
ignoreAuthGuard: true,
|
|
1752
|
-
tasksSilent: true
|
|
1753
|
-
includeDeferredArchive: false
|
|
1923
|
+
tasksSilent: true
|
|
1754
1924
|
});
|
|
1755
1925
|
if (!result.authenticated) {
|
|
1756
1926
|
return { success: false, destination: 'login', error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1797,8 +1967,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1797
1967
|
const result = await runCloudBootstrap({
|
|
1798
1968
|
reason,
|
|
1799
1969
|
ignoreAuthGuard: true,
|
|
1800
|
-
tasksSilent: true
|
|
1801
|
-
includeDeferredArchive: false
|
|
1970
|
+
tasksSilent: true
|
|
1802
1971
|
});
|
|
1803
1972
|
if (!result.authenticated) {
|
|
1804
1973
|
return { success: false, error: result.error || 'Sign in required.', code: result.code || 'AUTH_REQUIRED' };
|
|
@@ -1979,7 +2148,11 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1979
2148
|
method: 'POST',
|
|
1980
2149
|
headers: { 'Content-Type': 'application/json' },
|
|
1981
2150
|
credentials: 'include',
|
|
1982
|
-
body: JSON.stringify({
|
|
2151
|
+
body: JSON.stringify(buildTaskforceCredentialLoginPayload({
|
|
2152
|
+
email: trimmedEmail,
|
|
2153
|
+
password: rawPassword,
|
|
2154
|
+
activeWorkspaceId: currentWorkspaceIdRef.current,
|
|
2155
|
+
}))
|
|
1983
2156
|
});
|
|
1984
2157
|
const data = await res.json().catch(() => ({}));
|
|
1985
2158
|
if (!res.ok || !data?.success) {
|
|
@@ -1990,24 +2163,34 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
1990
2163
|
if (!entry.success) {
|
|
1991
2164
|
return { success: false, error: entry.error || 'Unable to resolve workspace after sign in.', code: entry.code };
|
|
1992
2165
|
}
|
|
2166
|
+
dispatchTaskforceAuthSessionChanged();
|
|
1993
2167
|
return { success: true, workspaceSetupRequired: entry.workspaceSetupRequired === true };
|
|
1994
2168
|
}
|
|
1995
2169
|
catch {
|
|
1996
2170
|
return { success: false, error: 'Sign in failed.' };
|
|
1997
2171
|
}
|
|
1998
|
-
}, [resolveCloudAuthUrl, cloudAuthConfigured, resolvePostAuthCloudEntry]);
|
|
2172
|
+
}, [resolveCloudAuthUrl, cloudAuthConfigured, currentWorkspaceIdRef, resolvePostAuthCloudEntry]);
|
|
1999
2173
|
/**
|
|
2000
2174
|
* Initiates an OAuth login (or invite-claim) flow by redirecting the browser
|
|
2001
2175
|
* to the provider's authorisation URL via the server-side start route.
|
|
2002
2176
|
*
|
|
2003
2177
|
* @param provider - 'google' | 'github' | 'apple'
|
|
2004
2178
|
* @param returnTo - Optional relative path to redirect back to after auth (defaults to '/').
|
|
2005
|
-
|
|
2179
|
+
* @param inviteToken - Optional invite token; when provided the flow uses `invite_claim` mode.
|
|
2006
2180
|
*/
|
|
2007
2181
|
const beginOAuthLogin = useCallback((provider, returnTo, inviteToken) => {
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2182
|
+
let sanitizedReturnTo = '/';
|
|
2183
|
+
try {
|
|
2184
|
+
const parsedReturnTo = new URL(String(returnTo || '/'), 'https://taskforce.local');
|
|
2185
|
+
if (parsedReturnTo.origin === 'https://taskforce.local'
|
|
2186
|
+
&& String(returnTo || '/').startsWith('/')
|
|
2187
|
+
&& !String(returnTo || '/').startsWith('//')) {
|
|
2188
|
+
sanitizedReturnTo = `${parsedReturnTo.pathname}${parsedReturnTo.search}${parsedReturnTo.hash}`;
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
catch {
|
|
2192
|
+
sanitizedReturnTo = '/';
|
|
2193
|
+
}
|
|
2011
2194
|
let path = `/api/taskforce/auth/oauth/${encodeURIComponent(provider)}/start?return_to=${encodeURIComponent(sanitizedReturnTo)}`;
|
|
2012
2195
|
if (inviteToken) {
|
|
2013
2196
|
path += `&invite_token=${encodeURIComponent(inviteToken)}`;
|
|
@@ -2407,7 +2590,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2407
2590
|
if (!cloudAuthConfigured)
|
|
2408
2591
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2409
2592
|
try {
|
|
2410
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2593
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods'), {
|
|
2411
2594
|
credentials: 'include'
|
|
2412
2595
|
});
|
|
2413
2596
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2424,7 +2607,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2424
2607
|
if (!cloudAuthConfigured)
|
|
2425
2608
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2426
2609
|
try {
|
|
2427
|
-
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/
|
|
2610
|
+
const res = await fetch(resolveCloudAuthUrl(`/api/taskforce/auth/login-methods/${encodeURIComponent(provider)}`), {
|
|
2428
2611
|
method: 'DELETE',
|
|
2429
2612
|
credentials: 'include'
|
|
2430
2613
|
});
|
|
@@ -2442,7 +2625,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2442
2625
|
if (!cloudAuthConfigured)
|
|
2443
2626
|
return { success: false, error: 'Cloud auth not configured.' };
|
|
2444
2627
|
try {
|
|
2445
|
-
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/
|
|
2628
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/login-methods/password'), {
|
|
2446
2629
|
method: 'POST',
|
|
2447
2630
|
headers: { 'Content-Type': 'application/json' },
|
|
2448
2631
|
credentials: 'include',
|
|
@@ -2458,6 +2641,28 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2458
2641
|
return { success: false, error: 'Failed to add password.' };
|
|
2459
2642
|
}
|
|
2460
2643
|
}, [resolveCloudAuthUrl, cloudAuthConfigured]);
|
|
2644
|
+
const changePassword = useCallback(async (currentPassword, newPassword) => {
|
|
2645
|
+
if (!cloudAuthConfigured)
|
|
2646
|
+
return { success: false, error: 'Cloud auth not configured.' };
|
|
2647
|
+
try {
|
|
2648
|
+
const res = await fetch(resolveCloudAuthUrl('/api/taskforce/auth/password/change'), {
|
|
2649
|
+
method: 'POST',
|
|
2650
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2651
|
+
credentials: 'include',
|
|
2652
|
+
body: JSON.stringify({ currentPassword, newPassword })
|
|
2653
|
+
});
|
|
2654
|
+
const data = await res.json().catch(() => ({}));
|
|
2655
|
+
if (!res.ok || !data?.success) {
|
|
2656
|
+
return { success: false, error: data?.error || 'Failed to change password.', code: data?.code };
|
|
2657
|
+
}
|
|
2658
|
+
await checkAuthSession({ force: true });
|
|
2659
|
+
dispatchTaskforceAuthSessionChanged();
|
|
2660
|
+
return { success: true };
|
|
2661
|
+
}
|
|
2662
|
+
catch {
|
|
2663
|
+
return { success: false, error: 'Failed to change password.' };
|
|
2664
|
+
}
|
|
2665
|
+
}, [resolveCloudAuthUrl, cloudAuthConfigured, checkAuthSession]);
|
|
2461
2666
|
const beginOAuthLink = useCallback((provider, returnTo) => {
|
|
2462
2667
|
const sanitizedReturnTo = returnTo && /^\/[A-Za-z0-9_\-./?=&%]*$/.test(returnTo)
|
|
2463
2668
|
? returnTo
|
|
@@ -2468,13 +2673,12 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2468
2673
|
const resetCloudLogoutClientState = useCallback(() => {
|
|
2469
2674
|
abortWorkspaceScopedRequests();
|
|
2470
2675
|
referenceDataRequestRef.current = null;
|
|
2471
|
-
lastLoadedUiStateKeyRef.current = '';
|
|
2472
2676
|
lastAssigneeOptionsLoadKeyRef.current = '';
|
|
2473
2677
|
lastConfigRefreshKeyRef.current = '';
|
|
2474
2678
|
lastWorkspaceSyncStateLoadKeyRef.current = '';
|
|
2475
2679
|
lastTaskSurfaceLoadKeyRef.current = '';
|
|
2476
2680
|
lastSettingsSurfaceLoadKeyRef.current = '';
|
|
2477
|
-
|
|
2681
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2478
2682
|
setReferenceDataLoaded(false);
|
|
2479
2683
|
setAssigneeOptions(createDefaultAssigneeOptions());
|
|
2480
2684
|
setAssigneeOptionsLoaded(false);
|
|
@@ -2484,16 +2688,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2484
2688
|
setInitiatives([]);
|
|
2485
2689
|
setWorkstreams([]);
|
|
2486
2690
|
setPlanningBootstrapTaskSummaries([]);
|
|
2691
|
+
setPlanningLoadState(createInitialPlanningLoadState());
|
|
2487
2692
|
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]);
|
|
2693
|
+
}, [abortWorkspaceScopedRequests, resetPersistedUiStateLoad, setArchivedTasks, setTasks]);
|
|
2497
2694
|
const logout = useCallback(async () => {
|
|
2498
2695
|
try {
|
|
2499
2696
|
if (cloudAuthConfigured) {
|
|
@@ -2529,7 +2726,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2529
2726
|
setSetupState(null);
|
|
2530
2727
|
setBootstrapPhase('idle');
|
|
2531
2728
|
setBootstrapError(null);
|
|
2532
|
-
|
|
2729
|
+
resetPersistedUiStateLoad({ clearLoaded: true });
|
|
2533
2730
|
if (runtimeMode !== 'local') {
|
|
2534
2731
|
clearPersistedWorkspaceId(workspaceSelectionScope);
|
|
2535
2732
|
}
|
|
@@ -2565,29 +2762,64 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2565
2762
|
fetchTasks,
|
|
2566
2763
|
resetCloudLogoutClientState
|
|
2567
2764
|
]);
|
|
2765
|
+
const initiativeTemplateOperationRef = useRef(null);
|
|
2766
|
+
const runInitiativeMutation = useCallback(async (url, init, operationIdOverride) => {
|
|
2767
|
+
if (!globalThis.crypto?.randomUUID)
|
|
2768
|
+
throw new Error('Secure initiative operation identity generation is unavailable.');
|
|
2769
|
+
const operationId = operationIdOverride || `operation-${globalThis.crypto.randomUUID()}`;
|
|
2770
|
+
const requestInit = {
|
|
2771
|
+
...init,
|
|
2772
|
+
headers: { ...(init.headers || {}), 'x-taskforce-operation-id': operationId },
|
|
2773
|
+
};
|
|
2774
|
+
try {
|
|
2775
|
+
return await fetch(url, requestInit);
|
|
2776
|
+
}
|
|
2777
|
+
catch {
|
|
2778
|
+
return fetch(url, requestInit);
|
|
2779
|
+
}
|
|
2780
|
+
}, []);
|
|
2781
|
+
const workstreamHttpMutationClient = useMemo(() => createCloudWorkstreamHttpMutationClient(), []);
|
|
2568
2782
|
const createInitiativeFromTemplate = useCallback(async (payload) => {
|
|
2569
2783
|
try {
|
|
2570
|
-
const
|
|
2784
|
+
const requestBody = JSON.stringify(payload);
|
|
2785
|
+
if (initiativeTemplateOperationRef.current?.requestBody !== requestBody) {
|
|
2786
|
+
if (!globalThis.crypto?.randomUUID) {
|
|
2787
|
+
throw new Error('Secure initiative operation identity generation is unavailable.');
|
|
2788
|
+
}
|
|
2789
|
+
initiativeTemplateOperationRef.current = {
|
|
2790
|
+
requestBody,
|
|
2791
|
+
operationId: `operation-${globalThis.crypto.randomUUID()}`,
|
|
2792
|
+
};
|
|
2793
|
+
}
|
|
2794
|
+
const res = await runInitiativeMutation('/api/taskforce/initiative-templates/create', {
|
|
2571
2795
|
method: 'POST',
|
|
2572
2796
|
headers: { 'Content-Type': 'application/json' },
|
|
2573
|
-
body:
|
|
2574
|
-
});
|
|
2797
|
+
body: requestBody
|
|
2798
|
+
}, initiativeTemplateOperationRef.current.operationId);
|
|
2575
2799
|
const data = await res.json().catch(() => ({}));
|
|
2576
2800
|
if (!res.ok || !data?.success) {
|
|
2577
2801
|
return { success: false, error: data?.error || `Create failed (${res.status})` };
|
|
2578
2802
|
}
|
|
2803
|
+
initiativeTemplateOperationRef.current = null;
|
|
2579
2804
|
await fetchTasks(true);
|
|
2580
2805
|
return { success: true, result: data?.results };
|
|
2581
2806
|
}
|
|
2582
2807
|
catch (error) {
|
|
2583
2808
|
return { success: false, error: error.message };
|
|
2584
2809
|
}
|
|
2585
|
-
}, [fetchTasks]);
|
|
2810
|
+
}, [fetchTasks, runInitiativeMutation]);
|
|
2586
2811
|
const createInitiative = useCallback(async (payload) => {
|
|
2587
|
-
|
|
2812
|
+
if (!globalThis.crypto?.randomUUID)
|
|
2813
|
+
throw new Error('Secure initiative identity generation is unavailable.');
|
|
2814
|
+
const stablePayload = {
|
|
2815
|
+
...(payload || {}),
|
|
2816
|
+
id: payload?.id || `initiative-${globalThis.crypto.randomUUID()}`,
|
|
2817
|
+
createdAt: payload?.createdAt || new Date().toISOString(),
|
|
2818
|
+
};
|
|
2819
|
+
const res = await runInitiativeMutation('/api/taskforce/initiative', {
|
|
2588
2820
|
method: 'POST',
|
|
2589
2821
|
headers: { 'Content-Type': 'application/json' },
|
|
2590
|
-
body: JSON.stringify(
|
|
2822
|
+
body: JSON.stringify(stablePayload)
|
|
2591
2823
|
});
|
|
2592
2824
|
const data = await res.json().catch(() => ({}));
|
|
2593
2825
|
if (!res.ok) {
|
|
@@ -2596,9 +2828,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2596
2828
|
await fetchPlanningEntities();
|
|
2597
2829
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2598
2830
|
return data;
|
|
2599
|
-
}, [fetchPlanningEntities]);
|
|
2831
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2600
2832
|
const updateInitiative = useCallback(async (id, payload) => {
|
|
2601
|
-
const res = await
|
|
2833
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}`, {
|
|
2602
2834
|
method: 'PATCH',
|
|
2603
2835
|
headers: { 'Content-Type': 'application/json' },
|
|
2604
2836
|
body: JSON.stringify(payload || {})
|
|
@@ -2610,12 +2842,30 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2610
2842
|
await fetchPlanningEntities();
|
|
2611
2843
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2612
2844
|
return data;
|
|
2613
|
-
}, [fetchPlanningEntities]);
|
|
2845
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2846
|
+
const updatePlanningIdentity = useCallback(async (entityType, id, patch) => {
|
|
2847
|
+
const res = await runInitiativeMutation(`/api/taskforce/${entityType}/${encodeURIComponent(id)}/identity`, {
|
|
2848
|
+
method: 'PATCH',
|
|
2849
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2850
|
+
body: JSON.stringify(patch),
|
|
2851
|
+
});
|
|
2852
|
+
const data = await res.json().catch(() => ({}));
|
|
2853
|
+
if (!res.ok)
|
|
2854
|
+
throw new Error(data?.error || `Failed to update ${entityType} identity (${res.status})`);
|
|
2855
|
+
if (entityType === 'initiative') {
|
|
2856
|
+
setInitiatives((current) => upsertEntityById(current, data));
|
|
2857
|
+
}
|
|
2858
|
+
else {
|
|
2859
|
+
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2860
|
+
}
|
|
2861
|
+
void fetchPlanningEntities();
|
|
2862
|
+
return data;
|
|
2863
|
+
}, [fetchPlanningEntities, runInitiativeMutation]);
|
|
2614
2864
|
const refreshPlanningEntitiesInBackground = useCallback(() => {
|
|
2615
2865
|
void fetchPlanningEntities();
|
|
2616
2866
|
}, [fetchPlanningEntities]);
|
|
2617
2867
|
const archiveInitiative = useCallback(async (id) => {
|
|
2618
|
-
const res = await
|
|
2868
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/archive`, {
|
|
2619
2869
|
method: 'POST',
|
|
2620
2870
|
});
|
|
2621
2871
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2625,9 +2875,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2625
2875
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2626
2876
|
refreshPlanningEntitiesInBackground();
|
|
2627
2877
|
return data;
|
|
2628
|
-
}, [refreshPlanningEntitiesInBackground]);
|
|
2878
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2629
2879
|
const unarchiveInitiative = useCallback(async (id) => {
|
|
2630
|
-
const res = await
|
|
2880
|
+
const res = await runInitiativeMutation(`/api/taskforce/initiative/${encodeURIComponent(id)}/unarchive`, {
|
|
2631
2881
|
method: 'POST',
|
|
2632
2882
|
});
|
|
2633
2883
|
const data = await res.json().catch(() => ({}));
|
|
@@ -2637,59 +2887,149 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2637
2887
|
setInitiatives((current) => upsertEntityById(current, data));
|
|
2638
2888
|
refreshPlanningEntitiesInBackground();
|
|
2639
2889
|
return data;
|
|
2640
|
-
}, [refreshPlanningEntitiesInBackground]);
|
|
2890
|
+
}, [refreshPlanningEntitiesInBackground, runInitiativeMutation]);
|
|
2641
2891
|
const createWorkstream = useCallback(async (payload) => {
|
|
2642
|
-
const
|
|
2892
|
+
const attempt = await workstreamHttpMutationClient.prepareCreate(currentWorkspaceIdRef.current || 'default', (payload || {}));
|
|
2893
|
+
const res = await fetchWorkstreamHttpMutation('/api/taskforce/workstream', {
|
|
2643
2894
|
method: 'POST',
|
|
2644
2895
|
headers: { 'Content-Type': 'application/json' },
|
|
2645
|
-
body: JSON.stringify(
|
|
2646
|
-
});
|
|
2896
|
+
body: JSON.stringify(attempt.body)
|
|
2897
|
+
}, attempt.operationId);
|
|
2898
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2647
2899
|
const data = await res.json().catch(() => ({}));
|
|
2648
2900
|
if (!res.ok) {
|
|
2649
|
-
|
|
2901
|
+
if (conclusiveRejection) {
|
|
2902
|
+
await workstreamHttpMutationClient.abandonCreate(attempt.fingerprint, attempt.operationId);
|
|
2903
|
+
}
|
|
2904
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2905
|
+
throw new Error(`${data?.error || `Failed to create workstream (${res.status})`}${retryGuidance}`);
|
|
2650
2906
|
}
|
|
2907
|
+
if (data?.id !== attempt.body.id)
|
|
2908
|
+
throw new Error('Created workstream identity did not match the retained request identity.');
|
|
2909
|
+
await workstreamHttpMutationClient.confirmCreate(attempt.fingerprint, attempt.operationId);
|
|
2651
2910
|
await fetchPlanningEntities();
|
|
2652
|
-
setWorkstreams((current) =>
|
|
2911
|
+
setWorkstreams((current) => {
|
|
2912
|
+
const created = selectCreatedWorkstreamAfterRefresh(current, data);
|
|
2913
|
+
return created ? upsertEntityById(current, created) : current;
|
|
2914
|
+
});
|
|
2653
2915
|
return data;
|
|
2654
|
-
}, [fetchPlanningEntities]);
|
|
2916
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient]);
|
|
2655
2917
|
const updateWorkstream = useCallback(async (id, payload) => {
|
|
2656
|
-
const
|
|
2918
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}`;
|
|
2919
|
+
const body = (payload || {});
|
|
2920
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
2921
|
+
const observedState = observed ? {
|
|
2922
|
+
updatedAt: observed.updatedAt || null,
|
|
2923
|
+
initiativeId: observed.initiativeId || null,
|
|
2924
|
+
ownerId: observed.ownerId || null,
|
|
2925
|
+
isArchived: Boolean(observed.isArchived),
|
|
2926
|
+
} : null;
|
|
2927
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, observedState);
|
|
2928
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2657
2929
|
method: 'PATCH',
|
|
2658
2930
|
headers: { 'Content-Type': 'application/json' },
|
|
2659
|
-
body: JSON.stringify(
|
|
2660
|
-
});
|
|
2931
|
+
body: JSON.stringify(body)
|
|
2932
|
+
}, attempt.operationId);
|
|
2933
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2661
2934
|
const data = await res.json().catch(() => ({}));
|
|
2662
2935
|
if (!res.ok) {
|
|
2663
|
-
|
|
2936
|
+
if (conclusiveRejection) {
|
|
2937
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2938
|
+
}
|
|
2939
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2940
|
+
throw new Error(`${data?.error || `Failed to update workstream (${res.status})`}${retryGuidance}`);
|
|
2664
2941
|
}
|
|
2942
|
+
if (data?.id !== id)
|
|
2943
|
+
throw new Error('Updated workstream identity did not match the requested workstream.');
|
|
2944
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2665
2945
|
await fetchPlanningEntities();
|
|
2666
2946
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2667
2947
|
return data;
|
|
2668
|
-
}, [fetchPlanningEntities]);
|
|
2948
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2949
|
+
const reorderWorkstreamTasks = useCallback(async (workstreamId, taskIds) => {
|
|
2950
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(workstreamId)}/task-order`;
|
|
2951
|
+
const body = { taskIds };
|
|
2952
|
+
const observed = workstreams.find((workstream) => workstream.id === workstreamId);
|
|
2953
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, body, {
|
|
2954
|
+
updatedAt: observed?.updatedAt || null,
|
|
2955
|
+
workstreamId,
|
|
2956
|
+
});
|
|
2957
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2958
|
+
method: 'POST',
|
|
2959
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2960
|
+
body: JSON.stringify(body),
|
|
2961
|
+
}, attempt.operationId);
|
|
2962
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2963
|
+
const data = await res.json().catch(() => ({}));
|
|
2964
|
+
if (!res.ok) {
|
|
2965
|
+
if (conclusiveRejection) {
|
|
2966
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2967
|
+
}
|
|
2968
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2969
|
+
throw new Error(`${data?.error || `Failed to reorder workstream tasks (${res.status})`}${retryGuidance}`);
|
|
2970
|
+
}
|
|
2971
|
+
if (data?.workstreamId !== workstreamId || !Array.isArray(data?.taskIds)) {
|
|
2972
|
+
throw new Error('Reordered workstream task response did not match the request.');
|
|
2973
|
+
}
|
|
2974
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2975
|
+
const orderById = new Map(data.taskIds.map((taskId, index) => [taskId, (index + 1) * 1024]));
|
|
2976
|
+
setTasks((current) => current.map((task) => orderById.has(task.id)
|
|
2977
|
+
? { ...task, workstreamOrder: orderById.get(task.id) }
|
|
2978
|
+
: task));
|
|
2979
|
+
await fetchPlanningEntities();
|
|
2980
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2669
2981
|
const archiveWorkstream = useCallback(async (id) => {
|
|
2670
|
-
const
|
|
2982
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/archive`;
|
|
2983
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
2984
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
|
|
2985
|
+
updatedAt: observed.updatedAt || null,
|
|
2986
|
+
isArchived: Boolean(observed.isArchived),
|
|
2987
|
+
} : null);
|
|
2988
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2671
2989
|
method: 'POST',
|
|
2672
|
-
});
|
|
2990
|
+
}, attempt.operationId);
|
|
2991
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2673
2992
|
const data = await res.json().catch(() => ({}));
|
|
2674
2993
|
if (!res.ok) {
|
|
2675
|
-
|
|
2994
|
+
if (conclusiveRejection) {
|
|
2995
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
2996
|
+
}
|
|
2997
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
2998
|
+
throw new Error(`${data?.error || `Failed to archive workstream (${res.status})`}${retryGuidance}`);
|
|
2676
2999
|
}
|
|
3000
|
+
if (data?.id !== id)
|
|
3001
|
+
throw new Error('Archived workstream identity did not match the requested workstream.');
|
|
3002
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2677
3003
|
await fetchPlanningEntities();
|
|
2678
3004
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2679
3005
|
return data;
|
|
2680
|
-
}, [fetchPlanningEntities]);
|
|
3006
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2681
3007
|
const unarchiveWorkstream = useCallback(async (id) => {
|
|
2682
|
-
const
|
|
3008
|
+
const url = `/api/taskforce/workstream/${encodeURIComponent(id)}/unarchive`;
|
|
3009
|
+
const observed = workstreams.find((workstream) => workstream.id === id);
|
|
3010
|
+
const attempt = await workstreamHttpMutationClient.prepareMutation(currentWorkspaceIdRef.current || 'default', url, {}, observed ? {
|
|
3011
|
+
updatedAt: observed.updatedAt || null,
|
|
3012
|
+
isArchived: Boolean(observed.isArchived),
|
|
3013
|
+
} : null);
|
|
3014
|
+
const res = await fetchWorkstreamHttpMutation(url, {
|
|
2683
3015
|
method: 'POST',
|
|
2684
|
-
});
|
|
3016
|
+
}, attempt.operationId);
|
|
3017
|
+
const conclusiveRejection = !res.ok && await isConclusiveWorkstreamHttpResponse(res);
|
|
2685
3018
|
const data = await res.json().catch(() => ({}));
|
|
2686
3019
|
if (!res.ok) {
|
|
2687
|
-
|
|
3020
|
+
if (conclusiveRejection) {
|
|
3021
|
+
await workstreamHttpMutationClient.abandonMutation(attempt.fingerprint, attempt.operationId);
|
|
3022
|
+
}
|
|
3023
|
+
const retryGuidance = data?.retryAt ? ` Retry after ${data.retryAt}.` : '';
|
|
3024
|
+
throw new Error(`${data?.error || `Failed to unarchive workstream (${res.status})`}${retryGuidance}`);
|
|
2688
3025
|
}
|
|
3026
|
+
if (data?.id !== id)
|
|
3027
|
+
throw new Error('Unarchived workstream identity did not match the requested workstream.');
|
|
3028
|
+
await workstreamHttpMutationClient.confirmMutation(attempt.fingerprint, attempt.operationId);
|
|
2689
3029
|
await fetchPlanningEntities();
|
|
2690
3030
|
setWorkstreams((current) => upsertEntityById(current, data));
|
|
2691
3031
|
return data;
|
|
2692
|
-
}, [fetchPlanningEntities]);
|
|
3032
|
+
}, [currentWorkspaceIdRef, fetchPlanningEntities, workstreamHttpMutationClient, workstreams]);
|
|
2693
3033
|
// Initialize auth once, then bootstrap protected data once auth gates are settled.
|
|
2694
3034
|
const hasInitializedAuthRef = useRef(false);
|
|
2695
3035
|
useEffect(() => {
|
|
@@ -2765,23 +3105,63 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2765
3105
|
onTaskCountChange(tasks.length);
|
|
2766
3106
|
}
|
|
2767
3107
|
}, [tasks.length, onTaskCountChange]);
|
|
2768
|
-
const
|
|
2769
|
-
|
|
3108
|
+
const deepLinkRouteKey = useMemo(() => {
|
|
3109
|
+
const taskId = String(initialTaskId || '').trim();
|
|
3110
|
+
if (!taskId)
|
|
3111
|
+
return '';
|
|
3112
|
+
return [
|
|
3113
|
+
String(requestedWorkspaceId || '').trim(),
|
|
3114
|
+
taskId,
|
|
3115
|
+
String(initialActivityEntryId || '').trim()
|
|
3116
|
+
].join(':');
|
|
3117
|
+
}, [initialActivityEntryId, initialTaskId, requestedWorkspaceId]);
|
|
3118
|
+
const deepLinkRouteKeyRef = useRef(deepLinkRouteKey);
|
|
3119
|
+
deepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3120
|
+
const handledDeepLinkRouteKeyRef = useRef(null);
|
|
3121
|
+
const failedDeepLinkRouteKeyRef = useRef(null);
|
|
3122
|
+
const deepLinkWorkspaceSwitchRef = useRef(null);
|
|
3123
|
+
const deepLinkFailureNoticeOwnerKeyRef = useRef(null);
|
|
3124
|
+
const deepLinkCollectionLookupRef = useRef(null);
|
|
3125
|
+
const deepLinkArchiveSettledRef = useRef(new Set());
|
|
3126
|
+
const deepLinkDeletedSettledRef = useRef(new Set());
|
|
3127
|
+
const deepLinkRetryCountsRef = useRef(new Map());
|
|
3128
|
+
const deepLinkRetryTimerRef = useRef(null);
|
|
3129
|
+
const deepLinkWorkspaceSwitchRetryTimerRef = useRef(null);
|
|
3130
|
+
const [deepLinkRetryNonce, setDeepLinkRetryNonce] = useState(0);
|
|
2770
3131
|
useEffect(() => {
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
3132
|
+
const previousFailureNoticeOwnerKey = deepLinkFailureNoticeOwnerKeyRef.current;
|
|
3133
|
+
if (previousFailureNoticeOwnerKey
|
|
3134
|
+
&& uiNoticeRef.current?.ownerKey === previousFailureNoticeOwnerKey) {
|
|
3135
|
+
clearNotice();
|
|
3136
|
+
}
|
|
3137
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3138
|
+
handledDeepLinkRouteKeyRef.current = null;
|
|
3139
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3140
|
+
deepLinkWorkspaceSwitchRef.current = null;
|
|
3141
|
+
deepLinkCollectionLookupRef.current = null;
|
|
3142
|
+
deepLinkArchiveSettledRef.current.clear();
|
|
3143
|
+
deepLinkDeletedSettledRef.current.clear();
|
|
3144
|
+
deepLinkRetryCountsRef.current.clear();
|
|
3145
|
+
if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3146
|
+
window.clearTimeout(deepLinkRetryTimerRef.current);
|
|
3147
|
+
deepLinkRetryTimerRef.current = null;
|
|
3148
|
+
}
|
|
3149
|
+
if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3150
|
+
window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
|
|
3151
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
3152
|
+
}
|
|
3153
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3154
|
+
}, [clearNotice, deepLinkRouteKey]);
|
|
3155
|
+
useEffect(() => () => {
|
|
3156
|
+
if (deepLinkRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3157
|
+
window.clearTimeout(deepLinkRetryTimerRef.current);
|
|
3158
|
+
deepLinkRetryTimerRef.current = null;
|
|
3159
|
+
}
|
|
3160
|
+
if (deepLinkWorkspaceSwitchRetryTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3161
|
+
window.clearTimeout(deepLinkWorkspaceSwitchRetryTimerRef.current);
|
|
3162
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
2783
3163
|
}
|
|
2784
|
-
}, [
|
|
3164
|
+
}, []);
|
|
2785
3165
|
// Update active category logic
|
|
2786
3166
|
const hasInitedCategoryRef = useRef(false);
|
|
2787
3167
|
useEffect(() => {
|
|
@@ -2807,7 +3187,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2807
3187
|
}, [configLoaded, activeCategories, category, getPreferredCategoryValue, lastUsedCategory]);
|
|
2808
3188
|
// Sanitize tasks with invalid categories
|
|
2809
3189
|
useEffect(() => {
|
|
2810
|
-
if (!configLoaded || activeCategories.length === 0)
|
|
3190
|
+
if (!configLoaded || !referenceDataLoaded || activeCategories.length === 0)
|
|
2811
3191
|
return;
|
|
2812
3192
|
const needsSanitization = (t) => {
|
|
2813
3193
|
return !activeCategories.some(c => c.value === t.category);
|
|
@@ -2824,31 +3204,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2824
3204
|
setArchivedTasks(prev => prev.map(t => needsSanitization(t) ? { ...t, category: defaultCategory } : t));
|
|
2825
3205
|
}
|
|
2826
3206
|
}
|
|
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
|
-
}, []);
|
|
3207
|
+
}, [configLoaded, referenceDataLoaded, activeCategories, tasks, archivedTasks, getPreferredCategoryValue]);
|
|
2840
3208
|
// HMR Listener for Real-Time Updates
|
|
2841
3209
|
useEffect(() => {
|
|
2842
3210
|
if (import.meta.hot) {
|
|
2843
3211
|
import.meta.hot.on('taskforce:update', () => {
|
|
2844
3212
|
// console.log('[Taskforce] Received HMR update, refreshing data...');
|
|
2845
|
-
void refreshTaskCollections({ isSilent: true });
|
|
3213
|
+
void refreshTaskCollections({ isSilent: true, highlightChangedTaskIds: [] });
|
|
2846
3214
|
});
|
|
2847
3215
|
}
|
|
2848
3216
|
}, [refreshTaskCollections]);
|
|
2849
3217
|
const refreshTaskCollectionsForDataVersion = useCallback(async () => {
|
|
2850
|
-
await refreshTaskCollectionsFromInvalidation();
|
|
3218
|
+
await refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(['active', 'archive', 'deleted', 'planning'], { ambiguous: true }));
|
|
2851
3219
|
}, [refreshTaskCollectionsFromInvalidation]);
|
|
3220
|
+
useEffect(() => {
|
|
3221
|
+
if (typeof window === 'undefined')
|
|
3222
|
+
return;
|
|
3223
|
+
const handleTaskforceTasksMutated = (event) => {
|
|
3224
|
+
const detail = event.detail;
|
|
3225
|
+
const eventWorkspaceId = String(detail?.workspaceId || '').trim() || 'default';
|
|
3226
|
+
if (eventWorkspaceId !== currentWorkspaceId)
|
|
3227
|
+
return;
|
|
3228
|
+
if (detail?.authoritativeTask)
|
|
3229
|
+
return;
|
|
3230
|
+
void refreshTaskCollectionsFromInvalidation(createTaskInvalidationScope(detail?.affectedCollections?.length
|
|
3231
|
+
? detail.affectedCollections
|
|
3232
|
+
: ['active', 'archive'], { taskIds: detail?.taskId ? [detail.taskId] : [] }));
|
|
3233
|
+
};
|
|
3234
|
+
window.addEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
|
|
3235
|
+
return () => {
|
|
3236
|
+
window.removeEventListener(TASKFORCE_TASKS_MUTATED_EVENT, handleTaskforceTasksMutated);
|
|
3237
|
+
};
|
|
3238
|
+
}, [currentWorkspaceId, refreshTaskCollectionsFromInvalidation]);
|
|
2852
3239
|
const normalizedRealtimeWorkspaceId = String(currentWorkspaceId || '').trim();
|
|
2853
3240
|
const normalizedRealtimeUserId = String(authUserId || '').trim();
|
|
2854
3241
|
const realtimeSocketUrl = resolveWebSocketUrl('/taskforce-ws');
|
|
@@ -2861,23 +3248,35 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2861
3248
|
&& normalizedRealtimeWorkspaceId
|
|
2862
3249
|
&& !isReservedWorkspaceId(normalizedRealtimeWorkspaceId)
|
|
2863
3250
|
&& realtimeSocketUrl);
|
|
2864
|
-
|
|
3251
|
+
useEffect(() => {
|
|
3252
|
+
return () => {
|
|
3253
|
+
if (ambiguousRealtimeConfirmationTimerRef.current !== null && typeof window !== 'undefined') {
|
|
3254
|
+
window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
|
|
3255
|
+
ambiguousRealtimeConfirmationTimerRef.current = null;
|
|
3256
|
+
}
|
|
3257
|
+
};
|
|
3258
|
+
}, [currentWorkspaceId]);
|
|
3259
|
+
const handleCloudRealtimeSignal = useCallback((signal) => {
|
|
2865
3260
|
if (runtimeMode !== 'cloud')
|
|
2866
3261
|
return;
|
|
2867
|
-
|
|
2868
|
-
|
|
3262
|
+
dispatchTaskforceWorkspaceResourcesInvalidated({
|
|
3263
|
+
workspaceId: normalizedRealtimeWorkspaceId,
|
|
3264
|
+
source: 'realtime',
|
|
3265
|
+
});
|
|
3266
|
+
const scope = resolveRealtimeTaskInvalidation(signal.type, signal.invalidations);
|
|
3267
|
+
if (scope.collections.length === 0)
|
|
2869
3268
|
return;
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
void refreshTaskCollectionsFromInvalidation();
|
|
3269
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
3270
|
+
if (!scope.ambiguous || typeof window === 'undefined')
|
|
3271
|
+
return;
|
|
3272
|
+
if (ambiguousRealtimeConfirmationTimerRef.current !== null) {
|
|
3273
|
+
window.clearTimeout(ambiguousRealtimeConfirmationTimerRef.current);
|
|
3274
|
+
}
|
|
3275
|
+
ambiguousRealtimeConfirmationTimerRef.current = window.setTimeout(() => {
|
|
3276
|
+
ambiguousRealtimeConfirmationTimerRef.current = null;
|
|
3277
|
+
void refreshTaskCollectionsFromInvalidation(scope);
|
|
2879
3278
|
}, 250);
|
|
2880
|
-
}, [runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
3279
|
+
}, [normalizedRealtimeWorkspaceId, runtimeMode, refreshTaskCollectionsFromInvalidation]);
|
|
2881
3280
|
useRealtimeSync({
|
|
2882
3281
|
enabled: cloudRealtimeEnabled,
|
|
2883
3282
|
workspaceId: normalizedRealtimeWorkspaceId,
|
|
@@ -2887,6 +3286,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2887
3286
|
});
|
|
2888
3287
|
// Fallback sync for cross-process writes (e.g., MCP tools) that may miss watcher/websocket events.
|
|
2889
3288
|
useDataVersionRefresh({
|
|
3289
|
+
workspaceId: currentWorkspaceId,
|
|
2890
3290
|
isOpen,
|
|
2891
3291
|
authBlocked,
|
|
2892
3292
|
authRequiredForApi,
|
|
@@ -2897,7 +3297,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2897
3297
|
authRequiredForApiRef,
|
|
2898
3298
|
isAuthenticatedRef,
|
|
2899
3299
|
dataVersionRef,
|
|
2900
|
-
refreshTaskCollectionsForDataVersion
|
|
3300
|
+
refreshTaskCollectionsForDataVersion,
|
|
3301
|
+
coordinatorDataVersion: localCoordinatorDataVersion,
|
|
2901
3302
|
});
|
|
2902
3303
|
const relationshipTasks = useMemo(() => {
|
|
2903
3304
|
const byId = new Map();
|
|
@@ -2922,21 +3323,31 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2922
3323
|
return;
|
|
2923
3324
|
if (activeTab === 'tasks') {
|
|
2924
3325
|
const loadKey = `${currentWorkspaceId}:${activeTab}:${showArchive ? 'archive' : 'active'}:${taskScope}`;
|
|
3326
|
+
const requiresArchive = showArchive || taskScope === 'archived';
|
|
3327
|
+
const requiresDeleted = taskScope === 'deleted';
|
|
2925
3328
|
if (!skippedInitialTaskTabRefreshRef.current) {
|
|
2926
3329
|
skippedInitialTaskTabRefreshRef.current = true;
|
|
2927
3330
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
3331
|
+
if (requiresArchive) {
|
|
3332
|
+
void ensureArchiveHydrated(false);
|
|
3333
|
+
}
|
|
3334
|
+
if (requiresDeleted) {
|
|
3335
|
+
void ensureDeletedTasksHydrated(false);
|
|
3336
|
+
}
|
|
2928
3337
|
return;
|
|
2929
3338
|
}
|
|
2930
3339
|
if (lastTaskSurfaceLoadKeyRef.current === loadKey)
|
|
2931
3340
|
return;
|
|
2932
3341
|
lastTaskSurfaceLoadKeyRef.current = loadKey;
|
|
2933
|
-
|
|
3342
|
+
if (!requiresArchive && !requiresDeleted) {
|
|
3343
|
+
fetchTasks();
|
|
3344
|
+
}
|
|
2934
3345
|
fetchPlanningEntities();
|
|
2935
|
-
if (
|
|
2936
|
-
|
|
3346
|
+
if (requiresArchive) {
|
|
3347
|
+
void ensureArchiveHydrated(false);
|
|
2937
3348
|
}
|
|
2938
|
-
if (
|
|
2939
|
-
|
|
3349
|
+
if (requiresDeleted) {
|
|
3350
|
+
void ensureDeletedTasksHydrated(false);
|
|
2940
3351
|
}
|
|
2941
3352
|
return;
|
|
2942
3353
|
}
|
|
@@ -2946,9 +3357,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2946
3357
|
return;
|
|
2947
3358
|
lastSettingsSurfaceLoadKeyRef.current = loadKey;
|
|
2948
3359
|
fetchConfig();
|
|
2949
|
-
if (settingsSection === 'commands' || settingsSection === 'resources') {
|
|
2950
|
-
fetchWorkflows();
|
|
2951
|
-
}
|
|
2952
3360
|
}
|
|
2953
3361
|
}, [
|
|
2954
3362
|
currentWorkspaceId,
|
|
@@ -2959,10 +3367,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
2959
3367
|
taskScope,
|
|
2960
3368
|
fetchTasks,
|
|
2961
3369
|
fetchPlanningEntities,
|
|
2962
|
-
|
|
2963
|
-
|
|
3370
|
+
ensureArchiveHydrated,
|
|
3371
|
+
ensureDeletedTasksHydrated,
|
|
2964
3372
|
fetchConfig,
|
|
2965
|
-
fetchWorkflows,
|
|
2966
3373
|
shouldDeferProtectedApiCalls,
|
|
2967
3374
|
shouldBlockProtectedApiCalls,
|
|
2968
3375
|
workspaceBootstrapPending
|
|
@@ -3055,7 +3462,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3055
3462
|
}
|
|
3056
3463
|
setActiveTab__internal(tab);
|
|
3057
3464
|
}, [activeTab]);
|
|
3058
|
-
const flushAutoSaveRef = useRef(async () =>
|
|
3465
|
+
const flushAutoSaveRef = useRef(async () => true);
|
|
3059
3466
|
const { handleNavigation, handleClose, resetForm, resolveTaskIdInput, resolveWorkstreamIdInput, handleEdit, handleOpenTaskById, returnToPreviousTask, clearReturnToParentTask } = useTaskEditorNavigation({
|
|
3060
3467
|
activeCategories,
|
|
3061
3468
|
activeTypes,
|
|
@@ -3066,7 +3473,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3066
3473
|
description,
|
|
3067
3474
|
editingTaskId,
|
|
3068
3475
|
flushPendingAutoSave: () => flushAutoSaveRef.current(),
|
|
3476
|
+
getDescriptionDraft,
|
|
3069
3477
|
getPreferredCategoryValue,
|
|
3478
|
+
getTitleDraft,
|
|
3070
3479
|
lastUsedCategory,
|
|
3071
3480
|
newCommentText,
|
|
3072
3481
|
relationshipTasks,
|
|
@@ -3074,7 +3483,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3074
3483
|
showArchive,
|
|
3075
3484
|
taxonomies,
|
|
3076
3485
|
setActiveTab,
|
|
3077
|
-
setApproach,
|
|
3078
3486
|
setAssignee,
|
|
3079
3487
|
setAttachments,
|
|
3080
3488
|
setAttachmentsDirty,
|
|
@@ -3102,9 +3510,302 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3102
3510
|
taskReturnTrail,
|
|
3103
3511
|
title,
|
|
3104
3512
|
});
|
|
3513
|
+
useEffect(() => {
|
|
3514
|
+
const normalizedTaskId = String(pendingOpenTaskId || '').trim();
|
|
3515
|
+
if (!uiStateReady || !normalizedTaskId)
|
|
3516
|
+
return;
|
|
3517
|
+
if (editingTaskId === normalizedTaskId) {
|
|
3518
|
+
setPendingOpenTaskId(null);
|
|
3519
|
+
return;
|
|
3520
|
+
}
|
|
3521
|
+
if (loadingTasks || workspaceBootstrapPending)
|
|
3522
|
+
return;
|
|
3523
|
+
const matchesTask = (task) => (task.id === normalizedTaskId || task.id.endsWith(normalizedTaskId));
|
|
3524
|
+
const target = relationshipTasks.find(matchesTask);
|
|
3525
|
+
if (target) {
|
|
3526
|
+
handleOpenTaskById(normalizedTaskId);
|
|
3527
|
+
setPendingOpenTaskId(null);
|
|
3528
|
+
return;
|
|
3529
|
+
}
|
|
3530
|
+
const workspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3531
|
+
const archiveLookupKey = `${workspaceId}:${normalizedTaskId}`;
|
|
3532
|
+
if (archiveHydratedWorkspaceId !== workspaceId && !archiveLookupSettledKeys.has(archiveLookupKey)) {
|
|
3533
|
+
void ensureArchiveHydrated(true).finally(() => {
|
|
3534
|
+
const liveWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3535
|
+
if (liveWorkspaceId === workspaceId) {
|
|
3536
|
+
setArchiveLookupSettledKeys((current) => {
|
|
3537
|
+
if (current.has(archiveLookupKey))
|
|
3538
|
+
return current;
|
|
3539
|
+
return new Set(current).add(archiveLookupKey);
|
|
3540
|
+
});
|
|
3541
|
+
}
|
|
3542
|
+
});
|
|
3543
|
+
return;
|
|
3544
|
+
}
|
|
3545
|
+
const deletedTarget = deletedRelationshipTasks.find(matchesTask);
|
|
3546
|
+
if (deletedTarget) {
|
|
3547
|
+
handleEdit(deletedTarget);
|
|
3548
|
+
setPendingOpenTaskId(null);
|
|
3549
|
+
return;
|
|
3550
|
+
}
|
|
3551
|
+
if (deletedHydratedWorkspaceId !== workspaceId) {
|
|
3552
|
+
void ensureDeletedTasksHydrated(true);
|
|
3553
|
+
return;
|
|
3554
|
+
}
|
|
3555
|
+
setPendingOpenTaskId(null);
|
|
3556
|
+
}, [
|
|
3557
|
+
archiveHydratedWorkspaceId,
|
|
3558
|
+
archiveLookupSettledKeys,
|
|
3559
|
+
deletedHydratedWorkspaceId,
|
|
3560
|
+
deletedRelationshipTasks,
|
|
3561
|
+
editingTaskId,
|
|
3562
|
+
ensureArchiveHydrated,
|
|
3563
|
+
ensureDeletedTasksHydrated,
|
|
3564
|
+
handleEdit,
|
|
3565
|
+
handleOpenTaskById,
|
|
3566
|
+
loadingTasks,
|
|
3567
|
+
pendingOpenTaskId,
|
|
3568
|
+
relationshipTasks,
|
|
3569
|
+
uiStateReady,
|
|
3570
|
+
workspaceBootstrapPending
|
|
3571
|
+
]);
|
|
3572
|
+
// Deep links are workspace-scoped. In cloud mode, switch to the explicit
|
|
3573
|
+
// workspace before looking up the task. Local runtimes never cross their
|
|
3574
|
+
// configured workspace boundary.
|
|
3575
|
+
useEffect(() => {
|
|
3576
|
+
const normalizedTaskId = String(initialTaskId || '').trim();
|
|
3577
|
+
if (!normalizedTaskId || !deepLinkRouteKey)
|
|
3578
|
+
return;
|
|
3579
|
+
if (handledDeepLinkRouteKeyRef.current === deepLinkRouteKey
|
|
3580
|
+
|| !runtimeConfigReady
|
|
3581
|
+
|| !configLoaded
|
|
3582
|
+
|| !uiStateReady
|
|
3583
|
+
|| loadingTasks
|
|
3584
|
+
|| workspaceBootstrapPending) {
|
|
3585
|
+
return;
|
|
3586
|
+
}
|
|
3587
|
+
const explicitWorkspaceId = String(requestedWorkspaceId || '').trim();
|
|
3588
|
+
const activeWorkspaceId = String(currentWorkspaceIdRef.current || 'default').trim() || 'default';
|
|
3589
|
+
const clearOwnedFailureNotice = () => {
|
|
3590
|
+
const ownerKey = deepLinkFailureNoticeOwnerKeyRef.current;
|
|
3591
|
+
if (ownerKey && uiNoticeRef.current?.ownerKey === ownerKey) {
|
|
3592
|
+
clearNotice();
|
|
3593
|
+
}
|
|
3594
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3595
|
+
};
|
|
3596
|
+
if (explicitWorkspaceId && explicitWorkspaceId !== activeWorkspaceId) {
|
|
3597
|
+
if (failedDeepLinkRouteKeyRef.current === deepLinkRouteKey)
|
|
3598
|
+
return;
|
|
3599
|
+
if (runtimeMode !== 'cloud' || !workspaceSwitchingEnabled) {
|
|
3600
|
+
if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
|
|
3601
|
+
failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3602
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
|
|
3603
|
+
}
|
|
3604
|
+
return;
|
|
3605
|
+
}
|
|
3606
|
+
if (!authSessionResolved || !isAuthenticated || authBlocked)
|
|
3607
|
+
return;
|
|
3608
|
+
if (deepLinkWorkspaceSwitchRef.current === deepLinkRouteKey
|
|
3609
|
+
|| deepLinkWorkspaceSwitchRetryTimerRef.current !== null) {
|
|
3610
|
+
return;
|
|
3611
|
+
}
|
|
3612
|
+
const routeKeyAtStart = deepLinkRouteKey;
|
|
3613
|
+
const switchRetryKey = `${routeKeyAtStart}:workspace`;
|
|
3614
|
+
deepLinkWorkspaceSwitchRef.current = routeKeyAtStart;
|
|
3615
|
+
void switchWorkspace(explicitWorkspaceId).then((result) => {
|
|
3616
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3617
|
+
return;
|
|
3618
|
+
if (!result.success) {
|
|
3619
|
+
const attemptCount = (deepLinkRetryCountsRef.current.get(switchRetryKey) || 0) + 1;
|
|
3620
|
+
deepLinkRetryCountsRef.current.set(switchRetryKey, attemptCount);
|
|
3621
|
+
if (attemptCount < 2 && typeof window !== 'undefined') {
|
|
3622
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = window.setTimeout(() => {
|
|
3623
|
+
deepLinkWorkspaceSwitchRetryTimerRef.current = null;
|
|
3624
|
+
if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
|
|
3625
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3626
|
+
}
|
|
3627
|
+
}, 500);
|
|
3628
|
+
return;
|
|
3629
|
+
}
|
|
3630
|
+
failedDeepLinkRouteKeyRef.current = routeKeyAtStart;
|
|
3631
|
+
const failureNoticeOwnerKey = `deep-link-workspace:${routeKeyAtStart}`;
|
|
3632
|
+
deepLinkFailureNoticeOwnerKeyRef.current = failureNoticeOwnerKey;
|
|
3633
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000, {
|
|
3634
|
+
label: 'Retry',
|
|
3635
|
+
onAction: () => {
|
|
3636
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3637
|
+
return;
|
|
3638
|
+
deepLinkFailureNoticeOwnerKeyRef.current = null;
|
|
3639
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3640
|
+
deepLinkRetryCountsRef.current.delete(switchRetryKey);
|
|
3641
|
+
clearNotice();
|
|
3642
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3643
|
+
},
|
|
3644
|
+
ownerKey: failureNoticeOwnerKey
|
|
3645
|
+
});
|
|
3646
|
+
}
|
|
3647
|
+
}).finally(() => {
|
|
3648
|
+
if (deepLinkWorkspaceSwitchRef.current === routeKeyAtStart) {
|
|
3649
|
+
deepLinkWorkspaceSwitchRef.current = null;
|
|
3650
|
+
}
|
|
3651
|
+
});
|
|
3652
|
+
return;
|
|
3653
|
+
}
|
|
3654
|
+
const resolveTarget = (items) => {
|
|
3655
|
+
const exact = items.find((task) => task.id === normalizedTaskId);
|
|
3656
|
+
if (exact || explicitWorkspaceId)
|
|
3657
|
+
return exact;
|
|
3658
|
+
const legacySuffixMatches = items.filter((task) => task.id.endsWith(normalizedTaskId));
|
|
3659
|
+
return legacySuffixMatches.length === 1 ? legacySuffixMatches[0] : undefined;
|
|
3660
|
+
};
|
|
3661
|
+
const target = resolveTarget(relationshipTasks);
|
|
3662
|
+
if (target) {
|
|
3663
|
+
clearOwnedFailureNotice();
|
|
3664
|
+
handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3665
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3666
|
+
if (editingTaskId !== target.id) {
|
|
3667
|
+
if (target.isArchived)
|
|
3668
|
+
setShowArchive(true);
|
|
3669
|
+
handleEdit(target);
|
|
3670
|
+
}
|
|
3671
|
+
return;
|
|
3672
|
+
}
|
|
3673
|
+
const scheduleCollectionLookup = (collection, lookup, settledRoutes) => {
|
|
3674
|
+
const lookupKey = `${deepLinkRouteKey}:${collection}`;
|
|
3675
|
+
if (deepLinkCollectionLookupRef.current === lookupKey
|
|
3676
|
+
|| deepLinkRetryTimerRef.current !== null) {
|
|
3677
|
+
return;
|
|
3678
|
+
}
|
|
3679
|
+
deepLinkCollectionLookupRef.current = lookupKey;
|
|
3680
|
+
const routeKeyAtStart = deepLinkRouteKey;
|
|
3681
|
+
void lookup().then((loaded) => {
|
|
3682
|
+
if (deepLinkRouteKeyRef.current !== routeKeyAtStart)
|
|
3683
|
+
return;
|
|
3684
|
+
if (loaded) {
|
|
3685
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3686
|
+
return;
|
|
3687
|
+
}
|
|
3688
|
+
const attemptCount = (deepLinkRetryCountsRef.current.get(lookupKey) || 0) + 1;
|
|
3689
|
+
deepLinkRetryCountsRef.current.set(lookupKey, attemptCount);
|
|
3690
|
+
if (attemptCount >= 2) {
|
|
3691
|
+
settledRoutes.add(routeKeyAtStart);
|
|
3692
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3693
|
+
return;
|
|
3694
|
+
}
|
|
3695
|
+
if (typeof window !== 'undefined') {
|
|
3696
|
+
deepLinkRetryTimerRef.current = window.setTimeout(() => {
|
|
3697
|
+
deepLinkRetryTimerRef.current = null;
|
|
3698
|
+
if (deepLinkRouteKeyRef.current === routeKeyAtStart) {
|
|
3699
|
+
setDeepLinkRetryNonce((current) => current + 1);
|
|
3700
|
+
}
|
|
3701
|
+
}, 500);
|
|
3702
|
+
}
|
|
3703
|
+
}).finally(() => {
|
|
3704
|
+
if (deepLinkCollectionLookupRef.current === lookupKey) {
|
|
3705
|
+
deepLinkCollectionLookupRef.current = null;
|
|
3706
|
+
}
|
|
3707
|
+
});
|
|
3708
|
+
};
|
|
3709
|
+
if (archiveHydratedWorkspaceId !== activeWorkspaceId
|
|
3710
|
+
&& !deepLinkArchiveSettledRef.current.has(deepLinkRouteKey)) {
|
|
3711
|
+
scheduleCollectionLookup('archive', () => ensureArchiveHydrated(true), deepLinkArchiveSettledRef.current);
|
|
3712
|
+
return;
|
|
3713
|
+
}
|
|
3714
|
+
const deletedTarget = resolveTarget(deletedRelationshipTasks);
|
|
3715
|
+
if (deletedTarget) {
|
|
3716
|
+
clearOwnedFailureNotice();
|
|
3717
|
+
handledDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3718
|
+
failedDeepLinkRouteKeyRef.current = null;
|
|
3719
|
+
handleEdit(deletedTarget);
|
|
3720
|
+
return;
|
|
3721
|
+
}
|
|
3722
|
+
if (deletedHydratedWorkspaceId !== activeWorkspaceId
|
|
3723
|
+
&& !deepLinkDeletedSettledRef.current.has(deepLinkRouteKey)) {
|
|
3724
|
+
scheduleCollectionLookup('deleted', () => ensureDeletedTasksHydrated(true), deepLinkDeletedSettledRef.current);
|
|
3725
|
+
return;
|
|
3726
|
+
}
|
|
3727
|
+
if (failedDeepLinkRouteKeyRef.current !== deepLinkRouteKey) {
|
|
3728
|
+
failedDeepLinkRouteKeyRef.current = deepLinkRouteKey;
|
|
3729
|
+
pushNotice('This task is unavailable or you do not have access to it.', 'info', 12_000);
|
|
3730
|
+
}
|
|
3731
|
+
}, [
|
|
3732
|
+
archiveHydratedWorkspaceId,
|
|
3733
|
+
authBlocked,
|
|
3734
|
+
authSessionResolved,
|
|
3735
|
+
clearNotice,
|
|
3736
|
+
configLoaded,
|
|
3737
|
+
currentWorkspaceIdRef,
|
|
3738
|
+
deepLinkRetryNonce,
|
|
3739
|
+
deepLinkRouteKey,
|
|
3740
|
+
deletedHydratedWorkspaceId,
|
|
3741
|
+
deletedRelationshipTasks,
|
|
3742
|
+
editingTaskId,
|
|
3743
|
+
ensureArchiveHydrated,
|
|
3744
|
+
ensureDeletedTasksHydrated,
|
|
3745
|
+
handleEdit,
|
|
3746
|
+
initialTaskId,
|
|
3747
|
+
isAuthenticated,
|
|
3748
|
+
loadingTasks,
|
|
3749
|
+
pushNotice,
|
|
3750
|
+
relationshipTasks,
|
|
3751
|
+
requestedWorkspaceId,
|
|
3752
|
+
runtimeConfigReady,
|
|
3753
|
+
runtimeMode,
|
|
3754
|
+
setShowArchive,
|
|
3755
|
+
switchWorkspace,
|
|
3756
|
+
uiStateReady,
|
|
3757
|
+
workspaceBootstrapPending,
|
|
3758
|
+
workspaceSwitchingEnabled
|
|
3759
|
+
]);
|
|
3105
3760
|
// === SECTION: Task CRUD ===
|
|
3106
3761
|
// Pure mutation callbacks are managed by useTaskMutations.
|
|
3107
|
-
const
|
|
3762
|
+
const mutateTaskMetadata = useDurableTaskMetadataMutation({
|
|
3763
|
+
enabled: runtimeConfigOverride.syncV3TaskMetadataActivation
|
|
3764
|
+
&& runtimeMode === 'local',
|
|
3765
|
+
workspaceId: currentWorkspaceId,
|
|
3766
|
+
isAuthenticated,
|
|
3767
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3768
|
+
});
|
|
3769
|
+
const createTaskDurably = useDurableTaskCreateMutation({
|
|
3770
|
+
localRuntime: runtimeMode === 'local',
|
|
3771
|
+
enabled: runtimeConfigOverride.syncV3TaskCreateActivation
|
|
3772
|
+
&& runtimeMode === 'local',
|
|
3773
|
+
workspaceId: currentWorkspaceId,
|
|
3774
|
+
isAuthenticated,
|
|
3775
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3776
|
+
});
|
|
3777
|
+
const taskStatusActivationEnabled = runtimeConfigOverride.syncV3TaskStatusActivation
|
|
3778
|
+
&& runtimeMode === 'local';
|
|
3779
|
+
const mutateTaskStatus = useDurableTaskStatusMutation({
|
|
3780
|
+
enabled: taskStatusActivationEnabled,
|
|
3781
|
+
workspaceId: currentWorkspaceId,
|
|
3782
|
+
isAuthenticated,
|
|
3783
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3784
|
+
});
|
|
3785
|
+
const mutateTaskLifecycle = useDurableTaskLifecycleMutation({
|
|
3786
|
+
// Always probe the local durable lifecycle boundary. The route returns
|
|
3787
|
+
// an explicit disabled result for v2-owned workspaces, but persisted
|
|
3788
|
+
// v3 ownership must survive a process restart with incomplete flags.
|
|
3789
|
+
enabled: runtimeMode === 'local',
|
|
3790
|
+
workspaceId: currentWorkspaceId,
|
|
3791
|
+
isAuthenticated,
|
|
3792
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3793
|
+
});
|
|
3794
|
+
const taskDeleteActivationEnabled = runtimeConfigOverride.syncV3TaskDeleteActivation
|
|
3795
|
+
&& runtimeMode === 'local';
|
|
3796
|
+
const mutateTaskDelete = useDurableTaskDeleteMutation({
|
|
3797
|
+
enabled: taskDeleteActivationEnabled,
|
|
3798
|
+
workspaceId: currentWorkspaceId,
|
|
3799
|
+
isAuthenticated,
|
|
3800
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3801
|
+
});
|
|
3802
|
+
const mutateTaskRestore = useDurableTaskRestoreMutation({
|
|
3803
|
+
enabled: taskDeleteActivationEnabled,
|
|
3804
|
+
workspaceId: currentWorkspaceId,
|
|
3805
|
+
isAuthenticated,
|
|
3806
|
+
dispatchEnabled: workspaceCloudSyncEnabled,
|
|
3807
|
+
});
|
|
3808
|
+
const { copiedId, handleDelete, handleUpdateTask, handleSetStatus, handleToggleComplete, handleToggleCancel, handleToggleInProgress, handleToggleReview, handleArchiveTask, handleBulkArchive, handleUnarchive, handleRestoreDeletedTask, handleRestoreSelectedDeletedTasks, handlePermanentlyDeleteDeletedTask, handleEmptyDeletedTasks, handleCopyId, queueWorkspaceSyncFromAuthoritativeTaskState, } = useTaskActions({
|
|
3108
3809
|
tasks,
|
|
3109
3810
|
archivedTasks,
|
|
3110
3811
|
editingTaskId,
|
|
@@ -3115,8 +3816,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3115
3816
|
resetForm,
|
|
3116
3817
|
setActiveTab,
|
|
3117
3818
|
fetchTasks,
|
|
3118
|
-
fetchArchive,
|
|
3119
|
-
fetchDeletedTasks,
|
|
3819
|
+
fetchArchive: refreshArchiveIfHydrated,
|
|
3820
|
+
fetchDeletedTasks: refreshDeletedTasksIfHydrated,
|
|
3120
3821
|
mergeTaskFromServer,
|
|
3121
3822
|
pushNotice,
|
|
3122
3823
|
cloudAuthConfigured,
|
|
@@ -3128,12 +3829,38 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3128
3829
|
workspacePendingSignatureRef,
|
|
3129
3830
|
workspaceDeletedTaskIdsRef,
|
|
3130
3831
|
workspaceDeletedTaskWatermarksRef,
|
|
3832
|
+
mutateTaskMetadata,
|
|
3833
|
+
mutateTaskStatus,
|
|
3834
|
+
mutateTaskLifecycle,
|
|
3835
|
+
mutateTaskDelete,
|
|
3836
|
+
mutateTaskRestore,
|
|
3837
|
+
durableTaskMetadataActivationEnabled: runtimeConfigOverride.syncV3TaskMetadataActivation
|
|
3838
|
+
&& runtimeMode === 'local',
|
|
3839
|
+
durableTaskStatusActivationEnabled: taskStatusActivationEnabled,
|
|
3840
|
+
durableTaskDeleteActivationEnabled: taskDeleteActivationEnabled,
|
|
3841
|
+
durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
|
|
3842
|
+
workspaceId: currentWorkspaceId,
|
|
3131
3843
|
});
|
|
3844
|
+
const promoteDescriptionImageDraft = useCallback(async () => {
|
|
3845
|
+
const draftId = descriptionImageDraftIdRef.current;
|
|
3846
|
+
const response = await fetch('/api/taskforce/context-upload/draft/promote', {
|
|
3847
|
+
method: 'POST',
|
|
3848
|
+
headers: { 'Content-Type': 'application/json' },
|
|
3849
|
+
body: JSON.stringify({
|
|
3850
|
+
workspaceId: currentWorkspaceId,
|
|
3851
|
+
draftUploadId: draftId,
|
|
3852
|
+
uploadPurpose: 'task-description-draft',
|
|
3853
|
+
}),
|
|
3854
|
+
});
|
|
3855
|
+
if (!response.ok) {
|
|
3856
|
+
throw new Error('Task was created, but its draft upload records could not be finalized.');
|
|
3857
|
+
}
|
|
3858
|
+
rotateDescriptionImageDraftId();
|
|
3859
|
+
}, [currentWorkspaceId, rotateDescriptionImageDraftId]);
|
|
3132
3860
|
const { autoSaveState, flushAutoSave, scheduleWarningPrompt, handleSubmit, confirmScheduleWarning, cancelScheduleWarning, handleAddComment } = useTaskFormActions({
|
|
3133
3861
|
activeCategories,
|
|
3134
3862
|
activeTab,
|
|
3135
3863
|
apiEndpoint,
|
|
3136
|
-
approach,
|
|
3137
3864
|
assignee,
|
|
3138
3865
|
attachments,
|
|
3139
3866
|
attachmentsDirty,
|
|
@@ -3143,16 +3870,27 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3143
3870
|
complexity,
|
|
3144
3871
|
description,
|
|
3145
3872
|
dueDate,
|
|
3873
|
+
createTaskDurably,
|
|
3874
|
+
durableTaskHttpRootActivationEnabled: runtimeConfigOverride.syncV3TaskCloudHttpRootActivation,
|
|
3875
|
+
workspaceId: currentWorkspaceId,
|
|
3876
|
+
updateTask: handleUpdateTask,
|
|
3146
3877
|
editingTaskId,
|
|
3147
3878
|
fetchTasks,
|
|
3148
3879
|
formTaxonomies,
|
|
3880
|
+
getAttachmentsDraft,
|
|
3881
|
+
getDescriptionDraft,
|
|
3149
3882
|
getPreferredCategoryValue,
|
|
3883
|
+
getTitleDraft,
|
|
3884
|
+
awaitPendingDescriptionImageUpload,
|
|
3885
|
+
onTaskCreateAccepted: promoteDescriptionImageDraft,
|
|
3150
3886
|
mergeTaskFromServer,
|
|
3887
|
+
onTaskCreated: handleEdit,
|
|
3151
3888
|
workstreamInput,
|
|
3152
3889
|
priority,
|
|
3153
3890
|
pushNotice,
|
|
3154
3891
|
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3155
3892
|
relationshipTasks,
|
|
3893
|
+
supplementalTasks: deletedRelationshipTasks,
|
|
3156
3894
|
resetForm,
|
|
3157
3895
|
resolveWorkstreamIdInput,
|
|
3158
3896
|
scheduledDate,
|
|
@@ -3166,28 +3904,53 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3166
3904
|
status,
|
|
3167
3905
|
title,
|
|
3168
3906
|
taxonomies,
|
|
3907
|
+
textDraftOccupied,
|
|
3169
3908
|
type
|
|
3170
3909
|
});
|
|
3910
|
+
const discardDescriptionImageDraft = useCallback(async () => {
|
|
3911
|
+
const draftId = descriptionImageDraftIdRef.current;
|
|
3912
|
+
rotateDescriptionImageDraftId();
|
|
3913
|
+
try {
|
|
3914
|
+
await awaitPendingDescriptionImageUpload();
|
|
3915
|
+
const response = await fetch('/api/taskforce/context-upload/draft/discard', {
|
|
3916
|
+
method: 'POST',
|
|
3917
|
+
headers: { 'Content-Type': 'application/json' },
|
|
3918
|
+
body: JSON.stringify({
|
|
3919
|
+
workspaceId: currentWorkspaceId,
|
|
3920
|
+
draftUploadId: draftId,
|
|
3921
|
+
uploadPurpose: 'task-description-draft',
|
|
3922
|
+
}),
|
|
3923
|
+
});
|
|
3924
|
+
if (!response.ok)
|
|
3925
|
+
throw new Error('Draft upload cleanup was rejected.');
|
|
3926
|
+
}
|
|
3927
|
+
catch (error) {
|
|
3928
|
+
console.warn('[Taskforce] Failed to clean discarded Description image uploads.', error);
|
|
3929
|
+
}
|
|
3930
|
+
}, [awaitPendingDescriptionImageUpload, currentWorkspaceId, rotateDescriptionImageDraftId]);
|
|
3171
3931
|
useEffect(() => {
|
|
3172
3932
|
flushAutoSaveRef.current = flushAutoSave;
|
|
3173
3933
|
}, [flushAutoSave]);
|
|
3174
3934
|
const { handleSetWorkstreamForCurrentTask, } = useTaskRelationships({
|
|
3175
3935
|
editingTaskId,
|
|
3176
|
-
mergeTaskFromServer,
|
|
3177
3936
|
workstreamInput,
|
|
3178
3937
|
pushNotice,
|
|
3179
|
-
queueWorkspaceSyncFromAuthoritativeTaskState,
|
|
3180
3938
|
relationshipTasks,
|
|
3181
3939
|
resolveWorkstreamIdInput,
|
|
3182
3940
|
setError,
|
|
3183
|
-
|
|
3941
|
+
updateTask: handleUpdateTask
|
|
3184
3942
|
});
|
|
3185
3943
|
const { currentTask, currentTaskWorkstream, currentTaskInitiative, } = useCurrentTaskRelations({
|
|
3186
3944
|
editingTaskId,
|
|
3187
3945
|
relationshipTasks,
|
|
3188
3946
|
initiatives,
|
|
3189
3947
|
workstreams,
|
|
3948
|
+
workstreamInput,
|
|
3949
|
+
resolveWorkstreamIdInput,
|
|
3190
3950
|
supplementalTasks: deletedRelationshipTasks,
|
|
3951
|
+
assignee,
|
|
3952
|
+
setAssignee,
|
|
3953
|
+
setChecklistItems,
|
|
3191
3954
|
setComments
|
|
3192
3955
|
});
|
|
3193
3956
|
const settingsModel = useSettingsModel({
|
|
@@ -3211,12 +3974,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3211
3974
|
manualComplexityEnabled,
|
|
3212
3975
|
checklistDropdownEnabled,
|
|
3213
3976
|
showTaskCardStatusLabel,
|
|
3214
|
-
exportWorkflowsPath,
|
|
3215
|
-
exportingResource,
|
|
3216
|
-
exportResult,
|
|
3217
3977
|
pathSaved,
|
|
3218
3978
|
settingsSection,
|
|
3219
|
-
exportEnvironment,
|
|
3220
3979
|
setupState,
|
|
3221
3980
|
buildInfo,
|
|
3222
3981
|
saveSetupMode,
|
|
@@ -3234,19 +3993,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3234
3993
|
handleShowTaskCardStatusLabelChange,
|
|
3235
3994
|
handleResetProjectToGlobal,
|
|
3236
3995
|
handleSaveSettings,
|
|
3237
|
-
setExportWorkflowsPath,
|
|
3238
|
-
setExportEnvironment,
|
|
3239
|
-
availableWorkflows,
|
|
3240
3996
|
initiativeTemplates,
|
|
3241
|
-
availableEnvironments,
|
|
3242
|
-
fetchWorkflows,
|
|
3243
3997
|
fetchInitiativeTemplates,
|
|
3244
3998
|
createInitiativeFromTemplate,
|
|
3245
|
-
fetchWorkflowTemplate,
|
|
3246
|
-
fetchWorkflowOverrideNames,
|
|
3247
|
-
saveWorkflowTemplateDraft,
|
|
3248
|
-
resetWorkflowTemplateDraft,
|
|
3249
|
-
handleExportWorkflows,
|
|
3250
3999
|
setShowFolderBrowser,
|
|
3251
4000
|
setBrowserTarget,
|
|
3252
4001
|
fetchFolders,
|
|
@@ -3403,6 +4152,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3403
4152
|
workspaceSyncRecommendedAction,
|
|
3404
4153
|
workspaceSyncBusy,
|
|
3405
4154
|
workspaceSyncPendingChanges,
|
|
4155
|
+
localCoordinatorStatus,
|
|
4156
|
+
transferLocalCoordinatorOwnership,
|
|
3406
4157
|
retryUserGlobalSettingsSync,
|
|
3407
4158
|
retryWorkspaceCloudSync,
|
|
3408
4159
|
resetWorkspaceSyncCursorAndPull,
|
|
@@ -3439,6 +4190,7 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3439
4190
|
fetchLoginMethods,
|
|
3440
4191
|
unlinkLoginMethod,
|
|
3441
4192
|
addPasswordToAccount,
|
|
4193
|
+
changePassword,
|
|
3442
4194
|
beginOAuthLink,
|
|
3443
4195
|
registerWithCredentials,
|
|
3444
4196
|
updateCurrentUserProfile,
|
|
@@ -3470,15 +4222,17 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3470
4222
|
tasks,
|
|
3471
4223
|
loadingTasks,
|
|
3472
4224
|
archivedTasks,
|
|
4225
|
+
archiveHydratedWorkspaceId,
|
|
3473
4226
|
initiatives,
|
|
3474
4227
|
workstreams,
|
|
3475
4228
|
planningBootstrapTaskSummaries,
|
|
4229
|
+
planningLoadState,
|
|
4230
|
+
workspaceTaskRelationships,
|
|
3476
4231
|
deletedTasks,
|
|
3477
4232
|
activeCategories,
|
|
3478
4233
|
activeTypes,
|
|
3479
4234
|
priorities,
|
|
3480
4235
|
taxonomyDisplayLabels,
|
|
3481
|
-
approaches,
|
|
3482
4236
|
taxonomies,
|
|
3483
4237
|
// Filtering
|
|
3484
4238
|
searchQuery,
|
|
@@ -3505,6 +4259,8 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3505
4259
|
setShowArchive,
|
|
3506
4260
|
taskScope,
|
|
3507
4261
|
setTaskScope,
|
|
4262
|
+
compressedCards,
|
|
4263
|
+
setCompressedCards,
|
|
3508
4264
|
clearFilters,
|
|
3509
4265
|
filteredTasks,
|
|
3510
4266
|
searchAgnosticTasks,
|
|
@@ -3515,17 +4271,21 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3515
4271
|
// Actions
|
|
3516
4272
|
fetchTasks,
|
|
3517
4273
|
fetchArchive,
|
|
4274
|
+
ensureArchiveHydrated,
|
|
3518
4275
|
fetchDeletedTasks,
|
|
3519
4276
|
fetchPlanningEntities,
|
|
4277
|
+
fetchPlanningEntityDetail,
|
|
3520
4278
|
fetchAssigneeOptions,
|
|
3521
4279
|
createInitiative,
|
|
3522
4280
|
updateInitiative,
|
|
4281
|
+
updatePlanningIdentity,
|
|
3523
4282
|
archiveInitiative,
|
|
3524
4283
|
unarchiveInitiative,
|
|
3525
4284
|
createWorkstream,
|
|
3526
4285
|
updateWorkstream,
|
|
3527
4286
|
archiveWorkstream,
|
|
3528
4287
|
unarchiveWorkstream,
|
|
4288
|
+
reorderWorkstreamTasks,
|
|
3529
4289
|
handleEdit,
|
|
3530
4290
|
handleDelete,
|
|
3531
4291
|
handleCopyId,
|
|
@@ -3537,17 +4297,22 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3537
4297
|
handleBulkArchive,
|
|
3538
4298
|
handleUnarchive,
|
|
3539
4299
|
handleRestoreDeletedTask,
|
|
4300
|
+
handleRestoreSelectedDeletedTasks,
|
|
3540
4301
|
handlePermanentlyDeleteDeletedTask,
|
|
3541
4302
|
handleEmptyDeletedTasks,
|
|
3542
4303
|
handleUpdateTask,
|
|
4304
|
+
handleSetStatus,
|
|
3543
4305
|
// Form State
|
|
3544
4306
|
editingTaskId,
|
|
3545
4307
|
loading,
|
|
3546
4308
|
error,
|
|
4309
|
+
clearTaskError,
|
|
3547
4310
|
title,
|
|
3548
4311
|
setTitle,
|
|
4312
|
+
setTitleDraft,
|
|
3549
4313
|
description,
|
|
3550
4314
|
setDescription,
|
|
4315
|
+
setDescriptionDraft,
|
|
3551
4316
|
checklistItems,
|
|
3552
4317
|
setChecklistItems,
|
|
3553
4318
|
category,
|
|
@@ -3560,8 +4325,6 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3560
4325
|
setComplexity,
|
|
3561
4326
|
status,
|
|
3562
4327
|
setStatus,
|
|
3563
|
-
approach,
|
|
3564
|
-
setApproach,
|
|
3565
4328
|
assignee,
|
|
3566
4329
|
setAssignee,
|
|
3567
4330
|
scheduledDate,
|
|
@@ -3579,19 +4342,19 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3579
4342
|
setAttachments,
|
|
3580
4343
|
attachmentsDirty,
|
|
3581
4344
|
setAttachmentsDirty,
|
|
4345
|
+
descriptionImageUploadPending,
|
|
4346
|
+
descriptionImageDraftId,
|
|
4347
|
+
registerDescriptionImageUpload,
|
|
3582
4348
|
descriptionFocused,
|
|
3583
4349
|
setDescriptionFocused,
|
|
3584
4350
|
showMarkdownHelp,
|
|
3585
4351
|
setShowMarkdownHelp,
|
|
3586
|
-
showChecklist,
|
|
3587
|
-
setShowChecklist,
|
|
3588
|
-
showComments,
|
|
3589
|
-
setShowComments,
|
|
3590
4352
|
isCapturingScreenshot,
|
|
3591
4353
|
setIsCapturingScreenshot,
|
|
3592
4354
|
// Form Actions
|
|
3593
4355
|
handleSubmit,
|
|
3594
4356
|
resetForm,
|
|
4357
|
+
discardDescriptionImageDraft,
|
|
3595
4358
|
handleAddComment,
|
|
3596
4359
|
handleSetWorkstreamForCurrentTask,
|
|
3597
4360
|
handleOpenTaskById,
|
|
@@ -3618,13 +4381,13 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3618
4381
|
cancelScheduleWarning,
|
|
3619
4382
|
tasksScrollRef,
|
|
3620
4383
|
setTasksScrollPos, // Export if needed
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
4384
|
+
taskforceAgentId,
|
|
4385
|
+
setTaskforceAgentId,
|
|
4386
|
+
taskforceAgentConversationId,
|
|
4387
|
+
setTaskforceAgentConversationId,
|
|
4388
|
+
taskforceAgentConversationByAgentId,
|
|
4389
|
+
setTaskforceAgentConversationByAgentId,
|
|
4390
|
+
uiStateReady,
|
|
3628
4391
|
// Categories & Types & Taxonomies mgmt
|
|
3629
4392
|
handleUpdateCategory,
|
|
3630
4393
|
handleRemoveCategory,
|
|
@@ -3652,17 +4415,9 @@ export function useTaskforce({ config = {}, initialTaskId, onTaskCountChange, on
|
|
|
3652
4415
|
currentTask,
|
|
3653
4416
|
currentTaskWorkstream,
|
|
3654
4417
|
currentTaskInitiative,
|
|
3655
|
-
availableWorkflows,
|
|
3656
4418
|
initiativeTemplates,
|
|
3657
|
-
availableEnvironments,
|
|
3658
|
-
fetchWorkflows,
|
|
3659
4419
|
fetchInitiativeTemplates,
|
|
3660
4420
|
createInitiativeFromTemplate,
|
|
3661
|
-
fetchWorkflowTemplate,
|
|
3662
|
-
fetchWorkflowOverrideNames,
|
|
3663
|
-
saveWorkflowTemplateDraft,
|
|
3664
|
-
resetWorkflowTemplateDraft,
|
|
3665
|
-
onExportWorkflows: handleExportWorkflows,
|
|
3666
4421
|
settingsModel
|
|
3667
4422
|
};
|
|
3668
4423
|
}
|