@taskforcehq/taskforce 0.3.329 → 0.3.332
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/README.md +7 -2
- package/dist/Taskforce.module.css +290 -45
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/TaskSettings.js +70 -14
- 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 +2 -2
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
- 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 +15 -3
- package/dist/components/features/planning/planningMetadata.d.ts +10 -0
- package/dist/components/features/planning/planningMetadata.js +8 -0
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +3 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/views/StandaloneLayout.js +62 -27
- package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
- package/dist/components/views/panels/PlanningDrawer.js +12 -8
- 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 +55 -1
- package/dist/core/McpTokenService.d.ts +25 -1
- package/dist/core/McpTokenService.js +106 -15
- 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 +43 -3
- package/dist/core/Taskforce.js +158 -7
- package/dist/core/types.d.ts +9 -0
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
- package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
- 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/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/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +31 -1
- package/dist/hooks/useTaskData.js +29 -7
- package/dist/hooks/useTaskMutations.d.ts +3 -1
- package/dist/hooks/useTaskMutations.js +46 -12
- package/dist/hooks/useTaskforce.d.ts +2 -0
- package/dist/hooks/useTaskforce.js +11 -2
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +9 -6
- 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 +11 -0
- package/dist/mcp/httpProtocolRouting.js +22 -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 +408 -102
- package/dist/mcp/taskPlanningRegistrar.js +25 -6
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +11 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +9 -8
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +415 -0
- package/dist/runtime/appGates.d.ts +2 -1
- package/dist/runtime/appGates.js +7 -0
- package/dist/server/buildInfo.d.ts +1 -0
- package/dist/server/buildInfo.js +5 -1
- package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
- package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +108 -11
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.js +2 -1
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +126 -5
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +277 -24
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
- 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 +136 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/shared.d.ts +22 -0
- package/dist/server/routes/shared.js +298 -182
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +5 -1
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +10 -1
- package/dist/server/routes/syncV3OperationRoutes.js +35 -9
- package/dist/server/routes/tasks.js +21 -2
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes.js +59 -0
- package/dist/service/localServiceCli.d.ts +2 -2
- package/dist/service/localServiceCli.js +4 -3
- package/dist/services/codexAppServerModelGateway.d.ts +54 -5
- package/dist/services/codexAppServerModelGateway.js +246 -21
- 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 +139 -0
- package/dist/services/executorPhaseAIssuerCore.js +402 -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 +2 -2
- package/dist/services/taskforceAgentMcpBridge.js +42 -29
- 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 -9
- package/dist/shared/taskforceAgentModels.js +7 -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 +4 -0
- package/dist/storage/postgresAdapter.js +14 -1
- package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
- package/dist/storage/postgresRequestDiagnostics.js +15 -2
- package/dist/storage/postgresWorker.js +20 -2
- package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/storage/workflowStore.d.ts +2 -0
- package/dist/storage/workflowStore.js +39 -2
- package/dist/sync/cloudSyncApi.js +4 -2
- package/dist/sync/collaborationSyncState.js +5 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
- 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/workspaceSyncEngineLifecyclePolicy.js +6 -6
- 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/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
- package/dist/sync/syncApplyHandlers.d.ts +3 -0
- package/dist/sync/syncApplyHandlers.js +81 -15
- package/dist/sync/syncService.d.ts +15 -0
- package/dist/sync/syncService.js +83 -18
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +4 -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.js +3 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
- 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/localOutboxRecoveryPreparationService.js +8 -2
- 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.d.ts +3 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
- package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
- package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
- package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
- package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
- package/dist/sync/v3/syncDurabilityStore.js +202 -8
- package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
- package/dist/sync/v3/taskChecklistMutationService.js +44 -1
- package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
- package/dist/sync/v3/taskStatusMutationService.js +119 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
- package/dist/sync/v3/workflowAssignmentSync.js +27 -0
- package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
- package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
- 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/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
- package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
- 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/workspaceRepair.d.ts +5 -2
- package/dist/sync/workspaceRepair.js +161 -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/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
- package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
- package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
- package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
- package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
- package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-DSQINwt9.js +7 -0
- package/dist/ui/assets/{vendor-icons-D9Lpw-j4.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/taskEvents.d.ts +2 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +24 -4
- package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
- package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
- package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
- package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-I5zhdtgt.js +0 -7
- package/dist/ui/assets/index-VRFsx3wz.css +0 -1
|
@@ -111,6 +111,16 @@ if (!runtimeOptions.deadlines) {
|
|
|
111
111
|
}
|
|
112
112
|
const pool = createPool(connectionString, runtimeOptions.deadlines);
|
|
113
113
|
const txClients = new Map();
|
|
114
|
+
function withPoolSnapshot(payload) {
|
|
115
|
+
return {
|
|
116
|
+
...payload,
|
|
117
|
+
pool: {
|
|
118
|
+
totalCount: Math.max(0, Number(pool.totalCount) || 0),
|
|
119
|
+
idleCount: Math.max(0, Number(pool.idleCount) || 0),
|
|
120
|
+
waitingCount: Math.max(0, Number(pool.waitingCount) || 0),
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
114
124
|
async function handleMessage(message) {
|
|
115
125
|
const { payload } = message;
|
|
116
126
|
const txId = payload.txId ? String(payload.txId) : null;
|
|
@@ -174,10 +184,18 @@ parentPort.on('message', async (message) => {
|
|
|
174
184
|
return;
|
|
175
185
|
}
|
|
176
186
|
const response = await handleMessage(message);
|
|
177
|
-
writeResponse(message.statusBuffer, message.responseBuffer, response);
|
|
187
|
+
writeResponse(message.statusBuffer, message.responseBuffer, withPoolSnapshot(response));
|
|
178
188
|
}
|
|
179
189
|
catch (error) {
|
|
180
190
|
const messageText = error instanceof Error ? error.message : String(error);
|
|
181
|
-
|
|
191
|
+
const databaseErrorCode = error && typeof error === 'object'
|
|
192
|
+
&& typeof error.code === 'string'
|
|
193
|
+
? String(error.code)
|
|
194
|
+
: undefined;
|
|
195
|
+
writeResponse(message.statusBuffer, message.responseBuffer, withPoolSnapshot({
|
|
196
|
+
ok: false,
|
|
197
|
+
error: messageText,
|
|
198
|
+
...(databaseErrorCode ? { databaseErrorCode } : {}),
|
|
199
|
+
}));
|
|
182
200
|
}
|
|
183
201
|
});
|
|
@@ -10,13 +10,20 @@ export type PostgresWorkerQueryResult = {
|
|
|
10
10
|
rows: Record<string, unknown>[];
|
|
11
11
|
rowCount?: number;
|
|
12
12
|
};
|
|
13
|
+
export type PostgresWorkerPoolSnapshot = {
|
|
14
|
+
totalCount: number;
|
|
15
|
+
idleCount: number;
|
|
16
|
+
waitingCount: number;
|
|
17
|
+
};
|
|
13
18
|
export type PostgresWorkerResponsePayload = {
|
|
14
19
|
ok: boolean;
|
|
15
20
|
result?: PostgresWorkerQueryResult;
|
|
16
21
|
error?: string;
|
|
17
22
|
errorCode?: 'RESPONSE_BUFFER_TOO_SMALL';
|
|
23
|
+
databaseErrorCode?: string;
|
|
18
24
|
requiredBytes?: number;
|
|
19
25
|
responseToken?: string;
|
|
26
|
+
pool?: PostgresWorkerPoolSnapshot;
|
|
20
27
|
};
|
|
21
28
|
export type PostgresWorkerDeadlines = {
|
|
22
29
|
responseTimeoutMs: number;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DatabaseAdapter } from './databaseAdapter.js';
|
|
2
|
+
export interface TaskforceAgentConnectionBindingRecord {
|
|
3
|
+
tenantId: string;
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
agentId: string;
|
|
6
|
+
connectionId: string;
|
|
7
|
+
ownerUserId: string;
|
|
8
|
+
providerKey: string;
|
|
9
|
+
modelSource: string;
|
|
10
|
+
createdByUserId: string;
|
|
11
|
+
updatedByUserId: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class TaskforceAgentConnectionBindingStore {
|
|
16
|
+
private readonly db;
|
|
17
|
+
private readonly tenantId;
|
|
18
|
+
private readonly now;
|
|
19
|
+
constructor(db: DatabaseAdapter, tenantId: string, now?: () => Date);
|
|
20
|
+
get(workspaceIdRaw: string, agentIdRaw: string): TaskforceAgentConnectionBindingRecord | null;
|
|
21
|
+
bind(input: {
|
|
22
|
+
workspaceId: string;
|
|
23
|
+
agentId: string;
|
|
24
|
+
connectionId: string;
|
|
25
|
+
ownerUserId: string;
|
|
26
|
+
providerKey: string;
|
|
27
|
+
modelSource: string;
|
|
28
|
+
actorUserId: string;
|
|
29
|
+
}): TaskforceAgentConnectionBindingRecord | null;
|
|
30
|
+
clear(workspaceIdRaw: string, agentIdRaw: string, ownerUserIdRaw: string): boolean;
|
|
31
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
function normalizeRequired(value, label) {
|
|
2
|
+
const normalized = String(value || '').trim();
|
|
3
|
+
if (!normalized)
|
|
4
|
+
throw new Error(`${label} is required.`);
|
|
5
|
+
return normalized;
|
|
6
|
+
}
|
|
7
|
+
function mapRow(row) {
|
|
8
|
+
return {
|
|
9
|
+
tenantId: String(row.tenant_id || ''),
|
|
10
|
+
workspaceId: String(row.workspace_id || ''),
|
|
11
|
+
agentId: String(row.agent_id || ''),
|
|
12
|
+
connectionId: String(row.connection_id || ''),
|
|
13
|
+
ownerUserId: String(row.owner_user_id || ''),
|
|
14
|
+
providerKey: String(row.provider_key || ''),
|
|
15
|
+
modelSource: String(row.model_source || ''),
|
|
16
|
+
createdByUserId: String(row.created_by_user_id || ''),
|
|
17
|
+
updatedByUserId: String(row.updated_by_user_id || ''),
|
|
18
|
+
createdAt: String(row.created_at || ''),
|
|
19
|
+
updatedAt: String(row.updated_at || ''),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export class TaskforceAgentConnectionBindingStore {
|
|
23
|
+
db;
|
|
24
|
+
tenantId;
|
|
25
|
+
now;
|
|
26
|
+
constructor(db, tenantId, now = () => new Date()) {
|
|
27
|
+
this.db = db;
|
|
28
|
+
this.tenantId = tenantId;
|
|
29
|
+
this.now = now;
|
|
30
|
+
}
|
|
31
|
+
get(workspaceIdRaw, agentIdRaw) {
|
|
32
|
+
const workspaceId = String(workspaceIdRaw || '').trim();
|
|
33
|
+
const agentId = String(agentIdRaw || '').trim();
|
|
34
|
+
if (!workspaceId || !agentId)
|
|
35
|
+
return null;
|
|
36
|
+
const row = this.db.prepare(`
|
|
37
|
+
SELECT *
|
|
38
|
+
FROM taskforce_agent_connection_bindings
|
|
39
|
+
WHERE tenant_id = ? AND workspace_id = ? AND agent_id = ?
|
|
40
|
+
LIMIT 1
|
|
41
|
+
`).get(this.tenantId, workspaceId, agentId);
|
|
42
|
+
return row ? mapRow(row) : null;
|
|
43
|
+
}
|
|
44
|
+
bind(input) {
|
|
45
|
+
const workspaceId = normalizeRequired(input.workspaceId, 'Workspace ID');
|
|
46
|
+
const agentId = normalizeRequired(input.agentId, 'Agent ID');
|
|
47
|
+
const connectionId = normalizeRequired(input.connectionId, 'Connection ID');
|
|
48
|
+
const ownerUserId = normalizeRequired(input.ownerUserId, 'Connection owner');
|
|
49
|
+
const providerKey = normalizeRequired(input.providerKey, 'Provider key');
|
|
50
|
+
const modelSource = normalizeRequired(input.modelSource, 'Model source');
|
|
51
|
+
const actorUserId = normalizeRequired(input.actorUserId, 'Actor user');
|
|
52
|
+
const now = this.now().toISOString();
|
|
53
|
+
const result = this.db.prepare(`
|
|
54
|
+
INSERT INTO taskforce_agent_connection_bindings (
|
|
55
|
+
tenant_id, workspace_id, agent_id, connection_id, owner_user_id,
|
|
56
|
+
provider_key, model_source, created_by_user_id, updated_by_user_id,
|
|
57
|
+
created_at, updated_at
|
|
58
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
59
|
+
ON CONFLICT (tenant_id, workspace_id, agent_id) DO UPDATE SET
|
|
60
|
+
connection_id = excluded.connection_id,
|
|
61
|
+
owner_user_id = excluded.owner_user_id,
|
|
62
|
+
provider_key = excluded.provider_key,
|
|
63
|
+
model_source = excluded.model_source,
|
|
64
|
+
updated_by_user_id = excluded.updated_by_user_id,
|
|
65
|
+
updated_at = excluded.updated_at
|
|
66
|
+
WHERE taskforce_agent_connection_bindings.owner_user_id = excluded.owner_user_id
|
|
67
|
+
`).run(this.tenantId, workspaceId, agentId, connectionId, ownerUserId, providerKey, modelSource, actorUserId, actorUserId, now, now);
|
|
68
|
+
if (Number(result.changes || 0) === 0)
|
|
69
|
+
return null;
|
|
70
|
+
return this.get(workspaceId, agentId);
|
|
71
|
+
}
|
|
72
|
+
clear(workspaceIdRaw, agentIdRaw, ownerUserIdRaw) {
|
|
73
|
+
const workspaceId = String(workspaceIdRaw || '').trim();
|
|
74
|
+
const agentId = String(agentIdRaw || '').trim();
|
|
75
|
+
const ownerUserId = String(ownerUserIdRaw || '').trim();
|
|
76
|
+
if (!workspaceId || !agentId || !ownerUserId)
|
|
77
|
+
return false;
|
|
78
|
+
const result = this.db.prepare(`
|
|
79
|
+
DELETE FROM taskforce_agent_connection_bindings
|
|
80
|
+
WHERE tenant_id = ? AND workspace_id = ? AND agent_id = ? AND owner_user_id = ?
|
|
81
|
+
`).run(this.tenantId, workspaceId, agentId, ownerUserId);
|
|
82
|
+
return Number(result.changes || 0) > 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -200,7 +200,9 @@ export declare class WorkflowStore {
|
|
|
200
200
|
installAssignmentForSync(workspaceIdRaw: string, snapshot: WorkflowAssignmentSyncRecord, options: {
|
|
201
201
|
authority: 'pending-intent' | 'cloud-execution';
|
|
202
202
|
expectedTaskId: string;
|
|
203
|
+
replaceAuthoritativeHistory?: boolean;
|
|
203
204
|
}): WorkflowExecutionStateRecord;
|
|
205
|
+
private runAssignmentSyncTransaction;
|
|
204
206
|
appendExecutionTransition(input: {
|
|
205
207
|
workspaceId: string;
|
|
206
208
|
executionId: string;
|
|
@@ -759,7 +759,7 @@ export class WorkflowStore {
|
|
|
759
759
|
|| snapshot.execution.updatedAt !== snapshotProjection.updatedAt) {
|
|
760
760
|
throw new WorkflowAssignmentSyncConflictError('Workflow assignment execution does not match its event history.');
|
|
761
761
|
}
|
|
762
|
-
return this.
|
|
762
|
+
return this.runAssignmentSyncTransaction(Boolean(options.authority === 'cloud-execution' && options.replaceAuthoritativeHistory), () => {
|
|
763
763
|
const existingForTask = this.getActiveExecutionForTask(workspaceId, snapshot.execution.taskId);
|
|
764
764
|
if (existingForTask && existingForTask.id !== snapshot.execution.id) {
|
|
765
765
|
throw new WorkflowAssignmentSyncConflictError('Task already has a different active workflow execution.');
|
|
@@ -852,7 +852,14 @@ export class WorkflowStore {
|
|
|
852
852
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
853
853
|
`).run(snapshot.execution.id, this.tenantId, workspaceId, snapshot.execution.taskId, snapshot.template.id, snapshot.version.id, snapshot.execution.status, snapshot.execution.currentStepId || null, snapshot.execution.createdByActorId || null, snapshot.execution.updatedByActorId || null, snapshot.execution.createdAt, snapshot.execution.updatedAt, snapshot.execution.startedAt || null, snapshot.execution.completedAt || null, snapshot.execution.endedAt || null, snapshot.execution.deletedAt || null);
|
|
854
854
|
}
|
|
855
|
-
|
|
855
|
+
let canonicalEvents = this.listExecutionEvents(workspaceId, snapshot.execution.id);
|
|
856
|
+
if (options.authority === 'cloud-execution' && options.replaceAuthoritativeHistory) {
|
|
857
|
+
this.db.prepare(`
|
|
858
|
+
DELETE FROM workflow_execution_events
|
|
859
|
+
WHERE tenant_id = ? AND workspace_id = ? AND workflow_execution_id = ?
|
|
860
|
+
`).run(this.tenantId, workspaceId, snapshot.execution.id);
|
|
861
|
+
canonicalEvents = [];
|
|
862
|
+
}
|
|
856
863
|
const authoritativeHistoryIsExactPrefix = options.authority === 'cloud-execution'
|
|
857
864
|
&& snapshot.events.length < canonicalEvents.length
|
|
858
865
|
&& snapshot.events.every((event, index) => canonicalJson(event) === canonicalJson(canonicalEvents[index]));
|
|
@@ -908,6 +915,36 @@ export class WorkflowStore {
|
|
|
908
915
|
`).run(snapshotProjection.status, snapshotProjection.currentStepId || null, snapshot.execution.updatedByActorId || null, snapshotProjection.updatedAt, snapshotProjection.startedAt || null, snapshotProjection.completedAt || null, snapshotProjection.endedAt || null, snapshot.execution.deletedAt || null, this.tenantId, workspaceId, snapshot.execution.id);
|
|
909
916
|
}
|
|
910
917
|
return this.getExecutionStateSnapshot(workspaceId, snapshot.execution.id);
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
runAssignmentSyncTransaction(replaceAuthoritativeHistory, apply) {
|
|
921
|
+
return this.db.transaction(() => {
|
|
922
|
+
if (!replaceAuthoritativeHistory)
|
|
923
|
+
return apply();
|
|
924
|
+
if (this.db.provider === 'postgres') {
|
|
925
|
+
throw new WorkflowAssignmentSyncConflictError('Authoritative workflow history replacement is local-runtime only.');
|
|
926
|
+
}
|
|
927
|
+
this.db.exec(`
|
|
928
|
+
DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_update;
|
|
929
|
+
DROP TRIGGER IF EXISTS trg_workflow_execution_events_no_delete;
|
|
930
|
+
`);
|
|
931
|
+
try {
|
|
932
|
+
return apply();
|
|
933
|
+
}
|
|
934
|
+
finally {
|
|
935
|
+
this.db.exec(`
|
|
936
|
+
CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_update
|
|
937
|
+
BEFORE UPDATE ON workflow_execution_events
|
|
938
|
+
BEGIN
|
|
939
|
+
SELECT RAISE(ABORT, 'Workflow execution events are append-only');
|
|
940
|
+
END;
|
|
941
|
+
CREATE TRIGGER IF NOT EXISTS trg_workflow_execution_events_no_delete
|
|
942
|
+
BEFORE DELETE ON workflow_execution_events
|
|
943
|
+
BEGIN
|
|
944
|
+
SELECT RAISE(ABORT, 'Workflow execution events are append-only');
|
|
945
|
+
END;
|
|
946
|
+
`);
|
|
947
|
+
}
|
|
911
948
|
})();
|
|
912
949
|
}
|
|
913
950
|
appendExecutionTransition(input) {
|
|
@@ -558,8 +558,10 @@ export async function prepareWorkspacePushChanges(input, dependencies = {}) {
|
|
|
558
558
|
.filter((taskId) => taskUpsertIdSet.has(taskId) && !activeV3TaskCreateIds.has(taskId));
|
|
559
559
|
}
|
|
560
560
|
const ownershipFilteredChanges = input.changes.filter((change) => {
|
|
561
|
-
if (change.op === 'upsert')
|
|
562
|
-
|
|
561
|
+
if (change.op === 'upsert') {
|
|
562
|
+
const taskId = String(change.task?.id || '').trim();
|
|
563
|
+
return !activeV3TaskCreateIds.has(taskId) && !activeV3TaskDeleteIds.has(taskId);
|
|
564
|
+
}
|
|
563
565
|
if (change.op === 'delete') {
|
|
564
566
|
return !activeV3TaskDeleteIds.has(String(change.taskId || '').trim());
|
|
565
567
|
}
|
|
@@ -32,6 +32,11 @@ export function listWorkspaceSyncDocumentReviewCommentsSnapshot(deps, workspaceI
|
|
|
32
32
|
authorActorId: comment.authorActorId,
|
|
33
33
|
updatedByActorId: comment.updatedByActorId,
|
|
34
34
|
deletedByActorId: comment.deletedByActorId,
|
|
35
|
+
parentCommentId: comment.parentCommentId,
|
|
36
|
+
threadStatus: comment.threadStatus,
|
|
37
|
+
threadStatusUpdatedAt: comment.threadStatusUpdatedAt,
|
|
38
|
+
resolvedAt: comment.resolvedAt,
|
|
39
|
+
resolvedByActorId: comment.resolvedByActorId,
|
|
35
40
|
createdAt: comment.createdAt,
|
|
36
41
|
updatedAt: comment.updatedAt,
|
|
37
42
|
deletedAt: comment.deletedAt,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto';
|
|
1
|
+
import { createHash, randomUUID } from 'crypto';
|
|
2
2
|
import { assertSynchronousTransactionResult, } from '../../storage/databaseAdapter.js';
|
|
3
3
|
import { validateWorkspaceSyncEngineTransferCompletionGroup, } from '../engine/workspaceSyncEngineTransferCompletion.js';
|
|
4
4
|
import { canonicalWorkspaceSyncJson } from '../v3/canonicalWorkspaceSyncJson.js';
|
|
@@ -1407,36 +1407,67 @@ export class LocalSyncExecutionPermitStore {
|
|
|
1407
1407
|
const requiredAction = mutationReplay
|
|
1408
1408
|
? 'replay-operation-then-reconcile'
|
|
1409
1409
|
: 'refetch-from-committed-cursor';
|
|
1410
|
-
const
|
|
1410
|
+
const coalescesLegacyApplyFailure = errorCode === 'WORKSPACE_SYNC_V3_APPLY_NOT_COMMITTED'
|
|
1411
1411
|
|| errorCode === 'WORKSPACE_SYNC_V3_ATTACHMENT_HYDRATION_NOT_COMMITTED';
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1412
|
+
const coalescingKey = mutationReplay || coalescesLegacyApplyFailure
|
|
1413
|
+
? createHash('sha256').update(canonicalWorkspaceSyncJson(mutationReplay ? {
|
|
1414
|
+
workspaceId: permit.workspaceId,
|
|
1415
|
+
operationClass: permit.operationClass,
|
|
1416
|
+
operationIdentity: permit.operationIdentity || null,
|
|
1417
|
+
lastCommittedCursor: permit.lastCommittedCursor,
|
|
1418
|
+
requiredAction,
|
|
1419
|
+
} : {
|
|
1420
|
+
workspaceId: permit.workspaceId,
|
|
1421
|
+
operationClass: permit.operationClass,
|
|
1422
|
+
operationIdentity: permit.operationIdentity || null,
|
|
1423
|
+
upstreamDisposition: disposition,
|
|
1424
|
+
lastCommittedCursor: permit.lastCommittedCursor,
|
|
1425
|
+
requiredAction,
|
|
1426
|
+
errorCode,
|
|
1427
|
+
})).digest('hex')
|
|
1428
|
+
: null;
|
|
1429
|
+
// This store method normally runs inside the permit transition
|
|
1430
|
+
// transaction. The nested transaction gives PostgreSQL a savepoint
|
|
1431
|
+
// boundary while the partial unique index arbitrates concurrent
|
|
1432
|
+
// equivalent inserts without poisoning the outer transaction.
|
|
1433
|
+
let inserted = false;
|
|
1434
|
+
try {
|
|
1435
|
+
this.db.transaction(() => {
|
|
1436
|
+
this.db.prepare(`
|
|
1437
|
+
INSERT INTO local_sync_recovery_obligations (
|
|
1438
|
+
obligation_id, permit_id, workspace_id, operation_class,
|
|
1439
|
+
operation_identity, upstream_disposition,
|
|
1440
|
+
last_committed_cursor_json, required_action, coalescing_key,
|
|
1441
|
+
created_at, resolved_at
|
|
1442
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)
|
|
1443
|
+
`).run(this.createId(), permit.permitId, permit.workspaceId, permit.operationClass, permit.operationIdentity, disposition, permit.lastCommittedCursor === null
|
|
1444
|
+
? null
|
|
1445
|
+
: JSON.stringify(permit.lastCommittedCursor), requiredAction, coalescingKey, this.now());
|
|
1446
|
+
inserted = true;
|
|
1447
|
+
})();
|
|
1448
|
+
}
|
|
1449
|
+
catch (error) {
|
|
1450
|
+
const existing = coalescingKey
|
|
1451
|
+
? this.db.prepare(`
|
|
1452
|
+
SELECT obligation_id
|
|
1453
|
+
FROM local_sync_recovery_obligations
|
|
1454
|
+
WHERE coalescing_key = ? AND resolved_at IS NULL
|
|
1455
|
+
`).get(coalescingKey)
|
|
1456
|
+
: undefined;
|
|
1457
|
+
if (!existing?.obligation_id)
|
|
1458
|
+
throw error;
|
|
1430
1459
|
}
|
|
1460
|
+
if (inserted || !coalescingKey)
|
|
1461
|
+
return;
|
|
1431
1462
|
this.db.prepare(`
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
?
|
|
1440
|
-
|
|
1463
|
+
UPDATE local_sync_recovery_obligations
|
|
1464
|
+
SET upstream_disposition = CASE
|
|
1465
|
+
WHEN upstream_disposition = 'accepted' OR ? = 'accepted' THEN 'accepted'
|
|
1466
|
+
WHEN upstream_disposition = 'unknown' OR ? = 'unknown' THEN 'unknown'
|
|
1467
|
+
WHEN upstream_disposition = 'rejected' OR ? = 'rejected' THEN 'rejected'
|
|
1468
|
+
ELSE upstream_disposition
|
|
1469
|
+
END
|
|
1470
|
+
WHERE coalescing_key = ? AND resolved_at IS NULL
|
|
1471
|
+
`).run(disposition, disposition, disposition, coalescingKey);
|
|
1441
1472
|
}
|
|
1442
1473
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LocalWorkspaceSyncPendingV2Push } from './localWorkspaceSyncRunnerState.js';
|
|
2
|
+
export interface LocalWorkspaceSyncPendingV2PushProgress {
|
|
3
|
+
effectiveTotalBatches: number;
|
|
4
|
+
settledBatches: number;
|
|
5
|
+
effectiveTotalChanges: number;
|
|
6
|
+
settledChanges: number;
|
|
7
|
+
remainingChanges: number;
|
|
8
|
+
firstUnsettledBatchIndex: number | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveLocalWorkspaceSyncPendingV2PushProgress(pending: LocalWorkspaceSyncPendingV2Push | null | undefined): LocalWorkspaceSyncPendingV2PushProgress | null;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function resolveLocalWorkspaceSyncPendingV2PushProgress(pending) {
|
|
2
|
+
const plan = pending?.preparedPlan;
|
|
3
|
+
const settledIdentities = pending?.settledBatchOperationIdentities;
|
|
4
|
+
if (pending?.settlementVersion !== 1
|
|
5
|
+
|| !plan
|
|
6
|
+
|| !Array.isArray(settledIdentities)
|
|
7
|
+
|| plan.batches.length !== plan.batchOperationIdentities.length
|
|
8
|
+
|| new Set(plan.batchOperationIdentities).size !== plan.batchOperationIdentities.length
|
|
9
|
+
|| new Set(settledIdentities).size !== settledIdentities.length
|
|
10
|
+
|| settledIdentities.some((identity) => !plan.batchOperationIdentities.includes(identity))) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const settled = new Set(settledIdentities);
|
|
14
|
+
const effectiveTotalChanges = plan.batches.reduce((total, batch) => total + batch.length, 0);
|
|
15
|
+
const settledChanges = plan.batches.reduce((total, batch, index) => (settled.has(plan.batchOperationIdentities[index])
|
|
16
|
+
? total + batch.length
|
|
17
|
+
: total), 0);
|
|
18
|
+
const firstUnsettledBatchIndex = plan.batchOperationIdentities.findIndex((identity) => !settled.has(identity));
|
|
19
|
+
return {
|
|
20
|
+
effectiveTotalBatches: plan.batches.length,
|
|
21
|
+
settledBatches: settled.size,
|
|
22
|
+
effectiveTotalChanges,
|
|
23
|
+
settledChanges,
|
|
24
|
+
remainingChanges: effectiveTotalChanges - settledChanges,
|
|
25
|
+
firstUnsettledBatchIndex: firstUnsettledBatchIndex < 0
|
|
26
|
+
? null
|
|
27
|
+
: firstUnsettledBatchIndex,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LocalSyncCoordinatorCommandRecord } from './localSyncCoordinatorTypes.js';
|
|
2
2
|
import type { LocalSyncCoordinatorStore } from './localSyncCoordinatorStore.js';
|
|
3
|
-
import { type LocalWorkspaceSyncRunnerCheckpoint, type LocalWorkspaceSyncRunnerState, type LocalWorkspaceSyncRunnerStateStore } from './localWorkspaceSyncRunnerState.js';
|
|
3
|
+
import { type LocalWorkspaceSyncRunnerCheckpoint, type LocalWorkspaceSyncRunnerRetryKind, type LocalWorkspaceSyncRunnerState, type LocalWorkspaceSyncRunnerStateStore } from './localWorkspaceSyncRunnerState.js';
|
|
4
4
|
import type { WorkspaceSyncCredentialBroker } from './workspaceSyncCredentialBroker.js';
|
|
5
5
|
export interface LocalWorkspaceSyncRunnerOperationInput {
|
|
6
6
|
command: LocalSyncCoordinatorCommandRecord | null;
|
|
@@ -55,6 +55,7 @@ export declare class LocalWorkspaceSyncRunnerError extends Error {
|
|
|
55
55
|
readonly code: 'SYNC_RUNNER_NOT_STARTED' | 'SYNC_RUNNER_ALREADY_STARTED' | 'SYNC_RUNNER_COORDINATOR_FENCE_INVALID' | 'SYNC_RUNNER_COMMAND_INVALID' | 'SYNC_RUNNER_COMMAND_DISABLED' | 'SYNC_RUNNER_DRAIN_TIMEOUT';
|
|
56
56
|
constructor(message: string, code: 'SYNC_RUNNER_NOT_STARTED' | 'SYNC_RUNNER_ALREADY_STARTED' | 'SYNC_RUNNER_COORDINATOR_FENCE_INVALID' | 'SYNC_RUNNER_COMMAND_INVALID' | 'SYNC_RUNNER_COMMAND_DISABLED' | 'SYNC_RUNNER_DRAIN_TIMEOUT');
|
|
57
57
|
}
|
|
58
|
+
export declare function canCoordinatorRecoveryPreemptRetry(kind: LocalWorkspaceSyncRunnerRetryKind): boolean;
|
|
58
59
|
export declare class LocalWorkspaceSyncRunner {
|
|
59
60
|
private readonly options;
|
|
60
61
|
private context;
|
|
@@ -87,6 +88,7 @@ export declare class LocalWorkspaceSyncRunner {
|
|
|
87
88
|
activate(): void;
|
|
88
89
|
executeCommand(commandId: string): Promise<LocalSyncCoordinatorCommandRecord | null>;
|
|
89
90
|
inspect(): Promise<void>;
|
|
91
|
+
recoverCoordinatorObligationsDue(isRecoveryStillRequired: () => boolean): Promise<void>;
|
|
90
92
|
pullDue(): Promise<void>;
|
|
91
93
|
retryDue(): Promise<void>;
|
|
92
94
|
pushDue(): Promise<void>;
|
|
@@ -21,6 +21,14 @@ const CONTENT_PREREQUISITE_BYPASSED_RETRY_KINDS = new Set([
|
|
|
21
21
|
'pull',
|
|
22
22
|
'repair',
|
|
23
23
|
]);
|
|
24
|
+
const COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS = new Set([
|
|
25
|
+
'pull',
|
|
26
|
+
'push',
|
|
27
|
+
'v3-dispatch',
|
|
28
|
+
]);
|
|
29
|
+
export function canCoordinatorRecoveryPreemptRetry(kind) {
|
|
30
|
+
return COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS.has(kind);
|
|
31
|
+
}
|
|
24
32
|
function cloneCheckpoint(checkpoint) {
|
|
25
33
|
return JSON.parse(canonicalWorkspaceSyncJson(checkpoint));
|
|
26
34
|
}
|
|
@@ -140,6 +148,16 @@ export class LocalWorkspaceSyncRunner {
|
|
|
140
148
|
}
|
|
141
149
|
return this.enqueue(async () => this.runInspection());
|
|
142
150
|
}
|
|
151
|
+
recoverCoordinatorObligationsDue(isRecoveryStillRequired) {
|
|
152
|
+
if (!this.context || this.terminated || !this.acceptingWork) {
|
|
153
|
+
return Promise.resolve();
|
|
154
|
+
}
|
|
155
|
+
return this.enqueue(async () => {
|
|
156
|
+
if (!isRecoveryStillRequired())
|
|
157
|
+
return;
|
|
158
|
+
await this.runInspection(this.options.operations.sync, { bypassRetryKinds: COORDINATOR_RECOVERY_BYPASSED_RETRY_KINDS });
|
|
159
|
+
});
|
|
160
|
+
}
|
|
143
161
|
pullDue() {
|
|
144
162
|
if (!this.context || this.terminated || !this.acceptingWork) {
|
|
145
163
|
return Promise.resolve();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DatabaseAdapter } from '../../storage/databaseAdapter.js';
|
|
2
|
-
import type { WorkspaceSyncDeltaDiagnostics, WorkspaceSyncPayload } from '../workspaceSyncModel.js';
|
|
2
|
+
import type { WorkspaceSyncDeltaDiagnostics, WorkspaceSyncDurableTaskRevision, WorkspaceSyncPayload, WorkspaceSyncTaskSnapshot } from '../workspaceSyncModel.js';
|
|
3
3
|
import { type WorkspacePushPreparedPlan } from '../workspacePushPreparedPlan.js';
|
|
4
4
|
import type { WorkspaceSyncPhase, WorkspaceSyncPushBaselineSnapshot } from '../workspaceSyncState.js';
|
|
5
5
|
import type { LocalSyncCoordinatorCommandStatus } from './localSyncCoordinatorTypes.js';
|
|
@@ -30,6 +30,7 @@ export interface EncodedWorkspaceSyncPayload {
|
|
|
30
30
|
currentInitiativeWatermarks: EncodedStringMap;
|
|
31
31
|
currentWorkstreamIds: string[];
|
|
32
32
|
currentWorkstreamWatermarks: EncodedStringMap;
|
|
33
|
+
currentPlanningIdentityWatermarks?: EncodedStringMap;
|
|
33
34
|
currentAiProfileIds: string[];
|
|
34
35
|
currentAiProfileWatermarks: EncodedStringMap;
|
|
35
36
|
currentAiProfileChangeKeys?: EncodedStringMap;
|
|
@@ -68,8 +69,20 @@ export interface LocalWorkspaceSyncPendingV2Push {
|
|
|
68
69
|
preparedPlan: WorkspacePushPreparedPlan | null;
|
|
69
70
|
preparedPlanFingerprint: string | null;
|
|
70
71
|
acknowledgedNonApplyingBatchOperationIdentities: string[];
|
|
72
|
+
settlementVersion?: 1;
|
|
73
|
+
settledBatchOperationIdentities?: string[];
|
|
74
|
+
settledBatchContributions?: LocalWorkspaceSyncSettledV2PushBatch[];
|
|
71
75
|
lastBatchProgress: LocalWorkspaceSyncPendingV2PushBatchProgress | null;
|
|
72
76
|
}
|
|
77
|
+
export interface LocalWorkspaceSyncSettledV2PushBatch {
|
|
78
|
+
operationIdentity: string;
|
|
79
|
+
settlementIdentityFingerprint: string;
|
|
80
|
+
appliedTaskUpserts: Array<{
|
|
81
|
+
archived: boolean;
|
|
82
|
+
task: WorkspaceSyncTaskSnapshot;
|
|
83
|
+
durableRevision?: WorkspaceSyncDurableTaskRevision;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
73
86
|
export interface LocalWorkspaceSyncPendingV2PushBatchProgress {
|
|
74
87
|
totalBatches: number;
|
|
75
88
|
completedBatches: number;
|
|
@@ -144,6 +157,7 @@ export declare function createLocalWorkspaceSyncPendingV2Push(input: {
|
|
|
144
157
|
repairMode: boolean;
|
|
145
158
|
}): LocalWorkspaceSyncPendingV2Push;
|
|
146
159
|
export declare function fingerprintLocalWorkspaceSyncPreparedPlan(plan: WorkspacePushPreparedPlan): string;
|
|
160
|
+
export declare function upgradeLocalWorkspaceSyncPendingV2PushSettlement(pending: LocalWorkspaceSyncPendingV2Push): LocalWorkspaceSyncPendingV2Push;
|
|
147
161
|
export declare function createDefaultLocalWorkspaceSyncRunnerCheckpoint(): LocalWorkspaceSyncRunnerCheckpoint;
|
|
148
162
|
export declare class LocalWorkspaceSyncRunnerStateStore {
|
|
149
163
|
private readonly db;
|