@taskforcehq/taskforce 0.3.328 → 0.3.330
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/dist/Taskforce.module.css +523 -79
- package/dist/TaskforceCore.js +237 -230
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
- package/dist/cli.js +34 -0
- package/dist/cliCloudTargetGuard.d.ts +5 -0
- package/dist/cliCloudTargetGuard.js +11 -0
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
- package/dist/components/features/TaskSettings.d.ts +12 -1
- package/dist/components/features/TaskSettings.js +217 -54
- package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
- package/dist/components/features/TaskforceAgentsModule.js +586 -116
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
- package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
- package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
- package/dist/components/features/planning/PlanningModule.js +2 -5
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
- package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
- package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
- package/dist/components/features/planning/planningTaskArrangement.js +5 -5
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +5 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskCard.d.ts +5 -0
- package/dist/components/task/TaskCard.js +65 -10
- package/dist/components/task/TaskImageReviews.js +14 -5
- package/dist/components/task/TaskKanban.d.ts +6 -1
- package/dist/components/task/TaskKanban.js +152 -6
- package/dist/components/task/TaskList.d.ts +5 -0
- package/dist/components/task/TaskList.js +3 -3
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/ui/PasswordInput.d.ts +6 -0
- package/dist/components/ui/PasswordInput.js +11 -0
- package/dist/components/ui/TopNoticeLayer.js +1 -1
- package/dist/components/views/AppShellHeader.js +32 -11
- package/dist/components/views/PlanComparisonPage.js +12 -0
- package/dist/components/views/StandaloneLayout.js +32 -55
- package/dist/components/views/WidgetView.js +3 -3
- package/dist/components/views/panels/PlanningDrawer.js +5 -12
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
- package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
- package/dist/config/envSchema.js +60 -1
- package/dist/config/localServiceRuntimeContract.d.ts +13 -0
- package/dist/config/localServiceRuntimeContract.js +135 -0
- package/dist/core/AiProfileService.js +46 -8
- package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
- package/dist/core/DeletedTaskLifecycleService.js +37 -6
- package/dist/core/McpTokenService.d.ts +23 -1
- package/dist/core/McpTokenService.js +93 -10
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
- package/dist/core/TaskChecklistCommandService.d.ts +27 -0
- package/dist/core/TaskChecklistCommandService.js +83 -5
- package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
- package/dist/core/TaskLifecycleCommandService.js +6 -2
- package/dist/core/Taskforce.d.ts +94 -2
- package/dist/core/Taskforce.js +760 -36
- package/dist/core/types.d.ts +14 -0
- package/dist/documentReviews/commandService.d.ts +2 -1
- package/dist/documentReviews/commandService.js +6 -3
- package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.js +2 -0
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
- package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
- package/dist/hooks/sync/useSyncStatusControls.js +47 -11
- package/dist/hooks/tasks/taskHttpMutation.js +1 -0
- package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
- package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
- package/dist/hooks/tasks/useTaskFormActions.js +65 -12
- package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
- package/dist/hooks/ui/useSettingsModel.js +13 -2
- package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
- package/dist/hooks/ui/useSettingsPersistence.js +74 -47
- package/dist/hooks/useFilterSort.d.ts +7 -3
- package/dist/hooks/useFilterSort.js +15 -5
- package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +40 -1
- package/dist/hooks/useTaskData.js +240 -9
- package/dist/hooks/useTaskMutations.d.ts +12 -2
- package/dist/hooks/useTaskMutations.js +266 -52
- package/dist/hooks/useTaskforce.d.ts +39 -9
- package/dist/hooks/useTaskforce.js +359 -40
- package/dist/hooks/useUiNotice.d.ts +4 -0
- package/dist/hooks/useUiNotice.js +4 -0
- package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +53 -41
- package/dist/mcp/documentHelpers.d.ts +1 -0
- package/dist/mcp/documentHelpers.js +7 -3
- package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
- package/dist/mcp/durableTaskMutationRouter.js +10 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
- package/dist/mcp/httpProtocolRouting.d.ts +10 -0
- package/dist/mcp/httpProtocolRouting.js +19 -0
- package/dist/mcp/localCliHealth.d.ts +2 -2
- package/dist/mcp/localCliHealth.js +2 -2
- package/dist/mcp/localServiceProxy.d.ts +1 -0
- package/dist/mcp/localServiceProxy.js +530 -68
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
- package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
- package/dist/mcp/runtime.d.ts +54 -79
- package/dist/mcp/runtime.js +556 -139
- package/dist/mcp/taskPlanningRegistrar.js +64 -42
- package/dist/mcp/toolCallCompatibility.js +38 -1
- package/dist/mcp/toolCatalog.d.ts +1 -0
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +10 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +1 -0
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +427 -0
- package/dist/runtime/appGateDefinitions.d.ts +30 -6
- package/dist/runtime/appGateDefinitions.js +6 -6
- package/dist/runtime/appGates.d.ts +13 -13
- package/dist/runtime/appGates.js +36 -13
- package/dist/runtime/nodeAppGates.d.ts +8 -0
- package/dist/runtime/nodeAppGates.js +27 -0
- package/dist/server/cloudCollectionRead.d.ts +1 -1
- package/dist/server/cloudCollectionRead.js +2 -2
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +123 -14
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.d.ts +3 -0
- package/dist/server/localServiceLease.js +11 -2
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +4 -0
- package/dist/server/realtimeSyncWs.js +36 -12
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +113 -3
- package/dist/server/routes/agentRoles.js +3 -2
- package/dist/server/routes/agentSkills.js +3 -2
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +394 -39
- package/dist/server/routes/annotatedAttachments.js +3 -2
- package/dist/server/routes/auth.js +3 -1
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
- package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
- package/dist/server/routes/executorPhaseAApprovals.js +140 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
- package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
- package/dist/server/routes/githubReviewEvidence.js +116 -0
- package/dist/server/routes/localService.d.ts +15 -4
- package/dist/server/routes/localService.js +138 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/primitives.d.ts +2 -0
- package/dist/server/routes/shared.d.ts +19 -0
- package/dist/server/routes/shared.js +95 -19
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +9 -2
- package/dist/server/routes/syncPullApplyRoutes.js +23 -4
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +27 -16
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
- package/dist/server/routes/syncV3OperationRoutes.js +45 -9
- package/dist/server/routes/tasks.js +124 -13
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes/workspaces.js +43 -1
- package/dist/server/routes.js +59 -0
- package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
- package/dist/server/workspaceDeletionAdmission.js +50 -0
- package/dist/service/localServiceCli.js +16 -0
- package/dist/service/localServiceClientLifecycle.js +36 -10
- package/dist/services/codexAppServerModelGateway.d.ts +161 -0
- package/dist/services/codexAppServerModelGateway.js +663 -0
- package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
- package/dist/services/codexDeviceCodeLoginManager.js +265 -0
- package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
- package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
- package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
- package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
- package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
- package/dist/services/executorPhaseAApprovalService.js +609 -0
- package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
- package/dist/services/executorPhaseADriftEvaluator.js +93 -0
- package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
- package/dist/services/executorPhaseAIssuerCore.js +295 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
- package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
- package/dist/services/githubReviewEvidenceRuntime.js +30 -0
- package/dist/services/githubReviewEvidenceService.d.ts +93 -0
- package/dist/services/githubReviewEvidenceService.js +336 -0
- package/dist/services/modelGateway.d.ts +7 -0
- package/dist/services/modelProviderConnectionService.d.ts +71 -0
- package/dist/services/modelProviderConnectionService.js +279 -0
- package/dist/services/modelProviderCredentialHome.d.ts +32 -0
- package/dist/services/modelProviderCredentialHome.js +271 -0
- package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
- package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
- package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
- package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
- package/dist/services/taskforceAgentMcpBridge.js +30 -27
- package/dist/shared/adminEdgeProxy.d.ts +5 -0
- package/dist/shared/adminEdgeProxy.js +94 -0
- package/dist/shared/adminProxySessionCookies.d.ts +16 -0
- package/dist/shared/adminProxySessionCookies.js +86 -0
- package/dist/shared/aiProfileColors.d.ts +31 -1
- package/dist/shared/aiProfileColors.js +14 -6
- package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
- package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
- package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
- package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
- package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
- package/dist/shared/executorPhaseADriftContracts.js +63 -0
- package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
- package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
- package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
- package/dist/shared/executorPhaseARunAuthorization.js +232 -0
- package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
- package/dist/shared/executorPhaseASchemaValidation.js +53 -0
- package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
- package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
- package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
- package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
- package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
- package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
- package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
- package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
- package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
- package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
- package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
- package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
- package/dist/shared/executorPhaseATiming.d.ts +1 -0
- package/dist/shared/executorPhaseATiming.js +1 -0
- package/dist/shared/planningIdentity.js +1 -1
- package/dist/shared/productLogoKeys.d.ts +2 -0
- package/dist/shared/productLogoKeys.js +18 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
- package/dist/shared/taskforceAgentDefinition.js +6 -3
- package/dist/shared/taskforceAgentModels.d.ts +1 -0
- package/dist/shared/taskforceAgentModels.js +36 -3
- package/dist/shared/userFeatureGrants.d.ts +4 -0
- package/dist/shared/userFeatureGrants.js +7 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
- package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
- package/dist/storage/modelProviderConnectionStore.js +446 -0
- package/dist/storage/postgresAdapter.d.ts +24 -3
- package/dist/storage/postgresAdapter.js +117 -14
- package/dist/storage/postgresWorker.js +22 -5
- package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
- package/dist/storage/postgresWorkerProtocol.js +30 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/sync/cloudSyncApi.d.ts +4 -1
- package/dist/sync/cloudSyncApi.js +7 -2
- package/dist/sync/contentSyncState.d.ts +1 -1
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
- package/dist/sync/syncApplyHandlers.d.ts +2 -0
- package/dist/sync/syncApplyHandlers.js +10 -1
- package/dist/sync/syncService.d.ts +17 -0
- package/dist/sync/syncService.js +87 -19
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +8 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
- package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
- package/dist/sync/v3/durableOperationReplay.js +18 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
- package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
- package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
- package/dist/sync/v3/localTaskMetadataClient.js +1 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
- package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
- package/dist/sync/v3/localTaskStatusClient.js +6 -1
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
- package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
- package/dist/sync/v3/syncDurabilityStore.js +199 -13
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
- package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
- package/dist/sync/v3/taskChecklistMutationService.js +48 -1
- package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
- package/dist/sync/v3/taskCreateMutationService.js +7 -4
- package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
- package/dist/sync/v3/taskMetadataMutationService.js +4 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
- package/dist/sync/v3/taskRestoreMutationService.js +7 -4
- package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
- package/dist/sync/v3/taskStatusMutationService.js +123 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
- package/dist/sync/v3/workflowAssignmentSync.js +30 -0
- package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
- package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
- package/dist/sync/workspacePullFeed.js +2 -1
- package/dist/sync/workspaceRepair.d.ts +8 -2
- package/dist/sync/workspaceRepair.js +222 -6
- package/dist/sync/workspaceSyncModel.d.ts +21 -0
- package/dist/sync/workspaceSyncModel.js +35 -7
- package/dist/sync/workspaceSyncState.d.ts +1 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
- package/dist/types.d.ts +47 -1
- package/dist/types.js +6 -0
- package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
- package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
- package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
- package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
- package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
- package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
- package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
- package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-CTsDBaef.js +7 -0
- package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
- package/dist/ui/branding/logos/letterhead_dark.png +0 -0
- package/dist/ui/branding/logos/letterhead_light.png +0 -0
- package/dist/ui/branding/logos/signature_dark.png +0 -0
- package/dist/ui/branding/logos/signature_light.png +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/aiProfileDefaultLogo.js +16 -48
- package/dist/utils/httpSetCookie.d.ts +1 -0
- package/dist/utils/httpSetCookie.js +4 -1
- package/dist/utils/localRuntimeUrl.d.ts +1 -0
- package/dist/utils/localRuntimeUrl.js +14 -0
- package/dist/utils/productLogoRegistry.d.ts +2 -0
- package/dist/utils/productLogoRegistry.js +36 -0
- package/dist/utils/syncStatusPresentation.d.ts +4 -0
- package/dist/utils/syncStatusPresentation.js +17 -0
- package/dist/utils/taskActivity.d.ts +3 -2
- package/dist/utils/taskActivity.js +19 -2
- package/dist/utils/taskEditorReconciliation.d.ts +40 -0
- package/dist/utils/taskEditorReconciliation.js +217 -0
- package/dist/utils/taskEvents.d.ts +2 -0
- package/dist/utils/taskNormalization.d.ts +1 -0
- package/dist/utils/taskNormalization.js +39 -0
- package/dist/utils/taskSearch.js +2 -2
- package/dist/utils/uiNotice.d.ts +4 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +36 -6
- package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
- package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
- package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
- package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
- package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
- package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-BUplSsv_.js +0 -7
- package/dist/ui/assets/index-gz2EXuoK.css +0 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/ui/index.html
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
|
|
9
9
|
<link rel="apple-touch-icon" href="/taskforce/favicon/apple-touch-icon.png" />
|
|
10
10
|
<title>Taskforce</title>
|
|
11
|
-
<script type="module" crossorigin src="/taskforce/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/taskforce/assets/index-CTsDBaef.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-react-CKJs5o3c.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-icons-
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-icons-Bsq-mcEn.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-markdown-_lhNCyq-.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-dnd-CJ-AjP-Y.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-router-AqJMU8Lz.js">
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/taskforce/assets/index-
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/taskforce/assets/index-BZ-hdZSk.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
<div id="root"></div>
|
|
@@ -1,38 +1,6 @@
|
|
|
1
|
-
import antigravityLogo from '../assets/ai-profile-clients/antigravity.png';
|
|
2
|
-
import chatgptLogo from '../assets/ai-profile-clients/chatgpt.svg';
|
|
3
|
-
import claudeChatLogo from '../assets/ai-profile-clients/claude-chat.svg';
|
|
4
|
-
import claudeCodeLogo from '../assets/ai-profile-clients/claude-code.svg';
|
|
5
|
-
import clineLogo from '../assets/ai-profile-clients/cline.svg';
|
|
6
|
-
import codexLogo from '../assets/ai-profile-clients/codex.svg';
|
|
7
|
-
import cursorLogo from '../assets/ai-profile-clients/cursor.svg';
|
|
8
|
-
import geminiLogo from '../assets/ai-profile-clients/gemini-cli-icon.png';
|
|
9
|
-
import geminiChatLogo from '../assets/ai-profile-clients/gemini.svg';
|
|
10
|
-
import grokLogo from '../assets/ai-profile-clients/grok.svg';
|
|
11
|
-
import kiroLogo from '../assets/ai-profile-clients/kiro.svg';
|
|
12
|
-
import mistralLogo from '../assets/ai-profile-clients/mistral.svg';
|
|
13
|
-
import perplexityLogo from '../assets/ai-profile-clients/perplexity.svg';
|
|
14
|
-
import vscodeLogo from '../assets/ai-profile-clients/vscode.svg';
|
|
15
|
-
import windsurfLogo from '../assets/ai-profile-clients/windsurf.svg';
|
|
16
1
|
import { getMcpClientRegistryEntry } from '../mcp/clientRegistry.js';
|
|
17
2
|
import { isTaskforceManagedAiProfile } from '../shared/aiProfileAvatarEligibility.js';
|
|
18
|
-
|
|
19
|
-
antigravity: antigravityLogo,
|
|
20
|
-
'chatgpt-desktop': chatgptLogo,
|
|
21
|
-
'claude-code': claudeCodeLogo,
|
|
22
|
-
'claude-chat': claudeChatLogo,
|
|
23
|
-
'grok-chat': grokLogo,
|
|
24
|
-
'gemini-chat': geminiChatLogo,
|
|
25
|
-
'mistral-chat': mistralLogo,
|
|
26
|
-
'perplexity-chat': perplexityLogo,
|
|
27
|
-
cline: clineLogo,
|
|
28
|
-
codex: codexLogo,
|
|
29
|
-
cursor: cursorLogo,
|
|
30
|
-
'gemini-cli': geminiLogo,
|
|
31
|
-
grok: grokLogo,
|
|
32
|
-
kiro: kiroLogo,
|
|
33
|
-
vscode: vscodeLogo,
|
|
34
|
-
windsurf: windsurfLogo,
|
|
35
|
-
};
|
|
3
|
+
import { getProductLogoUrl } from './productLogoRegistry.js';
|
|
36
4
|
export function getAiProfileDefaultLogoUrl(profile) {
|
|
37
5
|
if (!profile || isTaskforceManagedAiProfile(profile))
|
|
38
6
|
return '';
|
|
@@ -42,7 +10,7 @@ export function getAiProfileDefaultLogoUrl(profile) {
|
|
|
42
10
|
: null;
|
|
43
11
|
const registryEntry = getMcpClientRegistryEntry(clientId);
|
|
44
12
|
if (registryEntry?.logoKey)
|
|
45
|
-
return
|
|
13
|
+
return getProductLogoUrl(registryEntry.logoKey);
|
|
46
14
|
if (!['chat_app', 'ide', 'cli', 'coding_tool'].includes(String(profile.surfaceType || '')))
|
|
47
15
|
return '';
|
|
48
16
|
const identity = [profile.username, profile.name]
|
|
@@ -53,32 +21,32 @@ export function getAiProfileDefaultLogoUrl(profile) {
|
|
|
53
21
|
if (identity.includes('openclaw') || identity.includes('hermes agent'))
|
|
54
22
|
return '';
|
|
55
23
|
if (identity.includes('chatgpt'))
|
|
56
|
-
return
|
|
24
|
+
return getProductLogoUrl('chatgpt');
|
|
57
25
|
if (identity.includes('claude code'))
|
|
58
|
-
return
|
|
26
|
+
return getProductLogoUrl('claude-code');
|
|
59
27
|
if (identity.includes('claude desktop'))
|
|
60
|
-
return
|
|
28
|
+
return getProductLogoUrl('claude-chat');
|
|
61
29
|
if (identity.includes('cline'))
|
|
62
|
-
return
|
|
30
|
+
return getProductLogoUrl('cline');
|
|
63
31
|
if (identity.includes('codex'))
|
|
64
|
-
return
|
|
32
|
+
return getProductLogoUrl('codex');
|
|
65
33
|
if (identity.includes('cursor'))
|
|
66
|
-
return
|
|
34
|
+
return getProductLogoUrl('cursor');
|
|
67
35
|
if (identity.includes('cascade') || identity.includes('windsurf'))
|
|
68
|
-
return
|
|
36
|
+
return getProductLogoUrl('windsurf');
|
|
69
37
|
if (identity.includes('antigravity'))
|
|
70
|
-
return
|
|
38
|
+
return getProductLogoUrl('antigravity');
|
|
71
39
|
if (identity.includes('gemini'))
|
|
72
|
-
return
|
|
40
|
+
return getProductLogoUrl('gemini-cli');
|
|
73
41
|
if (identity.includes('grok'))
|
|
74
|
-
return
|
|
42
|
+
return getProductLogoUrl('grok');
|
|
75
43
|
if (identity.includes('mistral') || identity.includes('le chat'))
|
|
76
|
-
return
|
|
44
|
+
return getProductLogoUrl('mistral-chat');
|
|
77
45
|
if (identity.includes('perplexity'))
|
|
78
|
-
return
|
|
46
|
+
return getProductLogoUrl('perplexity-chat');
|
|
79
47
|
if (identity.includes('kiro'))
|
|
80
|
-
return
|
|
48
|
+
return getProductLogoUrl('kiro');
|
|
81
49
|
if (identity.includes('visual studio code') || identity.includes('vs code') || identity.includes('vscode'))
|
|
82
|
-
return
|
|
50
|
+
return getProductLogoUrl('vscode');
|
|
83
51
|
return '';
|
|
84
52
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare function stripSetCookieDomainAttribute(cookie: string): string;
|
|
1
2
|
export declare function rewriteSetCookieForLocalHost(cookie: string): string;
|
|
2
3
|
export declare function readSetCookieHeaders(headers: Headers): string[];
|
|
3
4
|
export declare function findSetCookieHeader(headers: readonly string[], cookieName: string): string | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function stripSetCookieDomainAttribute(cookie) {
|
|
2
2
|
const parts = String(cookie || '').split(';').map((part) => part.trim()).filter(Boolean);
|
|
3
3
|
if (parts.length === 0)
|
|
4
4
|
return cookie;
|
|
@@ -6,6 +6,9 @@ export function rewriteSetCookieForLocalHost(cookie) {
|
|
|
6
6
|
const filteredAttrs = attrs.filter((attr) => !attr.toLowerCase().startsWith('domain='));
|
|
7
7
|
return [nameValue, ...filteredAttrs].join('; ');
|
|
8
8
|
}
|
|
9
|
+
export function rewriteSetCookieForLocalHost(cookie) {
|
|
10
|
+
return stripSetCookieDomainAttribute(cookie);
|
|
11
|
+
}
|
|
9
12
|
export function readSetCookieHeaders(headers) {
|
|
10
13
|
const values = headers.getSetCookie?.();
|
|
11
14
|
if (Array.isArray(values) && values.length > 0)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function retargetRestartedLocalUrl(currentUrl: string, previousPort: number, restartedPort: number): string | null;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function retargetRestartedLocalUrl(currentUrl, previousPort, restartedPort) {
|
|
2
|
+
if (previousPort === restartedPort)
|
|
3
|
+
return null;
|
|
4
|
+
try {
|
|
5
|
+
const target = new URL(currentUrl);
|
|
6
|
+
if (target.origin !== `http://localhost:${previousPort}`)
|
|
7
|
+
return null;
|
|
8
|
+
target.port = String(restartedPort);
|
|
9
|
+
return target.toString();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import antigravityLogo from '../assets/ai-profile-clients/antigravity.png';
|
|
2
|
+
import chatgptLogo from '../assets/ai-profile-clients/chatgpt.svg';
|
|
3
|
+
import claudeChatLogo from '../assets/ai-profile-clients/claude-chat.svg';
|
|
4
|
+
import claudeCodeLogo from '../assets/ai-profile-clients/claude-code.svg';
|
|
5
|
+
import clineLogo from '../assets/ai-profile-clients/cline.svg';
|
|
6
|
+
import codexLogo from '../assets/ai-profile-clients/codex.svg';
|
|
7
|
+
import cursorLogo from '../assets/ai-profile-clients/cursor.svg';
|
|
8
|
+
import geminiLogo from '../assets/ai-profile-clients/gemini-cli-icon.png';
|
|
9
|
+
import geminiChatLogo from '../assets/ai-profile-clients/gemini.svg';
|
|
10
|
+
import grokLogo from '../assets/ai-profile-clients/grok.svg';
|
|
11
|
+
import kiroLogo from '../assets/ai-profile-clients/kiro.svg';
|
|
12
|
+
import mistralLogo from '../assets/ai-profile-clients/mistral.svg';
|
|
13
|
+
import perplexityLogo from '../assets/ai-profile-clients/perplexity.svg';
|
|
14
|
+
import vscodeLogo from '../assets/ai-profile-clients/vscode.svg';
|
|
15
|
+
import windsurfLogo from '../assets/ai-profile-clients/windsurf.svg';
|
|
16
|
+
const PRODUCT_LOGO_URLS = {
|
|
17
|
+
antigravity: antigravityLogo,
|
|
18
|
+
chatgpt: chatgptLogo,
|
|
19
|
+
'claude-chat': claudeChatLogo,
|
|
20
|
+
'claude-code': claudeCodeLogo,
|
|
21
|
+
cline: clineLogo,
|
|
22
|
+
codex: codexLogo,
|
|
23
|
+
cursor: cursorLogo,
|
|
24
|
+
'gemini-chat': geminiChatLogo,
|
|
25
|
+
'gemini-cli': geminiLogo,
|
|
26
|
+
grok: grokLogo,
|
|
27
|
+
'grok-chat': grokLogo,
|
|
28
|
+
kiro: kiroLogo,
|
|
29
|
+
'mistral-chat': mistralLogo,
|
|
30
|
+
'perplexity-chat': perplexityLogo,
|
|
31
|
+
vscode: vscodeLogo,
|
|
32
|
+
windsurf: windsurfLogo,
|
|
33
|
+
};
|
|
34
|
+
export function getProductLogoUrl(key) {
|
|
35
|
+
return key ? PRODUCT_LOGO_URLS[key] : '';
|
|
36
|
+
}
|
|
@@ -65,6 +65,10 @@ export interface WorkspaceSyncDiagnosticsPresentation {
|
|
|
65
65
|
} | null;
|
|
66
66
|
coordinatorRecoveryObligations?: number;
|
|
67
67
|
}
|
|
68
|
+
export declare function resolveEffectiveWorkspaceSyncDiagnostics(browserDiagnostics: WorkspaceSyncDiagnosticsPresentation, coordinator: {
|
|
69
|
+
recoveryObligations: number;
|
|
70
|
+
outbox: WorkspaceSyncDiagnosticsPresentation['durableOutbox'];
|
|
71
|
+
} | null): WorkspaceSyncDiagnosticsPresentation;
|
|
68
72
|
interface BuildSyncEventRowsInput {
|
|
69
73
|
syncRecentEvents: SyncEventRecord[];
|
|
70
74
|
syncRecentEventsError: string | null;
|
|
@@ -22,6 +22,15 @@ function getCollapsibleEventSignature(event) {
|
|
|
22
22
|
stableStringifySyncEventDetails(event.details),
|
|
23
23
|
].join('|');
|
|
24
24
|
}
|
|
25
|
+
export function resolveEffectiveWorkspaceSyncDiagnostics(browserDiagnostics, coordinator) {
|
|
26
|
+
if (!coordinator)
|
|
27
|
+
return browserDiagnostics;
|
|
28
|
+
return {
|
|
29
|
+
...browserDiagnostics,
|
|
30
|
+
durableOutbox: coordinator.outbox,
|
|
31
|
+
coordinatorRecoveryObligations: coordinator.recoveryObligations,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
25
34
|
function formatDiagnosticsTimestamp(value) {
|
|
26
35
|
if (!value)
|
|
27
36
|
return 'Never';
|
|
@@ -48,6 +57,14 @@ export function resolveSyncStatusMeta(status) {
|
|
|
48
57
|
border: 'rgba(96, 165, 250, 0.35)',
|
|
49
58
|
background: 'rgba(59, 130, 246, 0.12)',
|
|
50
59
|
};
|
|
60
|
+
case 'checking':
|
|
61
|
+
return {
|
|
62
|
+
label: 'Checking',
|
|
63
|
+
icon: 'cloud',
|
|
64
|
+
color: '#94a3b8',
|
|
65
|
+
border: 'rgba(148, 163, 184, 0.35)',
|
|
66
|
+
background: 'rgba(148, 163, 184, 0.12)',
|
|
67
|
+
};
|
|
51
68
|
case 'attention':
|
|
52
69
|
return {
|
|
53
70
|
label: 'Needs Attention',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EntityActivityItem, EntityEvent, TaskActivityItem, TaskEvent, TaskItem } from '../types';
|
|
1
|
+
import type { EntityActivityItem, EntityEvent, TaskActivityItem, TaskActivitySummaryItem, TaskEvent, TaskItem } from '../types';
|
|
2
2
|
export type TaskEventValueFormatter = (field: string, value: unknown) => string | undefined;
|
|
3
3
|
type AttachmentChange = {
|
|
4
4
|
from?: unknown;
|
|
@@ -11,6 +11,7 @@ type AttachmentChange = {
|
|
|
11
11
|
};
|
|
12
12
|
export declare function summarizeTaskChange(field: string, change: AttachmentChange | undefined, formatter?: TaskEventValueFormatter): string;
|
|
13
13
|
export declare function summarizeTaskEvent(event: TaskEvent, formatter?: TaskEventValueFormatter): string;
|
|
14
|
+
export declare function summarizeTaskEvent(event: Pick<TaskEvent, 'action' | 'details'>, formatter?: TaskEventValueFormatter): string;
|
|
14
15
|
export declare function summarizeEntityEvent(event: EntityEvent, formatter?: TaskEventValueFormatter): string;
|
|
15
16
|
export declare function getTaskEventPrimaryChangeField(event: TaskEvent): string | null;
|
|
16
17
|
export declare function getEntityEventPrimaryChangeField(event: EntityEvent): string | null;
|
|
@@ -20,5 +21,5 @@ export declare function getEntityActivityItems(task: {
|
|
|
20
21
|
}): EntityActivityItem[];
|
|
21
22
|
export declare function getTaskActivityItems(task: Pick<TaskItem, 'activity' | 'comments'>): TaskActivityItem[];
|
|
22
23
|
export declare function getLatestTaskActivity(task: Pick<TaskItem, 'activity' | 'comments'>): TaskActivityItem | null;
|
|
23
|
-
export declare function summarizeTaskActivity(item: TaskActivityItem | null, formatter?: TaskEventValueFormatter): string;
|
|
24
|
+
export declare function summarizeTaskActivity(item: TaskActivityItem | TaskActivitySummaryItem | null, formatter?: TaskEventValueFormatter): string;
|
|
24
25
|
export {};
|
|
@@ -5,8 +5,6 @@ function getActivityFieldLabel(field) {
|
|
|
5
5
|
return 'Title';
|
|
6
6
|
if (field === 'description')
|
|
7
7
|
return 'Description';
|
|
8
|
-
if (field === 'assignee')
|
|
9
|
-
return 'Assigned to';
|
|
10
8
|
if (field === 'ownerId')
|
|
11
9
|
return 'Owner';
|
|
12
10
|
if (field === 'status')
|
|
@@ -21,6 +19,14 @@ function getActivityFieldLabel(field) {
|
|
|
21
19
|
return 'Initiative';
|
|
22
20
|
return field;
|
|
23
21
|
}
|
|
22
|
+
function isUnassignedActivityValue(value) {
|
|
23
|
+
const normalized = String(value ?? '').trim().toLowerCase();
|
|
24
|
+
return !normalized
|
|
25
|
+
|| normalized === 'none'
|
|
26
|
+
|| normalized === 'null'
|
|
27
|
+
|| normalized === 'unassigned'
|
|
28
|
+
|| normalized === 'user';
|
|
29
|
+
}
|
|
24
30
|
function formatStatusValue(value) {
|
|
25
31
|
if (value === 'task')
|
|
26
32
|
return 'Task';
|
|
@@ -277,6 +283,17 @@ export function summarizeTaskChange(field, change, formatter) {
|
|
|
277
283
|
if (field === 'attachments') {
|
|
278
284
|
return summarizeAttachmentChange(change);
|
|
279
285
|
}
|
|
286
|
+
if (field === 'assignee') {
|
|
287
|
+
const previousAssignee = formatValue(change?.from, field, formatter);
|
|
288
|
+
const nextAssignee = formatValue(change?.to, field, formatter);
|
|
289
|
+
if (isUnassignedActivityValue(change?.from) && !isUnassignedActivityValue(change?.to)) {
|
|
290
|
+
return `Assigned to ${nextAssignee}`;
|
|
291
|
+
}
|
|
292
|
+
if (!isUnassignedActivityValue(change?.from) && isUnassignedActivityValue(change?.to)) {
|
|
293
|
+
return `Unassigned from ${previousAssignee}`;
|
|
294
|
+
}
|
|
295
|
+
return `Reassigned: ${previousAssignee} → ${nextAssignee}`;
|
|
296
|
+
}
|
|
280
297
|
const label = getActivityFieldLabel(field);
|
|
281
298
|
if (field === 'title') {
|
|
282
299
|
return `${label}: updated`;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AttachmentItem, ChecklistItem, TaskAssignee, TaskItem, TaskStatus } from '../types';
|
|
2
|
+
export interface TaskEditorDraft {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
category: string;
|
|
6
|
+
type: string;
|
|
7
|
+
priority: number | string;
|
|
8
|
+
complexity: number;
|
|
9
|
+
status: TaskStatus;
|
|
10
|
+
assignee: TaskAssignee;
|
|
11
|
+
scheduledDate: string;
|
|
12
|
+
dueDate: string;
|
|
13
|
+
workstreamId: string;
|
|
14
|
+
taxonomies: Record<string, string | number | string[] | number[]>;
|
|
15
|
+
checklistItems: ChecklistItem[];
|
|
16
|
+
attachments: Array<string | AttachmentItem>;
|
|
17
|
+
}
|
|
18
|
+
export type TaskEditorScalarField = Exclude<keyof TaskEditorDraft, 'taxonomies' | 'checklistItems' | 'attachments'>;
|
|
19
|
+
export type TaskEditorConflict = {
|
|
20
|
+
field: TaskEditorScalarField;
|
|
21
|
+
} | {
|
|
22
|
+
field: 'taxonomies';
|
|
23
|
+
key: string;
|
|
24
|
+
} | {
|
|
25
|
+
field: 'checklistItems' | 'attachments';
|
|
26
|
+
key: string;
|
|
27
|
+
};
|
|
28
|
+
export interface TaskEditorReconciliation {
|
|
29
|
+
merged: TaskEditorDraft;
|
|
30
|
+
conflicts: TaskEditorConflict[];
|
|
31
|
+
remoteChangedFields: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function taskToEditorDraft(task: TaskItem): TaskEditorDraft;
|
|
34
|
+
export declare function applyEditorDraftToTask(task: TaskItem, draft: TaskEditorDraft): TaskItem;
|
|
35
|
+
export declare function reconcileTaskEditorDraft(base: TaskEditorDraft, local: TaskEditorDraft, remote: TaskEditorDraft): TaskEditorReconciliation;
|
|
36
|
+
export declare function resolveTaskEditorConflicts(reconciliation: TaskEditorReconciliation, remote: TaskEditorDraft, resolution: 'latest' | 'local', current?: TaskEditorDraft): TaskEditorDraft;
|
|
37
|
+
export declare function isTaskEditorConflictAligned(conflict: TaskEditorConflict, local: TaskEditorDraft, remote: TaskEditorDraft): boolean;
|
|
38
|
+
export declare function taskEditorConflictKey(conflict: TaskEditorConflict): string;
|
|
39
|
+
export declare function preserveUnresolvedTaskEditorConflicts(existing: TaskEditorConflict[], next: TaskEditorConflict[], local: TaskEditorDraft, remote: TaskEditorDraft): TaskEditorConflict[];
|
|
40
|
+
export declare function formatTaskEditorConflictFields(conflicts: TaskEditorConflict[]): string[];
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { canonicalWorkspaceSyncJson } from '../sync/v3/canonicalWorkspaceSyncJson.js';
|
|
2
|
+
const SCALAR_FIELDS = [
|
|
3
|
+
'title',
|
|
4
|
+
'description',
|
|
5
|
+
'category',
|
|
6
|
+
'type',
|
|
7
|
+
'priority',
|
|
8
|
+
'complexity',
|
|
9
|
+
'status',
|
|
10
|
+
'assignee',
|
|
11
|
+
'scheduledDate',
|
|
12
|
+
'dueDate',
|
|
13
|
+
'workstreamId',
|
|
14
|
+
];
|
|
15
|
+
export function taskToEditorDraft(task) {
|
|
16
|
+
return {
|
|
17
|
+
title: task.title || '',
|
|
18
|
+
description: task.description || '',
|
|
19
|
+
category: task.category || '',
|
|
20
|
+
type: task.type || '',
|
|
21
|
+
priority: task.priority,
|
|
22
|
+
complexity: Number(task.complexity) || 3,
|
|
23
|
+
status: task.status || 'task',
|
|
24
|
+
assignee: task.assignee || 'unassigned',
|
|
25
|
+
scheduledDate: task.scheduledDate || '',
|
|
26
|
+
dueDate: task.dueDate || '',
|
|
27
|
+
workstreamId: task.workstreamId || '',
|
|
28
|
+
taxonomies: { ...(task.taxonomies || {}) },
|
|
29
|
+
checklistItems: [...(task.checklistItems || [])],
|
|
30
|
+
attachments: [...(task.attachments || [])],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function applyEditorDraftToTask(task, draft) {
|
|
34
|
+
return {
|
|
35
|
+
...task,
|
|
36
|
+
title: draft.title,
|
|
37
|
+
description: draft.description || null,
|
|
38
|
+
category: draft.category,
|
|
39
|
+
type: draft.type,
|
|
40
|
+
priority: draft.priority,
|
|
41
|
+
complexity: draft.complexity,
|
|
42
|
+
status: draft.status,
|
|
43
|
+
assignee: draft.assignee,
|
|
44
|
+
scheduledDate: draft.scheduledDate || null,
|
|
45
|
+
dueDate: draft.dueDate || null,
|
|
46
|
+
workstreamId: draft.workstreamId || null,
|
|
47
|
+
taxonomies: draft.taxonomies,
|
|
48
|
+
checklistItems: draft.checklistItems,
|
|
49
|
+
attachments: draft.attachments,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function equal(left, right) {
|
|
53
|
+
return canonicalWorkspaceSyncJson(left ?? null) === canonicalWorkspaceSyncJson(right ?? null);
|
|
54
|
+
}
|
|
55
|
+
function mergeValue(base, local, remote) {
|
|
56
|
+
const localChanged = !equal(local, base);
|
|
57
|
+
const remoteChanged = !equal(remote, base);
|
|
58
|
+
if (!localChanged)
|
|
59
|
+
return { value: remote, conflict: false, remoteChanged };
|
|
60
|
+
if (!remoteChanged || equal(local, remote))
|
|
61
|
+
return { value: local, conflict: false, remoteChanged };
|
|
62
|
+
return { value: local, conflict: true, remoteChanged };
|
|
63
|
+
}
|
|
64
|
+
function attachmentKey(attachment) {
|
|
65
|
+
if (typeof attachment === 'string')
|
|
66
|
+
return `path:${attachment}`;
|
|
67
|
+
if (attachment.assetId)
|
|
68
|
+
return `asset:${attachment.assetId}`;
|
|
69
|
+
if (attachment.referenceLabel)
|
|
70
|
+
return `reference:${attachment.referenceLabel}`;
|
|
71
|
+
if (attachment.referenceNumber != null)
|
|
72
|
+
return `number:${attachment.referenceNumber}`;
|
|
73
|
+
return `path:${attachment.path || attachment.fsPath || canonicalWorkspaceSyncJson(attachment)}`;
|
|
74
|
+
}
|
|
75
|
+
function mergeKeyedCollection(baseItems, localItems, remoteItems, getKey) {
|
|
76
|
+
const base = new Map(baseItems.map((item) => [getKey(item), item]));
|
|
77
|
+
const local = new Map(localItems.map((item) => [getKey(item), item]));
|
|
78
|
+
const remote = new Map(remoteItems.map((item) => [getKey(item), item]));
|
|
79
|
+
const keys = new Set([...base.keys(), ...remote.keys(), ...local.keys()]);
|
|
80
|
+
const merged = new Map();
|
|
81
|
+
const conflictKeys = [];
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
const baseItem = base.get(key);
|
|
84
|
+
const localItem = local.get(key);
|
|
85
|
+
const remoteItem = remote.get(key);
|
|
86
|
+
const result = mergeValue(baseItem, localItem, remoteItem);
|
|
87
|
+
if (result.value !== undefined)
|
|
88
|
+
merged.set(key, result.value);
|
|
89
|
+
if (result.conflict)
|
|
90
|
+
conflictKeys.push(key);
|
|
91
|
+
}
|
|
92
|
+
const orderedKeys = [
|
|
93
|
+
...remoteItems.map(getKey),
|
|
94
|
+
...localItems.map(getKey).filter((key) => !remote.has(key)),
|
|
95
|
+
].filter((key, index, all) => all.indexOf(key) === index && merged.has(key));
|
|
96
|
+
return {
|
|
97
|
+
items: orderedKeys.map((key) => merged.get(key)),
|
|
98
|
+
conflictKeys,
|
|
99
|
+
remoteChanged: !equal(baseItems, remoteItems),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function reconcileTaskEditorDraft(base, local, remote) {
|
|
103
|
+
const merged = { ...remote };
|
|
104
|
+
const conflicts = [];
|
|
105
|
+
const remoteChangedFields = new Set();
|
|
106
|
+
for (const field of SCALAR_FIELDS) {
|
|
107
|
+
const result = mergeValue(base[field], local[field], remote[field]);
|
|
108
|
+
merged[field] = result.value;
|
|
109
|
+
if (result.conflict)
|
|
110
|
+
conflicts.push({ field });
|
|
111
|
+
if (result.remoteChanged)
|
|
112
|
+
remoteChangedFields.add(field);
|
|
113
|
+
}
|
|
114
|
+
const taxonomyKeys = new Set([
|
|
115
|
+
...Object.keys(base.taxonomies),
|
|
116
|
+
...Object.keys(local.taxonomies),
|
|
117
|
+
...Object.keys(remote.taxonomies),
|
|
118
|
+
]);
|
|
119
|
+
const mergedTaxonomies = {};
|
|
120
|
+
for (const key of taxonomyKeys) {
|
|
121
|
+
const result = mergeValue(base.taxonomies[key], local.taxonomies[key], remote.taxonomies[key]);
|
|
122
|
+
if (result.value !== undefined)
|
|
123
|
+
mergedTaxonomies[key] = result.value;
|
|
124
|
+
if (result.conflict)
|
|
125
|
+
conflicts.push({ field: 'taxonomies', key });
|
|
126
|
+
if (result.remoteChanged)
|
|
127
|
+
remoteChangedFields.add(`taxonomies.${key}`);
|
|
128
|
+
}
|
|
129
|
+
merged.taxonomies = mergedTaxonomies;
|
|
130
|
+
const checklist = mergeKeyedCollection(base.checklistItems, local.checklistItems, remote.checklistItems, (item) => item.id);
|
|
131
|
+
merged.checklistItems = checklist.items;
|
|
132
|
+
checklist.conflictKeys.forEach((key) => conflicts.push({ field: 'checklistItems', key }));
|
|
133
|
+
if (checklist.remoteChanged)
|
|
134
|
+
remoteChangedFields.add('checklistItems');
|
|
135
|
+
const attachments = mergeKeyedCollection(base.attachments, local.attachments, remote.attachments, attachmentKey);
|
|
136
|
+
merged.attachments = attachments.items;
|
|
137
|
+
attachments.conflictKeys.forEach((key) => conflicts.push({ field: 'attachments', key }));
|
|
138
|
+
if (attachments.remoteChanged)
|
|
139
|
+
remoteChangedFields.add('attachments');
|
|
140
|
+
return { merged, conflicts, remoteChangedFields: [...remoteChangedFields] };
|
|
141
|
+
}
|
|
142
|
+
export function resolveTaskEditorConflicts(reconciliation, remote, resolution, current = reconciliation.merged) {
|
|
143
|
+
if (resolution === 'local')
|
|
144
|
+
return current;
|
|
145
|
+
const resolved = {
|
|
146
|
+
...current,
|
|
147
|
+
taxonomies: { ...current.taxonomies },
|
|
148
|
+
checklistItems: [...current.checklistItems],
|
|
149
|
+
attachments: [...current.attachments],
|
|
150
|
+
};
|
|
151
|
+
for (const conflict of reconciliation.conflicts) {
|
|
152
|
+
if (conflict.field === 'taxonomies') {
|
|
153
|
+
const value = remote.taxonomies[conflict.key];
|
|
154
|
+
if (value === undefined)
|
|
155
|
+
delete resolved.taxonomies[conflict.key];
|
|
156
|
+
else
|
|
157
|
+
resolved.taxonomies[conflict.key] = value;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (conflict.field === 'checklistItems' || conflict.field === 'attachments') {
|
|
161
|
+
const getKey = conflict.field === 'checklistItems'
|
|
162
|
+
? (item) => item.id
|
|
163
|
+
: (item) => attachmentKey(item);
|
|
164
|
+
const current = resolved[conflict.field];
|
|
165
|
+
const latest = remote[conflict.field];
|
|
166
|
+
const latestItem = latest.find((item) => getKey(item) === conflict.key);
|
|
167
|
+
const withoutConflict = current.filter((item) => getKey(item) !== conflict.key);
|
|
168
|
+
resolved[conflict.field] = latestItem
|
|
169
|
+
? [...withoutConflict, latestItem]
|
|
170
|
+
: withoutConflict;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
resolved[conflict.field] = remote[conflict.field];
|
|
174
|
+
}
|
|
175
|
+
return resolved;
|
|
176
|
+
}
|
|
177
|
+
export function isTaskEditorConflictAligned(conflict, local, remote) {
|
|
178
|
+
if (conflict.field === 'taxonomies') {
|
|
179
|
+
return equal(local.taxonomies[conflict.key], remote.taxonomies[conflict.key]);
|
|
180
|
+
}
|
|
181
|
+
if (conflict.field === 'checklistItems') {
|
|
182
|
+
return equal(local.checklistItems.find((item) => item.id === conflict.key), remote.checklistItems.find((item) => item.id === conflict.key));
|
|
183
|
+
}
|
|
184
|
+
if (conflict.field === 'attachments') {
|
|
185
|
+
return equal(local.attachments.find((item) => attachmentKey(item) === conflict.key), remote.attachments.find((item) => attachmentKey(item) === conflict.key));
|
|
186
|
+
}
|
|
187
|
+
return equal(local[conflict.field], remote[conflict.field]);
|
|
188
|
+
}
|
|
189
|
+
export function taskEditorConflictKey(conflict) {
|
|
190
|
+
return 'key' in conflict ? `${conflict.field}:${conflict.key}` : conflict.field;
|
|
191
|
+
}
|
|
192
|
+
export function preserveUnresolvedTaskEditorConflicts(existing, next, local, remote) {
|
|
193
|
+
const conflictsByKey = new Map([
|
|
194
|
+
...existing.filter((conflict) => !isTaskEditorConflictAligned(conflict, local, remote)),
|
|
195
|
+
...next,
|
|
196
|
+
].map((conflict) => [taskEditorConflictKey(conflict), conflict]));
|
|
197
|
+
return [...conflictsByKey.values()];
|
|
198
|
+
}
|
|
199
|
+
export function formatTaskEditorConflictFields(conflicts) {
|
|
200
|
+
const labels = {
|
|
201
|
+
title: 'title',
|
|
202
|
+
description: 'description',
|
|
203
|
+
category: 'category',
|
|
204
|
+
type: 'type',
|
|
205
|
+
priority: 'priority',
|
|
206
|
+
complexity: 'complexity',
|
|
207
|
+
status: 'status',
|
|
208
|
+
assignee: 'assignee',
|
|
209
|
+
scheduledDate: 'scheduled date',
|
|
210
|
+
dueDate: 'due date',
|
|
211
|
+
workstreamId: 'workstream',
|
|
212
|
+
taxonomies: 'taxonomy',
|
|
213
|
+
checklistItems: 'checklist',
|
|
214
|
+
attachments: 'attachments',
|
|
215
|
+
};
|
|
216
|
+
return [...new Set(conflicts.map((conflict) => labels[conflict.field] || String(conflict.field)))];
|
|
217
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TaskItem } from '../types.js';
|
|
2
|
+
import type { WorkflowAssignmentDetails } from '../components/features/workflowManager/types.js';
|
|
2
3
|
import type { TaskCollection } from './taskInvalidation.js';
|
|
3
4
|
export declare const TASKFORCE_TASKS_MUTATED_EVENT = "taskforce:tasks-mutated";
|
|
4
5
|
export interface TaskforceTasksMutatedDetail {
|
|
@@ -6,6 +7,7 @@ export interface TaskforceTasksMutatedDetail {
|
|
|
6
7
|
taskId?: string | null;
|
|
7
8
|
reason?: 'agent-comment' | 'agent-checklist' | 'workflow-step';
|
|
8
9
|
authoritativeTask?: TaskItem | null;
|
|
10
|
+
authoritativeWorkflowAssignment?: WorkflowAssignmentDetails | null;
|
|
9
11
|
affectedCollections?: TaskCollection[];
|
|
10
12
|
}
|
|
11
13
|
export declare function dispatchTaskforceTasksMutated(detail: TaskforceTasksMutatedDetail): void;
|
|
@@ -13,6 +13,7 @@ export declare function normalizePriorityDefinitions(priorities: PriorityDefinit
|
|
|
13
13
|
changed: boolean;
|
|
14
14
|
};
|
|
15
15
|
export declare function normalizeTaskFromApi(task: any): TaskItem;
|
|
16
|
+
export declare function toTaskCollectionSummary(task: TaskItem): TaskItem;
|
|
16
17
|
export declare function getTaskContentRevision(task: TaskItem): string;
|
|
17
18
|
export declare function reconcileTaskCollection(previous: TaskItem[], incoming: TaskItem[]): TaskItem[];
|
|
18
19
|
export declare function mergeNormalizedTaskIntoCollections(task: unknown, tasks: TaskItem[], archivedTasks: TaskItem[]): {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { cloneDefaultPriorityDefinitions } from '../shared/taxonomyDefaults.js';
|
|
2
2
|
import { formatLocalTaskReference, formatTaskReference } from './taskReferences.js';
|
|
3
|
+
import { getLatestTaskActivity } from './taskActivity.js';
|
|
3
4
|
export const DEFAULT_PRIORITY_DEFINITIONS = cloneDefaultPriorityDefinitions();
|
|
4
5
|
const PRIORITY_VALUE_BY_LABEL = {
|
|
5
6
|
low: 1,
|
|
@@ -96,6 +97,44 @@ export function normalizeTaskFromApi(task) {
|
|
|
96
97
|
status: normalizeTaskStatus(task.status)
|
|
97
98
|
};
|
|
98
99
|
}
|
|
100
|
+
export function toTaskCollectionSummary(task) {
|
|
101
|
+
const { description: _description, comments, activity: _activity, taskEvents: _taskEvents, attachments, checklistItems, createdByActor: _createdByActor, assigneeActor: _assigneeActor, ...summary } = task;
|
|
102
|
+
const latestRevision = (values) => values.reduce((latest, value) => String(value || '') > latest ? String(value || '') : latest, '');
|
|
103
|
+
const commentCount = task.commentCount ?? comments?.length ?? 0;
|
|
104
|
+
const checklistCount = task.checklistCount ?? checklistItems?.length ?? 0;
|
|
105
|
+
const completedChecklistCount = task.completedChecklistCount
|
|
106
|
+
?? checklistItems?.filter((item) => item.isCompleted).length
|
|
107
|
+
?? 0;
|
|
108
|
+
const attachmentCount = task.attachmentCount ?? attachments?.length ?? 0;
|
|
109
|
+
const relationshipCount = task.relationshipCount ?? 0;
|
|
110
|
+
const latestActivity = task.latestActivity ?? getLatestTaskActivity(task);
|
|
111
|
+
return {
|
|
112
|
+
...summary,
|
|
113
|
+
cardCoverAttachment: task.cardCoverAttachment ?? (task.cardCoverAssetId
|
|
114
|
+
? attachments?.find((attachment) => (typeof attachment !== 'string' && attachment.assetId === task.cardCoverAssetId)) || null
|
|
115
|
+
: null),
|
|
116
|
+
isSummary: true,
|
|
117
|
+
commentCount,
|
|
118
|
+
checklistCount,
|
|
119
|
+
completedChecklistCount,
|
|
120
|
+
attachmentCount,
|
|
121
|
+
relationshipCount,
|
|
122
|
+
latestActivity,
|
|
123
|
+
detailRevision: task.detailRevision || JSON.stringify([
|
|
124
|
+
String(task.updatedAt || task.createdAt || ''),
|
|
125
|
+
commentCount,
|
|
126
|
+
latestRevision(comments?.map((comment) => comment.timestamp) || []),
|
|
127
|
+
checklistCount,
|
|
128
|
+
completedChecklistCount,
|
|
129
|
+
latestRevision(checklistItems?.map((item) => item.updatedAt || item.createdAt) || []),
|
|
130
|
+
attachmentCount,
|
|
131
|
+
latestRevision(attachments?.map((attachment) => typeof attachment === 'string' ? '' : attachment.timestamp) || []),
|
|
132
|
+
relationshipCount,
|
|
133
|
+
latestActivity?.timestamp || '',
|
|
134
|
+
latestActivity?.id || '',
|
|
135
|
+
]),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
99
138
|
export function getTaskContentRevision(task) {
|
|
100
139
|
// Use the complete normalized snapshot: some task changes can arrive without a
|
|
101
140
|
// distinct updatedAt value, so a timestamp-only key could retain stale UI data.
|
package/dist/utils/taskSearch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { STATUS_OPTIONS } from './constants';
|
|
2
|
-
import { getTaskReferenceLabel } from './taskReferences';
|
|
1
|
+
import { STATUS_OPTIONS } from './constants.js';
|
|
2
|
+
import { getTaskReferenceLabel } from './taskReferences.js';
|
|
3
3
|
const DASH_LIKE_PATTERN = /[\u2010-\u2015\u2212]/g;
|
|
4
4
|
export function normalizeSearchText(value) {
|
|
5
5
|
return String(value ?? '')
|