@taskforcehq/taskforce 0.3.328 → 0.3.330
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Taskforce.module.css +523 -79
- package/dist/TaskforceCore.js +237 -230
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
- package/dist/cli.js +34 -0
- package/dist/cliCloudTargetGuard.d.ts +5 -0
- package/dist/cliCloudTargetGuard.js +11 -0
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
- package/dist/components/features/TaskSettings.d.ts +12 -1
- package/dist/components/features/TaskSettings.js +217 -54
- package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
- package/dist/components/features/TaskforceAgentsModule.js +586 -116
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
- package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
- package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
- package/dist/components/features/planning/PlanningModule.js +2 -5
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
- package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
- package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
- package/dist/components/features/planning/planningTaskArrangement.js +5 -5
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +5 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskCard.d.ts +5 -0
- package/dist/components/task/TaskCard.js +65 -10
- package/dist/components/task/TaskImageReviews.js +14 -5
- package/dist/components/task/TaskKanban.d.ts +6 -1
- package/dist/components/task/TaskKanban.js +152 -6
- package/dist/components/task/TaskList.d.ts +5 -0
- package/dist/components/task/TaskList.js +3 -3
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/ui/PasswordInput.d.ts +6 -0
- package/dist/components/ui/PasswordInput.js +11 -0
- package/dist/components/ui/TopNoticeLayer.js +1 -1
- package/dist/components/views/AppShellHeader.js +32 -11
- package/dist/components/views/PlanComparisonPage.js +12 -0
- package/dist/components/views/StandaloneLayout.js +32 -55
- package/dist/components/views/WidgetView.js +3 -3
- package/dist/components/views/panels/PlanningDrawer.js +5 -12
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
- package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
- package/dist/config/envSchema.js +60 -1
- package/dist/config/localServiceRuntimeContract.d.ts +13 -0
- package/dist/config/localServiceRuntimeContract.js +135 -0
- package/dist/core/AiProfileService.js +46 -8
- package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
- package/dist/core/DeletedTaskLifecycleService.js +37 -6
- package/dist/core/McpTokenService.d.ts +23 -1
- package/dist/core/McpTokenService.js +93 -10
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
- package/dist/core/TaskChecklistCommandService.d.ts +27 -0
- package/dist/core/TaskChecklistCommandService.js +83 -5
- package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
- package/dist/core/TaskLifecycleCommandService.js +6 -2
- package/dist/core/Taskforce.d.ts +94 -2
- package/dist/core/Taskforce.js +760 -36
- package/dist/core/types.d.ts +14 -0
- package/dist/documentReviews/commandService.d.ts +2 -1
- package/dist/documentReviews/commandService.js +6 -3
- package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.js +2 -0
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
- package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
- package/dist/hooks/sync/useSyncStatusControls.js +47 -11
- package/dist/hooks/tasks/taskHttpMutation.js +1 -0
- package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
- package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
- package/dist/hooks/tasks/useTaskFormActions.js +65 -12
- package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
- package/dist/hooks/ui/useSettingsModel.js +13 -2
- package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
- package/dist/hooks/ui/useSettingsPersistence.js +74 -47
- package/dist/hooks/useFilterSort.d.ts +7 -3
- package/dist/hooks/useFilterSort.js +15 -5
- package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +40 -1
- package/dist/hooks/useTaskData.js +240 -9
- package/dist/hooks/useTaskMutations.d.ts +12 -2
- package/dist/hooks/useTaskMutations.js +266 -52
- package/dist/hooks/useTaskforce.d.ts +39 -9
- package/dist/hooks/useTaskforce.js +359 -40
- package/dist/hooks/useUiNotice.d.ts +4 -0
- package/dist/hooks/useUiNotice.js +4 -0
- package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +53 -41
- package/dist/mcp/documentHelpers.d.ts +1 -0
- package/dist/mcp/documentHelpers.js +7 -3
- package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
- package/dist/mcp/durableTaskMutationRouter.js +10 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
- package/dist/mcp/httpProtocolRouting.d.ts +10 -0
- package/dist/mcp/httpProtocolRouting.js +19 -0
- package/dist/mcp/localCliHealth.d.ts +2 -2
- package/dist/mcp/localCliHealth.js +2 -2
- package/dist/mcp/localServiceProxy.d.ts +1 -0
- package/dist/mcp/localServiceProxy.js +530 -68
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
- package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
- package/dist/mcp/runtime.d.ts +54 -79
- package/dist/mcp/runtime.js +556 -139
- package/dist/mcp/taskPlanningRegistrar.js +64 -42
- package/dist/mcp/toolCallCompatibility.js +38 -1
- package/dist/mcp/toolCatalog.d.ts +1 -0
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +10 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +1 -0
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +427 -0
- package/dist/runtime/appGateDefinitions.d.ts +30 -6
- package/dist/runtime/appGateDefinitions.js +6 -6
- package/dist/runtime/appGates.d.ts +13 -13
- package/dist/runtime/appGates.js +36 -13
- package/dist/runtime/nodeAppGates.d.ts +8 -0
- package/dist/runtime/nodeAppGates.js +27 -0
- package/dist/server/cloudCollectionRead.d.ts +1 -1
- package/dist/server/cloudCollectionRead.js +2 -2
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +123 -14
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.d.ts +3 -0
- package/dist/server/localServiceLease.js +11 -2
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +4 -0
- package/dist/server/realtimeSyncWs.js +36 -12
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +113 -3
- package/dist/server/routes/agentRoles.js +3 -2
- package/dist/server/routes/agentSkills.js +3 -2
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +394 -39
- package/dist/server/routes/annotatedAttachments.js +3 -2
- package/dist/server/routes/auth.js +3 -1
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
- package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
- package/dist/server/routes/executorPhaseAApprovals.js +140 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
- package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
- package/dist/server/routes/githubReviewEvidence.js +116 -0
- package/dist/server/routes/localService.d.ts +15 -4
- package/dist/server/routes/localService.js +138 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/primitives.d.ts +2 -0
- package/dist/server/routes/shared.d.ts +19 -0
- package/dist/server/routes/shared.js +95 -19
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +9 -2
- package/dist/server/routes/syncPullApplyRoutes.js +23 -4
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +27 -16
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
- package/dist/server/routes/syncV3OperationRoutes.js +45 -9
- package/dist/server/routes/tasks.js +124 -13
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes/workspaces.js +43 -1
- package/dist/server/routes.js +59 -0
- package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
- package/dist/server/workspaceDeletionAdmission.js +50 -0
- package/dist/service/localServiceCli.js +16 -0
- package/dist/service/localServiceClientLifecycle.js +36 -10
- package/dist/services/codexAppServerModelGateway.d.ts +161 -0
- package/dist/services/codexAppServerModelGateway.js +663 -0
- package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
- package/dist/services/codexDeviceCodeLoginManager.js +265 -0
- package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
- package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
- package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
- package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
- package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
- package/dist/services/executorPhaseAApprovalService.js +609 -0
- package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
- package/dist/services/executorPhaseADriftEvaluator.js +93 -0
- package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
- package/dist/services/executorPhaseAIssuerCore.js +295 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
- package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
- package/dist/services/githubReviewEvidenceRuntime.js +30 -0
- package/dist/services/githubReviewEvidenceService.d.ts +93 -0
- package/dist/services/githubReviewEvidenceService.js +336 -0
- package/dist/services/modelGateway.d.ts +7 -0
- package/dist/services/modelProviderConnectionService.d.ts +71 -0
- package/dist/services/modelProviderConnectionService.js +279 -0
- package/dist/services/modelProviderCredentialHome.d.ts +32 -0
- package/dist/services/modelProviderCredentialHome.js +271 -0
- package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
- package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
- package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
- package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
- package/dist/services/taskforceAgentMcpBridge.js +30 -27
- package/dist/shared/adminEdgeProxy.d.ts +5 -0
- package/dist/shared/adminEdgeProxy.js +94 -0
- package/dist/shared/adminProxySessionCookies.d.ts +16 -0
- package/dist/shared/adminProxySessionCookies.js +86 -0
- package/dist/shared/aiProfileColors.d.ts +31 -1
- package/dist/shared/aiProfileColors.js +14 -6
- package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
- package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
- package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
- package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
- package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
- package/dist/shared/executorPhaseADriftContracts.js +63 -0
- package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
- package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
- package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
- package/dist/shared/executorPhaseARunAuthorization.js +232 -0
- package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
- package/dist/shared/executorPhaseASchemaValidation.js +53 -0
- package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
- package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
- package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
- package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
- package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
- package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
- package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
- package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
- package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
- package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
- package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
- package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
- package/dist/shared/executorPhaseATiming.d.ts +1 -0
- package/dist/shared/executorPhaseATiming.js +1 -0
- package/dist/shared/planningIdentity.js +1 -1
- package/dist/shared/productLogoKeys.d.ts +2 -0
- package/dist/shared/productLogoKeys.js +18 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
- package/dist/shared/taskforceAgentDefinition.js +6 -3
- package/dist/shared/taskforceAgentModels.d.ts +1 -0
- package/dist/shared/taskforceAgentModels.js +36 -3
- package/dist/shared/userFeatureGrants.d.ts +4 -0
- package/dist/shared/userFeatureGrants.js +7 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
- package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
- package/dist/storage/modelProviderConnectionStore.js +446 -0
- package/dist/storage/postgresAdapter.d.ts +24 -3
- package/dist/storage/postgresAdapter.js +117 -14
- package/dist/storage/postgresWorker.js +22 -5
- package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
- package/dist/storage/postgresWorkerProtocol.js +30 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/sync/cloudSyncApi.d.ts +4 -1
- package/dist/sync/cloudSyncApi.js +7 -2
- package/dist/sync/contentSyncState.d.ts +1 -1
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
- package/dist/sync/syncApplyHandlers.d.ts +2 -0
- package/dist/sync/syncApplyHandlers.js +10 -1
- package/dist/sync/syncService.d.ts +17 -0
- package/dist/sync/syncService.js +87 -19
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +8 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
- package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
- package/dist/sync/v3/durableOperationReplay.js +18 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
- package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
- package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
- package/dist/sync/v3/localTaskMetadataClient.js +1 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
- package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
- package/dist/sync/v3/localTaskStatusClient.js +6 -1
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
- package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
- package/dist/sync/v3/syncDurabilityStore.js +199 -13
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
- package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
- package/dist/sync/v3/taskChecklistMutationService.js +48 -1
- package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
- package/dist/sync/v3/taskCreateMutationService.js +7 -4
- package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
- package/dist/sync/v3/taskMetadataMutationService.js +4 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
- package/dist/sync/v3/taskRestoreMutationService.js +7 -4
- package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
- package/dist/sync/v3/taskStatusMutationService.js +123 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
- package/dist/sync/v3/workflowAssignmentSync.js +30 -0
- package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
- package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
- package/dist/sync/workspacePullFeed.js +2 -1
- package/dist/sync/workspaceRepair.d.ts +8 -2
- package/dist/sync/workspaceRepair.js +222 -6
- package/dist/sync/workspaceSyncModel.d.ts +21 -0
- package/dist/sync/workspaceSyncModel.js +35 -7
- package/dist/sync/workspaceSyncState.d.ts +1 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
- package/dist/types.d.ts +47 -1
- package/dist/types.js +6 -0
- package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
- package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
- package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
- package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
- package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
- package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
- package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
- package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-CTsDBaef.js +7 -0
- package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
- package/dist/ui/branding/logos/letterhead_dark.png +0 -0
- package/dist/ui/branding/logos/letterhead_light.png +0 -0
- package/dist/ui/branding/logos/signature_dark.png +0 -0
- package/dist/ui/branding/logos/signature_light.png +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/aiProfileDefaultLogo.js +16 -48
- package/dist/utils/httpSetCookie.d.ts +1 -0
- package/dist/utils/httpSetCookie.js +4 -1
- package/dist/utils/localRuntimeUrl.d.ts +1 -0
- package/dist/utils/localRuntimeUrl.js +14 -0
- package/dist/utils/productLogoRegistry.d.ts +2 -0
- package/dist/utils/productLogoRegistry.js +36 -0
- package/dist/utils/syncStatusPresentation.d.ts +4 -0
- package/dist/utils/syncStatusPresentation.js +17 -0
- package/dist/utils/taskActivity.d.ts +3 -2
- package/dist/utils/taskActivity.js +19 -2
- package/dist/utils/taskEditorReconciliation.d.ts +40 -0
- package/dist/utils/taskEditorReconciliation.js +217 -0
- package/dist/utils/taskEvents.d.ts +2 -0
- package/dist/utils/taskNormalization.d.ts +1 -0
- package/dist/utils/taskNormalization.js +39 -0
- package/dist/utils/taskSearch.js +2 -2
- package/dist/utils/uiNotice.d.ts +4 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +36 -6
- package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
- package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
- package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
- package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
- package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
- package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-BUplSsv_.js +0 -7
- package/dist/ui/assets/index-gz2EXuoK.css +0 -1
package/dist/runtime/appGates.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseTaskforceCloudEnvironment, } from '../config/cloudEnvironment.js';
|
|
1
2
|
import { APP_GATE_DEFINITIONS as APP_GATE_CONFIG } from './appGateDefinitions.js';
|
|
2
3
|
export const ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY = 'annotated_attachments.workspace_access';
|
|
3
4
|
export const DOCUMENT_WORKSPACE_FEATURE_KEY = 'documents.workspace_access';
|
|
@@ -5,16 +6,17 @@ export const WORKFLOW_MANAGER_WORKSPACE_FEATURE_KEY = 'workflow_manager.workspac
|
|
|
5
6
|
export const TASKFORCE_AGENTS_WORKSPACE_FEATURE_KEY = 'taskforce_agents.workspace_access';
|
|
6
7
|
export const AI_PROFILES_WORKSPACE_FEATURE_KEY = 'ai_profiles.workspace_access';
|
|
7
8
|
export const PLANNING_WORKSPACE_FEATURE_KEY = 'planning.workspace_access';
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const appGateDefinitions = Object.fromEntries(Object.entries(APP_GATE_CONFIG).map(([key, definition]) => [
|
|
10
|
+
key,
|
|
11
|
+
Object.freeze({
|
|
10
12
|
key: key,
|
|
11
|
-
|
|
12
|
-
description:
|
|
13
|
-
owner:
|
|
14
|
-
removalMilestone:
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
enabledByEnvironment: Object.freeze({ ...definition.enabledByEnvironment }),
|
|
14
|
+
description: definition.description,
|
|
15
|
+
owner: definition.owner,
|
|
16
|
+
removalMilestone: definition.removalMilestone,
|
|
17
|
+
}),
|
|
18
|
+
]));
|
|
19
|
+
export const APP_GATE_DEFINITIONS = Object.freeze(appGateDefinitions);
|
|
18
20
|
export function listAppGateDefinitions() {
|
|
19
21
|
return Object.values(APP_GATE_DEFINITIONS);
|
|
20
22
|
}
|
|
@@ -24,7 +26,7 @@ export function getAppGateDefinition(featureKey) {
|
|
|
24
26
|
return null;
|
|
25
27
|
return APP_GATE_DEFINITIONS[normalizedKey] || null;
|
|
26
28
|
}
|
|
27
|
-
export function resolveAppGateAccess(featureKey) {
|
|
29
|
+
export function resolveAppGateAccess(featureKey, environment) {
|
|
28
30
|
const gate = getAppGateDefinition(featureKey);
|
|
29
31
|
if (!gate) {
|
|
30
32
|
return {
|
|
@@ -34,7 +36,7 @@ export function resolveAppGateAccess(featureKey) {
|
|
|
34
36
|
code: 'OK'
|
|
35
37
|
};
|
|
36
38
|
}
|
|
37
|
-
if (!gate.
|
|
39
|
+
if (!gate.enabledByEnvironment[environment]) {
|
|
38
40
|
return {
|
|
39
41
|
featureKey,
|
|
40
42
|
allowed: false,
|
|
@@ -49,6 +51,27 @@ export function resolveAppGateAccess(featureKey) {
|
|
|
49
51
|
code: 'OK'
|
|
50
52
|
};
|
|
51
53
|
}
|
|
52
|
-
export function
|
|
53
|
-
return
|
|
54
|
+
export function resolveAppGateAccessMap(environment) {
|
|
55
|
+
return Object.fromEntries(listAppGateDefinitions().map(({ key }) => [key, resolveAppGateAccess(key, environment)]));
|
|
56
|
+
}
|
|
57
|
+
export function resolveClientAppGateAccessMap(accessMap, cloudEnvironment) {
|
|
58
|
+
if (accessMap && isResolvedFeatureAccessMap(accessMap))
|
|
59
|
+
return accessMap;
|
|
60
|
+
const environment = parseTaskforceCloudEnvironment(String(cloudEnvironment || '')) || 'production';
|
|
61
|
+
return resolveAppGateAccessMap(environment);
|
|
62
|
+
}
|
|
63
|
+
export function isResolvedFeatureAccessMap(value) {
|
|
64
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
65
|
+
return false;
|
|
66
|
+
const candidate = value;
|
|
67
|
+
return listAppGateDefinitions().every(({ key }) => {
|
|
68
|
+
const access = candidate[key];
|
|
69
|
+
if (!access || typeof access !== 'object' || Array.isArray(access))
|
|
70
|
+
return false;
|
|
71
|
+
const resolved = access;
|
|
72
|
+
return resolved.featureKey === key
|
|
73
|
+
&& typeof resolved.allowed === 'boolean'
|
|
74
|
+
&& (resolved.source === 'app_gate' || resolved.source === 'cloud_entitlement' || resolved.source === 'none')
|
|
75
|
+
&& typeof resolved.code === 'string';
|
|
76
|
+
});
|
|
54
77
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
|
|
2
|
+
import { type ResolvedFeatureAccess, type ResolvedFeatureAccessMap } from './appGates.js';
|
|
3
|
+
export interface NodeAppGateResolutionOptions {
|
|
4
|
+
onWarning?: (message: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function resolveNodeAppGateEnvironment(env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): TaskforceCloudEnvironment;
|
|
7
|
+
export declare function resolveNodeAppGateAccess(featureKey: string, env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): ResolvedFeatureAccess;
|
|
8
|
+
export declare function resolveNodeAppGateAccessMap(env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): ResolvedFeatureAccessMap;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { resolveDeploymentConfig } from '../config/deployment.js';
|
|
2
|
+
import { resolveAppGateAccess, resolveAppGateAccessMap, } from './appGates.js';
|
|
3
|
+
const warnedEnvironmentSignatures = new WeakMap();
|
|
4
|
+
export function resolveNodeAppGateEnvironment(env = process.env, options = {}) {
|
|
5
|
+
const deployment = resolveDeploymentConfig(env);
|
|
6
|
+
const warnings = [...deployment.warnings];
|
|
7
|
+
if (!deployment.cloudEnvironment) {
|
|
8
|
+
warnings.push('TASKFORCE_CLOUD_ENVIRONMENT could not be resolved; using the production App Gate profile.');
|
|
9
|
+
}
|
|
10
|
+
const warningSignature = warnings.join('\n');
|
|
11
|
+
if (warnings.length === 0) {
|
|
12
|
+
warnedEnvironmentSignatures.delete(env);
|
|
13
|
+
}
|
|
14
|
+
else if (warnedEnvironmentSignatures.get(env) !== warningSignature) {
|
|
15
|
+
const onWarning = options.onWarning || ((message) => console.warn(`[Taskforce App Gates] ${message}`));
|
|
16
|
+
for (const warning of warnings)
|
|
17
|
+
onWarning(warning);
|
|
18
|
+
warnedEnvironmentSignatures.set(env, warningSignature);
|
|
19
|
+
}
|
|
20
|
+
return deployment.cloudEnvironment || 'production';
|
|
21
|
+
}
|
|
22
|
+
export function resolveNodeAppGateAccess(featureKey, env = process.env, options = {}) {
|
|
23
|
+
return resolveAppGateAccess(featureKey, resolveNodeAppGateEnvironment(env, options));
|
|
24
|
+
}
|
|
25
|
+
export function resolveNodeAppGateAccessMap(env = process.env, options = {}) {
|
|
26
|
+
return resolveAppGateAccessMap(resolveNodeAppGateEnvironment(env, options));
|
|
27
|
+
}
|
|
@@ -18,7 +18,7 @@ export interface CloudCollectionReadResponse {
|
|
|
18
18
|
details: Record<string, number>;
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
type CloudCollectionReadCore = Pick<TaskforceCore, 'resolveUserAccess' | 'getSystemRole' | 'getAccountAccessStatus' | '
|
|
21
|
+
type CloudCollectionReadCore = Pick<TaskforceCore, 'resolveUserAccess' | 'getSystemRole' | 'getAccountAccessStatus' | 'listActiveTaskSummaries' | 'listArchiveSummaries' | 'listDeletedTasksReadOnly' | 'listPlanningBootstrap'>;
|
|
22
22
|
export declare function resolveCloudCollectionReadOperation(method: string | undefined, pathname: string): CloudCollectionReadOperation | null;
|
|
23
23
|
export declare function executeCloudCollectionRead(core: CloudCollectionReadCore, request: CloudCollectionReadRequest): CloudCollectionReadResponse;
|
|
24
24
|
export declare function cloudCollectionReadRoute(operation: CloudCollectionReadOperation): string;
|
|
@@ -63,9 +63,9 @@ export function executeCloudCollectionRead(core, request) {
|
|
|
63
63
|
let data;
|
|
64
64
|
const planningDiagnostics = {};
|
|
65
65
|
if (request.operation === 'tasks')
|
|
66
|
-
data = core.
|
|
66
|
+
data = core.listActiveTaskSummaries(workspaceId);
|
|
67
67
|
else if (request.operation === 'archive')
|
|
68
|
-
data = core.
|
|
68
|
+
data = core.listArchiveSummaries(workspaceId);
|
|
69
69
|
else if (request.operation === 'deleted')
|
|
70
70
|
data = core.listDeletedTasksReadOnly(workspaceId);
|
|
71
71
|
else
|
package/dist/server/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ import * as http from 'http';
|
|
|
8
8
|
import { WebSocketServer } from 'ws';
|
|
9
9
|
export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
|
|
10
10
|
import type { LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
|
|
11
|
+
import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
|
|
12
|
+
import { type TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
|
|
11
13
|
import type { LocalSyncCoordinatorHost } from '../sync/coordinator/localSyncCoordinatorHost.js';
|
|
12
14
|
import type { LocalSyncProcessLock } from '../sync/coordinator/localSyncProcessLock.js';
|
|
13
15
|
import type { LocalDataOwnerPermit } from './localDataOwnerPermit.js';
|
|
@@ -26,6 +28,7 @@ export interface StandaloneServerOptions {
|
|
|
26
28
|
bootstrapCapability: string;
|
|
27
29
|
ownershipKey: string;
|
|
28
30
|
cloudTarget: LocalServiceCloudTarget;
|
|
31
|
+
runtimeContract: LocalServiceRuntimeContract;
|
|
29
32
|
};
|
|
30
33
|
}
|
|
31
34
|
export interface TaskforceStandaloneServer extends http.Server {
|
|
@@ -46,6 +49,7 @@ export declare const TASKFORCE_PROXY_ORIGIN_PROTO_HEADER = "x-taskforce-origin-p
|
|
|
46
49
|
export declare const TASKFORCE_PROXY_ORIGIN_BASE_URL_HEADER = "x-taskforce-origin-base-url";
|
|
47
50
|
export declare const TASKFORCE_PROXY_ORIGIN_RUNTIME_HEADER = "x-taskforce-origin-runtime";
|
|
48
51
|
export declare const TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER = "x-taskforce-cloud-environment";
|
|
52
|
+
export declare function sanitizeQaRunIdHeader(raw: unknown): string;
|
|
49
53
|
export declare function shouldProxyCloudPath(pathname: string): boolean;
|
|
50
54
|
export declare function shouldProxyCloudRequest(url: Pick<URL, 'pathname' | 'searchParams'>, env?: NodeJS.ProcessEnv): boolean;
|
|
51
55
|
export declare function resolveCloudProxyUpstreamBaseUrl(req: http.IncomingMessage, fallbackBaseUrl: string): string;
|
|
@@ -57,6 +61,8 @@ export declare function writeJsonErrorIfPossible(res: http.ServerResponse, statu
|
|
|
57
61
|
export declare function applyCloudProxyForwardedHeaders(headers: Headers, req: http.IncomingMessage): void;
|
|
58
62
|
export declare function rewriteProxySetCookieForLocalHost(cookie: string): string;
|
|
59
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[];
|
|
60
66
|
export declare function shouldForwardCloudProxyResponseHeader(name: string): boolean;
|
|
61
67
|
export declare function shouldApplyAuthRateLimitForPath(pathname: string): boolean;
|
|
62
68
|
export declare function resolveCloudProxyBaseUrl(env?: NodeJS.ProcessEnv): string;
|
package/dist/server/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import { createRoutes, matchRoute } from './routes.js';
|
|
|
16
16
|
import { formatApiErrorResponse } from './routes/primitives.js';
|
|
17
17
|
import { logSlowBootstrapRoute } from './routes/shared.js';
|
|
18
18
|
import { applyCorsHeaders, getAllowedOriginsFromEnv } from './cors.js';
|
|
19
|
-
import { applyPrefixedRateLimitHeaders, applyRateLimitHeaders, InMemoryRateLimiter, resolveRateLimitKey } from './rateLimit.js';
|
|
19
|
+
import { applyPrefixedRateLimitHeaders, applyRateLimitHeaders, InMemoryRateLimiter, isWorkspaceSyncFeedRead, resolveRateLimitKey, } from './rateLimit.js';
|
|
20
20
|
import { isRequestAuthorized, resolveAuthConfigFromEnv, resolveRequestAccess } from './auth.js';
|
|
21
21
|
import { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, } from './authorizedWorkspaceAccess.js';
|
|
22
22
|
export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
|
|
@@ -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';
|
|
@@ -178,6 +181,12 @@ export const TASKFORCE_PROXY_ORIGIN_PROTO_HEADER = 'x-taskforce-origin-proto';
|
|
|
178
181
|
export const TASKFORCE_PROXY_ORIGIN_BASE_URL_HEADER = 'x-taskforce-origin-base-url';
|
|
179
182
|
export const TASKFORCE_PROXY_ORIGIN_RUNTIME_HEADER = 'x-taskforce-origin-runtime';
|
|
180
183
|
export const TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER = 'x-taskforce-cloud-environment';
|
|
184
|
+
export function sanitizeQaRunIdHeader(raw) {
|
|
185
|
+
const normalized = String(Array.isArray(raw) ? raw[0] : raw || '')
|
|
186
|
+
.trim()
|
|
187
|
+
.replace(/[^A-Za-z0-9._-]+/g, '-');
|
|
188
|
+
return normalized.slice(0, 128) || '-';
|
|
189
|
+
}
|
|
181
190
|
function shouldLogRefreshDiagnostic(pathname) {
|
|
182
191
|
return REFRESH_DIAGNOSTIC_PATH_PREFIXES.some((prefix) => pathname === prefix || pathname.startsWith(prefix));
|
|
183
192
|
}
|
|
@@ -255,7 +264,11 @@ export function shouldProxyCloudPath(pathname) {
|
|
|
255
264
|
|| pathname.startsWith('/api/taskforce/admin/')
|
|
256
265
|
|| pathname.startsWith('/api/taskforce/billing/')
|
|
257
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'
|
|
258
270
|
|| pathname === '/api/taskforce/agents/model-gateway/test'
|
|
271
|
+
|| /^\/api\/taskforce\/agents\/[^/]+\/connection-binding$/i.test(pathname)
|
|
259
272
|
|| isCloudOwnedUserAvatarContextPath(pathname)
|
|
260
273
|
|| isTaskforceAgentAvatarGenerationPath(pathname)
|
|
261
274
|
|| pathname.startsWith('/api/taskforce/settings/mcp/')
|
|
@@ -276,6 +289,8 @@ export function shouldProxyCloudRequest(url, env = process.env) {
|
|
|
276
289
|
if (isWorkspaceAiProfileAvatarContextPath(url.pathname))
|
|
277
290
|
return true;
|
|
278
291
|
if (/^\/api\/taskforce\/workflow-executions\/[^/]+\/complete-step$/.test(url.pathname)) {
|
|
292
|
+
if (areWorkflowRuntimeMutationsFenced(env))
|
|
293
|
+
return false;
|
|
279
294
|
return !resolveWorkflowRuntimeMutationCapability({
|
|
280
295
|
runtimeMode: 'local',
|
|
281
296
|
surface: 'http',
|
|
@@ -404,6 +419,26 @@ export function shouldRewriteProxySetCookieDomain(cookie, hostHeader) {
|
|
|
404
419
|
return false;
|
|
405
420
|
return !requestHost.endsWith(`.${cookieDomain}`);
|
|
406
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
|
+
}
|
|
407
442
|
export function shouldForwardCloudProxyResponseHeader(name) {
|
|
408
443
|
const normalizedName = String(name || '').trim().toLowerCase();
|
|
409
444
|
if (!normalizedName)
|
|
@@ -606,7 +641,7 @@ export function createStandaloneServer(options) {
|
|
|
606
641
|
}
|
|
607
642
|
let localServiceServer = null;
|
|
608
643
|
const localServiceSessions = options.localService
|
|
609
|
-
? new LocalServiceSessionManager(options.localService.generation)
|
|
644
|
+
? new LocalServiceSessionManager(options.localService.generation, core.getDatabaseAdapter(), core.getTenantId(), options.localService.runtimeContract)
|
|
610
645
|
: null;
|
|
611
646
|
const routes = createRoutes(core, {
|
|
612
647
|
authConfig,
|
|
@@ -658,10 +693,13 @@ export function createStandaloneServer(options) {
|
|
|
658
693
|
: (runtimeMode === 'cloud');
|
|
659
694
|
const rateLimitLimit = Number.parseInt(process.env.TASKFORCE_API_RATE_LIMIT_MAX_REQUESTS || '', 10) || 120;
|
|
660
695
|
const rateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_API_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
|
|
696
|
+
const syncFeedRateLimit = Number.parseInt(process.env.TASKFORCE_SYNC_FEED_RATE_LIMIT_MAX_REQUESTS || '', 10) || 600;
|
|
697
|
+
const syncFeedRateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_SYNC_FEED_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
|
|
661
698
|
const webhookRateLimitMaxRequests = Number.parseInt(process.env.TASKFORCE_STRIPE_WEBHOOK_RATE_LIMIT_MAX_REQUESTS || '', 10) || 600;
|
|
662
699
|
const webhookRateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_STRIPE_WEBHOOK_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
|
|
663
700
|
const maxPayloadBytes = Number.parseInt(process.env.TASKFORCE_MAX_PAYLOAD_BYTES || '', 10) || 1_048_576;
|
|
664
701
|
const rateLimiter = new InMemoryRateLimiter(rateLimitLimit, rateLimitWindowMs);
|
|
702
|
+
const syncFeedRateLimiter = new InMemoryRateLimiter(syncFeedRateLimit, syncFeedRateLimitWindowMs);
|
|
665
703
|
const webhookRateLimiter = new InMemoryRateLimiter(webhookRateLimitMaxRequests, webhookRateLimitWindowMs);
|
|
666
704
|
const resolveAuthRateLimitSettings = () => {
|
|
667
705
|
const auth = core.getGlobalSettings().auth || {};
|
|
@@ -765,7 +803,8 @@ export function createStandaloneServer(options) {
|
|
|
765
803
|
const requestId = String(req.headers['x-request-id'] || req.headers['x-railway-request-id'] || '').trim() || '-';
|
|
766
804
|
const workspaceId = String(req.headers['x-taskforce-workspace-id'] || '').trim() || '-';
|
|
767
805
|
const userId = String(req.headers['x-taskforce-user-id'] || '').trim() || '-';
|
|
768
|
-
|
|
806
|
+
const qaRunId = sanitizeQaRunIdHeader(req.headers['x-taskforce-qa-run-id']);
|
|
807
|
+
console.info(`[Taskforce RefreshDiag] method=${method} path=${pathname} status=${statusCode} durationMs=${durationMs} requestId=${requestId} workspaceId=${workspaceId} userId=${userId} qaRunId=${qaRunId}`);
|
|
769
808
|
};
|
|
770
809
|
// Resolve static files directory at runtime
|
|
771
810
|
// Standalone UI source now lives in apps/app and builds to dist/ui.
|
|
@@ -825,6 +864,9 @@ export function createStandaloneServer(options) {
|
|
|
825
864
|
const adminAuditRetentionEnabled = runtimeMode === 'cloud'
|
|
826
865
|
&& process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_ENABLED !== 'false';
|
|
827
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);
|
|
828
870
|
const server = http.createServer(async (req, res) => {
|
|
829
871
|
const requestStartedAt = getRequestTimingNow();
|
|
830
872
|
if (!distUiPath) {
|
|
@@ -877,6 +919,7 @@ export function createStandaloneServer(options) {
|
|
|
877
919
|
}
|
|
878
920
|
try {
|
|
879
921
|
const method = String(req.method || 'GET').toUpperCase();
|
|
922
|
+
const adminProxyEnvironment = parseTaskforceCloudEnvironment(req.headers[TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER]);
|
|
880
923
|
const upstreamBaseUrl = resolveCloudProxyUpstreamBaseUrl(req, cloudProxyBaseUrl);
|
|
881
924
|
const upstreamUrl = `${upstreamBaseUrl}${url.pathname}${url.search || ''}`;
|
|
882
925
|
const headers = new Headers();
|
|
@@ -894,6 +937,9 @@ export function createStandaloneServer(options) {
|
|
|
894
937
|
continue;
|
|
895
938
|
headers.set(key, serialized);
|
|
896
939
|
}
|
|
940
|
+
if (adminProxyEnvironment) {
|
|
941
|
+
applyAdminProxyRequestSession(headers, adminProxyEnvironment);
|
|
942
|
+
}
|
|
897
943
|
applyCloudProxyForwardedHeaders(headers, req);
|
|
898
944
|
if (cloudProxyClientId && cloudProxyClientSecret) {
|
|
899
945
|
headers.set('CF-Access-Client-Id', cloudProxyClientId);
|
|
@@ -915,17 +961,22 @@ export function createStandaloneServer(options) {
|
|
|
915
961
|
continue;
|
|
916
962
|
outgoingHeaders[key] = value;
|
|
917
963
|
}
|
|
964
|
+
if (adminProxyEnvironment) {
|
|
965
|
+
outgoingHeaders['cache-control'] = 'no-store';
|
|
966
|
+
}
|
|
918
967
|
const setCookies = upstream.headers.getSetCookie?.();
|
|
919
968
|
if (Array.isArray(setCookies) && setCookies.length > 0) {
|
|
920
969
|
const requestHost = String(req.headers.host || '').trim();
|
|
921
|
-
const normalizedSetCookies =
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
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
|
+
});
|
|
929
980
|
res.setHeader('Set-Cookie', normalizedSetCookies);
|
|
930
981
|
}
|
|
931
982
|
res.writeHead(upstream.status, outgoingHeaders);
|
|
@@ -992,7 +1043,9 @@ export function createStandaloneServer(options) {
|
|
|
992
1043
|
});
|
|
993
1044
|
const rateLimitResult = isBillingWebhook
|
|
994
1045
|
? webhookRateLimiter.check(key)
|
|
995
|
-
:
|
|
1046
|
+
: isWorkspaceSyncFeedRead(req.method, url.pathname)
|
|
1047
|
+
? syncFeedRateLimiter.check(key)
|
|
1048
|
+
: rateLimiter.check(key);
|
|
996
1049
|
if (isBillingWebhook) {
|
|
997
1050
|
applyPrefixedRateLimitHeaders(res, rateLimitResult, 'X-Webhook-RateLimit');
|
|
998
1051
|
}
|
|
@@ -1168,6 +1221,8 @@ export function createStandaloneServer(options) {
|
|
|
1168
1221
|
let purgeTimer = null;
|
|
1169
1222
|
let integrityScheduleTimer = null;
|
|
1170
1223
|
let adminAuditRetentionTimer = null;
|
|
1224
|
+
let repairSnapshotRetentionTimer = null;
|
|
1225
|
+
let operationRetentionTimer = null;
|
|
1171
1226
|
let watcher = null;
|
|
1172
1227
|
let shutdownPromise = null;
|
|
1173
1228
|
Object.defineProperty(server, 'localSyncCoordinatorHost', {
|
|
@@ -1192,6 +1247,14 @@ export function createStandaloneServer(options) {
|
|
|
1192
1247
|
clearInterval(adminAuditRetentionTimer);
|
|
1193
1248
|
adminAuditRetentionTimer = null;
|
|
1194
1249
|
}
|
|
1250
|
+
if (repairSnapshotRetentionTimer) {
|
|
1251
|
+
clearInterval(repairSnapshotRetentionTimer);
|
|
1252
|
+
repairSnapshotRetentionTimer = null;
|
|
1253
|
+
}
|
|
1254
|
+
if (operationRetentionTimer) {
|
|
1255
|
+
clearInterval(operationRetentionTimer);
|
|
1256
|
+
operationRetentionTimer = null;
|
|
1257
|
+
}
|
|
1195
1258
|
if (localSyncPermitRecoveryTimer) {
|
|
1196
1259
|
clearInterval(localSyncPermitRecoveryTimer);
|
|
1197
1260
|
localSyncPermitRecoveryTimer = null;
|
|
@@ -1245,6 +1308,52 @@ export function createStandaloneServer(options) {
|
|
|
1245
1308
|
adminAuditRetentionTimer = setInterval(runAdminAuditRetention, adminAuditRetentionIntervalMinutes * 60_000);
|
|
1246
1309
|
adminAuditRetentionTimer.unref?.();
|
|
1247
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?.();
|
|
1248
1357
|
const appendDocumentPurgeHistory = (summary) => {
|
|
1249
1358
|
const settings = core.getGlobalSettings();
|
|
1250
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);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
|
|
2
|
+
import { type LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
|
|
2
3
|
import { type WindowsAclCommandRunner } from './localServiceWindowsAcl.js';
|
|
3
4
|
export interface LocalServiceDescriptor {
|
|
4
5
|
schemaVersion: 1;
|
|
@@ -11,6 +12,7 @@ export interface LocalServiceDescriptor {
|
|
|
11
12
|
bootstrapCapability: string;
|
|
12
13
|
publishedAt: string;
|
|
13
14
|
cloudTarget?: LocalServiceCloudTarget | null;
|
|
15
|
+
runtimeContract?: LocalServiceRuntimeContract | null;
|
|
14
16
|
}
|
|
15
17
|
export interface LocalServiceLeaseIdentityInput {
|
|
16
18
|
projectRoot: string;
|
|
@@ -30,6 +32,7 @@ export interface LocalServiceDescriptorPublication {
|
|
|
30
32
|
protocolVersion: string;
|
|
31
33
|
appVersion: string;
|
|
32
34
|
cloudTarget: LocalServiceCloudTarget;
|
|
35
|
+
runtimeContract: LocalServiceRuntimeContract;
|
|
33
36
|
}
|
|
34
37
|
export interface LocalServiceLease {
|
|
35
38
|
readonly identity: LocalServiceLeaseIdentity;
|
|
@@ -4,6 +4,7 @@ import * as net from 'net';
|
|
|
4
4
|
import * as os from 'os';
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
import { parseLocalServiceCloudTarget, } from '../config/localServiceCloudTarget.js';
|
|
7
|
+
import { parseLocalServiceRuntimeContract, } from '../config/localServiceRuntimeContract.js';
|
|
7
8
|
import { resolveLocalSyncProcessLockIdentity } from './localDatabaseIdentity.js';
|
|
8
9
|
import { ensureWindowsUserOnlyDirectoryAcl, } from './localServiceWindowsAcl.js';
|
|
9
10
|
const DESCRIPTOR_SCHEMA_VERSION = 1;
|
|
@@ -20,7 +21,8 @@ function defaultRuntimeDirectory(platform) {
|
|
|
20
21
|
const userKey = typeof process.getuid === 'function'
|
|
21
22
|
? String(process.getuid())
|
|
22
23
|
: createHash('sha256').update(os.userInfo().username).digest('hex').slice(0, 16);
|
|
23
|
-
|
|
24
|
+
const temporaryDirectory = platform === 'darwin' ? '/tmp' : os.tmpdir();
|
|
25
|
+
return path.join(temporaryDirectory, `taskforce-${userKey}`, 'local-services');
|
|
24
26
|
}
|
|
25
27
|
export function resolveLocalServiceLeaseIdentity(input) {
|
|
26
28
|
const ownershipKey = resolveLocalSyncProcessLockIdentity(input).ownershipKey;
|
|
@@ -168,8 +170,14 @@ function parseDescriptor(value, ownershipKey) {
|
|
|
168
170
|
if (value.cloudTarget != null && !cloudTarget) {
|
|
169
171
|
throw new Error('Local service descriptor cloud target is invalid.');
|
|
170
172
|
}
|
|
173
|
+
const runtimeContract = value.runtimeContract == null
|
|
174
|
+
? null
|
|
175
|
+
: parseLocalServiceRuntimeContract(value.runtimeContract);
|
|
176
|
+
if (value.runtimeContract != null && !runtimeContract) {
|
|
177
|
+
throw new Error('Local service descriptor runtime contract is invalid.');
|
|
178
|
+
}
|
|
171
179
|
assertLoopbackEndpoint(value.endpoint);
|
|
172
|
-
return { ...value, cloudTarget };
|
|
180
|
+
return { ...value, cloudTarget, runtimeContract };
|
|
173
181
|
}
|
|
174
182
|
function readOptionalDescriptor(identity) {
|
|
175
183
|
try {
|
|
@@ -371,6 +379,7 @@ export async function acquireLocalServiceLease(input, dependencies = {}) {
|
|
|
371
379
|
bootstrapCapability,
|
|
372
380
|
publishedAt: (dependencies.now?.() || new Date()).toISOString(),
|
|
373
381
|
cloudTarget: publication.cloudTarget,
|
|
382
|
+
runtimeContract: publication.runtimeContract,
|
|
374
383
|
};
|
|
375
384
|
publishJsonFileAtomically(identity.descriptorPath, descriptor, platform);
|
|
376
385
|
return descriptor;
|
|
@@ -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;
|