@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
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
|
|
2
|
+
export const TASKFORCE_CAPACITY_TRACE_HEADER = 'x-taskforce-capacity-trace';
|
|
3
|
+
function finite(value) {
|
|
4
|
+
return Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
5
|
+
}
|
|
6
|
+
function millisecondsFromNanoseconds(value) {
|
|
7
|
+
return finite(value) / 1_000_000;
|
|
8
|
+
}
|
|
9
|
+
function percentile(values, rank) {
|
|
10
|
+
if (values.length === 0)
|
|
11
|
+
return 0;
|
|
12
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
13
|
+
const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil((rank / 100) * sorted.length) - 1));
|
|
14
|
+
return finite(sorted[index]);
|
|
15
|
+
}
|
|
16
|
+
function classifyOutcome(statusCode, aborted) {
|
|
17
|
+
if (aborted)
|
|
18
|
+
return 'timeout_or_abort';
|
|
19
|
+
if (statusCode >= 500)
|
|
20
|
+
return 'server_error';
|
|
21
|
+
if (statusCode === 401 || statusCode === 403 || statusCode === 405 || statusCode === 415 || statusCode === 429) {
|
|
22
|
+
return 'rejected';
|
|
23
|
+
}
|
|
24
|
+
if (statusCode >= 400)
|
|
25
|
+
return 'client_error';
|
|
26
|
+
return 'success';
|
|
27
|
+
}
|
|
28
|
+
function classifyRejection(statusCode) {
|
|
29
|
+
if (statusCode === 429)
|
|
30
|
+
return 'rate_limited';
|
|
31
|
+
if (statusCode === 401 || statusCode === 403)
|
|
32
|
+
return 'auth_or_scope';
|
|
33
|
+
if (statusCode === 405 || statusCode === 415)
|
|
34
|
+
return 'protocol';
|
|
35
|
+
return statusCode >= 400 && statusCode < 500 ? 'other_client' : null;
|
|
36
|
+
}
|
|
37
|
+
function classifyStatus(statusCode) {
|
|
38
|
+
if (statusCode >= 200 && statusCode < 300)
|
|
39
|
+
return '2xx';
|
|
40
|
+
if (statusCode >= 300 && statusCode < 400)
|
|
41
|
+
return '3xx';
|
|
42
|
+
if (statusCode >= 400 && statusCode < 500)
|
|
43
|
+
return '4xx';
|
|
44
|
+
if (statusCode >= 500 && statusCode < 600)
|
|
45
|
+
return '5xx';
|
|
46
|
+
return 'other';
|
|
47
|
+
}
|
|
48
|
+
export class CloudMcpCapacityTelemetry {
|
|
49
|
+
emit;
|
|
50
|
+
eventLoop;
|
|
51
|
+
now;
|
|
52
|
+
cpuUsage;
|
|
53
|
+
memoryUsage;
|
|
54
|
+
windowMs;
|
|
55
|
+
maxSamples;
|
|
56
|
+
activeRequests = 0;
|
|
57
|
+
maxActiveRequests = 0;
|
|
58
|
+
samples = [];
|
|
59
|
+
completedRequests = 0;
|
|
60
|
+
requestClassCounts = {};
|
|
61
|
+
outcomeCounts = {};
|
|
62
|
+
rejectionCounts = {};
|
|
63
|
+
statusClassCounts = {};
|
|
64
|
+
windowStartedAt;
|
|
65
|
+
windowCpuStartedAt;
|
|
66
|
+
flushTimer;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
this.emit = options.emit || ((payload) => console.info(`[Taskforce MCP] ${JSON.stringify(payload)}`));
|
|
69
|
+
this.eventLoop = options.eventLoop || monitorEventLoopDelay({ resolution: 20 });
|
|
70
|
+
this.now = options.now || (() => performance.now());
|
|
71
|
+
this.cpuUsage = options.cpuUsage || process.cpuUsage.bind(process);
|
|
72
|
+
this.memoryUsage = options.memoryUsage || process.memoryUsage.bind(process);
|
|
73
|
+
this.windowMs = Math.max(1_000, options.windowMs || 60_000);
|
|
74
|
+
this.maxSamples = Math.max(10, options.maxSamples || 2_048);
|
|
75
|
+
this.windowStartedAt = this.now();
|
|
76
|
+
this.windowCpuStartedAt = this.cpuUsage();
|
|
77
|
+
this.eventLoop.enable();
|
|
78
|
+
this.flushTimer = setInterval(() => this.flush(), this.windowMs);
|
|
79
|
+
this.flushTimer.unref?.();
|
|
80
|
+
}
|
|
81
|
+
begin(requestClass = 'other') {
|
|
82
|
+
const startedAt = this.now();
|
|
83
|
+
let settled = false;
|
|
84
|
+
let currentClass = requestClass;
|
|
85
|
+
this.activeRequests += 1;
|
|
86
|
+
this.maxActiveRequests = Math.max(this.maxActiveRequests, this.activeRequests);
|
|
87
|
+
return {
|
|
88
|
+
classify: (nextClass) => {
|
|
89
|
+
currentClass = nextClass;
|
|
90
|
+
},
|
|
91
|
+
setTraceHeaders: (res, postgres) => {
|
|
92
|
+
if (res.headersSent)
|
|
93
|
+
return;
|
|
94
|
+
const memory = this.memoryUsage();
|
|
95
|
+
res.setHeader('X-Taskforce-MCP-Active-Requests', String(this.activeRequests));
|
|
96
|
+
res.setHeader('X-Taskforce-MCP-Max-Active-Requests', String(this.maxActiveRequests));
|
|
97
|
+
res.setHeader('X-Taskforce-Event-Loop-P95-Ms', millisecondsFromNanoseconds(this.eventLoop.percentile(95)).toFixed(2));
|
|
98
|
+
res.setHeader('X-Taskforce-Event-Loop-Max-Ms', millisecondsFromNanoseconds(this.eventLoop.max).toFixed(2));
|
|
99
|
+
res.setHeader('X-Taskforce-Process-RSS-Bytes', String(memory.rss));
|
|
100
|
+
res.setHeader('X-Taskforce-Process-Heap-Used-Bytes', String(memory.heapUsed));
|
|
101
|
+
if (postgres) {
|
|
102
|
+
res.setHeader('X-Taskforce-Postgres-Worker-Wait-Ms', postgres.postgresWorkerWaitMs.toFixed(2));
|
|
103
|
+
res.setHeader('X-Taskforce-Postgres-Worker-Wait-Max-Ms', postgres.postgresWorkerWaitMaxMs.toFixed(2));
|
|
104
|
+
res.setHeader('X-Taskforce-Postgres-Pool-Waiting-Max', String(postgres.postgresPoolWaitingMax));
|
|
105
|
+
res.setHeader('X-Taskforce-Postgres-Pool-Total-Max', String(postgres.postgresPoolTotalMax));
|
|
106
|
+
if (postgres.postgresPoolIdleMin !== null) {
|
|
107
|
+
res.setHeader('X-Taskforce-Postgres-Pool-Idle-Min', String(postgres.postgresPoolIdleMin));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
finish: (input) => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
115
|
+
this.activeRequests = Math.max(0, this.activeRequests - 1);
|
|
116
|
+
const outcome = classifyOutcome(input.statusCode, input.aborted === true);
|
|
117
|
+
this.completedRequests += 1;
|
|
118
|
+
this.requestClassCounts[currentClass] = (this.requestClassCounts[currentClass] || 0) + 1;
|
|
119
|
+
this.outcomeCounts[outcome] = (this.outcomeCounts[outcome] || 0) + 1;
|
|
120
|
+
const rejection = classifyRejection(input.statusCode);
|
|
121
|
+
if (rejection)
|
|
122
|
+
this.rejectionCounts[rejection] = (this.rejectionCounts[rejection] || 0) + 1;
|
|
123
|
+
const statusClass = classifyStatus(input.statusCode);
|
|
124
|
+
this.statusClassCounts[statusClass] = (this.statusClassCounts[statusClass] || 0) + 1;
|
|
125
|
+
this.samples.push({
|
|
126
|
+
requestClass: currentClass,
|
|
127
|
+
outcome,
|
|
128
|
+
durationMs: finite(this.now() - startedAt),
|
|
129
|
+
postgres: input.postgres,
|
|
130
|
+
});
|
|
131
|
+
if (this.samples.length > this.maxSamples)
|
|
132
|
+
this.samples.splice(0, this.samples.length - this.maxSamples);
|
|
133
|
+
this.flushIfDue();
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
snapshot() {
|
|
138
|
+
const memory = this.memoryUsage();
|
|
139
|
+
const durations = this.samples.map((sample) => sample.durationMs);
|
|
140
|
+
const workerWaits = this.samples.map((sample) => sample.postgres?.postgresWorkerWaitMs || 0);
|
|
141
|
+
const cpu = this.cpuUsage(this.windowCpuStartedAt);
|
|
142
|
+
return {
|
|
143
|
+
event: 'cloud_mcp_capacity_window',
|
|
144
|
+
windowMs: Math.max(0, Math.round(this.now() - this.windowStartedAt)),
|
|
145
|
+
requests: this.completedRequests,
|
|
146
|
+
activeRequests: this.activeRequests,
|
|
147
|
+
maxActiveRequests: this.maxActiveRequests,
|
|
148
|
+
requestClasses: { ...this.requestClassCounts },
|
|
149
|
+
outcomes: { ...this.outcomeCounts },
|
|
150
|
+
rejections: { ...this.rejectionCounts },
|
|
151
|
+
statusClasses: { ...this.statusClassCounts },
|
|
152
|
+
durationMs: { p50: percentile(durations, 50), p95: percentile(durations, 95), p99: percentile(durations, 99) },
|
|
153
|
+
eventLoopDelayMs: {
|
|
154
|
+
p50: millisecondsFromNanoseconds(this.eventLoop.percentile(50)),
|
|
155
|
+
p95: millisecondsFromNanoseconds(this.eventLoop.percentile(95)),
|
|
156
|
+
p99: millisecondsFromNanoseconds(this.eventLoop.percentile(99)),
|
|
157
|
+
max: millisecondsFromNanoseconds(this.eventLoop.max),
|
|
158
|
+
},
|
|
159
|
+
process: {
|
|
160
|
+
cpuUserMs: finite(cpu.user / 1_000),
|
|
161
|
+
cpuSystemMs: finite(cpu.system / 1_000),
|
|
162
|
+
rssBytes: memory.rss,
|
|
163
|
+
heapUsedBytes: memory.heapUsed,
|
|
164
|
+
heapTotalBytes: memory.heapTotal,
|
|
165
|
+
externalBytes: memory.external,
|
|
166
|
+
},
|
|
167
|
+
postgres: {
|
|
168
|
+
workerWaitMsP95: percentile(workerWaits, 95),
|
|
169
|
+
maxPoolWaiting: Math.max(0, ...this.samples.map((sample) => sample.postgres?.postgresPoolWaitingMax || 0)),
|
|
170
|
+
maxPoolTotal: Math.max(0, ...this.samples.map((sample) => sample.postgres?.postgresPoolTotalMax || 0)),
|
|
171
|
+
minPoolIdle: this.minimumPoolIdle(),
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
flush() {
|
|
176
|
+
if (this.completedRequests === 0 && this.activeRequests === 0)
|
|
177
|
+
return null;
|
|
178
|
+
const payload = this.snapshot();
|
|
179
|
+
this.emit(payload);
|
|
180
|
+
this.samples = [];
|
|
181
|
+
this.completedRequests = 0;
|
|
182
|
+
this.requestClassCounts = {};
|
|
183
|
+
this.outcomeCounts = {};
|
|
184
|
+
this.rejectionCounts = {};
|
|
185
|
+
this.statusClassCounts = {};
|
|
186
|
+
this.maxActiveRequests = this.activeRequests;
|
|
187
|
+
this.windowStartedAt = this.now();
|
|
188
|
+
this.windowCpuStartedAt = this.cpuUsage();
|
|
189
|
+
this.eventLoop.reset();
|
|
190
|
+
return payload;
|
|
191
|
+
}
|
|
192
|
+
shutdown() {
|
|
193
|
+
clearInterval(this.flushTimer);
|
|
194
|
+
this.eventLoop.disable?.();
|
|
195
|
+
}
|
|
196
|
+
flushIfDue() {
|
|
197
|
+
if (this.now() - this.windowStartedAt >= this.windowMs)
|
|
198
|
+
this.flush();
|
|
199
|
+
}
|
|
200
|
+
minimumPoolIdle() {
|
|
201
|
+
const values = this.samples
|
|
202
|
+
.map((sample) => sample.postgres?.postgresPoolIdleMin)
|
|
203
|
+
.filter((value) => typeof value === 'number');
|
|
204
|
+
return values.length > 0 ? Math.min(...values) : null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
let defaultTelemetry = null;
|
|
208
|
+
export function isCloudMcpCapacityTelemetryEnabled() {
|
|
209
|
+
return process.env.TASKFORCE_CLOUD_MCP_CAPACITY_TELEMETRY !== '0';
|
|
210
|
+
}
|
|
211
|
+
export function beginCloudMcpCapacityRequest(requestClass = 'other') {
|
|
212
|
+
if (!isCloudMcpCapacityTelemetryEnabled()) {
|
|
213
|
+
return {
|
|
214
|
+
classify: (_nextClass) => undefined,
|
|
215
|
+
setTraceHeaders: (_res, _postgres) => undefined,
|
|
216
|
+
finish: (_input) => undefined,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
defaultTelemetry ||= new CloudMcpCapacityTelemetry();
|
|
220
|
+
return defaultTelemetry.begin(requestClass);
|
|
221
|
+
}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { WebSocketServer } from 'ws';
|
|
|
9
9
|
export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
|
|
10
10
|
import type { LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
|
|
11
11
|
import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
|
|
12
|
+
import { type TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
|
|
12
13
|
import type { LocalSyncCoordinatorHost } from '../sync/coordinator/localSyncCoordinatorHost.js';
|
|
13
14
|
import type { LocalSyncProcessLock } from '../sync/coordinator/localSyncProcessLock.js';
|
|
14
15
|
import type { LocalDataOwnerPermit } from './localDataOwnerPermit.js';
|
|
@@ -60,6 +61,8 @@ export declare function writeJsonErrorIfPossible(res: http.ServerResponse, statu
|
|
|
60
61
|
export declare function applyCloudProxyForwardedHeaders(headers: Headers, req: http.IncomingMessage): void;
|
|
61
62
|
export declare function rewriteProxySetCookieForLocalHost(cookie: string): string;
|
|
62
63
|
export declare function shouldRewriteProxySetCookieDomain(cookie: string, hostHeader: string | undefined): boolean;
|
|
64
|
+
export declare function applyAdminProxyRequestSession(headers: Headers, environment: TaskforceCloudEnvironment, env?: NodeJS.ProcessEnv): void;
|
|
65
|
+
export declare function rewriteAdminProxyResponseCookies(setCookies: string[], environment: TaskforceCloudEnvironment, requestHost: string | undefined, env?: NodeJS.ProcessEnv): string[];
|
|
63
66
|
export declare function shouldForwardCloudProxyResponseHeader(name: string): boolean;
|
|
64
67
|
export declare function shouldApplyAuthRateLimitForPath(pathname: string): boolean;
|
|
65
68
|
export declare function resolveCloudProxyBaseUrl(env?: NodeJS.ProcessEnv): string;
|
package/dist/server/index.js
CHANGED
|
@@ -31,14 +31,17 @@ import { TaskAssetStore } from '../storage/taskAssetStore.js';
|
|
|
31
31
|
import { validateEnvironment } from '../config/envSchema.js';
|
|
32
32
|
import { createRealtimeSyncWsManager } from './realtimeSyncWs.js';
|
|
33
33
|
import { resolveDeploymentConfig } from '../config/deployment.js';
|
|
34
|
-
import { TASKFORCE_CLOUD_ENVIRONMENTS, parseTaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
|
|
35
|
-
import {
|
|
34
|
+
import { TASKFORCE_CLOUD_ENVIRONMENTS, parseTaskforceCloudEnvironment, } from '../config/cloudEnvironment.js';
|
|
35
|
+
import { resolveAllAdminProxyUpstreamSessionCookieNames, resolveAdminProxyUpstreamSessionCookieName, rewriteAdminProxyRequestCookieHeader, rewriteAdminProxyResponseSetCookie, } from '../shared/adminProxySessionCookies.js';
|
|
36
|
+
import { areWorkflowRuntimeMutationsFenced, resolveWorkflowRuntimeMutationCapability, } from '../sync/v3/durableWorkflowRuntimeMutationRouter.js';
|
|
36
37
|
import { createWorkspaceSyncCloudCredentialValidator } from '../sync/coordinator/workspaceSyncCloudCredentialValidator.js';
|
|
37
38
|
import { bootstrapVerifiedWorkspaceSyncAccess } from '../sync/coordinator/workspaceSyncLocalAccessBootstrap.js';
|
|
38
39
|
import { rewriteSetCookieForLocalHost } from '../utils/httpSetCookie.js';
|
|
39
40
|
import { createWorkspaceSyncServerComposition, shutdownWorkspaceSyncServerComposition, } from './localWorkspaceSyncServerComposition.js';
|
|
40
41
|
import { LocalServiceSessionManager } from './localServiceSessions.js';
|
|
41
42
|
import { LocalSyncIdentityStore } from '../sync/v3/localSyncIdentityStore.js';
|
|
43
|
+
import { pruneExpiredWorkspaceSyncRepairSnapshots, resolveWorkspaceSyncRepairSnapshotRetentionPolicy, } from '../sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js';
|
|
44
|
+
import { pruneRetainedWorkspaceSyncOperations, WORKSPACE_SYNC_OPERATION_RETENTION_INTERVAL_MS, } from '../sync/v3/workspaceSyncOperationRetentionService.js';
|
|
42
45
|
import { shouldBroadcastLocalFileInvalidation } from './localRealtimeFileInvalidation.js';
|
|
43
46
|
import { resolveCloudCollectionReadOperation, } from './cloudCollectionRead.js';
|
|
44
47
|
import { CloudCollectionReadPool, resolveCloudCollectionReadPoolSize, shouldUseCloudCollectionReadPool, } from './cloudCollectionReadPool.js';
|
|
@@ -261,7 +264,11 @@ export function shouldProxyCloudPath(pathname) {
|
|
|
261
264
|
|| pathname.startsWith('/api/taskforce/admin/')
|
|
262
265
|
|| pathname.startsWith('/api/taskforce/billing/')
|
|
263
266
|
|| pathname.startsWith('/api/taskforce/auth/')
|
|
267
|
+
|| pathname === '/api/taskforce/model-connections'
|
|
268
|
+
|| pathname.startsWith('/api/taskforce/model-connections/')
|
|
269
|
+
|| pathname === '/api/taskforce/agents/model-catalog'
|
|
264
270
|
|| pathname === '/api/taskforce/agents/model-gateway/test'
|
|
271
|
+
|| /^\/api\/taskforce\/agents\/[^/]+\/connection-binding$/i.test(pathname)
|
|
265
272
|
|| isCloudOwnedUserAvatarContextPath(pathname)
|
|
266
273
|
|| isTaskforceAgentAvatarGenerationPath(pathname)
|
|
267
274
|
|| pathname.startsWith('/api/taskforce/settings/mcp/')
|
|
@@ -282,6 +289,8 @@ export function shouldProxyCloudRequest(url, env = process.env) {
|
|
|
282
289
|
if (isWorkspaceAiProfileAvatarContextPath(url.pathname))
|
|
283
290
|
return true;
|
|
284
291
|
if (/^\/api\/taskforce\/workflow-executions\/[^/]+\/complete-step$/.test(url.pathname)) {
|
|
292
|
+
if (areWorkflowRuntimeMutationsFenced(env))
|
|
293
|
+
return false;
|
|
285
294
|
return !resolveWorkflowRuntimeMutationCapability({
|
|
286
295
|
runtimeMode: 'local',
|
|
287
296
|
surface: 'http',
|
|
@@ -410,6 +419,26 @@ export function shouldRewriteProxySetCookieDomain(cookie, hostHeader) {
|
|
|
410
419
|
return false;
|
|
411
420
|
return !requestHost.endsWith(`.${cookieDomain}`);
|
|
412
421
|
}
|
|
422
|
+
export function applyAdminProxyRequestSession(headers, environment, env = process.env) {
|
|
423
|
+
const upstreamSessionCookieName = resolveAdminProxyUpstreamSessionCookieName(environment, env);
|
|
424
|
+
const rewrittenCookie = rewriteAdminProxyRequestCookieHeader(headers.get('cookie'), environment, upstreamSessionCookieName, resolveAllAdminProxyUpstreamSessionCookieNames(env));
|
|
425
|
+
if (rewrittenCookie)
|
|
426
|
+
headers.set('cookie', rewrittenCookie);
|
|
427
|
+
else
|
|
428
|
+
headers.delete('cookie');
|
|
429
|
+
}
|
|
430
|
+
export function rewriteAdminProxyResponseCookies(setCookies, environment, requestHost, env = process.env) {
|
|
431
|
+
const upstreamSessionCookieName = resolveAdminProxyUpstreamSessionCookieName(environment, env);
|
|
432
|
+
return setCookies.map((cookie) => {
|
|
433
|
+
const environmentScopedCookie = rewriteAdminProxyResponseSetCookie(cookie, environment, upstreamSessionCookieName);
|
|
434
|
+
if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
|
|
435
|
+
return rewriteProxySetCookieForLocalHost(environmentScopedCookie);
|
|
436
|
+
}
|
|
437
|
+
return shouldRewriteProxySetCookieDomain(environmentScopedCookie, requestHost)
|
|
438
|
+
? rewriteProxySetCookieForLocalHost(environmentScopedCookie)
|
|
439
|
+
: environmentScopedCookie;
|
|
440
|
+
});
|
|
441
|
+
}
|
|
413
442
|
export function shouldForwardCloudProxyResponseHeader(name) {
|
|
414
443
|
const normalizedName = String(name || '').trim().toLowerCase();
|
|
415
444
|
if (!normalizedName)
|
|
@@ -612,7 +641,7 @@ export function createStandaloneServer(options) {
|
|
|
612
641
|
}
|
|
613
642
|
let localServiceServer = null;
|
|
614
643
|
const localServiceSessions = options.localService
|
|
615
|
-
? new LocalServiceSessionManager(options.localService.generation)
|
|
644
|
+
? new LocalServiceSessionManager(options.localService.generation, core.getDatabaseAdapter(), core.getTenantId(), options.localService.runtimeContract)
|
|
616
645
|
: null;
|
|
617
646
|
const routes = createRoutes(core, {
|
|
618
647
|
authConfig,
|
|
@@ -835,6 +864,9 @@ export function createStandaloneServer(options) {
|
|
|
835
864
|
const adminAuditRetentionEnabled = runtimeMode === 'cloud'
|
|
836
865
|
&& process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_ENABLED !== 'false';
|
|
837
866
|
const adminAuditRetentionIntervalMinutes = readPositiveInteger(process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_INTERVAL_MINUTES, 15);
|
|
867
|
+
const repairSnapshotRetentionEnabled = runtimeMode === 'cloud'
|
|
868
|
+
&& process.env.TASKFORCE_SYNC_REPAIR_SNAPSHOT_RETENTION_ENABLED !== 'false';
|
|
869
|
+
const repairSnapshotRetentionIntervalMinutes = readPositiveInteger(process.env.TASKFORCE_SYNC_REPAIR_SNAPSHOT_RETENTION_INTERVAL_MINUTES, 1);
|
|
838
870
|
const server = http.createServer(async (req, res) => {
|
|
839
871
|
const requestStartedAt = getRequestTimingNow();
|
|
840
872
|
if (!distUiPath) {
|
|
@@ -887,6 +919,7 @@ export function createStandaloneServer(options) {
|
|
|
887
919
|
}
|
|
888
920
|
try {
|
|
889
921
|
const method = String(req.method || 'GET').toUpperCase();
|
|
922
|
+
const adminProxyEnvironment = parseTaskforceCloudEnvironment(req.headers[TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER]);
|
|
890
923
|
const upstreamBaseUrl = resolveCloudProxyUpstreamBaseUrl(req, cloudProxyBaseUrl);
|
|
891
924
|
const upstreamUrl = `${upstreamBaseUrl}${url.pathname}${url.search || ''}`;
|
|
892
925
|
const headers = new Headers();
|
|
@@ -904,6 +937,9 @@ export function createStandaloneServer(options) {
|
|
|
904
937
|
continue;
|
|
905
938
|
headers.set(key, serialized);
|
|
906
939
|
}
|
|
940
|
+
if (adminProxyEnvironment) {
|
|
941
|
+
applyAdminProxyRequestSession(headers, adminProxyEnvironment);
|
|
942
|
+
}
|
|
907
943
|
applyCloudProxyForwardedHeaders(headers, req);
|
|
908
944
|
if (cloudProxyClientId && cloudProxyClientSecret) {
|
|
909
945
|
headers.set('CF-Access-Client-Id', cloudProxyClientId);
|
|
@@ -925,17 +961,22 @@ export function createStandaloneServer(options) {
|
|
|
925
961
|
continue;
|
|
926
962
|
outgoingHeaders[key] = value;
|
|
927
963
|
}
|
|
964
|
+
if (adminProxyEnvironment) {
|
|
965
|
+
outgoingHeaders['cache-control'] = 'no-store';
|
|
966
|
+
}
|
|
928
967
|
const setCookies = upstream.headers.getSetCookie?.();
|
|
929
968
|
if (Array.isArray(setCookies) && setCookies.length > 0) {
|
|
930
969
|
const requestHost = String(req.headers.host || '').trim();
|
|
931
|
-
const normalizedSetCookies =
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
970
|
+
const normalizedSetCookies = adminProxyEnvironment
|
|
971
|
+
? rewriteAdminProxyResponseCookies(setCookies, adminProxyEnvironment, requestHost)
|
|
972
|
+
: setCookies.map((cookie) => {
|
|
973
|
+
if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
|
|
974
|
+
return rewriteProxySetCookieForLocalHost(cookie);
|
|
975
|
+
}
|
|
976
|
+
return shouldRewriteProxySetCookieDomain(cookie, requestHost)
|
|
977
|
+
? rewriteProxySetCookieForLocalHost(cookie)
|
|
978
|
+
: cookie;
|
|
979
|
+
});
|
|
939
980
|
res.setHeader('Set-Cookie', normalizedSetCookies);
|
|
940
981
|
}
|
|
941
982
|
res.writeHead(upstream.status, outgoingHeaders);
|
|
@@ -1180,6 +1221,8 @@ export function createStandaloneServer(options) {
|
|
|
1180
1221
|
let purgeTimer = null;
|
|
1181
1222
|
let integrityScheduleTimer = null;
|
|
1182
1223
|
let adminAuditRetentionTimer = null;
|
|
1224
|
+
let repairSnapshotRetentionTimer = null;
|
|
1225
|
+
let operationRetentionTimer = null;
|
|
1183
1226
|
let watcher = null;
|
|
1184
1227
|
let shutdownPromise = null;
|
|
1185
1228
|
Object.defineProperty(server, 'localSyncCoordinatorHost', {
|
|
@@ -1204,6 +1247,14 @@ export function createStandaloneServer(options) {
|
|
|
1204
1247
|
clearInterval(adminAuditRetentionTimer);
|
|
1205
1248
|
adminAuditRetentionTimer = null;
|
|
1206
1249
|
}
|
|
1250
|
+
if (repairSnapshotRetentionTimer) {
|
|
1251
|
+
clearInterval(repairSnapshotRetentionTimer);
|
|
1252
|
+
repairSnapshotRetentionTimer = null;
|
|
1253
|
+
}
|
|
1254
|
+
if (operationRetentionTimer) {
|
|
1255
|
+
clearInterval(operationRetentionTimer);
|
|
1256
|
+
operationRetentionTimer = null;
|
|
1257
|
+
}
|
|
1207
1258
|
if (localSyncPermitRecoveryTimer) {
|
|
1208
1259
|
clearInterval(localSyncPermitRecoveryTimer);
|
|
1209
1260
|
localSyncPermitRecoveryTimer = null;
|
|
@@ -1257,6 +1308,52 @@ export function createStandaloneServer(options) {
|
|
|
1257
1308
|
adminAuditRetentionTimer = setInterval(runAdminAuditRetention, adminAuditRetentionIntervalMinutes * 60_000);
|
|
1258
1309
|
adminAuditRetentionTimer.unref?.();
|
|
1259
1310
|
}
|
|
1311
|
+
const runRepairSnapshotRetention = () => {
|
|
1312
|
+
try {
|
|
1313
|
+
const result = pruneExpiredWorkspaceSyncRepairSnapshots({
|
|
1314
|
+
db: core.getDatabaseAdapter(),
|
|
1315
|
+
tenantId: core.getTenantId(),
|
|
1316
|
+
policy: resolveWorkspaceSyncRepairSnapshotRetentionPolicy(),
|
|
1317
|
+
});
|
|
1318
|
+
if (result.deletedEntries > 0
|
|
1319
|
+
|| result.deletedSnapshots > 0
|
|
1320
|
+
|| result.remainingExpiredSnapshots > 0) {
|
|
1321
|
+
console.log('[Taskforce] Sync repair snapshot retention: '
|
|
1322
|
+
+ `deletedEntries=${result.deletedEntries} `
|
|
1323
|
+
+ `deletedSnapshots=${result.deletedSnapshots} `
|
|
1324
|
+
+ `remainingExpiredSnapshots=${result.remainingExpiredSnapshots}`);
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
catch (error) {
|
|
1328
|
+
console.warn(`[Taskforce] Sync repair snapshot retention failed: ${String(error?.message || error)}`);
|
|
1329
|
+
}
|
|
1330
|
+
};
|
|
1331
|
+
if (repairSnapshotRetentionEnabled) {
|
|
1332
|
+
runRepairSnapshotRetention();
|
|
1333
|
+
repairSnapshotRetentionTimer = setInterval(runRepairSnapshotRetention, repairSnapshotRetentionIntervalMinutes * 60_000);
|
|
1334
|
+
repairSnapshotRetentionTimer.unref?.();
|
|
1335
|
+
}
|
|
1336
|
+
const runOperationRetention = () => {
|
|
1337
|
+
try {
|
|
1338
|
+
const result = pruneRetainedWorkspaceSyncOperations({
|
|
1339
|
+
db: core.getDatabaseAdapter(),
|
|
1340
|
+
tenantId: core.getTenantId(),
|
|
1341
|
+
});
|
|
1342
|
+
if (result.deletedOutbox > 0 || result.deletedResults > 0 || result.remainingEligible > 0) {
|
|
1343
|
+
console.log('[Taskforce] Sync operation retention: '
|
|
1344
|
+
+ `deletedOutbox=${result.deletedOutbox} `
|
|
1345
|
+
+ `deletedResults=${result.deletedResults} `
|
|
1346
|
+
+ `remainingEligible=${result.remainingEligible} `
|
|
1347
|
+
+ `workspacesProcessed=${result.workspacesProcessed}`);
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
catch (error) {
|
|
1351
|
+
console.warn(`[Taskforce] Sync operation retention failed: ${String(error?.message || error)}`);
|
|
1352
|
+
}
|
|
1353
|
+
};
|
|
1354
|
+
runOperationRetention();
|
|
1355
|
+
operationRetentionTimer = setInterval(runOperationRetention, WORKSPACE_SYNC_OPERATION_RETENTION_INTERVAL_MS);
|
|
1356
|
+
operationRetentionTimer.unref?.();
|
|
1260
1357
|
const appendDocumentPurgeHistory = (summary) => {
|
|
1261
1358
|
const settings = core.getGlobalSettings();
|
|
1262
1359
|
const existing = Array.isArray(settings?.documentPurgeHistory)
|
|
@@ -3,6 +3,9 @@ import * as fs from 'fs';
|
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
const SAFE_POSIX_SOCKET_PATH_BYTES = 100;
|
|
6
|
+
function defaultTemporaryDirectory(platform) {
|
|
7
|
+
return platform === 'darwin' ? '/tmp' : os.tmpdir();
|
|
8
|
+
}
|
|
6
9
|
function canonicalizePath(value) {
|
|
7
10
|
const resolved = path.resolve(value);
|
|
8
11
|
const missingSegments = [];
|
|
@@ -39,7 +42,7 @@ export function resolveLocalSyncProcessLockIdentity(input) {
|
|
|
39
42
|
};
|
|
40
43
|
}
|
|
41
44
|
const socketName = `taskforce-sync-${shortKey}.sock`;
|
|
42
|
-
const requestedEndpoint = path.join(input.tempDirectory ||
|
|
45
|
+
const requestedEndpoint = path.join(input.tempDirectory || defaultTemporaryDirectory(platform), socketName);
|
|
43
46
|
const endpoint = Buffer.byteLength(requestedEndpoint) <= SAFE_POSIX_SOCKET_PATH_BYTES
|
|
44
47
|
? requestedEndpoint
|
|
45
48
|
: path.join('/tmp', socketName);
|
|
@@ -21,7 +21,8 @@ function defaultRuntimeDirectory(platform) {
|
|
|
21
21
|
const userKey = typeof process.getuid === 'function'
|
|
22
22
|
? String(process.getuid())
|
|
23
23
|
: createHash('sha256').update(os.userInfo().username).digest('hex').slice(0, 16);
|
|
24
|
-
|
|
24
|
+
const temporaryDirectory = platform === 'darwin' ? '/tmp' : os.tmpdir();
|
|
25
|
+
return path.join(temporaryDirectory, `taskforce-${userKey}`, 'local-services');
|
|
25
26
|
}
|
|
26
27
|
export function resolveLocalServiceLeaseIdentity(input) {
|
|
27
28
|
const ownershipKey = resolveLocalSyncProcessLockIdentity(input).ownershipKey;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { McpAccessTokenScope } from '../core/Taskforce.js';
|
|
2
|
+
import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
|
|
2
3
|
import type { McpClientId } from '../mcp/clientRegistry.js';
|
|
3
4
|
import type { McpToolProfile } from '../mcp/toolRegistry.js';
|
|
5
|
+
import type { DatabaseAdapter } from '../storage/databaseAdapter.js';
|
|
4
6
|
export declare const LOCAL_SERVICE_SESSION_IDLE_TTL_MS: number;
|
|
5
7
|
export declare const LOCAL_SERVICE_SESSION_CAP = 256;
|
|
6
|
-
export declare const LOCAL_SERVICE_OPERATION_BINDING_CAP = 4096;
|
|
7
8
|
export declare const LOCAL_SERVICE_CANCELLATION_BINDING_CAP = 1024;
|
|
8
9
|
export declare const LOCAL_SERVICE_CANCELLATION_TOMBSTONE_TTL_MS = 60000;
|
|
9
10
|
export interface LocalServiceSessionRegistration {
|
|
@@ -17,34 +18,35 @@ export interface LocalServiceSessionRegistration {
|
|
|
17
18
|
}
|
|
18
19
|
export interface LocalServiceSession extends LocalServiceSessionRegistration {
|
|
19
20
|
id: string;
|
|
21
|
+
runtimeContract: LocalServiceRuntimeContract;
|
|
20
22
|
createdAt: string;
|
|
21
23
|
lastUsedAt: string;
|
|
24
|
+
expiresAt: string;
|
|
25
|
+
revokedAt: string | null;
|
|
22
26
|
aiProfileId: string | null;
|
|
23
27
|
}
|
|
24
28
|
export type LocalServiceLifecycleState = 'accepting' | 'draining' | 'forcing';
|
|
25
|
-
export interface LocalServiceOperationBinding {
|
|
26
|
-
sessionId: string;
|
|
27
|
-
operationId: string;
|
|
28
|
-
mutationKind: string;
|
|
29
|
-
payloadFingerprint: string;
|
|
30
|
-
recordedAt: string;
|
|
31
|
-
}
|
|
32
29
|
export declare class LocalServiceSessionError extends Error {
|
|
33
30
|
readonly statusCode: number;
|
|
34
31
|
readonly code: string;
|
|
35
32
|
constructor(message: string, statusCode: number, code: string);
|
|
36
33
|
}
|
|
34
|
+
export declare function ensureLocalServiceCredentialSchema(db: DatabaseAdapter): void;
|
|
37
35
|
export declare class LocalServiceSessionManager {
|
|
38
36
|
readonly generation: string;
|
|
37
|
+
private readonly db;
|
|
38
|
+
private readonly tenantId;
|
|
39
|
+
readonly runtimeContract: LocalServiceRuntimeContract;
|
|
39
40
|
private readonly options;
|
|
40
|
-
private readonly sessions;
|
|
41
41
|
private readonly inFlightBySession;
|
|
42
|
-
private readonly operationBindings;
|
|
43
42
|
private readonly cancellationBindings;
|
|
44
43
|
private readonly cancellationTombstones;
|
|
45
44
|
private readonly drainWaiters;
|
|
46
45
|
private lifecycleState;
|
|
47
|
-
|
|
46
|
+
private readonly runtimeContractJson;
|
|
47
|
+
private readonly authenticateStatement;
|
|
48
|
+
private readonly touchStatement;
|
|
49
|
+
constructor(generation: string, db: DatabaseAdapter, tenantId: string, runtimeContract: LocalServiceRuntimeContract, options?: {
|
|
48
50
|
nowMs?: () => number;
|
|
49
51
|
randomId?: () => string;
|
|
50
52
|
randomSecret?: () => string;
|
|
@@ -63,6 +65,7 @@ export declare class LocalServiceSessionManager {
|
|
|
63
65
|
touch?: boolean;
|
|
64
66
|
}): LocalServiceSession | null;
|
|
65
67
|
revoke(id: string): boolean;
|
|
68
|
+
private hasActiveCredential;
|
|
66
69
|
beginRequest(id: string): void;
|
|
67
70
|
endRequest(id: string): void;
|
|
68
71
|
inFlightCount(): number;
|
|
@@ -73,12 +76,6 @@ export declare class LocalServiceSessionManager {
|
|
|
73
76
|
revokeAll(): void;
|
|
74
77
|
registerCancellation(sessionId: string, correlationId: string, cancel: () => void): () => void;
|
|
75
78
|
cancelRequest(sessionId: string, correlationId: string): boolean;
|
|
76
|
-
recordOperation(input: Omit<LocalServiceOperationBinding, 'recordedAt'>): LocalServiceOperationBinding;
|
|
77
|
-
getOperationBinding(sessionId: string, operationId: string, expected?: {
|
|
78
|
-
mutationKind?: string | null;
|
|
79
|
-
payloadFingerprint?: string | null;
|
|
80
|
-
}): LocalServiceOperationBinding | null;
|
|
81
|
-
private removeOperationBindings;
|
|
82
79
|
private removeCancellationBindings;
|
|
83
80
|
private pruneCancellationTombstones;
|
|
84
81
|
bindAiProfile(id: string, profileId: string): LocalServiceSession;
|