{
  "@context": [
    "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld",
    "https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
    "https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld"
  ],
  "import": [
    "./main.json",
    "./xpod.base.json",
    "./terminal.json"
  ],
  "@graph": [
    {
      "comment": "Xpod 统一配置 - 通过环境变量切换 Cloud/Local/Standalone 模式",
      "@id": "urn:undefineds:xpod:Config",
      "@type": "Void"
    },
    {
      "comment": "定义 oidcIssuer 变量（外部 OIDC issuer 基础 URL）；Local 模式仍由本地提供 account/consent/SP 页面",
      "@id": "urn:solid-server:default:variable:oidcIssuer",
      "@type": "Variable"
    },
    {
      "comment": "MultiDomainIdentifierStrategy - 支持多域名（Cloud 模式）",
      "@id": "urn:undefineds:xpod:MultiDomainIdentifierStrategy",
      "@type": "MultiDomainIdentifierStrategy",
      "primaryBaseUrl": {
        "@id": "urn:solid-server:default:variable:baseUrl"
      },
      "additionalBaseUrls": [
        {
          "@id": "urn:solid-server:default:variable:oidcIssuer"
        }
      ]
    },
    {
      "comment": "SingleRootIdentifierStrategy - 单域名（SP 模式）",
      "@id": "urn:undefineds:xpod:SingleRootIdentifierStrategy",
      "@type": "SingleRootIdentifierStrategy",
      "baseUrl": {
        "@id": "urn:solid-server:default:variable:baseUrl"
      }
    },
    {
      "comment": "Override: 使用 MultiDomainIdentifierStrategy 替换默认策略（用于 Cloud 模式）",
      "@type": "Override",
      "overrideInstance": {
        "@id": "urn:solid-server:default:IdentifierStrategy"
      },
      "overrideParameters": {
        "@id": "urn:undefineds:xpod:MultiDomainIdentifierStrategy"
      }
    },
    {
      "comment": "Auto-detect OIDC pass-through - 有 oidcIssuer 时也保持本地 CSS OIDC discovery/token/JWKS 同源",
      "@id": "urn:undefineds:xpod:AutoDetectOidcHandler",
      "@type": "AutoDetectOidcHandler",
      "options_oidcIssuer": {
        "@id": "urn:solid-server:default:variable:oidcIssuer"
      },
      "options_cacheMs": 300000
    },
    {
      "comment": "CSS 原生 IdentityProvider parsing handler，始终用于本地 account/consent/WebID 选择页面",
      "@id": "urn:undefineds:xpod:SourceIdentityProviderHandler",
      "@type": "RouterHandler",
      "baseUrl": {
        "@id": "urn:solid-server:default:variable:baseUrl"
      },
      "targetExtractor": {
        "@id": "urn:solid-server:default:TargetExtractor"
      },
      "allowedPathNames": [
        "^/.account(/.*)?$"
      ],
      "handler": {
        "@id": "urn:solid-server:default:IdentityProviderParsingHandler"
      }
    },
    {
      "comment": "Auto-detect Identity Provider Handler",
      "@id": "urn:undefineds:xpod:AutoDetectIdentityProviderHandler",
      "@type": "AutoDetectIdentityProviderHandler",
      "options_oidcIssuer": {
        "@id": "urn:solid-server:default:variable:oidcIssuer"
      },
      "options_source": {
        "@id": "urn:undefineds:xpod:SourceIdentityProviderHandler"
      }
    },
    {
      "comment": "Override: 使用 AutoDetectIdentityProviderHandler 替换默认 Handler",
      "@type": "Override",
      "overrideInstance": {
        "@id": "urn:solid-server:default:IdentityProviderHandler"
      },
      "overrideParameters": {
        "@id": "urn:undefineds:xpod:AutoDetectIdentityProviderHandler"
      }
    },
    {
      "comment": "Quota service backed by identity DB, no env defaults = unlimited",
      "@id": "urn:undefineds:xpod:QuotaService",
      "@type": "DrizzleQuotaService",
      "DrizzleQuotaService:_options_identityDbUrl": {
        "@id": "urn:solid-server:default:variable:identityDbUrl"
      }
    },
    {
      "@id": "urn:solid-server:default:variable:rootFilePath",
      "@value": "./data"
    },
    {
      "comment": "VectorStore using the canonical Local RDF SQLite file.",
      "@id": "urn:undefineds:xpod:VectorStore",
      "@type": "SqliteVectorStore",
      "options_connectionString": {
        "@id": "urn:solid-server:default:variable:rdfIndexPath",
        "@type": "Variable"
      }
    },
    {
      "comment": "Vector HTTP Handler",
      "@id": "urn:undefineds:xpod:VectorHttpHandler",
      "@type": "VectorHttpHandler",
      "vectorStore": { "@id": "urn:undefineds:xpod:VectorStore" },
      "credentialsExtractor": { "@id": "urn:solid-server:default:CredentialsExtractor" },
      "permissionReader": { "@id": "urn:solid-server:default:PermissionReader" },
      "authorizer": { "@id": "urn:solid-server:default:Authorizer" }
    },
    {
      "comment": "Local FTS index sharing the canonical RDF SQLite file.",
      "@id": "urn:undefineds:xpod:RdfTextIndex",
      "@type": "RdfTextIndex",
      "options_path": {
        "@id": "urn:solid-server:default:variable:rdfIndexPath",
        "@type": "Variable"
      }
    },
    {
      "comment": "Local vector index sharing the canonical RDF SQLite file.",
      "@id": "urn:undefineds:xpod:RdfVectorIndex",
      "@type": "RdfVectorIndex",
      "options_path": {
        "@id": "urn:solid-server:default:variable:rdfIndexPath",
        "@type": "Variable"
      },
      "options_defaultMetric": "cosine"
    },
    {
      "comment": "Persistent native-only QLever process backed by the canonical RDF SQLite file.",
      "@id": "urn:undefineds:xpod:LocalQleverNativeSparqlClient",
      "@type": "LocalQleverNativeSparqlClient",
      "options_args": [
        "--sqlite-path",
        {
          "@id": "urn:solid-server:default:variable:rdfIndexPath",
          "@type": "Variable"
        }
      ]
    },
    {
      "comment": "RDF facts, FTS, VEC, and native QLever share one Local SQLite file.",
      "@id": "urn:undefineds:xpod:SolidRdfEngine",
      "@type": "SolidRdfEngine",
      "index_path": {
        "@id": "urn:solid-server:default:variable:rdfIndexPath",
        "@type": "Variable"
      },
      "textIndex": {
        "@id": "urn:undefineds:xpod:RdfTextIndex"
      },
      "vectorIndex": {
        "@id": "urn:undefineds:xpod:RdfVectorIndex"
      },
      "nativeSparqlClient": {
        "@id": "urn:undefineds:xpod:LocalQleverNativeSparqlClient"
      },
      "autoOpen": true
    },
    {
      "comment": "Default SPARQL engine: every server-owned Pod query requires native QLever.",
      "@id": "urn:undefineds:xpod:DefaultSparqlEngine",
      "@type": "QleverSparqlEngine",
      "rdfEngine": { "@id": "urn:undefineds:xpod:SolidRdfEngine" }
    },
    {
      "comment": "MixDataAccessor for RDF and binary data.",
      "@id": "urn:undefineds:xpod:MixDataAccessor",
      "@type": "MixDataAccessor",
      "structuredDataAccessor": { "@id": "urn:undefineds:xpod:SolidRdfDataAccessor" },
      "unstructuredDataAccessor": { "@id": "urn:solid-server:default:FileDataAccessor" },
      "textSearchIndexingEnabled": true,
      "rdfSearchIntentSink": { "@id": "urn:undefineds:xpod:RdfSearchIntentSink" }
    },
    {
      "comment": "Default structured RDF data accessor backed directly by SolidRdfEngine.",
      "@id": "urn:undefineds:xpod:SolidRdfDataAccessor",
      "@type": "SolidRdfDataAccessor",
      "rdfEngine": { "@id": "urn:undefineds:xpod:SolidRdfEngine" },
      "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" }
    },
    {
      "comment": "Override: ResourceStore 使用 RDF authority accessor",
      "@type": "Override",
      "overrideInstance": { "@id": "urn:solid-server:default:ResourceStore_Backend" },
      "overrideParameters": {
        "@type": "SparqlUpdateResourceStore",
        "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" },
        "auxiliaryStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" },
        "metadataStrategy": { "@id": "urn:solid-server:default:MetadataStrategy" },
        "accessor": { "@id": "urn:undefineds:xpod:MixDataAccessor" }
      }
    },
    {
      "comment": "Override: Converting store 只转换 RDF 类型",
      "@type": "Override",
      "overrideInstance": { "@id": "urn:solid-server:default:ResourceStore_Converting" },
      "overrideParameters": {
        "@type": "RepresentationPartialConvertingStore",
        "source": { "@id": "urn:solid-server:default:ResourceStore_Backend" },
        "metadataStrategy": { "@id": "urn:solid-server:default:MetadataStrategy" },
        "options_inConverter": { "@id": "urn:solid-server:default:RepresentationConverter" },
        "options_outConverter": { "@id": "urn:solid-server:default:RepresentationConverter" },
        "options_inPreferences_type": {
          "RepresentationPartialConvertingStore:_options_inPreferences_type_key": "internal/quads",
          "RepresentationPartialConvertingStore:_options_inPreferences_type_value": 1
        }
      }
    },
    {
      "comment": "Override: 使用内存锁",
      "@type": "Override",
      "overrideInstance": { "@id": "urn:solid-server:default:ResourceLocker" },
      "overrideParameters": {
        "@type": "WrappedExpiringReadWriteLocker",
        "locker": {
          "@type": "GreedyReadWriteLocker",
          "locker": { "@type": "MemoryResourceLocker" },
          "storage": { "@type": "MemoryMapStorage" }
        },
        "expiration": 6000
      }
    },
    {
      "comment": "Override: 使用 SQLite KeyValueStorage",
      "@type": "Override",
      "overrideInstance": { "@id": "urn:solid-server:default:KeyValueStorage" },
      "overrideParameters": {
        "@type": "SqliteKeyValueStorage",
        "path": { "@id": "urn:solid-server:default:variable:identityDbUrl" }
      }
    },
    {
      "comment": "注册开关 - Cloud/Standalone 可启用，Local 由本地 account/consent 流程决定",
      "@id": "urn:solid-server:default:variable:registration",
      "@type": "Variable"
    },
    {
      "comment": "HTTP Pipeline",
      "@type": "Override",
      "overrideInstance": { "@id": "urn:solid-server:default:BaseHttpHandler" },
      "overrideParameters": {
        "@type": "StatusWaterfallHandler",
        "handlers": [
          { "@id": "urn:undefineds:xpod:SubgraphSparqlHttpHandler" },
          { "@id": "urn:undefineds:xpod:VectorHttpHandler" },
          { "@id": "urn:undefineds:xpod:TerminalHttpHandler" },
          { "@id": "urn:undefineds:xpod:AppStaticAssetHandler" },
          { "@id": "urn:solid-server:default:StaticAssetHandler" },
          {
            "comment": "Local 模式下 OIDC discovery/token/JWKS 全部由 CSS 默认 OIDC handler 处理，避免本地 token 与外部 JWKS 错配",
            "@id": "urn:undefineds:xpod:AutoDetectOidcHandler"
          },
          { "@id": "urn:solid-server:default:OidcHandler" },
          { "@id": "urn:solid-server:default:NotificationHttpHandler" },
          { "@id": "urn:solid-server:default:StorageDescriptionHandler" },
          { "@id": "urn:solid-server:default:AuthResourceHttpHandler" },
          { "@id": "urn:solid-server:default:IdentityProviderHandler" },
          { "@id": "urn:solid-server:default:LdpHandler" }
        ]
      }
    }
  ]
}
