import { randomUUID } from "node:crypto"; export * from "./a2a-adapter"; export * from "./agent-workspace-snapshot"; export * from "./agent-workspace-snapshot-handlers"; export * from "./agent-workspace-snapshot-routes"; export * from "./agent-workspace-snapshot-schemas"; export * from "./answer-trace-access"; export * from "./answer-trace-handlers"; export * from "./answer-trace-idempotency"; export * from "./answer-trace-repository"; export * from "./answer-trace-routes"; export * from "./answer-trace-recorder"; export * from "./api-shared-utils"; export * from "./artifact-segment-repository"; export * from "./auth"; export * from "./auto-retrieval-mode-resolver"; export * from "./backpressure-automation"; export * from "./background-task"; export * from "./background-task-handlers"; export * from "./background-task-routes"; export * from "./bounded-concurrency"; export * from "./bulk-operation"; export * from "./bulk-operation-database-repository"; export * from "./bulk-operation-summary"; export * from "./capability-grant-admission-middleware"; export * from "./capability-grant-provenance"; export * from "./capability-grant-provenance-database-repository"; export * from "./capability-revocation-handlers"; export * from "./capability-revocation-routes"; import { type AgentWorkspaceReplayService, type AgentWorkspaceSnapshotRepository, createAgentWorkspaceReplayService, createInMemoryAgentWorkspaceSnapshotRepository, } from "./agent-workspace-snapshot"; import { registerAgentWorkspaceSnapshotHandlers } from "./agent-workspace-snapshot-handlers"; import { registerAnswerTraceHandlers } from "./answer-trace-handlers"; import { createAnswerTraceRecorder } from "./answer-trace-recorder"; import { type AnswerTraceRepository, createInMemoryAnswerTraceRepository, } from "./answer-trace-repository"; import { deterministicChildId } from "./api-shared-utils"; import { createInMemoryArtifactSegmentRepository } from "./artifact-segment-repository"; import { type AuthVerifier, createAuthMiddleware, createStaticAuthVerifier } from "./auth"; import { registerBackgroundTaskHandlers } from "./background-task-handlers"; import { createInMemoryBulkOperationRepository } from "./bulk-operation"; import { createCapabilityGrantAdmissionMiddleware } from "./capability-grant-admission-middleware"; import { registerCapabilityRevocationHandlers } from "./capability-revocation-handlers"; import { createDifyCapabilityV2GatewayMiddleware } from "./dify-capability-v2"; import { registerDifyIntegrationActivationHandlers } from "./dify-integration-activation-handlers"; import { createDifyIntegrationFreezeMiddleware } from "./dify-integration-freeze"; import { registerDifyIntegrationFreezeHandlers } from "./dify-integration-freeze-handlers"; import { createDifyIntegrationStateMiddleware } from "./dify-integration-state"; import { registerGoldenQuestionHandlers } from "./golden-question-handlers"; import { type GoldenQuestionRepository, createInMemoryGoldenQuestionRepository, } from "./golden-question-repository"; export * from "./conflict-detection"; export * from "./contextual-enrichment-flow"; export * from "./core-resource-response-schemas"; export * from "./cursor-utils"; export * from "./dify-capability-v2"; export * from "./dify-integration-activation-handlers"; export * from "./dify-integration-activation-routes"; export * from "./dify-integration-freeze"; export * from "./dify-integration-freeze-database-repository"; export * from "./dify-integration-freeze-handlers"; export * from "./dify-integration-freeze-routes"; export * from "./dify-integration-state"; export * from "./dify-integration-state-database-repository"; export * from "./integrated-knowledge-space-deletion-handlers"; export * from "./integrated-knowledge-space-deletion-routes"; export * from "./integrated-knowledge-space-provisioning-handlers"; export * from "./integrated-knowledge-space-provisioning-routes"; export * from "./internal-transport-guard"; export * from "./database-row-utils"; export * from "./database-sql-utils"; export * from "./document-compilation-handlers"; export * from "./document-compilation-attempt-job"; export * from "./document-compilation-attempt-repository"; export * from "./document-compilation-profile-snapshot"; export * from "./document-compilation-candidate-validator"; export * from "./document-compilation-candidate-runtime"; export * from "./document-compilation-initial-profile-coordinator"; export * from "./document-compilation-job"; export * from "./document-compilation-outbox-dispatcher"; export * from "./document-compilation-publication-coordinator"; export * from "./document-compilation-publication-processor"; export * from "./document-compilation-pipeline"; export * from "./document-compilation-routes"; export * from "./document-chunk-repository"; export * from "./document-logical-mutation-runtime"; export * from "./document-processing-task-repository"; export * from "./document-settings-repository"; export * from "./document-semantic-enrichment-processor"; export * from "./document-semantic-enrichment-repository"; export * from "./document-semantic-window-checkpoint-repository"; export * from "./document-semantic-enrichment-runtime"; export * from "./document-compilation-runtime"; export * from "./document-compilation-worker"; export * from "./document-asset-repository"; export * from "./document-asset-embedding-profile-guard"; export * from "./durable-deletion-repository"; export * from "./document-image-variant-generator"; export * from "./document-multimodal-enrichment-providers"; export * from "./document-multimodal-candidate-resolver"; export * from "./document-multimodal-evaluation"; export * from "./document-multimodal-manifest-enhancer"; export * from "./document-multimodal-manifest-builder"; export * from "./document-multimodal-manifest-repository"; export * from "./document-model-budget"; export * from "./document-pdf-rasterizer"; export * from "./document-outline-builder"; export * from "./document-layout-recomposer"; export * from "./document-outline-evaluation"; export * from "./document-outline-repository"; export * from "./document-offsets"; export * from "./document-outline-summary-enhancer"; export * from "./document-outline-summary-checkpoint-repository"; export * from "./document-knowledge-paths"; export * from "./document-read-handlers"; export * from "./document-read-routes"; export * from "./document-request-schemas"; export * from "./document-response-schemas"; export * from "./document-upload-utils"; export * from "./logical-document-handlers"; export * from "./logical-document-repository"; export * from "./logical-document-routes"; export * from "./logical-document-schemas"; export * from "./source-logical-document-version-adapter"; export * from "./source-durable-deletion-bulk-removal"; export * from "./database-deletion-lifecycle-fence-reader"; export * from "./database-deletion-object-write-admission"; export * from "./database-durable-deletion-target-capabilities"; export * from "./deletion-lifecycle-fence"; export * from "./deletion-object-write-admission"; export * from "./deletion-object-write-storage"; export * from "./deletion-residue-cleanup"; export * from "./durable-deletion-handlers"; export * from "./durable-deletion-outbox-dispatcher"; export * from "./durable-deletion-fingerprinter"; export * from "./durable-deletion-publication-gc"; export * from "./durable-deletion-request-schemas"; export * from "./durable-deletion-response-schemas"; export * from "./durable-deletion-routes"; export * from "./durable-deletion-runtime"; export * from "./durable-deletion-service"; export * from "./durable-deletion-target-processors"; export * from "./upload-session"; export * from "./upload-session-completion-publisher"; export * from "./upload-session-database-repository"; export * from "./upload-session-handlers"; export * from "./upload-session-routes"; export * from "./profile-aware-query-generator"; export * from "./model-capability-handlers"; export * from "./model-capability-preflight"; export * from "./model-capability-routes"; export * from "./knowledge-space-creation"; export * from "./knowledge-space-profile-backfill"; export * from "./knowledge-space-profile-backfill-runtime"; export * from "./knowledge-space-profile-memory-repository"; export * from "./knowledge-space-profile-repository"; export * from "./knowledge-space-profile-publication-repository"; export * from "./knowledge-space-provisioning-repository"; export * from "./knowledge-space-profile-aware-manifest-repository"; export * from "./knowledge-space-profile-audit-handlers"; export * from "./knowledge-space-profile-audit-routes"; export * from "./knowledge-space-profile-audit-schemas"; export * from "./knowledge-space-profile-migration"; export * from "./knowledge-space-profile-migration-candidate-builder"; export * from "./knowledge-space-profile-migration-database-repository"; export * from "./knowledge-space-profile-migration-handlers"; export * from "./knowledge-space-profile-migration-routes"; export * from "./knowledge-space-profile-migration-runtime"; export * from "./knowledge-space-profile-migration-schemas"; export * from "./knowledge-space-profile-migration-service"; export * from "./vector-index-capability"; export * from "./document-write-handlers"; export * from "./document-write-routes"; export * from "./embedding-model-registry"; export * from "./embedding-model-upgrade-workflow"; export * from "./entity-extraction-flow"; export * from "./evidence-bundle-assembler"; export * from "./evidence-bundle-database-repository"; export * from "./evidence-bundle-visibility"; export * from "./extraction-quality-control-flow"; export * from "./extraction-types"; export * from "./failed-query-clustering"; export * from "./failed-query-handlers"; export * from "./failed-query-recorder"; export * from "./failed-query-repository"; export * from "./failed-query-routes"; export * from "./workflow-failed-retrieval"; export * from "./workflow-failed-retrieval-handlers"; export * from "./workflow-failed-retrieval-routes"; export * from "./final-rerank-retrieval"; export * from "./freshness-checking"; export * from "./gateway-app"; export * from "./gateway-defaults"; export * from "./gateway-error-handlers"; export * from "./gateway-error-envelope-middleware"; export * from "./gateway-health"; export * from "./gateway-openapi-contracts"; export * from "./gateway-openapi-document"; export * from "./golden-question-evidence-matcher"; export * from "./gateway-options"; export * from "./gateway-route-schemas"; export * from "./gateway-sse-responses"; export * from "./generation-immutability"; export * from "./gateway-system-handlers"; export * from "./gateway-system-routes"; export * from "./graph-index-repository"; export * from "./graph-index-writer"; export * from "./published-graph-index-repository"; export * from "./graph-handlers"; export * from "./graph-routes"; export * from "./graph-traversal-responses"; export * from "./golden-question-annotation"; export * from "./golden-question-handlers"; export * from "./golden-question-repository"; export * from "./golden-question-routes"; export * from "./knowledge-space-access-control"; export * from "./knowledge-space-access-handlers"; export * from "./knowledge-space-access-routes"; export * from "./knowledge-space-api-key-authentication"; export * from "./knowledge-space-authorization"; export * from "./knowledge-space-authorization-middleware"; export * from "./http-tracing"; export * from "./hybrid-retrieval"; export * from "./hybrid-query-generator"; export * from "./index-projection-builders"; export * from "./index-projection-repository"; export * from "./index-reindexer"; export * from "./job-payload-utils"; export * from "./json-utils"; export * from "./llm-answer-query-generator"; export * from "./llm-community-summary-provider"; export * from "./llm-entity-extraction-provider"; export * from "./llm-multimodal-answer-provider"; export * from "./llm-relation-extraction-provider"; export * from "./llm-semantic-chunker"; export * from "./knowledge-fs-errors"; export * from "./knowledge-fs-handlers"; export * from "./knowledge-fs-command-registry"; export * from "./knowledge-fs-fsck"; export * from "./knowledge-fs-gc"; export * from "./knowledge-fs-request-schemas"; export * from "./knowledge-fs-response-schemas"; export * from "./knowledge-fs-routes"; export * from "./knowledge-fs-lease-repository"; export * from "./knowledge-fs-operation-leases"; export * from "./knowledge-fs-session-repository"; export * from "./knowledge-fs-runtime-cleanup-worker"; export * from "./knowledge-fs-types"; export * from "./knowledge-fs-path-utils"; export * from "./knowledge-mcp-types"; export * from "./knowledge-mcp-server"; export * from "./knowledge-node-repository"; export * from "./knowledge-path-resolution-cache"; export * from "./knowledge-path-repository"; export * from "./knowledge-space-golden-question-schemas"; export * from "./knowledge-space-embedding-resolver"; export * from "./knowledge-space-handlers"; export * from "./knowledge-space-manifest-repository"; export * from "./knowledge-space-metadata-handlers"; export * from "./knowledge-space-metadata-repository"; export * from "./knowledge-space-metadata-routes"; export * from "./knowledge-space-metadata-schemas"; export * from "./knowledge-space-outline-summary-enhancer"; export * from "./knowledge-space-semantic-ingestion-postprocessor"; export * from "./knowledge-space-overview"; export * from "./knowledge-space-overview-database-repository"; export * from "./knowledge-space-overview-handlers"; export * from "./knowledge-space-overview-routes"; export * from "./knowledge-space-overview-schemas"; export * from "./knowledge-space-quota-admission"; export * from "./knowledge-space-quota-usage"; export * from "./knowledge-space-repository"; export * from "./knowledge-space-routes"; export * from "./legacy-space-publication-bootstrap"; export * from "./legacy-space-publication-bootstrap-handlers"; export * from "./legacy-space-publication-bootstrap-routes"; export * from "./legacy-space-publication-bootstrap-runtime"; export * from "./local-node-query-generator"; export * from "./multimodal-evidence"; export * from "./online-document-connector"; export * from "./online-drive-connector"; export * from "./openapi-handler-utils"; export * from "./operation-policy-handlers"; export * from "./operation-policy-response-schemas"; export * from "./operation-policy-routes"; export * from "./operational-metrics"; export * from "./ingestion-model-observability"; export * from "./parse-artifact-repository"; export * from "./page-index-scoring"; export * from "./page-index-semantic-tree-search"; export * from "./page-index-build-repository"; export * from "./page-index-document-selection"; export * from "./page-index-findability-evaluation"; export * from "./page-index-findability-publication"; export * from "./page-index-findability-runtime"; export * from "./page-index-findability-repository"; export * from "./page-index-summary-repair-runtime"; export * from "./page-index-layered-tree-search"; export * from "./page-index-node-queue"; export * from "./page-index-node-values"; export * from "./page-index-upgrade-backfill"; export * from "./page-index-upgrade-backfill-runtime"; export * from "./page-index-upgrade-backfill-handlers"; export * from "./page-index-upgrade-backfill-routes"; export * from "./projection-publication-gc"; export * from "./projection-publication-member-repository"; export * from "./projection-publication-repository"; export * from "./projection-publication-workflow"; export * from "./published-page-index-repository"; export * from "./published-page-index-retrieval"; export * from "./page-index-whole-tree-selection"; export * from "./published-projection-read-snapshot"; export * from "./published-knowledge-space-runtime-snapshot"; export * from "./query-handlers"; export * from "./query-images"; export * from "./query-image-expansion"; export * from "./query-virtual-entries"; export * from "./query-routes"; export * from "./quality-control"; export * from "./quality-control-database-repository"; export * from "./quality-control-handlers"; export * from "./quality-control-routes"; export * from "./rate-limit"; export * from "./resource-mount-repository"; export * from "./retention-policy"; export * from "./research-task-handlers"; export * from "./research-task-durable-repository"; export * from "./research-task-deletion-cleanup"; export * from "./research-task-deletion-visibility"; export * from "./research-task-job"; export * from "./research-task-outbox-dispatcher"; export * from "./research-task-partial-result-database-repository"; export * from "./research-task-progress"; export * from "./research-task-progress-database-repository"; export * from "./research-task-planning"; export * from "./research-task-request-schemas"; export * from "./research-task-response-schemas"; export * from "./research-retrieval-policy"; export * from "./research-model-usage"; export * from "./research-retrieval-checkpoint"; export * from "./retrieval-test"; export * from "./retrieval-test-handlers"; export * from "./retrieval-test-routes"; export * from "./research-task-routes"; export * from "./research-task-runtime"; export * from "./research-task-runtime-snapshot"; export * from "./research-workflow"; export * from "./relation-extraction-flow"; export * from "./relevance-triage"; export * from "./retrieval-cache"; export * from "./retrieval-evidence"; export * from "./retrieval-evaluation-reports"; export * from "./retrieval-evaluation-runners"; export * from "./retrieval-evaluation-utils"; export * from "./retrieval-execution-lease"; export * from "./retrieval-filter-utils"; export * from "./retrieval-fusion"; export * from "./research-outline-evidence-retrieval"; export * from "./research-evidence-reasoning"; export * from "./research-evidence-retrieval"; export * from "./research-query-vectorizer"; export * from "./retrieval-paths"; export * from "./retrieval-planner"; export * from "./retrieval-rerank"; export * from "./retrieval-text-utils"; export * from "./retrieval-types"; export * from "./route-classification"; export * from "./safe-shell"; export * from "./semantic-community-materializer"; export * from "./semantic-ingestion-postprocessor"; export * from "./semantic-operator-actions"; export * from "./semantic-operator-handlers"; export * from "./semantic-operator-routes"; export * from "./semantic-operator-schemas"; export * from "./retrieval-candidates"; export * from "./session-context-repository"; export * from "./source-cas-update"; export * from "./source-comparison"; export * from "./source-crawl-sync"; export * from "./source-credential-backfill"; export * from "./source-credential-backfill-runtime"; export * from "./source-credential-service"; export * from "./source-credential-tester"; export * from "./source-fs-command-registry"; export * from "./source-document-materializer"; export * from "./source-document-stale-write-scrubber"; export * from "./source-fs-types"; export * from "./source-handlers"; export * from "./source-operation-error"; export * from "./source-connection"; export * from "./source-connection-database-repository"; export * from "./source-connection-secret-cleanup-runtime"; export * from "./source-logical-revision-publisher"; export * from "./source-product-handlers"; export * from "./source-product-routes"; export * from "./source-product-workflow"; export * from "./source-product-workflow-database-repository"; export * from "./source-product-workflow-memory-repository"; export * from "./source-product-workflow-runtime"; export * from "./source-provider-catalog"; export * from "./source-sync-policy-runtime"; export * from "./source-repository"; export * from "./source-retired-secret-cleanup"; export * from "./source-retired-secret-cleanup-runtime"; export * from "./source-request-schemas"; export * from "./source-routes"; export * from "./source-secret-store"; export * from "./source-sync-policy"; export * from "./source-sync-runner"; export * from "./source-sync-scheduler"; export * from "./sse-events"; export * from "./staged-commit-repository"; export * from "./storage-path-utils"; export * from "./storage-quota"; export * from "./summary-tree"; export * from "./tidb-fts-posting-backfill"; export * from "./tidb-fts-posting-backfill-handlers"; export * from "./tidb-fts-posting-backfill-routes"; export * from "./tidb-fts-posting-backfill-runtime"; export * from "./tidb-fts-postings"; export * from "./topic-view-materializer"; export * from "./trace-async"; export * from "./tracing"; export * from "./tracing-exporters"; export * from "./website-crawl-connector"; import { numberColumn, optionalStringColumn, stringColumn } from "./database-row-utils"; import { databasePlaceholder, indexProjectionInsertPlaceholder, jsonInsertPlaceholder, qualifiedDatabaseIdentifier, quoteDatabaseIdentifier, } from "./database-sql-utils"; import { createEmbeddingProfileFreezingDocumentAssetRepository } from "./document-asset-embedding-profile-guard"; import { type DocumentAssetRepository, createInMemoryDocumentAssetRepository, } from "./document-asset-repository"; import { registerDocumentCompilationHandlers } from "./document-compilation-handlers"; import { createDocumentMultimodalManifestBuilder } from "./document-multimodal-manifest-builder"; import { createCachedDocumentMultimodalManifestEnhancer } from "./document-multimodal-manifest-enhancer"; import { createInMemoryDocumentMultimodalManifestRepository } from "./document-multimodal-manifest-repository"; import { createDocumentOutlineBuilder } from "./document-outline-builder"; import { createInMemoryDocumentOutlineRepository } from "./document-outline-repository"; import { registerDocumentReadHandlers } from "./document-read-handlers"; import { DEFAULT_BULK_DOCUMENT_UPLOAD_MAX_BYTES, DEFAULT_BULK_DOCUMENT_UPLOAD_MAX_FILES, DEFAULT_DOCUMENT_UPLOAD_MAX_BYTES, HARD_BULK_DOCUMENT_UPLOAD_MAX_BYTES, HARD_BULK_DOCUMENT_UPLOAD_MAX_FILES, HARD_DOCUMENT_UPLOAD_MAX_BYTES, } from "./document-upload-utils"; import { registerDocumentWriteHandlers } from "./document-write-handlers"; import { registerDurableDeletionHandlers } from "./durable-deletion-handlers"; import { createDurableDeletionService } from "./durable-deletion-service"; import { createEntityExtractionFlow } from "./entity-extraction-flow"; import { type AnswerabilityEvaluator, type EvidenceBundleAssembler, createAnswerabilityEvaluator, createEvidenceBundleAssembler, } from "./evidence-bundle-assembler"; import { createExtractionQualityControlFlow } from "./extraction-quality-control-flow"; import { registerFailedQueryHandlers } from "./failed-query-handlers"; import { createFailedQueryRecorder } from "./failed-query-recorder"; import { createInMemoryFailedQueryRepository } from "./failed-query-repository"; import { createKnowledgeGatewayApp } from "./gateway-app"; import { createDefaultComputeRuntime, createDefaultParser } from "./gateway-defaults"; import { createKnowledgeFsErrorEnvelopeMiddleware } from "./gateway-error-envelope-middleware"; import { completeKnowledgeGatewayOpenApiDocument, knowledgeGatewayOpenApiDocument, } from "./gateway-openapi-document"; import type { KnowledgeGatewayOptions } from "./gateway-options"; import { registerGatewaySystemHandlers } from "./gateway-system-handlers"; import { registerGraphHandlers } from "./graph-handlers"; import { type GraphEntity, type GraphIndexRepository, type GraphRelation, cloneGraphRelation, createInMemoryGraphIndexRepository, } from "./graph-index-repository"; import { createGraphIndexWriter } from "./graph-index-writer"; import { createTraceMiddleware } from "./http-tracing"; import { createDenseVectorProjectionBuilder, createFtsProjectionBuilder, createVisualEmbeddingProjectionBuilder, } from "./index-projection-builders"; import { type IndexProjectionRepository, createInMemoryIndexProjectionRepository, } from "./index-projection-repository"; import { createIncrementalReindexer } from "./index-reindexer"; import { registerIntegratedKnowledgeSpaceDeletionHandlers } from "./integrated-knowledge-space-deletion-handlers"; import { registerIntegratedKnowledgeSpaceProvisioningHandlers } from "./integrated-knowledge-space-provisioning-handlers"; import { createInternalTransportGuardMiddleware } from "./internal-transport-guard"; import { cloneJsonObject, jsonArrayColumn, jsonObjectColumn } from "./json-utils"; import { createKnowledgeFsCommandRegistry } from "./knowledge-fs-command-registry"; import { registerKnowledgeFsHandlers } from "./knowledge-fs-handlers"; import { createInMemoryKnowledgeFsLeaseRepository } from "./knowledge-fs-lease-repository"; import { createInMemoryKnowledgeFsSessionRepository } from "./knowledge-fs-session-repository"; import type { SemanticDiffProvider } from "./knowledge-fs-types"; import { type DeleteKnowledgeNodesByDocumentAssetInput, type DeleteKnowledgeNodesResult, type GetManyKnowledgeNodesInput, type KnowledgeNodeCursor, type KnowledgeNodeLookupInput, type KnowledgeNodeRepository, type ListKnowledgeNodesByArtifactInput, type ListKnowledgeNodesResult, type UpdateKnowledgeNodeMetadataManyInput, type UpdateKnowledgeNodeMetadataPatch, compareKnowledgeNodesByArtifactOffset, createInMemoryKnowledgeNodeRepository, validateKnowledgeNodeBatchIds, } from "./knowledge-node-repository"; import { DuplicateKnowledgePathError, type KnowledgePathRepository, createInMemoryKnowledgePathRepository, } from "./knowledge-path-repository"; import { type KnowledgePathResolutionCache, createKnowledgePathResolutionCache, } from "./knowledge-path-resolution-cache"; import { createInMemoryKnowledgeSpaceAccessRepository, createKnowledgeSpaceAccessService, } from "./knowledge-space-access-control"; import { registerKnowledgeSpaceAccessHandlers } from "./knowledge-space-access-handlers"; import { createKnowledgeSpaceApiKeyAuthenticator } from "./knowledge-space-api-key-authentication"; import { createKnowledgeSpaceAuthorizationGuard } from "./knowledge-space-authorization"; import { createKnowledgeSpaceAuthorizationMiddleware } from "./knowledge-space-authorization-middleware"; import type { KnowledgeSpaceEmbeddingResolver } from "./knowledge-space-embedding-resolver"; import { GoldenQuestionParamsSchema, KnowledgeSpaceParamsSchema, } from "./knowledge-space-golden-question-schemas"; import { registerKnowledgeSpaceHandlers } from "./knowledge-space-handlers"; import { createInMemoryKnowledgeSpaceManifestRepository, ensureKnowledgeSpaceManifest, } from "./knowledge-space-manifest-repository"; import { registerKnowledgeSpaceMetadataHandlers } from "./knowledge-space-metadata-handlers"; import { createInMemoryKnowledgeSpaceOverviewRepository } from "./knowledge-space-overview"; import { registerKnowledgeSpaceOverviewHandlers } from "./knowledge-space-overview-handlers"; import { registerKnowledgeSpaceProductSummaryHandlers } from "./knowledge-space-product-summary-handlers"; import { registerKnowledgeSpaceProfileAuditHandlers } from "./knowledge-space-profile-audit-handlers"; import { registerKnowledgeSpaceProfileMigrationHandlers } from "./knowledge-space-profile-migration-handlers"; import { createKnowledgeSpaceProfileMigrationService } from "./knowledge-space-profile-migration-service"; import { createKnowledgeSpaceQuotaUsageReader } from "./knowledge-space-quota-usage"; import { type KnowledgeSpaceRepository, createInMemoryKnowledgeSpaceRepository, } from "./knowledge-space-repository"; import { createKnowledgeSpaceSemanticExtractionFlowResolver, createKnowledgeSpaceSemanticIngestionPostProcessor, } from "./knowledge-space-semantic-ingestion-postprocessor"; import { registerLegacySpacePublicationBootstrapHandlers } from "./legacy-space-publication-bootstrap-handlers"; import { createLocalNodeQueryGenerator } from "./local-node-query-generator"; import { registerLogicalDocumentHandlers } from "./logical-document-handlers"; import { registerModelCapabilityHandlers } from "./model-capability-handlers"; import { registerOperationPolicyHandlers } from "./operation-policy-handlers"; import { registerPageIndexUpgradeBackfillHandlers } from "./page-index-upgrade-backfill-handlers"; import { type ParseArtifactRepository, createInMemoryParseArtifactRepository, } from "./parse-artifact-repository"; import { createPublishedProjectionReadSnapshotResolver } from "./published-projection-read-snapshot"; import { createQualityReplayRuntime } from "./quality-control"; import { registerQualityControlHandlers } from "./quality-control-handlers"; import { registerQueryHandlers } from "./query-handlers"; import { type RateLimiter, createNoopRateLimiter, createRateLimitMiddleware } from "./rate-limit"; import { createRelationExtractionFlow } from "./relation-extraction-flow"; import { createFailedQueryTriageRunner, createRelevanceTriage } from "./relevance-triage"; import { createDatabaseResearchTaskDeletionVisibility } from "./research-task-deletion-visibility"; import { registerResearchTaskHandlers } from "./research-task-handlers"; import { type ResearchTaskJobStateMachine, type ResearchTaskPartialResultRepository, createInMemoryResearchTaskJobRepository, createInMemoryResearchTaskPartialResultRepository, createResearchTaskJobStateMachine, } from "./research-task-job"; import { type ResearchTaskDryRunPlanner, createResearchTaskDryRunPlanner, } from "./research-task-planning"; import { type ResearchTaskProgressRepository, createInMemoryResearchTaskProgressRepository, createResearchTaskProgressPublisher, } from "./research-task-progress"; import { type RetentionPolicy, type RetentionPolicyPatch, createInMemoryRetentionPolicyRepository, } from "./retention-policy"; import { type EvidenceBundleCache, type EvidenceBundleCacheKeyInput, type NormalizeQueryInput, type NormalizedQueryResult, type QueryNormalizationCache, createEvidenceBundleCache, createQueryNormalizationCache, } from "./retrieval-cache"; import { createRetrievalPlanner } from "./retrieval-planner"; import { registerRetrievalTestHandlers } from "./retrieval-test-handlers"; import { type RetrievalQueryLanguage, detectRetrievalQueryLanguage } from "./retrieval-text-utils"; import type { BasicHybridRetriever, HybridRetrievalMetrics, HybridRetrievalResult, RetrievalMode, RetrievalPlan, RetrieveHybridInput, } from "./retrieval-types"; import { createSafeShell, summarizeWorkspaceReplayOutput } from "./safe-shell"; import { createSemanticCommunityMaterializer } from "./semantic-community-materializer"; import { createSemanticIngestionPostProcessor } from "./semantic-ingestion-postprocessor"; import { createSemanticOperator } from "./semantic-operator-actions"; import { registerSemanticOperatorHandlers } from "./semantic-operator-handlers"; import { createCacheSessionContextRepository } from "./session-context-repository"; import { createSourceDocumentMaterializer } from "./source-document-materializer"; import { createSourceDocumentStaleWriteScrubber } from "./source-document-stale-write-scrubber"; import { registerSourceHandlers } from "./source-handlers"; import { registerSourceProductHandlers } from "./source-product-handlers"; import { createSourceProductWorkflowService } from "./source-product-workflow"; import { createObjectStorageSourceWorkflowContentStore, createSourceProductWorkflowRuntime, } from "./source-product-workflow-runtime"; import { createInMemorySourceRepository } from "./source-repository"; import { createSourceSyncPolicyRuntime } from "./source-sync-policy-runtime"; import { createSourceSyncRunner } from "./source-sync-runner"; import { createSourceSyncScheduler } from "./source-sync-scheduler"; import { createInMemoryStagedCommitRepository } from "./staged-commit-repository"; import { type StorageQuotaRepository, createStaticStorageQuotaRepository } from "./storage-quota"; import { registerTidbFtsPostingBackfillHandlers } from "./tidb-fts-posting-backfill-handlers"; import { type TraceRecorder, createNoopTraceRecorder } from "./tracing"; import { registerUploadSessionHandlers } from "./upload-session-handlers"; import { createWorkflowFailedRetrievalCaptureService } from "./workflow-failed-retrieval"; import { registerWorkflowFailedRetrievalHandlers } from "./workflow-failed-retrieval-handlers"; import type { ComputeRuntime } from "@knowledge/compute"; import { type CacheAdapter, type DatabaseAdapter, type IndexProjection, IndexProjectionSchema, type JobPayload, type KnowledgeNode, KnowledgeNodeSchema, type KnowledgeSpace, type ParseArtifact, type PlatformAdapter, } from "@knowledge/core"; import type { ParserAdapter } from "@knowledge/parsers"; import type { MiddlewareHandler } from "hono"; import type { KnowledgeGatewayEnv } from "./gateway-openapi-contracts"; export { createRetrievalRegressionGate, type RetrievalRegressionDeltas, type RetrievalRegressionEvaluationInput, type RetrievalRegressionGate, type RetrievalRegressionMetrics, type RetrievalRegressionResult, type RetrievalRegressionThresholds, } from "./retrieval-regression"; export function createDifyCapabilityV2OrLegacyApiKeyMiddleware( capabilityV2: MiddlewareHandler, legacyApiKey: MiddlewareHandler, ): MiddlewareHandler { return async (context, next) => { const authorization = context.req.header("authorization")?.trim() ?? ""; const selected = /^Bearer\s+kfs_/i.test(authorization) ? legacyApiKey : capabilityV2; return selected(context, next); }; } export function createKnowledgeGateway({ adapter, allowLegacyPermissionSnapshotAdmission, allowLegacyResearchTaskProfileFallback = false, allowLocalQueryFallback = false, answerTraces, autoRetrievalModeResolver, agentWorkspaceReplay, agentWorkspaceSnapshots, artifactSegments, auth, bulkOperations, capabilityGrantProvenance, componentHealth, compute, denseEmbeddingModel, denseEmbeddingProvider, deletionLifecycleFence, deletionObjectWriteAdmission, documentAssets, durableDeletionRepository, durableDeletions, difyCapabilityV2Auth, difyIntegrationFreezes, difyIntegrationStates, documentCompilationJobs, documentChunks, documentChunkState, documentProcessingTasks, documentRevisionRollbacks, documentSettings, documentSettingsChanges, documentMultimodalManifestEnhancer, documentMultimodalManifests, documentMultimodalImageVariantGenerator, documentMultimodalLocalAssetAllowlist, documentMultimodalMaxExtractedAssets, documentMultimodalMaxLocalAssetBytes, documentMultimodalMaxPdfRasterizedAssets, documentPdfRasterizer, documentOutlineSummaryEnhancer, documentOutlines, logicalDocuments, failedQueries, failedQueryLowConfidenceScoreFloor, relevanceTriageSignals, generateArtifactSegmentId = randomUUID, generateBulkUploadId = randomUUID, generateAgentWorkspaceSnapshotId = randomUUID, generateDocumentAssetId = randomUUID, generateKnowledgeFsGcDryRunId = randomUUID, generateKnowledgeSpaceManifestId = randomUUID, generateKnowledgeSpaceProvisioningKey = randomUUID, generateQueryRunId = randomUUID, generateResearchTaskJobId = randomUUID, embeddingProvider, embeddingResolver, goldenQuestionEvidenceMatcher, goldenQuestions, graphIndex, knowledgeFsLeases, knowledgeFsSessions, knowledgeNodes, knowledgePaths, integratedKnowledgeSpaceProvisioning, knowledgeSpaceManifests, metadataFields, knowledgeSpaceOverview, knowledgeSpaceProfiles, knowledgeSpaceProvisioning, knowledgeSpaceUnpublishedProfileActivations, knowledgeSpaceProfileMigrationRepository, knowledgeSpaceProfileMigrations, knowledgeSpaceProfilePublications, knowledgeSpaceAccess, knowledgeSpaces, legacySpacePublicationBootstraps, legacySpacePublicationBootstrapService, legacyAccessMutationsReadOnly = false, legacyAuthorizationRemoved = false, legacyAuthorizationTrafficMetrics, pageIndexUpgradeBackfills, pageIndexUpgradeBackfillService, maxBulkDeleteDocuments = 100, maxBulkOperations = 1_000, maxCascadeDeleteArtifacts = 100, maxCascadeDeleteNodes = 10_000, maxCascadeDeleteProjections = 20_000, maxBulkReindexDocuments = 100, maxBulkUploadBytes = DEFAULT_BULK_DOCUMENT_UPLOAD_MAX_BYTES, maxBulkUploadFiles = DEFAULT_BULK_DOCUMENT_UPLOAD_MAX_FILES, maxKnowledgeFsTreeDepth = 8, maxLocalQueryAnswerChars = 2_000, maxLocalQueryNodes = 1_000, maxResearchTaskJobs = 10_000, maxSynchronousUploadNodes = 20_000, maxUploadBytes = DEFAULT_DOCUMENT_UPLOAD_MAX_BYTES, modelCapabilityCatalog, modelCapabilityPreflight, now = () => new Date().toISOString(), onlineDocumentConnector, onlineDriveConnector, operationLeases, parseArtifacts, parser, projections, projectionSetPublicationMembers, publishedGraph, runtimeSnapshotResolver, projectionSetPublications, queryGenerator, queryImageResolver, qualityControl, rateLimiter = createNoopRateLimiter(), readinessChecks, researchTaskPlanner, researchTaskDeletionVisibility, researchTaskDirectStream, researchTaskPartials, researchTaskProgress, researchTasks, retentionPolicies, retrievalExecutionLeases, retrievalTestExecutor, semanticDiffProvider, semanticEntityExtractionMaxEntitiesPerNode = 50, semanticEntityExtractionMaxNodesPerRun = 100, semanticEntityExtractionModel = "gpt-4.1-mini", semanticEntityExtractionProvider, semanticRelationExtractionMaxRelationsPerNode = 50, semanticRelationExtractionModel = semanticEntityExtractionModel, semanticRelationExtractionProvider, semanticReasoningMaxOutputTokens = 1_500, semanticReasoningProviderFactory, semanticCommunitySummaryProvider, sessions, inlineSourceCredentialsAllowed = true, sourceCredentialTester, sourceCredentials, sourceProduct, sourceSync, sources, stagedCommits, storageQuotas, tidbFtsPostingBackfillService, tidbFtsPostingReadiness, traces = createNoopTraceRecorder(), uploadSessions, visualEmbeddingModel, visualEmbeddingProvider, websiteCrawlConnector, workflowFailedRetrievalTriage, }: KnowledgeGatewayOptions) { if (allowLocalQueryFallback && process.env.NODE_ENV === "production") { throw new Error("Local query fallback is forbidden in production"); } if (allowLegacyResearchTaskProfileFallback && process.env.NODE_ENV === "production") { throw new Error("Legacy Research profile fallback is forbidden in production"); } if (!knowledgeSpaceProvisioning && process.env.NODE_ENV === "production") { throw new Error("Atomic knowledge-space provisioning is required in production"); } if (sourceProduct && sourceSync) { throw new Error( "Legacy Source sync scheduler cannot run alongside durable Source product workflows", ); } if (auth && difyCapabilityV2Auth) { throw new Error("Configure either legacy auth or Dify Capability v2 auth, not both"); } if (difyCapabilityV2Auth && process.env.NODE_ENV === "production" && !capabilityGrantProvenance) { throw new Error( "Durable Capability grant provenance is required for Capability v2 in production", ); } if (difyCapabilityV2Auth && process.env.NODE_ENV === "production" && !difyIntegrationStates) { throw new Error("Durable per-Workspace integration activation is required for Capability v2"); } if (difyCapabilityV2Auth && process.env.NODE_ENV === "production" && !difyIntegrationFreezes) { throw new Error("Durable per-Workspace integration freeze is required for Capability v2"); } if ( integratedKnowledgeSpaceProvisioning && (!difyCapabilityV2Auth || !difyIntegrationFreezes || !difyIntegrationStates) ) { throw new Error( "Integrated provisioning requires Capability v2, durable freeze, and per-Workspace activation", ); } if ( legacyAuthorizationRemoved && (!difyCapabilityV2Auth || !difyIntegrationFreezes || !difyIntegrationStates || !legacyAccessMutationsReadOnly) ) { throw new Error( "Legacy authorization removal requires Capability v2, durable freeze/activation, and read-only legacy mutations", ); } if (uploadSessions && (!difyCapabilityV2Auth || !capabilityGrantProvenance)) { throw new Error("Direct upload sessions require Capability v2 and durable grant provenance"); } if (researchTaskDirectStream && (!difyCapabilityV2Auth || !capabilityGrantProvenance)) { throw new Error("Direct Research streams require Capability v2 and durable grant provenance"); } const app = createKnowledgeGatewayApp(); const spaces = knowledgeSpaces ?? createInMemoryKnowledgeSpaceRepository({ maxListLimit: 100, maxSpaces: 1_000, }); const manifests = knowledgeSpaceManifests ?? createInMemoryKnowledgeSpaceManifestRepository({ maxListLimit: 100, maxManifests: 1_000, }); const overviewRepository = knowledgeSpaceOverview ?? createInMemoryKnowledgeSpaceOverviewRepository({ maxEvents: 100_000, maxListLimit: 100, }); const segments = artifactSegments ?? createInMemoryArtifactSegmentRepository({ maxBatchSize: 1_000, maxListLimit: 100, maxSegments: 1_000_000, }); const stagedCommitRepository = stagedCommits ?? createInMemoryStagedCommitRepository({ maxCommits: 100_000, maxListLimit: 100, }); const unguardedAssets = documentAssets ?? createInMemoryDocumentAssetRepository({ maxAssets: 10_000, }); // Document asset admission and embedding-profile mutation contend on the same manifestVersion // CAS. Whichever wins first establishes the profile seen by every later projection build. const assets = createEmbeddingProfileFreezingDocumentAssetRepository({ assets: unguardedAssets, ensureManifest: async ({ knowledgeSpaceId, tenantId }) => { const space = await spaces.get({ id: knowledgeSpaceId, tenantId }); if (!space) { return; } // Legacy spaces intentionally keep their historical raw-model projection key. Create the // missing manifest without synthesizing a canonical profile, then freeze that legacy route. await ensureKnowledgeSpaceManifest({ generateId: generateKnowledgeSpaceManifestId, manifests, now, space, }); }, manifests, now, }); const sourceRepository = sources ?? createInMemorySourceRepository({ maxSources: 10_000, }); const artifacts = parseArtifacts ?? createInMemoryParseArtifactRepository({ maxArtifacts: 10_000, }); const questions = goldenQuestions ?? createInMemoryGoldenQuestionRepository({ maxListLimit: 100, maxQuestions: 10_000, }); const paths = knowledgePaths ?? createInMemoryKnowledgePathRepository({ maxListLimit: 100, maxPaths: 100_000, }); const nodes = knowledgeNodes ?? createInMemoryKnowledgeNodeRepository({ maxBatchSize: 1_000, maxListLimit: 100, maxNodes: 100_000, }); const indexProjections = projections ?? createInMemoryIndexProjectionRepository({ maxBatchSize: 1_000, maxListLimit: 100, maxProjections: 200_000, }); const knowledgeFsSessionRepository = knowledgeFsSessions ?? createInMemoryKnowledgeFsSessionRepository({ maxListLimit: 100, maxSessions: 100_000, }); const knowledgeFsLeaseRepository = knowledgeFsLeases ?? createInMemoryKnowledgeFsLeaseRepository({ maxLeases: 100_000, maxListLimit: 100, }); const quotaUsageReader = createKnowledgeSpaceQuotaUsageReader({ artifactSegments: segments, assets, maxAssetsPerRead: 100, maxNodesPerRead: 100, maxSegmentsPerArtifact: 100, nodes, parseArtifacts: artifacts, projections: indexProjections, }); const graphRepository = graphIndex ?? createInMemoryGraphIndexRepository({ maxBatchSize: 1_000, maxEntities: 100_000, maxRelations: 200_000, }); const answerTraceRepository = answerTraces ?? createInMemoryAnswerTraceRepository({ maxSteps: 1_000, maxTraces: 10_000, }); const answerTraceRecorder = createAnswerTraceRecorder({ maxSteps: 1_000, repository: answerTraceRepository, }); const failedQueryRepository = failedQueries ?? createInMemoryFailedQueryRepository({ goldenQuestions: questions, maxFailedQueries: 100_000, }); const failedQueryRecorder = createFailedQueryRecorder({ repository: failedQueryRepository, }); const workflowFailedRetrievalCapture = workflowFailedRetrievalTriage ? createWorkflowFailedRetrievalCaptureService({ answerTraceRecorder, answerTraces: answerTraceRepository, failedQueries: failedQueryRepository, ...(qualityControl?.repository ? { qualityControl: qualityControl.repository } : {}), triage: workflowFailedRetrievalTriage, }) : undefined; const failedQueryTriageRunner = relevanceTriageSignals ? createFailedQueryTriageRunner({ failedQueries: failedQueryRepository, triage: createRelevanceTriage({ signals: relevanceTriageSignals }), }) : undefined; const sessionRepository = sessions ?? createCacheSessionContextRepository({ cache: adapter.cache, }); const documentParser = parser ?? createDefaultParser(); const retentionPolicyRepository = retentionPolicies ?? createInMemoryRetentionPolicyRepository({ maxPolicies: 10_000, }); const storageQuotaRepository = storageQuotas ?? createStaticStorageQuotaRepository({ maxRawDocumentBytes: null }); const outlineRepository = documentOutlines ?? createInMemoryDocumentOutlineRepository({ maxOutlines: 10_000, }); const multimodalManifestRepository = documentMultimodalManifests ?? createInMemoryDocumentMultimodalManifestRepository({ maxManifests: 100_000, }); const outlineBuilder = createDocumentOutlineBuilder({ maxElements: 20_000, maxNodes: 10_000, maxSummaryChars: 2_000, now, }); const multimodalManifestBuilder = createDocumentMultimodalManifestBuilder(); const effectiveDocumentMultimodalManifestEnhancer = documentMultimodalManifestEnhancer ? createCachedDocumentMultimodalManifestEnhancer({ enhancer: documentMultimodalManifestEnhancer, manifests: multimodalManifestRepository, }) : undefined; const computeRuntime = compute ?? createDefaultComputeRuntime(); const accessService = knowledgeSpaceAccess ?? createKnowledgeSpaceAccessService({ repository: createInMemoryKnowledgeSpaceAccessRepository({ maxApiKeysPerSpace: 1_000, maxListLimit: 100, maxMembersPerSpace: 10_000, now, }), }); const spaceAuthorization = createKnowledgeSpaceAuthorizationGuard({ access: accessService, }); if (knowledgeSpaceProfileMigrations && knowledgeSpaceProfileMigrationRepository) { throw new Error( "Configure either knowledgeSpaceProfileMigrations or knowledgeSpaceProfileMigrationRepository, not both", ); } const profileMigrationService = knowledgeSpaceProfileMigrations ?? (knowledgeSpaceProfileMigrationRepository && knowledgeSpaceProfiles && projectionSetPublications ? createKnowledgeSpaceProfileMigrationService({ access: accessService, authorization: spaceAuthorization, ...(deletionLifecycleFence ? { deletionFence: deletionLifecycleFence } : {}), now: () => { const timestamp = Date.parse(now()); if (!Number.isFinite(timestamp)) { throw new Error("Knowledge gateway now() returned an invalid timestamp"); } return timestamp; }, profiles: knowledgeSpaceProfiles, publications: projectionSetPublications, repository: knowledgeSpaceProfileMigrationRepository, }) : undefined); if (knowledgeSpaceProfileMigrationRepository && !profileMigrationService) { throw new Error( "Profile migration repository requires profile and projection publication repositories", ); } if (durableDeletions && durableDeletionRepository) { throw new Error("Configure either durableDeletions or durableDeletionRepository, not both"); } if (durableDeletionRepository && !logicalDocuments) { throw new Error("Durable deletion repository requires the logical document repository"); } if (durableDeletions || durableDeletionRepository) { if (!deletionLifecycleFence) { throw new Error("Durable deletion requires a deletion lifecycle fence"); } if (!deletionObjectWriteAdmission) { throw new Error("Durable deletion requires object-write admission"); } } const durableDeletionService = durableDeletions ?? (durableDeletionRepository ? createDurableDeletionService({ access: accessService, assets, authorization: spaceAuthorization, logicalDocuments, now: () => { const timestamp = Date.parse(now()); if (!Number.isFinite(timestamp)) { throw new Error("Knowledge gateway now() returned an invalid timestamp"); } return timestamp; }, repository: durableDeletionRepository, sources: sourceRepository, spaces, }) : undefined); const apiKeyAuthenticator = createKnowledgeSpaceApiKeyAuthenticator({ access: accessService, authorization: spaceAuthorization, now, }); const researchTaskPartialResults = researchTaskPartials ?? createInMemoryResearchTaskPartialResultRepository({ maxListLimit: 100, maxResults: 100_000, }); const researchTaskProgressEvents = researchTaskProgress ?? createInMemoryResearchTaskProgressRepository({ maxEvents: 100_000, maxListLimit: 100, maxSubscribers: 1_000, }); const researchTaskJobs = researchTasks ?? createResearchTaskJobStateMachine({ generateId: generateResearchTaskJobId, jobs: adapter.jobs, progress: createResearchTaskProgressPublisher({ repository: researchTaskProgressEvents, }), repository: createInMemoryResearchTaskJobRepository({ ...(capabilityGrantProvenance ? { capabilityGrants: capabilityGrantProvenance } : {}), maxJobs: maxResearchTaskJobs, }), }); const dryRunResearchPlanner = researchTaskPlanner ?? createResearchTaskDryRunPlanner({ retrievalPlanner: createRetrievalPlanner({ maxTopK: 100, traces, }), }); const workspaceSnapshotRepository = agentWorkspaceSnapshots ?? createInMemoryAgentWorkspaceSnapshotRepository({ maxCommandLogEntries: 1_000, maxEvidenceBundles: 1_000, maxMounts: 1_000, maxSnapshots: 10_000, maxSourceVersions: 10_000, }); const fsCommands = createKnowledgeFsCommandRegistry({ artifactSegments: segments, assets, compute: computeRuntime, ...(deletionLifecycleFence ? { deletionFence: deletionLifecycleFence } : {}), ...(legacySpacePublicationBootstraps ? { documentMutationAdmissionGuard: legacySpacePublicationBootstraps } : {}), documentMutationLeaseNow: now, graph: graphRepository, ...(effectiveDocumentMultimodalManifestEnhancer ? { multimodalManifestEnhancer: effectiveDocumentMultimodalManifestEnhancer, } : {}), nodes, ...(deletionObjectWriteAdmission ? { objectWriteAdmission: deletionObjectWriteAdmission } : {}), objectStorage: adapter.objectStorage, outlines: outlineRepository, maxTreeDepth: maxKnowledgeFsTreeDepth, parseArtifacts: artifacts, paths, semanticDiffProvider, }); const semanticEntityExtraction = semanticEntityExtractionProvider ? createEntityExtractionFlow({ maxBatchSize: semanticEntityExtractionMaxNodesPerRun, maxEntitiesPerNode: semanticEntityExtractionMaxEntitiesPerNode, model: semanticEntityExtractionModel, nodes, now, provider: semanticEntityExtractionProvider, }) : undefined; const semanticExtractionQuality = semanticEntityExtraction ? createExtractionQualityControlFlow({ maxBatchSize: semanticEntityExtractionMaxNodesPerRun, maxEligibleEntitiesPerNode: semanticEntityExtractionMaxEntitiesPerNode, nodes, now, }) : undefined; const semanticRelationExtraction = semanticEntityExtraction && semanticRelationExtractionProvider ? createRelationExtractionFlow({ maxBatchSize: semanticEntityExtractionMaxNodesPerRun, maxRelationsPerNode: semanticRelationExtractionMaxRelationsPerNode, model: semanticRelationExtractionModel, nodes, now, provider: semanticRelationExtractionProvider, }) : undefined; const semanticCommunityMaterializer = createSemanticCommunityMaterializer({ graph: graphRepository, maxCommunitiesPerRun: 20, maxEntitiesPerRun: semanticEntityExtractionMaxNodesPerRun, maxSourceNodesPerRun: semanticEntityExtractionMaxNodesPerRun, nodes, now, paths, ...(semanticCommunitySummaryProvider ? { summaryProvider: semanticCommunitySummaryProvider } : {}), }); const legacySemanticPostProcessor = semanticEntityExtraction && semanticExtractionQuality ? createSemanticIngestionPostProcessor({ communityMaterializer: semanticCommunityMaterializer, entityExtraction: semanticEntityExtraction, extractionQuality: semanticExtractionQuality, graph: graphRepository, maxNodesPerArtifact: semanticEntityExtractionMaxNodesPerRun, nodes, ...(semanticRelationExtraction ? { relationExtraction: semanticRelationExtraction } : {}), }) : undefined; const semanticPostProcessor = semanticReasoningProviderFactory ? createKnowledgeSpaceSemanticIngestionPostProcessor({ communityMaterializer: semanticCommunityMaterializer, graph: graphRepository, manifests, maxEntitiesPerNode: semanticEntityExtractionMaxEntitiesPerNode, maxNodesPerArtifact: semanticEntityExtractionMaxNodesPerRun, maxOutputTokens: semanticReasoningMaxOutputTokens, maxRelationsPerNode: semanticRelationExtractionMaxRelationsPerNode, nodes, now, providerFactory: semanticReasoningProviderFactory, }) : legacySemanticPostProcessor; const semanticExtractionFlowResolver = semanticReasoningProviderFactory ? createKnowledgeSpaceSemanticExtractionFlowResolver({ manifests, maxEntitiesPerNode: semanticEntityExtractionMaxEntitiesPerNode, maxNodesPerArtifact: semanticEntityExtractionMaxNodesPerRun, maxOutputTokens: semanticReasoningMaxOutputTokens, maxRelationsPerNode: semanticRelationExtractionMaxRelationsPerNode, nodes, now, providerFactory: semanticReasoningProviderFactory, }) : undefined; const semanticOperator = createSemanticOperator({ assets, ...(semanticEntityExtraction ? { entityExtraction: semanticEntityExtraction } : {}), ...(semanticExtractionFlowResolver ? { extractionFlowResolver: semanticExtractionFlowResolver } : {}), ...(semanticExtractionQuality ? { extractionQuality: semanticExtractionQuality } : {}), generatePathId: randomUUID, graph: graphRepository, maxDocumentsPerRun: 100, maxNodesPerRun: semanticEntityExtractionMaxNodesPerRun, nodes, now, paths, ...(semanticRelationExtraction ? { relationExtraction: semanticRelationExtraction } : {}), }); const workspaceReplayService = agentWorkspaceReplay ?? createAgentWorkspaceReplayService({ maxCommands: 1_000, maxOutputSummaryBytes: 4_000, runner: { run: async ({ command, snapshot, traceId }) => { const shell = createSafeShell({ knowledgeSpaceId: snapshot.knowledgeSpaceId, registries: { workspace: fsCommands }, subject: { scopes: [...snapshot.permissionSnapshot.scopes], subjectId: snapshot.permissionSnapshot.subjectId, tenantId: snapshot.permissionSnapshot.tenantId, }, ...(traceId ? { traceId } : {}), }); const result = await shell.execute(command.command); return { outputSummary: summarizeWorkspaceReplayOutput(result.output), }; }, }, snapshots: workspaceSnapshotRepository, }); if (maxUploadBytes < 1 || maxUploadBytes > HARD_DOCUMENT_UPLOAD_MAX_BYTES) { throw new Error( `Document upload maxUploadBytes must be between 1 and ${HARD_DOCUMENT_UPLOAD_MAX_BYTES}`, ); } for (const [name, value] of Object.entries({ maxBulkDeleteDocuments, maxCascadeDeleteArtifacts, maxCascadeDeleteNodes, maxCascadeDeleteProjections, })) { if (!Number.isInteger(value) || value < 1) { throw new Error(`Bulk document delete ${name} must be at least 1`); } } if (!Number.isInteger(maxBulkReindexDocuments) || maxBulkReindexDocuments < 1) { throw new Error("Bulk document reindex maxBulkReindexDocuments must be at least 1"); } if (!Number.isInteger(maxBulkOperations) || maxBulkOperations < 1) { throw new Error("Bulk operation maxBulkOperations must be at least 1"); } if (maxBulkUploadFiles < 1 || maxBulkUploadFiles > HARD_BULK_DOCUMENT_UPLOAD_MAX_FILES) { throw new Error( `Bulk document upload maxBulkUploadFiles must be between 1 and ${HARD_BULK_DOCUMENT_UPLOAD_MAX_FILES}`, ); } const effectiveMaxBulkUploadBytes = maxBulkUploadBytes; if ( effectiveMaxBulkUploadBytes < 1 || effectiveMaxBulkUploadBytes > HARD_BULK_DOCUMENT_UPLOAD_MAX_BYTES ) { throw new Error( `Bulk document upload maxBulkUploadBytes must be between 1 and ${HARD_BULK_DOCUMENT_UPLOAD_MAX_BYTES}`, ); } if (maxKnowledgeFsTreeDepth < 1) { throw new Error("KnowledgeFS tree max depth must be at least 1"); } if (!Number.isInteger(maxLocalQueryNodes) || maxLocalQueryNodes < 1) { throw new Error("Local node query maxLocalQueryNodes must be at least 1"); } if (!Number.isInteger(maxLocalQueryAnswerChars) || maxLocalQueryAnswerChars < 1) { throw new Error("Local node query maxLocalQueryAnswerChars must be at least 1"); } if (!Number.isInteger(maxSynchronousUploadNodes) || maxSynchronousUploadNodes < 1) { throw new Error("Synchronous upload maxSynchronousUploadNodes must be at least 1"); } if (embeddingProvider && !denseEmbeddingModel?.trim() && !embeddingResolver) { throw new Error( "Knowledge gateway denseEmbeddingModel is required when embeddingProvider is configured", ); } if (denseEmbeddingProvider && !denseEmbeddingModel?.trim() && !embeddingResolver) { throw new Error("Knowledge gateway denseEmbeddingModel is required"); } if (visualEmbeddingProvider && !visualEmbeddingModel?.trim()) { throw new Error("Knowledge gateway visualEmbeddingModel is required"); } const bulkOperationRepository = bulkOperations ?? createInMemoryBulkOperationRepository({ maxItems: Math.max(maxBulkDeleteDocuments, maxBulkReindexDocuments, maxBulkUploadFiles), maxOperations: maxBulkOperations, }); // EmbeddingProvider's bounded contract accepts at most 128 texts per request. Keep every // projection builder on the same safe batch size so large documents do not fail after node 128. const synchronousUploadProjectionBatchSize = Math.min(maxSynchronousUploadNodes, 128); const denseProjectionBuilder = (denseEmbeddingProvider && denseEmbeddingModel) || embeddingResolver ? createDenseVectorProjectionBuilder({ ...(denseEmbeddingProvider ? { embeddings: denseEmbeddingProvider } : {}), ...(embeddingResolver ? { embeddingResolver } : {}), maxBatchSize: synchronousUploadProjectionBatchSize, projections: indexProjections, }) : undefined; const visualProjectionBuilder = visualEmbeddingProvider && visualEmbeddingModel ? createVisualEmbeddingProjectionBuilder({ maxBatchSize: synchronousUploadProjectionBatchSize, projections: indexProjections, provider: visualEmbeddingProvider, }) : undefined; const synchronousUploadReindexer = createIncrementalReindexer({ artifacts, compute: computeRuntime, ...(denseProjectionBuilder ? { denseBuilder: denseProjectionBuilder } : {}), ftsBuilder: createFtsProjectionBuilder({ maxBatchSize: synchronousUploadProjectionBatchSize, projections: indexProjections, }), maxNodes: maxSynchronousUploadNodes, maxProjectionBatchSize: synchronousUploadProjectionBatchSize, nodes, operationLeases, projections: indexProjections, ...(visualProjectionBuilder ? { visualBuilder: visualProjectionBuilder } : {}), }); const effectiveQueryGenerator = queryGenerator ?? (allowLocalQueryFallback ? createLocalNodeQueryGenerator({ maxAnswerChars: maxLocalQueryAnswerChars, maxNodes: maxLocalQueryNodes, nodes, }) : undefined); const projectionSnapshotResolver = projectionSetPublications ? createPublishedProjectionReadSnapshotResolver({ publications: projectionSetPublications, ...(legacySpacePublicationBootstraps || pageIndexUpgradeBackfills ? { readiness: [ ...(legacySpacePublicationBootstraps ? [legacySpacePublicationBootstraps] : []), ...(pageIndexUpgradeBackfills ? [pageIndexUpgradeBackfills] : []), ], } : {}), }) : undefined; const legacyAuthMiddleware = createAuthMiddleware( auth ?? createStaticAuthVerifier({ subjectsByToken: {} }), { apiKeys: apiKeyAuthenticator }, ); const authMiddleware: MiddlewareHandler = difyCapabilityV2Auth ? legacyAuthorizationRemoved ? createDifyCapabilityV2GatewayMiddleware(difyCapabilityV2Auth) : createDifyCapabilityV2OrLegacyApiKeyMiddleware( createDifyCapabilityV2GatewayMiddleware(difyCapabilityV2Auth), legacyAuthMiddleware, ) : legacyAuthMiddleware; app.use("*", createTraceMiddleware(traces)); app.use("*", createKnowledgeFsErrorEnvelopeMiddleware()); const internalTransportGuard = createInternalTransportGuardMiddleware(); app.use("/queries", internalTransportGuard); app.use("/research-tasks/:id/events", internalTransportGuard); if (uploadSessions) { app.use("/knowledge-spaces/:id/upload-sessions", internalTransportGuard); app.use("/upload-sessions/:id/*", internalTransportGuard); } app.use("/knowledge-spaces/*", authMiddleware); app.use("/internal/knowledge-spaces/*", authMiddleware); app.use("/internal/capability-grants/*", authMiddleware); app.use("/internal/dify-integration/*", authMiddleware); app.use("/queries/*", authMiddleware); app.use("/jobs/*", authMiddleware); app.use("/research-tasks/*", authMiddleware); app.use("/upload-sessions/*", authMiddleware); app.use("/agent-workspace-snapshots/*", authMiddleware); app.use("/bulk-jobs/*", authMiddleware); app.use("/deletion-jobs/*", authMiddleware); app.use("/retention-policy", authMiddleware); app.use("/source-providers", authMiddleware); app.use("/source-oauth/callback", authMiddleware); if (difyIntegrationFreezes) { app.use( "*", createDifyIntegrationFreezeMiddleware( difyIntegrationFreezes, legacyAuthorizationTrafficMetrics, ), ); } if (difyIntegrationStates) { app.use("*", createDifyIntegrationStateMiddleware(difyIntegrationStates)); } if (capabilityGrantProvenance) { app.use("*", createCapabilityGrantAdmissionMiddleware(capabilityGrantProvenance)); } app.use( "/knowledge-spaces/*", createKnowledgeSpaceAuthorizationMiddleware({ authorization: spaceAuthorization, spaces, }), ); app.use("/knowledge-spaces/*", createRateLimitMiddleware(rateLimiter)); app.use("/queries/*", createRateLimitMiddleware(rateLimiter)); app.use("/jobs/*", createRateLimitMiddleware(rateLimiter)); app.use("/research-tasks/*", createRateLimitMiddleware(rateLimiter)); app.use("/upload-sessions/*", createRateLimitMiddleware(rateLimiter)); app.use("/agent-workspace-snapshots/*", createRateLimitMiddleware(rateLimiter)); app.use("/bulk-jobs/*", createRateLimitMiddleware(rateLimiter)); app.use("/deletion-jobs/*", createRateLimitMiddleware(rateLimiter)); app.use("/retention-policy", createRateLimitMiddleware(rateLimiter)); app.use("/source-providers", createRateLimitMiddleware(rateLimiter)); app.use("/source-oauth/callback", createRateLimitMiddleware(rateLimiter)); registerGatewaySystemHandlers({ adapter, app, componentHealth, computeRuntime, documentParser, readinessChecks, }); if (difyIntegrationFreezes && difyCapabilityV2Auth) { registerDifyIntegrationFreezeHandlers({ app, repository: difyIntegrationFreezes, }); } if (difyIntegrationStates && difyIntegrationFreezes && difyCapabilityV2Auth) { registerDifyIntegrationActivationHandlers({ app, freezes: difyIntegrationFreezes, repository: difyIntegrationStates, }); } if (integratedKnowledgeSpaceProvisioning) { registerIntegratedKnowledgeSpaceProvisioningHandlers({ app, provisioning: integratedKnowledgeSpaceProvisioning, }); } if (capabilityGrantProvenance && difyCapabilityV2Auth) { registerCapabilityRevocationHandlers({ app, grants: capabilityGrantProvenance, }); } if ( capabilityGrantProvenance && difyCapabilityV2Auth && durableDeletionRepository && durableDeletionService ) { registerIntegratedKnowledgeSpaceDeletionHandlers({ app, durableDeletions: durableDeletionService, jobs: durableDeletionRepository, spaces, }); } if (uploadSessions) { registerUploadSessionHandlers({ app, sessions: uploadSessions }); } registerKnowledgeSpaceHandlers({ access: accessService, adapter, app, artifactSegments: segments, authorization: spaceAuthorization, assets, generateGcDryRunId: generateKnowledgeFsGcDryRunId, generateManifestId: generateKnowledgeSpaceManifestId, generateProvisioningKey: generateKnowledgeSpaceProvisioningKey, knowledgeFsLeases: knowledgeFsLeaseRepository, knowledgeFsSessions: knowledgeFsSessionRepository, manifests, ...(knowledgeSpaceProfiles ? { profiles: knowledgeSpaceProfiles } : {}), ...(knowledgeSpaceProvisioning ? { provisioning: knowledgeSpaceProvisioning } : {}), ...(knowledgeSpaceUnpublishedProfileActivations ? { unpublishedProfileActivations: knowledgeSpaceUnpublishedProfileActivations, } : {}), ...(profileMigrationService ? { profileMigrations: profileMigrationService } : {}), ...(knowledgeSpaceProfilePublications ? { profilePublicationBindings: knowledgeSpaceProfilePublications } : {}), ...(projectionSetPublications ? { publishedPublications: projectionSetPublications } : {}), ...(runtimeSnapshotResolver ? { runtimeSnapshotResolver } : {}), ...(modelCapabilityPreflight ? { modelCapabilityPreflight } : {}), nodes, now, operationLeases, parseArtifacts: artifacts, paths, parser: documentParser, projections: indexProjections, spaces, stagedCommits: stagedCommitRepository, }); registerKnowledgeSpaceProductSummaryHandlers({ app, assets, manifests, spaces, }); registerKnowledgeSpaceOverviewHandlers({ access: accessService, app, authorization: spaceAuthorization, now, overview: overviewRepository, spaces, }); registerKnowledgeSpaceProfileMigrationHandlers({ app, ...(profileMigrationService ? { service: profileMigrationService } : {}), }); registerDurableDeletionHandlers({ app, bulkOperations: bulkOperationRepository, maxBulkDeleteDocuments, ...(durableDeletionService ? { service: durableDeletionService } : {}), }); if (!legacyAuthorizationRemoved) { registerKnowledgeSpaceAccessHandlers({ access: accessService, app, authorization: spaceAuthorization, legacyMutationsReadOnly: legacyAccessMutationsReadOnly, spaces, }); } registerModelCapabilityHandlers({ app, ...(modelCapabilityCatalog ? { catalog: modelCapabilityCatalog } : {}), ...(modelCapabilityPreflight ? { preflight: modelCapabilityPreflight } : {}), spaces, }); registerKnowledgeSpaceProfileAuditHandlers({ app, ...(knowledgeSpaceProfiles ? { profiles: knowledgeSpaceProfiles } : {}), spaces, }); registerGoldenQuestionHandlers({ access: accessService, answerTraceRepository, app, assets, authorization: spaceAuthorization, ...(goldenQuestionEvidenceMatcher ? { evidenceMatcher: goldenQuestionEvidenceMatcher } : {}), nodes, now, questions, spaces, }); let qualityReplayRuntime: ReturnType | undefined; if (qualityControl) { if (!retrievalTestExecutor || !runtimeSnapshotResolver) { throw new Error( "Quality replay requires the production retrieval-test executor and published runtime snapshot resolver", ); } qualityReplayRuntime = createQualityReplayRuntime({ access: accessService, answerTraces: answerTraceRepository, ...(capabilityGrantProvenance ? { capabilityGrants: capabilityGrantProvenance } : {}), executor: retrievalTestExecutor, ...(qualityControl.workerIntervalMs ? { intervalMs: qualityControl.workerIntervalMs } : {}), now, repository: qualityControl.repository, runtimeSnapshots: runtimeSnapshotResolver, workerId: qualityControl.workerId, }); qualityReplayRuntime.start(); qualityControl.onRuntime?.(qualityReplayRuntime); } registerQualityControlHandlers({ access: accessService, answerTraces: answerTraceRepository, app, assets, ...(capabilityGrantProvenance ? { capabilityGrants: capabilityGrantProvenance } : {}), goldenQuestions: questions, nodes, ...(qualityControl ? { repository: qualityControl.repository } : {}), ...(runtimeSnapshotResolver ? { runtimeSnapshots: runtimeSnapshotResolver } : {}), spaces, }); registerDocumentReadHandlers({ app, artifacts, assets, ...(effectiveDocumentMultimodalManifestEnhancer ? { multimodalManifestEnhancer: effectiveDocumentMultimodalManifestEnhancer, } : {}), multimodalManifestBuilder, multimodalManifests: multimodalManifestRepository, objectStorage: adapter.objectStorage, outlines: outlineRepository, ...(projectionSetPublicationMembers ? { publicationMembers: projectionSetPublicationMembers } : {}), ...(projectionSetPublications ? { publications: projectionSetPublications } : {}), spaces, }); registerKnowledgeSpaceMetadataHandlers({ app, authorization: spaceAuthorization, ...(metadataFields ? { metadataFields } : {}), now, spaces, }); registerLogicalDocumentHandlers({ access: accessService, app, assets, authorization: spaceAuthorization, ...(documentChunks ? { chunks: documentChunks } : {}), ...(documentChunkState ? { chunkState: documentChunkState } : {}), ...(documentCompilationJobs ? { compilationJobs: documentCompilationJobs } : {}), ...(logicalDocuments ? { logicalDocuments } : {}), ...(metadataFields ? { metadataFields } : {}), now, ...(documentRevisionRollbacks ? { rollbackCoordinator: documentRevisionRollbacks } : {}), ...(documentSettings ? { settings: documentSettings } : {}), ...(documentSettingsChanges ? { settingsChangeCoordinator: documentSettingsChanges } : {}), spaces, ...(documentProcessingTasks ? { tasks: documentProcessingTasks } : {}), }); registerDocumentCompilationHandlers({ access: accessService, app, assets, authorization: spaceAuthorization, documentCompilationJobs, }); registerLegacySpacePublicationBootstrapHandlers({ app, service: legacySpacePublicationBootstrapService, spaces, }); registerPageIndexUpgradeBackfillHandlers({ app, service: pageIndexUpgradeBackfillService, spaces, }); registerTidbFtsPostingBackfillHandlers({ app, service: tidbFtsPostingBackfillService, spaces, }); registerGraphHandlers({ app, ...(projectionSnapshotResolver ? { projectionSnapshotResolver } : {}), ...(runtimeSnapshotResolver ? { runtimeSnapshotResolver } : {}), ...(publishedGraph ? { publishedGraph } : {}), spaces, }); registerAnswerTraceHandlers({ access: accessService, answerTraceRepository, app, assets, authorization: spaceAuthorization, nodes, spaces, }); registerOperationPolicyHandlers({ access: accessService, app, authorization: spaceAuthorization, assets, bulkOperationRepository, documentCompilationJobs, ...(deletionLifecycleFence ? { deletionFence: deletionLifecycleFence } : {}), retentionPolicyRepository, spaces, }); registerQueryHandlers({ access: accessService, answerTraceRecorder, app, ...(autoRetrievalModeResolver ? { autoRetrievalModeResolver } : {}), authorization: spaceAuthorization, ...(failedQueryLowConfidenceScoreFloor !== undefined ? { failedQueryLowConfidenceScoreFloor } : {}), failedQueryRecorder, generateQueryRunId, manifests, overview: overviewRepository, now: () => Date.parse(now()), ...(projectionSnapshotResolver ? { projectionSnapshotResolver } : {}), queryGenerator: effectiveQueryGenerator, ...(queryImageResolver ? { queryImageResolver } : {}), ...(retrievalExecutionLeases ? { retrievalExecutionLeases } : {}), ...(runtimeSnapshotResolver ? { runtimeSnapshotResolver } : {}), sessionRepository, spaces, ...(tidbFtsPostingReadiness ? { tidbFtsPostingReadiness } : {}), }); registerRetrievalTestHandlers({ app, ...(retrievalTestExecutor ? { executor: retrievalTestExecutor } : {}), ...(retrievalExecutionLeases ? { retrievalExecutionLeases } : {}), ...(runtimeSnapshotResolver ? { runtimeSnapshotResolver } : {}), spaces, }); registerFailedQueryHandlers({ access: accessService, app, assets, failedQueries: failedQueryRepository, ...(failedQueryTriageRunner ? { failedQueryTriageRunner } : {}), now, nodes, spaces, }); registerWorkflowFailedRetrievalHandlers({ app, ...(workflowFailedRetrievalCapture ? { service: workflowFailedRetrievalCapture } : {}), spaces, }); registerAgentWorkspaceSnapshotHandlers({ access: accessService, app, assets, authorization: spaceAuthorization, generateAgentWorkspaceSnapshotId, now: () => Date.parse(now()), spaces, workspaceReplayService, workspaceSnapshotRepository, }); registerResearchTaskHandlers({ access: accessService, allowLegacyPermissionSnapshotAdmission: allowLegacyPermissionSnapshotAdmission ?? difyCapabilityV2Auth === undefined, ...(allowLegacyResearchTaskProfileFallback ? { allowLegacyProfileFallback: true } : {}), app, assets, ...(autoRetrievalModeResolver ? { autoRetrievalModeResolver } : {}), authorization: spaceAuthorization, ...(capabilityGrantProvenance ? { capabilityGrants: capabilityGrantProvenance } : {}), ...(researchTaskDirectStream ? { directStream: researchTaskDirectStream } : {}), dryRunResearchPlanner, ...(researchTaskDeletionVisibility ? { deletionVisibility: researchTaskDeletionVisibility } : deletionLifecycleFence ? { deletionVisibility: createDatabaseResearchTaskDeletionVisibility(adapter.database), } : {}), now: () => Date.parse(now()), researchTaskJobs, researchTaskPartialResults, researchTaskProgressEvents, ...(runtimeSnapshotResolver ? { runtimeSnapshotResolver } : {}), spaces, }); registerKnowledgeFsHandlers({ app, fsCommands, spaces, }); registerSemanticOperatorHandlers({ app, operator: semanticOperator, spaces, }); const sourceDocumentStaleWriteScrubber = deletionLifecycleFence ? createSourceDocumentStaleWriteScrubber({ artifactSegments: segments, artifacts, assets, bounds: { maxArtifacts: maxCascadeDeleteArtifacts, maxGraphGenerations: maxCascadeDeleteArtifacts, maxManifests: maxCascadeDeleteArtifacts, maxNodes: maxCascadeDeleteNodes, maxObjects: maxCascadeDeleteProjections, maxOutlines: maxCascadeDeleteArtifacts, maxPaths: maxCascadeDeleteNodes, maxProjections: maxCascadeDeleteProjections, maxSegments: maxCascadeDeleteNodes, }, deletionFence: deletionLifecycleFence, graph: graphRepository, manifests, ...(logicalDocuments ? { logicalDocuments } : {}), multimodalManifests: multimodalManifestRepository, nodes, objectStorage: adapter.objectStorage, outlines: outlineRepository, paths, projections: indexProjections, }) : undefined; registerDocumentWriteHandlers({ access: accessService, adapter, app, artifacts, artifactSegments: segments, assets, authorization: spaceAuthorization, bulkOperationRepository, documentCompilationJobs, ...(deletionLifecycleFence ? { deletionFence: deletionLifecycleFence } : {}), ...(legacySpacePublicationBootstraps ? { documentMutationAdmissionGuard: legacySpacePublicationBootstraps } : {}), ...(denseEmbeddingModel ? { denseEmbeddingModel } : {}), ...(embeddingResolver ? { embeddingResolver } : {}), ...(documentMultimodalLocalAssetAllowlist ? { documentMultimodalLocalAssetAllowlist } : {}), ...(documentMultimodalMaxExtractedAssets ? { documentMultimodalMaxExtractedAssets } : {}), ...(documentMultimodalImageVariantGenerator ? { documentMultimodalImageVariantGenerator } : {}), ...(documentMultimodalMaxLocalAssetBytes ? { documentMultimodalMaxLocalAssetBytes } : {}), ...(documentMultimodalMaxPdfRasterizedAssets ? { documentMultimodalMaxPdfRasterizedAssets } : {}), documentMultimodalManifests: multimodalManifestRepository, documentParser, ...(documentPdfRasterizer ? { documentPdfRasterizer } : {}), effectiveMaxBulkUploadBytes, generateArtifactSegmentId, generateBulkUploadId, generateDocumentAssetId, generateKnowledgePathId: randomUUID, indexProjections, knowledgePaths: paths, knowledgeSpaceManifests: manifests, knowledgeSpaceQuotaUsageReader: quotaUsageReader, ...(logicalDocuments ? { logicalDocuments } : {}), generateKnowledgeSpaceManifestId, maxBulkReindexDocuments, maxBulkUploadFiles, maxUploadBytes, nodes, now, operationLeases, ...(deletionObjectWriteAdmission ? { objectWriteAdmission: deletionObjectWriteAdmission } : {}), outlineBuilder, ...(documentOutlineSummaryEnhancer ? { outlineSummaryEnhancer: documentOutlineSummaryEnhancer } : {}), outlines: outlineRepository, ...(semanticPostProcessor ? { semanticPostProcessor } : {}), ...(sourceDocumentStaleWriteScrubber ? { staleWriteScrubber: sourceDocumentStaleWriteScrubber } : {}), spaces, stagedCommits: stagedCommitRepository, storageQuotaRepository, synchronousUploadReindexer, ...(embeddingProvider && denseEmbeddingModel ? { synchronousUploadDenseModel: denseEmbeddingModel } : {}), traces, ...(visualEmbeddingModel ? { visualEmbeddingModel } : {}), }); const sourceDocumentMaterializer = createSourceDocumentMaterializer({ artifacts, artifactSegments: segments, assets, ...(deletionLifecycleFence ? { deletionFence: deletionLifecycleFence } : {}), ...(legacySpacePublicationBootstraps ? { documentMutationAdmissionGuard: legacySpacePublicationBootstraps } : {}), denseEmbeddingModel, embeddingResolver, documentMultimodalImageVariantGenerator, documentMultimodalLocalAssetAllowlist, documentMultimodalMaxExtractedAssets, documentMultimodalMaxLocalAssetBytes, documentMultimodalMaxPdfRasterizedAssets, documentMultimodalManifests: multimodalManifestRepository, documentParser, documentPdfRasterizer, generateArtifactSegmentId, generateDocumentAssetId, generateKnowledgePathId: randomUUID, knowledgePaths: paths, now, objectStorage: adapter.objectStorage, ...(deletionObjectWriteAdmission ? { objectWriteAdmission: deletionObjectWriteAdmission } : {}), outlineBuilder, outlineSummaryEnhancer: documentOutlineSummaryEnhancer, outlines: outlineRepository, semanticPostProcessor, synchronousUploadDenseModel: embeddingProvider && denseEmbeddingModel ? denseEmbeddingModel : undefined, synchronousUploadReindexer, ...(sourceDocumentStaleWriteScrubber ? { staleWriteScrubber: sourceDocumentStaleWriteScrubber } : {}), traces, visualEmbeddingModel, }); let sourceProductWorkflows: ReturnType | undefined; if (sourceProduct) { if (!deletionLifecycleFence) { throw new Error("Source product workflows require the deletion lifecycle fence"); } if (!logicalDocuments) { throw new Error("Source product workflows require durable logical documents"); } if (sourceSync) { throw new Error("Legacy source sync scheduler cannot run with durable source workflows"); } sourceProductWorkflows = createSourceProductWorkflowService({ access: accessService, authorization: spaceAuthorization, repository: sourceProduct.repository, sources: sourceRepository, }); const sourceWorkflowRuntime = createSourceProductWorkflowRuntime({ access: accessService, ...(capabilityGrantProvenance ? { capabilityGrants: capabilityGrantProvenance } : {}), bulkRemoval: sourceProduct.bulkRemoval, contentStore: createObjectStorageSourceWorkflowContentStore({ storage: adapter.objectStorage, }), deletionFence: deletionLifecycleFence, logicalInventory: logicalDocuments, logicalRevisions: sourceProduct.logicalRevisions, materializer: sourceDocumentMaterializer, ...(onlineDocumentConnector ? { onlineDocuments: onlineDocumentConnector } : {}), ...(onlineDriveConnector ? { onlineDrive: onlineDriveConnector } : {}), repository: sourceProduct.repository, sourceConnections: sourceProduct.connections, sourceProviders: sourceProduct.providers, ...(sourceCredentials ? { sourceCredentials } : {}), sources: sourceRepository, ...(websiteCrawlConnector ? { websiteCrawl: websiteCrawlConnector } : {}), workerId: sourceProduct.workerId, }); const sourceSyncPolicyRuntime = createSourceSyncPolicyRuntime({ repository: sourceProduct.repository, }); sourceWorkflowRuntime.start(); sourceSyncPolicyRuntime.start(); sourceProduct.onWorkflowRuntime?.(sourceWorkflowRuntime); sourceProduct.onSyncPolicyRuntime?.(sourceSyncPolicyRuntime); registerSourceProductHandlers({ app, authorization: spaceAuthorization, connections: sourceProduct.connections, providers: sourceProduct.providers, repository: sourceProduct.repository, workflows: sourceProductWorkflows, }); } registerBackgroundTaskHandlers({ access: accessService, app, authorization: spaceAuthorization, bulkOperations: bulkOperationRepository, ...(documentCompilationJobs ? { documentCompilationJobs } : {}), ...(documentProcessingTasks ? { documentTasks: documentProcessingTasks } : {}), ...(durableDeletionRepository ? { durableDeletionJobs: durableDeletionRepository } : {}), ...(durableDeletionService ? { durableDeletions: durableDeletionService } : {}), ...(sourceProduct ? { sourceRepository: sourceProduct.repository } : {}), ...(sourceProductWorkflows ? { sourceWorkflows: sourceProductWorkflows } : {}), spaces, }); registerSourceHandlers({ app, inlineSourceCredentialsAllowed, ...(onlineDocumentConnector ? { onlineDocumentConnector } : {}), ...(onlineDriveConnector ? { onlineDriveConnector } : {}), ...(sourceCredentialTester ? { sourceCredentialTester } : {}), ...(sourceCredentials ? { sourceCredentials } : {}), ...(sourceProduct ? { sourceConnections: sourceProduct.connections } : {}), ...(sourceProduct ? { sourceProductWorkflows: sourceProduct.repository } : {}), legacyMutationEndpointsEnabled: sourceProduct === undefined, sourceDocumentMaterializer, sources: sourceRepository, spaces, ...(websiteCrawlConnector ? { websiteCrawlConnector } : {}), }); if (sourceSync) { const sourceSyncScheduler = createSourceSyncScheduler({ intervalMs: sourceSync.intervalMs, maxSourcesPerTick: sourceSync.maxSourcesPerTick, runner: createSourceSyncRunner({ ...(onlineDocumentConnector ? { onlineDocumentConnector } : {}), ...(onlineDriveConnector ? { onlineDriveConnector } : {}), ...(sourceCredentials ? { sourceCredentials } : {}), sourceDocumentMaterializer, sources: sourceRepository, ...(websiteCrawlConnector ? { websiteCrawlConnector } : {}), }), sources: sourceRepository, }); sourceSyncScheduler.start(); sourceSync.onScheduler?.(sourceSyncScheduler); } app.get("/openapi.json", (context) => context.json( completeKnowledgeGatewayOpenApiDocument( app.getOpenAPI31Document(knowledgeGatewayOpenApiDocument), ), ), ); return app; }