@dofe/infra-clients 0.1.37 → 0.1.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/mlflow/mlflow.client.d.ts +44 -0
- package/dist/internal/mlflow/mlflow.client.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.client.js +184 -0
- package/dist/internal/mlflow/mlflow.client.js.map +1 -0
- package/dist/internal/mlflow/mlflow.module.d.ts +3 -0
- package/dist/internal/mlflow/mlflow.module.d.ts.map +1 -0
- package/dist/internal/mlflow/mlflow.module.js +23 -0
- package/dist/internal/mlflow/mlflow.module.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts +52 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js +174 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.client.js.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts +3 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js +30 -0
- package/dist/internal/model-research-proxy/anthropic-proxy-research.module.js.map +1 -0
- package/dist/internal/model-research-proxy/index.d.ts +6 -0
- package/dist/internal/model-research-proxy/index.d.ts.map +1 -0
- package/dist/internal/model-research-proxy/index.js +24 -0
- package/dist/internal/model-research-proxy/index.js.map +1 -0
- package/dist/internal/model-verify/index.d.ts +4 -0
- package/dist/internal/model-verify/index.d.ts.map +1 -0
- package/dist/internal/model-verify/index.js +26 -0
- package/dist/internal/model-verify/index.js.map +1 -0
- package/dist/internal/model-verify/model-verify.client.d.ts +77 -0
- package/dist/internal/model-verify/model-verify.client.d.ts.map +1 -0
- package/dist/internal/model-verify/model-verify.client.js +324 -0
- package/dist/internal/model-verify/model-verify.client.js.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts +132 -0
- package/dist/internal/openclaw/docker-exec.service.d.ts.map +1 -0
- package/dist/internal/openclaw/docker-exec.service.js +544 -0
- package/dist/internal/openclaw/docker-exec.service.js.map +1 -0
- package/dist/internal/openclaw/index.d.ts +14 -0
- package/dist/internal/openclaw/index.d.ts.map +1 -0
- package/dist/internal/openclaw/index.js +32 -0
- package/dist/internal/openclaw/index.js.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts +73 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js +249 -0
- package/dist/internal/openclaw/openclaw-agent-coordination.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts +66 -0
- package/dist/internal/openclaw/openclaw-context-status.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js +164 -0
- package/dist/internal/openclaw/openclaw-context-status.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts +61 -0
- package/dist/internal/openclaw/openclaw-cron.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-cron.client.js +416 -0
- package/dist/internal/openclaw/openclaw-cron.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts +41 -0
- package/dist/internal/openclaw/openclaw-gateway.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js +175 -0
- package/dist/internal/openclaw/openclaw-gateway.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts +222 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js +720 -0
- package/dist/internal/openclaw/openclaw-skill-sync.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.client.d.ts +602 -0
- package/dist/internal/openclaw/openclaw.client.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.client.js +3062 -0
- package/dist/internal/openclaw/openclaw.client.js.map +1 -0
- package/dist/internal/openclaw/openclaw.module.d.ts +3 -0
- package/dist/internal/openclaw/openclaw.module.d.ts.map +1 -0
- package/dist/internal/openclaw/openclaw.module.js +62 -0
- package/dist/internal/openclaw/openclaw.module.js.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts +39 -0
- package/dist/internal/openclaw/skill-translation.service.d.ts.map +1 -0
- package/dist/internal/openclaw/skill-translation.service.js +217 -0
- package/dist/internal/openclaw/skill-translation.service.js.map +1 -0
- package/dist/internal/openclaw/types/cron.types.d.ts +112 -0
- package/dist/internal/openclaw/types/cron.types.d.ts.map +1 -0
- package/dist/internal/openclaw/types/cron.types.js +9 -0
- package/dist/internal/openclaw/types/cron.types.js.map +1 -0
- package/dist/internal/provider-verify/index.d.ts +6 -0
- package/dist/internal/provider-verify/index.d.ts.map +1 -0
- package/dist/internal/provider-verify/index.js +24 -0
- package/dist/internal/provider-verify/index.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts +55 -0
- package/dist/internal/provider-verify/provider-verify.client.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.client.js +284 -0
- package/dist/internal/provider-verify/provider-verify.client.js.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts +3 -0
- package/dist/internal/provider-verify/provider-verify.module.d.ts.map +1 -0
- package/dist/internal/provider-verify/provider-verify.module.js +28 -0
- package/dist/internal/provider-verify/provider-verify.module.js.map +1 -0
- package/dist/internal/sso/index.d.ts +5 -0
- package/dist/internal/sso/index.d.ts.map +1 -0
- package/dist/internal/sso/index.js +12 -0
- package/dist/internal/sso/index.js.map +1 -0
- package/dist/internal/sso/sso-auth.client.d.ts +33 -0
- package/dist/internal/sso/sso-auth.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-auth.client.js +89 -0
- package/dist/internal/sso/sso-auth.client.js.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts +11 -0
- package/dist/internal/sso/sso-message-proxy.service.d.ts.map +1 -0
- package/dist/internal/sso/sso-message-proxy.service.js +51 -0
- package/dist/internal/sso/sso-message-proxy.service.js.map +1 -0
- package/dist/internal/sso/sso-message.client.d.ts +12 -0
- package/dist/internal/sso/sso-message.client.d.ts.map +1 -0
- package/dist/internal/sso/sso-message.client.js +62 -0
- package/dist/internal/sso/sso-message.client.js.map +1 -0
- package/dist/internal/sso/sso.module.d.ts +3 -0
- package/dist/internal/sso/sso.module.d.ts.map +1 -0
- package/dist/internal/sso/sso.module.js +26 -0
- package/dist/internal/sso/sso.module.js.map +1 -0
- package/package.json +110 -6
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ModelVerifyClient = exports.ModelVerifyClientModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const axios_1 = require("@nestjs/axios");
|
|
12
|
+
const model_verify_client_1 = require("./model-verify.client");
|
|
13
|
+
let ModelVerifyClientModule = class ModelVerifyClientModule {
|
|
14
|
+
};
|
|
15
|
+
exports.ModelVerifyClientModule = ModelVerifyClientModule;
|
|
16
|
+
exports.ModelVerifyClientModule = ModelVerifyClientModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [axios_1.HttpModule.register({ timeout: 15000 })],
|
|
19
|
+
providers: [model_verify_client_1.ModelVerifyClient],
|
|
20
|
+
exports: [model_verify_client_1.ModelVerifyClient],
|
|
21
|
+
})
|
|
22
|
+
], ModelVerifyClientModule);
|
|
23
|
+
// 导出 Client 类供直接使用
|
|
24
|
+
var model_verify_client_2 = require("./model-verify.client");
|
|
25
|
+
Object.defineProperty(exports, "ModelVerifyClient", { enumerable: true, get: function () { return model_verify_client_2.ModelVerifyClient; } });
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yCAA2C;AAC3C,+DAA0D;AAOnD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAAG,CAAA;AAA1B,0DAAuB;kCAAvB,uBAAuB;IALnC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kBAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,SAAS,EAAE,CAAC,uCAAiB,CAAC;QAC9B,OAAO,EAAE,CAAC,uCAAiB,CAAC;KAC7B,CAAC;GACW,uBAAuB,CAAG;AAEvC,mBAAmB;AACnB,6DAAqE;AAA5D,wHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Verification Client
|
|
3
|
+
* 封装模型 API 验证和模型列表获取
|
|
4
|
+
*/
|
|
5
|
+
import { HttpService } from '@nestjs/axios';
|
|
6
|
+
/**
|
|
7
|
+
* 模型信息(包含 description)
|
|
8
|
+
*/
|
|
9
|
+
export interface ModelInfo {
|
|
10
|
+
id: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class ModelVerifyClient {
|
|
14
|
+
private readonly httpService;
|
|
15
|
+
private readonly TIMEOUT_MS;
|
|
16
|
+
constructor(httpService: HttpService);
|
|
17
|
+
/**
|
|
18
|
+
* 判断是否是 DMXAPI 等第三方聚合平台
|
|
19
|
+
* 基于 baseUrl 的域名进行匹配
|
|
20
|
+
*/
|
|
21
|
+
private isAggregatorPlatform;
|
|
22
|
+
/**
|
|
23
|
+
* 获取 API 请求的 headers
|
|
24
|
+
* 根据平台类型动态调整:
|
|
25
|
+
* - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
|
|
26
|
+
* - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
|
|
27
|
+
*/
|
|
28
|
+
private getHeaders;
|
|
29
|
+
/**
|
|
30
|
+
* 从 OpenAI 兼容 API 获取模型列表
|
|
31
|
+
* 支持 DMXAPI 等第三方聚合平台的特殊 headers
|
|
32
|
+
*/
|
|
33
|
+
fetchOpenAICompatibleModels(baseUrl: string, apiKey: string): Promise<ModelInfo[]>;
|
|
34
|
+
/**
|
|
35
|
+
* 从 Gemini API 获取模型列表
|
|
36
|
+
*/
|
|
37
|
+
fetchGeminiModels(baseUrl: string, apiKey: string): Promise<ModelInfo[]>;
|
|
38
|
+
/**
|
|
39
|
+
* 验证 Chat 模型 (OpenAI/Anthropic)
|
|
40
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
41
|
+
*/
|
|
42
|
+
verifyChatModel(apiHost: string, apiKey: string, model: string, apiType: 'openai' | 'anthropic'): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* 验证 Gemini 模型
|
|
45
|
+
*/
|
|
46
|
+
verifyGeminiModel(apiHost: string, apiKey: string, model: string): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* 验证 Azure OpenAI 模型
|
|
49
|
+
*/
|
|
50
|
+
verifyAzureOpenAIModel(apiHost: string, apiKey: string, model: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* 验证图像生成模型
|
|
53
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
54
|
+
*/
|
|
55
|
+
verifyImageModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* 验证 Embedding 模型
|
|
58
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
59
|
+
*/
|
|
60
|
+
verifyEmbeddingModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* 验证 TTS 模型
|
|
63
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
64
|
+
*/
|
|
65
|
+
verifyTTSModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* 验证 Rerank 模型
|
|
68
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
69
|
+
*/
|
|
70
|
+
verifyRerankModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* 验证 Moderation 模型
|
|
73
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
74
|
+
*/
|
|
75
|
+
verifyModerationModel(apiHost: string, apiKey: string, model: string, apiType: string): Promise<boolean>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=model-verify.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-verify.client.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/model-verify.client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA4B5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,qBACa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,WAAW,EAAE,WAAW;IAErD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAiBlB;;;OAGG;IACG,2BAA2B,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC;IA8BvB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC;IAkCvB;;;OAGG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,GAAG,WAAW,GAC9B,OAAO,CAAC,OAAO,CAAC;IA6CnB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA0BnB;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IA+BnB;;;OAGG;IACG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAqCnB;;;OAGG;IACG,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;OAGG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAoCnB;;;OAGG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAoCnB;;;OAGG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;CA0BpB"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Verification Client
|
|
4
|
+
* 封装模型 API 验证和模型列表获取
|
|
5
|
+
*/
|
|
6
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
7
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
9
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
10
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
11
|
+
};
|
|
12
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.ModelVerifyClient = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const axios_1 = require("@nestjs/axios");
|
|
19
|
+
const rxjs_1 = require("rxjs");
|
|
20
|
+
/**
|
|
21
|
+
* DMXAPI 等第三方聚合平台的域名特征
|
|
22
|
+
* 这些平台需要特殊的 headers:
|
|
23
|
+
* - Authorization 不需要 Bearer 前缀
|
|
24
|
+
* - 需要 Rix-Api-User header
|
|
25
|
+
*/
|
|
26
|
+
const AGGREGATOR_PLATFORM_DOMAINS = [
|
|
27
|
+
'dmxapi.com',
|
|
28
|
+
'dmxapi.cn',
|
|
29
|
+
'api.dmxapi.com',
|
|
30
|
+
];
|
|
31
|
+
let ModelVerifyClient = class ModelVerifyClient {
|
|
32
|
+
httpService;
|
|
33
|
+
TIMEOUT_MS = 15000;
|
|
34
|
+
constructor(httpService) {
|
|
35
|
+
this.httpService = httpService;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 判断是否是 DMXAPI 等第三方聚合平台
|
|
39
|
+
* 基于 baseUrl 的域名进行匹配
|
|
40
|
+
*/
|
|
41
|
+
isAggregatorPlatform(baseUrl) {
|
|
42
|
+
try {
|
|
43
|
+
const url = new URL(baseUrl);
|
|
44
|
+
const hostname = url.hostname.toLowerCase();
|
|
45
|
+
return AGGREGATOR_PLATFORM_DOMAINS.some((domain) => hostname.includes(domain));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 获取 API 请求的 headers
|
|
53
|
+
* 根据平台类型动态调整:
|
|
54
|
+
* - DMXAPI 等聚合平台:Authorization 不需要 Bearer,需要 Rix-Api-User
|
|
55
|
+
* - 标准 OpenAI 兼容 API:Authorization 使用 Bearer 前缀
|
|
56
|
+
*/
|
|
57
|
+
getHeaders(baseUrl, apiKey) {
|
|
58
|
+
if (this.isAggregatorPlatform(baseUrl)) {
|
|
59
|
+
// DMXAPI 等聚合平台的特殊 headers
|
|
60
|
+
const userId = process.env.DMXAPI_USER_ID || '20700';
|
|
61
|
+
return {
|
|
62
|
+
Authorization: apiKey, // 不需要 Bearer 前缀
|
|
63
|
+
Accept: 'application/json',
|
|
64
|
+
'Rix-Api-User': userId,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// 标准 OpenAI 兼容 API
|
|
68
|
+
return {
|
|
69
|
+
Authorization: `Bearer ${apiKey}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 从 OpenAI 兼容 API 获取模型列表
|
|
74
|
+
* 支持 DMXAPI 等第三方聚合平台的特殊 headers
|
|
75
|
+
*/
|
|
76
|
+
async fetchOpenAICompatibleModels(baseUrl, apiKey) {
|
|
77
|
+
try {
|
|
78
|
+
const headers = this.getHeaders(baseUrl, apiKey);
|
|
79
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
80
|
+
.get(`${baseUrl}/models`, {
|
|
81
|
+
headers,
|
|
82
|
+
})
|
|
83
|
+
.pipe((0, rxjs_1.timeout)(10000), (0, rxjs_1.catchError)(() => (0, rxjs_1.of)({ status: 500, data: {} }))));
|
|
84
|
+
if (response.status === 200 &&
|
|
85
|
+
'data' in response.data &&
|
|
86
|
+
response.data.data) {
|
|
87
|
+
return response.data.data.map((m) => ({
|
|
88
|
+
id: m.id,
|
|
89
|
+
description: m.description,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 从 Gemini API 获取模型列表
|
|
100
|
+
*/
|
|
101
|
+
async fetchGeminiModels(baseUrl, apiKey) {
|
|
102
|
+
try {
|
|
103
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
104
|
+
.get(`${baseUrl}/v1beta/models?key=${apiKey}`)
|
|
105
|
+
.pipe((0, rxjs_1.timeout)(10000), (0, rxjs_1.catchError)(() => (0, rxjs_1.of)({ status: 500, data: {} }))));
|
|
106
|
+
if (response.status === 200 &&
|
|
107
|
+
'models' in response.data &&
|
|
108
|
+
response.data.models) {
|
|
109
|
+
return response.data.models
|
|
110
|
+
.filter((m) => m.supportedGenerationMethods?.includes('generateContent'))
|
|
111
|
+
.map((m) => ({
|
|
112
|
+
id: m.name.replace('models/', ''),
|
|
113
|
+
description: m.description,
|
|
114
|
+
}))
|
|
115
|
+
.slice(0, 20);
|
|
116
|
+
}
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 验证 Chat 模型 (OpenAI/Anthropic)
|
|
125
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
126
|
+
*/
|
|
127
|
+
async verifyChatModel(apiHost, apiKey, model, apiType) {
|
|
128
|
+
const isAnthropic = apiType === 'anthropic';
|
|
129
|
+
const url = isAnthropic
|
|
130
|
+
? `${apiHost}/v1/messages`
|
|
131
|
+
: `${apiHost}/chat/completions`;
|
|
132
|
+
// 判断是否是聚合平台,使用对应的 headers
|
|
133
|
+
const headers = isAnthropic
|
|
134
|
+
? {
|
|
135
|
+
'x-api-key': apiKey,
|
|
136
|
+
'anthropic-version': '2023-06-01',
|
|
137
|
+
'Content-Type': 'application/json',
|
|
138
|
+
}
|
|
139
|
+
: {
|
|
140
|
+
...this.getHeaders(apiHost, apiKey),
|
|
141
|
+
'Content-Type': 'application/json',
|
|
142
|
+
};
|
|
143
|
+
try {
|
|
144
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
145
|
+
.post(url, {
|
|
146
|
+
model,
|
|
147
|
+
max_tokens: 1,
|
|
148
|
+
messages: [{ role: 'user', content: 'Hi' }],
|
|
149
|
+
}, { headers })
|
|
150
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
151
|
+
// 200 = 成功, 429 = 限流但有效
|
|
152
|
+
return response.status === 200 || response.status === 429;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return true; // 其他错误视为可用
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 验证 Gemini 模型
|
|
160
|
+
*/
|
|
161
|
+
async verifyGeminiModel(apiHost, apiKey, model) {
|
|
162
|
+
try {
|
|
163
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
164
|
+
.post(`${apiHost}/v1beta/models/${model}:generateContent?key=${apiKey}`, {
|
|
165
|
+
contents: [{ parts: [{ text: 'Hi' }] }],
|
|
166
|
+
generationConfig: { maxOutputTokens: 1 },
|
|
167
|
+
}, { headers: { 'Content-Type': 'application/json' } })
|
|
168
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
169
|
+
return response.status === 200 || response.status === 429;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 验证 Azure OpenAI 模型
|
|
177
|
+
*/
|
|
178
|
+
async verifyAzureOpenAIModel(apiHost, apiKey, model) {
|
|
179
|
+
try {
|
|
180
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
181
|
+
.post(`${apiHost}/openai/deployments/${model}/chat/completions?api-version=2024-02-15-preview`, {
|
|
182
|
+
messages: [{ role: 'user', content: 'Hi' }],
|
|
183
|
+
max_tokens: 1,
|
|
184
|
+
}, {
|
|
185
|
+
headers: {
|
|
186
|
+
'api-key': apiKey,
|
|
187
|
+
'Content-Type': 'application/json',
|
|
188
|
+
},
|
|
189
|
+
})
|
|
190
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
191
|
+
return response.status === 200 || response.status === 429;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 验证图像生成模型
|
|
199
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
200
|
+
*/
|
|
201
|
+
async verifyImageModel(apiHost, apiKey, model, apiType) {
|
|
202
|
+
const headers = apiType === 'anthropic'
|
|
203
|
+
? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
|
|
204
|
+
: {
|
|
205
|
+
...this.getHeaders(apiHost, apiKey),
|
|
206
|
+
'Content-Type': 'application/json',
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
210
|
+
.post(`${apiHost}/images/generations`, {
|
|
211
|
+
model,
|
|
212
|
+
prompt: 'A dot',
|
|
213
|
+
n: 1,
|
|
214
|
+
size: '256x256',
|
|
215
|
+
response_format: 'url',
|
|
216
|
+
}, { headers })
|
|
217
|
+
.pipe((0, rxjs_1.timeout)(30000), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
218
|
+
return response.status === 200 || response.status === 429;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* 验证 Embedding 模型
|
|
226
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
227
|
+
*/
|
|
228
|
+
async verifyEmbeddingModel(apiHost, apiKey, model, apiType) {
|
|
229
|
+
const headers = apiType === 'anthropic'
|
|
230
|
+
? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
|
|
231
|
+
: {
|
|
232
|
+
...this.getHeaders(apiHost, apiKey),
|
|
233
|
+
'Content-Type': 'application/json',
|
|
234
|
+
};
|
|
235
|
+
try {
|
|
236
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
237
|
+
.post(`${apiHost}/embeddings`, { model, input: 'test' }, { headers })
|
|
238
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
239
|
+
return response.status === 200 || response.status === 429;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 验证 TTS 模型
|
|
247
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
248
|
+
*/
|
|
249
|
+
async verifyTTSModel(apiHost, apiKey, model, apiType) {
|
|
250
|
+
const headers = apiType === 'anthropic'
|
|
251
|
+
? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
|
|
252
|
+
: {
|
|
253
|
+
...this.getHeaders(apiHost, apiKey),
|
|
254
|
+
'Content-Type': 'application/json',
|
|
255
|
+
};
|
|
256
|
+
try {
|
|
257
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
258
|
+
.post(`${apiHost}/audio/speech`, {
|
|
259
|
+
model,
|
|
260
|
+
input: 'Hi',
|
|
261
|
+
voice: 'alloy',
|
|
262
|
+
response_format: 'mp3',
|
|
263
|
+
}, { headers })
|
|
264
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
265
|
+
return response.status === 200 || response.status === 429;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 验证 Rerank 模型
|
|
273
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
274
|
+
*/
|
|
275
|
+
async verifyRerankModel(apiHost, apiKey, model, apiType) {
|
|
276
|
+
const headers = apiType === 'anthropic'
|
|
277
|
+
? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
|
|
278
|
+
: {
|
|
279
|
+
...this.getHeaders(apiHost, apiKey),
|
|
280
|
+
'Content-Type': 'application/json',
|
|
281
|
+
};
|
|
282
|
+
try {
|
|
283
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
284
|
+
.post(`${apiHost}/rerank`, {
|
|
285
|
+
model,
|
|
286
|
+
query: 'test',
|
|
287
|
+
documents: ['test'],
|
|
288
|
+
top_n: 1,
|
|
289
|
+
}, { headers })
|
|
290
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
291
|
+
return response.status === 200 || response.status === 429;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 验证 Moderation 模型
|
|
299
|
+
* 支持 DMXAPI 等第三方聚合平台
|
|
300
|
+
*/
|
|
301
|
+
async verifyModerationModel(apiHost, apiKey, model, apiType) {
|
|
302
|
+
const headers = apiType === 'anthropic'
|
|
303
|
+
? { 'x-api-key': apiKey, 'Content-Type': 'application/json' }
|
|
304
|
+
: {
|
|
305
|
+
...this.getHeaders(apiHost, apiKey),
|
|
306
|
+
'Content-Type': 'application/json',
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
const response = await (0, rxjs_1.firstValueFrom)(this.httpService
|
|
310
|
+
.post(`${apiHost}/moderations`, { model, input: 'test' }, { headers })
|
|
311
|
+
.pipe((0, rxjs_1.timeout)(this.TIMEOUT_MS), (0, rxjs_1.catchError)((error) => (0, rxjs_1.of)({ status: error.response?.status || 500 }))));
|
|
312
|
+
return response.status === 200 || response.status === 429;
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
exports.ModelVerifyClient = ModelVerifyClient;
|
|
320
|
+
exports.ModelVerifyClient = ModelVerifyClient = __decorate([
|
|
321
|
+
(0, common_1.Injectable)(),
|
|
322
|
+
__metadata("design:paramtypes", [axios_1.HttpService])
|
|
323
|
+
], ModelVerifyClient);
|
|
324
|
+
//# sourceMappingURL=model-verify.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-verify.client.js","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/model-verify/model-verify.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import { Logger } from 'winston';
|
|
3
|
+
import { DockerService } from '@dofe/infra-docker';
|
|
4
|
+
/**
|
|
5
|
+
* Docker exec 执行选项
|
|
6
|
+
*/
|
|
7
|
+
export interface DockerExecOptions {
|
|
8
|
+
/** 执行超时(毫秒),默认 15000 */
|
|
9
|
+
timeout?: number;
|
|
10
|
+
/** 执行用户,默认容器默认用户 */
|
|
11
|
+
user?: string;
|
|
12
|
+
/** 是否在失败时抛出错误,默认 false */
|
|
13
|
+
throwOnError?: boolean;
|
|
14
|
+
/** 是否返回 stderr,默认 false */
|
|
15
|
+
includeStderr?: boolean;
|
|
16
|
+
/** 是否等待容器就绪(遇到 409 错误时自动重试),默认 false */
|
|
17
|
+
waitForReady?: boolean;
|
|
18
|
+
/** 等待容器就绪的最大时间(毫秒),默认 30000 */
|
|
19
|
+
maxWaitMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Docker exec 执行结果
|
|
23
|
+
*/
|
|
24
|
+
export interface DockerExecResult {
|
|
25
|
+
/** stdout 输出 */
|
|
26
|
+
stdout: string;
|
|
27
|
+
/** stderr 输出 */
|
|
28
|
+
stderr: string;
|
|
29
|
+
/** 是否执行成功(无错误抛出) */
|
|
30
|
+
success: boolean;
|
|
31
|
+
/** 执行耗时(毫秒) */
|
|
32
|
+
durationMs: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class DockerExecService {
|
|
35
|
+
private readonly logger;
|
|
36
|
+
private readonly httpService;
|
|
37
|
+
private readonly dockerService;
|
|
38
|
+
private readonly defaultTimeout;
|
|
39
|
+
private readonly dockerSocketPath;
|
|
40
|
+
constructor(logger: Logger, httpService: HttpService, dockerService: DockerService);
|
|
41
|
+
/**
|
|
42
|
+
* 等待容器进入运行状态
|
|
43
|
+
* 解决 HTTP 409 错误:容器停止或重启时无法执行 exec
|
|
44
|
+
*
|
|
45
|
+
* @param containerId 容器 ID
|
|
46
|
+
* @param maxWaitMs 最大等待时间(毫秒)
|
|
47
|
+
* @param pollIntervalMs 轮询间隔(毫秒)
|
|
48
|
+
*/
|
|
49
|
+
waitForContainerRunning(containerId: string, maxWaitMs?: number, pollIntervalMs?: number): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* 在容器内执行命令
|
|
52
|
+
*
|
|
53
|
+
* @param containerId 容器 ID
|
|
54
|
+
* @param cmd 命令数组,如 ['node', '-e', script]
|
|
55
|
+
* @param options 执行选项
|
|
56
|
+
* @returns 执行结果
|
|
57
|
+
*/
|
|
58
|
+
executeCommand(containerId: string, cmd: string[], options?: DockerExecOptions): Promise<DockerExecResult>;
|
|
59
|
+
/**
|
|
60
|
+
* 执行 Node.js 脚本
|
|
61
|
+
*
|
|
62
|
+
* @param containerId 容器 ID
|
|
63
|
+
* @param script Node.js 脚本内容
|
|
64
|
+
* @param options 执行选项
|
|
65
|
+
*/
|
|
66
|
+
executeNodeScript(containerId: string, script: string, options?: DockerExecOptions): Promise<DockerExecResult>;
|
|
67
|
+
/**
|
|
68
|
+
* 执行 Shell 命令
|
|
69
|
+
*
|
|
70
|
+
* @param containerId 容器 ID
|
|
71
|
+
* @param command Shell 命令
|
|
72
|
+
* @param options 执行选项
|
|
73
|
+
*/
|
|
74
|
+
executeShellCommand(containerId: string, command: string, options?: DockerExecOptions): Promise<DockerExecResult>;
|
|
75
|
+
/**
|
|
76
|
+
* 验证名称是否安全(防止注入)
|
|
77
|
+
*
|
|
78
|
+
* @param name 要验证的名称
|
|
79
|
+
* @returns 是否安全
|
|
80
|
+
*/
|
|
81
|
+
isValidName(name: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* 复制文件到容器
|
|
84
|
+
* 使用 Dockerode putArchive API 替代 docker cp CLI
|
|
85
|
+
* 写入后自动修复文件权限为 node:node(OpenClaw 运行用户)
|
|
86
|
+
*
|
|
87
|
+
* @param containerId 容器 ID
|
|
88
|
+
* @param sourcePath 宿主机文件路径
|
|
89
|
+
* @param destPath 容器内目标路径(文件完整路径)
|
|
90
|
+
* @param owner 文件所有者(默认 'node:node',OpenClaw 运行用户)
|
|
91
|
+
*/
|
|
92
|
+
copyFileToContainer(containerId: string, sourcePath: string, destPath: string, owner?: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* 复制目录到容器
|
|
95
|
+
* 使用 Dockerode putArchive API
|
|
96
|
+
*
|
|
97
|
+
* @param containerId 容器 ID
|
|
98
|
+
* @param sourceDir 宿主机目录路径
|
|
99
|
+
* @param destDir 容器内目标目录路径
|
|
100
|
+
*/
|
|
101
|
+
copyDirectoryToContainer(containerId: string, sourceDir: string, destDir: string): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* 创建单个文件的 tar 包 Buffer
|
|
104
|
+
* tar 格式:512 字节 header + 文件内容(填充到 512 字节对齐)+ 两个 512 字节的空 block 作为结束
|
|
105
|
+
*/
|
|
106
|
+
private createTarBuffer;
|
|
107
|
+
/**
|
|
108
|
+
* 创建目录的 tar 包 Buffer
|
|
109
|
+
*
|
|
110
|
+
* @param sourceDir 源目录路径
|
|
111
|
+
* @param dirPrefix tar 包中的目录前缀(可选,用于保留目录名)
|
|
112
|
+
*/
|
|
113
|
+
private createTarBufferFromDirectory;
|
|
114
|
+
/**
|
|
115
|
+
* 递归列出目录下所有文件
|
|
116
|
+
* 忽略以 . 开头的文件和 node_modules 目录
|
|
117
|
+
*/
|
|
118
|
+
private listFilesRecursively;
|
|
119
|
+
/**
|
|
120
|
+
* 将 Buffer 填充到 512 字节对齐
|
|
121
|
+
*/
|
|
122
|
+
private padTo512;
|
|
123
|
+
private createExec;
|
|
124
|
+
private startExec;
|
|
125
|
+
/**
|
|
126
|
+
* 解析 Docker exec 多路复用流输出
|
|
127
|
+
* Docker exec 输出格式:每帧 8 字节头 + payload
|
|
128
|
+
* 头部:[stream_type(1), 0, 0, 0, size(4 bytes big-endian)]
|
|
129
|
+
*/
|
|
130
|
+
private parseOutput;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=docker-exec.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-exec.service.d.ts","sourceRoot":"","sources":["../../../../../packages/clients/src/internal/openclaw/docker-exec.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,iBAAiB;IAKO,OAAO,CAAC,QAAQ,CAAC,MAAM;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;gBAGP,MAAM,EAAE,MAAM,EAC/C,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IAG/C;;;;;;;OAOG;IACG,uBAAuB,CAC3B,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAc,EACzB,cAAc,GAAE,MAAa,GAC5B,OAAO,CAAC,OAAO,CAAC;IA2EnB;;;;;;;OAOG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IA8G5B;;;;;;OAMG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAI5B;;;;;;OAMG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAI5B;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC;;;;;;;;;OASG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwChB;;;;;;;OAOG;IACG,wBAAwB,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAmDhB;;;OAGG;YACW,eAAe;IA4D7B;;;;;OAKG;YACW,4BAA4B;IAmC1C;;;OAGG;YACW,oBAAoB;IA0BlC;;OAEG;IACH,OAAO,CAAC,QAAQ;YASF,UAAU;YAyCV,SAAS;IAgCvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;CA6BpB"}
|