@undefineds.co/xpod 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -3
- package/config/cli.json +9 -71
- package/config/cloud.json +34 -7
- package/config/local.json +6 -2
- package/config/resolver.json +11 -49
- package/config/runtime-open.json +22 -0
- package/config/xpod.base.json +32 -0
- package/config/xpod.cluster.json +2 -44
- package/config/xpod.json +5 -2
- package/dist/agents/AgentExecutorFactory.js +1 -1
- package/dist/agents/AgentExecutorFactory.js.map +1 -1
- package/dist/agents/AgentManager.js +1 -1
- package/dist/agents/AgentManager.js.map +1 -1
- package/dist/agents/config/agent-meta-schema.d.ts +7 -7
- package/dist/agents/config/agent-meta-schema.js +1 -1
- package/dist/agents/config/agent-meta-schema.js.map +1 -1
- package/dist/agents/config/resolve.js +1 -1
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/agents/schema/agent-config.d.ts +18 -18
- package/dist/agents/schema/agent-config.js +1 -1
- package/dist/agents/schema/agent-config.js.map +1 -1
- package/dist/agents/schema/tables.d.ts +8 -8
- package/dist/agents/schema/tables.js +1 -1
- package/dist/agents/schema/tables.js.map +1 -1
- package/dist/ai/schema/config.d.ts +7 -7
- package/dist/ai/schema/config.js +1 -1
- package/dist/ai/schema/config.js.map +1 -1
- package/dist/ai/schema/model.d.ts +13 -13
- package/dist/ai/schema/model.js +1 -1
- package/dist/ai/schema/model.js.map +1 -1
- package/dist/ai/schema/provider.d.ts +7 -7
- package/dist/ai/schema/provider.js +1 -1
- package/dist/ai/schema/provider.js.map +1 -1
- package/dist/ai/schema/vector-store.d.ts +17 -17
- package/dist/ai/schema/vector-store.js +1 -1
- package/dist/ai/schema/vector-store.js.map +1 -1
- package/dist/ai/service/CredentialReaderImpl.js +1 -1
- package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
- package/dist/ai/service/DefaultAiConfigService.js.map +1 -1
- package/dist/api/ApiServer.d.ts +3 -1
- package/dist/api/ApiServer.js +14 -1
- package/dist/api/ApiServer.js.map +1 -1
- package/dist/api/auth/AuthContext.d.ts +12 -1
- package/dist/api/auth/AuthContext.js +18 -1
- package/dist/api/auth/AuthContext.js.map +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
- package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
- package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -0
- package/dist/api/auth/index.js.map +1 -1
- package/dist/api/chatkit/ai-provider.d.ts +0 -10
- package/dist/api/chatkit/ai-provider.js +11 -120
- package/dist/api/chatkit/ai-provider.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +11 -8
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +6 -0
- package/dist/api/chatkit/pod-store.js +103 -36
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +32 -26
- package/dist/api/chatkit/schema.js +16 -8
- package/dist/api/chatkit/schema.js.map +1 -1
- package/dist/api/container/business-token.d.ts +9 -0
- package/dist/api/container/business-token.js +32 -0
- package/dist/api/container/business-token.js.map +1 -0
- package/dist/api/container/cloud.js +36 -12
- package/dist/api/container/cloud.js.map +1 -1
- package/dist/api/container/common.js +13 -5
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +94 -14
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/local.js +2 -1
- package/dist/api/container/local.js.map +1 -1
- package/dist/api/container/routes.js +81 -9
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +8 -6
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/AdminHandler.js +9 -9
- package/dist/api/handlers/AdminHandler.js.map +1 -1
- package/dist/api/handlers/ApiKeyHandler.js +0 -6
- package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
- package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
- package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
- package/dist/api/handlers/PodManagementHandler.js +11 -10
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
- package/dist/api/handlers/ProvisionHandler.js +161 -0
- package/dist/api/handlers/ProvisionHandler.js.map +1 -0
- package/dist/api/handlers/QuotaHandler.d.ts +7 -7
- package/dist/api/handlers/QuotaHandler.js +143 -73
- package/dist/api/handlers/QuotaHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainClientHandler.js +2 -2
- package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
- package/dist/api/handlers/SubdomainHandler.js +13 -8
- package/dist/api/handlers/SubdomainHandler.js.map +1 -1
- package/dist/api/handlers/UsageHandler.d.ts +14 -0
- package/dist/api/handlers/UsageHandler.js +123 -0
- package/dist/api/handlers/UsageHandler.js.map +1 -0
- package/dist/api/handlers/index.d.ts +3 -1
- package/dist/api/handlers/index.js +3 -1
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/main.js +18 -0
- package/dist/api/main.js.map +1 -1
- package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
- package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
- package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
- package/dist/api/runtime.d.ts +15 -0
- package/dist/api/runtime.js +125 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/service/VectorStoreService.js +1 -1
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/service/VercelChatService.d.ts +16 -7
- package/dist/api/service/VercelChatService.js +98 -178
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
- package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
- package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
- package/dist/authorization/AuthModeSelector.d.ts +10 -0
- package/dist/authorization/AuthModeSelector.js +27 -0
- package/dist/authorization/AuthModeSelector.js.map +1 -0
- package/dist/authorization/AuthModeSelector.jsonld +81 -0
- package/dist/cli/commands/account.d.ts +6 -0
- package/dist/cli/commands/account.js +119 -0
- package/dist/cli/commands/account.js.map +1 -0
- package/dist/cli/commands/auth.js +20 -29
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/backup.d.ts +15 -0
- package/dist/cli/commands/backup.js +286 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/config.d.ts +34 -3
- package/dist/cli/commands/config.js +195 -258
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.js +94 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/pod.d.ts +6 -0
- package/dist/cli/commands/pod.js +124 -0
- package/dist/cli/commands/pod.js.map +1 -0
- package/dist/cli/commands/start.js +28 -5
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/credentials-store.d.ts +17 -0
- package/dist/cli/lib/credentials-store.js +73 -0
- package/dist/cli/lib/credentials-store.js.map +1 -0
- package/dist/cli/lib/css-account.d.ts +17 -0
- package/dist/cli/lib/css-account.js +56 -0
- package/dist/cli/lib/css-account.js.map +1 -1
- package/dist/cli/lib/pod-thread-store.d.ts +57 -0
- package/dist/cli/lib/pod-thread-store.js +310 -0
- package/dist/cli/lib/pod-thread-store.js.map +1 -0
- package/dist/cli/lib/solid-auth.d.ts +20 -0
- package/dist/cli/lib/solid-auth.js +70 -0
- package/dist/cli/lib/solid-auth.js.map +1 -0
- package/dist/components/components.jsonld +5 -8
- package/dist/components/context.jsonld +114 -244
- package/dist/credential/schema/tables.d.ts +14 -14
- package/dist/credential/schema/tables.js +1 -1
- package/dist/credential/schema/tables.js.map +1 -1
- package/dist/edge/EdgeNodeAgent.js +2 -2
- package/dist/edge/EdgeNodeAgent.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
- package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
- package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
- package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
- package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
- package/dist/edge/EdgeNodeModeDetector.js +9 -11
- package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
- package/dist/http/ClusterIngressRouter.js +3 -3
- package/dist/http/ClusterIngressRouter.js.map +1 -1
- package/dist/http/ClusterWebSocketConfigurator.js +2 -2
- package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
- package/dist/http/PodRoutingHttpHandler.js +2 -2
- package/dist/http/PodRoutingHttpHandler.js.map +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
- package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
- package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
- package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js +142 -0
- package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
- package/dist/identity/drizzle/db.d.ts +9 -0
- package/dist/identity/drizzle/db.js +235 -3
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +5 -0
- package/dist/identity/drizzle/schema.pg.js +49 -20
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
- package/dist/identity/drizzle/schema.sqlite.js +48 -18
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.js +12 -14
- package/dist/index.js.map +1 -1
- package/dist/main.js +25 -8
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
- package/dist/provision/ProvisionCodeCodec.js +65 -0
- package/dist/provision/ProvisionCodeCodec.js.map +1 -0
- package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
- package/dist/provision/ProvisionPodCreator.d.ts +20 -0
- package/dist/provision/ProvisionPodCreator.js +84 -0
- package/dist/provision/ProvisionPodCreator.js.map +1 -0
- package/dist/provision/ProvisionPodCreator.jsonld +118 -0
- package/dist/quota/DrizzleQuotaService.d.ts +17 -3
- package/dist/quota/DrizzleQuotaService.js +108 -8
- package/dist/quota/DrizzleQuotaService.js.map +1 -1
- package/dist/quota/DrizzleQuotaService.jsonld +33 -22
- package/dist/quota/NoopQuotaService.d.ts +7 -1
- package/dist/quota/NoopQuotaService.js +12 -0
- package/dist/quota/NoopQuotaService.js.map +1 -1
- package/dist/quota/NoopQuotaService.jsonld +24 -0
- package/dist/quota/QuotaService.d.ts +17 -0
- package/dist/quota/QuotaService.js +5 -0
- package/dist/quota/QuotaService.js.map +1 -1
- package/dist/quota/QuotaService.jsonld +50 -0
- package/dist/runtime/Proxy.d.ts +22 -4
- package/dist/runtime/Proxy.js +154 -35
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/runtime/XpodRuntime.d.ts +49 -0
- package/dist/runtime/XpodRuntime.js +374 -0
- package/dist/runtime/XpodRuntime.js.map +1 -0
- package/dist/runtime/env-utils.d.ts +2 -0
- package/dist/runtime/env-utils.js +55 -0
- package/dist/runtime/env-utils.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +8 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/socket-fetch.d.ts +1 -0
- package/dist/runtime/socket-fetch.js +72 -0
- package/dist/runtime/socket-fetch.js.map +1 -0
- package/dist/runtime/socket-http.d.ts +1 -0
- package/dist/runtime/socket-http.js +142 -0
- package/dist/runtime/socket-http.js.map +1 -0
- package/dist/runtime/socket-utils.d.ts +2 -0
- package/dist/runtime/socket-utils.js +34 -0
- package/dist/runtime/socket-utils.js.map +1 -0
- package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
- package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
- package/dist/service/EdgeNodeSignalClient.js.map +1 -0
- package/dist/service/PodMigrationService.d.ts +1 -2
- package/dist/service/PodMigrationService.js +1 -2
- package/dist/service/PodMigrationService.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js +1 -1
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
- package/dist/storage/accessors/MinioDataAccessor.js +10 -0
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
- package/dist/storage/accessors/MixDataAccessor.js +12 -1
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
- package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
- package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
- package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
- package/dist/storage/quota/UsageRepository.d.ts +41 -8
- package/dist/storage/quota/UsageRepository.js +252 -50
- package/dist/storage/quota/UsageRepository.js.map +1 -1
- package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/dist/storage/sparql/QueryOptimizer.js +13 -1
- package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
- package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
- package/dist/storage/sparql/QuintQuerySource.js +152 -1
- package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
- package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
- package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
- package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
- package/dist/subdomain/SubdomainClient.d.ts +3 -3
- package/dist/subdomain/SubdomainClient.js +1 -1
- package/dist/subdomain/SubdomainClient.js.map +1 -1
- package/dist/subdomain/SubdomainService.d.ts +15 -16
- package/dist/subdomain/SubdomainService.js +80 -54
- package/dist/subdomain/SubdomainService.js.map +1 -1
- package/dist/subdomain/SubdomainService.jsonld +22 -26
- package/dist/supervisor/Supervisor.d.ts +7 -2
- package/dist/supervisor/Supervisor.js +33 -1
- package/dist/supervisor/Supervisor.js.map +1 -1
- package/dist/task/DrizzleTaskQueue.d.ts +1 -1
- package/dist/task/DrizzleTaskQueue.js +1 -1
- package/dist/task/DrizzleTaskQueue.js.map +1 -1
- package/dist/task/schema.d.ts +10 -10
- package/dist/task/schema.js +1 -1
- package/dist/task/schema.js.map +1 -1
- package/dist/test-utils/index.d.ts +4 -0
- package/dist/test-utils/index.js +8 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/no-auth-xpod.d.ts +11 -0
- package/dist/test-utils/no-auth-xpod.js +25 -0
- package/dist/test-utils/no-auth-xpod.js.map +1 -0
- package/dist/test-utils/seed-pod.d.ts +5 -0
- package/dist/test-utils/seed-pod.js +61 -0
- package/dist/test-utils/seed-pod.js.map +1 -0
- package/package.json +38 -10
- package/templates/identity/account/create-pod.html.ejs +110 -0
- package/templates/main.html.ejs +10 -0
- package/dist/api/handlers/DevHandler.d.ts +0 -18
- package/dist/api/handlers/DevHandler.js +0 -276
- package/dist/api/handlers/DevHandler.js.map +0 -1
- package/dist/api/handlers/SignalHandler.d.ts +0 -13
- package/dist/api/handlers/SignalHandler.js +0 -122
- package/dist/api/handlers/SignalHandler.js.map +0 -1
- package/dist/gateway/Proxy.d.ts +0 -24
- package/dist/gateway/Proxy.js +0 -209
- package/dist/gateway/Proxy.js.map +0 -1
- package/dist/gateway/Supervisor.d.ts +0 -2
- package/dist/gateway/Supervisor.js +0 -7
- package/dist/gateway/Supervisor.js.map +0 -1
- package/dist/gateway/port-finder.d.ts +0 -4
- package/dist/gateway/port-finder.js +0 -15
- package/dist/gateway/port-finder.js.map +0 -1
- package/dist/gateway/types.d.ts +0 -1
- package/dist/gateway/types.js +0 -3
- package/dist/gateway/types.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
- package/dist/http/SignalInterceptHttpHandler.js +0 -47
- package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
- package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
- package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
- package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
- package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
- package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
- package/dist/quota/DefaultQuotaService.d.ts +0 -16
- package/dist/quota/DefaultQuotaService.js +0 -37
- package/dist/quota/DefaultQuotaService.js.map +0 -1
- package/dist/quota/DefaultQuotaService.jsonld +0 -85
- package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
- package/dist/service/PodMigrationService.jsonld +0 -76
- package/dist/storage/MigratableDataAccessor.d.ts +0 -63
- package/dist/storage/MigratableDataAccessor.js +0 -11
- package/dist/storage/MigratableDataAccessor.js.map +0 -1
- package/dist/storage/MigratableDataAccessor.jsonld +0 -60
- package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
- package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
- package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
- package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
- package/static/app/assets/index.css +0 -1
- package/static/app/assets/main.js +0 -11
package/config/xpod.cluster.json
CHANGED
|
@@ -197,16 +197,12 @@
|
|
|
197
197
|
"@id": "urn:undefineds:xpod:TencentDnsProvider"
|
|
198
198
|
},
|
|
199
199
|
"rootDomain": {
|
|
200
|
-
"@id": "urn:solid-server:default:variable:
|
|
200
|
+
"@id": "urn:solid-server:default:variable:baseStorageDomain",
|
|
201
201
|
"@type": "Variable"
|
|
202
202
|
},
|
|
203
203
|
"ttl": {
|
|
204
204
|
"@id": "urn:solid-server:default:variable:dnsRecordTtl",
|
|
205
205
|
"@type": "Variable"
|
|
206
|
-
},
|
|
207
|
-
"clusterIp": {
|
|
208
|
-
"@id": "urn:solid-server:default:variable:clusterIngressIp",
|
|
209
|
-
"@type": "Variable"
|
|
210
206
|
}
|
|
211
207
|
},
|
|
212
208
|
{
|
|
@@ -280,31 +276,6 @@
|
|
|
280
276
|
"@type": "Variable"
|
|
281
277
|
}
|
|
282
278
|
},
|
|
283
|
-
{
|
|
284
|
-
"comment": "Edge node signal handler",
|
|
285
|
-
"@type": "EdgeNodeSignalHttpHandler",
|
|
286
|
-
"@id": "urn:undefineds:xpod:EdgeNodeSignalHttpHandler",
|
|
287
|
-
"identityDbUrl": {
|
|
288
|
-
"@id": "urn:solid-server:default:variable:identityDbUrl",
|
|
289
|
-
"@type": "Variable"
|
|
290
|
-
},
|
|
291
|
-
"edgeNodesEnabled": {
|
|
292
|
-
"@id": "urn:solid-server:default:variable:edgeNodesEnabled",
|
|
293
|
-
"@type": "Variable"
|
|
294
|
-
},
|
|
295
|
-
"dnsCoordinator": {
|
|
296
|
-
"@id": "urn:undefineds:xpod:EdgeNodeDnsCoordinator"
|
|
297
|
-
},
|
|
298
|
-
"certificateProvisioner": {
|
|
299
|
-
"@id": "urn:undefineds:xpod:Dns01CertificateProvisioner"
|
|
300
|
-
},
|
|
301
|
-
"tunnelManager": {
|
|
302
|
-
"@id": "urn:undefineds:xpod:EdgeNodeTunnelManager"
|
|
303
|
-
},
|
|
304
|
-
"healthProbeService": {
|
|
305
|
-
"@id": "urn:undefineds:xpod:EdgeNodeHealthProbeService"
|
|
306
|
-
}
|
|
307
|
-
},
|
|
308
279
|
{
|
|
309
280
|
"comment": "Redirects pod traffic to registered edge nodes (Debug Only)",
|
|
310
281
|
"@type": "EdgeNodeDirectDebugHttpHandler",
|
|
@@ -394,24 +365,11 @@
|
|
|
394
365
|
}
|
|
395
366
|
},
|
|
396
367
|
{
|
|
397
|
-
"comment": "
|
|
398
|
-
"@id": "urn:undefineds:xpod:SignalAwareHttpHandler",
|
|
399
|
-
"@type": "npmd:@undefineds.co/xpod/^0.0.0/dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler",
|
|
400
|
-
"npmd:@undefineds.co/xpod/^0.0.0/dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_signalHandler": {
|
|
401
|
-
"@id": "urn:undefineds:xpod:EdgeNodeSignalHttpHandler"
|
|
402
|
-
},
|
|
403
|
-
"npmd:@undefineds.co/xpod/^0.0.0/dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_fallback": {
|
|
404
|
-
"@id": "urn:solid-server:default:HttpHandler"
|
|
405
|
-
},
|
|
406
|
-
"npmd:@undefineds.co/xpod/^0.0.0/dist/http/SignalInterceptHttpHandler.jsonld#SignalInterceptHttpHandler_options_basePath": "/api/v1/signal"
|
|
407
|
-
},
|
|
408
|
-
{
|
|
409
|
-
"comment": "Define MainHttpHandler with SignalAwareHttpHandler in the middleware chain.",
|
|
368
|
+
"comment": "Define MainHttpHandler with tracing middleware.",
|
|
410
369
|
"@id": "urn:undefineds:xpod:MainHttpHandler",
|
|
411
370
|
"@type": "https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/ChainedHttpHandler.jsonld#ChainedHttpHandler",
|
|
412
371
|
"https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/ChainedHttpHandler.jsonld#ChainedHttpHandler_handlers": [
|
|
413
372
|
{ "@id": "urn:undefineds:xpod:TracingMiddleware" },
|
|
414
|
-
{ "@id": "urn:undefineds:xpod:SignalAwareHttpHandler" },
|
|
415
373
|
{ "@id": "urn:solid-server:default:HttpHandler" }
|
|
416
374
|
]
|
|
417
375
|
}
|
package/config/xpod.json
CHANGED
|
@@ -89,9 +89,12 @@
|
|
|
89
89
|
}
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
|
-
"comment": "
|
|
92
|
+
"comment": "Quota service backed by identity DB, no env defaults = unlimited",
|
|
93
93
|
"@id": "urn:undefineds:xpod:QuotaService",
|
|
94
|
-
"@type": "
|
|
94
|
+
"@type": "DrizzleQuotaService",
|
|
95
|
+
"DrizzleQuotaService:_options_identityDbUrl": {
|
|
96
|
+
"@id": "urn:solid-server:default:variable:identityDbUrl"
|
|
97
|
+
}
|
|
95
98
|
},
|
|
96
99
|
{
|
|
97
100
|
"@id": "urn:solid-server:default:variable:rootFilePath",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.agentExecutorFactory = exports.AgentExecutorFactory = exports.SUPPORTED_EXECUTOR_TYPES = void 0;
|
|
18
18
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
19
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
19
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
20
20
|
const tables_1 = require("./schema/tables");
|
|
21
21
|
const tables_2 = require("../credential/schema/tables");
|
|
22
22
|
const types_1 = require("../credential/schema/types");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentExecutorFactory.js","sourceRoot":"","sources":["../../src/agents/AgentExecutorFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Executor Factory\n *\n * 从 Pod 读取凭证和供应商配置,创建对应的 Agent 执行器。\n *\n * 支持的执行器类型:\n * - codebuddy: CodeBuddy Agent SDK\n * - claude: Claude Agent SDK\n *\n * 使用流程:\n * 1. 从 Pod 读取 AgentProvider 配置\n * 2. 从 Pod 读取对应的 Credential\n * 3. 根据 executorType 创建对应的执行器实例\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq, and } from 'drizzle-solid';\nimport type { IAgentExecutor, ExecutorType, AiCredential, ProviderConfig, BaseExecutorOptions } from './types';\nimport { AgentProvider } from './schema/tables';\nimport { Credential } from '../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../credential/schema/types';\n\n// 执行器实现(仅支持有完整 Agent SDK 的供应商)\nimport { ClaudeExecutor } from './ClaudeExecutor';\nimport { CodeBuddyExecutor } from './CodeBuddyExecutor';\n\nconst schema = {\n agentProvider: AgentProvider,\n credential: Credential,\n};\n\n/**\n * 支持的执行器类型\n */\nexport const SUPPORTED_EXECUTOR_TYPES: ExecutorType[] = ['codebuddy', 'claude'];\n\n/**\n * Agent Executor Factory\n *\n * 负责从 Pod 读取配置并创建执行器实例。\n */\nexport class AgentExecutorFactory {\n private readonly logger = getLoggerFor(this);\n\n /**\n * 检查执行器类型是否支持\n */\n public isSupported(executorType: string): executorType is ExecutorType {\n return SUPPORTED_EXECUTOR_TYPES.includes(executorType as ExecutorType);\n }\n\n /**\n * 从 Pod 创建执行器\n *\n * @param podBaseUrl Pod 根 URL\n * @param providerId 供应商 ID\n * @param authenticatedFetch 带认证的 fetch 函数\n * @param webId 用户 WebID(可选)\n * @returns 执行器实例,如果未找到配置则返回 null\n */\n public async create(\n podBaseUrl: string,\n providerId: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<IAgentExecutor | null> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n // 1. 读取供应商配置\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n\n if (!provider) {\n this.logger.debug(`Agent provider not found: ${providerId}`);\n return null;\n }\n\n if (provider.enabled !== 'true') {\n this.logger.debug(`Agent provider is disabled: ${providerId}`);\n return null;\n }\n\n // 检查执行器类型是否支持\n if (!this.isSupported(provider.executorType)) {\n this.logger.warn(`Unsupported executor type: ${provider.executorType}. Only 'codebuddy' and 'claude' are supported.`);\n return null;\n }\n\n // 2. 读取凭证\n const providerUri = `${podBaseUrl}settings/ai/agent-providers.ttl#${providerId}`;\n const credentials = await db.query.credential.findMany({\n where: and(\n eq(Credential.service, ServiceType.AI),\n eq(Credential.status, CredentialStatus.ACTIVE),\n eq(Credential.provider, providerUri),\n ),\n });\n\n if (credentials.length === 0) {\n this.logger.debug(`No active credential found for agent provider: ${providerId}`);\n return null;\n }\n\n // 随机选择一个凭证(负载均衡)\n const credential = credentials[Math.floor(Math.random() * credentials.length)] as any;\n\n // 3. 构建凭证对象\n const aiCredential: AiCredential = {\n providerId,\n apiKey: credential.apiKey ?? '',\n baseUrl: credential.baseUrl ?? provider.baseUrl ?? undefined,\n proxyUrl: credential.proxyUrl ?? undefined,\n projectId: credential.projectId ?? undefined,\n organizationId: credential.organizationId ?? undefined,\n };\n\n // 4. 构建供应商配置\n const providerConfig: ProviderConfig = {\n id: provider.id,\n displayName: provider.displayName ?? provider.id,\n executorType: provider.executorType as ExecutorType,\n baseUrl: provider.baseUrl ?? undefined,\n defaultModel: provider.defaultModel ?? undefined,\n enabled: provider.enabled === 'true',\n };\n\n // 5. 创建执行器\n return this.createExecutor(provider.executorType as ExecutorType, {\n providerId,\n credential: aiCredential,\n providerConfig,\n });\n } catch (error) {\n this.logger.error(`Failed to create executor for provider ${providerId}:`, error);\n return null;\n }\n }\n\n /**\n * 列出所有可用的供应商\n */\n public async listProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n const providers = await db.query.agentProvider.findMany();\n\n return providers.map((p: typeof providers[number]) => ({\n id: p.id,\n displayName: p.displayName ?? p.id,\n executorType: p.executorType as ExecutorType,\n baseUrl: p.baseUrl ?? undefined,\n defaultModel: p.defaultModel ?? undefined,\n enabled: p.enabled === 'true',\n }));\n } catch (error) {\n this.logger.error('Failed to list agent providers:', error);\n return [];\n }\n }\n\n /**\n * 列出所有启用的供应商\n */\n public async listEnabledProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n const providers = await this.listProviders(podBaseUrl, authenticatedFetch, webId);\n return providers.filter((p) => p.enabled);\n }\n\n /**\n * 列出所有支持的供应商(executorType 受支持且已启用)\n */\n public async listSupportedProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n const providers = await this.listEnabledProviders(podBaseUrl, authenticatedFetch, webId);\n return providers.filter((p) => this.isSupported(p.executorType));\n }\n\n /**\n * 根据 executorType 创建执行器\n */\n public createExecutor(executorType: ExecutorType, options: BaseExecutorOptions): IAgentExecutor {\n switch (executorType) {\n case 'claude':\n return new ClaudeExecutor(options);\n\n case 'codebuddy':\n return new CodeBuddyExecutor(options);\n\n default:\n throw new Error(\n `Unsupported executor type: ${executorType}. ` +\n `Only 'codebuddy' and 'claude' are supported because they have complete Agent SDKs.`\n );\n }\n }\n\n /**\n * 创建指定类型的执行器(直接使用凭证,不从 Pod 读取)\n *\n * 用于测试或已知凭证的场景。\n */\n public createDirect(\n executorType: ExecutorType,\n providerId: string,\n credential: AiCredential,\n ): IAgentExecutor {\n return this.createExecutor(executorType, {\n providerId,\n credential,\n });\n }\n}\n\n/**\n * 默认工厂实例\n */\nexport const agentExecutorFactory = new AgentExecutorFactory();\n"]}
|
|
1
|
+
{"version":3,"file":"AgentExecutorFactory.js","sourceRoot":"","sources":["../../src/agents/AgentExecutorFactory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Executor Factory\n *\n * 从 Pod 读取凭证和供应商配置,创建对应的 Agent 执行器。\n *\n * 支持的执行器类型:\n * - codebuddy: CodeBuddy Agent SDK\n * - claude: Claude Agent SDK\n *\n * 使用流程:\n * 1. 从 Pod 读取 AgentProvider 配置\n * 2. 从 Pod 读取对应的 Credential\n * 3. 根据 executorType 创建对应的执行器实例\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq, and } from '@undefineds.co/drizzle-solid';\nimport type { IAgentExecutor, ExecutorType, AiCredential, ProviderConfig, BaseExecutorOptions } from './types';\nimport { AgentProvider } from './schema/tables';\nimport { Credential } from '../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../credential/schema/types';\n\n// 执行器实现(仅支持有完整 Agent SDK 的供应商)\nimport { ClaudeExecutor } from './ClaudeExecutor';\nimport { CodeBuddyExecutor } from './CodeBuddyExecutor';\n\nconst schema = {\n agentProvider: AgentProvider,\n credential: Credential,\n};\n\n/**\n * 支持的执行器类型\n */\nexport const SUPPORTED_EXECUTOR_TYPES: ExecutorType[] = ['codebuddy', 'claude'];\n\n/**\n * Agent Executor Factory\n *\n * 负责从 Pod 读取配置并创建执行器实例。\n */\nexport class AgentExecutorFactory {\n private readonly logger = getLoggerFor(this);\n\n /**\n * 检查执行器类型是否支持\n */\n public isSupported(executorType: string): executorType is ExecutorType {\n return SUPPORTED_EXECUTOR_TYPES.includes(executorType as ExecutorType);\n }\n\n /**\n * 从 Pod 创建执行器\n *\n * @param podBaseUrl Pod 根 URL\n * @param providerId 供应商 ID\n * @param authenticatedFetch 带认证的 fetch 函数\n * @param webId 用户 WebID(可选)\n * @returns 执行器实例,如果未找到配置则返回 null\n */\n public async create(\n podBaseUrl: string,\n providerId: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<IAgentExecutor | null> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n // 1. 读取供应商配置\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n\n if (!provider) {\n this.logger.debug(`Agent provider not found: ${providerId}`);\n return null;\n }\n\n if (provider.enabled !== 'true') {\n this.logger.debug(`Agent provider is disabled: ${providerId}`);\n return null;\n }\n\n // 检查执行器类型是否支持\n if (!this.isSupported(provider.executorType)) {\n this.logger.warn(`Unsupported executor type: ${provider.executorType}. Only 'codebuddy' and 'claude' are supported.`);\n return null;\n }\n\n // 2. 读取凭证\n const providerUri = `${podBaseUrl}settings/ai/agent-providers.ttl#${providerId}`;\n const credentials = await db.query.credential.findMany({\n where: and(\n eq(Credential.service, ServiceType.AI),\n eq(Credential.status, CredentialStatus.ACTIVE),\n eq(Credential.provider, providerUri),\n ),\n });\n\n if (credentials.length === 0) {\n this.logger.debug(`No active credential found for agent provider: ${providerId}`);\n return null;\n }\n\n // 随机选择一个凭证(负载均衡)\n const credential = credentials[Math.floor(Math.random() * credentials.length)] as any;\n\n // 3. 构建凭证对象\n const aiCredential: AiCredential = {\n providerId,\n apiKey: credential.apiKey ?? '',\n baseUrl: credential.baseUrl ?? provider.baseUrl ?? undefined,\n proxyUrl: credential.proxyUrl ?? undefined,\n projectId: credential.projectId ?? undefined,\n organizationId: credential.organizationId ?? undefined,\n };\n\n // 4. 构建供应商配置\n const providerConfig: ProviderConfig = {\n id: provider.id,\n displayName: provider.displayName ?? provider.id,\n executorType: provider.executorType as ExecutorType,\n baseUrl: provider.baseUrl ?? undefined,\n defaultModel: provider.defaultModel ?? undefined,\n enabled: provider.enabled === 'true',\n };\n\n // 5. 创建执行器\n return this.createExecutor(provider.executorType as ExecutorType, {\n providerId,\n credential: aiCredential,\n providerConfig,\n });\n } catch (error) {\n this.logger.error(`Failed to create executor for provider ${providerId}:`, error);\n return null;\n }\n }\n\n /**\n * 列出所有可用的供应商\n */\n public async listProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n const providers = await db.query.agentProvider.findMany();\n\n return providers.map((p: typeof providers[number]) => ({\n id: p.id,\n displayName: p.displayName ?? p.id,\n executorType: p.executorType as ExecutorType,\n baseUrl: p.baseUrl ?? undefined,\n defaultModel: p.defaultModel ?? undefined,\n enabled: p.enabled === 'true',\n }));\n } catch (error) {\n this.logger.error('Failed to list agent providers:', error);\n return [];\n }\n }\n\n /**\n * 列出所有启用的供应商\n */\n public async listEnabledProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n const providers = await this.listProviders(podBaseUrl, authenticatedFetch, webId);\n return providers.filter((p) => p.enabled);\n }\n\n /**\n * 列出所有支持的供应商(executorType 受支持且已启用)\n */\n public async listSupportedProviders(\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<ProviderConfig[]> {\n const providers = await this.listEnabledProviders(podBaseUrl, authenticatedFetch, webId);\n return providers.filter((p) => this.isSupported(p.executorType));\n }\n\n /**\n * 根据 executorType 创建执行器\n */\n public createExecutor(executorType: ExecutorType, options: BaseExecutorOptions): IAgentExecutor {\n switch (executorType) {\n case 'claude':\n return new ClaudeExecutor(options);\n\n case 'codebuddy':\n return new CodeBuddyExecutor(options);\n\n default:\n throw new Error(\n `Unsupported executor type: ${executorType}. ` +\n `Only 'codebuddy' and 'claude' are supported because they have complete Agent SDKs.`\n );\n }\n }\n\n /**\n * 创建指定类型的执行器(直接使用凭证,不从 Pod 读取)\n *\n * 用于测试或已知凭证的场景。\n */\n public createDirect(\n executorType: ExecutorType,\n providerId: string,\n credential: AiCredential,\n ): IAgentExecutor {\n return this.createExecutor(executorType, {\n providerId,\n credential,\n });\n }\n}\n\n/**\n * 默认工厂实例\n */\nexport const agentExecutorFactory = new AgentExecutorFactory();\n"]}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.agentManager = exports.AgentManager = void 0;
|
|
13
13
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
14
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
14
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
15
15
|
const agent_config_1 = require("./schema/agent-config");
|
|
16
16
|
const tables_1 = require("./schema/tables");
|
|
17
17
|
const tables_2 = require("../credential/schema/tables");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentManager.js","sourceRoot":"","sources":["../../src/agents/AgentManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Manager - Agent 生命周期管理\n *\n * 职责:\n * 1. 从 Pod 读取 Agent 配置\n * 2. 根据配置创建 Executor\n * 3. 管理 Agent 实例的生命周期\n * 4. 路由消息到对应的 Agent\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from 'drizzle-solid';\nimport type { IAgentExecutor, ExecutorType, ExecutorConfig, AiCredential } from './types';\nimport { AgentConfig as AgentConfigTable, AgentStatus } from './schema/agent-config';\nimport { AgentProvider } from './schema/tables';\nimport { Credential } from '../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../credential/schema/types';\nimport { AgentExecutorFactory } from './AgentExecutorFactory';\n\n/**\n * Agent 实例 - 包含配置和执行器\n */\nexport interface AgentInstance {\n /** Agent ID */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 描述 */\n description: string;\n /** 执行器实例 */\n executor: IAgentExecutor;\n /** 执行器配置 */\n config: ExecutorConfig;\n /** 状态 */\n status: 'idle' | 'running' | 'error';\n /** 启动时间 */\n startedAt?: Date;\n /** 最后活动时间 */\n lastActivityAt?: Date;\n}\n\n/**\n * Agent 配置(从 Pod 读取)\n */\nexport interface AgentConfig {\n id: string;\n displayName?: string;\n description?: string;\n providerId: string;\n modelUri?: string;\n systemPrompt: string;\n maxTurns?: number;\n timeout?: number;\n enabled: boolean;\n}\n\nconst schema = {\n agentConfig: AgentConfigTable,\n agentStatus: AgentStatus,\n agentProvider: AgentProvider,\n credential: Credential,\n};\n\n/**\n * Agent Manager\n *\n * 管理 Agent 实例的完整生命周期\n */\nexport class AgentManager {\n private readonly logger = getLoggerFor(this);\n private readonly factory = new AgentExecutorFactory();\n private readonly instances = new Map<string, AgentInstance>();\n\n /**\n * 获取或创建 Agent 实例\n *\n * 如果 Agent 已存在且健在,直接返回\n * 否则根据配置创建新实例\n *\n * @param agentId Agent ID\n * @param podBaseUrl Pod 根 URL\n * @param authenticatedFetch 带认证的 fetch\n * @param webId 用户 WebID\n */\n public async getOrCreate(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<AgentInstance | null> {\n // 1. 检查是否有健在的实例\n const existing = this.instances.get(agentId);\n if (existing && this.isAlive(existing)) {\n this.logger.debug(`Agent ${agentId} is alive, reusing instance`);\n return existing;\n }\n\n // 2. 从 Pod 读取配置并创建\n this.logger.info(`Creating agent instance: ${agentId}`);\n const instance = await this.createFromConfig(agentId, podBaseUrl, authenticatedFetch, webId);\n\n if (instance) {\n this.instances.set(agentId, instance);\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n }\n\n return instance;\n }\n\n /**\n * 检查 Agent 是否健在\n */\n private isAlive(instance: AgentInstance): boolean {\n // 简单判断:非 error 状态就是健在\n // 未来可以加入心跳检测\n return instance.status !== 'error';\n }\n\n /**\n * 从 Pod 配置创建 Agent 实例\n */\n private async createFromConfig(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<AgentInstance | null> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n // 1. 读取 Agent 配置\n const agentConfig = await db.query.agentConfig.findFirst({\n where: eq(AgentConfigTable.id, agentId),\n });\n\n if (!agentConfig) {\n this.logger.warn(`Agent config not found: ${agentId}`);\n return null;\n }\n\n if (agentConfig.enabled !== 'true') {\n this.logger.debug(`Agent is disabled: ${agentId}`);\n return null;\n }\n\n // 2. 解析 provider URI,获取 provider ID\n const providerUri = agentConfig.provider;\n if (!providerUri) {\n this.logger.error(`Agent ${agentId} has no provider configured`);\n return null;\n }\n\n // provider URI 格式: /settings/ai/agent-providers.ttl#codebuddy\n const providerId = providerUri.split('#').pop();\n if (!providerId) {\n this.logger.error(`Invalid provider URI: ${providerUri}`);\n return null;\n }\n\n // 3. 读取 Provider 配置\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n\n if (!provider) {\n this.logger.error(`Provider not found: ${providerId}`);\n return null;\n }\n\n // 4. 读取 Credential\n const credentials = await db.query.credential.findMany({\n where: eq(Credential.provider, providerUri),\n });\n\n const activeCredential = credentials.find(\n (c: any) => c.status === CredentialStatus.ACTIVE && c.service === ServiceType.AI,\n );\n\n // 构建凭证(可能为空,Executor 会处理)\n const credential: AiCredential = {\n providerId,\n apiKey: (activeCredential as any)?.apiKey ?? '',\n baseUrl: (activeCredential as any)?.baseUrl ?? provider.baseUrl ?? undefined,\n projectId: (activeCredential as any)?.projectId ?? undefined,\n organizationId: (activeCredential as any)?.organizationId ?? undefined,\n };\n\n // 5. 创建 Executor\n const executorType = provider.executorType as ExecutorType;\n const executor = this.factory.createExecutor(executorType, {\n providerId,\n credential,\n providerConfig: {\n id: providerId,\n displayName: provider.displayName ?? providerId,\n executorType,\n baseUrl: provider.baseUrl ?? undefined,\n defaultModel: provider.defaultModel ?? undefined,\n enabled: provider.enabled === 'true',\n },\n });\n\n // 6. 构建执行器配置\n const config: ExecutorConfig = {\n name: agentId,\n description: agentConfig.description ?? undefined,\n systemPrompt: agentConfig.systemPrompt ?? '',\n model: agentConfig.model ?? provider.defaultModel ?? undefined,\n maxTokens: 8192,\n };\n\n // 7. 返回实例\n return {\n id: agentId,\n displayName: agentConfig.displayName ?? agentId,\n description: agentConfig.description ?? '',\n executor,\n config,\n status: 'idle',\n startedAt: new Date(),\n };\n } catch (error) {\n this.logger.error(`Failed to create agent ${agentId}:`, error);\n return null;\n }\n }\n\n /**\n * 发送消息给 Agent\n *\n * @param agentId Agent ID\n * @param message 消息内容\n * @param podBaseUrl Pod 根 URL\n * @param authenticatedFetch 带认证的 fetch\n * @param webId 用户 WebID\n * @param accessToken OAuth token(用于 MCP)\n */\n public async sendMessage(\n agentId: string,\n message: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n accessToken?: string,\n ): Promise<{ success: boolean; result?: string; error?: string }> {\n // 1. 获取或创建实例\n const instance = await this.getOrCreate(agentId, podBaseUrl, authenticatedFetch, webId);\n if (!instance) {\n return { success: false, error: `Agent not found or disabled: ${agentId}` };\n }\n\n // 2. 更新状态为 running\n instance.status = 'running';\n instance.lastActivityAt = new Date();\n await this.updateStatus(agentId, 'running', podBaseUrl, authenticatedFetch, webId);\n\n try {\n // 3. 执行\n const result = await instance.executor.executeAndWait(instance.config, message);\n\n // 4. 更新状态\n instance.status = 'idle';\n instance.lastActivityAt = new Date();\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n\n if (result.success) {\n return { success: true, result: result.result };\n } else {\n return { success: false, error: result.error };\n }\n } catch (error) {\n // 5. 错误处理\n instance.status = 'error';\n await this.updateStatus(\n agentId,\n 'error',\n podBaseUrl,\n authenticatedFetch,\n webId,\n error instanceof Error ? error.message : String(error),\n );\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * 更新 Agent 状态到 Pod\n */\n private async updateStatus(\n agentId: string,\n status: 'idle' | 'running' | 'error',\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n errorMessage?: string,\n ): Promise<void> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n const now = new Date().toISOString();\n\n // 先查询是否存在,再决定插入或更新\n const existing = await db.query.agentStatus.findFirst({\n where: eq(AgentStatus.id, agentId),\n });\n\n if (existing) {\n await db\n .update(AgentStatus)\n .set({\n status,\n lastActivityAt: now,\n errorMessage: errorMessage ?? undefined,\n })\n .where(eq(AgentStatus.id, agentId));\n } else {\n await db.insert(AgentStatus).values({\n id: agentId,\n agentId,\n status,\n startedAt: status === 'running' ? now : undefined,\n lastActivityAt: now,\n errorMessage: errorMessage ?? undefined,\n });\n }\n } catch (error) {\n // 状态更新失败不影响主流程\n this.logger.warn(`Failed to update agent status: ${error}`);\n }\n }\n\n /**\n * 获取 Agent 状态\n */\n public getStatus(agentId: string): AgentInstance | undefined {\n return this.instances.get(agentId);\n }\n\n /**\n * 列出所有活跃的 Agent\n */\n public listActiveAgents(): AgentInstance[] {\n return Array.from(this.instances.values()).filter((i) => this.isAlive(i));\n }\n\n /**\n * 停止 Agent\n */\n public async stop(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<void> {\n const instance = this.instances.get(agentId);\n if (instance) {\n instance.status = 'idle';\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n this.instances.delete(agentId);\n this.logger.info(`Agent stopped: ${agentId}`);\n }\n }\n\n /**\n * 停止所有 Agent\n */\n public async stopAll(): Promise<void> {\n for (const [agentId] of this.instances) {\n this.instances.delete(agentId);\n this.logger.info(`Agent stopped: ${agentId}`);\n }\n }\n}\n\n/**\n * 默认 AgentManager 实例\n */\nexport const agentManager = new AgentManager();\n"]}
|
|
1
|
+
{"version":3,"file":"AgentManager.js","sourceRoot":"","sources":["../../src/agents/AgentManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Manager - Agent 生命周期管理\n *\n * 职责:\n * 1. 从 Pod 读取 Agent 配置\n * 2. 根据配置创建 Executor\n * 3. 管理 Agent 实例的生命周期\n * 4. 路由消息到对应的 Agent\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport type { IAgentExecutor, ExecutorType, ExecutorConfig, AiCredential } from './types';\nimport { AgentConfig as AgentConfigTable, AgentStatus } from './schema/agent-config';\nimport { AgentProvider } from './schema/tables';\nimport { Credential } from '../credential/schema/tables';\nimport { ServiceType, CredentialStatus } from '../credential/schema/types';\nimport { AgentExecutorFactory } from './AgentExecutorFactory';\n\n/**\n * Agent 实例 - 包含配置和执行器\n */\nexport interface AgentInstance {\n /** Agent ID */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 描述 */\n description: string;\n /** 执行器实例 */\n executor: IAgentExecutor;\n /** 执行器配置 */\n config: ExecutorConfig;\n /** 状态 */\n status: 'idle' | 'running' | 'error';\n /** 启动时间 */\n startedAt?: Date;\n /** 最后活动时间 */\n lastActivityAt?: Date;\n}\n\n/**\n * Agent 配置(从 Pod 读取)\n */\nexport interface AgentConfig {\n id: string;\n displayName?: string;\n description?: string;\n providerId: string;\n modelUri?: string;\n systemPrompt: string;\n maxTurns?: number;\n timeout?: number;\n enabled: boolean;\n}\n\nconst schema = {\n agentConfig: AgentConfigTable,\n agentStatus: AgentStatus,\n agentProvider: AgentProvider,\n credential: Credential,\n};\n\n/**\n * Agent Manager\n *\n * 管理 Agent 实例的完整生命周期\n */\nexport class AgentManager {\n private readonly logger = getLoggerFor(this);\n private readonly factory = new AgentExecutorFactory();\n private readonly instances = new Map<string, AgentInstance>();\n\n /**\n * 获取或创建 Agent 实例\n *\n * 如果 Agent 已存在且健在,直接返回\n * 否则根据配置创建新实例\n *\n * @param agentId Agent ID\n * @param podBaseUrl Pod 根 URL\n * @param authenticatedFetch 带认证的 fetch\n * @param webId 用户 WebID\n */\n public async getOrCreate(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<AgentInstance | null> {\n // 1. 检查是否有健在的实例\n const existing = this.instances.get(agentId);\n if (existing && this.isAlive(existing)) {\n this.logger.debug(`Agent ${agentId} is alive, reusing instance`);\n return existing;\n }\n\n // 2. 从 Pod 读取配置并创建\n this.logger.info(`Creating agent instance: ${agentId}`);\n const instance = await this.createFromConfig(agentId, podBaseUrl, authenticatedFetch, webId);\n\n if (instance) {\n this.instances.set(agentId, instance);\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n }\n\n return instance;\n }\n\n /**\n * 检查 Agent 是否健在\n */\n private isAlive(instance: AgentInstance): boolean {\n // 简单判断:非 error 状态就是健在\n // 未来可以加入心跳检测\n return instance.status !== 'error';\n }\n\n /**\n * 从 Pod 配置创建 Agent 实例\n */\n private async createFromConfig(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<AgentInstance | null> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n // 1. 读取 Agent 配置\n const agentConfig = await db.query.agentConfig.findFirst({\n where: eq(AgentConfigTable.id, agentId),\n });\n\n if (!agentConfig) {\n this.logger.warn(`Agent config not found: ${agentId}`);\n return null;\n }\n\n if (agentConfig.enabled !== 'true') {\n this.logger.debug(`Agent is disabled: ${agentId}`);\n return null;\n }\n\n // 2. 解析 provider URI,获取 provider ID\n const providerUri = agentConfig.provider;\n if (!providerUri) {\n this.logger.error(`Agent ${agentId} has no provider configured`);\n return null;\n }\n\n // provider URI 格式: /settings/ai/agent-providers.ttl#codebuddy\n const providerId = providerUri.split('#').pop();\n if (!providerId) {\n this.logger.error(`Invalid provider URI: ${providerUri}`);\n return null;\n }\n\n // 3. 读取 Provider 配置\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n\n if (!provider) {\n this.logger.error(`Provider not found: ${providerId}`);\n return null;\n }\n\n // 4. 读取 Credential\n const credentials = await db.query.credential.findMany({\n where: eq(Credential.provider, providerUri),\n });\n\n const activeCredential = credentials.find(\n (c: any) => c.status === CredentialStatus.ACTIVE && c.service === ServiceType.AI,\n );\n\n // 构建凭证(可能为空,Executor 会处理)\n const credential: AiCredential = {\n providerId,\n apiKey: (activeCredential as any)?.apiKey ?? '',\n baseUrl: (activeCredential as any)?.baseUrl ?? provider.baseUrl ?? undefined,\n projectId: (activeCredential as any)?.projectId ?? undefined,\n organizationId: (activeCredential as any)?.organizationId ?? undefined,\n };\n\n // 5. 创建 Executor\n const executorType = provider.executorType as ExecutorType;\n const executor = this.factory.createExecutor(executorType, {\n providerId,\n credential,\n providerConfig: {\n id: providerId,\n displayName: provider.displayName ?? providerId,\n executorType,\n baseUrl: provider.baseUrl ?? undefined,\n defaultModel: provider.defaultModel ?? undefined,\n enabled: provider.enabled === 'true',\n },\n });\n\n // 6. 构建执行器配置\n const config: ExecutorConfig = {\n name: agentId,\n description: agentConfig.description ?? undefined,\n systemPrompt: agentConfig.systemPrompt ?? '',\n model: agentConfig.model ?? provider.defaultModel ?? undefined,\n maxTokens: 8192,\n };\n\n // 7. 返回实例\n return {\n id: agentId,\n displayName: agentConfig.displayName ?? agentId,\n description: agentConfig.description ?? '',\n executor,\n config,\n status: 'idle',\n startedAt: new Date(),\n };\n } catch (error) {\n this.logger.error(`Failed to create agent ${agentId}:`, error);\n return null;\n }\n }\n\n /**\n * 发送消息给 Agent\n *\n * @param agentId Agent ID\n * @param message 消息内容\n * @param podBaseUrl Pod 根 URL\n * @param authenticatedFetch 带认证的 fetch\n * @param webId 用户 WebID\n * @param accessToken OAuth token(用于 MCP)\n */\n public async sendMessage(\n agentId: string,\n message: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n accessToken?: string,\n ): Promise<{ success: boolean; result?: string; error?: string }> {\n // 1. 获取或创建实例\n const instance = await this.getOrCreate(agentId, podBaseUrl, authenticatedFetch, webId);\n if (!instance) {\n return { success: false, error: `Agent not found or disabled: ${agentId}` };\n }\n\n // 2. 更新状态为 running\n instance.status = 'running';\n instance.lastActivityAt = new Date();\n await this.updateStatus(agentId, 'running', podBaseUrl, authenticatedFetch, webId);\n\n try {\n // 3. 执行\n const result = await instance.executor.executeAndWait(instance.config, message);\n\n // 4. 更新状态\n instance.status = 'idle';\n instance.lastActivityAt = new Date();\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n\n if (result.success) {\n return { success: true, result: result.result };\n } else {\n return { success: false, error: result.error };\n }\n } catch (error) {\n // 5. 错误处理\n instance.status = 'error';\n await this.updateStatus(\n agentId,\n 'error',\n podBaseUrl,\n authenticatedFetch,\n webId,\n error instanceof Error ? error.message : String(error),\n );\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * 更新 Agent 状态到 Pod\n */\n private async updateStatus(\n agentId: string,\n status: 'idle' | 'running' | 'error',\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n errorMessage?: string,\n ): Promise<void> {\n try {\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, { schema });\n\n const now = new Date().toISOString();\n\n // 先查询是否存在,再决定插入或更新\n const existing = await db.query.agentStatus.findFirst({\n where: eq(AgentStatus.id, agentId),\n });\n\n if (existing) {\n await db\n .update(AgentStatus)\n .set({\n status,\n lastActivityAt: now,\n errorMessage: errorMessage ?? undefined,\n })\n .where(eq(AgentStatus.id, agentId));\n } else {\n await db.insert(AgentStatus).values({\n id: agentId,\n agentId,\n status,\n startedAt: status === 'running' ? now : undefined,\n lastActivityAt: now,\n errorMessage: errorMessage ?? undefined,\n });\n }\n } catch (error) {\n // 状态更新失败不影响主流程\n this.logger.warn(`Failed to update agent status: ${error}`);\n }\n }\n\n /**\n * 获取 Agent 状态\n */\n public getStatus(agentId: string): AgentInstance | undefined {\n return this.instances.get(agentId);\n }\n\n /**\n * 列出所有活跃的 Agent\n */\n public listActiveAgents(): AgentInstance[] {\n return Array.from(this.instances.values()).filter((i) => this.isAlive(i));\n }\n\n /**\n * 停止 Agent\n */\n public async stop(\n agentId: string,\n podBaseUrl: string,\n authenticatedFetch: typeof fetch,\n webId?: string,\n ): Promise<void> {\n const instance = this.instances.get(agentId);\n if (instance) {\n instance.status = 'idle';\n await this.updateStatus(agentId, 'idle', podBaseUrl, authenticatedFetch, webId);\n this.instances.delete(agentId);\n this.logger.info(`Agent stopped: ${agentId}`);\n }\n }\n\n /**\n * 停止所有 Agent\n */\n public async stopAll(): Promise<void> {\n for (const [agentId] of this.instances) {\n this.instances.delete(agentId);\n this.logger.info(`Agent stopped: ${agentId}`);\n }\n }\n}\n\n/**\n * 默认 AgentManager 实例\n */\nexport const agentManager = new AgentManager();\n"]}
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
* Instantiate for a specific agent at query time:
|
|
25
25
|
* AgentMetaSchema.table('AgentMeta', { base: `/agents/${agentId}/.meta` })
|
|
26
26
|
*/
|
|
27
|
-
export declare const AgentMetaSchema: import("drizzle-solid").SolidSchema<import("drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
28
|
-
id: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
29
|
-
displayName: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
30
|
-
provider: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
|
-
credential: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
32
|
-
model: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
33
|
-
enabled: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
27
|
+
export declare const AgentMetaSchema: import("@undefineds.co/drizzle-solid").SolidSchema<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
28
|
+
id: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
29
|
+
displayName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
30
|
+
provider: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
|
+
credential: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
32
|
+
model: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
33
|
+
enabled: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
34
34
|
}>>;
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
23
|
exports.AgentMetaSchema = void 0;
|
|
24
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
24
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
25
25
|
const vocab_1 = require("../../vocab");
|
|
26
26
|
/**
|
|
27
27
|
* AgentMeta schema definition (unbound).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-meta-schema.js","sourceRoot":"","sources":["../../../src/agents/config/agent-meta-schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"agent-meta-schema.js","sourceRoot":"","sources":["../../../src/agents/config/agent-meta-schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,gEAAwE;AACxE,uCAAmD;AAEnD;;;;;GAKG;AACU,QAAA,eAAe,GAAG,IAAA,2BAAW,EACxC;IACE,EAAE,EAAE,IAAA,sBAAM,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC7B,WAAW,EAAE,IAAA,sBAAM,EAAC,aAAa,CAAC;IAClC,QAAQ,EAAE,IAAA,mBAAG,EAAC,UAAU,CAAC;IACzB,UAAU,EAAE,IAAA,mBAAG,EAAC,YAAY,CAAC;IAC7B,KAAK,EAAE,IAAA,mBAAG,EAAC,OAAO,CAAC;IACnB,OAAO,EAAE,IAAA,sBAAM,EAAC,SAAS,CAAC;CAC3B,EACD;IACE,IAAI,EAAE,YAAI,CAAC,WAAW;IACtB,SAAS,EAAE,sBAAc;IACzB,eAAe,EAAE,OAAO;CACzB,CACF,CAAC","sourcesContent":["/**\n * Agent Meta Schema - Per-agent .meta TTL document\n *\n * Each agent folder has a .meta auxiliary resource:\n * /agents/{agentId}/.meta\n *\n * Contains server-side references to provider, credential, and model.\n * This is NOT user-editable — managed by the server/admin UI.\n *\n * RDF example:\n * <#config> a udfs:AgentConfig ;\n * udfs:displayName \"Secretary\" ;\n * udfs:provider </settings/ai/agent-providers.ttl#claude> ;\n * udfs:credential </settings/credentials.ttl#anthropic-key> ;\n * udfs:model </settings/ai/models.ttl#claude-sonnet-4> ;\n * udfs:enabled \"true\" .\n *\n * Uses SolidSchema (unbound) + .table() for per-agent dynamic paths:\n * const table = AgentMetaSchema.table('AgentMeta', { base: `/agents/${agentId}/.meta` });\n */\n\nimport { solidSchema, string, uri } from '@undefineds.co/drizzle-solid';\nimport { UDFS, UDFS_NAMESPACE } from '../../vocab';\n\n/**\n * AgentMeta schema definition (unbound).\n *\n * Instantiate for a specific agent at query time:\n * AgentMetaSchema.table('AgentMeta', { base: `/agents/${agentId}/.meta` })\n */\nexport const AgentMetaSchema = solidSchema(\n {\n id: string('id').primaryKey(),\n displayName: string('displayName'),\n provider: uri('provider'),\n credential: uri('credential'),\n model: uri('model'),\n enabled: string('enabled'),\n },\n {\n type: UDFS.AgentConfig,\n namespace: UDFS_NAMESPACE,\n subjectTemplate: '#{id}',\n },\n);\n"]}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.resolveAgentConfig = resolveAgentConfig;
|
|
18
18
|
const global_logger_factory_1 = require("global-logger-factory");
|
|
19
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
19
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
20
20
|
const parse_agent_md_1 = require("./parse-agent-md");
|
|
21
21
|
const agent_meta_schema_1 = require("./agent-meta-schema");
|
|
22
22
|
const tables_1 = require("../schema/tables");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/agents/config/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Config Resolver\n *\n * Reads /agents/{agentId}/AGENT.md + /agents/{agentId}/.meta from Pod,\n * resolves provider/credential/model URIs, and assembles a ResolvedAgentConfig.\n *\n * Flow:\n * 1. Fetch AGENT.md → parse frontmatter + body\n * 2. Query .meta TTL → get provider/credential/model URIs\n * 3. Resolve URIs → AgentProvider, Credential, Model records\n * 4. Fetch skills (if any) → concatenate prompt content\n * 5. Convert MCP server defs → McpServerConfig map\n * 6. Return ResolvedAgentConfig\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from 'drizzle-solid';\nimport { parseAgentMd } from './parse-agent-md';\nimport { AgentMetaSchema } from './agent-meta-schema';\nimport { AgentProvider } from '../schema/tables';\nimport { Credential } from '../../credential/schema/tables';\nimport { Model } from '../../ai/schema/model';\nimport type { ResolvedAgentConfig, AgentMcpServerDef } from './types';\nimport type { McpServerConfig } from '../types';\n\nconst logger = getLoggerFor('AgentConfigResolver');\n\ninterface ResolveContext {\n podBaseUrl: string;\n authenticatedFetch: typeof fetch;\n webId?: string;\n}\n\n/**\n * Resolve a complete agent config from Pod storage.\n *\n * @param agentId - Agent folder name (e.g. 'secretary')\n * @param ctx - Pod access context\n * @returns Fully resolved config, or null if agent not found / disabled\n */\nexport async function resolveAgentConfig(\n agentId: string,\n ctx: ResolveContext,\n): Promise<ResolvedAgentConfig | null> {\n const { podBaseUrl, authenticatedFetch, webId } = ctx;\n\n // 1. Fetch AGENT.md\n const agentMdUrl = new URL(`/agents/${agentId}/AGENT.md`, podBaseUrl).href;\n const mdResponse = await authenticatedFetch(agentMdUrl);\n if (!mdResponse.ok) {\n logger.warn(`AGENT.md not found for ${agentId}: ${mdResponse.status}`);\n return null;\n }\n const mdContent = await mdResponse.text();\n const { frontmatter, body: systemPrompt } = parseAgentMd(mdContent);\n\n // 2. Query .meta\n const metaTable = AgentMetaSchema.table('AgentMeta', {\n base: `/agents/${agentId}/.meta`,\n });\n\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, {\n schema: {\n agentMeta: metaTable,\n agentProvider: AgentProvider,\n credential: Credential,\n model: Model,\n },\n });\n\n const metaRecord = await db.query.agentMeta.findFirst();\n if (!metaRecord) {\n logger.warn(`.meta not found for agent ${agentId}`);\n return null;\n }\n\n if (metaRecord.enabled === 'false') {\n logger.debug(`Agent ${agentId} is disabled`);\n return null;\n }\n\n // 3. Resolve provider\n const providerUri = metaRecord.provider;\n if (!providerUri) {\n logger.error(`Agent ${agentId} has no provider in .meta`);\n return null;\n }\n const providerId = providerUri.split('#').pop();\n if (!providerId) {\n logger.error(`Invalid provider URI: ${providerUri}`);\n return null;\n }\n\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n if (!provider) {\n logger.error(`Provider not found: ${providerId}`);\n return null;\n }\n\n // 4. Resolve credential\n const credentialUri = metaRecord.credential;\n let apiKey = '';\n let baseUrl = provider.baseUrl ?? undefined;\n let proxyUrl: string | undefined;\n\n if (credentialUri) {\n const credentialId = credentialUri.split('#').pop();\n if (credentialId) {\n const cred = await db.query.credential.findFirst({\n where: eq(Credential.id, credentialId),\n });\n if (cred) {\n apiKey = (cred as any).apiKey ?? '';\n baseUrl = (cred as any).baseUrl ?? baseUrl;\n proxyUrl = (cred as any).proxyUrl ?? undefined;\n }\n }\n }\n\n // 5. Resolve model\n let modelName = provider.defaultModel ?? undefined;\n const modelUri = metaRecord.model;\n if (modelUri) {\n const modelId = modelUri.split('#').pop();\n if (modelId) {\n const modelRecord = await db.query.model.findFirst({\n where: eq(Model.id, modelId),\n });\n if (modelRecord) {\n modelName = modelRecord.id;\n }\n }\n }\n\n // 6. Resolve skills\n const skillsContent = await resolveSkills(\n frontmatter.skills ?? [],\n podBaseUrl,\n agentId,\n authenticatedFetch,\n );\n\n // 7. Convert MCP server defs\n const mcpServers = convertMcpServers(frontmatter['mcp-servers'] ?? []);\n\n // 8. Assemble\n return {\n id: agentId,\n displayName: metaRecord.displayName ?? frontmatter.name ?? agentId,\n description: frontmatter.description,\n systemPrompt,\n executorType: provider.executorType as ResolvedAgentConfig['executorType'],\n apiKey,\n baseUrl,\n proxyUrl,\n model: modelName,\n maxTurns: frontmatter['max-turns'],\n allowedTools: Array.isArray(frontmatter['allowed-tools'])\n ? frontmatter['allowed-tools']\n : undefined,\n disallowedTools: Array.isArray(frontmatter['disallowed-tools'])\n ? frontmatter['disallowed-tools']\n : undefined,\n permissionMode: frontmatter['permission-mode'],\n mcpServers,\n skillsContent: skillsContent || undefined,\n enabled: metaRecord.enabled !== 'false',\n };\n}\n\n/**\n * Resolve skill URIs to concatenated prompt content.\n *\n * Skills can be:\n * - Absolute: /skills/drizzle-solid → fetch /skills/drizzle-solid/SKILL.md\n * - Relative: ./skills/custom → fetch /agents/{agentId}/skills/custom/SKILL.md\n */\nasync function resolveSkills(\n skillRefs: string[],\n podBaseUrl: string,\n agentId: string,\n authenticatedFetch: typeof fetch,\n): Promise<string> {\n if (skillRefs.length === 0) return '';\n\n const parts: string[] = [];\n\n for (const ref of skillRefs) {\n const skillPath = ref.startsWith('./')\n ? `/agents/${agentId}/${ref.slice(2)}/SKILL.md`\n : `${ref}/SKILL.md`;\n\n const url = new URL(skillPath, podBaseUrl).href;\n try {\n const res = await authenticatedFetch(url);\n if (res.ok) {\n const content = await res.text();\n // Parse SKILL.md — extract body (skip frontmatter)\n const { body } = parseAgentMd(content);\n if (body) {\n parts.push(body);\n }\n } else {\n logger.warn(`Skill not found: ${ref} (${res.status})`);\n }\n } catch (err) {\n logger.warn(`Failed to fetch skill ${ref}:`, err);\n }\n }\n\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/**\n * Convert AGENT.md MCP server definitions to McpServerConfig map.\n */\nfunction convertMcpServers(\n defs: AgentMcpServerDef[],\n): Record<string, McpServerConfig> {\n const result: Record<string, McpServerConfig> = {};\n\n for (const def of defs) {\n const config: McpServerConfig = {};\n\n if (def.transport) {\n config.type = def.transport;\n } else if (def.command) {\n config.type = 'stdio';\n } else if (def.url) {\n config.type = 'sse';\n }\n\n if (def.command) config.command = def.command;\n if (def.args) config.args = def.args;\n if (def.env) config.env = def.env;\n if (def.url) config.url = def.url;\n if (def.headers) config.headers = def.headers;\n\n result[def.name] = config;\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/agents/config/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Config Resolver\n *\n * Reads /agents/{agentId}/AGENT.md + /agents/{agentId}/.meta from Pod,\n * resolves provider/credential/model URIs, and assembles a ResolvedAgentConfig.\n *\n * Flow:\n * 1. Fetch AGENT.md → parse frontmatter + body\n * 2. Query .meta TTL → get provider/credential/model URIs\n * 3. Resolve URIs → AgentProvider, Credential, Model records\n * 4. Fetch skills (if any) → concatenate prompt content\n * 5. Convert MCP server defs → McpServerConfig map\n * 6. Return ResolvedAgentConfig\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport { drizzle, eq } from '@undefineds.co/drizzle-solid';\nimport { parseAgentMd } from './parse-agent-md';\nimport { AgentMetaSchema } from './agent-meta-schema';\nimport { AgentProvider } from '../schema/tables';\nimport { Credential } from '../../credential/schema/tables';\nimport { Model } from '../../ai/schema/model';\nimport type { ResolvedAgentConfig, AgentMcpServerDef } from './types';\nimport type { McpServerConfig } from '../types';\n\nconst logger = getLoggerFor('AgentConfigResolver');\n\ninterface ResolveContext {\n podBaseUrl: string;\n authenticatedFetch: typeof fetch;\n webId?: string;\n}\n\n/**\n * Resolve a complete agent config from Pod storage.\n *\n * @param agentId - Agent folder name (e.g. 'secretary')\n * @param ctx - Pod access context\n * @returns Fully resolved config, or null if agent not found / disabled\n */\nexport async function resolveAgentConfig(\n agentId: string,\n ctx: ResolveContext,\n): Promise<ResolvedAgentConfig | null> {\n const { podBaseUrl, authenticatedFetch, webId } = ctx;\n\n // 1. Fetch AGENT.md\n const agentMdUrl = new URL(`/agents/${agentId}/AGENT.md`, podBaseUrl).href;\n const mdResponse = await authenticatedFetch(agentMdUrl);\n if (!mdResponse.ok) {\n logger.warn(`AGENT.md not found for ${agentId}: ${mdResponse.status}`);\n return null;\n }\n const mdContent = await mdResponse.text();\n const { frontmatter, body: systemPrompt } = parseAgentMd(mdContent);\n\n // 2. Query .meta\n const metaTable = AgentMetaSchema.table('AgentMeta', {\n base: `/agents/${agentId}/.meta`,\n });\n\n const session = {\n info: { isLoggedIn: true, webId },\n fetch: authenticatedFetch,\n };\n const db = drizzle(session, {\n schema: {\n agentMeta: metaTable,\n agentProvider: AgentProvider,\n credential: Credential,\n model: Model,\n },\n });\n\n const metaRecord = await db.query.agentMeta.findFirst();\n if (!metaRecord) {\n logger.warn(`.meta not found for agent ${agentId}`);\n return null;\n }\n\n if (metaRecord.enabled === 'false') {\n logger.debug(`Agent ${agentId} is disabled`);\n return null;\n }\n\n // 3. Resolve provider\n const providerUri = metaRecord.provider;\n if (!providerUri) {\n logger.error(`Agent ${agentId} has no provider in .meta`);\n return null;\n }\n const providerId = providerUri.split('#').pop();\n if (!providerId) {\n logger.error(`Invalid provider URI: ${providerUri}`);\n return null;\n }\n\n const provider = await db.query.agentProvider.findFirst({\n where: eq(AgentProvider.id, providerId),\n });\n if (!provider) {\n logger.error(`Provider not found: ${providerId}`);\n return null;\n }\n\n // 4. Resolve credential\n const credentialUri = metaRecord.credential;\n let apiKey = '';\n let baseUrl = provider.baseUrl ?? undefined;\n let proxyUrl: string | undefined;\n\n if (credentialUri) {\n const credentialId = credentialUri.split('#').pop();\n if (credentialId) {\n const cred = await db.query.credential.findFirst({\n where: eq(Credential.id, credentialId),\n });\n if (cred) {\n apiKey = (cred as any).apiKey ?? '';\n baseUrl = (cred as any).baseUrl ?? baseUrl;\n proxyUrl = (cred as any).proxyUrl ?? undefined;\n }\n }\n }\n\n // 5. Resolve model\n let modelName = provider.defaultModel ?? undefined;\n const modelUri = metaRecord.model;\n if (modelUri) {\n const modelId = modelUri.split('#').pop();\n if (modelId) {\n const modelRecord = await db.query.model.findFirst({\n where: eq(Model.id, modelId),\n });\n if (modelRecord) {\n modelName = modelRecord.id;\n }\n }\n }\n\n // 6. Resolve skills\n const skillsContent = await resolveSkills(\n frontmatter.skills ?? [],\n podBaseUrl,\n agentId,\n authenticatedFetch,\n );\n\n // 7. Convert MCP server defs\n const mcpServers = convertMcpServers(frontmatter['mcp-servers'] ?? []);\n\n // 8. Assemble\n return {\n id: agentId,\n displayName: metaRecord.displayName ?? frontmatter.name ?? agentId,\n description: frontmatter.description,\n systemPrompt,\n executorType: provider.executorType as ResolvedAgentConfig['executorType'],\n apiKey,\n baseUrl,\n proxyUrl,\n model: modelName,\n maxTurns: frontmatter['max-turns'],\n allowedTools: Array.isArray(frontmatter['allowed-tools'])\n ? frontmatter['allowed-tools']\n : undefined,\n disallowedTools: Array.isArray(frontmatter['disallowed-tools'])\n ? frontmatter['disallowed-tools']\n : undefined,\n permissionMode: frontmatter['permission-mode'],\n mcpServers,\n skillsContent: skillsContent || undefined,\n enabled: metaRecord.enabled !== 'false',\n };\n}\n\n/**\n * Resolve skill URIs to concatenated prompt content.\n *\n * Skills can be:\n * - Absolute: /skills/drizzle-solid → fetch /skills/drizzle-solid/SKILL.md\n * - Relative: ./skills/custom → fetch /agents/{agentId}/skills/custom/SKILL.md\n */\nasync function resolveSkills(\n skillRefs: string[],\n podBaseUrl: string,\n agentId: string,\n authenticatedFetch: typeof fetch,\n): Promise<string> {\n if (skillRefs.length === 0) return '';\n\n const parts: string[] = [];\n\n for (const ref of skillRefs) {\n const skillPath = ref.startsWith('./')\n ? `/agents/${agentId}/${ref.slice(2)}/SKILL.md`\n : `${ref}/SKILL.md`;\n\n const url = new URL(skillPath, podBaseUrl).href;\n try {\n const res = await authenticatedFetch(url);\n if (res.ok) {\n const content = await res.text();\n // Parse SKILL.md — extract body (skip frontmatter)\n const { body } = parseAgentMd(content);\n if (body) {\n parts.push(body);\n }\n } else {\n logger.warn(`Skill not found: ${ref} (${res.status})`);\n }\n } catch (err) {\n logger.warn(`Failed to fetch skill ${ref}:`, err);\n }\n }\n\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/**\n * Convert AGENT.md MCP server definitions to McpServerConfig map.\n */\nfunction convertMcpServers(\n defs: AgentMcpServerDef[],\n): Record<string, McpServerConfig> {\n const result: Record<string, McpServerConfig> = {};\n\n for (const def of defs) {\n const config: McpServerConfig = {};\n\n if (def.transport) {\n config.type = def.transport;\n } else if (def.command) {\n config.type = 'stdio';\n } else if (def.url) {\n config.type = 'sse';\n }\n\n if (def.command) config.command = def.command;\n if (def.args) config.args = def.args;\n if (def.env) config.env = def.env;\n if (def.url) config.url = def.url;\n if (def.headers) config.headers = def.headers;\n\n result[def.name] = config;\n }\n\n return result;\n}\n"]}
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
* - model 可以覆盖 provider 的 defaultModel
|
|
24
24
|
* - systemPrompt 是 Agent 的核心 prompt
|
|
25
25
|
*/
|
|
26
|
-
export declare const AgentConfig: import("drizzle-solid/dist/core/schema").PodTableWithColumns<import("drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
27
|
-
id: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
28
|
-
displayName: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
29
|
-
description: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
30
|
-
provider: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
|
-
model: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
32
|
-
systemPrompt: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
33
|
-
maxTurns: import("drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
34
|
-
timeout: import("drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
35
|
-
enabled: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
26
|
+
export declare const AgentConfig: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
27
|
+
id: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
28
|
+
displayName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
29
|
+
description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
30
|
+
provider: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
31
|
+
model: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
32
|
+
systemPrompt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
33
|
+
maxTurns: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
34
|
+
timeout: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
35
|
+
enabled: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
36
36
|
}>>;
|
|
37
37
|
/**
|
|
38
38
|
* AgentStatus - Agent 运行状态
|
|
@@ -47,12 +47,12 @@ export declare const AgentConfig: import("drizzle-solid/dist/core/schema").PodTa
|
|
|
47
47
|
* udfs:lastActivityAt "2026-01-10T10:05:00Z"^^xsd:dateTime ;
|
|
48
48
|
* udfs:currentTaskId "task-123" .
|
|
49
49
|
*/
|
|
50
|
-
export declare const AgentStatus: import("drizzle-solid/dist/core/schema").PodTableWithColumns<import("drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
51
|
-
id: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
52
|
-
agentId: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
53
|
-
status: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
54
|
-
startedAt: import("drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
55
|
-
lastActivityAt: import("drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
56
|
-
currentTaskId: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
57
|
-
errorMessage: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
50
|
+
export declare const AgentStatus: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
51
|
+
id: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
52
|
+
agentId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
53
|
+
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
54
|
+
startedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
55
|
+
lastActivityAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
56
|
+
currentTaskId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
57
|
+
errorMessage: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
58
58
|
}>>;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.AgentStatus = exports.AgentConfig = void 0;
|
|
11
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
11
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
12
12
|
const vocab_1 = require("../../vocab");
|
|
13
13
|
/**
|
|
14
14
|
* AgentConfig - Agent 配置
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../../../src/agents/schema/agent-config.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../../../src/agents/schema/agent-config.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,gEAAoF;AACpF,uCAAmD;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACU,QAAA,WAAW,GAAG,IAAA,wBAAQ,EACjC,aAAa,EACb;IACE,EAAE,EAAE,IAAA,sBAAM,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC7B,WAAW,EAAE,IAAA,sBAAM,EAAC,aAAa,CAAC;IAClC,WAAW,EAAE,IAAA,sBAAM,EAAC,aAAa,CAAC;IAClC,QAAQ,EAAE,IAAA,mBAAG,EAAC,UAAU,CAAC;IACzB,KAAK,EAAE,IAAA,mBAAG,EAAC,OAAO,CAAC;IACnB,YAAY,EAAE,IAAA,sBAAM,EAAC,cAAc,CAAC;IACpC,QAAQ,EAAE,IAAA,mBAAG,EAAC,UAAU,CAAC;IACzB,OAAO,EAAE,IAAA,mBAAG,EAAC,SAAS,CAAC;IACvB,OAAO,EAAE,IAAA,sBAAM,EAAC,SAAS,CAAC;CAC3B,EACD;IACE,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,YAAI,CAAC,WAAW;IACtB,SAAS,EAAE,sBAAc;IACzB,eAAe,EAAE,OAAO;CACzB,CACF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAG,IAAA,wBAAQ,EACjC,aAAa,EACb;IACE,EAAE,EAAE,IAAA,sBAAM,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC7B,OAAO,EAAE,IAAA,sBAAM,EAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,IAAA,sBAAM,EAAC,QAAQ,CAAC;IACxB,SAAS,EAAE,IAAA,wBAAQ,EAAC,WAAW,CAAC;IAChC,cAAc,EAAE,IAAA,wBAAQ,EAAC,gBAAgB,CAAC;IAC1C,aAAa,EAAE,IAAA,sBAAM,EAAC,eAAe,CAAC;IACtC,YAAY,EAAE,IAAA,sBAAM,EAAC,cAAc,CAAC;CACrC,EACD;IACE,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE,YAAI,CAAC,WAAW;IACtB,SAAS,EAAE,sBAAc;IACzB,eAAe,EAAE,OAAO;CACzB,CACF,CAAC","sourcesContent":["/**\n * Agent Config Schema - Pod RDF 表定义\n *\n * Agent 实例配置,指定使用哪个 Provider、system prompt 等\n *\n * 存储位置: /settings/ai/agents.ttl\n */\n\nimport { podTable, string, uri, int, datetime } from '@undefineds.co/drizzle-solid';\nimport { UDFS, UDFS_NAMESPACE } from '../../vocab';\n\n/**\n * AgentConfig - Agent 配置\n *\n * RDF 示例:\n * <#indexing> a udfs:AgentConfig ;\n * udfs:displayName \"Indexing Agent\" ;\n * udfs:description \"文档索引 Agent,帮助用户的文件变得可检索\" ;\n * udfs:provider </settings/ai/agent-providers.ttl#codebuddy> ;\n * udfs:model </settings/ai/models.ttl#glm-4.7> ;\n * udfs:systemPrompt \"你是 IndexAgent...\" ;\n * udfs:maxTurns \"20\" ;\n * udfs:enabled \"true\" .\n *\n * 说明:\n * - provider 指向 AgentProvider,决定用哪个 Executor\n * - model 可以覆盖 provider 的 defaultModel\n * - systemPrompt 是 Agent 的核心 prompt\n */\nexport const AgentConfig = podTable(\n 'AgentConfig',\n {\n id: string('id').primaryKey(),\n displayName: string('displayName'),\n description: string('description'),\n provider: uri('provider'),\n model: uri('model'),\n systemPrompt: string('systemPrompt'),\n maxTurns: int('maxTurns'),\n timeout: int('timeout'),\n enabled: string('enabled'),\n },\n {\n base: '/settings/ai/agents.ttl',\n type: UDFS.AgentConfig,\n namespace: UDFS_NAMESPACE,\n subjectTemplate: '#{id}',\n },\n);\n\n/**\n * AgentStatus - Agent 运行状态\n *\n * 存储位置: /settings/ai/agent-status.ttl\n *\n * RDF 示例:\n * <#indexing> a udfs:AgentStatus ;\n * udfs:agentId \"indexing\" ;\n * udfs:status \"running\" ;\n * udfs:startedAt \"2026-01-10T10:00:00Z\"^^xsd:dateTime ;\n * udfs:lastActivityAt \"2026-01-10T10:05:00Z\"^^xsd:dateTime ;\n * udfs:currentTaskId \"task-123\" .\n */\nexport const AgentStatus = podTable(\n 'AgentStatus',\n {\n id: string('id').primaryKey(),\n agentId: string('agentId'),\n status: string('status'),\n startedAt: datetime('startedAt'),\n lastActivityAt: datetime('lastActivityAt'),\n currentTaskId: string('currentTaskId'),\n errorMessage: string('errorMessage'),\n },\n {\n base: '/settings/ai/agent-status.ttl',\n type: UDFS.AgentStatus,\n namespace: UDFS_NAMESPACE,\n subjectTemplate: '#{id}',\n },\n);\n\n"]}
|
|
@@ -32,15 +32,15 @@ export declare enum ExecutorType {
|
|
|
32
32
|
* - executorType 指定使用哪个 SDK:codebuddy, gemini, claude, openai
|
|
33
33
|
* - defaultModel 是 URI 引用到 Model 实体
|
|
34
34
|
*/
|
|
35
|
-
export declare const AgentProvider: import("drizzle-solid/dist/core/schema").PodTableWithColumns<import("drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
36
|
-
id: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
37
|
-
displayName: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
38
|
-
executorType: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
39
|
-
baseUrl: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
40
|
-
defaultModel: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
41
|
-
enabled: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
35
|
+
export declare const AgentProvider: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
36
|
+
id: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
37
|
+
displayName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
38
|
+
executorType: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
39
|
+
baseUrl: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
40
|
+
defaultModel: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
41
|
+
enabled: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
42
42
|
}>>;
|
|
43
43
|
/**
|
|
44
44
|
* AgentProvider -> Model 关系定义
|
|
45
45
|
*/
|
|
46
|
-
export declare const AgentProviderRelations: Record<string, import("drizzle-solid").RelationDefinition>;
|
|
46
|
+
export declare const AgentProviderRelations: Record<string, import("@undefineds.co/drizzle-solid").RelationDefinition>;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.AgentProviderRelations = exports.AgentProvider = exports.ExecutorType = void 0;
|
|
9
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
9
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
10
10
|
const vocab_1 = require("../../vocab");
|
|
11
11
|
const model_1 = require("../../ai/schema/model");
|
|
12
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/agents/schema/tables.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/agents/schema/tables.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,gEAAgF;AAChF,uCAAmD;AACnD,iDAA8C;AAE9C;;GAEG;AACH,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,uCAAuB,CAAA;IACvB,iCAAiB,CAAA;IACjB,iCAAiB,CAAA;IACjB,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,aAAa,GAAG,IAAA,wBAAQ,EACnC,eAAe,EACf;IACE,EAAE,EAAE,IAAA,sBAAM,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC7B,WAAW,EAAE,IAAA,sBAAM,EAAC,aAAa,CAAC;IAClC,YAAY,EAAE,IAAA,sBAAM,EAAC,cAAc,CAAC;IACpC,OAAO,EAAE,IAAA,sBAAM,EAAC,SAAS,CAAC;IAC1B,YAAY,EAAE,IAAA,mBAAG,EAAC,cAAc,CAAC;IACjC,OAAO,EAAE,IAAA,sBAAM,EAAC,SAAS,CAAC;CAC3B,EACD;IACE,IAAI,EAAE,kCAAkC;IACxC,IAAI,EAAE,YAAI,CAAC,aAAa;IACxB,SAAS,EAAE,sBAAc;IACzB,eAAe,EAAE,OAAO;CACzB,CACF,CAAC;AAEF;;GAEG;AACU,QAAA,sBAAsB,GAAG,IAAA,yBAAS,EAAC,qBAAa,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,KAAK,EAAE,GAAG,CAAC,aAAK,EAAE;QAChB,MAAM,EAAE,CAAC,qBAAa,CAAC,YAAY,CAAC;QACpC,UAAU,EAAE,CAAC,aAAK,CAAC,EAAS,CAAC;KAC9B,CAAC;CACH,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Agent Schema - Pod RDF 表定义\n *\n * AgentProvider 继承 Provider,添加 executorType 属性\n */\n\nimport { podTable, string, uri, relations } from '@undefineds.co/drizzle-solid';\nimport { UDFS, UDFS_NAMESPACE } from '../../vocab';\nimport { Model } from '../../ai/schema/model';\n\n/**\n * 执行器类型(SDK 类型)\n */\nexport enum ExecutorType {\n CODEBUDDY = 'codebuddy',\n GEMINI = 'gemini',\n CLAUDE = 'claude',\n OPENAI = 'openai',\n}\n\n/**\n * AgentProvider - Agent 供应商配置\n *\n * 继承 Provider 类,添加 executorType 属性\n *\n * 存储位置: /settings/ai/agent-providers.ttl\n *\n * RDF 示例:\n * <#anthropic> a udfs:AgentProvider ;\n * udfs:displayName \"Anthropic Claude\" ;\n * udfs:executorType \"claude\" ;\n * udfs:baseUrl \"https://api.anthropic.com\" ;\n * udfs:defaultModel </settings/ai/models.ttl#claude-sonnet-4> ;\n * udfs:enabled \"true\" .\n *\n * 说明:\n * - AgentProvider 是 Provider 的子类\n * - executorType 指定使用哪个 SDK:codebuddy, gemini, claude, openai\n * - defaultModel 是 URI 引用到 Model 实体\n */\nexport const AgentProvider = podTable(\n 'AgentProvider',\n {\n id: string('id').primaryKey(),\n displayName: string('displayName'),\n executorType: string('executorType'),\n baseUrl: string('baseUrl'),\n defaultModel: uri('defaultModel'),\n enabled: string('enabled'),\n },\n {\n base: '/settings/ai/agent-providers.ttl',\n type: UDFS.AgentProvider,\n namespace: UDFS_NAMESPACE,\n subjectTemplate: '#{id}',\n },\n);\n\n/**\n * AgentProvider -> Model 关系定义\n */\nexport const AgentProviderRelations = relations(AgentProvider, ({ one }) => ({\n model: one(Model, {\n fields: [AgentProvider.defaultModel],\n references: [Model.id as any],\n }),\n}));\n\n"]}
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
* - 更换模型时触发迁移,migrationStatus 变为 in_progress
|
|
16
16
|
* - previousModel 记录迁移前的模型,用于双读策略
|
|
17
17
|
*/
|
|
18
|
-
export declare const AIConfig: import("drizzle-solid/dist/core/schema").PodTableWithColumns<import("drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
19
|
-
id: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
20
|
-
embeddingModel: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
21
|
-
previousModel: import("drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
22
|
-
migrationStatus: import("drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
23
|
-
migrationProgress: import("drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
24
|
-
updatedAt: import("drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
18
|
+
export declare const AIConfig: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
19
|
+
id: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
|
|
20
|
+
embeddingModel: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
21
|
+
previousModel: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
22
|
+
migrationStatus: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
23
|
+
migrationProgress: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"integer", null, false, false>;
|
|
24
|
+
updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
25
25
|
}>>;
|
|
26
26
|
export type AIConfigRow = typeof AIConfig.$inferSelect;
|
|
27
27
|
export type AIConfigInsert = typeof AIConfig.$inferInsert;
|
package/dist/ai/schema/config.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
20
|
exports.AIConfig = void 0;
|
|
21
|
-
const drizzle_solid_1 = require("drizzle-solid");
|
|
21
|
+
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
22
22
|
const vocab_1 = require("../../vocab");
|
|
23
23
|
exports.AIConfig = (0, drizzle_solid_1.podTable)('AIConfig', {
|
|
24
24
|
id: (0, drizzle_solid_1.string)('id').primaryKey(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/ai/schema/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/ai/schema/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAEH,gEAAoF;AACpF,uCAAmD;AAEtC,QAAA,QAAQ,GAAG,IAAA,wBAAQ,EAC9B,UAAU,EACV;IACE,EAAE,EAAE,IAAA,sBAAM,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC7B,cAAc,EAAE,IAAA,mBAAG,EAAC,gBAAgB,CAAC;IACrC,aAAa,EAAE,IAAA,mBAAG,EAAC,eAAe,CAAC;IACnC,eAAe,EAAE,IAAA,sBAAM,EAAC,iBAAiB,CAAC;IAC1C,iBAAiB,EAAE,IAAA,mBAAG,EAAC,mBAAmB,CAAC;IAC3C,SAAS,EAAE,IAAA,wBAAQ,EAAC,WAAW,CAAC;CACjC,EACD;IACE,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,YAAI,CAAC,QAAQ;IACnB,SAAS,EAAE,sBAAc;IACzB,eAAe,EAAE,OAAO;CACzB,CACF,CAAC","sourcesContent":["/**\n * AIConfig Schema - Pod 级别的 AI 配置(单例)\n *\n * 存储位置: /settings/ai/config.ttl\n *\n * RDF 示例:\n * <#config> a udfs:AIConfig ;\n * udfs:embeddingModel </settings/ai/models.ttl#text-embedding-004> ;\n * udfs:migrationStatus \"idle\" ;\n * udfs:previousModel </settings/ai/models.ttl#text-embedding-003> ;\n * udfs:updatedAt \"2024-01-15T10:30:00Z\"^^xsd:dateTime .\n *\n * 说明:\n * - 全 Pod 只有一个 embedding 模型配置\n * - 更换模型时触发迁移,migrationStatus 变为 in_progress\n * - previousModel 记录迁移前的模型,用于双读策略\n */\n\nimport { podTable, string, int, datetime, uri } from '@undefineds.co/drizzle-solid';\nimport { UDFS, UDFS_NAMESPACE } from '../../vocab';\n\nexport const AIConfig = podTable(\n 'AIConfig',\n {\n id: string('id').primaryKey(),\n embeddingModel: uri('embeddingModel'),\n previousModel: uri('previousModel'),\n migrationStatus: string('migrationStatus'),\n migrationProgress: int('migrationProgress'),\n updatedAt: datetime('updatedAt'),\n },\n {\n base: '/settings/ai/config.ttl',\n type: UDFS.AIConfig,\n namespace: UDFS_NAMESPACE,\n subjectTemplate: '#{id}',\n },\n);\n\nexport type AIConfigRow = typeof AIConfig.$inferSelect;\nexport type AIConfigInsert = typeof AIConfig.$inferInsert;\n"]}
|