@undefineds.co/xpod 0.2.45 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/AgentExecutorFactory.js +12 -13
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +31 -3
- package/dist/agents/config/agent-meta-schema.js +37 -3
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/index.d.ts +5 -5
- package/dist/agents/config/index.js +7 -6
- package/dist/agents/config/index.js.map +1 -1
- package/dist/agents/config/parse-agent-instructions.d.ts +12 -0
- package/dist/agents/config/parse-agent-instructions.js +23 -0
- package/dist/agents/config/parse-agent-instructions.js.map +1 -0
- package/dist/agents/config/resolve.d.ts +7 -12
- package/dist/agents/config/resolve.js +272 -156
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/config/types.d.ts +33 -36
- package/dist/agents/config/types.js +4 -4
- package/dist/agents/config/types.js.map +1 -1
- package/dist/agents/index.d.ts +2 -7
- package/dist/agents/index.js +4 -14
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +2 -2
- package/dist/agents/types.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +9 -14
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/api/ApiServer.d.ts +7 -0
- package/dist/api/ApiServer.js +5 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +1 -1
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +8 -0
- package/dist/api/chatkit/index.js +15 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +80 -17
- package/dist/api/chatkit/pod-store.js +816 -162
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.d.ts +41 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +573 -0
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.d.ts +27 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js +157 -0
- package/dist/api/chatkit/runtime/CodexRuntimeProjector.js.map +1 -0
- package/dist/api/chatkit/schema.d.ts +53 -133
- package/dist/api/chatkit/schema.js +11 -175
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/chatkit/service.d.ts +15 -9
- package/dist/api/chatkit/service.js +82 -234
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +35 -3
- package/dist/api/chatkit/store.js +157 -3
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +16 -2
- package/dist/api/chatkit/types.js +24 -5
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +59 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +15 -0
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +11 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +26 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/InngestHandler.d.ts +11 -0
- package/dist/api/handlers/InngestHandler.js +19 -0
- package/dist/api/handlers/InngestHandler.js.map +1 -0
- package/dist/api/handlers/RunHandler.d.ts +7 -0
- package/dist/api/handlers/RunHandler.js +169 -0
- package/dist/api/handlers/RunHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/models/namespaces.d.ts +2 -2
- package/dist/api/models/namespaces.js +1 -4
- package/dist/api/models/namespaces.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +83 -0
- package/dist/api/runs/AgentRuntimeTypes.js +3 -0
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -0
- package/dist/api/runs/EmbeddedInngestService.d.ts +47 -0
- package/dist/api/runs/EmbeddedInngestService.js +203 -0
- package/dist/api/runs/EmbeddedInngestService.js.map +1 -0
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +416 -0
- package/dist/api/runs/InngestRunExecutionBackend.js +225 -0
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.d.ts +52 -0
- package/dist/api/runs/ManagedRunWorker.js +452 -0
- package/dist/api/runs/ManagedRunWorker.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +66 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +614 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.d.ts +1 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js +33 -0
- package/dist/api/runs/PiAgentRuntimeWorker.js.map +1 -0
- package/dist/api/runs/RunAuthContextRegistry.d.ts +19 -0
- package/dist/api/runs/RunAuthContextRegistry.js +59 -0
- package/dist/api/runs/RunAuthContextRegistry.js.map +1 -0
- package/dist/api/runs/RunExecutionBackend.d.ts +57 -0
- package/dist/api/runs/RunExecutionBackend.js +3 -0
- package/dist/api/runs/RunExecutionBackend.js.map +1 -0
- package/dist/api/runs/RunStateCenter.d.ts +82 -0
- package/dist/api/runs/RunStateCenter.js +665 -0
- package/dist/api/runs/RunStateCenter.js.map +1 -0
- package/dist/api/runs/schema.d.ts +55 -0
- package/dist/api/runs/schema.js +14 -0
- package/dist/api/runs/schema.js.map +1 -0
- package/dist/api/runs/store.d.ts +105 -0
- package/dist/api/runs/store.js +116 -0
- package/dist/api/runs/store.js.map +1 -0
- package/dist/api/runtime.d.ts +2 -0
- package/dist/api/runtime.js +40 -1
- package/dist/api/runtime.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -0
- package/dist/api/service/VectorStoreService.js +27 -34
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/service/provider-registry.d.ts +1 -1
- package/dist/api/service/provider-registry.js +1 -1
- package/dist/api/service/provider-registry.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +751 -0
- package/dist/api/tasks/InngestTaskScheduler.js +209 -0
- package/dist/api/tasks/InngestTaskScheduler.js.map +1 -0
- package/dist/api/tasks/TaskAuthBinding.d.ts +68 -0
- package/dist/api/tasks/TaskAuthBinding.js +162 -0
- package/dist/api/tasks/TaskAuthBinding.js.map +1 -0
- package/dist/api/tasks/TaskMaterializer.d.ts +55 -0
- package/dist/api/tasks/TaskMaterializer.js +452 -0
- package/dist/api/tasks/TaskMaterializer.js.map +1 -0
- package/dist/api/tasks/TaskService.d.ts +57 -0
- package/dist/api/tasks/TaskService.js +235 -0
- package/dist/api/tasks/TaskService.js.map +1 -0
- package/dist/api/tasks/index.d.ts +6 -0
- package/dist/api/tasks/index.js +25 -0
- package/dist/api/tasks/index.js.map +1 -0
- package/dist/api/tasks/schema.d.ts +23 -0
- package/dist/api/tasks/schema.js +8 -0
- package/dist/api/tasks/schema.js.map +1 -0
- package/dist/api/tasks/store.d.ts +40 -0
- package/dist/api/tasks/store.js +34 -0
- package/dist/api/tasks/store.js.map +1 -0
- package/dist/api/workspace/types.d.ts +3 -0
- package/dist/api/workspace/types.js +23 -0
- package/dist/api/workspace/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -7
- package/dist/cli/commands/config.js +72 -48
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/login.d.ts +10 -8
- package/dist/cli/commands/login.js +84 -84
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/index.js +3 -124
- package/dist/cli/index.js.map +1 -1
- package/dist/http/search/SearchHttpHandler.js +13 -18
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/storage/vector/VectorIndexingListener.js +13 -18
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/dist/vocab/index.d.ts +2 -6
- package/dist/vocab/index.js +2 -6
- package/dist/vocab/index.js.map +1 -1
- package/dist/vocab/udfs.d.ts +12 -0
- package/dist/vocab/udfs.js +12 -0
- package/dist/vocab/udfs.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/README.md +52 -24
- package/node_modules/@undefineds.co/drizzle-solid/README.zh-CN.md +30 -24
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +6 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +43 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +5 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js +44 -13
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js +21 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +76 -41
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +443 -114
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +28 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js +142 -31
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js +84 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js +29 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +2 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -51
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +1 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js +56 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +14 -10
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js +55 -23
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js +6 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js +4 -4
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js +33 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +11 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +13 -8
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js +24 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +3 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js +28 -14
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +9 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js +56 -22
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js +2 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts +16 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/pod.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/utils/find-by-iri.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +9 -3
- package/dist/agents/AgentManager.d.ts +0 -116
- package/dist/agents/AgentManager.js +0 -290
- package/dist/agents/AgentManager.js.map +0 -1
- package/dist/agents/IndexAgent.d.ts +0 -70
- package/dist/agents/IndexAgent.js +0 -417
- package/dist/agents/IndexAgent.js.map +0 -1
- package/dist/agents/config/parse-agent-md.d.ts +0 -33
- package/dist/agents/config/parse-agent-md.js +0 -75
- package/dist/agents/config/parse-agent-md.js.map +0 -1
- package/dist/agents/schema/agent-config.d.ts +0 -2
- package/dist/agents/schema/agent-config.js +0 -32
- package/dist/agents/schema/agent-config.js.map +0 -1
- package/dist/agents/schema/create-agent-schema.d.ts +0 -25
- package/dist/agents/schema/create-agent-schema.js +0 -35
- package/dist/agents/schema/create-agent-schema.js.map +0 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.d.ts +0 -127
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js +0 -791
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +0 -1
- package/dist/cli/lib/agent-session.d.ts +0 -37
- package/dist/cli/lib/agent-session.js +0 -211
- package/dist/cli/lib/agent-session.js.map +0 -1
- package/dist/cli/lib/ensure-ai-credentials.d.ts +0 -13
- package/dist/cli/lib/ensure-ai-credentials.js +0 -40
- package/dist/cli/lib/ensure-ai-credentials.js.map +0 -1
- package/dist/cli/lib/model-manager.d.ts +0 -37
- package/dist/cli/lib/model-manager.js +0 -251
- package/dist/cli/lib/model-manager.js.map +0 -1
- package/dist/cli/lib/oauth-credential-manager.d.ts +0 -37
- package/dist/cli/lib/oauth-credential-manager.js +0 -129
- package/dist/cli/lib/oauth-credential-manager.js.map +0 -1
- package/dist/cli/lib/oauth-providers/codebuddy.d.ts +0 -25
- package/dist/cli/lib/oauth-providers/codebuddy.js +0 -69
- package/dist/cli/lib/oauth-providers/codebuddy.js.map +0 -1
- package/dist/cli/lib/oauth-providers/index.d.ts +0 -12
- package/dist/cli/lib/oauth-providers/index.js +0 -23
- package/dist/cli/lib/oauth-providers/index.js.map +0 -1
- package/dist/cli/lib/pi-optional.d.ts +0 -84
- package/dist/cli/lib/pi-optional.js +0 -35
- package/dist/cli/lib/pi-optional.js.map +0 -1
- package/dist/cli/lib/pod-ai-config.d.ts +0 -26
- package/dist/cli/lib/pod-ai-config.js +0 -99
- package/dist/cli/lib/pod-ai-config.js.map +0 -1
- package/dist/cli/lib/pod-thread-store.d.ts +0 -57
- package/dist/cli/lib/pod-thread-store.js +0 -312
- package/dist/cli/lib/pod-thread-store.js.map +0 -1
- package/dist/cli/lib/secretary-prompt.d.ts +0 -6
- package/dist/cli/lib/secretary-prompt.js +0 -85
- package/dist/cli/lib/secretary-prompt.js.map +0 -1
- package/dist/task/DrizzleTaskQueue.d.ts +0 -56
- package/dist/task/DrizzleTaskQueue.js +0 -171
- package/dist/task/DrizzleTaskQueue.js.map +0 -1
- package/dist/task/TaskExecutor.d.ts +0 -82
- package/dist/task/TaskExecutor.js +0 -198
- package/dist/task/TaskExecutor.js.map +0 -1
- package/dist/task/index.d.ts +0 -10
- package/dist/task/index.js +0 -20
- package/dist/task/index.js.map +0 -1
- package/dist/task/schema.d.ts +0 -53
- package/dist/task/schema.js +0 -71
- package/dist/task/schema.js.map +0 -1
- package/dist/task/types.d.ts +0 -186
- package/dist/task/types.js +0 -12
- package/dist/task/types.js.map +0 -1
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent Configuration Types
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* - .meta:
|
|
4
|
+
* Pod-hosted Agent Profile model:
|
|
5
|
+
* - AGENTS.md: user-editable plain Markdown guidance
|
|
6
|
+
* - .meta: RDF runtime config and references to shared skill documents
|
|
7
7
|
*
|
|
8
|
-
* The resolver combines both into a ResolvedAgentConfig ready for
|
|
8
|
+
* The resolver combines both into a ResolvedAgentConfig ready for an Agent Runtime.
|
|
9
9
|
*/
|
|
10
10
|
import type { McpServerConfig, ExecutorType } from '../types';
|
|
11
|
+
export type AgentRuntimeKind = ExecutorType | 'codex';
|
|
11
12
|
/**
|
|
12
|
-
* MCP server definition
|
|
13
|
+
* MCP server definition stored as structured RDF/JSON-like fields on .meta.
|
|
13
14
|
*/
|
|
14
15
|
export interface AgentMcpServerDef {
|
|
15
16
|
name: string;
|
|
@@ -20,27 +21,7 @@ export interface AgentMcpServerDef {
|
|
|
20
21
|
url?: string;
|
|
21
22
|
headers?: Record<string, string>;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
* Parsed AGENT.md frontmatter
|
|
25
|
-
*/
|
|
26
|
-
export interface AgentFrontmatter {
|
|
27
|
-
name?: string;
|
|
28
|
-
description?: string;
|
|
29
|
-
'max-turns'?: number;
|
|
30
|
-
'allowed-tools'?: string[] | string;
|
|
31
|
-
'disallowed-tools'?: string[] | string;
|
|
32
|
-
skills?: string[];
|
|
33
|
-
'mcp-servers'?: AgentMcpServerDef[];
|
|
34
|
-
'permission-mode'?: string;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Full parsed AGENT.md result
|
|
38
|
-
*/
|
|
39
|
-
export interface ParsedAgentMd {
|
|
40
|
-
frontmatter: AgentFrontmatter;
|
|
41
|
-
/** Markdown body = system prompt */
|
|
42
|
-
body: string;
|
|
43
|
-
}
|
|
24
|
+
export type AgentMcpServerInput = string | AgentMcpServerDef;
|
|
44
25
|
/**
|
|
45
26
|
* Agent .meta record (from Pod TTL)
|
|
46
27
|
*/
|
|
@@ -53,7 +34,7 @@ export interface AgentMetaRecord {
|
|
|
53
34
|
/** URI ref → Provider */
|
|
54
35
|
provider?: string;
|
|
55
36
|
/** Runtime class selection */
|
|
56
|
-
runtimeKind?:
|
|
37
|
+
runtimeKind?: AgentRuntimeKind;
|
|
57
38
|
/** URI ref → Credential */
|
|
58
39
|
credential?: string;
|
|
59
40
|
/** URI ref → Model */
|
|
@@ -61,23 +42,33 @@ export interface AgentMetaRecord {
|
|
|
61
42
|
enabled?: string;
|
|
62
43
|
maxTurns?: number;
|
|
63
44
|
timeout?: number;
|
|
45
|
+
/** ACP permission mode */
|
|
46
|
+
permissionMode?: string;
|
|
47
|
+
/** Tool names allowed without extra prompt-time negotiation */
|
|
48
|
+
allowedTools?: string[];
|
|
49
|
+
/** Tool names disabled for this agent */
|
|
50
|
+
disallowedTools?: string[];
|
|
51
|
+
/** Skill refs, for example skills/solid-modeling, .codex/skills/local, or /skills/shared */
|
|
52
|
+
skills?: string[];
|
|
53
|
+
/** Structured MCP server definitions; file refs are intentionally unsupported. */
|
|
54
|
+
mcpServers?: AgentMcpServerInput[];
|
|
64
55
|
}
|
|
65
56
|
/**
|
|
66
57
|
* Fully resolved agent configuration.
|
|
67
|
-
* Combines
|
|
68
|
-
* Ready to be passed to
|
|
58
|
+
* Combines AGENTS.md + .meta + resolved Pod references.
|
|
59
|
+
* Ready to be passed to Agent Runtime / ACP session.
|
|
69
60
|
*/
|
|
70
61
|
export interface ResolvedAgentConfig {
|
|
71
62
|
/** Agent ID (folder name) */
|
|
72
63
|
id: string;
|
|
73
|
-
/** Display name (from .meta
|
|
64
|
+
/** Display name (from .meta) */
|
|
74
65
|
displayName: string;
|
|
75
|
-
/** Description (from
|
|
66
|
+
/** Description (from .meta) */
|
|
76
67
|
description?: string;
|
|
77
|
-
/** System prompt (
|
|
68
|
+
/** System prompt (AGENTS.md body or .meta fallback) */
|
|
78
69
|
systemPrompt: string;
|
|
79
|
-
/** Executor type (from
|
|
80
|
-
executorType:
|
|
70
|
+
/** Executor type (from Agent .meta runtimeKind) */
|
|
71
|
+
executorType: AgentRuntimeKind;
|
|
81
72
|
/** API key (from Credential) */
|
|
82
73
|
apiKey: string;
|
|
83
74
|
/** API base URL (from Credential or Provider) */
|
|
@@ -94,10 +85,16 @@ export interface ResolvedAgentConfig {
|
|
|
94
85
|
disallowedTools?: string[];
|
|
95
86
|
/** Permission mode */
|
|
96
87
|
permissionMode?: string;
|
|
97
|
-
/** MCP servers
|
|
88
|
+
/** MCP servers resolved from .meta structured definitions */
|
|
98
89
|
mcpServers: Record<string, McpServerConfig>;
|
|
99
|
-
/** Resolved skill contents (concatenated
|
|
90
|
+
/** Resolved skill contents (concatenated Markdown for runtimes without native skill loading) */
|
|
100
91
|
skillsContent?: string;
|
|
92
|
+
/** Resolved skill documents; runtime projectors choose their own native layout */
|
|
93
|
+
skills: ResolvedAgentSkill[];
|
|
101
94
|
/** Whether agent is enabled */
|
|
102
95
|
enabled: boolean;
|
|
103
96
|
}
|
|
97
|
+
export interface ResolvedAgentSkill {
|
|
98
|
+
name: string;
|
|
99
|
+
content: string;
|
|
100
|
+
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Agent Configuration Types
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* - .meta:
|
|
5
|
+
* Pod-hosted Agent Profile model:
|
|
6
|
+
* - AGENTS.md: user-editable plain Markdown guidance
|
|
7
|
+
* - .meta: RDF runtime config and references to shared skill documents
|
|
8
8
|
*
|
|
9
|
-
* The resolver combines both into a ResolvedAgentConfig ready for
|
|
9
|
+
* The resolver combines both into a ResolvedAgentConfig ready for an Agent Runtime.
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agents/config/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * Agent Configuration Types\n *\n *
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agents/config/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * Agent Configuration Types\n *\n * Pod-hosted Agent Profile model:\n * - AGENTS.md: user-editable plain Markdown guidance\n * - .meta: RDF runtime config and references to shared skill documents\n *\n * The resolver combines both into a ResolvedAgentConfig ready for an Agent Runtime.\n */\n\nimport type { McpServerConfig, ExecutorType } from '../types';\n\nexport type AgentRuntimeKind = ExecutorType | 'codex';\n\n/**\n * MCP server definition stored as structured RDF/JSON-like fields on .meta.\n */\nexport interface AgentMcpServerDef {\n name: string;\n transport?: 'stdio' | 'sse' | 'http';\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n}\n\nexport type AgentMcpServerInput = string | AgentMcpServerDef;\n\n// ============================================\n// .meta (server-side, resolved from Pod TTL)\n// ============================================\n\n/**\n * Agent .meta record (from Pod TTL)\n */\nexport interface AgentMetaRecord {\n /** Agent ID (folder name) */\n id: string;\n name?: string;\n description?: string;\n instructions?: string;\n /** URI ref → Provider */\n provider?: string;\n /** Runtime class selection */\n runtimeKind?: AgentRuntimeKind;\n /** URI ref → Credential */\n credential?: string;\n /** URI ref → Model */\n model?: string;\n enabled?: string;\n maxTurns?: number;\n timeout?: number;\n /** ACP permission mode */\n permissionMode?: string;\n /** Tool names allowed without extra prompt-time negotiation */\n allowedTools?: string[];\n /** Tool names disabled for this agent */\n disallowedTools?: string[];\n /** Skill refs, for example skills/solid-modeling, .codex/skills/local, or /skills/shared */\n skills?: string[];\n /** Structured MCP server definitions; file refs are intentionally unsupported. */\n mcpServers?: AgentMcpServerInput[];\n}\n\n// ============================================\n// Resolved Agent Config (ready for runtime)\n// ============================================\n\n/**\n * Fully resolved agent configuration.\n * Combines AGENTS.md + .meta + resolved Pod references.\n * Ready to be passed to Agent Runtime / ACP session.\n */\nexport interface ResolvedAgentConfig {\n /** Agent ID (folder name) */\n id: string;\n /** Display name (from .meta) */\n displayName: string;\n /** Description (from .meta) */\n description?: string;\n /** System prompt (AGENTS.md body or .meta fallback) */\n systemPrompt: string;\n\n // --- Resolved from .meta ---\n /** Executor type (from Agent .meta runtimeKind) */\n executorType: AgentRuntimeKind;\n /** API key (from Credential) */\n apiKey: string;\n /** API base URL (from Credential or Provider) */\n baseUrl?: string;\n /** Proxy URL */\n proxyUrl?: string;\n /** Model name (resolved from Model URI) */\n model?: string;\n\n /** Max conversation turns */\n maxTurns?: number;\n /** Allowed tools list */\n allowedTools?: string[];\n /** Disallowed tools list */\n disallowedTools?: string[];\n /** Permission mode */\n permissionMode?: string;\n /** MCP servers resolved from .meta structured definitions */\n mcpServers: Record<string, McpServerConfig>;\n /** Resolved skill contents (concatenated Markdown for runtimes without native skill loading) */\n skillsContent?: string;\n /** Resolved skill documents; runtime projectors choose their own native layout */\n skills: ResolvedAgentSkill[];\n\n /** Whether agent is enabled */\n enabled: boolean;\n}\n\nexport interface ResolvedAgentSkill {\n name: string;\n content: string;\n}\n"]}
|
package/dist/agents/index.d.ts
CHANGED
|
@@ -15,10 +15,5 @@ export { CodeBuddyExecutor, CodeBuddyAuthError, createCodeBuddyExecutor } from '
|
|
|
15
15
|
export { ClaudeExecutor, ClaudeAuthenticationError, createClaudeExecutor } from './ClaudeExecutor';
|
|
16
16
|
export { BaseAgentExecutor } from './BaseAgentExecutor';
|
|
17
17
|
export { Provider, ProviderRelations, RuntimeKind } from './schema/tables';
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export type { AgentInstance, AgentConfig } from './AgentManager';
|
|
21
|
-
export { IndexAgent, indexAgent } from './IndexAgent';
|
|
22
|
-
export type { IndexLevel, IndexAgentOptions } from './IndexAgent';
|
|
23
|
-
export { parseAgentMd, AgentMetaSchema, resolveAgentConfig } from './config';
|
|
24
|
-
export type { AgentFrontmatter, AgentMcpServerDef, AgentMetaRecord, ParsedAgentMd, ResolvedAgentConfig, } from './config';
|
|
18
|
+
export { parseAgentInstructions, extractMarkdownBody, AgentMetaSchema, resolveAgentConfig } from './config';
|
|
19
|
+
export type { AgentMcpServerDef, AgentMetaRecord, ResolvedAgentConfig, } from './config';
|
package/dist/agents/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 所有执行器都实现 IAgentExecutor 接口,通过 AgentExecutorFactory 从 Pod 读取凭证创建。
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.resolveAgentConfig = exports.AgentMetaSchema = exports.
|
|
14
|
+
exports.resolveAgentConfig = exports.AgentMetaSchema = exports.extractMarkdownBody = exports.parseAgentInstructions = exports.RuntimeKind = exports.ProviderRelations = exports.Provider = exports.BaseAgentExecutor = exports.createClaudeExecutor = exports.ClaudeAuthenticationError = exports.ClaudeExecutor = exports.createCodeBuddyExecutor = exports.CodeBuddyAuthError = exports.CodeBuddyExecutor = exports.SUPPORTED_EXECUTOR_TYPES = exports.agentExecutorFactory = exports.AgentExecutorFactory = void 0;
|
|
15
15
|
// 执行器工厂
|
|
16
16
|
var AgentExecutorFactory_1 = require("./AgentExecutorFactory");
|
|
17
17
|
Object.defineProperty(exports, "AgentExecutorFactory", { enumerable: true, get: function () { return AgentExecutorFactory_1.AgentExecutorFactory; } });
|
|
@@ -34,20 +34,10 @@ var tables_1 = require("./schema/tables");
|
|
|
34
34
|
Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return tables_1.Provider; } });
|
|
35
35
|
Object.defineProperty(exports, "ProviderRelations", { enumerable: true, get: function () { return tables_1.ProviderRelations; } });
|
|
36
36
|
Object.defineProperty(exports, "RuntimeKind", { enumerable: true, get: function () { return tables_1.RuntimeKind; } });
|
|
37
|
-
|
|
38
|
-
Object.defineProperty(exports, "AgentConfigTable", { enumerable: true, get: function () { return agent_config_1.AgentConfig; } });
|
|
39
|
-
Object.defineProperty(exports, "AgentStatus", { enumerable: true, get: function () { return agent_config_1.AgentStatus; } });
|
|
40
|
-
// Agent Manager
|
|
41
|
-
var AgentManager_1 = require("./AgentManager");
|
|
42
|
-
Object.defineProperty(exports, "AgentManager", { enumerable: true, get: function () { return AgentManager_1.AgentManager; } });
|
|
43
|
-
Object.defineProperty(exports, "agentManager", { enumerable: true, get: function () { return AgentManager_1.agentManager; } });
|
|
44
|
-
// IndexAgent
|
|
45
|
-
var IndexAgent_1 = require("./IndexAgent");
|
|
46
|
-
Object.defineProperty(exports, "IndexAgent", { enumerable: true, get: function () { return IndexAgent_1.IndexAgent; } });
|
|
47
|
-
Object.defineProperty(exports, "indexAgent", { enumerable: true, get: function () { return IndexAgent_1.indexAgent; } });
|
|
48
|
-
// Agent Config (per-agent AGENT.md + .meta)
|
|
37
|
+
// Agent Config (per-agent AGENTS.md + .meta)
|
|
49
38
|
var config_1 = require("./config");
|
|
50
|
-
Object.defineProperty(exports, "
|
|
39
|
+
Object.defineProperty(exports, "parseAgentInstructions", { enumerable: true, get: function () { return config_1.parseAgentInstructions; } });
|
|
40
|
+
Object.defineProperty(exports, "extractMarkdownBody", { enumerable: true, get: function () { return config_1.extractMarkdownBody; } });
|
|
51
41
|
Object.defineProperty(exports, "AgentMetaSchema", { enumerable: true, get: function () { return config_1.AgentMetaSchema; } });
|
|
52
42
|
Object.defineProperty(exports, "resolveAgentConfig", { enumerable: true, get: function () { return config_1.resolveAgentConfig; } });
|
|
53
43
|
//# sourceMappingURL=index.js.map
|
package/dist/agents/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAmBH,QAAQ;AACR,+DAA8G;AAArG,4HAAA,oBAAoB,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AAAE,gIAAA,wBAAwB,OAAA;AAE7E,+BAA+B;AAC/B,yDAAqG;AAA5F,sHAAA,iBAAiB,OAAA;AAAE,uHAAA,kBAAkB,OAAA;AAAE,4HAAA,uBAAuB,OAAA;AACvE,mDAAmG;AAA1F,gHAAA,cAAc,OAAA;AAAE,2HAAA,yBAAyB,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAExE,OAAO;AACP,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAE1B,SAAS;AACT,0CAA2E;AAAlE,kGAAA,QAAQ,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,qGAAA,WAAW,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAmBH,QAAQ;AACR,+DAA8G;AAArG,4HAAA,oBAAoB,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AAAE,gIAAA,wBAAwB,OAAA;AAE7E,+BAA+B;AAC/B,yDAAqG;AAA5F,sHAAA,iBAAiB,OAAA;AAAE,uHAAA,kBAAkB,OAAA;AAAE,4HAAA,uBAAuB,OAAA;AACvE,mDAAmG;AAA1F,gHAAA,cAAc,OAAA;AAAE,2HAAA,yBAAyB,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AAExE,OAAO;AACP,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAE1B,SAAS;AACT,0CAA2E;AAAlE,kGAAA,QAAQ,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,qGAAA,WAAW,OAAA;AAEjD,6CAA6C;AAC7C,mCAA4G;AAAnG,gHAAA,sBAAsB,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,4GAAA,kBAAkB,OAAA","sourcesContent":["/**\n * Agents 模块导出\n *\n * 统一的 AI Agent 执行框架。\n *\n * 支持的 AI 供应商(有完整 Agent SDK):\n * - CodeBuddy: @tencent-ai/agent-sdk\n * - Claude: @anthropic-ai/claude-agent-sdk\n *\n * 所有执行器都实现 IAgentExecutor 接口,通过 AgentExecutorFactory 从 Pod 读取凭证创建。\n */\n\n// 类型定义\nexport type {\n ExecutorType,\n AuthType,\n AiCredential,\n ProviderConfig,\n AuthInfo,\n ExecutorConfig,\n ExecuteResult,\n ExecuteMessage,\n ChatMessage,\n IAgentExecutor,\n BaseExecutorOptions,\n CodeBuddyConfig,\n CodeBuddyOptions,\n} from './types';\n\n// 执行器工厂\nexport { AgentExecutorFactory, agentExecutorFactory, SUPPORTED_EXECUTOR_TYPES } from './AgentExecutorFactory';\n\n// 执行器实现(仅支持有完整 Agent SDK 的供应商)\nexport { CodeBuddyExecutor, CodeBuddyAuthError, createCodeBuddyExecutor } from './CodeBuddyExecutor';\nexport { ClaudeExecutor, ClaudeAuthenticationError, createClaudeExecutor } from './ClaudeExecutor';\n\n// 抽象基类\nexport { BaseAgentExecutor } from './BaseAgentExecutor';\n\n// Schema\nexport { Provider, ProviderRelations, RuntimeKind } from './schema/tables';\n\n// Agent Config (per-agent AGENTS.md + .meta)\nexport { parseAgentInstructions, extractMarkdownBody, AgentMetaSchema, resolveAgentConfig } from './config';\nexport type {\n AgentMcpServerDef,\n AgentMetaRecord,\n ResolvedAgentConfig,\n} from './config';\n"]}
|
package/dist/agents/types.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export type McpServerConfig = {
|
|
|
32
32
|
* - claude: @anthropic-ai/claude-agent-sdk
|
|
33
33
|
*
|
|
34
34
|
* 不支持的原因:
|
|
35
|
-
* - OpenAI: 没有完整的 Agent SDK,Codex CLI
|
|
35
|
+
* - OpenAI: 没有完整的 Agent SDK,Codex CLI 通过 ACP runner 接入,不走这里
|
|
36
36
|
* - Gemini: 没有完整的 Agent SDK,CLI core 使用 MCP 不使用 ACP
|
|
37
37
|
*/
|
|
38
38
|
export type ExecutorType = 'codebuddy' | 'claude';
|
|
@@ -65,7 +65,7 @@ export interface ProviderConfig {
|
|
|
65
65
|
id: string;
|
|
66
66
|
/** 显示名称 */
|
|
67
67
|
displayName: string;
|
|
68
|
-
/** 运行时类型(来自
|
|
68
|
+
/** 运行时类型(来自 Agent .meta runtimeKind,不存储在 Provider 实体) */
|
|
69
69
|
executorType: ExecutorType;
|
|
70
70
|
/** API 端点 */
|
|
71
71
|
baseUrl?: string;
|
package/dist/agents/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Agent Executor 类型定义\n *\n * 统一的 AI Agent 执行框架接口。\n * 供应商配置从 Pod 读取,不在代码中硬编码。\n */\n\n/**\n * 通用 MCP Server 配置类型\n *\n * 这是一个宽松的类型定义,各个 Executor 会在内部转换为对应 SDK 的具体类型。\n * 支持的配置类型:\n * - stdio: { command: string, args?: string[], env?: Record<string, string> }\n * - sse: { type: 'sse', url: string, headers?: Record<string, string> }\n * - http: { type: 'http', url: string, headers?: Record<string, string> }\n * - sdk: { type: 'sdk', name: string, instance?: McpServer }\n */\nexport type McpServerConfig = {\n type?: 'stdio' | 'sse' | 'http' | 'sdk';\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n name?: string;\n [key: string]: unknown;\n};\n\n/**\n * 执行器类型(SDK 类型)\n *\n * 只支持有完整 Agent SDK 的供应商:\n * - codebuddy: @tencent-ai/agent-sdk\n * - claude: @anthropic-ai/claude-agent-sdk\n *\n * 不支持的原因:\n * - OpenAI: 没有完整的 Agent SDK,Codex CLI
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Agent Executor 类型定义\n *\n * 统一的 AI Agent 执行框架接口。\n * 供应商配置从 Pod 读取,不在代码中硬编码。\n */\n\n/**\n * 通用 MCP Server 配置类型\n *\n * 这是一个宽松的类型定义,各个 Executor 会在内部转换为对应 SDK 的具体类型。\n * 支持的配置类型:\n * - stdio: { command: string, args?: string[], env?: Record<string, string> }\n * - sse: { type: 'sse', url: string, headers?: Record<string, string> }\n * - http: { type: 'http', url: string, headers?: Record<string, string> }\n * - sdk: { type: 'sdk', name: string, instance?: McpServer }\n */\nexport type McpServerConfig = {\n type?: 'stdio' | 'sse' | 'http' | 'sdk';\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n name?: string;\n [key: string]: unknown;\n};\n\n/**\n * 执行器类型(SDK 类型)\n *\n * 只支持有完整 Agent SDK 的供应商:\n * - codebuddy: @tencent-ai/agent-sdk\n * - claude: @anthropic-ai/claude-agent-sdk\n *\n * 不支持的原因:\n * - OpenAI: 没有完整的 Agent SDK,Codex CLI 通过 ACP runner 接入,不走这里\n * - Gemini: 没有完整的 Agent SDK,CLI core 使用 MCP 不使用 ACP\n */\nexport type ExecutorType = 'codebuddy' | 'claude';\n\n/**\n * 认证类型\n */\nexport type AuthType = 'api-key' | 'oidc';\n\n/**\n * AI 凭证(从 Pod 读取)\n */\nexport interface AiCredential {\n /** 提供商 ID(对应 Pod 中的 provider URI fragment) */\n providerId: string;\n /** API Key */\n apiKey: string;\n /** 自定义 API 端点 */\n baseUrl?: string;\n /** 代理 URL */\n proxyUrl?: string;\n /** 项目 ID (Gemini Vertex AI) */\n projectId?: string;\n /** 组织 ID (OpenAI) */\n organizationId?: string;\n}\n\n/**\n * 供应商配置(Pod Provider + Agent runtime 的组合视图)\n */\nexport interface ProviderConfig {\n /** 供应商 ID */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 运行时类型(来自 Agent .meta runtimeKind,不存储在 Provider 实体) */\n executorType: ExecutorType;\n /** API 端点 */\n baseUrl?: string;\n /** 默认模型 ID */\n defaultModel?: string;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/**\n * 认证信息\n */\nexport interface AuthInfo {\n /** 是否已认证 */\n authenticated: boolean;\n /** 认证类型 */\n authType: AuthType;\n /** 供应商 ID */\n providerId: string;\n /** 执行器类型 */\n executorType: ExecutorType;\n /** 过期时间 */\n expiresAt?: Date;\n /** 账户信息 */\n account?: {\n email?: string;\n name?: string;\n };\n}\n\n/**\n * 执行器配置(基础)\n */\nexport interface ExecutorConfig {\n /** Agent 名称 */\n name: string;\n /** Agent 描述 */\n description?: string;\n /** System prompt */\n systemPrompt: string;\n /** 模型名称 */\n model?: string;\n /** 最大输出 tokens */\n maxTokens?: number;\n /** 温度参数 (0-2) */\n temperature?: number;\n /** Top-P 参数 */\n topP?: number;\n /** 工作目录 */\n workingDirectory?: string;\n /** 可用工具列表 */\n tools?: string[];\n /** 允许的工具列表(自动允许,不需要权限确认) */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'dontAsk';\n}\n\n/**\n * CodeBuddy 扩展配置\n */\nexport interface CodeBuddyConfig extends ExecutorConfig {\n /** 工作目录(限制文件操作范围) */\n cwd?: string;\n /** 允许的工具列表 */\n allowedTools?: string[];\n /** 禁用的工具列表 */\n disallowedTools?: string[];\n /** MCP 服务器配置 */\n mcpServers?: Record<string, McpServerConfig>;\n /** 最大轮数 */\n maxTurns?: number;\n /** 权限模式 */\n permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions';\n}\n\n/**\n * CodeBuddy 执行选项\n */\nexport interface CodeBuddyOptions {\n /** Pod base URL */\n podBaseUrl?: string;\n /** OAuth access token(用于 MCP 访问 Pod) */\n accessToken?: string;\n /** 超时时间(毫秒) */\n timeout?: number;\n /** 额外上下文 */\n context?: Record<string, unknown>;\n}\n\n/**\n * 执行结果(基础)\n */\nexport interface ExecuteResult {\n /** 是否成功 */\n success: boolean;\n /** 结果文本 */\n result?: string;\n /** 错误信息 */\n error?: string;\n /** 结构化输出(CodeBuddy 专用) */\n structuredOutput?: unknown;\n /** 使用统计 */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n durationMs: number;\n };\n}\n\n/**\n * 执行消息类型\n */\nexport type ExecuteMessage =\n | { type: 'system'; executorType: ExecutorType; model: string; tools?: string[] }\n | { type: 'text'; content: string }\n | { type: 'tool_call'; toolName: string; toolInput: unknown }\n | { type: 'tool_result'; toolName: string; result: string }\n | { type: 'error'; error: string }\n | { type: 'done'; result: ExecuteResult };\n\n/**\n * 聊天消息\n */\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\n/**\n * Agent 执行器接口\n *\n * 所有 AI 执行器都必须实现此接口。\n */\nexport interface IAgentExecutor {\n /** 执行器类型 */\n readonly executorType: ExecutorType;\n\n /** 供应商 ID */\n readonly providerId: string;\n\n /**\n * 获取认证类型\n */\n getAuthType(): AuthType;\n\n /**\n * 检查认证状态\n */\n checkAuthentication(): Promise<AuthInfo>;\n\n /**\n * 执行任务(流式)\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 异步迭代器,yield 执行过程中的消息\n */\n execute(config: ExecutorConfig, message: string): AsyncGenerator<ExecuteMessage>;\n\n /**\n * 执行任务并等待完成\n *\n * @param config 执行器配置\n * @param message 用户消息\n * @returns 执行结果\n */\n executeAndWait(config: ExecutorConfig, message: string): Promise<ExecuteResult>;\n\n /**\n * 多轮对话\n *\n * @param config 执行器配置\n * @param messages 对话历史\n * @returns 执行结果\n */\n chat(config: ExecutorConfig, messages: ChatMessage[]): Promise<ExecuteResult>;\n}\n\n/**\n * 执行器基类选项\n */\nexport interface BaseExecutorOptions {\n /** 供应商 ID */\n providerId: string;\n /** 凭证 */\n credential: AiCredential;\n /** 供应商配置(可选,用于覆盖默认值) */\n providerConfig?: Partial<ProviderConfig>;\n}\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CredentialReaderImpl = void 0;
|
|
4
4
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
5
|
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
6
|
+
const models_1 = require("@undefineds.co/models");
|
|
6
7
|
const CredentialReader_1 = require("./CredentialReader");
|
|
7
8
|
const tables_1 = require("../../credential/schema/tables");
|
|
8
9
|
const provider_1 = require("../schema/provider");
|
|
@@ -23,26 +24,20 @@ class CredentialReaderImpl extends CredentialReader_1.CredentialReader {
|
|
|
23
24
|
fetch: authenticatedFetch,
|
|
24
25
|
};
|
|
25
26
|
const db = (0, drizzle_solid_1.drizzle)(session, { schema });
|
|
26
|
-
// 构建 Provider URI
|
|
27
|
-
const providerUri = `${podBaseUrl}settings/ai/providers.ttl#${providerId}`;
|
|
28
|
-
// 查询 credential,直接通过 provider URI 过滤
|
|
29
27
|
const credentials = await db.query.credential.findMany({
|
|
30
|
-
where: (0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(tables_1.Credential.service, types_1.ServiceType.AI), (0, drizzle_solid_1.eq)(tables_1.Credential.status, types_1.CredentialStatus.ACTIVE)
|
|
31
|
-
with: {
|
|
32
|
-
provider: true,
|
|
33
|
-
},
|
|
28
|
+
where: (0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(tables_1.Credential.service, types_1.ServiceType.AI), (0, drizzle_solid_1.eq)(tables_1.Credential.status, types_1.CredentialStatus.ACTIVE)),
|
|
34
29
|
});
|
|
35
|
-
|
|
30
|
+
const providers = await db.query.provider.findMany();
|
|
31
|
+
const selection = (0, models_1.selectAIConfigCredential)(providerId, credentials, providers);
|
|
32
|
+
if (!selection) {
|
|
36
33
|
this.logger.debug(`No active credential found for provider: ${providerId}`);
|
|
37
34
|
return null;
|
|
38
35
|
}
|
|
39
|
-
// 随机选择一个(负载均衡)
|
|
40
|
-
const credential = credentials[Math.floor(Math.random() * credentials.length)];
|
|
41
36
|
return {
|
|
42
|
-
provider: providerId,
|
|
43
|
-
apiKey:
|
|
44
|
-
baseUrl:
|
|
45
|
-
proxyUrl:
|
|
37
|
+
provider: selection.providerId,
|
|
38
|
+
apiKey: selection.apiKey,
|
|
39
|
+
baseUrl: selection.baseUrl,
|
|
40
|
+
proxyUrl: selection.proxyUrl,
|
|
46
41
|
};
|
|
47
42
|
}
|
|
48
43
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialReaderImpl.js","sourceRoot":"","sources":["../../../src/ai/service/CredentialReaderImpl.ts"],"names":[],"mappings":";;;AAAA,iEAAqD;AACrD,gEAAgE;AAChE,yDAAsD;AAEtD,2DAA4D;AAC5D,iDAA8C;AAC9C,yDAA8E;AAE9E,MAAM,MAAM,GAAG;IACb,UAAU,EAAE,mBAAU;IACtB,QAAQ,EAAE,mBAAQ;CACnB,CAAC;AAEF,MAAa,oBAAqB,SAAQ,mCAAgB;IAA1D;;QACqB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"CredentialReaderImpl.js","sourceRoot":"","sources":["../../../src/ai/service/CredentialReaderImpl.ts"],"names":[],"mappings":";;;AAAA,iEAAqD;AACrD,gEAAgE;AAChE,kDAAiE;AACjE,yDAAsD;AAEtD,2DAA4D;AAC5D,iDAA8C;AAC9C,yDAA8E;AAE9E,MAAM,MAAM,GAAG;IACb,UAAU,EAAE,mBAAU;IACtB,QAAQ,EAAE,mBAAQ;CACnB,CAAC;AAEF,MAAa,oBAAqB,SAAQ,mCAAgB;IAA1D;;QACqB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;IAwCjD,CAAC;IAtCiB,KAAK,CAAC,eAAe,CACnC,UAAkB,EAClB,UAAkB,EAClB,kBAAgC,EAChC,KAAc;QAEd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;gBACjC,KAAK,EAAE,kBAAkB;aAC1B,CAAC;YACF,MAAM,EAAE,GAAQ,IAAA,uBAAO,EAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAE7C,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACrD,KAAK,EAAE,IAAA,mBAAG,EACR,IAAA,kBAAE,EAAC,mBAAU,CAAC,OAAO,EAAE,mBAAW,CAAC,EAAE,CAAC,EACtC,IAAA,kBAAE,EAAC,mBAAU,CAAC,MAAM,EAAE,wBAAgB,CAAC,MAAM,CAAC,CAC/C;aACF,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,IAAA,iCAAwB,EAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,UAAU,EAAE,CAAC,CAAC;gBAC5E,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,SAAS,CAAC,UAAU;gBAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAzCD,oDAyCC","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq, and } from '@undefineds.co/drizzle-solid';\nimport { selectAIConfigCredential } from '@undefineds.co/models';\nimport { CredentialReader } from './CredentialReader';\nimport type { AiCredential } from './types';\nimport { Credential } from '../../credential/schema/tables';\nimport { Provider } from '../schema/provider';\nimport { ServiceType, CredentialStatus } from '../../credential/schema/types';\n\nconst schema = {\n credential: Credential,\n provider: Provider,\n};\n\nexport class CredentialReaderImpl extends CredentialReader {\n protected readonly logger = getLoggerFor(this);\n\n public override async getAiCredential(\n podBaseUrl: string,\n providerId: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<AiCredential | null> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db: any = drizzle(session, { schema });\n\n const credentials = await db.query.credential.findMany({\n where: and(\n eq(Credential.service, ServiceType.AI),\n eq(Credential.status, CredentialStatus.ACTIVE),\n ),\n });\n const providers = await db.query.provider.findMany();\n const selection = selectAIConfigCredential(providerId, credentials, providers);\n\n if (!selection) {\n this.logger.debug(`No active credential found for provider: ${providerId}`);\n return null;\n }\n\n return {\n provider: selection.providerId,\n apiKey: selection.apiKey,\n baseUrl: selection.baseUrl,\n proxyUrl: selection.proxyUrl,\n };\n } catch (error) {\n this.logger.error(`Failed to read credential for provider ${providerId}:`, error);\n return null;\n }\n }\n}\n"]}
|
package/dist/api/ApiServer.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export interface Route {
|
|
|
15
15
|
handler: RouteHandler;
|
|
16
16
|
/** If true, skip authentication */
|
|
17
17
|
public?: boolean;
|
|
18
|
+
/** If true, match all methods instead of one method. */
|
|
19
|
+
allMethods?: boolean;
|
|
18
20
|
}
|
|
19
21
|
export interface ApiServerOptions {
|
|
20
22
|
port?: number;
|
|
@@ -43,6 +45,8 @@ export declare class ApiServer {
|
|
|
43
45
|
route(method: string, path: string, handler: RouteHandler, options?: {
|
|
44
46
|
/** If true, skip authentication for this route */
|
|
45
47
|
public?: boolean;
|
|
48
|
+
/** If true, match all methods instead of one method */
|
|
49
|
+
allMethods?: boolean;
|
|
46
50
|
}): void;
|
|
47
51
|
/**
|
|
48
52
|
* Convenience methods for common HTTP methods
|
|
@@ -62,6 +66,9 @@ export declare class ApiServer {
|
|
|
62
66
|
patch(path: string, handler: RouteHandler, options?: {
|
|
63
67
|
public?: boolean;
|
|
64
68
|
}): void;
|
|
69
|
+
all(path: string, handler: RouteHandler, options?: {
|
|
70
|
+
public?: boolean;
|
|
71
|
+
}): void;
|
|
65
72
|
/**
|
|
66
73
|
* Start the server
|
|
67
74
|
*/
|
package/dist/api/ApiServer.js
CHANGED
|
@@ -31,6 +31,7 @@ class ApiServer {
|
|
|
31
31
|
paramNames,
|
|
32
32
|
handler,
|
|
33
33
|
public: options?.public,
|
|
34
|
+
allMethods: options?.allMethods,
|
|
34
35
|
});
|
|
35
36
|
this.logger.debug(`Registered route: ${method.toUpperCase()} ${path}${options?.public ? ' (public)' : ''}`);
|
|
36
37
|
}
|
|
@@ -52,6 +53,9 @@ class ApiServer {
|
|
|
52
53
|
patch(path, handler, options) {
|
|
53
54
|
this.route('PATCH', path, handler, options);
|
|
54
55
|
}
|
|
56
|
+
all(path, handler, options) {
|
|
57
|
+
this.route('ALL', path, handler, { ...options, allMethods: true });
|
|
58
|
+
}
|
|
55
59
|
/**
|
|
56
60
|
* Start the server
|
|
57
61
|
*/
|
|
@@ -139,7 +143,7 @@ class ApiServer {
|
|
|
139
143
|
}
|
|
140
144
|
findRoute(method, path) {
|
|
141
145
|
for (const route of this.routes) {
|
|
142
|
-
if (route.method !== method) {
|
|
146
|
+
if (!route.allMethods && route.method !== method) {
|
|
143
147
|
continue;
|
|
144
148
|
}
|
|
145
149
|
const match = route.pattern.exec(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiServer.js","sourceRoot":"","sources":["../../src/api/ApiServer.ts"],"names":[],"mappings":";;;AAAA,yCAAiG;AACjG,iEAAqD;AAErD,0EAAuE;AAkCvE;;GAEG;AACH,MAAa,SAAS;IASpB,YAAmB,OAAyB;QAR3B,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAK5B,WAAM,GAAY,EAAE,CAAC;QAIpC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,iCAAe,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;YACpF,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACI,KAAK,CACV,MAAc,EACd,IAAY,EACZ,OAAqB,EACrB,OAGC;QAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YAC5B,OAAO;YACP,UAAU;YACV,OAAO;YACP,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY,EAAE,OAAqB,EAAE,OAA8B;QAC5E,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,IAAI,CAAC,IAAY,EAAE,OAAqB,EAAE,OAA8B;QAC7E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,GAAG,CAAC,IAAY,EAAE,OAAqB,EAAE,OAA8B;QAC5E,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,OAAqB,EAAE,OAA8B;QAC/E,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,IAAY,EAAE,OAAqB,EAAE,OAA8B;QAC9E,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK;QAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,GAAG,IAAA,wBAAY,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACtC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;oBAC/C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;wBACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;wBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC1G,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,MAAM,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACvC,OAAO,EAAE,CAAC;YACd,CAAC,EAAE,MAAM,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,aAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAwB,EAAE,QAAwB;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACzF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE1B,wBAAwB;QACxB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEnC,sBAAsB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAChC,MAAM,WAAW,GAAG,OAA+B,CAAC;QAEpD,6CAA6C;QAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC1B,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;gBAC1B,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBACvD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,MAAc,EAAE,IAAY;QAC5C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAC1C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACvC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,IAAI;YACjB,8BAA8B;aAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;YACF,yBAAyB;aACxB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YACxC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;aACD,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,IAAI,MAAM,CAAC,IAAI,QAAQ,GAAG,CAAC;YACpC,UAAU;SACX,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,OAAwB,EAAE,QAAwB;QACnE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAEtC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;YAC1D,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,QAAQ,CAAC,SAAS,CAAC,8BAA8B,EAAE,wCAAwC,CAAC,CAAC;QAC7F,QAAQ,CAAC,SAAS,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACxD,QAAQ,CAAC,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;CACF;AAtND,8BAsNC","sourcesContent":["import { createServer, type Server, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { AuthMiddleware, AuthenticatedRequest } from './middleware/AuthMiddleware';\nimport { nodeRuntimeHost } from '../runtime/host/node/NodeRuntimeHost';\nimport type { RuntimeHost, RuntimeListenEndpoint } from '../runtime/host/types';\n\n/**\n * Route handler function\n */\nexport type RouteHandler = (\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n) => Promise<void>;\n\n/**\n * Route definition\n */\nexport interface Route {\n method: string;\n pattern: RegExp;\n paramNames: string[];\n handler: RouteHandler;\n /** If true, skip authentication */\n public?: boolean;\n}\n\nexport interface ApiServerOptions {\n port?: number;\n host?: string;\n socketPath?: string;\n listenEndpoint?: RuntimeListenEndpoint;\n runtimeHost?: RuntimeHost;\n authMiddleware: AuthMiddleware;\n corsOrigins?: string[];\n}\n\n/**\n * Standalone API Server\n */\nexport class ApiServer {\n private readonly logger = getLoggerFor(this);\n private readonly runtimeHost: RuntimeHost;\n private readonly listenEndpoint: RuntimeListenEndpoint;\n private readonly authMiddleware: AuthMiddleware;\n private readonly corsOrigins: string[];\n private readonly routes: Route[] = [];\n private server?: Server;\n\n public constructor(options: ApiServerOptions) {\n this.runtimeHost = options.runtimeHost ?? nodeRuntimeHost;\n this.listenEndpoint = options.listenEndpoint ?? this.runtimeHost.createListenEndpoint({\n port: options.port,\n host: options.host,\n socketPath: options.socketPath,\n });\n this.authMiddleware = options.authMiddleware;\n this.corsOrigins = options.corsOrigins ?? ['*'];\n }\n\n /**\n * Register a route\n */\n public route(\n method: string,\n path: string,\n handler: RouteHandler,\n options?: {\n /** If true, skip authentication for this route */\n public?: boolean;\n },\n ): void {\n const { pattern, paramNames } = this.pathToRegex(path);\n this.routes.push({\n method: method.toUpperCase(),\n pattern,\n paramNames,\n handler,\n public: options?.public,\n });\n this.logger.debug(`Registered route: ${method.toUpperCase()} ${path}${options?.public ? ' (public)' : ''}`);\n }\n\n /**\n * Convenience methods for common HTTP methods\n */\n public get(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('GET', path, handler, options);\n }\n\n public post(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('POST', path, handler, options);\n }\n\n public put(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('PUT', path, handler, options);\n }\n\n public delete(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('DELETE', path, handler, options);\n }\n\n public patch(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('PATCH', path, handler, options);\n }\n\n /**\n * Start the server\n */\n public async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => {\n this.handleRequest(req, res).catch((error) => {\n this.logger.error(`Unhandled error: ${error}`);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n });\n });\n\n this.runtimeHost.listen(this.server, this.listenEndpoint).then(() => {\n this.logger.info(`API Server listening on ${this.runtimeHost.formatListenEndpoint(this.listenEndpoint)}`);\n resolve();\n }, reject);\n });\n }\n\n /**\n * Stop the server\n */\n public async stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.runtimeHost.close(this.server, this.listenEndpoint).then(() => {\n this.logger.info('API Server stopped');\n resolve();\n }, reject);\n });\n }\n\n /**\n * Get the underlying HTTP server (for WebSocket upgrade)\n */\n public getHttpServer(): Server | undefined {\n return this.server;\n }\n\n private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise<void> {\n const method = request.method?.toUpperCase() ?? 'GET';\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n\n // Handle CORS preflight\n if (method === 'OPTIONS') {\n this.handleCors(request, response);\n response.statusCode = 204;\n response.end();\n return;\n }\n\n // Add CORS headers\n this.handleCors(request, response);\n\n // Find matching route\n const match = this.findRoute(method, path);\n if (!match) {\n response.statusCode = 404;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify({ error: 'Not Found' }));\n return;\n }\n\n const { route, params } = match;\n const authRequest = request as AuthenticatedRequest;\n\n // Run auth middleware unless route is public\n if (!route.public) {\n const authOk = await this.authMiddleware.process(authRequest, response);\n if (!authOk) {\n return;\n }\n }\n\n // Execute handler\n try {\n await route.handler(authRequest, response, params);\n } catch (error) {\n this.logger.error(`Route handler error: ${error}`);\n if (!response.headersSent) {\n response.statusCode = 500;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n }\n }\n\n private findRoute(method: string, path: string): { route: Route; params: Record<string, string> } | undefined {\n for (const route of this.routes) {\n if (route.method !== method) {\n continue;\n }\n\n const match = route.pattern.exec(path);\n if (match) {\n const params: Record<string, string> = {};\n route.paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n return { route, params };\n }\n }\n return undefined;\n }\n\n private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {\n const paramNames: string[] = [];\n let regexStr = path\n // 先处理通配符 *path 或 * (匹配剩余所有路径)\n .replace(/\\*([a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name || 'wildcard');\n return '(.*)';\n })\n // 再处理普通参数 :param (只匹配单段)\n .replace(/:([a-zA-Z0-9_]+)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n })\n .replace(/\\//g, '\\\\/');\n return {\n pattern: new RegExp(`^${regexStr}$`),\n paramNames,\n };\n }\n\n private handleCors(request: IncomingMessage, response: ServerResponse): void {\n const origin = request.headers.origin;\n\n if (this.corsOrigins.includes('*')) {\n response.setHeader('Access-Control-Allow-Origin', '*');\n } else if (origin && this.corsOrigins.includes(origin)) {\n response.setHeader('Access-Control-Allow-Origin', origin);\n response.setHeader('Vary', 'Origin');\n }\n\n response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');\n response.setHeader('Access-Control-Allow-Headers', '*');\n response.setHeader('Access-Control-Max-Age', '86400');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ApiServer.js","sourceRoot":"","sources":["../../src/api/ApiServer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type Server, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { AuthMiddleware, AuthenticatedRequest } from './middleware/AuthMiddleware';\nimport { nodeRuntimeHost } from '../runtime/host/node/NodeRuntimeHost';\nimport type { RuntimeHost, RuntimeListenEndpoint } from '../runtime/host/types';\n\n/**\n * Route handler function\n */\nexport type RouteHandler = (\n request: AuthenticatedRequest,\n response: ServerResponse,\n params: Record<string, string>,\n) => Promise<void>;\n\n/**\n * Route definition\n */\nexport interface Route {\n method: string;\n pattern: RegExp;\n paramNames: string[];\n handler: RouteHandler;\n /** If true, skip authentication */\n public?: boolean;\n /** If true, match all methods instead of one method. */\n allMethods?: boolean;\n}\n\nexport interface ApiServerOptions {\n port?: number;\n host?: string;\n socketPath?: string;\n listenEndpoint?: RuntimeListenEndpoint;\n runtimeHost?: RuntimeHost;\n authMiddleware: AuthMiddleware;\n corsOrigins?: string[];\n}\n\n/**\n * Standalone API Server\n */\nexport class ApiServer {\n private readonly logger = getLoggerFor(this);\n private readonly runtimeHost: RuntimeHost;\n private readonly listenEndpoint: RuntimeListenEndpoint;\n private readonly authMiddleware: AuthMiddleware;\n private readonly corsOrigins: string[];\n private readonly routes: Route[] = [];\n private server?: Server;\n\n public constructor(options: ApiServerOptions) {\n this.runtimeHost = options.runtimeHost ?? nodeRuntimeHost;\n this.listenEndpoint = options.listenEndpoint ?? this.runtimeHost.createListenEndpoint({\n port: options.port,\n host: options.host,\n socketPath: options.socketPath,\n });\n this.authMiddleware = options.authMiddleware;\n this.corsOrigins = options.corsOrigins ?? ['*'];\n }\n\n /**\n * Register a route\n */\n public route(\n method: string,\n path: string,\n handler: RouteHandler,\n options?: {\n /** If true, skip authentication for this route */\n public?: boolean;\n /** If true, match all methods instead of one method */\n allMethods?: boolean;\n },\n ): void {\n const { pattern, paramNames } = this.pathToRegex(path);\n this.routes.push({\n method: method.toUpperCase(),\n pattern,\n paramNames,\n handler,\n public: options?.public,\n allMethods: options?.allMethods,\n });\n this.logger.debug(`Registered route: ${method.toUpperCase()} ${path}${options?.public ? ' (public)' : ''}`);\n }\n\n /**\n * Convenience methods for common HTTP methods\n */\n public get(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('GET', path, handler, options);\n }\n\n public post(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('POST', path, handler, options);\n }\n\n public put(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('PUT', path, handler, options);\n }\n\n public delete(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('DELETE', path, handler, options);\n }\n\n public patch(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('PATCH', path, handler, options);\n }\n\n public all(path: string, handler: RouteHandler, options?: { public?: boolean }): void {\n this.route('ALL', path, handler, { ...options, allMethods: true });\n }\n\n /**\n * Start the server\n */\n public async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => {\n this.handleRequest(req, res).catch((error) => {\n this.logger.error(`Unhandled error: ${error}`);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n });\n });\n\n this.runtimeHost.listen(this.server, this.listenEndpoint).then(() => {\n this.logger.info(`API Server listening on ${this.runtimeHost.formatListenEndpoint(this.listenEndpoint)}`);\n resolve();\n }, reject);\n });\n }\n\n /**\n * Stop the server\n */\n public async stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.runtimeHost.close(this.server, this.listenEndpoint).then(() => {\n this.logger.info('API Server stopped');\n resolve();\n }, reject);\n });\n }\n\n /**\n * Get the underlying HTTP server (for WebSocket upgrade)\n */\n public getHttpServer(): Server | undefined {\n return this.server;\n }\n\n private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise<void> {\n const method = request.method?.toUpperCase() ?? 'GET';\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n\n // Handle CORS preflight\n if (method === 'OPTIONS') {\n this.handleCors(request, response);\n response.statusCode = 204;\n response.end();\n return;\n }\n\n // Add CORS headers\n this.handleCors(request, response);\n\n // Find matching route\n const match = this.findRoute(method, path);\n if (!match) {\n response.statusCode = 404;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify({ error: 'Not Found' }));\n return;\n }\n\n const { route, params } = match;\n const authRequest = request as AuthenticatedRequest;\n\n // Run auth middleware unless route is public\n if (!route.public) {\n const authOk = await this.authMiddleware.process(authRequest, response);\n if (!authOk) {\n return;\n }\n }\n\n // Execute handler\n try {\n await route.handler(authRequest, response, params);\n } catch (error) {\n this.logger.error(`Route handler error: ${error}`);\n if (!response.headersSent) {\n response.statusCode = 500;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify({ error: 'Internal Server Error' }));\n }\n }\n }\n\n private findRoute(method: string, path: string): { route: Route; params: Record<string, string> } | undefined {\n for (const route of this.routes) {\n if (!route.allMethods && route.method !== method) {\n continue;\n }\n\n const match = route.pattern.exec(path);\n if (match) {\n const params: Record<string, string> = {};\n route.paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n return { route, params };\n }\n }\n return undefined;\n }\n\n private pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {\n const paramNames: string[] = [];\n let regexStr = path\n // 先处理通配符 *path 或 * (匹配剩余所有路径)\n .replace(/\\*([a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name || 'wildcard');\n return '(.*)';\n })\n // 再处理普通参数 :param (只匹配单段)\n .replace(/:([a-zA-Z0-9_]+)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n })\n .replace(/\\//g, '\\\\/');\n return {\n pattern: new RegExp(`^${regexStr}$`),\n paramNames,\n };\n }\n\n private handleCors(request: IncomingMessage, response: ServerResponse): void {\n const origin = request.headers.origin;\n\n if (this.corsOrigins.includes('*')) {\n response.setHeader('Access-Control-Allow-Origin', '*');\n } else if (origin && this.corsOrigins.includes(origin)) {\n response.setHeader('Access-Control-Allow-Origin', origin);\n response.setHeader('Vary', 'Origin');\n }\n\n response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');\n response.setHeader('Access-Control-Allow-Headers', '*');\n response.setHeader('Access-Control-Max-Age', '86400');\n }\n}\n"]}
|
|
@@ -109,7 +109,7 @@ const DEFAULT_AGENT_SYSTEM_PROMPT = `你是 Xpod Default Agent,运行在用户
|
|
|
109
109
|
|
|
110
110
|
### AI 配置(最重要)
|
|
111
111
|
- API Key、Provider、Model、Base URL
|
|
112
|
-
- 存储位置:/settings/
|
|
112
|
+
- 存储位置:/settings/credentials.ttl
|
|
113
113
|
- 识别模式:
|
|
114
114
|
- "我的 OpenAI key 是 sk-xxx"
|
|
115
115
|
- "用这个 API key: xxx"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-agent.js","sourceRoot":"","sources":["../../../src/api/chatkit/default-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default Agent\n *\n * 基于 Claude Code SDK 的默认 AI Agent,用于:\n * 1. 用户未配置 AI 时的降级方案\n * 2. 帮助用户完成初始化配置\n * 3. 识别并收纳结构化数据到 Pod\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformProviderId,\n hasPlatformApiConfig,\n} from '../service/platform-ai-config';\n\n/**\n * CC SDK 运行时消息结构(避免直接静态导入 ESM 包导致 CJS 启动崩溃)\n */\ntype ClaudeAssistantBlock = { type: 'text'; text: string } | { type: string; [key: string]: unknown };\ntype ClaudeAssistantMessage = { type: 'assistant'; message: { content: ClaudeAssistantBlock[] | unknown } };\ntype ClaudeResultMessage = { type: 'result'; subtype?: string; result?: string; total_cost_usd?: number };\ntype ClaudeQueryMessage = ClaudeAssistantMessage | ClaudeResultMessage | { type: string; [key: string]: unknown };\ntype ClaudeQuery = (args: unknown) => AsyncIterable<ClaudeQueryMessage>;\n\nlet cachedClaudeQuery: ClaudeQuery | undefined;\n\nasync function loadClaudeQuery(): Promise<ClaudeQuery> {\n if (cachedClaudeQuery) {\n return cachedClaudeQuery;\n }\n\n // Keep native dynamic import so CJS build can load ESM-only SDK lazily.\n const mod = await import('@anthropic-ai/claude-agent-sdk') as Record<string, unknown>;\n const maybeQuery = (mod as { query?: unknown }).query;\n\n if (typeof maybeQuery !== 'function') {\n throw new Error('Invalid Claude Agent SDK: query() not found');\n }\n\n cachedClaudeQuery = maybeQuery as ClaudeQuery;\n return cachedClaudeQuery;\n}\n\nconst logger = getLoggerFor('DefaultAgent');\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isAssistantMessage(value: ClaudeQueryMessage): value is ClaudeAssistantMessage {\n return value.type === 'assistant' && isObject((value as { message?: unknown }).message);\n}\n\nfunction isResultMessage(value: ClaudeQueryMessage): value is ClaudeResultMessage {\n return value.type === 'result';\n}\n\nfunction getAssistantText(value: ClaudeQueryMessage): string {\n if (!isAssistantMessage(value)) {\n return '';\n }\n\n const content = value.message.content;\n if (!Array.isArray(content)) {\n return '';\n }\n\n let text = '';\n for (const block of content) {\n if (isObject(block) && block.type === 'text' && typeof block.text === 'string') {\n text += block.text;\n }\n }\n\n return text;\n}\n\n/**\n * Default Agent 配置\n */\nexport interface DefaultAgentConfig {\n /** Claude Code 可执行文件路径 */\n claudeCodePath?: string;\n /** 默认 AI 提供商 */\n provider?: string;\n /** 默认模型 */\n model?: string;\n /** API Key */\n apiKey?: string;\n}\n\n/**\n * Default Agent 会话上下文\n */\nexport interface DefaultAgentContext {\n /** 用户的访问令牌 */\n solidToken: string;\n /** 用户的 Pod 基础 URL */\n podBaseUrl: string;\n /** 用户 WebID */\n webId?: string;\n}\n\n/**\n * Default Agent 响应\n */\nexport interface DefaultAgentResponse {\n /** 响应内容 */\n content: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n error?: string;\n /** 使用的模型 */\n model?: string;\n /** 花费(USD) */\n costUsd?: number;\n}\n\n/**\n * 获取 Default Agent 配置\n */\nexport function getDefaultAgentConfig(): DefaultAgentConfig {\n return {\n claudeCodePath: process.env.CLAUDE_CODE_PATH || undefined,\n provider: getPlatformProviderId(),\n model: getPlatformDefaultModel(),\n apiKey: getPlatformApiKey(),\n };\n}\n\n/**\n * 检查 Default Agent 是否可用\n */\nexport function isDefaultAgentAvailable(): boolean {\n return hasPlatformApiConfig();\n}\n\n/**\n * Default Agent System Prompt\n */\nconst DEFAULT_AGENT_SYSTEM_PROMPT = `你是 Xpod Default Agent,运行在用户的 Solid Pod 上。\n\n## 你的职责\n1. 帮助用户完成初始化配置(特别是 AI 配置)\n2. 识别用户消息中的结构化数据并存储到 Pod\n3. 按语义网规范组织数据\n\n## 数据收纳能力\n当用户的消息中包含以下类型的信息时,识别并保存:\n\n### AI 配置(最重要)\n- API Key、Provider、Model、Base URL\n- 存储位置:/settings/ai/credentials.ttl\n- 识别模式:\n - \"我的 OpenAI key 是 sk-xxx\"\n - \"用这个 API key: xxx\"\n - \"anthropic 密钥 xxx\"\n\n### 联系人\n- 姓名、邮箱、电话、WebID\n- 存储位置:/contacts/<name>.ttl\n- 词汇表:vCard (http://www.w3.org/2006/vcard/ns#)\n\n### 日程/事件\n- 时间、地点、标题\n- 存储位置:/calendar/events.ttl\n- 词汇表:schema:Event\n\n### 笔记\n- 标题、内容\n- 存储位置:/notes/<title>.ttl\n- 词汇表:schema:Note\n\n## Pod 访问方式\n使用 curl 访问用户 Pod,鉴权信息已在环境变量中:\n\n### 读取资源\n\\`\\`\\`bash\ncurl -s -H \"Authorization: Bearer $SOLID_TOKEN\" \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 写入 Turtle 数据\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -d '<turtle-content>' \\\\\n \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 创建容器(目录)\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -H \"Link: <http://www.w3.org/ns/ldp#BasicContainer>; rel=\\\\\"type\\\\\"\" \\\\\n \"$POD_BASE_URL<path>/\"\n\\`\\`\\`\n\n## 语义网规范\n使用 Turtle 格式,优先使用标准词汇表。\n\n### AI 配置示例\n\\`\\`\\`turtle\n@prefix xpod: <http://xpod.dev/ns#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n\n<#openai-credential> a xpod:AiCredential ;\n rdfs:label \"OpenAI\" ;\n xpod:provider \"openai\" ;\n xpod:apiKey \"sk-xxx\" ;\n xpod:baseUrl \"https://api.openai.com/v1\" .\n\\`\\`\\`\n\n### 联系人示例\n\\`\\`\\`turtle\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .\n\n<#person> a vcard:Individual ;\n vcard:fn \"张三\" ;\n vcard:hasEmail <mailto:zhangsan@example.com> ;\n vcard:hasTelephone <tel:+8613800138000> .\n\\`\\`\\`\n\n## 交互原则\n1. 识别到结构化数据时,直接保存(不需要确认)\n2. 保存成功后简短告知用户\n3. 如果是 AI 配置,提示用户\"已保存,后续对话将使用你的 AI 配置\"\n4. 其他情况正常对话即可\n5. 回复使用中文`;\n\n\nfunction getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n const urls: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n };\n return urls[normalized] || urls.openrouter;\n}\n\nfunction normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n}\n\nfunction buildClaudeEnv(config: DefaultAgentConfig, context: DefaultAgentContext): NodeJS.ProcessEnv {\n const provider = (config.provider || '').toLowerCase();\n const model = (config.model || '').trim();\n const baseUrl = getPlatformApiBaseUrl() || getDefaultBaseUrl(config.provider);\n const isOpenRouterLike = provider === 'openrouter' || baseUrl.includes('openrouter.ai');\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SOLID_TOKEN: context.solidToken,\n POD_BASE_URL: context.podBaseUrl,\n };\n\n if (isOpenRouterLike) {\n // Claude Code expects Anthropic-shaped settings; OpenRouter is compatible after base path normalization.\n env.ANTHROPIC_BASE_URL = normalizeClaudeBaseUrl(baseUrl);\n if (config.apiKey) {\n env.ANTHROPIC_AUTH_TOKEN = config.apiKey;\n }\n if (model) {\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = model;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;\n }\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_BASE_URL = baseUrl;\n if (config.apiKey) {\n env.ANTHROPIC_API_KEY = config.apiKey;\n }\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n\n return env;\n}\n\nfunction resolveClaudeModel(config: DefaultAgentConfig): string {\n const model = (config.model || '').trim();\n if (!model) {\n return 'sonnet';\n }\n\n if (model.startsWith('claude') || model.includes('anthropic/')) {\n return model;\n }\n\n // Non-Anthropic models (OpenRouter route) are mapped via ANTHROPIC_DEFAULT_SONNET_MODEL.\n return 'sonnet';\n}\n\n/**\n * 运行 Default Agent\n */\nexport async function runDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): Promise<DefaultAgentResponse> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n return {\n content: '',\n success: false,\n error: 'Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required',\n };\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Running Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n },\n });\n\n let content = '';\n let costUsd: number | undefined;\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n content += assistantText;\n }\n\n if (isResultMessage(msg)) {\n if (msg.subtype === 'success' && typeof msg.result === 'string' && msg.result.trim()) {\n content = msg.result;\n }\n if (typeof msg.total_cost_usd === 'number') {\n costUsd = msg.total_cost_usd;\n }\n }\n }\n\n clearTimeout(timeoutId);\n\n return {\n content,\n success: true,\n model: config.model || resolveClaudeModel(config),\n costUsd,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Default Agent error: ${errorMessage}`);\n\n return {\n content: '',\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * 流式运行 Default Agent\n */\nexport async function* streamDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): AsyncGenerator<string, void, unknown> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n throw new Error('Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required');\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Streaming Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n includePartialMessages: true,\n },\n });\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n yield assistantText;\n }\n }\n\n clearTimeout(timeoutId);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"default-agent.js","sourceRoot":"","sources":["../../../src/api/chatkit/default-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default Agent\n *\n * 基于 Claude Code SDK 的默认 AI Agent,用于:\n * 1. 用户未配置 AI 时的降级方案\n * 2. 帮助用户完成初始化配置\n * 3. 识别并收纳结构化数据到 Pod\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformProviderId,\n hasPlatformApiConfig,\n} from '../service/platform-ai-config';\n\n/**\n * CC SDK 运行时消息结构(避免直接静态导入 ESM 包导致 CJS 启动崩溃)\n */\ntype ClaudeAssistantBlock = { type: 'text'; text: string } | { type: string; [key: string]: unknown };\ntype ClaudeAssistantMessage = { type: 'assistant'; message: { content: ClaudeAssistantBlock[] | unknown } };\ntype ClaudeResultMessage = { type: 'result'; subtype?: string; result?: string; total_cost_usd?: number };\ntype ClaudeQueryMessage = ClaudeAssistantMessage | ClaudeResultMessage | { type: string; [key: string]: unknown };\ntype ClaudeQuery = (args: unknown) => AsyncIterable<ClaudeQueryMessage>;\n\nlet cachedClaudeQuery: ClaudeQuery | undefined;\n\nasync function loadClaudeQuery(): Promise<ClaudeQuery> {\n if (cachedClaudeQuery) {\n return cachedClaudeQuery;\n }\n\n // Keep native dynamic import so CJS build can load ESM-only SDK lazily.\n const mod = await import('@anthropic-ai/claude-agent-sdk') as Record<string, unknown>;\n const maybeQuery = (mod as { query?: unknown }).query;\n\n if (typeof maybeQuery !== 'function') {\n throw new Error('Invalid Claude Agent SDK: query() not found');\n }\n\n cachedClaudeQuery = maybeQuery as ClaudeQuery;\n return cachedClaudeQuery;\n}\n\nconst logger = getLoggerFor('DefaultAgent');\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isAssistantMessage(value: ClaudeQueryMessage): value is ClaudeAssistantMessage {\n return value.type === 'assistant' && isObject((value as { message?: unknown }).message);\n}\n\nfunction isResultMessage(value: ClaudeQueryMessage): value is ClaudeResultMessage {\n return value.type === 'result';\n}\n\nfunction getAssistantText(value: ClaudeQueryMessage): string {\n if (!isAssistantMessage(value)) {\n return '';\n }\n\n const content = value.message.content;\n if (!Array.isArray(content)) {\n return '';\n }\n\n let text = '';\n for (const block of content) {\n if (isObject(block) && block.type === 'text' && typeof block.text === 'string') {\n text += block.text;\n }\n }\n\n return text;\n}\n\n/**\n * Default Agent 配置\n */\nexport interface DefaultAgentConfig {\n /** Claude Code 可执行文件路径 */\n claudeCodePath?: string;\n /** 默认 AI 提供商 */\n provider?: string;\n /** 默认模型 */\n model?: string;\n /** API Key */\n apiKey?: string;\n}\n\n/**\n * Default Agent 会话上下文\n */\nexport interface DefaultAgentContext {\n /** 用户的访问令牌 */\n solidToken: string;\n /** 用户的 Pod 基础 URL */\n podBaseUrl: string;\n /** 用户 WebID */\n webId?: string;\n}\n\n/**\n * Default Agent 响应\n */\nexport interface DefaultAgentResponse {\n /** 响应内容 */\n content: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n error?: string;\n /** 使用的模型 */\n model?: string;\n /** 花费(USD) */\n costUsd?: number;\n}\n\n/**\n * 获取 Default Agent 配置\n */\nexport function getDefaultAgentConfig(): DefaultAgentConfig {\n return {\n claudeCodePath: process.env.CLAUDE_CODE_PATH || undefined,\n provider: getPlatformProviderId(),\n model: getPlatformDefaultModel(),\n apiKey: getPlatformApiKey(),\n };\n}\n\n/**\n * 检查 Default Agent 是否可用\n */\nexport function isDefaultAgentAvailable(): boolean {\n return hasPlatformApiConfig();\n}\n\n/**\n * Default Agent System Prompt\n */\nconst DEFAULT_AGENT_SYSTEM_PROMPT = `你是 Xpod Default Agent,运行在用户的 Solid Pod 上。\n\n## 你的职责\n1. 帮助用户完成初始化配置(特别是 AI 配置)\n2. 识别用户消息中的结构化数据并存储到 Pod\n3. 按语义网规范组织数据\n\n## 数据收纳能力\n当用户的消息中包含以下类型的信息时,识别并保存:\n\n### AI 配置(最重要)\n- API Key、Provider、Model、Base URL\n- 存储位置:/settings/credentials.ttl\n- 识别模式:\n - \"我的 OpenAI key 是 sk-xxx\"\n - \"用这个 API key: xxx\"\n - \"anthropic 密钥 xxx\"\n\n### 联系人\n- 姓名、邮箱、电话、WebID\n- 存储位置:/contacts/<name>.ttl\n- 词汇表:vCard (http://www.w3.org/2006/vcard/ns#)\n\n### 日程/事件\n- 时间、地点、标题\n- 存储位置:/calendar/events.ttl\n- 词汇表:schema:Event\n\n### 笔记\n- 标题、内容\n- 存储位置:/notes/<title>.ttl\n- 词汇表:schema:Note\n\n## Pod 访问方式\n使用 curl 访问用户 Pod,鉴权信息已在环境变量中:\n\n### 读取资源\n\\`\\`\\`bash\ncurl -s -H \"Authorization: Bearer $SOLID_TOKEN\" \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 写入 Turtle 数据\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -d '<turtle-content>' \\\\\n \"$POD_BASE_URL<path>\"\n\\`\\`\\`\n\n### 创建容器(目录)\n\\`\\`\\`bash\ncurl -s -X PUT \\\\\n -H \"Authorization: Bearer $SOLID_TOKEN\" \\\\\n -H \"Content-Type: text/turtle\" \\\\\n -H \"Link: <http://www.w3.org/ns/ldp#BasicContainer>; rel=\\\\\"type\\\\\"\" \\\\\n \"$POD_BASE_URL<path>/\"\n\\`\\`\\`\n\n## 语义网规范\n使用 Turtle 格式,优先使用标准词汇表。\n\n### AI 配置示例\n\\`\\`\\`turtle\n@prefix xpod: <http://xpod.dev/ns#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n\n<#openai-credential> a xpod:AiCredential ;\n rdfs:label \"OpenAI\" ;\n xpod:provider \"openai\" ;\n xpod:apiKey \"sk-xxx\" ;\n xpod:baseUrl \"https://api.openai.com/v1\" .\n\\`\\`\\`\n\n### 联系人示例\n\\`\\`\\`turtle\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .\n\n<#person> a vcard:Individual ;\n vcard:fn \"张三\" ;\n vcard:hasEmail <mailto:zhangsan@example.com> ;\n vcard:hasTelephone <tel:+8613800138000> .\n\\`\\`\\`\n\n## 交互原则\n1. 识别到结构化数据时,直接保存(不需要确认)\n2. 保存成功后简短告知用户\n3. 如果是 AI 配置,提示用户\"已保存,后续对话将使用你的 AI 配置\"\n4. 其他情况正常对话即可\n5. 回复使用中文`;\n\n\nfunction getDefaultBaseUrl(provider?: string): string {\n const normalized = (provider || 'openrouter').toLowerCase();\n const urls: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n };\n return urls[normalized] || urls.openrouter;\n}\n\nfunction normalizeClaudeBaseUrl(baseUrl: string): string {\n if (baseUrl.endsWith('/v1')) {\n return baseUrl.slice(0, -3);\n }\n if (baseUrl.endsWith('/v1/')) {\n return baseUrl.slice(0, -4);\n }\n return baseUrl;\n}\n\nfunction buildClaudeEnv(config: DefaultAgentConfig, context: DefaultAgentContext): NodeJS.ProcessEnv {\n const provider = (config.provider || '').toLowerCase();\n const model = (config.model || '').trim();\n const baseUrl = getPlatformApiBaseUrl() || getDefaultBaseUrl(config.provider);\n const isOpenRouterLike = provider === 'openrouter' || baseUrl.includes('openrouter.ai');\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n SOLID_TOKEN: context.solidToken,\n POD_BASE_URL: context.podBaseUrl,\n };\n\n if (isOpenRouterLike) {\n // Claude Code expects Anthropic-shaped settings; OpenRouter is compatible after base path normalization.\n env.ANTHROPIC_BASE_URL = normalizeClaudeBaseUrl(baseUrl);\n if (config.apiKey) {\n env.ANTHROPIC_AUTH_TOKEN = config.apiKey;\n }\n if (model) {\n env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;\n env.ANTHROPIC_DEFAULT_HAIKU_MODEL = model;\n env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;\n }\n delete env.ANTHROPIC_API_KEY;\n } else {\n env.ANTHROPIC_BASE_URL = baseUrl;\n if (config.apiKey) {\n env.ANTHROPIC_API_KEY = config.apiKey;\n }\n delete env.ANTHROPIC_AUTH_TOKEN;\n }\n\n return env;\n}\n\nfunction resolveClaudeModel(config: DefaultAgentConfig): string {\n const model = (config.model || '').trim();\n if (!model) {\n return 'sonnet';\n }\n\n if (model.startsWith('claude') || model.includes('anthropic/')) {\n return model;\n }\n\n // Non-Anthropic models (OpenRouter route) are mapped via ANTHROPIC_DEFAULT_SONNET_MODEL.\n return 'sonnet';\n}\n\n/**\n * 运行 Default Agent\n */\nexport async function runDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): Promise<DefaultAgentResponse> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n return {\n content: '',\n success: false,\n error: 'Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required',\n };\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Running Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n },\n });\n\n let content = '';\n let costUsd: number | undefined;\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n content += assistantText;\n }\n\n if (isResultMessage(msg)) {\n if (msg.subtype === 'success' && typeof msg.result === 'string' && msg.result.trim()) {\n content = msg.result;\n }\n if (typeof msg.total_cost_usd === 'number') {\n costUsd = msg.total_cost_usd;\n }\n }\n }\n\n clearTimeout(timeoutId);\n\n return {\n content,\n success: true,\n model: config.model || resolveClaudeModel(config),\n costUsd,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Default Agent error: ${errorMessage}`);\n\n return {\n content: '',\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * 流式运行 Default Agent\n */\nexport async function* streamDefaultAgent(\n message: string,\n context: DefaultAgentContext,\n options?: {\n timeout?: number;\n maxTurns?: number;\n },\n): AsyncGenerator<string, void, unknown> {\n const config = getDefaultAgentConfig();\n\n if (!hasPlatformApiConfig()) {\n throw new Error('Default Agent not configured: DEFAULT_API_KEY or DEFAULT_API_BASE is required');\n }\n\n const abortController = new AbortController();\n const timeout = options?.timeout || 60000;\n\n const timeoutId = setTimeout(() => {\n logger.warn('Default Agent timeout, aborting...');\n abortController.abort();\n }, timeout);\n\n try {\n logger.info(`Streaming Default Agent for Pod: ${context.podBaseUrl}`);\n\n const queryFn = await loadClaudeQuery();\n const q = queryFn({\n prompt: message,\n options: {\n abortController,\n pathToClaudeCodeExecutable: config.claudeCodePath,\n env: buildClaudeEnv(config, context),\n systemPrompt: DEFAULT_AGENT_SYSTEM_PROMPT,\n model: resolveClaudeModel(config),\n permissionMode: 'acceptEdits',\n allowedTools: ['Bash', 'Read', 'Write'],\n maxTurns: options?.maxTurns || 10,\n includePartialMessages: true,\n },\n });\n\n for await (const msg of q) {\n const assistantText = getAssistantText(msg);\n if (assistantText) {\n yield assistantText;\n }\n }\n\n clearTimeout(timeoutId);\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n"]}
|
|
@@ -8,4 +8,12 @@ export { Chat, Thread, Message, ChatStatus, MessageRole, MessageStatus, type Cha
|
|
|
8
8
|
export { type ChatKitStore, type StoreContext, InMemoryStore } from './store';
|
|
9
9
|
export { PodChatKitStore, type PodChatKitStoreOptions } from './pod-store';
|
|
10
10
|
export { ChatKitService, type AiProvider, type ChatKitServiceOptions, type StreamingResult, type NonStreamingResult, type ChatKitResult } from './service';
|
|
11
|
+
export { RunStateCenter, type RunStateCenterOptions, type RunStateEvent } from '../runs/RunStateCenter';
|
|
12
|
+
export { type AgentRuntimeConfig, type AgentRuntimeEvent, type RunnerProtocol, type RunnerType, type WorktreeSpec, } from '../runs/AgentRuntimeTypes';
|
|
13
|
+
export { type WorkspaceUri } from '../workspace/types';
|
|
14
|
+
export { type RunConversationMessage, type RunExecutionBackend, type RunExecutionInput, type RunEnqueueResult, } from '../runs/RunExecutionBackend';
|
|
15
|
+
export { Run, RunStep, RunStatus, RunStepType, type RunRecord, type RunStepRecord, type RunStatusType, type RunStepTypeValue, } from '../runs/schema';
|
|
16
|
+
export { type RunRecordData, type RunStepRecordData, type RunStore, } from '../runs/store';
|
|
17
|
+
export { InngestRunExecutionBackend, XPOD_AGENT_RUN_FUNCTION_ID, XPOD_RUN_REQUESTED_EVENT, type InngestRunExecutionBackendOptions, type XpodRunRequestedEvent, type XpodRunRequestedEventData, } from '../runs/InngestRunExecutionBackend';
|
|
18
|
+
export { PiAgentRuntimeDriver, type PiAgentRuntimeDriverOptions } from '../runs/PiAgentRuntimeDriver';
|
|
11
19
|
export { VercelAiProvider, type VercelAiProviderOptions } from './ai-provider';
|