@undefineds.co/xpod 0.2.45 → 0.3.0
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 +5 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountControls,\n createClientCredentials,\n} from '../lib/css-account';\nimport { saveCredentials, getConfigPath } from '../lib/credentials-store';\nimport { promptPassword, promptText } from '../lib/prompt';\n\ninterface LoginArgs {\n url?: string;\n email?: string;\n password?: string;\n 'web-id'?: string;\n name?: string;\n output?: boolean;\n}\n\nfunction resolveUrl(url?: string): string {\n const raw = url || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nasync function resolveWebId(baseUrl: string, token: string, explicitWebId?: string): Promise<string | undefined> {\n if (explicitWebId) {\n return explicitWebId;\n }\n\n const accountRes = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n if (!accountRes.ok) {\n return undefined;\n }\n\n const accountData = await accountRes.json() as { webIds?: Record<string, string> };\n const webIds = accountData.webIds;\n if (!webIds || typeof webIds !== 'object') {\n return undefined;\n }\n\n return Object.keys(webIds)[0];\n}\n\nexport const loginCommandModule: CommandModule<object, LoginArgs> = {\n command: 'login',\n describe: 'Login to xpod/Solid and store CLI client credentials',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n default: process.env.CSS_BASE_URL || 'http://localhost:3000',\n })\n .option('email', { type: 'string', description: 'Account email (will prompt if not provided)' })\n .option('password', { type: 'string', description: 'Account password (will prompt securely if not provided)' })\n .option('web-id', { type: 'string', description: 'WebID to bind credentials to' })\n .option('name', { type: 'string', description: 'Credential label' })\n .option('output', { type: 'boolean', default: false, description: 'Print credentials instead of saving to ~/.xpod/' }),\n handler: async (argv) => {\n const baseUrl = resolveUrl(argv.url);\n\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n\n let email = argv.email;\n if (!email) {\n email = await promptText('Email: ');\n if (!email) {\n console.error('Email is required');\n process.exit(1);\n }\n }\n\n let password = argv.password;\n if (!password) {\n password = await promptPassword('Password: ');\n if (!password) {\n console.error('Password is required');\n process.exit(1);\n }\n }\n\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed.');\n process.exit(1);\n }\n\n const controls = await getAccountControls(token, baseUrl);\n if (!controls?.clientCredentials) {\n console.error('Cannot find client credentials endpoint.');\n process.exit(1);\n }\n\n const webId = await resolveWebId(baseUrl, token, argv['web-id']);\n if (!webId) {\n console.error('No WebID found. Specify --web-id explicitly.');\n process.exit(1);\n }\n\n const credential = await createClientCredentials(token, controls.clientCredentials, webId, argv.name);\n if (!credential) {\n console.error('Failed to create client credentials.');\n process.exit(1);\n }\n\n console.log('Credentials created:');\n console.log(` client_id: ${credential.id}`);\n console.log(` client_secret: ${credential.secret}`);\n console.log(` webId: ${webId}`);\n\n if (!argv.output) {\n saveCredentials({\n url: baseUrl,\n webId,\n authType: 'client_credentials',\n secrets: {\n clientId: credential.id,\n clientSecret: credential.secret ?? '',\n },\n });\n console.log(`\\nSaved to ${getConfigPath().replace('/config.json', '/')}`);\n }\n },\n};\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -77,138 +77,17 @@ async function createCommandParser() {
|
|
|
77
77
|
.help()
|
|
78
78
|
.version();
|
|
79
79
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Entry point: support both subcommands and default agent behavior.
|
|
82
|
-
*
|
|
83
|
-
* - Known subcommand → delegate to yargs
|
|
84
|
-
* - `-p <prompt>` → print mode (one-shot)
|
|
85
|
-
* - `-c` → continue last conversation (interactive)
|
|
86
|
-
* - `<prompt>` → interactive with initial prompt
|
|
87
|
-
* - No args → interactive REPL
|
|
88
|
-
*/
|
|
89
80
|
async function main() {
|
|
90
81
|
const argv = process.argv.slice(2);
|
|
91
82
|
const wantsRootHelp = argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';
|
|
92
83
|
const wantsVersion = argv.includes('--version') || argv.includes('-v');
|
|
93
|
-
// If first arg is a known command, delegate to yargs
|
|
94
|
-
if (argv.length > 0 && KNOWN_COMMANDS.includes(argv[0])) {
|
|
95
|
-
(await createCommandParser())
|
|
96
|
-
.demandCommand(1, 'Please specify a command')
|
|
97
|
-
.parse();
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
84
|
if (wantsRootHelp || wantsVersion) {
|
|
101
85
|
createRootParser().parse();
|
|
102
86
|
return;
|
|
103
87
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
async function runAgentMode(argv) {
|
|
108
|
-
const [credentialsStore, solidAuth, agentSession, podThreadStore, aiCredentials,] = await Promise.all([
|
|
109
|
-
Promise.resolve().then(() => __importStar(require('./lib/credentials-store'))),
|
|
110
|
-
Promise.resolve().then(() => __importStar(require('./lib/solid-auth'))),
|
|
111
|
-
Promise.resolve().then(() => __importStar(require('./lib/agent-session'))),
|
|
112
|
-
Promise.resolve().then(() => __importStar(require('./lib/pod-thread-store'))),
|
|
113
|
-
Promise.resolve().then(() => __importStar(require('./lib/ensure-ai-credentials'))),
|
|
114
|
-
]);
|
|
115
|
-
// Parse agent-specific flags
|
|
116
|
-
let printMode = false;
|
|
117
|
-
let continueMode = false;
|
|
118
|
-
let modelOverride;
|
|
119
|
-
let prompt;
|
|
120
|
-
const args = [];
|
|
121
|
-
for (let i = 0; i < argv.length; i++) {
|
|
122
|
-
const arg = argv[i];
|
|
123
|
-
if (arg === '-p' || arg === '--print') {
|
|
124
|
-
printMode = true;
|
|
125
|
-
}
|
|
126
|
-
else if (arg === '-c' || arg === '--continue') {
|
|
127
|
-
continueMode = true;
|
|
128
|
-
}
|
|
129
|
-
else if (arg === '--model' && i + 1 < argv.length) {
|
|
130
|
-
modelOverride = argv[++i];
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
args.push(arg);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Remaining args form the prompt
|
|
137
|
-
if (args.length > 0) {
|
|
138
|
-
prompt = args.join(' ');
|
|
139
|
-
}
|
|
140
|
-
// Load credentials
|
|
141
|
-
const creds = credentialsStore.loadCredentials();
|
|
142
|
-
if (!creds) {
|
|
143
|
-
console.error('Error: No credentials found. Please run `xpod auth create-credentials` first.');
|
|
144
|
-
process.exit(1);
|
|
145
|
-
}
|
|
146
|
-
// Authenticate with Pod
|
|
147
|
-
let auth;
|
|
148
|
-
try {
|
|
149
|
-
const clientCreds = credentialsStore.getClientCredentials(creds);
|
|
150
|
-
if (!clientCreds) {
|
|
151
|
-
console.error('Error: OAuth authentication not yet supported. Please use client credentials.');
|
|
152
|
-
process.exit(1);
|
|
153
|
-
}
|
|
154
|
-
auth = await solidAuth.authenticate(clientCreds.clientId, clientCreds.clientSecret, creds.url);
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
console.error(`Error: Failed to authenticate. ${error instanceof Error ? error.message : String(error)}`);
|
|
158
|
-
process.exit(1);
|
|
159
|
-
}
|
|
160
|
-
const { session, apiKey } = auth;
|
|
161
|
-
const workspace = process.cwd();
|
|
162
|
-
// Check AI credentials (optional, uses platform default if not configured)
|
|
163
|
-
const hasCredentials = await aiCredentials.ensureAiCredentials(session);
|
|
164
|
-
if (!hasCredentials) {
|
|
165
|
-
process.exit(0); // User chose to configure first
|
|
166
|
-
}
|
|
167
|
-
// Get or create default CLI chat (1v1 with SecretaryAI)
|
|
168
|
-
const chatId = await podThreadStore.getOrCreateDefaultChat(session);
|
|
169
|
-
// Resolve thread ID for continue mode
|
|
170
|
-
let threadId;
|
|
171
|
-
if (continueMode) {
|
|
172
|
-
const threads = await podThreadStore.listThreads(session, chatId);
|
|
173
|
-
if (threads.length > 0) {
|
|
174
|
-
threadId = threads[0]; // Most recent
|
|
175
|
-
console.log(`Continuing thread: ${threadId}`);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
console.log('No previous threads found, starting fresh.');
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// Initialize agent — LLM calls go through xpod API, no AI keys needed on client
|
|
182
|
-
let result;
|
|
183
|
-
try {
|
|
184
|
-
result = await agentSession.initAgent({
|
|
185
|
-
session,
|
|
186
|
-
apiKey,
|
|
187
|
-
xpodUrl: creds.url,
|
|
188
|
-
model: modelOverride,
|
|
189
|
-
chatId,
|
|
190
|
-
workspace,
|
|
191
|
-
threadId,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
console.error(`Error initializing agent: ${error instanceof Error ? error.message : String(error)}`);
|
|
196
|
-
process.exit(1);
|
|
197
|
-
}
|
|
198
|
-
const { agent, threadId: activeThreadId } = result;
|
|
199
|
-
// Run appropriate mode
|
|
200
|
-
if (printMode) {
|
|
201
|
-
if (!prompt) {
|
|
202
|
-
console.error('Error: -p/--print requires a prompt');
|
|
203
|
-
process.exit(1);
|
|
204
|
-
}
|
|
205
|
-
await agentSession.runOnce(agent, prompt, session, chatId, activeThreadId);
|
|
206
|
-
await session.logout();
|
|
207
|
-
process.exit(0);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
await agentSession.runInteractive(agent, session, chatId, activeThreadId, prompt);
|
|
211
|
-
}
|
|
88
|
+
(await createCommandParser())
|
|
89
|
+
.demandCommand(1, 'Please specify an operations command')
|
|
90
|
+
.parse();
|
|
212
91
|
}
|
|
213
92
|
main().catch((error) => {
|
|
214
93
|
console.error('Fatal error:', error);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport '../runtime/configure-drizzle-solid';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\n// Known subcommands\nconst KNOWN_COMMANDS = [\n 'start', 'stop', 'status', 'logs',\n 'auth', 'login', 'config', 'import', 'pod',\n 'account', 'backup', 'restore', 'doctor',\n];\n\nfunction createRootParser() {\n return yargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .epilog(`Commands: ${KNOWN_COMMANDS.join(', ')}`)\n .help()\n .version();\n}\n\nasync function createCommandParser() {\n const [\n { startCommand },\n { stopCommand },\n { statusCommand },\n { logsCommand },\n { authCommand },\n { loginCommandModule },\n { configCommand },\n { importCommand },\n { podCommand },\n { accountCommand },\n { backupCommand, restoreCommand },\n { doctorCommand },\n ] = await Promise.all([\n import('./commands/start'),\n import('./commands/stop'),\n import('./commands/status'),\n import('./commands/logs'),\n import('./commands/auth'),\n import('./commands/login'),\n import('./commands/config'),\n import('./commands/import'),\n import('./commands/pod'),\n import('./commands/account'),\n import('./commands/backup'),\n import('./commands/doctor'),\n ]);\n\n return createRootParser()\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(loginCommandModule)\n .command(configCommand)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .strict()\n .help()\n .version();\n}\n\n/**\n * Entry point: support both subcommands and default agent behavior.\n *\n * - Known subcommand → delegate to yargs\n * - `-p <prompt>` → print mode (one-shot)\n * - `-c` → continue last conversation (interactive)\n * - `<prompt>` → interactive with initial prompt\n * - No args → interactive REPL\n */\nasync function main() {\n const argv = process.argv.slice(2);\n const wantsRootHelp = argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';\n const wantsVersion = argv.includes('--version') || argv.includes('-v');\n\n // If first arg is a known command, delegate to yargs\n if (argv.length > 0 && KNOWN_COMMANDS.includes(argv[0])) {\n (await createCommandParser())\n .demandCommand(1, 'Please specify a command')\n .parse();\n return;\n }\n\n if (wantsRootHelp || wantsVersion) {\n createRootParser().parse();\n return;\n }\n\n // Otherwise, run agent mode\n await runAgentMode(argv);\n}\n\nasync function runAgentMode(argv: string[]) {\n const [\n credentialsStore,\n solidAuth,\n agentSession,\n podThreadStore,\n aiCredentials,\n ] = await Promise.all([\n import('./lib/credentials-store'),\n import('./lib/solid-auth'),\n import('./lib/agent-session'),\n import('./lib/pod-thread-store'),\n import('./lib/ensure-ai-credentials'),\n ]);\n\n // Parse agent-specific flags\n let printMode = false;\n let continueMode = false;\n let modelOverride: string | undefined;\n let prompt: string | undefined;\n\n const args: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === '-p' || arg === '--print') {\n printMode = true;\n } else if (arg === '-c' || arg === '--continue') {\n continueMode = true;\n } else if (arg === '--model' && i + 1 < argv.length) {\n modelOverride = argv[++i];\n } else {\n args.push(arg);\n }\n }\n\n // Remaining args form the prompt\n if (args.length > 0) {\n prompt = args.join(' ');\n }\n\n // Load credentials\n const creds = credentialsStore.loadCredentials();\n if (!creds) {\n console.error('Error: No credentials found. Please run `xpod auth create-credentials` first.');\n process.exit(1);\n }\n\n // Authenticate with Pod\n let auth;\n try {\n const clientCreds = credentialsStore.getClientCredentials(creds);\n if (!clientCreds) {\n console.error('Error: OAuth authentication not yet supported. Please use client credentials.');\n process.exit(1);\n }\n auth = await solidAuth.authenticate(clientCreds.clientId, clientCreds.clientSecret, creds.url);\n } catch (error) {\n console.error(`Error: Failed to authenticate. ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n\n const { session, apiKey } = auth;\n const workspace = process.cwd();\n\n // Check AI credentials (optional, uses platform default if not configured)\n const hasCredentials = await aiCredentials.ensureAiCredentials(session);\n if (!hasCredentials) {\n process.exit(0); // User chose to configure first\n }\n\n // Get or create default CLI chat (1v1 with SecretaryAI)\n const chatId = await podThreadStore.getOrCreateDefaultChat(session);\n\n // Resolve thread ID for continue mode\n let threadId: string | undefined;\n if (continueMode) {\n const threads = await podThreadStore.listThreads(session, chatId);\n if (threads.length > 0) {\n threadId = threads[0]; // Most recent\n console.log(`Continuing thread: ${threadId}`);\n } else {\n console.log('No previous threads found, starting fresh.');\n }\n }\n\n // Initialize agent — LLM calls go through xpod API, no AI keys needed on client\n let result;\n try {\n result = await agentSession.initAgent({\n session,\n apiKey,\n xpodUrl: creds.url,\n model: modelOverride,\n chatId,\n workspace,\n threadId,\n });\n } catch (error) {\n console.error(`Error initializing agent: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n\n const { agent, threadId: activeThreadId } = result;\n\n // Run appropriate mode\n if (printMode) {\n if (!prompt) {\n console.error('Error: -p/--print requires a prompt');\n process.exit(1);\n }\n await agentSession.runOnce(agent, prompt, session, chatId, activeThreadId);\n await session.logout();\n process.exit(0);\n } else {\n await agentSession.runInteractive(agent, session, chatId, activeThreadId, prompt);\n }\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport '../runtime/configure-drizzle-solid';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\n// Known subcommands\nconst KNOWN_COMMANDS = [\n 'start', 'stop', 'status', 'logs',\n 'auth', 'login', 'config', 'import', 'pod',\n 'account', 'backup', 'restore', 'doctor',\n];\n\nfunction createRootParser() {\n return yargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .epilog(`Commands: ${KNOWN_COMMANDS.join(', ')}`)\n .help()\n .version();\n}\n\nasync function createCommandParser() {\n const [\n { startCommand },\n { stopCommand },\n { statusCommand },\n { logsCommand },\n { authCommand },\n { loginCommandModule },\n { configCommand },\n { importCommand },\n { podCommand },\n { accountCommand },\n { backupCommand, restoreCommand },\n { doctorCommand },\n ] = await Promise.all([\n import('./commands/start'),\n import('./commands/stop'),\n import('./commands/status'),\n import('./commands/logs'),\n import('./commands/auth'),\n import('./commands/login'),\n import('./commands/config'),\n import('./commands/import'),\n import('./commands/pod'),\n import('./commands/account'),\n import('./commands/backup'),\n import('./commands/doctor'),\n ]);\n\n return createRootParser()\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(authCommand)\n .command(loginCommandModule)\n .command(configCommand)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .strict()\n .help()\n .version();\n}\n\nasync function main() {\n const argv = process.argv.slice(2);\n const wantsRootHelp = argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';\n const wantsVersion = argv.includes('--version') || argv.includes('-v');\n\n if (wantsRootHelp || wantsVersion) {\n createRootParser().parse();\n return;\n }\n\n (await createCommandParser())\n .demandCommand(1, 'Please specify an operations command')\n .parse();\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
|
|
@@ -14,6 +14,7 @@ const global_logger_factory_1 = require("global-logger-factory");
|
|
|
14
14
|
const community_server_1 = require("@solid/community-server");
|
|
15
15
|
const community_server_2 = require("@solid/community-server");
|
|
16
16
|
const policy_engine_1 = require("@solidlab/policy-engine");
|
|
17
|
+
const models_1 = require("@undefineds.co/models");
|
|
17
18
|
const ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];
|
|
18
19
|
class SearchApiError extends Error {
|
|
19
20
|
constructor(code, statusCode, message) {
|
|
@@ -171,22 +172,22 @@ class SearchHttpHandler extends community_server_1.HttpHandler {
|
|
|
171
172
|
*/
|
|
172
173
|
async getAiCredential(podBaseUrl) {
|
|
173
174
|
try {
|
|
174
|
-
// 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致
|
|
175
175
|
const query = `
|
|
176
|
-
PREFIX
|
|
176
|
+
PREFIX cred: <${models_1.XPOD_CREDENTIAL.NAMESPACE}>
|
|
177
|
+
PREFIX ai: <${models_1.XPOD_AI.NAMESPACE}>
|
|
177
178
|
SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {
|
|
178
|
-
?cred a
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
OPTIONAL { ?cred
|
|
179
|
+
?cred a cred:Credential ;
|
|
180
|
+
cred:service "ai" ;
|
|
181
|
+
cred:status "active" ;
|
|
182
|
+
cred:apiKey ?apiKey .
|
|
183
|
+
OPTIONAL { ?cred cred:provider ?providerUri }
|
|
183
184
|
OPTIONAL {
|
|
184
|
-
?cred
|
|
185
|
-
?providerUri
|
|
185
|
+
?cred cred:provider ?providerUri .
|
|
186
|
+
?providerUri ai:baseUrl ?baseUrl .
|
|
186
187
|
}
|
|
187
188
|
OPTIONAL {
|
|
188
|
-
?cred
|
|
189
|
-
?providerUri
|
|
189
|
+
?cred cred:provider ?providerUri .
|
|
190
|
+
?providerUri ai:proxyUrl ?proxyUrl .
|
|
190
191
|
}
|
|
191
192
|
} LIMIT 1
|
|
192
193
|
`;
|
|
@@ -197,13 +198,7 @@ class SearchHttpHandler extends community_server_1.HttpHandler {
|
|
|
197
198
|
const providerUri = binding.get('providerUri');
|
|
198
199
|
const proxyUrl = binding.get('proxyUrl');
|
|
199
200
|
if (apiKey) {
|
|
200
|
-
|
|
201
|
-
let providerName = 'google';
|
|
202
|
-
if (providerUri?.value) {
|
|
203
|
-
const match = providerUri.value.match(/#([^#]+)$/);
|
|
204
|
-
if (match)
|
|
205
|
-
providerName = match[1];
|
|
206
|
-
}
|
|
201
|
+
const providerName = (0, models_1.normalizeAIConfigProviderId)(providerUri?.value || 'google') || 'google';
|
|
207
202
|
return {
|
|
208
203
|
apiKey: apiKey.value,
|
|
209
204
|
baseUrl: baseUrl?.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchHttpHandler.js","sourceRoot":"","sources":["../../../src/http/search/SearchHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SearchHttpHandler - 语义搜索 HTTP 处理器\n *\n * 提供 /-/search 端点,支持基于向量的语义搜索。\n *\n * 端点:\n * - GET {path}/-/search?q=... 简单搜索\n * - POST {path}/-/search 复杂搜索(支持 filter 等)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n HttpError,\n IdentifierSetMultiMap,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type { CredentialsExtractor, PermissionReader, Authorizer, ResourceIdentifier } from '@solid/community-server';\nimport type { VectorStore } from '../../storage/vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../../storage/sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { VectorSearchOptions } from '../../storage/vector/types';\n\nconst ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];\n\n// ============================================\n// 请求/响应类型\n// ============================================\n\ninterface SearchRequest {\n /** 查询文本 */\n query?: string;\n /** 预计算的查询向量 */\n vector?: number[];\n /** 返回结果数量,默认 10 */\n limit?: number;\n /** 相似度阈值 (0-1) */\n threshold?: number;\n /** 过滤条件 */\n filter?: {\n type?: string;\n graphPrefix?: string;\n subjectPrefix?: string;\n };\n /** embedding 模型 */\n model?: string;\n}\n\ninterface SearchResult {\n /** 资源 URI */\n subject: string;\n /** 相似度分数 (0-1) */\n score: number;\n /** 距离 */\n distance?: number;\n /** 文本片段 */\n snippet?: string;\n}\n\ninterface SearchResponse {\n results: SearchResult[];\n model: string;\n took_ms: number;\n}\n\n// ============================================\n// 错误处理\n// ============================================\n\ntype SearchErrorCode =\n | 'INVALID_REQUEST'\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NO_CREDENTIAL'\n | 'EMBEDDING_ERROR'\n | 'SEARCH_ERROR';\n\nclass SearchApiError extends Error {\n constructor(\n public readonly code: SearchErrorCode,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'SearchApiError';\n }\n\n static invalidRequest(message: string): SearchApiError {\n return new SearchApiError('INVALID_REQUEST', 400, message);\n }\n\n static noCredential(): SearchApiError {\n return new SearchApiError('NO_CREDENTIAL', 400, 'No AI credential found. Please configure AI credentials in your Pod settings.');\n }\n\n static embeddingError(message: string): SearchApiError {\n return new SearchApiError('EMBEDDING_ERROR', 502, `Embedding generation failed: ${message}`);\n }\n\n static searchError(message: string): SearchApiError {\n return new SearchApiError('SEARCH_ERROR', 500, `Search failed: ${message}`);\n }\n}\n\n// ============================================\n// Handler\n// ============================================\n\nexport interface SearchHttpHandlerOptions {\n sidecarPath?: string;\n defaultModel?: string;\n defaultLimit?: number;\n}\n\nexport class SearchHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly sparqlEngine: SparqlEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly defaultModel: string;\n private readonly defaultLimit: number;\n\n public constructor(\n vectorStore: VectorStore,\n embeddingService: EmbeddingService,\n sparqlEngine: SparqlEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SearchHttpHandlerOptions = {},\n ) {\n super();\n this.vectorStore = vectorStore;\n this.embeddingService = embeddingService;\n this.sparqlEngine = sparqlEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/search';\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.defaultLimit = options.defaultLimit ?? 10;\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n\n // 提取 base path(sidecar 之前的路径)\n let basePath = path.slice(0, sidecarIndex);\n if (!basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n const origin = `${url.protocol}//${url.host}`;\n const baseUrl = `${origin}${basePath}`;\n\n this.logger.debug(`Search request: ${method} ${path}, baseUrl=${baseUrl}`);\n\n // 鉴权\n await this.authorizeFor(baseUrl, request, [PERMISSIONS.Read]);\n\n // 解析请求\n const searchRequest = await this.parseSearchRequest(request, url);\n\n // 执行搜索\n const result = await this.executeSearch(searchRequest, baseUrl);\n\n this.sendJsonResponse(response, result);\n } catch (error: unknown) {\n this.handleError(response, error);\n }\n }\n\n /**\n * 解析搜索请求\n */\n private async parseSearchRequest(request: HttpRequest, url: URL): Promise<SearchRequest> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'GET') {\n // GET 请求从 query string 解析\n const query = url.searchParams.get('q') || url.searchParams.get('query');\n const limit = url.searchParams.get('limit');\n const threshold = url.searchParams.get('threshold');\n const model = url.searchParams.get('model');\n\n if (!query) {\n throw SearchApiError.invalidRequest('Missing query parameter \"q\"');\n }\n\n return {\n query,\n limit: limit ? parseInt(limit, 10) : undefined,\n threshold: threshold ? parseFloat(threshold) : undefined,\n model: model || undefined,\n };\n }\n\n // POST 请求从 body 解析\n const body = await this.readJsonBody<SearchRequest>(request);\n\n if (!body.query && !body.vector) {\n throw SearchApiError.invalidRequest('Either \"query\" or \"vector\" is required');\n }\n\n return body;\n }\n\n /**\n * 执行搜索\n */\n private async executeSearch(request: SearchRequest, baseUrl: string): Promise<SearchResponse> {\n const startTime = Date.now();\n const model = request.model || this.defaultModel;\n\n let queryVector = request.vector;\n\n // 如果提供了 query 文本,需要生成 embedding\n if (request.query && !queryVector) {\n // 获取 AI 凭据\n const credential = await this.getAiCredential(baseUrl);\n if (!credential) {\n throw SearchApiError.noCredential();\n }\n\n try {\n queryVector = await this.embeddingService.embed(request.query, credential, model);\n } catch (error) {\n throw SearchApiError.embeddingError(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (!queryVector) {\n throw SearchApiError.invalidRequest('Failed to generate query vector');\n }\n\n // 执行向量搜索\n const searchOptions: VectorSearchOptions = {\n limit: request.limit ?? this.defaultLimit,\n threshold: request.threshold,\n };\n\n try {\n const vectorResults = await this.vectorStore.search(model, queryVector, searchOptions);\n\n // 转换结果\n const results: SearchResult[] = vectorResults.map((r) => ({\n subject: this.vectorIdToSubject(r.id, baseUrl),\n score: r.score,\n distance: r.distance,\n }));\n\n return {\n results,\n model,\n took_ms: Date.now() - startTime,\n };\n } catch (error) {\n throw SearchApiError.searchError(error instanceof Error ? error.message : String(error));\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n // 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致\n const query = `\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {\n ?cred a udfs:Credential ;\n udfs:service \"ai\" ;\n udfs:status \"active\" ;\n udfs:apiKey ?apiKey .\n OPTIONAL { ?cred udfs:provider ?providerUri }\n OPTIONAL {\n ?cred udfs:provider ?providerUri .\n ?providerUri udfs:baseUrl ?baseUrl .\n }\n OPTIONAL {\n ?cred udfs:provider ?providerUri .\n ?providerUri udfs:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const providerUri = binding.get('providerUri');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n // 从 provider URI 提取 provider 名称(如 #google -> google)\n let providerName = 'google';\n if (providerUri?.value) {\n const match = providerUri.value.match(/#([^#]+)$/);\n if (match) providerName = match[1];\n }\n\n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 将向量 ID 转换回 subject URI\n * 注意:这是一个简化实现,实际需要维护 ID -> URI 的映射\n */\n private vectorIdToSubject(id: number, baseUrl: string): string {\n // TODO: 实现 ID -> URI 映射查询\n // 目前返回占位符\n return `${baseUrl}#vector-${id}`;\n }\n\n // ============================================\n // 辅助方法\n // ============================================\n\n private handleError(response: HttpResponse, error: unknown): void {\n if (error instanceof SearchApiError) {\n this.logger.error(`Search API error [${error.code}]: ${error.message}`);\n this.sendErrorResponse(response, error.statusCode, error.code, error.message);\n return;\n }\n\n if (error instanceof HttpError) {\n const errorMsg = error.message || error.name || `HTTP ${error.statusCode}`;\n this.logger.error(`HTTP error ${error.statusCode}: ${errorMsg}`);\n this.sendErrorResponse(response, error.statusCode, 'HTTP_ERROR', errorMsg);\n return;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error(`Unexpected error: ${errorMsg}`);\n this.sendErrorResponse(response, 500, 'INTERNAL_ERROR', errorMsg || 'Internal server error');\n }\n\n private async authorizeFor(\n baseUrl: string,\n request: HttpRequest,\n permissions: typeof PERMISSIONS[keyof typeof PERMISSIONS][],\n ): Promise<void> {\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const identifier: ResourceIdentifier = { path: baseUrl };\n const requestedModes = new IdentifierSetMultiMap([[identifier, permissions]] as any);\n\n const availablePermissions = await this.permissionReader.handleSafe({\n credentials,\n identifier,\n requestedModes,\n } as any);\n\n this.logger.debug(`authorizeFor: baseUrl=${baseUrl}, webId=${credentials.agent?.webId}`);\n\n await this.authorizer.handleSafe({\n credentials,\n identifier,\n requestedModes,\n availablePermissions,\n } as any);\n }\n\n private parseUrl(request: HttpRequest): URL {\n const protocol = request.headers['x-forwarded-proto'] || 'http';\n const host = request.headers['x-forwarded-host'] || request.headers.host || 'localhost';\n return new URL(request.url!, `${protocol}://${host}`);\n }\n\n private async readJsonBody<T>(request: HttpRequest): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n try {\n return JSON.parse(body) as T;\n } catch {\n throw SearchApiError.invalidRequest('Invalid JSON body');\n }\n }\n\n private sendJsonResponse(response: HttpResponse, data: unknown, status = 200): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(JSON.stringify(data));\n }\n\n private sendErrorResponse(\n response: HttpResponse,\n status: number,\n code: string,\n message: string,\n ): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(\n JSON.stringify({\n error: true,\n code,\n message,\n }),\n );\n }\n\n private writeOptions(response: HttpResponse): void {\n response.writeHead(204, {\n 'Access-Control-Allow-Methods': ALLOWED_METHODS.join(', '),\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n });\n response.end();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SearchHttpHandler.js","sourceRoot":"","sources":["../../../src/http/search/SearchHttpHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SearchHttpHandler - 语义搜索 HTTP 处理器\n *\n * 提供 /-/search 端点,支持基于向量的语义搜索。\n *\n * 端点:\n * - GET {path}/-/search?q=... 简单搜索\n * - POST {path}/-/search 复杂搜索(支持 filter 等)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { HttpHandler } from '@solid/community-server';\nimport type { HttpHandlerInput, HttpRequest, HttpResponse } from '@solid/community-server';\nimport {\n NotImplementedHttpError,\n MethodNotAllowedHttpError,\n HttpError,\n IdentifierSetMultiMap,\n} from '@solid/community-server';\nimport { PERMISSIONS } from '@solidlab/policy-engine';\nimport type { CredentialsExtractor, PermissionReader, Authorizer, ResourceIdentifier } from '@solid/community-server';\nimport type { VectorStore } from '../../storage/vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../../storage/sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { VectorSearchOptions } from '../../storage/vector/types';\nimport { XPOD_AI, XPOD_CREDENTIAL, normalizeAIConfigProviderId } from '@undefineds.co/models';\n\nconst ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];\n\n// ============================================\n// 请求/响应类型\n// ============================================\n\ninterface SearchRequest {\n /** 查询文本 */\n query?: string;\n /** 预计算的查询向量 */\n vector?: number[];\n /** 返回结果数量,默认 10 */\n limit?: number;\n /** 相似度阈值 (0-1) */\n threshold?: number;\n /** 过滤条件 */\n filter?: {\n type?: string;\n graphPrefix?: string;\n subjectPrefix?: string;\n };\n /** embedding 模型 */\n model?: string;\n}\n\ninterface SearchResult {\n /** 资源 URI */\n subject: string;\n /** 相似度分数 (0-1) */\n score: number;\n /** 距离 */\n distance?: number;\n /** 文本片段 */\n snippet?: string;\n}\n\ninterface SearchResponse {\n results: SearchResult[];\n model: string;\n took_ms: number;\n}\n\n// ============================================\n// 错误处理\n// ============================================\n\ntype SearchErrorCode =\n | 'INVALID_REQUEST'\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NO_CREDENTIAL'\n | 'EMBEDDING_ERROR'\n | 'SEARCH_ERROR';\n\nclass SearchApiError extends Error {\n constructor(\n public readonly code: SearchErrorCode,\n public readonly statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'SearchApiError';\n }\n\n static invalidRequest(message: string): SearchApiError {\n return new SearchApiError('INVALID_REQUEST', 400, message);\n }\n\n static noCredential(): SearchApiError {\n return new SearchApiError('NO_CREDENTIAL', 400, 'No AI credential found. Please configure AI credentials in your Pod settings.');\n }\n\n static embeddingError(message: string): SearchApiError {\n return new SearchApiError('EMBEDDING_ERROR', 502, `Embedding generation failed: ${message}`);\n }\n\n static searchError(message: string): SearchApiError {\n return new SearchApiError('SEARCH_ERROR', 500, `Search failed: ${message}`);\n }\n}\n\n// ============================================\n// Handler\n// ============================================\n\nexport interface SearchHttpHandlerOptions {\n sidecarPath?: string;\n defaultModel?: string;\n defaultLimit?: number;\n}\n\nexport class SearchHttpHandler extends HttpHandler {\n protected readonly logger = getLoggerFor(this);\n\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly sparqlEngine: SparqlEngine;\n private readonly credentialsExtractor: CredentialsExtractor;\n private readonly permissionReader: PermissionReader;\n private readonly authorizer: Authorizer;\n private readonly sidecarPath: string;\n private readonly defaultModel: string;\n private readonly defaultLimit: number;\n\n public constructor(\n vectorStore: VectorStore,\n embeddingService: EmbeddingService,\n sparqlEngine: SparqlEngine,\n credentialsExtractor: CredentialsExtractor,\n permissionReader: PermissionReader,\n authorizer: Authorizer,\n options: SearchHttpHandlerOptions = {},\n ) {\n super();\n this.vectorStore = vectorStore;\n this.embeddingService = embeddingService;\n this.sparqlEngine = sparqlEngine;\n this.credentialsExtractor = credentialsExtractor;\n this.permissionReader = permissionReader;\n this.authorizer = authorizer;\n this.sidecarPath = options.sidecarPath ?? '/-/search';\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.defaultLimit = options.defaultLimit ?? 10;\n }\n\n public override async canHandle({ request }: HttpHandlerInput): Promise<void> {\n const path = this.parseUrl(request).pathname;\n if (!path.includes(this.sidecarPath)) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n }\n\n public override async handle({ request, response }: HttpHandlerInput): Promise<void> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'OPTIONS') {\n this.writeOptions(response);\n return;\n }\n\n if (!ALLOWED_METHODS.includes(method)) {\n throw new MethodNotAllowedHttpError(ALLOWED_METHODS);\n }\n\n try {\n const url = this.parseUrl(request);\n const path = decodeURIComponent(url.pathname);\n\n const sidecarIndex = path.indexOf(this.sidecarPath);\n if (sidecarIndex === -1) {\n throw new NotImplementedHttpError('Request is not targeting a search endpoint.');\n }\n\n // 提取 base path(sidecar 之前的路径)\n let basePath = path.slice(0, sidecarIndex);\n if (!basePath.endsWith('/')) {\n basePath = `${basePath}/`;\n }\n\n const origin = `${url.protocol}//${url.host}`;\n const baseUrl = `${origin}${basePath}`;\n\n this.logger.debug(`Search request: ${method} ${path}, baseUrl=${baseUrl}`);\n\n // 鉴权\n await this.authorizeFor(baseUrl, request, [PERMISSIONS.Read]);\n\n // 解析请求\n const searchRequest = await this.parseSearchRequest(request, url);\n\n // 执行搜索\n const result = await this.executeSearch(searchRequest, baseUrl);\n\n this.sendJsonResponse(response, result);\n } catch (error: unknown) {\n this.handleError(response, error);\n }\n }\n\n /**\n * 解析搜索请求\n */\n private async parseSearchRequest(request: HttpRequest, url: URL): Promise<SearchRequest> {\n const method = (request.method ?? 'GET').toUpperCase();\n\n if (method === 'GET') {\n // GET 请求从 query string 解析\n const query = url.searchParams.get('q') || url.searchParams.get('query');\n const limit = url.searchParams.get('limit');\n const threshold = url.searchParams.get('threshold');\n const model = url.searchParams.get('model');\n\n if (!query) {\n throw SearchApiError.invalidRequest('Missing query parameter \"q\"');\n }\n\n return {\n query,\n limit: limit ? parseInt(limit, 10) : undefined,\n threshold: threshold ? parseFloat(threshold) : undefined,\n model: model || undefined,\n };\n }\n\n // POST 请求从 body 解析\n const body = await this.readJsonBody<SearchRequest>(request);\n\n if (!body.query && !body.vector) {\n throw SearchApiError.invalidRequest('Either \"query\" or \"vector\" is required');\n }\n\n return body;\n }\n\n /**\n * 执行搜索\n */\n private async executeSearch(request: SearchRequest, baseUrl: string): Promise<SearchResponse> {\n const startTime = Date.now();\n const model = request.model || this.defaultModel;\n\n let queryVector = request.vector;\n\n // 如果提供了 query 文本,需要生成 embedding\n if (request.query && !queryVector) {\n // 获取 AI 凭据\n const credential = await this.getAiCredential(baseUrl);\n if (!credential) {\n throw SearchApiError.noCredential();\n }\n\n try {\n queryVector = await this.embeddingService.embed(request.query, credential, model);\n } catch (error) {\n throw SearchApiError.embeddingError(error instanceof Error ? error.message : String(error));\n }\n }\n\n if (!queryVector) {\n throw SearchApiError.invalidRequest('Failed to generate query vector');\n }\n\n // 执行向量搜索\n const searchOptions: VectorSearchOptions = {\n limit: request.limit ?? this.defaultLimit,\n threshold: request.threshold,\n };\n\n try {\n const vectorResults = await this.vectorStore.search(model, queryVector, searchOptions);\n\n // 转换结果\n const results: SearchResult[] = vectorResults.map((r) => ({\n subject: this.vectorIdToSubject(r.id, baseUrl),\n score: r.score,\n distance: r.distance,\n }));\n\n return {\n results,\n model,\n took_ms: Date.now() - startTime,\n };\n } catch (error) {\n throw SearchApiError.searchError(error instanceof Error ? error.message : String(error));\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n const query = `\n PREFIX cred: <${XPOD_CREDENTIAL.NAMESPACE}>\n PREFIX ai: <${XPOD_AI.NAMESPACE}>\n SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {\n ?cred a cred:Credential ;\n cred:service \"ai\" ;\n cred:status \"active\" ;\n cred:apiKey ?apiKey .\n OPTIONAL { ?cred cred:provider ?providerUri }\n OPTIONAL {\n ?cred cred:provider ?providerUri .\n ?providerUri ai:baseUrl ?baseUrl .\n }\n OPTIONAL {\n ?cred cred:provider ?providerUri .\n ?providerUri ai:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const providerUri = binding.get('providerUri');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n const providerName = normalizeAIConfigProviderId(providerUri?.value || 'google') || 'google';\n\n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 将向量 ID 转换回 subject URI\n * 注意:这是一个简化实现,实际需要维护 ID -> URI 的映射\n */\n private vectorIdToSubject(id: number, baseUrl: string): string {\n // TODO: 实现 ID -> URI 映射查询\n // 目前返回占位符\n return `${baseUrl}#vector-${id}`;\n }\n\n // ============================================\n // 辅助方法\n // ============================================\n\n private handleError(response: HttpResponse, error: unknown): void {\n if (error instanceof SearchApiError) {\n this.logger.error(`Search API error [${error.code}]: ${error.message}`);\n this.sendErrorResponse(response, error.statusCode, error.code, error.message);\n return;\n }\n\n if (error instanceof HttpError) {\n const errorMsg = error.message || error.name || `HTTP ${error.statusCode}`;\n this.logger.error(`HTTP error ${error.statusCode}: ${errorMsg}`);\n this.sendErrorResponse(response, error.statusCode, 'HTTP_ERROR', errorMsg);\n return;\n }\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error(`Unexpected error: ${errorMsg}`);\n this.sendErrorResponse(response, 500, 'INTERNAL_ERROR', errorMsg || 'Internal server error');\n }\n\n private async authorizeFor(\n baseUrl: string,\n request: HttpRequest,\n permissions: typeof PERMISSIONS[keyof typeof PERMISSIONS][],\n ): Promise<void> {\n const credentials = await this.credentialsExtractor.handleSafe(request);\n const identifier: ResourceIdentifier = { path: baseUrl };\n const requestedModes = new IdentifierSetMultiMap([[identifier, permissions]] as any);\n\n const availablePermissions = await this.permissionReader.handleSafe({\n credentials,\n identifier,\n requestedModes,\n } as any);\n\n this.logger.debug(`authorizeFor: baseUrl=${baseUrl}, webId=${credentials.agent?.webId}`);\n\n await this.authorizer.handleSafe({\n credentials,\n identifier,\n requestedModes,\n availablePermissions,\n } as any);\n }\n\n private parseUrl(request: HttpRequest): URL {\n const protocol = request.headers['x-forwarded-proto'] || 'http';\n const host = request.headers['x-forwarded-host'] || request.headers.host || 'localhost';\n return new URL(request.url!, `${protocol}://${host}`);\n }\n\n private async readJsonBody<T>(request: HttpRequest): Promise<T> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n try {\n return JSON.parse(body) as T;\n } catch {\n throw SearchApiError.invalidRequest('Invalid JSON body');\n }\n }\n\n private sendJsonResponse(response: HttpResponse, data: unknown, status = 200): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(JSON.stringify(data));\n }\n\n private sendErrorResponse(\n response: HttpResponse,\n status: number,\n code: string,\n message: string,\n ): void {\n response.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n });\n response.end(\n JSON.stringify({\n error: true,\n code,\n message,\n }),\n );\n }\n\n private writeOptions(response: HttpResponse): void {\n response.writeHead(204, {\n 'Access-Control-Allow-Methods': ALLOWED_METHODS.join(', '),\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n });\n response.end();\n }\n}\n"]}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.VectorIndexingListener = void 0;
|
|
14
14
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
15
|
+
const models_1 = require("@undefineds.co/models");
|
|
15
16
|
/**
|
|
16
17
|
* VectorIndexingListener - 自动向量索引
|
|
17
18
|
*/
|
|
@@ -204,23 +205,23 @@ class VectorIndexingListener {
|
|
|
204
205
|
*/
|
|
205
206
|
async getAiCredential(podBaseUrl) {
|
|
206
207
|
try {
|
|
207
|
-
// 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致
|
|
208
208
|
// Credential -> Provider 关联,从 Provider 获取 baseUrl 和 proxyUrl
|
|
209
209
|
const query = `
|
|
210
|
-
PREFIX
|
|
210
|
+
PREFIX cred: <${models_1.XPOD_CREDENTIAL.NAMESPACE}>
|
|
211
|
+
PREFIX ai: <${models_1.XPOD_AI.NAMESPACE}>
|
|
211
212
|
SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {
|
|
212
|
-
?cred a
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
OPTIONAL { ?cred
|
|
213
|
+
?cred a cred:Credential ;
|
|
214
|
+
cred:service "ai" ;
|
|
215
|
+
cred:status "active" ;
|
|
216
|
+
cred:apiKey ?apiKey .
|
|
217
|
+
OPTIONAL { ?cred cred:provider ?providerUri }
|
|
217
218
|
OPTIONAL {
|
|
218
|
-
?cred
|
|
219
|
-
?providerUri
|
|
219
|
+
?cred cred:provider ?providerUri .
|
|
220
|
+
?providerUri ai:baseUrl ?baseUrl .
|
|
220
221
|
}
|
|
221
222
|
OPTIONAL {
|
|
222
|
-
?cred
|
|
223
|
-
?providerUri
|
|
223
|
+
?cred cred:provider ?providerUri .
|
|
224
|
+
?providerUri ai:proxyUrl ?proxyUrl .
|
|
224
225
|
}
|
|
225
226
|
} LIMIT 1
|
|
226
227
|
`;
|
|
@@ -231,13 +232,7 @@ class VectorIndexingListener {
|
|
|
231
232
|
const providerUri = binding.get('providerUri');
|
|
232
233
|
const proxyUrl = binding.get('proxyUrl');
|
|
233
234
|
if (apiKey) {
|
|
234
|
-
|
|
235
|
-
let providerName = 'google';
|
|
236
|
-
if (providerUri?.value) {
|
|
237
|
-
const match = providerUri.value.match(/#([^#]+)$/);
|
|
238
|
-
if (match)
|
|
239
|
-
providerName = match[1];
|
|
240
|
-
}
|
|
235
|
+
const providerName = (0, models_1.normalizeAIConfigProviderId)(providerUri?.value || 'google') || 'google';
|
|
241
236
|
return {
|
|
242
237
|
apiKey: apiKey.value,
|
|
243
238
|
baseUrl: baseUrl?.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorIndexingListener.js","sourceRoot":"","sources":["../../../src/storage/vector/VectorIndexingListener.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * VectorIndexingListener - 向量索引监听器\n *\n * 监听资源变更事件,自动触发向量索引更新。\n *\n * 工作流程:\n * 1. 收到资源变更事件\n * 2. 检查资源是否在某个 VectorStore 的 scope 内\n * 3. 如果是,读取资源内容,生成 embedding,存入向量库\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ResourceChangeEvent, ResourceChangeListener } from '../ObservableResourceStore';\nimport type { VectorStore } from '../vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { ResourceStore, RepresentationPreferences } from '@solid/community-server';\n\n/**\n * VectorStore 定义(从 RDF 读取)\n */\nexport interface VectorStoreDefinition {\n /** VectorStore URI */\n uri: string;\n /** 索引范围(Container URI) */\n scope: string;\n /** embedding 模型 */\n model: string;\n /** 状态 */\n status: 'active' | 'paused';\n /** 分块大小 */\n chunkSize?: number;\n /** 分块重叠 */\n chunkOverlap?: number;\n}\n\nexport interface VectorIndexingListenerOptions {\n /** SPARQL 引擎(用于查询 VectorStore 定义和 AI 凭据) */\n sparqlEngine: SparqlEngine;\n /** 向量存储 */\n vectorStore: VectorStore;\n /** Embedding 服务 */\n embeddingService: EmbeddingService;\n /** 资源存储(用于读取资源内容) */\n resourceStore: ResourceStore;\n /** 默认 embedding 模型 */\n defaultModel?: string;\n /** 支持的文件扩展名 */\n supportedExtensions?: string[];\n}\n\n/**\n * VectorIndexingListener - 自动向量索引\n */\nexport class VectorIndexingListener implements ResourceChangeListener {\n protected readonly logger = getLoggerFor(this);\n\n private readonly sparqlEngine: SparqlEngine;\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly resourceStore: ResourceStore;\n private readonly defaultModel: string;\n private readonly supportedExtensions: Set<string>;\n\n // 缓存 VectorStore 定义,避免频繁查询\n private vectorStoreCache = new Map<string, VectorStoreDefinition[]>();\n private cacheExpiry = 0;\n private readonly cacheTtlMs = 60000; // 1 分钟缓存\n\n public constructor(options: VectorIndexingListenerOptions) {\n this.sparqlEngine = options.sparqlEngine;\n this.vectorStore = options.vectorStore;\n this.embeddingService = options.embeddingService;\n this.resourceStore = options.resourceStore;\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.supportedExtensions = new Set(\n options.supportedExtensions ?? ['.txt', '.md', '.html', '.json', '.ttl', '.jsonld'],\n );\n }\n\n /**\n * 处理资源变更事件\n */\n public async onResourceChanged(event: ResourceChangeEvent): Promise<void> {\n const { path, action, isContainer } = event;\n\n // 跳过容器变更\n if (isContainer) {\n this.logger.debug(`Skipping container: ${path}`);\n return;\n }\n\n // 检查文件扩展名\n if (!this.isSupportedFile(path)) {\n this.logger.debug(`Skipping unsupported file type: ${path}`);\n return;\n }\n\n // 获取 Pod base URL\n const podBaseUrl = this.getPodBaseUrl(path);\n if (!podBaseUrl) {\n this.logger.debug(`Cannot determine pod base URL for: ${path}`);\n return;\n }\n\n // 如果是 VectorStore 配置文件或 Credential 配置文件更新,清除缓存\n if (path.includes('vector-stores') || path.includes('credentials')) {\n this.logger.debug(`Configuration file updated, clearing cache for ${podBaseUrl}`);\n this.vectorStoreCache.delete(podBaseUrl);\n // 配置文件本身不需要索引,直接返回\n return;\n }\n\n try {\n // 查找覆盖此路径的 VectorStore\n const vectorStores = await this.findVectorStoresForPath(path, podBaseUrl);\n if (vectorStores.length === 0) {\n this.logger.debug(`No VectorStore configured for: ${path}`);\n return;\n }\n\n this.logger.info(`Processing ${action} for ${path}, matched ${vectorStores.length} VectorStore(s)`);\n\n // 根据 action 执行索引操作\n if (action === 'delete') {\n await this.handleDelete(path, vectorStores);\n } else {\n await this.handleCreateOrUpdate(path, podBaseUrl, vectorStores);\n }\n } catch (error) {\n this.logger.error(`Failed to process ${action} for ${path}: ${error}`);\n }\n }\n\n /**\n * 处理删除操作\n */\n private async handleDelete(path: string, vectorStores: VectorStoreDefinition[]): Promise<void> {\n const vectorId = this.pathToVectorId(path);\n\n for (const vs of vectorStores) {\n try {\n await this.vectorStore.deleteVector(vs.model, vectorId);\n this.logger.info(`Deleted vector for ${path} from model ${vs.model}`);\n } catch (error) {\n this.logger.error(`Failed to delete vector for ${path}: ${error}`);\n }\n }\n }\n\n /**\n * 处理创建或更新操作\n */\n private async handleCreateOrUpdate(\n path: string,\n podBaseUrl: string,\n vectorStores: VectorStoreDefinition[],\n ): Promise<void> {\n // 读取资源内容\n const content = await this.getResourceContent(path);\n if (!content || content.trim().length === 0) {\n this.logger.debug(`Empty content for ${path}, skipping`);\n return;\n }\n\n // 获取 AI 凭据\n const credential = await this.getAiCredential(podBaseUrl);\n if (!credential) {\n this.logger.warn(`No AI credential found for ${podBaseUrl}, skipping indexing`);\n return;\n }\n\n // 为每个 VectorStore 生成 embedding 并存储\n // 注意:如果多个 VectorStore 使用相同的 model,只需要生成一次 embedding\n const modelEmbeddings = new Map<string, number[]>();\n\n for (const vs of vectorStores) {\n if (vs.status !== 'active') {\n this.logger.debug(`VectorStore ${vs.uri} is ${vs.status}, skipping`);\n continue;\n }\n\n const model = vs.model || this.defaultModel;\n\n try {\n // 检查是否已经生成过这个 model 的 embedding\n let embedding = modelEmbeddings.get(model);\n if (!embedding) {\n embedding = await this.embeddingService.embed(content, credential, model);\n modelEmbeddings.set(model, embedding);\n }\n\n // 确保向量表存在\n await this.vectorStore.ensureVectorTable(model);\n\n // 存储向量\n const vectorId = this.pathToVectorId(path);\n await this.vectorStore.upsertVector(model, vectorId, embedding);\n\n this.logger.info(`Indexed ${path} to model ${model}, vectorId=${vectorId}`);\n } catch (error) {\n this.logger.error(`Failed to index ${path} to model ${model}: ${error}`);\n }\n }\n }\n\n /**\n * 查找覆盖指定路径的 VectorStore\n */\n private async findVectorStoresForPath(\n path: string,\n podBaseUrl: string,\n ): Promise<VectorStoreDefinition[]> {\n const allStores = await this.getVectorStoreDefinitions(podBaseUrl);\n\n return allStores.filter((vs) => {\n // 检查 path 是否在 scope 内\n const scope = vs.scope.endsWith('/') ? vs.scope : `${vs.scope}/`;\n return path.startsWith(scope);\n });\n }\n\n /**\n * 获取 Pod 的所有 VectorStore 定义\n */\n private async getVectorStoreDefinitions(podBaseUrl: string): Promise<VectorStoreDefinition[]> {\n // 检查缓存\n if (Date.now() < this.cacheExpiry && this.vectorStoreCache.has(podBaseUrl)) {\n return this.vectorStoreCache.get(podBaseUrl)!;\n }\n\n try {\n // 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致\n const query = `\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?vs ?scope ?model ?status ?chunkSize ?chunkOverlap WHERE {\n ?vs a udfs:VectorStore ;\n udfs:container ?scope .\n OPTIONAL { ?vs udfs:chunkingStrategy ?model }\n OPTIONAL { ?vs udfs:status ?status }\n OPTIONAL { ?vs udfs:chunkSize ?chunkSize }\n OPTIONAL { ?vs udfs:chunkOverlap ?chunkOverlap }\n }\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n const definitions: VectorStoreDefinition[] = [];\n\n for await (const binding of bindingsStream) {\n const vs = binding.get('vs');\n const scope = binding.get('scope');\n const model = binding.get('model');\n const status = binding.get('status');\n const chunkSize = binding.get('chunkSize');\n const chunkOverlap = binding.get('chunkOverlap');\n\n if (vs && scope) {\n definitions.push({\n uri: vs.value,\n scope: this.resolveUri(scope.value, podBaseUrl),\n model: model?.value || this.defaultModel,\n status: (status?.value as 'active' | 'paused') || 'active',\n chunkSize: chunkSize ? parseInt(chunkSize.value, 10) : undefined,\n chunkOverlap: chunkOverlap ? parseInt(chunkOverlap.value, 10) : undefined,\n });\n }\n }\n\n // 更新缓存\n this.vectorStoreCache.set(podBaseUrl, definitions);\n this.cacheExpiry = Date.now() + this.cacheTtlMs;\n\n this.logger.debug(`Found ${definitions.length} VectorStore(s) for ${podBaseUrl}`);\n return definitions;\n } catch (error) {\n this.logger.error(`Failed to query VectorStore definitions: ${error}`);\n return [];\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n // 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致\n // Credential -> Provider 关联,从 Provider 获取 baseUrl 和 proxyUrl\n const query = `\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {\n ?cred a udfs:Credential ;\n udfs:service \"ai\" ;\n udfs:status \"active\" ;\n udfs:apiKey ?apiKey .\n OPTIONAL { ?cred udfs:provider ?providerUri }\n OPTIONAL { \n ?cred udfs:provider ?providerUri .\n ?providerUri udfs:baseUrl ?baseUrl .\n }\n OPTIONAL { \n ?cred udfs:provider ?providerUri .\n ?providerUri udfs:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const providerUri = binding.get('providerUri');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n // 从 provider URI 提取 provider 名称(如 #google -> google)\n let providerName = 'google';\n if (providerUri?.value) {\n const match = providerUri.value.match(/#([^#]+)$/);\n if (match) providerName = match[1];\n }\n \n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 读取资源内容\n */\n private async getResourceContent(path: string): Promise<string | null> {\n try {\n const preferences: RepresentationPreferences = {\n type: { 'text/plain': 1, 'text/markdown': 0.9, 'text/turtle': 0.8, '*/*': 0.1 },\n };\n\n const representation = await this.resourceStore.getRepresentation({ path }, preferences);\n const chunks: Buffer[] = [];\n\n for await (const chunk of representation.data) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n return Buffer.concat(chunks).toString('utf-8');\n } catch (error) {\n this.logger.error(`Failed to read resource ${path}: ${error}`);\n return null;\n }\n }\n\n /**\n * 检查是否为支持的文件类型\n */\n private isSupportedFile(path: string): boolean {\n const ext = this.getExtension(path);\n return this.supportedExtensions.has(ext);\n }\n\n /**\n * 获取文件扩展名\n */\n private getExtension(path: string): string {\n const lastDot = path.lastIndexOf('.');\n if (lastDot === -1) return '';\n return path.slice(lastDot).toLowerCase();\n }\n\n /**\n * 从路径提取 Pod base URL\n */\n private getPodBaseUrl(path: string): string | null {\n // 假设路径格式为 /username/... 或 https://pod.example.com/username/...\n try {\n const url = new URL(path, 'http://localhost');\n const parts = url.pathname.split('/').filter(Boolean);\n if (parts.length > 0) {\n return `${url.origin}/${parts[0]}/`;\n }\n } catch {\n // 相对路径\n const parts = path.split('/').filter(Boolean);\n if (parts.length > 0) {\n return `/${parts[0]}/`;\n }\n }\n return null;\n }\n\n /**\n * 解析相对 URI\n */\n private resolveUri(uri: string, baseUrl: string): string {\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return uri;\n }\n if (uri.startsWith('/')) {\n try {\n const base = new URL(baseUrl);\n return `${base.origin}${uri}`;\n } catch {\n return uri;\n }\n }\n return `${baseUrl}${uri}`;\n }\n\n /**\n * 将路径转换为向量 ID(使用 hash)\n */\n private pathToVectorId(path: string): number {\n let hash = 2166136261; // FNV offset basis\n for (let i = 0; i < path.length; i++) {\n hash ^= path.charCodeAt(i);\n hash = Math.imul(hash, 16777619); // FNV prime\n }\n return Math.abs(hash);\n }\n\n /**\n * 清除缓存\n */\n public clearCache(): void {\n this.vectorStoreCache.clear();\n this.cacheExpiry = 0;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"VectorIndexingListener.js","sourceRoot":"","sources":["../../../src/storage/vector/VectorIndexingListener.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * VectorIndexingListener - 向量索引监听器\n *\n * 监听资源变更事件,自动触发向量索引更新。\n *\n * 工作流程:\n * 1. 收到资源变更事件\n * 2. 检查资源是否在某个 VectorStore 的 scope 内\n * 3. 如果是,读取资源内容,生成 embedding,存入向量库\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ResourceChangeEvent, ResourceChangeListener } from '../ObservableResourceStore';\nimport type { VectorStore } from '../vector/VectorStore';\nimport type { EmbeddingService } from '../../ai/service/EmbeddingService';\nimport type { SparqlEngine } from '../sparql/SubgraphQueryEngine';\nimport type { AiCredential } from '../../ai/service/types';\nimport type { ResourceStore, RepresentationPreferences } from '@solid/community-server';\nimport { XPOD_AI, XPOD_CREDENTIAL, normalizeAIConfigProviderId } from '@undefineds.co/models';\n\n/**\n * VectorStore 定义(从 RDF 读取)\n */\nexport interface VectorStoreDefinition {\n /** VectorStore URI */\n uri: string;\n /** 索引范围(Container URI) */\n scope: string;\n /** embedding 模型 */\n model: string;\n /** 状态 */\n status: 'active' | 'paused';\n /** 分块大小 */\n chunkSize?: number;\n /** 分块重叠 */\n chunkOverlap?: number;\n}\n\nexport interface VectorIndexingListenerOptions {\n /** SPARQL 引擎(用于查询 VectorStore 定义和 AI 凭据) */\n sparqlEngine: SparqlEngine;\n /** 向量存储 */\n vectorStore: VectorStore;\n /** Embedding 服务 */\n embeddingService: EmbeddingService;\n /** 资源存储(用于读取资源内容) */\n resourceStore: ResourceStore;\n /** 默认 embedding 模型 */\n defaultModel?: string;\n /** 支持的文件扩展名 */\n supportedExtensions?: string[];\n}\n\n/**\n * VectorIndexingListener - 自动向量索引\n */\nexport class VectorIndexingListener implements ResourceChangeListener {\n protected readonly logger = getLoggerFor(this);\n\n private readonly sparqlEngine: SparqlEngine;\n private readonly vectorStore: VectorStore;\n private readonly embeddingService: EmbeddingService;\n private readonly resourceStore: ResourceStore;\n private readonly defaultModel: string;\n private readonly supportedExtensions: Set<string>;\n\n // 缓存 VectorStore 定义,避免频繁查询\n private vectorStoreCache = new Map<string, VectorStoreDefinition[]>();\n private cacheExpiry = 0;\n private readonly cacheTtlMs = 60000; // 1 分钟缓存\n\n public constructor(options: VectorIndexingListenerOptions) {\n this.sparqlEngine = options.sparqlEngine;\n this.vectorStore = options.vectorStore;\n this.embeddingService = options.embeddingService;\n this.resourceStore = options.resourceStore;\n this.defaultModel = options.defaultModel ?? 'text-embedding-004';\n this.supportedExtensions = new Set(\n options.supportedExtensions ?? ['.txt', '.md', '.html', '.json', '.ttl', '.jsonld'],\n );\n }\n\n /**\n * 处理资源变更事件\n */\n public async onResourceChanged(event: ResourceChangeEvent): Promise<void> {\n const { path, action, isContainer } = event;\n\n // 跳过容器变更\n if (isContainer) {\n this.logger.debug(`Skipping container: ${path}`);\n return;\n }\n\n // 检查文件扩展名\n if (!this.isSupportedFile(path)) {\n this.logger.debug(`Skipping unsupported file type: ${path}`);\n return;\n }\n\n // 获取 Pod base URL\n const podBaseUrl = this.getPodBaseUrl(path);\n if (!podBaseUrl) {\n this.logger.debug(`Cannot determine pod base URL for: ${path}`);\n return;\n }\n\n // 如果是 VectorStore 配置文件或 Credential 配置文件更新,清除缓存\n if (path.includes('vector-stores') || path.includes('credentials')) {\n this.logger.debug(`Configuration file updated, clearing cache for ${podBaseUrl}`);\n this.vectorStoreCache.delete(podBaseUrl);\n // 配置文件本身不需要索引,直接返回\n return;\n }\n\n try {\n // 查找覆盖此路径的 VectorStore\n const vectorStores = await this.findVectorStoresForPath(path, podBaseUrl);\n if (vectorStores.length === 0) {\n this.logger.debug(`No VectorStore configured for: ${path}`);\n return;\n }\n\n this.logger.info(`Processing ${action} for ${path}, matched ${vectorStores.length} VectorStore(s)`);\n\n // 根据 action 执行索引操作\n if (action === 'delete') {\n await this.handleDelete(path, vectorStores);\n } else {\n await this.handleCreateOrUpdate(path, podBaseUrl, vectorStores);\n }\n } catch (error) {\n this.logger.error(`Failed to process ${action} for ${path}: ${error}`);\n }\n }\n\n /**\n * 处理删除操作\n */\n private async handleDelete(path: string, vectorStores: VectorStoreDefinition[]): Promise<void> {\n const vectorId = this.pathToVectorId(path);\n\n for (const vs of vectorStores) {\n try {\n await this.vectorStore.deleteVector(vs.model, vectorId);\n this.logger.info(`Deleted vector for ${path} from model ${vs.model}`);\n } catch (error) {\n this.logger.error(`Failed to delete vector for ${path}: ${error}`);\n }\n }\n }\n\n /**\n * 处理创建或更新操作\n */\n private async handleCreateOrUpdate(\n path: string,\n podBaseUrl: string,\n vectorStores: VectorStoreDefinition[],\n ): Promise<void> {\n // 读取资源内容\n const content = await this.getResourceContent(path);\n if (!content || content.trim().length === 0) {\n this.logger.debug(`Empty content for ${path}, skipping`);\n return;\n }\n\n // 获取 AI 凭据\n const credential = await this.getAiCredential(podBaseUrl);\n if (!credential) {\n this.logger.warn(`No AI credential found for ${podBaseUrl}, skipping indexing`);\n return;\n }\n\n // 为每个 VectorStore 生成 embedding 并存储\n // 注意:如果多个 VectorStore 使用相同的 model,只需要生成一次 embedding\n const modelEmbeddings = new Map<string, number[]>();\n\n for (const vs of vectorStores) {\n if (vs.status !== 'active') {\n this.logger.debug(`VectorStore ${vs.uri} is ${vs.status}, skipping`);\n continue;\n }\n\n const model = vs.model || this.defaultModel;\n\n try {\n // 检查是否已经生成过这个 model 的 embedding\n let embedding = modelEmbeddings.get(model);\n if (!embedding) {\n embedding = await this.embeddingService.embed(content, credential, model);\n modelEmbeddings.set(model, embedding);\n }\n\n // 确保向量表存在\n await this.vectorStore.ensureVectorTable(model);\n\n // 存储向量\n const vectorId = this.pathToVectorId(path);\n await this.vectorStore.upsertVector(model, vectorId, embedding);\n\n this.logger.info(`Indexed ${path} to model ${model}, vectorId=${vectorId}`);\n } catch (error) {\n this.logger.error(`Failed to index ${path} to model ${model}: ${error}`);\n }\n }\n }\n\n /**\n * 查找覆盖指定路径的 VectorStore\n */\n private async findVectorStoresForPath(\n path: string,\n podBaseUrl: string,\n ): Promise<VectorStoreDefinition[]> {\n const allStores = await this.getVectorStoreDefinitions(podBaseUrl);\n\n return allStores.filter((vs) => {\n // 检查 path 是否在 scope 内\n const scope = vs.scope.endsWith('/') ? vs.scope : `${vs.scope}/`;\n return path.startsWith(scope);\n });\n }\n\n /**\n * 获取 Pod 的所有 VectorStore 定义\n */\n private async getVectorStoreDefinitions(podBaseUrl: string): Promise<VectorStoreDefinition[]> {\n // 检查缓存\n if (Date.now() < this.cacheExpiry && this.vectorStoreCache.has(podBaseUrl)) {\n return this.vectorStoreCache.get(podBaseUrl)!;\n }\n\n try {\n // 使用 undefineds.co/ns# 命名空间,与 drizzle-solid schema 一致\n const query = `\n PREFIX udfs: <https://undefineds.co/ns#>\n SELECT ?vs ?scope ?model ?status ?chunkSize ?chunkOverlap WHERE {\n ?vs a udfs:VectorStore ;\n udfs:container ?scope .\n OPTIONAL { ?vs udfs:chunkingStrategy ?model }\n OPTIONAL { ?vs udfs:status ?status }\n OPTIONAL { ?vs udfs:chunkSize ?chunkSize }\n OPTIONAL { ?vs udfs:chunkOverlap ?chunkOverlap }\n }\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n const definitions: VectorStoreDefinition[] = [];\n\n for await (const binding of bindingsStream) {\n const vs = binding.get('vs');\n const scope = binding.get('scope');\n const model = binding.get('model');\n const status = binding.get('status');\n const chunkSize = binding.get('chunkSize');\n const chunkOverlap = binding.get('chunkOverlap');\n\n if (vs && scope) {\n definitions.push({\n uri: vs.value,\n scope: this.resolveUri(scope.value, podBaseUrl),\n model: model?.value || this.defaultModel,\n status: (status?.value as 'active' | 'paused') || 'active',\n chunkSize: chunkSize ? parseInt(chunkSize.value, 10) : undefined,\n chunkOverlap: chunkOverlap ? parseInt(chunkOverlap.value, 10) : undefined,\n });\n }\n }\n\n // 更新缓存\n this.vectorStoreCache.set(podBaseUrl, definitions);\n this.cacheExpiry = Date.now() + this.cacheTtlMs;\n\n this.logger.debug(`Found ${definitions.length} VectorStore(s) for ${podBaseUrl}`);\n return definitions;\n } catch (error) {\n this.logger.error(`Failed to query VectorStore definitions: ${error}`);\n return [];\n }\n }\n\n /**\n * 获取 AI 凭据\n */\n private async getAiCredential(podBaseUrl: string): Promise<AiCredential | null> {\n try {\n // Credential -> Provider 关联,从 Provider 获取 baseUrl 和 proxyUrl\n const query = `\n PREFIX cred: <${XPOD_CREDENTIAL.NAMESPACE}>\n PREFIX ai: <${XPOD_AI.NAMESPACE}>\n SELECT ?apiKey ?baseUrl ?providerUri ?proxyUrl WHERE {\n ?cred a cred:Credential ;\n cred:service \"ai\" ;\n cred:status \"active\" ;\n cred:apiKey ?apiKey .\n OPTIONAL { ?cred cred:provider ?providerUri }\n OPTIONAL { \n ?cred cred:provider ?providerUri .\n ?providerUri ai:baseUrl ?baseUrl .\n }\n OPTIONAL { \n ?cred cred:provider ?providerUri .\n ?providerUri ai:proxyUrl ?proxyUrl .\n }\n } LIMIT 1\n `;\n\n const bindingsStream = await this.sparqlEngine.queryBindings(query, podBaseUrl);\n\n for await (const binding of bindingsStream) {\n const apiKey = binding.get('apiKey');\n const baseUrl = binding.get('baseUrl');\n const providerUri = binding.get('providerUri');\n const proxyUrl = binding.get('proxyUrl');\n\n if (apiKey) {\n const providerName = normalizeAIConfigProviderId(providerUri?.value || 'google') || 'google';\n \n return {\n apiKey: apiKey.value,\n baseUrl: baseUrl?.value,\n provider: providerName,\n proxyUrl: proxyUrl?.value,\n };\n }\n }\n\n return null;\n } catch (error) {\n this.logger.error(`Failed to query AI credential: ${error}`);\n return null;\n }\n }\n\n /**\n * 读取资源内容\n */\n private async getResourceContent(path: string): Promise<string | null> {\n try {\n const preferences: RepresentationPreferences = {\n type: { 'text/plain': 1, 'text/markdown': 0.9, 'text/turtle': 0.8, '*/*': 0.1 },\n };\n\n const representation = await this.resourceStore.getRepresentation({ path }, preferences);\n const chunks: Buffer[] = [];\n\n for await (const chunk of representation.data) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n return Buffer.concat(chunks).toString('utf-8');\n } catch (error) {\n this.logger.error(`Failed to read resource ${path}: ${error}`);\n return null;\n }\n }\n\n /**\n * 检查是否为支持的文件类型\n */\n private isSupportedFile(path: string): boolean {\n const ext = this.getExtension(path);\n return this.supportedExtensions.has(ext);\n }\n\n /**\n * 获取文件扩展名\n */\n private getExtension(path: string): string {\n const lastDot = path.lastIndexOf('.');\n if (lastDot === -1) return '';\n return path.slice(lastDot).toLowerCase();\n }\n\n /**\n * 从路径提取 Pod base URL\n */\n private getPodBaseUrl(path: string): string | null {\n // 假设路径格式为 /username/... 或 https://pod.example.com/username/...\n try {\n const url = new URL(path, 'http://localhost');\n const parts = url.pathname.split('/').filter(Boolean);\n if (parts.length > 0) {\n return `${url.origin}/${parts[0]}/`;\n }\n } catch {\n // 相对路径\n const parts = path.split('/').filter(Boolean);\n if (parts.length > 0) {\n return `/${parts[0]}/`;\n }\n }\n return null;\n }\n\n /**\n * 解析相对 URI\n */\n private resolveUri(uri: string, baseUrl: string): string {\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return uri;\n }\n if (uri.startsWith('/')) {\n try {\n const base = new URL(baseUrl);\n return `${base.origin}${uri}`;\n } catch {\n return uri;\n }\n }\n return `${baseUrl}${uri}`;\n }\n\n /**\n * 将路径转换为向量 ID(使用 hash)\n */\n private pathToVectorId(path: string): number {\n let hash = 2166136261; // FNV offset basis\n for (let i = 0; i < path.length; i++) {\n hash ^= path.charCodeAt(i);\n hash = Math.imul(hash, 16777619); // FNV prime\n }\n return Math.abs(hash);\n }\n\n /**\n * 清除缓存\n */\n public clearCache(): void {\n this.vectorStoreCache.clear();\n this.cacheExpiry = 0;\n }\n}\n"]}
|