@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
|
@@ -1,320 +1,257 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.configCommand = void 0;
|
|
3
|
+
exports.configCommand = exports.PROVIDER_BASE_URLS = exports.UDFS_NS = void 0;
|
|
4
|
+
exports.maskSecret = maskSecret;
|
|
5
|
+
exports.credentialId = credentialId;
|
|
6
|
+
exports.buildProviderSparql = buildProviderSparql;
|
|
7
|
+
exports.buildCredentialSparql = buildCredentialSparql;
|
|
8
|
+
exports.buildResetSparql = buildResetSparql;
|
|
9
|
+
const credentials_store_1 = require("../lib/credentials-store");
|
|
10
|
+
const solid_auth_1 = require("../lib/solid-auth");
|
|
27
11
|
/**
|
|
28
|
-
* Config
|
|
12
|
+
* Config 子命令:配置 SecretaryAI 使用的 AI 服务。
|
|
29
13
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
14
|
+
* 写入 Pod 的两个资源,与服务端 PodChatKitStore.getAiConfig() 对齐:
|
|
15
|
+
* /settings/ai/providers.ttl#{provider} — Provider (baseUrl, displayName)
|
|
16
|
+
* /settings/credentials.ttl#cred-{provider} — Credential (apiKey, service=ai, status=active, provider link)
|
|
32
17
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
18
|
+
* 用法:
|
|
19
|
+
* xpod config set --provider openai --model gpt-4o --api-key sk-xxx
|
|
20
|
+
* xpod config set --api-key sk-new-key # 更新已有 provider 的 key
|
|
21
|
+
* xpod config show
|
|
22
|
+
* xpod config reset
|
|
36
23
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
exports.UDFS_NS = 'https://undefineds.co/ns#';
|
|
25
|
+
/** provider name → default baseUrl */
|
|
26
|
+
exports.PROVIDER_BASE_URLS = {
|
|
27
|
+
openai: 'https://api.openai.com/v1',
|
|
28
|
+
google: 'https://generativelanguage.googleapis.com/v1beta/openai',
|
|
29
|
+
anthropic: 'https://api.anthropic.com/v1',
|
|
30
|
+
deepseek: 'https://api.deepseek.com/v1',
|
|
31
|
+
openrouter: 'https://openrouter.ai/api/v1',
|
|
32
|
+
ollama: 'http://localhost:11434/v1',
|
|
33
|
+
mistral: 'https://api.mistral.ai/v1',
|
|
34
|
+
cohere: 'https://api.cohere.ai/v1',
|
|
35
|
+
zhipu: 'https://open.bigmodel.cn/api/paas/v4',
|
|
45
36
|
};
|
|
46
|
-
function parseConfigKey(key) {
|
|
47
|
-
// e.g. ai.openai.api-key → service=ai, provider=openai, field=apiKey
|
|
48
|
-
const parts = key.split('.');
|
|
49
|
-
if (parts.length < 3)
|
|
50
|
-
return null;
|
|
51
|
-
const [service, provider, ...rest] = parts;
|
|
52
|
-
const fieldKey = rest.join('.');
|
|
53
|
-
const field = FIELD_MAP[fieldKey];
|
|
54
|
-
if (!field)
|
|
55
|
-
return null;
|
|
56
|
-
return { service, provider, field };
|
|
57
|
-
}
|
|
58
37
|
function maskSecret(value) {
|
|
59
38
|
if (value.length <= 8)
|
|
60
39
|
return '****';
|
|
61
40
|
return value.slice(0, 4) + '****' + value.slice(-4);
|
|
62
41
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
42
|
+
function credentialId(provider) {
|
|
43
|
+
return `cred-${provider.toLowerCase()}`;
|
|
44
|
+
}
|
|
45
|
+
async function resolveAuth(argv) {
|
|
46
|
+
const creds = (0, credentials_store_1.loadCredentials)();
|
|
47
|
+
if (!creds) {
|
|
48
|
+
console.error('No credentials found. Run `xpod auth create-credentials` first.');
|
|
68
49
|
process.exit(1);
|
|
69
50
|
}
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
51
|
+
const baseUrl = (argv.url ?? creds.url).replace(/\/?$/, '/');
|
|
52
|
+
const tokenResult = await (0, solid_auth_1.getAccessToken)(creds.clientId, creds.clientSecret, baseUrl);
|
|
53
|
+
if (!tokenResult) {
|
|
54
|
+
console.error('Failed to obtain access token. Credentials may be expired — run `xpod auth create-credentials` again.');
|
|
73
55
|
process.exit(1);
|
|
74
56
|
}
|
|
75
|
-
|
|
57
|
+
const webIdUrl = new URL(creds.webId);
|
|
58
|
+
const pathParts = webIdUrl.pathname.split('/').filter(Boolean);
|
|
59
|
+
const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;
|
|
60
|
+
return { accessToken: tokenResult.accessToken, podUrl };
|
|
76
61
|
}
|
|
77
62
|
/**
|
|
78
|
-
*
|
|
79
|
-
* Uses the /v1/pod/sparql endpoint which proxies SPARQL queries to the Pod.
|
|
63
|
+
* Build SPARQL UPDATE to upsert a Provider at /settings/ai/providers.ttl#{id}
|
|
80
64
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (Array.isArray(data))
|
|
113
|
-
return data;
|
|
114
|
-
return [];
|
|
65
|
+
function buildProviderSparql(resourceUrl, providerId) {
|
|
66
|
+
const baseUrl = exports.PROVIDER_BASE_URLS[providerId.toLowerCase()];
|
|
67
|
+
const displayName = providerId.charAt(0).toUpperCase() + providerId.slice(1);
|
|
68
|
+
const subject = `<${resourceUrl}#${providerId}>`;
|
|
69
|
+
return `PREFIX udfs: <${exports.UDFS_NS}>
|
|
70
|
+
DELETE { ${subject} udfs:baseUrl ?oldBase . ${subject} udfs:displayName ?oldName }
|
|
71
|
+
INSERT { ${subject} a udfs:Provider ; udfs:displayName "${displayName}"${baseUrl ? ` ; udfs:baseUrl "${baseUrl}"` : ''} }
|
|
72
|
+
WHERE { OPTIONAL { ${subject} udfs:baseUrl ?oldBase } OPTIONAL { ${subject} udfs:displayName ?oldName } }`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Build SPARQL UPDATE to upsert a Credential at /settings/credentials.ttl#cred-{provider}
|
|
76
|
+
*/
|
|
77
|
+
function buildCredentialSparql(resourceUrl, podUrl, provider, fields) {
|
|
78
|
+
const credId = credentialId(provider);
|
|
79
|
+
const subject = `<${resourceUrl}#${credId}>`;
|
|
80
|
+
const providerUri = `<${podUrl}settings/ai/providers.ttl#${provider}>`;
|
|
81
|
+
const deletes = [];
|
|
82
|
+
const inserts = [
|
|
83
|
+
`${subject} a udfs:Credential`,
|
|
84
|
+
`udfs:service "ai"`,
|
|
85
|
+
`udfs:status "active"`,
|
|
86
|
+
`udfs:provider ${providerUri}`,
|
|
87
|
+
];
|
|
88
|
+
const optionals = [];
|
|
89
|
+
// Always delete+reinsert provider link
|
|
90
|
+
deletes.push(`${subject} udfs:provider ?oldProv .`);
|
|
91
|
+
optionals.push(`OPTIONAL { ${subject} udfs:provider ?oldProv }`);
|
|
92
|
+
if (fields.apiKey) {
|
|
93
|
+
deletes.push(`${subject} udfs:apiKey ?oldKey .`);
|
|
94
|
+
optionals.push(`OPTIONAL { ${subject} udfs:apiKey ?oldKey }`);
|
|
95
|
+
inserts.push(`udfs:apiKey "${fields.apiKey}"`);
|
|
115
96
|
}
|
|
116
|
-
|
|
117
|
-
|
|
97
|
+
if (fields.model) {
|
|
98
|
+
deletes.push(`${subject} udfs:defaultModel ?oldModel .`);
|
|
99
|
+
optionals.push(`OPTIONAL { ${subject} udfs:defaultModel ?oldModel }`);
|
|
100
|
+
inserts.push(`udfs:defaultModel "${fields.model}"`);
|
|
118
101
|
}
|
|
102
|
+
return `PREFIX udfs: <${exports.UDFS_NS}>
|
|
103
|
+
DELETE { ${deletes.join(' ')} }
|
|
104
|
+
INSERT { ${inserts.join(' ;\n ')} }
|
|
105
|
+
WHERE { ${optionals.join(' ')} }`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Build SPARQL UPDATE to delete a Credential
|
|
109
|
+
*/
|
|
110
|
+
function buildResetSparql(resourceUrl, provider) {
|
|
111
|
+
const credId = credentialId(provider);
|
|
112
|
+
const subject = `<${resourceUrl}#${credId}>`;
|
|
113
|
+
return `PREFIX udfs: <${exports.UDFS_NS}>\nDELETE WHERE { ${subject} ?p ?o }`;
|
|
114
|
+
}
|
|
115
|
+
async function writeProvider(podUrl, accessToken, providerId) {
|
|
116
|
+
const resource = `${podUrl}settings/ai/providers.ttl`;
|
|
117
|
+
const sparql = buildProviderSparql(resource, providerId);
|
|
118
|
+
const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
|
|
119
|
+
method: 'PATCH',
|
|
120
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
121
|
+
body: sparql,
|
|
122
|
+
});
|
|
123
|
+
return res.ok;
|
|
124
|
+
}
|
|
125
|
+
async function writeCredential(podUrl, accessToken, provider, fields) {
|
|
126
|
+
const resource = `${podUrl}settings/credentials.ttl`;
|
|
127
|
+
const sparql = buildCredentialSparql(resource, podUrl, provider, fields);
|
|
128
|
+
const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
|
|
129
|
+
method: 'PATCH',
|
|
130
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
131
|
+
body: sparql,
|
|
132
|
+
});
|
|
133
|
+
return res.ok;
|
|
119
134
|
}
|
|
120
135
|
const setCommand = {
|
|
121
|
-
command: 'set
|
|
122
|
-
describe: '
|
|
136
|
+
command: 'set',
|
|
137
|
+
describe: 'Configure SecretaryAI (provider, model, api-key — one or more)',
|
|
123
138
|
builder: (yargs) => yargs
|
|
124
|
-
.
|
|
125
|
-
.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (!
|
|
129
|
-
|
|
130
|
-
console.error('Format: <service>.<provider>.<field>');
|
|
131
|
-
console.error('Fields: api-key, base-url, proxy-url, project-id, organization-id, label');
|
|
132
|
-
process.exit(1);
|
|
139
|
+
.option('provider', { type: 'string', description: `AI provider (${Object.keys(exports.PROVIDER_BASE_URLS).join(', ')})` })
|
|
140
|
+
.option('model', { type: 'string', description: 'Default model name' })
|
|
141
|
+
.option('api-key', { type: 'string', description: 'API key' })
|
|
142
|
+
.check((argv) => {
|
|
143
|
+
if (!argv.provider && !argv.model && !argv['api-key']) {
|
|
144
|
+
throw new Error('Specify at least one of --provider, --model, or --api-key');
|
|
133
145
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
// Get account info to find pod URL
|
|
137
|
-
const accountRes = await fetch(`${baseUrl}.account/`, {
|
|
138
|
-
headers: {
|
|
139
|
-
Accept: 'application/json',
|
|
140
|
-
Authorization: `CSS-Account-Token ${token}`,
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
if (!accountRes.ok) {
|
|
144
|
-
console.error('Failed to get account info.');
|
|
145
|
-
process.exit(1);
|
|
146
|
+
if ((argv.model || argv['api-key']) && !argv.provider) {
|
|
147
|
+
throw new Error('--provider is required when setting --model or --api-key');
|
|
146
148
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
return true;
|
|
150
|
+
}),
|
|
151
|
+
handler: async (argv) => {
|
|
152
|
+
const { accessToken, podUrl } = await resolveAuth(argv);
|
|
153
|
+
const provider = argv.provider;
|
|
154
|
+
// Write provider
|
|
155
|
+
const provOk = await writeProvider(podUrl, accessToken, provider);
|
|
156
|
+
if (!provOk) {
|
|
157
|
+
console.error('Failed to write provider config.');
|
|
152
158
|
process.exit(1);
|
|
153
159
|
}
|
|
154
|
-
//
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const sparql = `
|
|
159
|
-
PREFIX udfs: <${ns}>
|
|
160
|
-
DELETE { ${subject} udfs:${parsed.field} ?old }
|
|
161
|
-
INSERT { ${subject} a udfs:Credential ;
|
|
162
|
-
udfs:service "${parsed.service}" ;
|
|
163
|
-
udfs:${parsed.field} "${argv.value}" }
|
|
164
|
-
WHERE { OPTIONAL { ${subject} udfs:${parsed.field} ?old } }
|
|
165
|
-
`.trim();
|
|
166
|
-
const patchUrl = `${podUrl}settings/credentials.ttl`;
|
|
167
|
-
const patchRes = await fetch(patchUrl, {
|
|
168
|
-
method: 'PATCH',
|
|
169
|
-
headers: {
|
|
170
|
-
'Content-Type': 'application/sparql-update',
|
|
171
|
-
Authorization: `CSS-Account-Token ${token}`,
|
|
172
|
-
},
|
|
173
|
-
body: sparql,
|
|
160
|
+
// Write credential
|
|
161
|
+
const credOk = await writeCredential(podUrl, accessToken, provider, {
|
|
162
|
+
apiKey: argv['api-key'],
|
|
163
|
+
model: argv.model,
|
|
174
164
|
});
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
const display = isSensitive ? maskSecret(argv.value) : argv.value;
|
|
178
|
-
console.log(`Set ${argv.key} = ${display}`);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
const text = await patchRes.text();
|
|
182
|
-
console.error(`Failed to set config: ${patchRes.status} ${text.slice(0, 200)}`);
|
|
165
|
+
if (!credOk) {
|
|
166
|
+
console.error('Failed to write credential config.');
|
|
183
167
|
process.exit(1);
|
|
184
168
|
}
|
|
169
|
+
console.log(` provider: ${provider}`);
|
|
170
|
+
if (argv.model)
|
|
171
|
+
console.log(` model: ${argv.model}`);
|
|
172
|
+
if (argv['api-key'])
|
|
173
|
+
console.log(` api-key: ${maskSecret(argv['api-key'])}`);
|
|
174
|
+
console.log('SecretaryAI config saved.');
|
|
185
175
|
},
|
|
186
176
|
};
|
|
187
|
-
const
|
|
188
|
-
command: '
|
|
189
|
-
describe: '
|
|
190
|
-
builder: (yargs) => yargs
|
|
191
|
-
.positional('key', { type: 'string', demandOption: true, description: 'Config key prefix (e.g. ai)' }),
|
|
177
|
+
const showCommand = {
|
|
178
|
+
command: 'show',
|
|
179
|
+
describe: 'Show current SecretaryAI config',
|
|
180
|
+
builder: (yargs) => yargs,
|
|
192
181
|
handler: async (argv) => {
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
console.log('No credentials configured.');
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
// Filter by key prefix
|
|
201
|
-
const prefix = argv.key.toLowerCase();
|
|
202
|
-
const filtered = creds.filter((c) => {
|
|
203
|
-
const service = (c.service ?? '').toLowerCase();
|
|
204
|
-
return service.startsWith(prefix) || prefix === 'all';
|
|
182
|
+
const { accessToken, podUrl } = await resolveAuth(argv);
|
|
183
|
+
const resource = `${podUrl}settings/credentials.ttl`;
|
|
184
|
+
const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
|
|
185
|
+
headers: { Accept: 'text/turtle' },
|
|
205
186
|
});
|
|
206
|
-
if (
|
|
207
|
-
console.log(
|
|
187
|
+
if (!res.ok) {
|
|
188
|
+
console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');
|
|
208
189
|
return;
|
|
209
190
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
const token = await getAuthToken(argv.email, argv.password, baseUrl);
|
|
228
|
-
const creds = await readCredentials(baseUrl, token);
|
|
229
|
-
if (creds.length === 0) {
|
|
230
|
-
console.log('No credentials configured.');
|
|
231
|
-
return;
|
|
191
|
+
const turtle = await res.text();
|
|
192
|
+
// Parse simple triples from turtle to find AI credentials
|
|
193
|
+
const credBlocks = turtle.split(/(?=<[^>]*#cred-)/);
|
|
194
|
+
let found = false;
|
|
195
|
+
for (const block of credBlocks) {
|
|
196
|
+
if (!block.includes('service') || !block.includes('"ai"'))
|
|
197
|
+
continue;
|
|
198
|
+
found = true;
|
|
199
|
+
const providerMatch = block.match(/providers\.ttl#(\w+)/);
|
|
200
|
+
const apiKeyMatch = block.match(/apiKey\s+"([^"]+)"/);
|
|
201
|
+
const modelMatch = block.match(/defaultModel\s+"([^"]+)"/);
|
|
202
|
+
if (providerMatch)
|
|
203
|
+
console.log(` provider: ${providerMatch[1]}`);
|
|
204
|
+
if (modelMatch)
|
|
205
|
+
console.log(` model: ${modelMatch[1]}`);
|
|
206
|
+
if (apiKeyMatch)
|
|
207
|
+
console.log(` api-key: ${maskSecret(apiKeyMatch[1])}`);
|
|
232
208
|
}
|
|
233
|
-
|
|
234
|
-
console.log(
|
|
235
|
-
if (c.apiKey)
|
|
236
|
-
console.log(` api-key: ${maskSecret(c.apiKey)}`);
|
|
237
|
-
if (c.baseUrl)
|
|
238
|
-
console.log(` base-url: ${c.baseUrl}`);
|
|
239
|
-
if (c.proxyUrl)
|
|
240
|
-
console.log(` proxy: ${c.proxyUrl}`);
|
|
241
|
-
console.log();
|
|
209
|
+
if (!found) {
|
|
210
|
+
console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');
|
|
242
211
|
}
|
|
243
212
|
},
|
|
244
213
|
};
|
|
245
|
-
const
|
|
246
|
-
command: '
|
|
247
|
-
describe: 'Remove
|
|
248
|
-
builder: (yargs) => yargs
|
|
249
|
-
|
|
214
|
+
const resetCommand = {
|
|
215
|
+
command: 'reset',
|
|
216
|
+
describe: 'Remove SecretaryAI config',
|
|
217
|
+
builder: (yargs) => yargs.option('provider', {
|
|
218
|
+
type: 'string',
|
|
219
|
+
description: 'Provider to remove',
|
|
220
|
+
demandOption: true,
|
|
221
|
+
}),
|
|
250
222
|
handler: async (argv) => {
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const [, provider] = parts;
|
|
257
|
-
const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;
|
|
258
|
-
const token = await getAuthToken(argv.email, argv.password, baseUrl);
|
|
259
|
-
// Get pod URL
|
|
260
|
-
const accountRes = await fetch(`${baseUrl}.account/`, {
|
|
261
|
-
headers: {
|
|
262
|
-
Accept: 'application/json',
|
|
263
|
-
Authorization: `CSS-Account-Token ${token}`,
|
|
264
|
-
},
|
|
265
|
-
});
|
|
266
|
-
if (!accountRes.ok) {
|
|
267
|
-
console.error('Failed to get account info.');
|
|
268
|
-
process.exit(1);
|
|
269
|
-
}
|
|
270
|
-
const accountData = (await accountRes.json());
|
|
271
|
-
const pods = accountData.pods;
|
|
272
|
-
const podUrl = pods ? Object.values(pods)[0] : undefined;
|
|
273
|
-
if (!podUrl) {
|
|
274
|
-
console.error('No pod found for this account.');
|
|
275
|
-
process.exit(1);
|
|
276
|
-
}
|
|
277
|
-
const credId = `cred-${provider}`;
|
|
278
|
-
const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;
|
|
279
|
-
const sparql = `DELETE WHERE { ${subject} ?p ?o }`;
|
|
280
|
-
const patchUrl = `${podUrl}settings/credentials.ttl`;
|
|
281
|
-
const patchRes = await fetch(patchUrl, {
|
|
223
|
+
const { accessToken, podUrl } = await resolveAuth(argv);
|
|
224
|
+
const provider = argv.provider;
|
|
225
|
+
const resource = `${podUrl}settings/credentials.ttl`;
|
|
226
|
+
const sparql = buildResetSparql(resource, provider);
|
|
227
|
+
const res = await (0, solid_auth_1.authenticatedFetch)(resource, accessToken, {
|
|
282
228
|
method: 'PATCH',
|
|
283
|
-
headers: {
|
|
284
|
-
'Content-Type': 'application/sparql-update',
|
|
285
|
-
Authorization: `CSS-Account-Token ${token}`,
|
|
286
|
-
},
|
|
229
|
+
headers: { 'Content-Type': 'application/sparql-update' },
|
|
287
230
|
body: sparql,
|
|
288
231
|
});
|
|
289
|
-
if (
|
|
290
|
-
console.log(`
|
|
232
|
+
if (res.ok) {
|
|
233
|
+
console.log(`SecretaryAI config for ${provider} removed.`);
|
|
291
234
|
}
|
|
292
235
|
else {
|
|
293
|
-
const text = await
|
|
294
|
-
console.error(`Failed to
|
|
236
|
+
const text = await res.text();
|
|
237
|
+
console.error(`Failed to reset config: ${res.status} ${text.slice(0, 200)}`);
|
|
295
238
|
process.exit(1);
|
|
296
239
|
}
|
|
297
240
|
},
|
|
298
241
|
};
|
|
299
242
|
exports.configCommand = {
|
|
300
243
|
command: 'config',
|
|
301
|
-
describe: '
|
|
244
|
+
describe: 'SecretaryAI configuration (provider, model, api-key)',
|
|
302
245
|
builder: (yargs) => yargs
|
|
303
246
|
.option('url', {
|
|
304
247
|
alias: 'u',
|
|
305
248
|
type: 'string',
|
|
306
|
-
description: 'Server base URL',
|
|
307
|
-
default: process.env.CSS_BASE_URL || 'http://localhost:3000',
|
|
249
|
+
description: 'Server base URL (default: from ~/.xpod/)',
|
|
308
250
|
})
|
|
309
|
-
.option('email', { type: 'string', demandOption: true, description: 'Account email' })
|
|
310
|
-
.option('password', { type: 'string', demandOption: true, description: 'Account password' })
|
|
311
251
|
.command(setCommand)
|
|
312
|
-
.command(
|
|
313
|
-
.command(
|
|
314
|
-
.command(unsetCommand)
|
|
252
|
+
.command(showCommand)
|
|
253
|
+
.command(resetCommand)
|
|
315
254
|
.demandCommand(1, 'Please specify a config subcommand'),
|
|
316
|
-
handler: () => {
|
|
317
|
-
// parent command, no-op
|
|
318
|
-
},
|
|
255
|
+
handler: () => { },
|
|
319
256
|
};
|
|
320
257
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\n\ninterface ConfigArgs {\n url: string;\n email: string;\n password: string;\n}\n\ninterface SetArgs extends ConfigArgs {\n key: string;\n value: string;\n}\n\ninterface GetArgs extends ConfigArgs {\n key: string;\n}\n\ninterface UnsetArgs extends ConfigArgs {\n key: string;\n}\n\n/**\n * Config 子命令通过 Solid 协议读写 Pod 内的配置。\n *\n * 当前实现使用 CSS Account Token + 内部 API 代理来操作 Pod 数据。\n * 后续 PR 可切换为 DPoP token + 直接 Solid 协议访问。\n *\n * 配置路径映射:\n * ai.openai.api-key → /settings/credentials.ttl 中 service=ai, provider 含 openai 的 apiKey 字段\n * ai.openai.base-url → 同上的 baseUrl 字段\n */\n\n// Key path → credential field mapping\nconst FIELD_MAP: Record<string, string> = {\n 'api-key': 'apiKey',\n 'base-url': 'baseUrl',\n 'proxy-url': 'proxyUrl',\n 'project-id': 'projectId',\n 'organization-id': 'organizationId',\n 'label': 'label',\n};\n\nfunction parseConfigKey(key: string): { service: string; provider: string; field: string } | null {\n // e.g. ai.openai.api-key → service=ai, provider=openai, field=apiKey\n const parts = key.split('.');\n if (parts.length < 3) return null;\n const [service, provider, ...rest] = parts;\n const fieldKey = rest.join('.');\n const field = FIELD_MAP[fieldKey];\n if (!field) return null;\n return { service, provider, field };\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nasync function getAuthToken(email: string, password: string, baseUrl: string): Promise<string> {\n const { login } = await import('../lib/css-account');\n const { checkServer } = await import('../lib/css-account');\n\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n return token;\n}\n\n/**\n * Read credentials from Pod via SPARQL through the API server.\n * Uses the /v1/pod/sparql endpoint which proxies SPARQL queries to the Pod.\n */\nasync function readCredentials(\n baseUrl: string,\n token: string,\n): Promise<Array<Record<string, string>>> {\n // Use the CSS account token to read the credentials resource directly\n const credUrl = `${baseUrl}.account/`;\n const accountRes = await fetch(credUrl, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) return [];\n\n const accountData = (await accountRes.json()) as { webIds?: Record<string, string>; pods?: Record<string, string> };\n const pods = accountData.pods;\n if (!pods || typeof pods !== 'object') return [];\n\n // Get the first pod URL\n const podUrl = Object.values(pods)[0];\n if (!podUrl) return [];\n\n // Read the credentials.ttl resource from the pod\n const settingsUrl = `${podUrl}settings/credentials.ttl`;\n const res = await fetch(settingsUrl, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!res.ok) return [];\n\n try {\n const data = await res.json();\n if (Array.isArray(data)) return data as Array<Record<string, string>>;\n return [];\n } catch {\n return [];\n }\n}\n\nconst setCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'set <key> <value>',\n describe: 'Set a Pod configuration value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key (e.g. ai.openai.api-key)' })\n .positional('value', { type: 'string', demandOption: true, description: 'Config value' }),\n handler: async (argv) => {\n const parsed = parseConfigKey(argv.key);\n if (!parsed) {\n console.error(`Invalid config key: ${argv.key}`);\n console.error('Format: <service>.<provider>.<field>');\n console.error('Fields: api-key, base-url, proxy-url, project-id, organization-id, label');\n process.exit(1);\n }\n\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n\n // Get account info to find pod URL\n const accountRes = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const accountData = (await accountRes.json()) as { pods?: Record<string, string> };\n const pods = accountData.pods;\n const podUrl = pods ? Object.values(pods)[0] : undefined;\n\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n // Build SPARQL UPDATE to insert/update the credential\n const credId = `cred-${parsed.provider}`;\n const ns = 'http://undefineds.co/ns/';\n const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;\n\n const sparql = `\nPREFIX udfs: <${ns}>\nDELETE { ${subject} udfs:${parsed.field} ?old }\nINSERT { ${subject} a udfs:Credential ;\n udfs:service \"${parsed.service}\" ;\n udfs:${parsed.field} \"${argv.value}\" }\nWHERE { OPTIONAL { ${subject} udfs:${parsed.field} ?old } }\n `.trim();\n\n const patchUrl = `${podUrl}settings/credentials.ttl`;\n const patchRes = await fetch(patchUrl, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/sparql-update',\n Authorization: `CSS-Account-Token ${token}`,\n },\n body: sparql,\n });\n\n if (patchRes.ok) {\n const isSensitive = parsed.field === 'apiKey';\n const display = isSensitive ? maskSecret(argv.value) : argv.value;\n console.log(`Set ${argv.key} = ${display}`);\n } else {\n const text = await patchRes.text();\n console.error(`Failed to set config: ${patchRes.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nconst getCommand: CommandModule<ConfigArgs, GetArgs> = {\n command: 'get <key>',\n describe: 'Get Pod configuration (masked for secrets)',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix (e.g. ai)' }),\n handler: async (argv) => {\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n const creds = await readCredentials(baseUrl, token);\n\n if (creds.length === 0) {\n console.log('No credentials configured.');\n return;\n }\n\n // Filter by key prefix\n const prefix = argv.key.toLowerCase();\n const filtered = creds.filter((c) => {\n const service = (c.service ?? '').toLowerCase();\n return service.startsWith(prefix) || prefix === 'all';\n });\n\n if (filtered.length === 0) {\n console.log(`No credentials matching \"${argv.key}\".`);\n return;\n }\n\n for (const c of filtered) {\n console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);\n if (c.apiKey) console.log(` api-key: ${maskSecret(c.apiKey)}`);\n if (c.baseUrl) console.log(` base-url: ${c.baseUrl}`);\n if (c.proxyUrl) console.log(` proxy: ${c.proxyUrl}`);\n }\n },\n};\n\nconst listConfigCommand: CommandModule<ConfigArgs, ConfigArgs> = {\n command: 'list',\n describe: 'List all Pod configurations',\n builder: (yargs) => yargs,\n handler: async (argv) => {\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n const creds = await readCredentials(baseUrl, token);\n\n if (creds.length === 0) {\n console.log('No credentials configured.');\n return;\n }\n\n for (const c of creds) {\n console.log(`[${c.service ?? 'unknown'}] ${c.label ?? c.id ?? 'unnamed'}`);\n if (c.apiKey) console.log(` api-key: ${maskSecret(c.apiKey)}`);\n if (c.baseUrl) console.log(` base-url: ${c.baseUrl}`);\n if (c.proxyUrl) console.log(` proxy: ${c.proxyUrl}`);\n console.log();\n }\n },\n};\n\nconst unsetCommand: CommandModule<ConfigArgs, UnsetArgs> = {\n command: 'unset <key>',\n describe: 'Remove a Pod configuration',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key prefix to remove (e.g. ai.openai)' }),\n handler: async (argv) => {\n const parts = argv.key.split('.');\n if (parts.length < 2) {\n console.error('Format: <service>.<provider>');\n process.exit(1);\n }\n\n const [, provider] = parts;\n const baseUrl = argv.url.endsWith('/') ? argv.url : `${argv.url}/`;\n const token = await getAuthToken(argv.email, argv.password, baseUrl);\n\n // Get pod URL\n const accountRes = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n\n if (!accountRes.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const accountData = (await accountRes.json()) as { pods?: Record<string, string> };\n const pods = accountData.pods;\n const podUrl = pods ? Object.values(pods)[0] : undefined;\n\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n const credId = `cred-${provider}`;\n const subject = `<${podUrl}settings/credentials.ttl#${credId}>`;\n\n const sparql = `DELETE WHERE { ${subject} ?p ?o }`;\n\n const patchUrl = `${podUrl}settings/credentials.ttl`;\n const patchRes = await fetch(patchUrl, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/sparql-update',\n Authorization: `CSS-Account-Token ${token}`,\n },\n body: sparql,\n });\n\n if (patchRes.ok) {\n console.log(`Removed config for ${argv.key}`);\n } else {\n const text = await patchRes.text();\n console.error(`Failed to unset config: ${patchRes.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nexport const configCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'Pod configuration management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n default: process.env.CSS_BASE_URL || 'http://localhost:3000',\n })\n .option('email', { type: 'string', demandOption: true, description: 'Account email' })\n .option('password', { type: 'string', demandOption: true, description: 'Account password' })\n .command(setCommand)\n .command(getCommand)\n .command(listConfigCommand)\n .command(unsetCommand)\n .demandCommand(1, 'Please specify a config subcommand'),\n handler: () => {\n // parent command, no-op\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":";;;AA2CA,gCAGC;AAED,oCAEC;AA2BD,kDASC;AAKD,sDAsCC;AAKD,4CAIC;AAzID,gEAA2D;AAC3D,kDAAuE;AAYvE;;;;;;;;;;;;GAYG;AAEU,QAAA,OAAO,GAAG,2BAA2B,CAAC;AAEnD,sCAAsC;AACzB,QAAA,kBAAkB,GAA2B;IACxD,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,yDAAyD;IACjE,SAAS,EAAE,8BAA8B;IACzC,QAAQ,EAAE,6BAA6B;IACvC,UAAU,EAAE,8BAA8B;IAC1C,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,2BAA2B;IACpC,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,sCAAsC;CAC9C,CAAC;AAEF,SAAgB,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAgB;IACzC,MAAM,KAAK,GAAG,IAAA,mCAAe,GAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAc,EAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAC;QACvH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAErD,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,WAAmB,EAAE,UAAkB;IACzE,MAAM,OAAO,GAAG,0BAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,WAAW,IAAI,UAAU,GAAG,CAAC;IAEjD,OAAO,iBAAiB,eAAO;WACtB,OAAO,4BAA4B,OAAO;WAC1C,OAAO,wCAAwC,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE;qBACjG,OAAO,uCAAuC,OAAO,gCAAgC,CAAC;AAC3G,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,WAAmB,EACnB,MAAc,EACd,QAAgB,EAChB,MAA2C;IAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,IAAI,MAAM,GAAG,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,MAAM,6BAA6B,QAAQ,GAAG,CAAC;IAEvE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa;QACxB,GAAG,OAAO,oBAAoB;QAC9B,mBAAmB;QACnB,sBAAsB;QACtB,iBAAiB,WAAW,EAAE;KAC/B,CAAC;IACF,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,uCAAuC;IACvC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,2BAA2B,CAAC,CAAC;IACpD,SAAS,CAAC,IAAI,CAAC,cAAc,OAAO,2BAA2B,CAAC,CAAC;IAEjE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,wBAAwB,CAAC,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,cAAc,OAAO,wBAAwB,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,gCAAgC,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,cAAc,OAAO,gCAAgC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,iBAAiB,eAAO;WACtB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;WACjB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;UACvB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,WAAmB,EAAE,QAAgB;IACpE,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,WAAW,IAAI,MAAM,GAAG,CAAC;IAC7C,OAAO,iBAAiB,eAAO,qBAAqB,OAAO,UAAU,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,WAAmB,EAAE,UAAkB;IAClF,MAAM,QAAQ,GAAG,GAAG,MAAM,2BAA2B,CAAC;IACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAkB,EAAC,QAAQ,EAAE,WAAW,EAAE;QAC1D,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE;QACxD,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,WAAmB,EACnB,QAAgB,EAChB,MAA2C;IAE3C,MAAM,QAAQ,GAAG,GAAG,MAAM,0BAA0B,CAAC;IACrD,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAkB,EAAC,QAAQ,EAAE,WAAW,EAAE;QAC1D,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE;QACxD,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,GAAuC;IACrD,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,gEAAgE;IAC1E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,MAAM,CAAC,IAAI,CAAC,0BAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SAClH,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;SACtE,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;SAC7D,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAS,CAAC;QAEhC,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE;YAClE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,MAAM,WAAW,GAA0C;IACzD,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,iCAAiC;IAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,GAAG,MAAM,0BAA0B,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAkB,EAAC,QAAQ,EAAE,WAAW,EAAE;YAC1D,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;YACnH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,0DAA0D;QAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YACpE,KAAK,GAAG,IAAI,CAAC;YAEb,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAE3D,IAAI,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,UAAU;gBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,YAAY,GAAuC;IACvD,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,2BAA2B;IACrC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oBAAoB;QACjC,YAAY,EAAE,IAAI;KACnB,CAAC;IACJ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAS,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,MAAM,0BAA0B,CAAC;QACrD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAkB,EAAC,QAAQ,EAAE,WAAW,EAAE;YAC1D,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE;YACxD,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,WAAW,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC;AAEW,QAAA,aAAa,GAAsC;IAC9D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,sDAAsD;IAChE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;KACxD,CAAC;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,OAAO,CAAC,WAAW,CAAC;SACpB,OAAO,CAAC,YAAY,CAAC;SACrB,aAAa,CAAC,CAAC,EAAE,oCAAoC,CAAC;IAC3D,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;CAClB,CAAC","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { loadCredentials } from '../lib/credentials-store';\nimport { getAccessToken, authenticatedFetch } from '../lib/solid-auth';\n\ninterface ConfigArgs {\n url?: string;\n}\n\ninterface SetArgs extends ConfigArgs {\n provider?: string;\n model?: string;\n 'api-key'?: string;\n}\n\n/**\n * Config 子命令:配置 SecretaryAI 使用的 AI 服务。\n *\n * 写入 Pod 的两个资源,与服务端 PodChatKitStore.getAiConfig() 对齐:\n * /settings/ai/providers.ttl#{provider} — Provider (baseUrl, displayName)\n * /settings/credentials.ttl#cred-{provider} — Credential (apiKey, service=ai, status=active, provider link)\n *\n * 用法:\n * xpod config set --provider openai --model gpt-4o --api-key sk-xxx\n * xpod config set --api-key sk-new-key # 更新已有 provider 的 key\n * xpod config show\n * xpod config reset\n */\n\nexport const UDFS_NS = 'https://undefineds.co/ns#';\n\n/** provider name → default baseUrl */\nexport const PROVIDER_BASE_URLS: Record<string, string> = {\n openai: 'https://api.openai.com/v1',\n google: 'https://generativelanguage.googleapis.com/v1beta/openai',\n anthropic: 'https://api.anthropic.com/v1',\n deepseek: 'https://api.deepseek.com/v1',\n openrouter: 'https://openrouter.ai/api/v1',\n ollama: 'http://localhost:11434/v1',\n mistral: 'https://api.mistral.ai/v1',\n cohere: 'https://api.cohere.ai/v1',\n zhipu: 'https://open.bigmodel.cn/api/paas/v4',\n};\n\nexport function maskSecret(value: string): string {\n if (value.length <= 8) return '****';\n return value.slice(0, 4) + '****' + value.slice(-4);\n}\n\nexport function credentialId(provider: string): string {\n return `cred-${provider.toLowerCase()}`;\n}\n\nasync function resolveAuth(argv: ConfigArgs): Promise<{ accessToken: string; podUrl: string }> {\n const creds = loadCredentials();\n if (!creds) {\n console.error('No credentials found. Run `xpod auth create-credentials` first.');\n process.exit(1);\n }\n\n const baseUrl = (argv.url ?? creds.url).replace(/\\/?$/, '/');\n\n const tokenResult = await getAccessToken(creds.clientId, creds.clientSecret, baseUrl);\n if (!tokenResult) {\n console.error('Failed to obtain access token. Credentials may be expired — run `xpod auth create-credentials` again.');\n process.exit(1);\n }\n\n const webIdUrl = new URL(creds.webId);\n const pathParts = webIdUrl.pathname.split('/').filter(Boolean);\n const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;\n\n return { accessToken: tokenResult.accessToken, podUrl };\n}\n\n/**\n * Build SPARQL UPDATE to upsert a Provider at /settings/ai/providers.ttl#{id}\n */\nexport function buildProviderSparql(resourceUrl: string, providerId: string): string {\n const baseUrl = PROVIDER_BASE_URLS[providerId.toLowerCase()];\n const displayName = providerId.charAt(0).toUpperCase() + providerId.slice(1);\n const subject = `<${resourceUrl}#${providerId}>`;\n\n return `PREFIX udfs: <${UDFS_NS}>\nDELETE { ${subject} udfs:baseUrl ?oldBase . ${subject} udfs:displayName ?oldName }\nINSERT { ${subject} a udfs:Provider ; udfs:displayName \"${displayName}\"${baseUrl ? ` ; udfs:baseUrl \"${baseUrl}\"` : ''} }\nWHERE { OPTIONAL { ${subject} udfs:baseUrl ?oldBase } OPTIONAL { ${subject} udfs:displayName ?oldName } }`;\n}\n\n/**\n * Build SPARQL UPDATE to upsert a Credential at /settings/credentials.ttl#cred-{provider}\n */\nexport function buildCredentialSparql(\n resourceUrl: string,\n podUrl: string,\n provider: string,\n fields: { apiKey?: string; model?: string },\n): string {\n const credId = credentialId(provider);\n const subject = `<${resourceUrl}#${credId}>`;\n const providerUri = `<${podUrl}settings/ai/providers.ttl#${provider}>`;\n\n const deletes: string[] = [];\n const inserts: string[] = [\n `${subject} a udfs:Credential`,\n `udfs:service \"ai\"`,\n `udfs:status \"active\"`,\n `udfs:provider ${providerUri}`,\n ];\n const optionals: string[] = [];\n\n // Always delete+reinsert provider link\n deletes.push(`${subject} udfs:provider ?oldProv .`);\n optionals.push(`OPTIONAL { ${subject} udfs:provider ?oldProv }`);\n\n if (fields.apiKey) {\n deletes.push(`${subject} udfs:apiKey ?oldKey .`);\n optionals.push(`OPTIONAL { ${subject} udfs:apiKey ?oldKey }`);\n inserts.push(`udfs:apiKey \"${fields.apiKey}\"`);\n }\n if (fields.model) {\n deletes.push(`${subject} udfs:defaultModel ?oldModel .`);\n optionals.push(`OPTIONAL { ${subject} udfs:defaultModel ?oldModel }`);\n inserts.push(`udfs:defaultModel \"${fields.model}\"`);\n }\n\n return `PREFIX udfs: <${UDFS_NS}>\nDELETE { ${deletes.join(' ')} }\nINSERT { ${inserts.join(' ;\\n ')} }\nWHERE { ${optionals.join(' ')} }`;\n}\n\n/**\n * Build SPARQL UPDATE to delete a Credential\n */\nexport function buildResetSparql(resourceUrl: string, provider: string): string {\n const credId = credentialId(provider);\n const subject = `<${resourceUrl}#${credId}>`;\n return `PREFIX udfs: <${UDFS_NS}>\\nDELETE WHERE { ${subject} ?p ?o }`;\n}\n\nasync function writeProvider(podUrl: string, accessToken: string, providerId: string): Promise<boolean> {\n const resource = `${podUrl}settings/ai/providers.ttl`;\n const sparql = buildProviderSparql(resource, providerId);\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n return res.ok;\n}\n\nasync function writeCredential(\n podUrl: string,\n accessToken: string,\n provider: string,\n fields: { apiKey?: string; model?: string },\n): Promise<boolean> {\n const resource = `${podUrl}settings/credentials.ttl`;\n const sparql = buildCredentialSparql(resource, podUrl, provider, fields);\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n return res.ok;\n}\n\nconst setCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'set',\n describe: 'Configure SecretaryAI (provider, model, api-key — one or more)',\n builder: (yargs) =>\n yargs\n .option('provider', { type: 'string', description: `AI provider (${Object.keys(PROVIDER_BASE_URLS).join(', ')})` })\n .option('model', { type: 'string', description: 'Default model name' })\n .option('api-key', { type: 'string', description: 'API key' })\n .check((argv) => {\n if (!argv.provider && !argv.model && !argv['api-key']) {\n throw new Error('Specify at least one of --provider, --model, or --api-key');\n }\n if ((argv.model || argv['api-key']) && !argv.provider) {\n throw new Error('--provider is required when setting --model or --api-key');\n }\n return true;\n }),\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const provider = argv.provider!;\n\n // Write provider\n const provOk = await writeProvider(podUrl, accessToken, provider);\n if (!provOk) {\n console.error('Failed to write provider config.');\n process.exit(1);\n }\n\n // Write credential\n const credOk = await writeCredential(podUrl, accessToken, provider, {\n apiKey: argv['api-key'],\n model: argv.model,\n });\n if (!credOk) {\n console.error('Failed to write credential config.');\n process.exit(1);\n }\n\n console.log(` provider: ${provider}`);\n if (argv.model) console.log(` model: ${argv.model}`);\n if (argv['api-key']) console.log(` api-key: ${maskSecret(argv['api-key'])}`);\n console.log('SecretaryAI config saved.');\n },\n};\n\nconst showCommand: CommandModule<ConfigArgs, ConfigArgs> = {\n command: 'show',\n describe: 'Show current SecretaryAI config',\n builder: (yargs) => yargs,\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const resource = `${podUrl}settings/credentials.ttl`;\n const res = await authenticatedFetch(resource, accessToken, {\n headers: { Accept: 'text/turtle' },\n });\n\n if (!res.ok) {\n console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');\n return;\n }\n\n const turtle = await res.text();\n // Parse simple triples from turtle to find AI credentials\n const credBlocks = turtle.split(/(?=<[^>]*#cred-)/);\n let found = false;\n for (const block of credBlocks) {\n if (!block.includes('service') || !block.includes('\"ai\"')) continue;\n found = true;\n\n const providerMatch = block.match(/providers\\.ttl#(\\w+)/);\n const apiKeyMatch = block.match(/apiKey\\s+\"([^\"]+)\"/);\n const modelMatch = block.match(/defaultModel\\s+\"([^\"]+)\"/);\n\n if (providerMatch) console.log(` provider: ${providerMatch[1]}`);\n if (modelMatch) console.log(` model: ${modelMatch[1]}`);\n if (apiKeyMatch) console.log(` api-key: ${maskSecret(apiKeyMatch[1])}`);\n }\n\n if (!found) {\n console.log('No SecretaryAI config found. Use `xpod config set --provider openai --api-key sk-xxx` to configure.');\n }\n },\n};\n\nconst resetCommand: CommandModule<ConfigArgs, SetArgs> = {\n command: 'reset',\n describe: 'Remove SecretaryAI config',\n builder: (yargs) =>\n yargs.option('provider', {\n type: 'string',\n description: 'Provider to remove',\n demandOption: true,\n }),\n handler: async (argv) => {\n const { accessToken, podUrl } = await resolveAuth(argv);\n const provider = argv.provider!;\n const resource = `${podUrl}settings/credentials.ttl`;\n const sparql = buildResetSparql(resource, provider);\n\n const res = await authenticatedFetch(resource, accessToken, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/sparql-update' },\n body: sparql,\n });\n\n if (res.ok) {\n console.log(`SecretaryAI config for ${provider} removed.`);\n } else {\n const text = await res.text();\n console.error(`Failed to reset config: ${res.status} ${text.slice(0, 200)}`);\n process.exit(1);\n }\n },\n};\n\nexport const configCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'SecretaryAI configuration (provider, model, api-key)',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL (default: from ~/.xpod/)',\n })\n .command(setCommand)\n .command(showCommand)\n .command(resetCommand)\n .demandCommand(1, 'Please specify a config subcommand'),\n handler: () => {},\n};\n"]}
|