@undefineds.co/xpod 0.2.45 → 0.3.1
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/agents/AgentExecutorFactory.js +12 -13
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +31 -3
- package/dist/agents/config/agent-meta-schema.js +37 -3
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/index.d.ts +5 -5
- package/dist/agents/config/index.js +7 -6
- package/dist/agents/config/index.js.map +1 -1
- package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
- package/dist/agents/config/parse-agent-instructions.js +23 -0
- package/dist/agents/config/parse-agent-instructions.js.map +1 -0
- package/dist/agents/config/resolve.d.ts +7 -12
- package/dist/agents/config/resolve.js +272 -156
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/config/types.d.ts +33 -36
- package/dist/agents/config/types.js +4 -4
- package/dist/agents/config/types.js.map +1 -1
- package/dist/agents/index.d.ts +2 -7
- package/dist/agents/index.js +4 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +2 -2
- package/dist/agents/types.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +9 -14
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/api/ApiServer.d.ts +7 -0
- package/dist/api/ApiServer.js +5 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +1 -1
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +8 -0
- package/dist/api/chatkit/index.js +15 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +80 -17
- package/dist/api/chatkit/pod-store.js +816 -162
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
- package/dist/api/chatkit/schema.d.ts +53 -133
- package/dist/api/chatkit/schema.js +11 -175
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/chatkit/service.d.ts +15 -9
- package/dist/api/chatkit/service.js +82 -234
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +35 -3
- package/dist/api/chatkit/store.js +157 -3
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +16 -2
- package/dist/api/chatkit/types.js +24 -5
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +59 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +15 -0
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +11 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +26 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/InngestHandler.d.ts +11 -0
- package/dist/api/handlers/InngestHandler.js +19 -0
- package/dist/api/handlers/InngestHandler.js.map +1 -0
- package/dist/api/handlers/RunHandler.d.ts +7 -0
- package/dist/api/handlers/RunHandler.js +169 -0
- package/dist/api/handlers/RunHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/models/namespaces.d.ts +2 -2
- package/dist/api/models/namespaces.js +1 -4
- package/dist/api/models/namespaces.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
- package/dist/api/runs/AgentRuntimeTypes.js +3 -0
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
- package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
- package/dist/api/runs/EmbeddedInngestService.js +203 -0
- package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
- package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
- package/dist/api/runs/ManagedRunWorker.js +452 -0
- package/dist/api/runs/ManagedRunWorker.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
- package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
- package/dist/api/runs/RunAuthContextRegistry.js +59 -0
- package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
- package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
- package/dist/api/runs/RunExecutionBackend.js +3 -0
- package/dist/api/runs/RunExecutionBackend.js.map +1 -0
- package/dist/api/runs/RunStateCenter.d.ts +82 -0
- package/dist/api/runs/RunStateCenter.js +665 -0
- package/dist/api/runs/RunStateCenter.js.map +1 -0
- package/dist/api/runs/schema.d.ts +55 -0
- package/dist/api/runs/schema.js +14 -0
- package/dist/api/runs/schema.js.map +1 -0
- package/dist/api/runs/store.d.ts +105 -0
- package/dist/api/runs/store.js +116 -0
- package/dist/api/runs/store.js.map +1 -0
- package/dist/api/runtime.d.ts +2 -0
- package/dist/api/runtime.js +40 -1
- package/dist/api/runtime.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -0
- package/dist/api/service/VectorStoreService.js +27 -34
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/service/provider-registry.d.ts +1 -1
- package/dist/api/service/provider-registry.js +1 -1
- package/dist/api/service/provider-registry.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
- package/dist/api/tasks/InngestTaskScheduler.js +209 -0
- package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
- package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
- package/dist/api/tasks/TaskAuthBinding.js +162 -0
- package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
- package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
- package/dist/api/tasks/TaskMaterializer.js +452 -0
- package/dist/api/tasks/TaskMaterializer.js.map +1 -0
- package/dist/api/tasks/TaskService.d.ts +57 -0
- package/dist/api/tasks/TaskService.js +235 -0
- package/dist/api/tasks/TaskService.js.map +1 -0
- package/dist/api/tasks/index.d.ts +6 -0
- package/dist/api/tasks/index.js +25 -0
- package/dist/api/tasks/index.js.map +1 -0
- package/dist/api/tasks/schema.d.ts +23 -0
- package/dist/api/tasks/schema.js +8 -0
- package/dist/api/tasks/schema.js.map +1 -0
- package/dist/api/tasks/store.d.ts +40 -0
- package/dist/api/tasks/store.js +34 -0
- package/dist/api/tasks/store.js.map +1 -0
- package/dist/api/workspace/types.d.ts +3 -0
- package/dist/api/workspace/types.js +23 -0
- package/dist/api/workspace/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -7
- package/dist/cli/commands/config.js +72 -48
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/login.d.ts +10 -8
- package/dist/cli/commands/login.js +84 -84
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/index.js +3 -124
- package/dist/cli/index.js.map +1 -1
- package/dist/http/search/SearchHttpHandler.js +13 -18
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/storage/vector/VectorIndexingListener.js +13 -18
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/dist/vocab/index.d.ts +2 -6
- package/dist/vocab/index.js +2 -6
- package/dist/vocab/index.js.map +1 -1
- package/dist/vocab/udfs.d.ts +12 -0
- package/dist/vocab/udfs.js +12 -0
- package/dist/vocab/udfs.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
- package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +9 -3
- package/dist/agents/AgentManager.d.ts +0 -116
- package/dist/agents/AgentManager.js +0 -290
- package/dist/agents/AgentManager.js.map +0 -1
- package/dist/agents/IndexAgent.d.ts +0 -70
- package/dist/agents/IndexAgent.js +0 -417
- package/dist/agents/IndexAgent.js.map +0 -1
- package/dist/agents/config/parse-agent-md.d.ts +0 -33
- package/dist/agents/config/parse-agent-md.js +0 -75
- package/dist/agents/config/parse-agent-md.js.map +0 -1
- package/dist/agents/schema/agent-config.d.ts +0 -2
- package/dist/agents/schema/agent-config.js +0 -32
- package/dist/agents/schema/agent-config.js.map +0 -1
- package/dist/agents/schema/create-agent-schema.d.ts +0 -25
- package/dist/agents/schema/create-agent-schema.js +0 -35
- package/dist/agents/schema/create-agent-schema.js.map +0 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
- package/dist/cli/lib/agent-session.d.ts +0 -37
- package/dist/cli/lib/agent-session.js +0 -211
- package/dist/cli/lib/agent-session.js.map +0 -1
- package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
- package/dist/cli/lib/ensure-ai-credentials.js +0 -40
- package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
- package/dist/cli/lib/model-manager.d.ts +0 -37
- package/dist/cli/lib/model-manager.js +0 -251
- package/dist/cli/lib/model-manager.js.map +0 -1
- package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
- package/dist/cli/lib/oauth-credential-manager.js +0 -129
- package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
- package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
- package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
- package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
- package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
- package/dist/cli/lib/oauth-providers/index.js +0 -23
- package/dist/cli/lib/oauth-providers/index.js.map +0 -1
- package/dist/cli/lib/pi-optional.d.ts +0 -84
- package/dist/cli/lib/pi-optional.js +0 -35
- package/dist/cli/lib/pi-optional.js.map +0 -1
- package/dist/cli/lib/pod-ai-config.d.ts +0 -26
- package/dist/cli/lib/pod-ai-config.js +0 -99
- package/dist/cli/lib/pod-ai-config.js.map +0 -1
- package/dist/cli/lib/pod-thread-store.d.ts +0 -57
- package/dist/cli/lib/pod-thread-store.js +0 -312
- package/dist/cli/lib/pod-thread-store.js.map +0 -1
- package/dist/cli/lib/secretary-prompt.d.ts +0 -6
- package/dist/cli/lib/secretary-prompt.js +0 -85
- package/dist/cli/lib/secretary-prompt.js.map +0 -1
- package/dist/task/DrizzleTaskQueue.d.ts +0 -56
- package/dist/task/DrizzleTaskQueue.js +0 -171
- package/dist/task/DrizzleTaskQueue.js.map +0 -1
- package/dist/task/TaskExecutor.d.ts +0 -82
- package/dist/task/TaskExecutor.js +0 -198
- package/dist/task/TaskExecutor.js.map +0 -1
- package/dist/task/index.d.ts +0 -10
- package/dist/task/index.js +0 -20
- package/dist/task/index.js.map +0 -1
- package/dist/task/schema.d.ts +0 -53
- package/dist/task/schema.js +0 -71
- package/dist/task/schema.js.map +0 -1
- package/dist/task/types.d.ts +0 -186
- package/dist/task/types.js +0 -12
- package/dist/task/types.js.map +0 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.VectorStoreService = void 0;
|
|
4
4
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
5
|
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
6
|
+
const models_1 = require("@undefineds.co/models");
|
|
6
7
|
const crypto_1 = require("crypto");
|
|
7
8
|
const AuthContext_1 = require("../auth/AuthContext");
|
|
8
9
|
const solid_client_authn_node_1 = require("@inrupt/solid-client-authn-node");
|
|
@@ -116,7 +117,7 @@ class VectorStoreService {
|
|
|
116
117
|
if (!db) {
|
|
117
118
|
throw new Error('Failed to authenticate with Pod');
|
|
118
119
|
}
|
|
119
|
-
const store = await db.
|
|
120
|
+
const store = await db.findById(schema_1.VectorStore, id);
|
|
120
121
|
if (!store) {
|
|
121
122
|
throw new Error(`Vector store ${id} not found`);
|
|
122
123
|
}
|
|
@@ -146,7 +147,7 @@ class VectorStoreService {
|
|
|
146
147
|
updates.name = request.name;
|
|
147
148
|
if (request.chunking_strategy !== undefined)
|
|
148
149
|
updates.chunkingStrategy = request.chunking_strategy;
|
|
149
|
-
await db.
|
|
150
|
+
await db.updateById(schema_1.VectorStore, id, updates);
|
|
150
151
|
return this.getVectorStore(id, auth);
|
|
151
152
|
}
|
|
152
153
|
/**
|
|
@@ -157,7 +158,7 @@ class VectorStoreService {
|
|
|
157
158
|
if (!db) {
|
|
158
159
|
throw new Error('Failed to authenticate with Pod');
|
|
159
160
|
}
|
|
160
|
-
await db.
|
|
161
|
+
await db.deleteById(schema_1.VectorStore, id);
|
|
161
162
|
this.logger.info(`Deleted vector store ${id}`);
|
|
162
163
|
return {
|
|
163
164
|
id,
|
|
@@ -195,7 +196,7 @@ class VectorStoreService {
|
|
|
195
196
|
if (existingFiles.length > 0) {
|
|
196
197
|
// 文件已存在,更新状态
|
|
197
198
|
fileIndexId = existingFiles[0].id;
|
|
198
|
-
await db.
|
|
199
|
+
await db.updateById(schema_1.IndexedFile, fileIndexId, {
|
|
199
200
|
status: schema_1.FileIndexStatus.IN_PROGRESS,
|
|
200
201
|
chunkingStrategy,
|
|
201
202
|
indexedAt: new Date(),
|
|
@@ -230,7 +231,7 @@ class VectorStoreService {
|
|
|
230
231
|
// 存储向量
|
|
231
232
|
await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);
|
|
232
233
|
// 更新索引记录为 completed
|
|
233
|
-
await db.
|
|
234
|
+
await db.updateById(schema_1.IndexedFile, fileIndexId, {
|
|
234
235
|
status: schema_1.FileIndexStatus.COMPLETED,
|
|
235
236
|
usageBytes: content.length,
|
|
236
237
|
lastError: null,
|
|
@@ -241,7 +242,7 @@ class VectorStoreService {
|
|
|
241
242
|
catch (error) {
|
|
242
243
|
// 更新索引记录为 failed
|
|
243
244
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
244
|
-
await db.
|
|
245
|
+
await db.updateById(schema_1.IndexedFile, fileIndexId, {
|
|
245
246
|
status: schema_1.FileIndexStatus.FAILED,
|
|
246
247
|
lastError: errorMsg,
|
|
247
248
|
});
|
|
@@ -298,7 +299,7 @@ class VectorStoreService {
|
|
|
298
299
|
await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);
|
|
299
300
|
}
|
|
300
301
|
// 删除索引记录
|
|
301
|
-
await db.
|
|
302
|
+
await db.deleteById(schema_1.IndexedFile, fileRecord.id);
|
|
302
303
|
this.logger.info(`Removed file index ${fileUrl}`);
|
|
303
304
|
return { deleted: true };
|
|
304
305
|
}
|
|
@@ -478,11 +479,10 @@ class VectorStoreService {
|
|
|
478
479
|
return parts[parts.length - 1] || '';
|
|
479
480
|
}
|
|
480
481
|
extractModelId(uri) {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
return uri;
|
|
482
|
+
return (0, models_1.normalizeAIConfigModelId)(uri);
|
|
483
|
+
}
|
|
484
|
+
modelUri(model, provider = 'openai') {
|
|
485
|
+
return (0, models_1.aiConfigModelRef)(provider, model);
|
|
486
486
|
}
|
|
487
487
|
getPodBaseUrl(webId) {
|
|
488
488
|
const url = new URL(webId);
|
|
@@ -551,23 +551,18 @@ class VectorStoreService {
|
|
|
551
551
|
// 获取 provider 信息
|
|
552
552
|
let baseUrl;
|
|
553
553
|
let proxyUrl;
|
|
554
|
-
|
|
554
|
+
let provider = (0, models_1.normalizeAIConfigProviderId)(activeCred.provider || activeCred.id);
|
|
555
|
+
if (provider) {
|
|
555
556
|
const providers = await db.select().from(schema_1.Provider);
|
|
556
|
-
const
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
providerByUri.set(p.id, p);
|
|
562
|
-
}
|
|
563
|
-
const provider = providerByUri.get(activeCred.provider);
|
|
564
|
-
if (provider) {
|
|
565
|
-
baseUrl = provider.baseUrl || undefined;
|
|
566
|
-
proxyUrl = provider.proxyUrl || undefined;
|
|
557
|
+
const selection = (0, models_1.selectAIConfigCredential)(provider, credentials, providers);
|
|
558
|
+
if (selection) {
|
|
559
|
+
provider = selection.providerId;
|
|
560
|
+
baseUrl = selection.baseUrl;
|
|
561
|
+
proxyUrl = selection.proxyUrl;
|
|
567
562
|
}
|
|
568
563
|
}
|
|
569
564
|
return {
|
|
570
|
-
provider: activeCred.id,
|
|
565
|
+
provider: provider || activeCred.id,
|
|
571
566
|
apiKey: activeCred.apiKey,
|
|
572
567
|
baseUrl,
|
|
573
568
|
proxyUrl,
|
|
@@ -625,18 +620,16 @@ class VectorStoreService {
|
|
|
625
620
|
const currentModel = currentConfig?.embeddingModel;
|
|
626
621
|
// 检查模型是否有变化
|
|
627
622
|
const modelChanged = currentModel && currentModel !== newModel;
|
|
628
|
-
const
|
|
629
|
-
const podBaseUrl = this.getPodBaseUrl(webId);
|
|
630
|
-
const modelUri = `${podBaseUrl}settings/ai/models.ttl#${newModel}`;
|
|
623
|
+
const modelUri = this.modelUri(newModel);
|
|
631
624
|
try {
|
|
632
625
|
// 检查配置是否已存在
|
|
633
626
|
const configs = await db.select().from(schema_1.AIConfig);
|
|
634
627
|
const existingConfig = configs.find((c) => c.id === 'config');
|
|
635
628
|
if (existingConfig) {
|
|
636
629
|
// 更新现有配置
|
|
637
|
-
await db.
|
|
630
|
+
await db.updateById(schema_1.AIConfig, 'config', {
|
|
638
631
|
embeddingModel: modelUri,
|
|
639
|
-
previousModel: modelChanged ?
|
|
632
|
+
previousModel: modelChanged ? this.modelUri(currentModel) : existingConfig.previousModel,
|
|
640
633
|
migrationStatus: modelChanged ? schema_1.MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,
|
|
641
634
|
migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,
|
|
642
635
|
updatedAt: new Date(),
|
|
@@ -687,7 +680,7 @@ class VectorStoreService {
|
|
|
687
680
|
const totalFiles = allFiles.length;
|
|
688
681
|
if (totalFiles === 0) {
|
|
689
682
|
// 无文件需要迁移
|
|
690
|
-
await db.
|
|
683
|
+
await db.updateById(schema_1.AIConfig, 'config', {
|
|
691
684
|
migrationStatus: schema_1.MigrationStatus.COMPLETED,
|
|
692
685
|
migrationProgress: 100,
|
|
693
686
|
updatedAt: new Date(),
|
|
@@ -709,14 +702,14 @@ class VectorStoreService {
|
|
|
709
702
|
}
|
|
710
703
|
// 更新迁移进度
|
|
711
704
|
const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);
|
|
712
|
-
await db.
|
|
705
|
+
await db.updateById(schema_1.AIConfig, 'config', {
|
|
713
706
|
migrationProgress: progress,
|
|
714
707
|
updatedAt: new Date(),
|
|
715
708
|
});
|
|
716
709
|
}
|
|
717
710
|
// 标记迁移完成
|
|
718
711
|
const finalStatus = failedFiles === 0 ? schema_1.MigrationStatus.COMPLETED : schema_1.MigrationStatus.FAILED;
|
|
719
|
-
await db.
|
|
712
|
+
await db.updateById(schema_1.AIConfig, 'config', {
|
|
720
713
|
migrationStatus: finalStatus,
|
|
721
714
|
migrationProgress: 100,
|
|
722
715
|
updatedAt: new Date(),
|
|
@@ -725,7 +718,7 @@ class VectorStoreService {
|
|
|
725
718
|
}
|
|
726
719
|
catch (error) {
|
|
727
720
|
this.logger.error(`Migration error: ${error}`);
|
|
728
|
-
await db.
|
|
721
|
+
await db.updateById(schema_1.AIConfig, 'config', {
|
|
729
722
|
migrationStatus: schema_1.MigrationStatus.FAILED,
|
|
730
723
|
updatedAt: new Date(),
|
|
731
724
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorStoreService.js","sourceRoot":"","sources":["../../../src/api/service/VectorStoreService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport { randomBytes } from 'crypto';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId, isSolidAuth } from '../auth/AuthContext';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { AiCredential } from '../../ai/service/types';\nimport { Session } from '@inrupt/solid-client-authn-node';\n\nimport {\n AIConfig,\n VectorStore,\n IndexedFile,\n Model,\n Provider,\n VectorStoreStatus,\n ChunkingStrategy,\n FileIndexStatus,\n MigrationStatus,\n} from '../../ai/schema';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n aiConfig: AIConfig,\n vectorStore: VectorStore,\n indexedFile: IndexedFile,\n model: Model,\n provider: Provider,\n credential: Credential,\n};\n\n// ============================================\n// Types - OpenAI Compatible\n// ============================================\n\n/**\n * 创建 Vector Store 请求\n */\nexport interface CreateVectorStoreRequest {\n /** 知识库名称 */\n name?: string;\n /** Container URL */\n url: string;\n /** Chunking 策略 */\n chunking_strategy?: 'auto' | 'static';\n /** 元数据 */\n metadata?: Record<string, string>;\n}\n\n/**\n * 修改 Vector Store 请求\n */\nexport interface ModifyVectorStoreRequest {\n name?: string;\n chunking_strategy?: 'auto' | 'static';\n metadata?: Record<string, string>;\n}\n\n/**\n * Vector Store 对象(OpenAI 兼容格式)\n */\nexport interface VectorStoreObject {\n id: string;\n object: 'vector_store';\n created_at: number;\n name: string;\n status: 'in_progress' | 'completed' | 'expired';\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n last_active_at: number | null;\n metadata: Record<string, string>;\n // Xpod 扩展字段\n url: string;\n chunking_strategy: string;\n}\n\n/**\n * Pod AI 配置\n */\nexport interface PodAIConfig {\n embeddingModel: string;\n migrationStatus: 'idle' | 'in_progress' | 'completed' | 'failed';\n previousModel?: string;\n migrationProgress?: number;\n}\n\n/**\n * 搜索请求\n */\nexport interface SearchRequest {\n query: string | string[];\n max_num_results?: number;\n filters?: Record<string, any>;\n ranking_options?: {\n ranker?: string;\n score_threshold?: number;\n };\n rewrite_query?: boolean;\n}\n\n/**\n * 搜索结果\n */\nexport interface SearchResult {\n file_id: string;\n file_url: string;\n filename: string;\n score: number;\n attributes: Record<string, any>;\n content: Array<{ type: 'text'; text: string }>;\n}\n\nexport interface VectorStoreServiceOptions {\n /** CSS base URL */\n cssBaseUrl: string;\n /** Token endpoint for login */\n tokenEndpoint: string;\n /** Embedding service */\n embeddingService: EmbeddingService;\n /** Webhook URL for receiving notifications (optional) */\n webhookUrl?: string;\n}\n\n/**\n * VectorStoreService - 知识库管理服务\n *\n * 提供 OpenAI 兼容的 Vector Store API\n */\nexport class VectorStoreService {\n private readonly logger = getLoggerFor(this);\n private readonly cssBaseUrl: string;\n private readonly tokenEndpoint: string;\n private readonly embeddingService: EmbeddingService;\n private readonly webhookUrl?: string;\n\n public constructor(options: VectorStoreServiceOptions) {\n this.cssBaseUrl = options.cssBaseUrl.replace(/\\/$/, '');\n this.tokenEndpoint = options.tokenEndpoint;\n this.embeddingService = options.embeddingService;\n this.webhookUrl = options.webhookUrl;\n }\n\n // ============================================\n // Vector Store CRUD\n // ============================================\n\n /**\n * 创建 Vector Store(配置文件夹为知识库)\n */\n public async createVectorStore(\n request: CreateVectorStoreRequest,\n auth: AuthContext,\n accessToken?: string,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 生成 ID\n const id = this.generateId();\n const now = new Date();\n const containerUri = request.url;\n\n // 插入记录(不再存储 model,model 从全局配置获取)\n await db.insert(VectorStore).values({\n id,\n name: request.name || this.extractContainerName(containerUri),\n container: containerUri,\n chunkingStrategy: request.chunking_strategy || ChunkingStrategy.AUTO,\n status: VectorStoreStatus.COMPLETED,\n createdAt: now,\n lastActiveAt: now,\n });\n\n this.logger.info(`Created vector store ${id} for container ${containerUri}`);\n\n // 尝试注册 webhook 订阅(如果配置了 webhookUrl)\n if (this.webhookUrl && accessToken) {\n try {\n await this.subscribeToContainer(containerUri, accessToken);\n this.logger.info(`Subscribed to container ${containerUri} for webhook notifications`);\n } catch (error) {\n // 订阅失败不影响 VectorStore 创建,只记录警告\n this.logger.warn(`Failed to subscribe to container ${containerUri}: ${error}`);\n }\n }\n\n return this.buildVectorStoreObject(id, {\n name: request.name || this.extractContainerName(containerUri),\n containerUrl: containerUri,\n chunkingStrategy: request.chunking_strategy || 'auto',\n status: 'completed',\n createdAt: now,\n lastActiveAt: now,\n });\n }\n\n /**\n * 列出所有 Vector Store\n */\n public async listVectorStores(\n auth: AuthContext,\n options?: { limit?: number; order?: 'asc' | 'desc'; after?: string; before?: string },\n ): Promise<{ object: 'list'; data: VectorStoreObject[]; has_more: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const stores = await db.select().from(VectorStore) as any[];\n\n // 排序\n const order = options?.order || 'desc';\n stores.sort((a: any, b: any) => {\n const aTime = a.createdAt?.getTime() || 0;\n const bTime = b.createdAt?.getTime() || 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n const limit = options?.limit || 20;\n const data = stores.slice(0, limit).map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n\n return {\n object: 'list',\n data,\n has_more: stores.length > limit,\n };\n }\n\n /**\n * 获取单个 Vector Store\n */\n public async getVectorStore(id: string, auth: AuthContext): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const store = await db.findByLocator(VectorStore, { id });\n if (!store) {\n throw new Error(`Vector store ${id} not found`);\n }\n\n // 获取 file_counts(基于 Container 前缀匹配)\n const fileCounts = await this.getFileCounts(store.container || '', auth);\n\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n fileCounts,\n });\n }\n\n /**\n * 修改 Vector Store\n */\n public async modifyVectorStore(\n id: string,\n request: ModifyVectorStoreRequest,\n auth: AuthContext,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 构建更新数据(不再支持修改 model,model 是全局配置)\n const updates: Partial<typeof VectorStore.$inferInsert> = {};\n if (request.name !== undefined) updates.name = request.name;\n if (request.chunking_strategy !== undefined) updates.chunkingStrategy = request.chunking_strategy;\n\n await db.updateByLocator(VectorStore, { id }, updates);\n\n return this.getVectorStore(id, auth);\n }\n\n /**\n * 删除 Vector Store\n */\n public async deleteVectorStore(\n id: string,\n auth: AuthContext,\n ): Promise<{ id: string; object: 'vector_store.deleted'; deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n await db.deleteByLocator(VectorStore, { id });\n\n this.logger.info(`Deleted vector store ${id}`);\n\n return {\n id,\n object: 'vector_store.deleted',\n deleted: true,\n };\n }\n\n // ============================================\n // File Index Management (for webhook)\n // ============================================\n\n /**\n * 索引文件(由 webhook 调用)\n *\n * @param vectorStoreId Vector Store ID\n * @param fileUrl 文件 URL\n * @param auth 认证上下文\n * @param accessToken 访问令牌\n */\n public async indexFile(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ id: string; status: string; vectorId: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置(embedding model)\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n throw new Error('No AI configuration found. Please configure an embedding model first.');\n }\n\n // 查找最近的父级 VectorStore 获取分块策略\n const chunkingStrategy = await this.getChunkingStrategyForFile(fileUrl, auth);\n\n // 检查文件是否已索引\n const existingFiles = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n const vectorId = this.hashSubjectAspect(fileUrl, 'content');\n let fileIndexId: string;\n\n if (existingFiles.length > 0) {\n // 文件已存在,更新状态\n fileIndexId = existingFiles[0].id;\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.IN_PROGRESS,\n chunkingStrategy,\n indexedAt: new Date(),\n });\n } else {\n // 创建新的索引记录\n fileIndexId = `idx_${randomBytes(8).toString('hex')}`;\n await db.insert(IndexedFile).values({\n id: fileIndexId,\n fileUrl,\n vectorId,\n chunkingStrategy,\n status: FileIndexStatus.IN_PROGRESS,\n usageBytes: 0,\n indexedAt: new Date(),\n });\n }\n\n try {\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 读取文件内容\n const content = await this.fetchResourceContent(fileUrl, accessToken);\n if (!content || content.trim().length === 0) {\n throw new Error(`File ${fileUrl} has no indexable content`);\n }\n\n // 生成 embedding(使用全局 model)\n const embedding = await this.embeddingService.embed(content, credential, aiConfig.embeddingModel);\n\n // 存储向量\n await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);\n\n // 更新索引记录为 completed\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.COMPLETED,\n usageBytes: content.length,\n lastError: null,\n });\n\n this.logger.info(`Indexed file ${fileUrl} with model ${aiConfig.embeddingModel}`);\n\n return { id: fileIndexId, status: 'completed', vectorId };\n } catch (error) {\n // 更新索引记录为 failed\n const errorMsg = error instanceof Error ? error.message : String(error);\n await db.updateByLocator(IndexedFile, { id: fileIndexId }, {\n status: FileIndexStatus.FAILED,\n lastError: errorMsg,\n });\n\n this.logger.error(`Failed to index file ${fileUrl}: ${errorMsg}`);\n throw error;\n }\n }\n\n /**\n * 获取文件应使用的分块策略(查找最近的父级 VectorStore)\n */\n private async getChunkingStrategyForFile(fileUrl: string, auth: AuthContext): Promise<string> {\n const db = await this.getPodDb(auth);\n if (!db) return ChunkingStrategy.AUTO;\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 找到所有是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n if (matchedStores.length === 0) {\n return ChunkingStrategy.AUTO;\n }\n\n // 找最长前缀(最近的父级)\n matchedStores.sort((a: any, b: any) => (b.container?.length || 0) - (a.container?.length || 0));\n return matchedStores[0].chunkingStrategy || ChunkingStrategy.AUTO;\n }\n\n /**\n * 删除文件索引(由 webhook 调用)\n */\n public async removeFileIndex(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n this.logger.warn(`No AI config found, cannot delete vector for ${fileUrl}`);\n return { deleted: false };\n }\n\n // 查找文件索引记录\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n if (files.length === 0) {\n this.logger.warn(`File index record not found for ${fileUrl}`);\n return { deleted: false };\n }\n\n const fileRecord = files[0];\n\n // 从向量存储中删除\n if (fileRecord.vectorId) {\n await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);\n }\n\n // 删除索引记录\n await db.deleteByLocator(IndexedFile, { id: fileRecord.id });\n\n this.logger.info(`Removed file index ${fileUrl}`);\n return { deleted: true };\n }\n\n /**\n * 获取 Container 下的 file_counts 统计(基于 fileUrl 前缀匹配)\n */\n public async getFileCounts(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<{ in_progress: number; completed: number; failed: number; cancelled: number; total: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n return { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 };\n }\n\n // 获取所有索引文件,过滤属于该 Container 的\n const allFiles = await db.select().from(IndexedFile) as any[];\n const containerPrefix = containerUrl.endsWith('/') ? containerUrl : containerUrl + '/';\n const files = allFiles.filter((f: any) => f.fileUrl?.startsWith(containerPrefix));\n\n const counts = {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: files.length,\n };\n\n for (const file of files) {\n switch (file.status) {\n case FileIndexStatus.IN_PROGRESS:\n counts.in_progress++;\n break;\n case FileIndexStatus.COMPLETED:\n counts.completed++;\n break;\n case FileIndexStatus.FAILED:\n counts.failed++;\n break;\n case FileIndexStatus.CANCELLED:\n counts.cancelled++;\n break;\n }\n }\n\n return counts;\n }\n\n /**\n * 通过 vectorId 查找文件 URL(供 search 使用)\n * 注意:文件只索引一份,用 vectorId 即可查找\n */\n public async getFileUrlByVectorId(\n vectorId: number,\n auth: AuthContext,\n ): Promise<string | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.vectorId, vectorId),\n );\n\n return files.length > 0 ? files[0].fileUrl : null;\n }\n\n /**\n * 根据 Container URL 查找 VectorStore\n */\n public async findVectorStoreByContainer(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const stores = await db.select().from(VectorStore).where(\n eq(VectorStore.container, containerUrl),\n );\n\n if (stores.length === 0) return null;\n\n const store = stores[0];\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n });\n }\n\n /**\n * 根据文件 URL 查找所有匹配的 VectorStore(包括父级容器)\n *\n * 例如:文件 https://alice.pod/A/B/c.txt 会匹配:\n * - https://alice.pod/A/B/ (直接父级)\n * - https://alice.pod/A/ (祖先级)\n * - https://alice.pod/ (Pod 根)\n *\n * 这样文件可以被索引到多个知识库中\n */\n public async findVectorStoresByFileUrl(\n fileUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject[]> {\n const db = await this.getPodDb(auth);\n if (!db) return [];\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 过滤出 container 是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n // 确保 container URL 以 / 结尾\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n // 转换为 VectorStoreObject\n return matchedStores.map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n }\n\n // ============================================\n // Search\n // ============================================\n\n /**\n * 搜索 Vector Store\n */\n public async search(\n vectorStoreId: string,\n request: SearchRequest,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ object: 'vector_store.search_results.page'; search_query: string; data: SearchResult[]; has_more: boolean }> {\n const store = await this.getVectorStore(vectorStoreId, auth);\n\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 获取全局 AI 配置中的 embedding model\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig?.embeddingModel) {\n throw new Error('No embedding model configured. Please set up AI configuration first.');\n }\n\n const queryText = Array.isArray(request.query) ? request.query.join(' ') : request.query;\n\n // 生成 query embedding(使用全局模型)\n const queryEmbedding = await this.embeddingService.embed(queryText, credential, aiConfig.embeddingModel);\n\n // 调用 CSS vector search,使用 subjectPrefix 过滤只搜索该 VectorStore 的文件\n const limit = request.max_num_results || 10;\n const results = await this.searchVectors(aiConfig.embeddingModel, queryEmbedding, limit, accessToken, {\n subjectPrefix: store.url, // Container URL 作为 subject 前缀\n });\n\n // 构建搜索结果,使用 vectorId -> fileUrl 映射\n const searchResults: SearchResult[] = [];\n for (const r of results) {\n const vectorId = typeof r.id === 'number' ? r.id : parseInt(String(r.id), 10);\n const fileUrl = await this.getFileUrlByVectorId(vectorId, auth);\n\n searchResults.push({\n file_id: String(r.id),\n file_url: fileUrl || '',\n filename: fileUrl ? this.extractFilename(fileUrl) : '',\n score: r.score,\n attributes: {},\n content: [], // TODO: 可选返回内容片段\n });\n }\n\n return {\n object: 'vector_store.search_results.page',\n search_query: queryText,\n data: searchResults,\n has_more: false,\n };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private generateId(): string {\n return `vs_${randomBytes(12).toString('hex')}`;\n }\n\n /**\n * Hash subject + aspect 为向量 ID(供 webhook 索引使用)\n */\n public hashSubjectAspect(subject: string, aspect: string): number {\n const str = `${subject}|${aspect}`;\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return Math.abs(hash);\n }\n\n private extractContainerName(url: string): string {\n const parts = url.replace(/\\/$/, '').split('/');\n return parts[parts.length - 1] || 'Unnamed';\n }\n\n private extractFilename(url: string): string {\n const parts = url.split('/');\n return parts[parts.length - 1] || '';\n }\n\n private extractModelId(uri: string): string {\n const hashIndex = uri.lastIndexOf('#');\n if (hashIndex !== -1) {\n return uri.slice(hashIndex + 1);\n }\n return uri;\n }\n\n private getPodBaseUrl(webId: string): string {\n const url = new URL(webId);\n url.hash = '';\n let path = url.pathname;\n if (path.endsWith('/profile/card')) {\n path = path.slice(0, -'/profile/card'.length);\n }\n if (!path.endsWith('/')) {\n path = path + '/';\n }\n return `${url.origin}${path}`;\n }\n\n private buildVectorStoreObject(\n id: string,\n data: {\n name: string;\n containerUrl: string;\n chunkingStrategy: string;\n status: 'in_progress' | 'completed' | 'expired';\n createdAt: Date;\n lastActiveAt: Date | null;\n fileCounts?: { in_progress: number; completed: number; failed: number; cancelled: number; total: number };\n usageBytes?: number;\n },\n ): VectorStoreObject {\n return {\n id,\n object: 'vector_store',\n created_at: Math.floor(data.createdAt.getTime() / 1000),\n name: data.name,\n status: data.status,\n usage_bytes: data.usageBytes || 0,\n file_counts: data.fileCounts || {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: 0,\n },\n last_active_at: data.lastActiveAt ? Math.floor(data.lastActiveAt.getTime() / 1000) : null,\n metadata: {},\n url: data.containerUrl,\n chunking_strategy: data.chunkingStrategy,\n };\n }\n\n private async getPodDb(auth: AuthContext): Promise<any | null> {\n if (!isSolidAuth(auth) || !auth.clientId || !auth.clientSecret) {\n this.logger.debug('No clientId or clientSecret in auth context');\n return null;\n }\n\n const session = new Session();\n try {\n await session.login({\n oidcIssuer: new URL(this.tokenEndpoint).origin,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n });\n\n if (!session.info.isLoggedIn || !session.info.webId) {\n throw new Error('Login failed');\n }\n\n return drizzle({ fetch: session.fetch, info: { webId: session.info.webId, isLoggedIn: true } } as any, { schema }) as any;\n } catch (error) {\n this.logger.error(`Failed to login: ${error}`);\n return null;\n }\n }\n\n private async getAiCredential(auth: AuthContext): Promise<AiCredential | undefined> {\n const db = await this.getPodDb(auth);\n if (!db) return undefined;\n\n try {\n const credentials = await db.select().from(Credential).where(\n eq(Credential.service, ServiceType.AI),\n );\n\n const activeCred = credentials.find((c: any) => c.status === CredentialStatus.ACTIVE);\n if (!activeCred || !activeCred.apiKey) return undefined;\n\n // 获取 provider 信息\n let baseUrl: string | undefined;\n let proxyUrl: string | undefined;\n\n if (activeCred.provider) {\n const providers = await db.select().from(Provider);\n const providerByUri = new Map<string, any>();\n for (const p of providers) {\n const uri = (p as any)['@id'] as string | undefined;\n if (uri) providerByUri.set(uri, p);\n providerByUri.set(p.id, p);\n }\n const provider = providerByUri.get(activeCred.provider);\n if (provider) {\n baseUrl = provider.baseUrl || undefined;\n proxyUrl = provider.proxyUrl || undefined;\n }\n }\n\n return {\n provider: activeCred.id,\n apiKey: activeCred.apiKey,\n baseUrl,\n proxyUrl,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI credential: ${error}`);\n return undefined;\n }\n }\n\n /**\n * 获取 Pod 级别的 AI 配置(全局 embedding model)\n */\n public async getAIConfig(auth: AuthContext): Promise<PodAIConfig | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n try {\n const configs = await db.select().from(AIConfig);\n const config = configs.find((c: any) => c.id === 'config');\n\n if (!config || !config.embeddingModel) {\n // 如果没有配置,尝试使用默认模型\n const models = await db.select().from(Model);\n const defaultModel = models.find((m: any) => m.modelType === 'embedding') || models[0];\n if (defaultModel) {\n return {\n embeddingModel: defaultModel.id,\n migrationStatus: 'idle',\n };\n }\n return null;\n }\n\n return {\n embeddingModel: this.extractModelId(config.embeddingModel),\n migrationStatus: (config.migrationStatus as any) || 'idle',\n previousModel: config.previousModel ? this.extractModelId(config.previousModel) : undefined,\n migrationProgress: config.migrationProgress || undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI config: ${error}`);\n return null;\n }\n }\n\n /**\n * 设置全局 embedding model\n * 如果更换了模型,自动触发迁移(后台重新索引所有文件)\n */\n public async setEmbeddingModel(\n newModel: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ success: boolean; migrationTriggered: boolean; message: string }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const currentConfig = await this.getAIConfig(auth);\n const currentModel = currentConfig?.embeddingModel;\n\n // 检查模型是否有变化\n const modelChanged = currentModel && currentModel !== newModel;\n\n const webId = getWebId(auth) ?? getAccountId(auth) ?? '';\n const podBaseUrl = this.getPodBaseUrl(webId);\n const modelUri = `${podBaseUrl}settings/ai/models.ttl#${newModel}`;\n\n try {\n // 检查配置是否已存在\n const configs = await db.select().from(AIConfig);\n const existingConfig = configs.find((c: any) => c.id === 'config');\n\n if (existingConfig) {\n // 更新现有配置\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n embeddingModel: modelUri,\n previousModel: modelChanged ? `${podBaseUrl}settings/ai/models.ttl#${currentModel}` : existingConfig.previousModel,\n migrationStatus: modelChanged ? MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,\n migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,\n updatedAt: new Date(),\n });\n } else {\n // 创建新配置\n await db.insert(AIConfig).values({\n id: 'config',\n embeddingModel: modelUri,\n migrationStatus: MigrationStatus.IDLE,\n migrationProgress: 0,\n updatedAt: new Date(),\n });\n }\n\n this.logger.info(`Set embedding model to ${newModel}`);\n\n // 如果模型变化,在后台启动迁移\n if (modelChanged) {\n this.logger.info(`Model changed from ${currentModel} to ${newModel}, triggering migration`);\n // 异步执行迁移,不阻塞响应\n this.startMigration(auth, accessToken).catch(error => {\n this.logger.error(`Migration failed: ${error}`);\n });\n }\n\n return {\n success: true,\n migrationTriggered: modelChanged === true,\n message: modelChanged\n ? `Model updated to ${newModel}. Migration started to re-index all files.`\n : `Model set to ${newModel}.`,\n };\n } catch (error) {\n this.logger.error(`Failed to set embedding model: ${error}`);\n throw error;\n }\n }\n\n /**\n * 开始迁移:重新索引所有文件\n */\n private async startMigration(auth: AuthContext, accessToken: string): Promise<void> {\n const db = await this.getPodDb(auth);\n if (!db) return;\n\n try {\n // 获取所有已索引的文件\n const allFiles = await db.select().from(IndexedFile);\n const totalFiles = allFiles.length;\n\n if (totalFiles === 0) {\n // 无文件需要迁移\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: MigrationStatus.COMPLETED,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n return;\n }\n\n this.logger.info(`Starting migration for ${totalFiles} files`);\n\n let completedFiles = 0;\n let failedFiles = 0;\n\n for (const file of allFiles) {\n try {\n // 重新索引每个文件\n await this.indexFile(file.fileUrl, auth, accessToken);\n completedFiles++;\n } catch (error) {\n failedFiles++;\n this.logger.error(`Failed to re-index ${file.fileUrl}: ${error}`);\n }\n\n // 更新迁移进度\n const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationProgress: progress,\n updatedAt: new Date(),\n });\n }\n\n // 标记迁移完成\n const finalStatus = failedFiles === 0 ? MigrationStatus.COMPLETED : MigrationStatus.FAILED;\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: finalStatus,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n\n this.logger.info(`Migration completed: ${completedFiles} success, ${failedFiles} failed`);\n } catch (error) {\n this.logger.error(`Migration error: ${error}`);\n await db.updateByLocator(AIConfig, { id: 'config' }, {\n migrationStatus: MigrationStatus.FAILED,\n updatedAt: new Date(),\n });\n }\n }\n\n /**\n * 获取资源内容(供 webhook 索引使用)\n */\n public async fetchResourceContent(url: string, accessToken: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'text/turtle, application/ld+json, text/plain, text/markdown, text/html, */*',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n const contentType = response.headers.get('Content-Type') || '';\n const body = await response.text();\n return this.extractText(body, contentType);\n }\n\n private extractText(body: string, contentType: string): string {\n const ct = contentType.toLowerCase();\n\n if (ct.includes('text/turtle') || ct.includes('application/n-triples')) {\n return this.extractTextFromTurtle(body);\n }\n if (ct.includes('application/ld+json') || ct.includes('application/json')) {\n return this.extractTextFromJsonLd(body);\n }\n if (ct.includes('text/html')) {\n return this.extractTextFromHtml(body);\n }\n return body;\n }\n\n private extractTextFromTurtle(turtle: string): string {\n const literals: string[] = [];\n const tripleQuoteRegex = /\"\"\"([^]*?)\"\"\"/g;\n const singleQuoteRegex = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g;\n\n let match;\n while ((match = tripleQuoteRegex.exec(turtle)) !== null) {\n if (match[1].trim().length > 0) literals.push(match[1].trim());\n }\n\n const withoutTriple = turtle.replace(/\"\"\"[^]*?\"\"\"/g, '');\n while ((match = singleQuoteRegex.exec(withoutTriple)) !== null) {\n const value = match[1].trim();\n if (value.length > 3 && !value.startsWith('http') && !value.startsWith('urn:')) {\n literals.push(value);\n }\n }\n return literals.join('\\n');\n }\n\n private extractTextFromJsonLd(jsonStr: string): string {\n try {\n const json = JSON.parse(jsonStr);\n const texts: string[] = [];\n const extract = (obj: any): void => {\n if (typeof obj === 'string' && obj.length > 3 && !obj.startsWith('http')) {\n texts.push(obj);\n } else if (Array.isArray(obj)) {\n obj.forEach(extract);\n } else if (obj && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n if (!key.startsWith('@')) extract(value);\n }\n }\n };\n extract(json);\n return texts.join('\\n');\n } catch {\n return jsonStr;\n }\n }\n\n private extractTextFromHtml(html: string): string {\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<[^>]+>/g, ' ');\n text = text.replace(/\\s+/g, ' ').trim();\n return text;\n }\n\n /**\n * Upsert 向量到 CSS(供 webhook 索引使用)\n */\n public async upsertVector(model: string, id: number, vector: number[], accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/upsert`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, vectors: [{ id, vector }] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector upsert failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 删除向量(供 webhook 索引使用)\n */\n public async deleteVector(model: string, id: number, accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/delete`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, ids: [id] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector delete failed: ${response.status} ${errorText}`);\n }\n }\n\n private async searchVectors(\n model: string,\n vector: number[],\n limit: number,\n accessToken: string,\n options?: { subjectPrefix?: string },\n ): Promise<any[]> {\n const url = `${this.cssBaseUrl}/-/vector/search`;\n \n const body: Record<string, any> = { model, vector, limit };\n \n // 添加 subject 前缀过滤(限定搜索范围到特定 Container)\n if (options?.subjectPrefix) {\n body.filter = {\n subject: { $startsWith: options.subjectPrefix },\n };\n }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Vector search failed: ${response.status}`);\n }\n\n const data = await response.json() as { results?: any[] };\n return data.results || [];\n }\n\n // ============================================\n // Webhook Subscription\n // ============================================\n\n /**\n * 订阅 Container 的变更通知(WebhookChannel2023)\n *\n * @param containerUrl Container URL\n * @param accessToken 访问令牌\n */\n private async subscribeToContainer(containerUrl: string, accessToken: string): Promise<void> {\n if (!this.webhookUrl) {\n throw new Error('Webhook URL not configured');\n }\n\n // 1. 发现订阅端点\n const subscriptionEndpoint = await this.discoverNotificationEndpoint(containerUrl, accessToken);\n if (!subscriptionEndpoint) {\n throw new Error(`No notification endpoint found for ${containerUrl}`);\n }\n\n // 2. 创建 webhook 订阅\n const subscriptionRequest = {\n '@context': ['https://www.w3.org/ns/solid/notification/v1'],\n type: 'WebhookChannel2023',\n topic: containerUrl,\n sendTo: this.webhookUrl,\n };\n\n const response = await fetch(subscriptionEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/ld+json',\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(subscriptionRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Subscription failed: ${response.status} ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.info(`Created webhook subscription: ${JSON.stringify(result)}`);\n }\n\n /**\n * 发现 Solid Notification 端点\n *\n * 通过 HEAD 请求获取 Link header 中的 describedby,然后获取订阅端点\n */\n private async discoverNotificationEndpoint(resourceUrl: string, accessToken: string): Promise<string | null> {\n // 方法 1:直接使用已知的 CSS 端点格式\n // CSS 的 webhook 订阅端点通常是 /.notifications/WebhookChannel2023/\n const url = new URL(resourceUrl);\n const webhookEndpoint = `${url.origin}/.notifications/WebhookChannel2023/`;\n\n // 验证端点是否存在\n try {\n const response = await fetch(webhookEndpoint, {\n method: 'GET',\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (response.ok) {\n return webhookEndpoint;\n }\n } catch {\n // 忽略错误,尝试其他方法\n }\n\n // 方法 2:通过 describedby Link header 发现\n try {\n const headResponse = await fetch(resourceUrl, {\n method: 'HEAD',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const linkHeader = headResponse.headers.get('Link');\n if (linkHeader) {\n // 解析 Link header 找 describedby\n const describedBy = this.parseLinkHeader(linkHeader, 'describedby');\n if (describedBy) {\n // 获取 describedby 资源,解析通知端点\n const descResponse = await fetch(describedBy, {\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n if (descResponse.ok) {\n const desc = await descResponse.json() as any;\n // 查找 notify:subscription 或类似属性\n const subscription = desc['notify:subscription'] || desc['subscription'];\n if (subscription) {\n return typeof subscription === 'string' ? subscription : subscription['@id'];\n }\n }\n }\n }\n } catch {\n // 忽略错误\n }\n\n return null;\n }\n\n /**\n * 解析 Link header\n */\n private parseLinkHeader(linkHeader: string, rel: string): string | null {\n const links = linkHeader.split(',');\n for (const link of links) {\n const match = link.match(/<([^>]+)>.*rel=\"?([^\";]+)\"?/);\n if (match && match[2] === rel) {\n return match[1];\n }\n }\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"VectorStoreService.js","sourceRoot":"","sources":["../../../src/api/service/VectorStoreService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport { aiConfigModelRef, normalizeAIConfigModelId, normalizeAIConfigProviderId, selectAIConfigCredential } from '@undefineds.co/models';\nimport { randomBytes } from 'crypto';\nimport type { AuthContext } from '../auth/AuthContext';\nimport { getWebId, getAccountId, isSolidAuth } from '../auth/AuthContext';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { AiCredential } from '../../ai/service/types';\nimport { Session } from '@inrupt/solid-client-authn-node';\n\nimport {\n AIConfig,\n VectorStore,\n IndexedFile,\n Model,\n Provider,\n VectorStoreStatus,\n ChunkingStrategy,\n FileIndexStatus,\n MigrationStatus,\n} from '../../ai/schema';\nimport { Credential } from '../../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n aiConfig: AIConfig,\n vectorStore: VectorStore,\n indexedFile: IndexedFile,\n model: Model,\n provider: Provider,\n credential: Credential,\n};\n\n// ============================================\n// Types - OpenAI Compatible\n// ============================================\n\n/**\n * 创建 Vector Store 请求\n */\nexport interface CreateVectorStoreRequest {\n /** 知识库名称 */\n name?: string;\n /** Container URL */\n url: string;\n /** Chunking 策略 */\n chunking_strategy?: 'auto' | 'static';\n /** 元数据 */\n metadata?: Record<string, string>;\n}\n\n/**\n * 修改 Vector Store 请求\n */\nexport interface ModifyVectorStoreRequest {\n name?: string;\n chunking_strategy?: 'auto' | 'static';\n metadata?: Record<string, string>;\n}\n\n/**\n * Vector Store 对象(OpenAI 兼容格式)\n */\nexport interface VectorStoreObject {\n id: string;\n object: 'vector_store';\n created_at: number;\n name: string;\n status: 'in_progress' | 'completed' | 'expired';\n usage_bytes: number;\n file_counts: {\n in_progress: number;\n completed: number;\n failed: number;\n cancelled: number;\n total: number;\n };\n last_active_at: number | null;\n metadata: Record<string, string>;\n // Xpod 扩展字段\n url: string;\n chunking_strategy: string;\n}\n\n/**\n * Pod AI 配置\n */\nexport interface PodAIConfig {\n embeddingModel: string;\n migrationStatus: 'idle' | 'in_progress' | 'completed' | 'failed';\n previousModel?: string;\n migrationProgress?: number;\n}\n\n/**\n * 搜索请求\n */\nexport interface SearchRequest {\n query: string | string[];\n max_num_results?: number;\n filters?: Record<string, any>;\n ranking_options?: {\n ranker?: string;\n score_threshold?: number;\n };\n rewrite_query?: boolean;\n}\n\n/**\n * 搜索结果\n */\nexport interface SearchResult {\n file_id: string;\n file_url: string;\n filename: string;\n score: number;\n attributes: Record<string, any>;\n content: Array<{ type: 'text'; text: string }>;\n}\n\nexport interface VectorStoreServiceOptions {\n /** CSS base URL */\n cssBaseUrl: string;\n /** Token endpoint for login */\n tokenEndpoint: string;\n /** Embedding service */\n embeddingService: EmbeddingService;\n /** Webhook URL for receiving notifications (optional) */\n webhookUrl?: string;\n}\n\n/**\n * VectorStoreService - 知识库管理服务\n *\n * 提供 OpenAI 兼容的 Vector Store API\n */\nexport class VectorStoreService {\n private readonly logger = getLoggerFor(this);\n private readonly cssBaseUrl: string;\n private readonly tokenEndpoint: string;\n private readonly embeddingService: EmbeddingService;\n private readonly webhookUrl?: string;\n\n public constructor(options: VectorStoreServiceOptions) {\n this.cssBaseUrl = options.cssBaseUrl.replace(/\\/$/, '');\n this.tokenEndpoint = options.tokenEndpoint;\n this.embeddingService = options.embeddingService;\n this.webhookUrl = options.webhookUrl;\n }\n\n // ============================================\n // Vector Store CRUD\n // ============================================\n\n /**\n * 创建 Vector Store(配置文件夹为知识库)\n */\n public async createVectorStore(\n request: CreateVectorStoreRequest,\n auth: AuthContext,\n accessToken?: string,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 生成 ID\n const id = this.generateId();\n const now = new Date();\n const containerUri = request.url;\n\n // 插入记录(不再存储 model,model 从全局配置获取)\n await db.insert(VectorStore).values({\n id,\n name: request.name || this.extractContainerName(containerUri),\n container: containerUri,\n chunkingStrategy: request.chunking_strategy || ChunkingStrategy.AUTO,\n status: VectorStoreStatus.COMPLETED,\n createdAt: now,\n lastActiveAt: now,\n });\n\n this.logger.info(`Created vector store ${id} for container ${containerUri}`);\n\n // 尝试注册 webhook 订阅(如果配置了 webhookUrl)\n if (this.webhookUrl && accessToken) {\n try {\n await this.subscribeToContainer(containerUri, accessToken);\n this.logger.info(`Subscribed to container ${containerUri} for webhook notifications`);\n } catch (error) {\n // 订阅失败不影响 VectorStore 创建,只记录警告\n this.logger.warn(`Failed to subscribe to container ${containerUri}: ${error}`);\n }\n }\n\n return this.buildVectorStoreObject(id, {\n name: request.name || this.extractContainerName(containerUri),\n containerUrl: containerUri,\n chunkingStrategy: request.chunking_strategy || 'auto',\n status: 'completed',\n createdAt: now,\n lastActiveAt: now,\n });\n }\n\n /**\n * 列出所有 Vector Store\n */\n public async listVectorStores(\n auth: AuthContext,\n options?: { limit?: number; order?: 'asc' | 'desc'; after?: string; before?: string },\n ): Promise<{ object: 'list'; data: VectorStoreObject[]; has_more: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const stores = await db.select().from(VectorStore) as any[];\n\n // 排序\n const order = options?.order || 'desc';\n stores.sort((a: any, b: any) => {\n const aTime = a.createdAt?.getTime() || 0;\n const bTime = b.createdAt?.getTime() || 0;\n return order === 'desc' ? bTime - aTime : aTime - bTime;\n });\n\n // 分页\n const limit = options?.limit || 20;\n const data = stores.slice(0, limit).map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n\n return {\n object: 'list',\n data,\n has_more: stores.length > limit,\n };\n }\n\n /**\n * 获取单个 Vector Store\n */\n public async getVectorStore(id: string, auth: AuthContext): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const store = await db.findById(VectorStore, id);\n if (!store) {\n throw new Error(`Vector store ${id} not found`);\n }\n\n // 获取 file_counts(基于 Container 前缀匹配)\n const fileCounts = await this.getFileCounts(store.container || '', auth);\n\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n fileCounts,\n });\n }\n\n /**\n * 修改 Vector Store\n */\n public async modifyVectorStore(\n id: string,\n request: ModifyVectorStoreRequest,\n auth: AuthContext,\n ): Promise<VectorStoreObject> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 构建更新数据(不再支持修改 model,model 是全局配置)\n const updates: Partial<typeof VectorStore.$inferInsert> = {};\n if (request.name !== undefined) updates.name = request.name;\n if (request.chunking_strategy !== undefined) updates.chunkingStrategy = request.chunking_strategy;\n\n await db.updateById(VectorStore, id, updates);\n\n return this.getVectorStore(id, auth);\n }\n\n /**\n * 删除 Vector Store\n */\n public async deleteVectorStore(\n id: string,\n auth: AuthContext,\n ): Promise<{ id: string; object: 'vector_store.deleted'; deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n await db.deleteById(VectorStore, id);\n\n this.logger.info(`Deleted vector store ${id}`);\n\n return {\n id,\n object: 'vector_store.deleted',\n deleted: true,\n };\n }\n\n // ============================================\n // File Index Management (for webhook)\n // ============================================\n\n /**\n * 索引文件(由 webhook 调用)\n *\n * @param vectorStoreId Vector Store ID\n * @param fileUrl 文件 URL\n * @param auth 认证上下文\n * @param accessToken 访问令牌\n */\n public async indexFile(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ id: string; status: string; vectorId: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置(embedding model)\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n throw new Error('No AI configuration found. Please configure an embedding model first.');\n }\n\n // 查找最近的父级 VectorStore 获取分块策略\n const chunkingStrategy = await this.getChunkingStrategyForFile(fileUrl, auth);\n\n // 检查文件是否已索引\n const existingFiles = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n const vectorId = this.hashSubjectAspect(fileUrl, 'content');\n let fileIndexId: string;\n\n if (existingFiles.length > 0) {\n // 文件已存在,更新状态\n fileIndexId = existingFiles[0].id;\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.IN_PROGRESS,\n chunkingStrategy,\n indexedAt: new Date(),\n });\n } else {\n // 创建新的索引记录\n fileIndexId = `idx_${randomBytes(8).toString('hex')}`;\n await db.insert(IndexedFile).values({\n id: fileIndexId,\n fileUrl,\n vectorId,\n chunkingStrategy,\n status: FileIndexStatus.IN_PROGRESS,\n usageBytes: 0,\n indexedAt: new Date(),\n });\n }\n\n try {\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 读取文件内容\n const content = await this.fetchResourceContent(fileUrl, accessToken);\n if (!content || content.trim().length === 0) {\n throw new Error(`File ${fileUrl} has no indexable content`);\n }\n\n // 生成 embedding(使用全局 model)\n const embedding = await this.embeddingService.embed(content, credential, aiConfig.embeddingModel);\n\n // 存储向量\n await this.upsertVector(aiConfig.embeddingModel, vectorId, embedding, accessToken);\n\n // 更新索引记录为 completed\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.COMPLETED,\n usageBytes: content.length,\n lastError: null,\n });\n\n this.logger.info(`Indexed file ${fileUrl} with model ${aiConfig.embeddingModel}`);\n\n return { id: fileIndexId, status: 'completed', vectorId };\n } catch (error) {\n // 更新索引记录为 failed\n const errorMsg = error instanceof Error ? error.message : String(error);\n await db.updateById(IndexedFile, fileIndexId, {\n status: FileIndexStatus.FAILED,\n lastError: errorMsg,\n });\n\n this.logger.error(`Failed to index file ${fileUrl}: ${errorMsg}`);\n throw error;\n }\n }\n\n /**\n * 获取文件应使用的分块策略(查找最近的父级 VectorStore)\n */\n private async getChunkingStrategyForFile(fileUrl: string, auth: AuthContext): Promise<string> {\n const db = await this.getPodDb(auth);\n if (!db) return ChunkingStrategy.AUTO;\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 找到所有是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n if (matchedStores.length === 0) {\n return ChunkingStrategy.AUTO;\n }\n\n // 找最长前缀(最近的父级)\n matchedStores.sort((a: any, b: any) => (b.container?.length || 0) - (a.container?.length || 0));\n return matchedStores[0].chunkingStrategy || ChunkingStrategy.AUTO;\n }\n\n /**\n * 删除文件索引(由 webhook 调用)\n */\n public async removeFileIndex(\n fileUrl: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ deleted: boolean }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n // 获取全局 AI 配置\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig) {\n this.logger.warn(`No AI config found, cannot delete vector for ${fileUrl}`);\n return { deleted: false };\n }\n\n // 查找文件索引记录\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.fileUrl, fileUrl),\n );\n\n if (files.length === 0) {\n this.logger.warn(`File index record not found for ${fileUrl}`);\n return { deleted: false };\n }\n\n const fileRecord = files[0];\n\n // 从向量存储中删除\n if (fileRecord.vectorId) {\n await this.deleteVector(aiConfig.embeddingModel, fileRecord.vectorId, accessToken);\n }\n\n // 删除索引记录\n await db.deleteById(IndexedFile, fileRecord.id);\n\n this.logger.info(`Removed file index ${fileUrl}`);\n return { deleted: true };\n }\n\n /**\n * 获取 Container 下的 file_counts 统计(基于 fileUrl 前缀匹配)\n */\n public async getFileCounts(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<{ in_progress: number; completed: number; failed: number; cancelled: number; total: number }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n return { in_progress: 0, completed: 0, failed: 0, cancelled: 0, total: 0 };\n }\n\n // 获取所有索引文件,过滤属于该 Container 的\n const allFiles = await db.select().from(IndexedFile) as any[];\n const containerPrefix = containerUrl.endsWith('/') ? containerUrl : containerUrl + '/';\n const files = allFiles.filter((f: any) => f.fileUrl?.startsWith(containerPrefix));\n\n const counts = {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: files.length,\n };\n\n for (const file of files) {\n switch (file.status) {\n case FileIndexStatus.IN_PROGRESS:\n counts.in_progress++;\n break;\n case FileIndexStatus.COMPLETED:\n counts.completed++;\n break;\n case FileIndexStatus.FAILED:\n counts.failed++;\n break;\n case FileIndexStatus.CANCELLED:\n counts.cancelled++;\n break;\n }\n }\n\n return counts;\n }\n\n /**\n * 通过 vectorId 查找文件 URL(供 search 使用)\n * 注意:文件只索引一份,用 vectorId 即可查找\n */\n public async getFileUrlByVectorId(\n vectorId: number,\n auth: AuthContext,\n ): Promise<string | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const files = await db.select().from(IndexedFile).where(\n eq(IndexedFile.vectorId, vectorId),\n );\n\n return files.length > 0 ? files[0].fileUrl : null;\n }\n\n /**\n * 根据 Container URL 查找 VectorStore\n */\n public async findVectorStoreByContainer(\n containerUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n const stores = await db.select().from(VectorStore).where(\n eq(VectorStore.container, containerUrl),\n );\n\n if (stores.length === 0) return null;\n\n const store = stores[0];\n return this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n });\n }\n\n /**\n * 根据文件 URL 查找所有匹配的 VectorStore(包括父级容器)\n *\n * 例如:文件 https://alice.pod/A/B/c.txt 会匹配:\n * - https://alice.pod/A/B/ (直接父级)\n * - https://alice.pod/A/ (祖先级)\n * - https://alice.pod/ (Pod 根)\n *\n * 这样文件可以被索引到多个知识库中\n */\n public async findVectorStoresByFileUrl(\n fileUrl: string,\n auth: AuthContext,\n ): Promise<VectorStoreObject[]> {\n const db = await this.getPodDb(auth);\n if (!db) return [];\n\n // 获取所有 VectorStore\n const allStores = await db.select().from(VectorStore) as any[];\n\n // 过滤出 container 是 fileUrl 前缀的 VectorStore\n const matchedStores = allStores.filter((store: any) => {\n if (!store.container) return false;\n // 确保 container URL 以 / 结尾\n const containerUrl = store.container.endsWith('/') ? store.container : store.container + '/';\n return fileUrl.startsWith(containerUrl);\n });\n\n // 转换为 VectorStoreObject\n return matchedStores.map((store: any) => this.buildVectorStoreObject(store.id, {\n name: store.name || '',\n containerUrl: store.container || '',\n chunkingStrategy: store.chunkingStrategy || 'auto',\n status: (store.status as any) || 'completed',\n createdAt: store.createdAt || new Date(),\n lastActiveAt: store.lastActiveAt || null,\n }));\n }\n\n // ============================================\n // Search\n // ============================================\n\n /**\n * 搜索 Vector Store\n */\n public async search(\n vectorStoreId: string,\n request: SearchRequest,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ object: 'vector_store.search_results.page'; search_query: string; data: SearchResult[]; has_more: boolean }> {\n const store = await this.getVectorStore(vectorStoreId, auth);\n\n // 获取 AI credential\n const credential = await this.getAiCredential(auth);\n if (!credential) {\n throw new Error('No AI credential found');\n }\n\n // 获取全局 AI 配置中的 embedding model\n const aiConfig = await this.getAIConfig(auth);\n if (!aiConfig?.embeddingModel) {\n throw new Error('No embedding model configured. Please set up AI configuration first.');\n }\n\n const queryText = Array.isArray(request.query) ? request.query.join(' ') : request.query;\n\n // 生成 query embedding(使用全局模型)\n const queryEmbedding = await this.embeddingService.embed(queryText, credential, aiConfig.embeddingModel);\n\n // 调用 CSS vector search,使用 subjectPrefix 过滤只搜索该 VectorStore 的文件\n const limit = request.max_num_results || 10;\n const results = await this.searchVectors(aiConfig.embeddingModel, queryEmbedding, limit, accessToken, {\n subjectPrefix: store.url, // Container URL 作为 subject 前缀\n });\n\n // 构建搜索结果,使用 vectorId -> fileUrl 映射\n const searchResults: SearchResult[] = [];\n for (const r of results) {\n const vectorId = typeof r.id === 'number' ? r.id : parseInt(String(r.id), 10);\n const fileUrl = await this.getFileUrlByVectorId(vectorId, auth);\n\n searchResults.push({\n file_id: String(r.id),\n file_url: fileUrl || '',\n filename: fileUrl ? this.extractFilename(fileUrl) : '',\n score: r.score,\n attributes: {},\n content: [], // TODO: 可选返回内容片段\n });\n }\n\n return {\n object: 'vector_store.search_results.page',\n search_query: queryText,\n data: searchResults,\n has_more: false,\n };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private generateId(): string {\n return `vs_${randomBytes(12).toString('hex')}`;\n }\n\n /**\n * Hash subject + aspect 为向量 ID(供 webhook 索引使用)\n */\n public hashSubjectAspect(subject: string, aspect: string): number {\n const str = `${subject}|${aspect}`;\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return Math.abs(hash);\n }\n\n private extractContainerName(url: string): string {\n const parts = url.replace(/\\/$/, '').split('/');\n return parts[parts.length - 1] || 'Unnamed';\n }\n\n private extractFilename(url: string): string {\n const parts = url.split('/');\n return parts[parts.length - 1] || '';\n }\n\n private extractModelId(uri: string): string {\n return normalizeAIConfigModelId(uri);\n }\n\n private modelUri(model: string, provider: string = 'openai'): string {\n return aiConfigModelRef(provider, model);\n }\n\n private getPodBaseUrl(webId: string): string {\n const url = new URL(webId);\n url.hash = '';\n let path = url.pathname;\n if (path.endsWith('/profile/card')) {\n path = path.slice(0, -'/profile/card'.length);\n }\n if (!path.endsWith('/')) {\n path = path + '/';\n }\n return `${url.origin}${path}`;\n }\n\n private buildVectorStoreObject(\n id: string,\n data: {\n name: string;\n containerUrl: string;\n chunkingStrategy: string;\n status: 'in_progress' | 'completed' | 'expired';\n createdAt: Date;\n lastActiveAt: Date | null;\n fileCounts?: { in_progress: number; completed: number; failed: number; cancelled: number; total: number };\n usageBytes?: number;\n },\n ): VectorStoreObject {\n return {\n id,\n object: 'vector_store',\n created_at: Math.floor(data.createdAt.getTime() / 1000),\n name: data.name,\n status: data.status,\n usage_bytes: data.usageBytes || 0,\n file_counts: data.fileCounts || {\n in_progress: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n total: 0,\n },\n last_active_at: data.lastActiveAt ? Math.floor(data.lastActiveAt.getTime() / 1000) : null,\n metadata: {},\n url: data.containerUrl,\n chunking_strategy: data.chunkingStrategy,\n };\n }\n\n private async getPodDb(auth: AuthContext): Promise<any | null> {\n if (!isSolidAuth(auth) || !auth.clientId || !auth.clientSecret) {\n this.logger.debug('No clientId or clientSecret in auth context');\n return null;\n }\n\n const session = new Session();\n try {\n await session.login({\n oidcIssuer: new URL(this.tokenEndpoint).origin,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n });\n\n if (!session.info.isLoggedIn || !session.info.webId) {\n throw new Error('Login failed');\n }\n\n return drizzle({ fetch: session.fetch, info: { webId: session.info.webId, isLoggedIn: true } } as any, { schema }) as any;\n } catch (error) {\n this.logger.error(`Failed to login: ${error}`);\n return null;\n }\n }\n\n private async getAiCredential(auth: AuthContext): Promise<AiCredential | undefined> {\n const db = await this.getPodDb(auth);\n if (!db) return undefined;\n\n try {\n const credentials = await db.select().from(Credential).where(\n eq(Credential.service, ServiceType.AI),\n );\n\n const activeCred = credentials.find((c: any) => c.status === CredentialStatus.ACTIVE);\n if (!activeCred || !activeCred.apiKey) return undefined;\n\n // 获取 provider 信息\n let baseUrl: string | undefined;\n let proxyUrl: string | undefined;\n let provider = normalizeAIConfigProviderId(activeCred.provider || activeCred.id);\n\n if (provider) {\n const providers = await db.select().from(Provider);\n const selection = selectAIConfigCredential(provider, credentials, providers);\n if (selection) {\n provider = selection.providerId;\n baseUrl = selection.baseUrl;\n proxyUrl = selection.proxyUrl;\n }\n }\n\n return {\n provider: provider || activeCred.id,\n apiKey: activeCred.apiKey,\n baseUrl,\n proxyUrl,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI credential: ${error}`);\n return undefined;\n }\n }\n\n /**\n * 获取 Pod 级别的 AI 配置(全局 embedding model)\n */\n public async getAIConfig(auth: AuthContext): Promise<PodAIConfig | null> {\n const db = await this.getPodDb(auth);\n if (!db) return null;\n\n try {\n const configs = await db.select().from(AIConfig);\n const config = configs.find((c: any) => c.id === 'config');\n\n if (!config || !config.embeddingModel) {\n // 如果没有配置,尝试使用默认模型\n const models = await db.select().from(Model);\n const defaultModel = models.find((m: any) => m.modelType === 'embedding') || models[0];\n if (defaultModel) {\n return {\n embeddingModel: defaultModel.id,\n migrationStatus: 'idle',\n };\n }\n return null;\n }\n\n return {\n embeddingModel: this.extractModelId(config.embeddingModel),\n migrationStatus: (config.migrationStatus as any) || 'idle',\n previousModel: config.previousModel ? this.extractModelId(config.previousModel) : undefined,\n migrationProgress: config.migrationProgress || undefined,\n };\n } catch (error) {\n this.logger.error(`Failed to get AI config: ${error}`);\n return null;\n }\n }\n\n /**\n * 设置全局 embedding model\n * 如果更换了模型,自动触发迁移(后台重新索引所有文件)\n */\n public async setEmbeddingModel(\n newModel: string,\n auth: AuthContext,\n accessToken: string,\n ): Promise<{ success: boolean; migrationTriggered: boolean; message: string }> {\n const db = await this.getPodDb(auth);\n if (!db) {\n throw new Error('Failed to authenticate with Pod');\n }\n\n const currentConfig = await this.getAIConfig(auth);\n const currentModel = currentConfig?.embeddingModel;\n\n // 检查模型是否有变化\n const modelChanged = currentModel && currentModel !== newModel;\n\n const modelUri = this.modelUri(newModel);\n\n try {\n // 检查配置是否已存在\n const configs = await db.select().from(AIConfig);\n const existingConfig = configs.find((c: any) => c.id === 'config');\n\n if (existingConfig) {\n // 更新现有配置\n await db.updateById(AIConfig, 'config', {\n embeddingModel: modelUri,\n previousModel: modelChanged ? this.modelUri(currentModel) : existingConfig.previousModel,\n migrationStatus: modelChanged ? MigrationStatus.IN_PROGRESS : existingConfig.migrationStatus,\n migrationProgress: modelChanged ? 0 : existingConfig.migrationProgress,\n updatedAt: new Date(),\n });\n } else {\n // 创建新配置\n await db.insert(AIConfig).values({\n id: 'config',\n embeddingModel: modelUri,\n migrationStatus: MigrationStatus.IDLE,\n migrationProgress: 0,\n updatedAt: new Date(),\n });\n }\n\n this.logger.info(`Set embedding model to ${newModel}`);\n\n // 如果模型变化,在后台启动迁移\n if (modelChanged) {\n this.logger.info(`Model changed from ${currentModel} to ${newModel}, triggering migration`);\n // 异步执行迁移,不阻塞响应\n this.startMigration(auth, accessToken).catch(error => {\n this.logger.error(`Migration failed: ${error}`);\n });\n }\n\n return {\n success: true,\n migrationTriggered: modelChanged === true,\n message: modelChanged\n ? `Model updated to ${newModel}. Migration started to re-index all files.`\n : `Model set to ${newModel}.`,\n };\n } catch (error) {\n this.logger.error(`Failed to set embedding model: ${error}`);\n throw error;\n }\n }\n\n /**\n * 开始迁移:重新索引所有文件\n */\n private async startMigration(auth: AuthContext, accessToken: string): Promise<void> {\n const db = await this.getPodDb(auth);\n if (!db) return;\n\n try {\n // 获取所有已索引的文件\n const allFiles = await db.select().from(IndexedFile);\n const totalFiles = allFiles.length;\n\n if (totalFiles === 0) {\n // 无文件需要迁移\n await db.updateById(AIConfig, 'config', {\n migrationStatus: MigrationStatus.COMPLETED,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n return;\n }\n\n this.logger.info(`Starting migration for ${totalFiles} files`);\n\n let completedFiles = 0;\n let failedFiles = 0;\n\n for (const file of allFiles) {\n try {\n // 重新索引每个文件\n await this.indexFile(file.fileUrl, auth, accessToken);\n completedFiles++;\n } catch (error) {\n failedFiles++;\n this.logger.error(`Failed to re-index ${file.fileUrl}: ${error}`);\n }\n\n // 更新迁移进度\n const progress = Math.round(((completedFiles + failedFiles) / totalFiles) * 100);\n await db.updateById(AIConfig, 'config', {\n migrationProgress: progress,\n updatedAt: new Date(),\n });\n }\n\n // 标记迁移完成\n const finalStatus = failedFiles === 0 ? MigrationStatus.COMPLETED : MigrationStatus.FAILED;\n await db.updateById(AIConfig, 'config', {\n migrationStatus: finalStatus,\n migrationProgress: 100,\n updatedAt: new Date(),\n });\n\n this.logger.info(`Migration completed: ${completedFiles} success, ${failedFiles} failed`);\n } catch (error) {\n this.logger.error(`Migration error: ${error}`);\n await db.updateById(AIConfig, 'config', {\n migrationStatus: MigrationStatus.FAILED,\n updatedAt: new Date(),\n });\n }\n }\n\n /**\n * 获取资源内容(供 webhook 索引使用)\n */\n public async fetchResourceContent(url: string, accessToken: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'text/turtle, application/ld+json, text/plain, text/markdown, text/html, */*',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n const contentType = response.headers.get('Content-Type') || '';\n const body = await response.text();\n return this.extractText(body, contentType);\n }\n\n private extractText(body: string, contentType: string): string {\n const ct = contentType.toLowerCase();\n\n if (ct.includes('text/turtle') || ct.includes('application/n-triples')) {\n return this.extractTextFromTurtle(body);\n }\n if (ct.includes('application/ld+json') || ct.includes('application/json')) {\n return this.extractTextFromJsonLd(body);\n }\n if (ct.includes('text/html')) {\n return this.extractTextFromHtml(body);\n }\n return body;\n }\n\n private extractTextFromTurtle(turtle: string): string {\n const literals: string[] = [];\n const tripleQuoteRegex = /\"\"\"([^]*?)\"\"\"/g;\n const singleQuoteRegex = /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g;\n\n let match;\n while ((match = tripleQuoteRegex.exec(turtle)) !== null) {\n if (match[1].trim().length > 0) literals.push(match[1].trim());\n }\n\n const withoutTriple = turtle.replace(/\"\"\"[^]*?\"\"\"/g, '');\n while ((match = singleQuoteRegex.exec(withoutTriple)) !== null) {\n const value = match[1].trim();\n if (value.length > 3 && !value.startsWith('http') && !value.startsWith('urn:')) {\n literals.push(value);\n }\n }\n return literals.join('\\n');\n }\n\n private extractTextFromJsonLd(jsonStr: string): string {\n try {\n const json = JSON.parse(jsonStr);\n const texts: string[] = [];\n const extract = (obj: any): void => {\n if (typeof obj === 'string' && obj.length > 3 && !obj.startsWith('http')) {\n texts.push(obj);\n } else if (Array.isArray(obj)) {\n obj.forEach(extract);\n } else if (obj && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n if (!key.startsWith('@')) extract(value);\n }\n }\n };\n extract(json);\n return texts.join('\\n');\n } catch {\n return jsonStr;\n }\n }\n\n private extractTextFromHtml(html: string): string {\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '');\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '');\n text = text.replace(/<[^>]+>/g, ' ');\n text = text.replace(/\\s+/g, ' ').trim();\n return text;\n }\n\n /**\n * Upsert 向量到 CSS(供 webhook 索引使用)\n */\n public async upsertVector(model: string, id: number, vector: number[], accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/upsert`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, vectors: [{ id, vector }] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector upsert failed: ${response.status} ${errorText}`);\n }\n }\n\n /**\n * 删除向量(供 webhook 索引使用)\n */\n public async deleteVector(model: string, id: number, accessToken: string): Promise<void> {\n const url = `${this.cssBaseUrl}/-/vector/delete`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ model, ids: [id] }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Vector delete failed: ${response.status} ${errorText}`);\n }\n }\n\n private async searchVectors(\n model: string,\n vector: number[],\n limit: number,\n accessToken: string,\n options?: { subjectPrefix?: string },\n ): Promise<any[]> {\n const url = `${this.cssBaseUrl}/-/vector/search`;\n \n const body: Record<string, any> = { model, vector, limit };\n \n // 添加 subject 前缀过滤(限定搜索范围到特定 Container)\n if (options?.subjectPrefix) {\n body.filter = {\n subject: { $startsWith: options.subjectPrefix },\n };\n }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Vector search failed: ${response.status}`);\n }\n\n const data = await response.json() as { results?: any[] };\n return data.results || [];\n }\n\n // ============================================\n // Webhook Subscription\n // ============================================\n\n /**\n * 订阅 Container 的变更通知(WebhookChannel2023)\n *\n * @param containerUrl Container URL\n * @param accessToken 访问令牌\n */\n private async subscribeToContainer(containerUrl: string, accessToken: string): Promise<void> {\n if (!this.webhookUrl) {\n throw new Error('Webhook URL not configured');\n }\n\n // 1. 发现订阅端点\n const subscriptionEndpoint = await this.discoverNotificationEndpoint(containerUrl, accessToken);\n if (!subscriptionEndpoint) {\n throw new Error(`No notification endpoint found for ${containerUrl}`);\n }\n\n // 2. 创建 webhook 订阅\n const subscriptionRequest = {\n '@context': ['https://www.w3.org/ns/solid/notification/v1'],\n type: 'WebhookChannel2023',\n topic: containerUrl,\n sendTo: this.webhookUrl,\n };\n\n const response = await fetch(subscriptionEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/ld+json',\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify(subscriptionRequest),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Subscription failed: ${response.status} ${errorText}`);\n }\n\n const result = await response.json();\n this.logger.info(`Created webhook subscription: ${JSON.stringify(result)}`);\n }\n\n /**\n * 发现 Solid Notification 端点\n *\n * 通过 HEAD 请求获取 Link header 中的 describedby,然后获取订阅端点\n */\n private async discoverNotificationEndpoint(resourceUrl: string, accessToken: string): Promise<string | null> {\n // 方法 1:直接使用已知的 CSS 端点格式\n // CSS 的 webhook 订阅端点通常是 /.notifications/WebhookChannel2023/\n const url = new URL(resourceUrl);\n const webhookEndpoint = `${url.origin}/.notifications/WebhookChannel2023/`;\n\n // 验证端点是否存在\n try {\n const response = await fetch(webhookEndpoint, {\n method: 'GET',\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (response.ok) {\n return webhookEndpoint;\n }\n } catch {\n // 忽略错误,尝试其他方法\n }\n\n // 方法 2:通过 describedby Link header 发现\n try {\n const headResponse = await fetch(resourceUrl, {\n method: 'HEAD',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const linkHeader = headResponse.headers.get('Link');\n if (linkHeader) {\n // 解析 Link header 找 describedby\n const describedBy = this.parseLinkHeader(linkHeader, 'describedby');\n if (describedBy) {\n // 获取 describedby 资源,解析通知端点\n const descResponse = await fetch(describedBy, {\n headers: {\n Accept: 'application/ld+json',\n Authorization: `Bearer ${accessToken}`,\n },\n });\n if (descResponse.ok) {\n const desc = await descResponse.json() as any;\n // 查找 notify:subscription 或类似属性\n const subscription = desc['notify:subscription'] || desc['subscription'];\n if (subscription) {\n return typeof subscription === 'string' ? subscription : subscription['@id'];\n }\n }\n }\n }\n } catch {\n // 忽略错误\n }\n\n return null;\n }\n\n /**\n * 解析 Link header\n */\n private parseLinkHeader(linkHeader: string, rel: string): string | null {\n const links = linkHeader.split(',');\n for (const link of links) {\n const match = link.match(/<([^>]+)>.*rel=\"?([^\";]+)\"?/);\n if (match && match[2] === rel) {\n return match[1];\n }\n }\n return null;\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* AI Provider capability registry.
|
|
3
3
|
*
|
|
4
4
|
* Single source of truth for which API protocols each known provider supports.
|
|
5
|
-
* Used by VercelChatService (API proxy/conversion) and
|
|
5
|
+
* Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.
|
|
6
6
|
*
|
|
7
7
|
* TODO: replace with discovery service lookup via provider WebID
|
|
8
8
|
* See: docs/issues/discovery/001-provider-capability-registry.md
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* AI Provider capability registry.
|
|
4
4
|
*
|
|
5
5
|
* Single source of truth for which API protocols each known provider supports.
|
|
6
|
-
* Used by VercelChatService (API proxy/conversion) and
|
|
6
|
+
* Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.
|
|
7
7
|
*
|
|
8
8
|
* TODO: replace with discovery service lookup via provider WebID
|
|
9
9
|
* See: docs/issues/discovery/001-provider-capability-registry.md
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../src/api/service/provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider capability registry.\n *\n * Single source of truth for which API protocols each known provider supports.\n * Used by VercelChatService (API proxy/conversion) and
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../src/api/service/provider-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI Provider capability registry.\n *\n * Single source of truth for which API protocols each known provider supports.\n * Used by VercelChatService (API proxy/conversion) and ACP agent runtime env setup.\n *\n * TODO: replace with discovery service lookup via provider WebID\n * See: docs/issues/discovery/001-provider-capability-registry.md\n */\n\ninterface ProviderInfo {\n /** Default base URL (with /v1 suffix where applicable) */\n baseUrl: string;\n /** Hostnames that identify this provider */\n hostnames: string[];\n supports: {\n chatCompletions: boolean;\n /** OpenAI Responses API: POST /v1/responses */\n responses: boolean;\n /** Anthropic Messages API: POST /v1/messages */\n messages: boolean;\n };\n}\n\nconst REGISTRY: ProviderInfo[] = [\n {\n baseUrl: 'https://api.openai.com/v1',\n hostnames: ['api.openai.com'],\n supports: { chatCompletions: true, responses: true, messages: false },\n },\n {\n baseUrl: 'https://api.anthropic.com/v1',\n hostnames: ['api.anthropic.com'],\n supports: { chatCompletions: false, responses: false, messages: true },\n },\n {\n baseUrl: 'https://openrouter.ai/api/v1',\n hostnames: ['openrouter.ai'],\n supports: { chatCompletions: true, responses: true, messages: true },\n },\n {\n baseUrl: 'https://api.deepseek.com/v1',\n hostnames: ['api.deepseek.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n hostnames: ['generativelanguage.googleapis.com'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'http://localhost:11434/v1',\n hostnames: ['localhost', '127.0.0.1'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.mistral.ai/v1',\n hostnames: ['api.mistral.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://api.cohere.ai/v1',\n hostnames: ['api.cohere.ai'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n {\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n hostnames: ['open.bigmodel.cn'],\n supports: { chatCompletions: true, responses: false, messages: false },\n },\n];\n\n/** Default for unknown providers — Chat Completions is the most widely supported protocol */\nconst UNKNOWN: ProviderInfo['supports'] = {\n chatCompletions: true,\n responses: false,\n messages: false,\n};\n\nconst byName = new Map<string, ProviderInfo>();\nconst byHost = new Map<string, ProviderInfo>();\n\nfor (const p of REGISTRY) {\n // Index by provider name derived from hostname\n byName.set(p.hostnames[0], p);\n for (const h of p.hostnames) {\n byHost.set(h, p);\n }\n}\n\nfunction hostnameOf(baseUrl: string): string | undefined {\n try {\n return new URL(baseUrl).hostname;\n } catch {\n return undefined;\n }\n}\n\nfunction lookupByUrl(baseUrl: string): ProviderInfo['supports'] {\n const host = hostnameOf(baseUrl);\n if (!host) return UNKNOWN;\n return byHost.get(host)?.supports ?? UNKNOWN;\n}\n\nexport function getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n // Match by first hostname segment or full name\n for (const p of REGISTRY) {\n if (p.hostnames[0].includes(normalized) || normalized.includes(p.hostnames[0].split('.')[0])) {\n return p.baseUrl;\n }\n }\n return 'https://openrouter.ai/api/v1';\n}\n\nexport function supportsResponsesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).responses;\n}\n\nexport function supportsMessagesApi(baseUrl: string): boolean {\n return lookupByUrl(baseUrl).messages;\n}\n\n/**\n * For codex wire_api selection: only native OpenAI uses Responses wire protocol.\n * All other providers (including openrouter) should use Chat Completions wire.\n */\nexport function codexWireApi(baseUrl: string): 'responses' | 'chat' {\n const host = hostnameOf(baseUrl);\n return host === 'api.openai.com' ? 'responses' : 'chat';\n}\n"]}
|