@godscene/shared 1.7.11
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 +9 -0
- package/dist/es/baseDB.mjs +109 -0
- package/dist/es/cli/cli-args.mjs +95 -0
- package/dist/es/cli/cli-error.mjs +24 -0
- package/dist/es/cli/cli-runner.mjs +122 -0
- package/dist/es/cli/index.mjs +4 -0
- package/dist/es/common.mjs +37 -0
- package/dist/es/constants/example-code.mjs +227 -0
- package/dist/es/constants/index.mjs +124 -0
- package/dist/es/env/basic.mjs +6 -0
- package/dist/es/env/constants.mjs +110 -0
- package/dist/es/env/global-config-manager.mjs +94 -0
- package/dist/es/env/helper.mjs +43 -0
- package/dist/es/env/index.mjs +5 -0
- package/dist/es/env/init-debug.mjs +18 -0
- package/dist/es/env/model-config-manager.mjs +79 -0
- package/dist/es/env/parse-model-config.mjs +165 -0
- package/dist/es/env/types.mjs +232 -0
- package/dist/es/env/utils.mjs +18 -0
- package/dist/es/extractor/constants.mjs +2 -0
- package/dist/es/extractor/cs_postmessage.mjs +61 -0
- package/dist/es/extractor/customLocator.mjs +641 -0
- package/dist/es/extractor/debug.mjs +6 -0
- package/dist/es/extractor/dom-util.mjs +96 -0
- package/dist/es/extractor/index.mjs +5 -0
- package/dist/es/extractor/locator.mjs +250 -0
- package/dist/es/extractor/tree.mjs +78 -0
- package/dist/es/extractor/util.mjs +245 -0
- package/dist/es/extractor/web-extractor.mjs +393 -0
- package/dist/es/img/box-select.mjs +824 -0
- package/dist/es/img/canvas-fallback.mjs +238 -0
- package/dist/es/img/get-photon.mjs +45 -0
- package/dist/es/img/get-sharp.mjs +11 -0
- package/dist/es/img/index.mjs +4 -0
- package/dist/es/img/info.mjs +35 -0
- package/dist/es/img/transform.mjs +275 -0
- package/dist/es/index.mjs +2 -0
- package/dist/es/key-alias-utils.mjs +19 -0
- package/dist/es/logger.mjs +64 -0
- package/dist/es/mcp/base-server.mjs +282 -0
- package/dist/es/mcp/base-tools.mjs +159 -0
- package/dist/es/mcp/chrome-path.mjs +35 -0
- package/dist/es/mcp/cli-report-session.mjs +78 -0
- package/dist/es/mcp/error-formatter.mjs +19 -0
- package/dist/es/mcp/index.mjs +9 -0
- package/dist/es/mcp/init-arg-utils.mjs +38 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs +53 -0
- package/dist/es/mcp/launcher-helper.mjs +52 -0
- package/dist/es/mcp/tool-generator.mjs +419 -0
- package/dist/es/mcp/types.mjs +3 -0
- package/dist/es/node/fs.mjs +44 -0
- package/dist/es/node/index.mjs +2 -0
- package/dist/es/node/port.mjs +24 -0
- package/dist/es/polyfills/async-hooks.mjs +2 -0
- package/dist/es/polyfills/index.mjs +1 -0
- package/dist/es/types/index.mjs +3 -0
- package/dist/es/us-keyboard-layout.mjs +1414 -0
- package/dist/es/us-keyboard-layout.mjs.LICENSE.txt +5 -0
- package/dist/es/utils.mjs +72 -0
- package/dist/es/zod-schema-utils.mjs +54 -0
- package/dist/lib/baseDB.js +149 -0
- package/dist/lib/cli/cli-args.js +138 -0
- package/dist/lib/cli/cli-error.js +61 -0
- package/dist/lib/cli/cli-runner.js +181 -0
- package/dist/lib/cli/index.js +53 -0
- package/dist/lib/common.js +93 -0
- package/dist/lib/constants/example-code.js +264 -0
- package/dist/lib/constants/index.js +221 -0
- package/dist/lib/env/basic.js +40 -0
- package/dist/lib/env/constants.js +153 -0
- package/dist/lib/env/global-config-manager.js +128 -0
- package/dist/lib/env/helper.js +80 -0
- package/dist/lib/env/index.js +90 -0
- package/dist/lib/env/init-debug.js +52 -0
- package/dist/lib/env/model-config-manager.js +113 -0
- package/dist/lib/env/parse-model-config.js +211 -0
- package/dist/lib/env/types.js +572 -0
- package/dist/lib/env/utils.js +61 -0
- package/dist/lib/extractor/constants.js +42 -0
- package/dist/lib/extractor/cs_postmessage.js +98 -0
- package/dist/lib/extractor/customLocator.js +693 -0
- package/dist/lib/extractor/debug.js +12 -0
- package/dist/lib/extractor/dom-util.js +157 -0
- package/dist/lib/extractor/index.js +87 -0
- package/dist/lib/extractor/locator.js +296 -0
- package/dist/lib/extractor/tree.js +124 -0
- package/dist/lib/extractor/util.js +336 -0
- package/dist/lib/extractor/web-extractor.js +442 -0
- package/dist/lib/img/box-select.js +875 -0
- package/dist/lib/img/canvas-fallback.js +305 -0
- package/dist/lib/img/get-photon.js +82 -0
- package/dist/lib/img/get-sharp.js +45 -0
- package/dist/lib/img/index.js +95 -0
- package/dist/lib/img/info.js +92 -0
- package/dist/lib/img/transform.js +364 -0
- package/dist/lib/index.js +36 -0
- package/dist/lib/key-alias-utils.js +62 -0
- package/dist/lib/logger.js +114 -0
- package/dist/lib/mcp/base-server.js +332 -0
- package/dist/lib/mcp/base-tools.js +193 -0
- package/dist/lib/mcp/chrome-path.js +72 -0
- package/dist/lib/mcp/cli-report-session.js +121 -0
- package/dist/lib/mcp/error-formatter.js +53 -0
- package/dist/lib/mcp/index.js +114 -0
- package/dist/lib/mcp/init-arg-utils.js +78 -0
- package/dist/lib/mcp/inject-report-html-plugin.js +98 -0
- package/dist/lib/mcp/launcher-helper.js +86 -0
- package/dist/lib/mcp/tool-generator.js +456 -0
- package/dist/lib/mcp/types.js +40 -0
- package/dist/lib/node/fs.js +97 -0
- package/dist/lib/node/index.js +65 -0
- package/dist/lib/node/port.js +61 -0
- package/dist/lib/polyfills/async-hooks.js +36 -0
- package/dist/lib/polyfills/index.js +58 -0
- package/dist/lib/types/index.js +37 -0
- package/dist/lib/us-keyboard-layout.js +1457 -0
- package/dist/lib/us-keyboard-layout.js.LICENSE.txt +5 -0
- package/dist/lib/utils.js +148 -0
- package/dist/lib/zod-schema-utils.js +97 -0
- package/dist/types/baseDB.d.ts +25 -0
- package/dist/types/cli/cli-args.d.ts +8 -0
- package/dist/types/cli/cli-error.d.ts +5 -0
- package/dist/types/cli/cli-runner.d.ts +19 -0
- package/dist/types/cli/index.d.ts +4 -0
- package/dist/types/common.d.ts +12 -0
- package/dist/types/constants/example-code.d.ts +2 -0
- package/dist/types/constants/index.d.ts +61 -0
- package/dist/types/env/basic.d.ts +6 -0
- package/dist/types/env/constants.d.ts +50 -0
- package/dist/types/env/global-config-manager.d.ts +32 -0
- package/dist/types/env/helper.d.ts +4 -0
- package/dist/types/env/index.d.ts +4 -0
- package/dist/types/env/init-debug.d.ts +1 -0
- package/dist/types/env/model-config-manager.d.ts +25 -0
- package/dist/types/env/parse-model-config.d.ts +31 -0
- package/dist/types/env/types.d.ts +339 -0
- package/dist/types/env/utils.d.ts +7 -0
- package/dist/types/extractor/constants.d.ts +1 -0
- package/dist/types/extractor/cs_postmessage.d.ts +2 -0
- package/dist/types/extractor/customLocator.d.ts +69 -0
- package/dist/types/extractor/debug.d.ts +1 -0
- package/dist/types/extractor/dom-util.d.ts +57 -0
- package/dist/types/extractor/index.d.ts +33 -0
- package/dist/types/extractor/locator.d.ts +9 -0
- package/dist/types/extractor/tree.d.ts +6 -0
- package/dist/types/extractor/util.d.ts +47 -0
- package/dist/types/extractor/web-extractor.d.ts +24 -0
- package/dist/types/img/box-select.d.ts +26 -0
- package/dist/types/img/canvas-fallback.d.ts +105 -0
- package/dist/types/img/get-photon.d.ts +19 -0
- package/dist/types/img/get-sharp.d.ts +3 -0
- package/dist/types/img/index.d.ts +3 -0
- package/dist/types/img/info.d.ts +34 -0
- package/dist/types/img/transform.d.ts +98 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/key-alias-utils.d.ts +9 -0
- package/dist/types/logger.d.ts +5 -0
- package/dist/types/mcp/base-server.d.ts +93 -0
- package/dist/types/mcp/base-tools.d.ts +148 -0
- package/dist/types/mcp/chrome-path.d.ts +2 -0
- package/dist/types/mcp/cli-report-session.d.ts +12 -0
- package/dist/types/mcp/error-formatter.d.ts +12 -0
- package/dist/types/mcp/index.d.ts +9 -0
- package/dist/types/mcp/init-arg-utils.d.ts +13 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts +18 -0
- package/dist/types/mcp/launcher-helper.d.ts +94 -0
- package/dist/types/mcp/tool-generator.d.ts +10 -0
- package/dist/types/mcp/types.d.ts +113 -0
- package/dist/types/node/fs.d.ts +15 -0
- package/dist/types/node/index.d.ts +2 -0
- package/dist/types/node/port.d.ts +8 -0
- package/dist/types/polyfills/async-hooks.d.ts +6 -0
- package/dist/types/polyfills/index.d.ts +4 -0
- package/dist/types/types/index.d.ts +36 -0
- package/dist/types/us-keyboard-layout.d.ts +32 -0
- package/dist/types/utils.d.ts +34 -0
- package/dist/types/zod-schema-utils.d.ts +23 -0
- package/package.json +125 -0
- package/src/baseDB.ts +158 -0
- package/src/cli/cli-args.ts +173 -0
- package/src/cli/cli-error.ts +24 -0
- package/src/cli/cli-runner.ts +230 -0
- package/src/cli/index.ts +4 -0
- package/src/common.ts +67 -0
- package/src/constants/example-code.ts +227 -0
- package/src/constants/index.ts +139 -0
- package/src/env/basic.ts +12 -0
- package/src/env/constants.ts +303 -0
- package/src/env/global-config-manager.ts +191 -0
- package/src/env/helper.ts +58 -0
- package/src/env/index.ts +4 -0
- package/src/env/init-debug.ts +34 -0
- package/src/env/model-config-manager.ts +149 -0
- package/src/env/parse-model-config.ts +357 -0
- package/src/env/types.ts +583 -0
- package/src/env/utils.ts +39 -0
- package/src/extractor/constants.ts +5 -0
- package/src/extractor/cs_postmessage.ts +136 -0
- package/src/extractor/customLocator.ts +1245 -0
- package/src/extractor/debug.ts +10 -0
- package/src/extractor/dom-util.ts +231 -0
- package/src/extractor/index.ts +50 -0
- package/src/extractor/locator.ts +469 -0
- package/src/extractor/tree.ts +179 -0
- package/src/extractor/util.ts +482 -0
- package/src/extractor/web-extractor.ts +617 -0
- package/src/img/box-select.ts +588 -0
- package/src/img/canvas-fallback.ts +393 -0
- package/src/img/get-photon.ts +108 -0
- package/src/img/get-sharp.ts +18 -0
- package/src/img/index.ts +27 -0
- package/src/img/info.ts +102 -0
- package/src/img/transform.ts +553 -0
- package/src/index.ts +1 -0
- package/src/key-alias-utils.ts +23 -0
- package/src/logger.ts +96 -0
- package/src/mcp/base-server.ts +500 -0
- package/src/mcp/base-tools.ts +391 -0
- package/src/mcp/chrome-path.ts +48 -0
- package/src/mcp/cli-report-session.ts +130 -0
- package/src/mcp/error-formatter.ts +52 -0
- package/src/mcp/index.ts +9 -0
- package/src/mcp/init-arg-utils.ts +105 -0
- package/src/mcp/inject-report-html-plugin.ts +119 -0
- package/src/mcp/launcher-helper.ts +200 -0
- package/src/mcp/tool-generator.ts +658 -0
- package/src/mcp/types.ts +131 -0
- package/src/node/fs.ts +84 -0
- package/src/node/index.ts +2 -0
- package/src/node/port.ts +37 -0
- package/src/polyfills/async-hooks.ts +6 -0
- package/src/polyfills/index.ts +4 -0
- package/src/types/index.ts +54 -0
- package/src/us-keyboard-layout.ts +723 -0
- package/src/utils.ts +149 -0
- package/src/zod-schema-utils.ts +133 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { initDebugConfig } from './init-debug';
|
|
2
|
+
import type { ModelConfigManager } from './model-config-manager';
|
|
3
|
+
import {
|
|
4
|
+
BOOLEAN_ENV_KEYS,
|
|
5
|
+
GLOBAL_ENV_KEYS,
|
|
6
|
+
NUMBER_ENV_KEYS,
|
|
7
|
+
STRING_ENV_KEYS,
|
|
8
|
+
} from './types';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
ALL_ENV_KEYS,
|
|
12
|
+
MATCH_BY_POSITION,
|
|
13
|
+
MODEL_ENV_KEYS,
|
|
14
|
+
type TGlobalConfig,
|
|
15
|
+
} from './types';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Collect global configs from process.env, overrideAIConfig, etc.
|
|
19
|
+
* And provider methods to get merged config value
|
|
20
|
+
*/
|
|
21
|
+
export class GlobalConfigManager {
|
|
22
|
+
private override:
|
|
23
|
+
| {
|
|
24
|
+
newConfig?: Partial<TGlobalConfig>;
|
|
25
|
+
extendMode?: boolean;
|
|
26
|
+
}
|
|
27
|
+
| undefined;
|
|
28
|
+
|
|
29
|
+
private keysHaveBeenRead: Record<string, boolean> = {};
|
|
30
|
+
|
|
31
|
+
private globalModelConfigManager: ModelConfigManager | undefined = undefined;
|
|
32
|
+
|
|
33
|
+
constructor() {
|
|
34
|
+
initDebugConfig();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* recalculate allEnvConfig every time because process.env can be updated any time
|
|
39
|
+
*/
|
|
40
|
+
public getAllEnvConfig() {
|
|
41
|
+
const envConfig = ALL_ENV_KEYS.reduce(
|
|
42
|
+
(p, name) => {
|
|
43
|
+
p[name] = process.env[name];
|
|
44
|
+
return p;
|
|
45
|
+
},
|
|
46
|
+
Object.create(null) as Record<string, string | undefined>,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (this.override) {
|
|
50
|
+
const { newConfig, extendMode } = this.override;
|
|
51
|
+
if (extendMode) {
|
|
52
|
+
return { ...envConfig, ...newConfig };
|
|
53
|
+
} else {
|
|
54
|
+
return { ...newConfig };
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
return envConfig;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
getEnvConfigValue(key: (typeof STRING_ENV_KEYS)[number]) {
|
|
62
|
+
const allConfig = this.getAllEnvConfig();
|
|
63
|
+
|
|
64
|
+
if (key === MATCH_BY_POSITION) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
'MATCH_BY_POSITION is discarded, use MIDSCENE_MODEL_FAMILY instead',
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!STRING_ENV_KEYS.includes(key)) {
|
|
71
|
+
throw new Error(`getEnvConfigValue with key ${key} is not supported.`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const value = allConfig[key];
|
|
75
|
+
this.keysHaveBeenRead[key] = true;
|
|
76
|
+
if (typeof value === 'string') {
|
|
77
|
+
return value.trim();
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* read boolean only from process.env
|
|
84
|
+
*/
|
|
85
|
+
getEnvConfigInBoolean(key: (typeof BOOLEAN_ENV_KEYS)[number]): boolean {
|
|
86
|
+
const allConfig = this.getAllEnvConfig();
|
|
87
|
+
|
|
88
|
+
if (!BOOLEAN_ENV_KEYS.includes(key)) {
|
|
89
|
+
throw new Error(`getEnvConfigInBoolean with key ${key} is not supported`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const value = allConfig[key];
|
|
93
|
+
this.keysHaveBeenRead[key] = true;
|
|
94
|
+
|
|
95
|
+
if (!value) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (/^(true|1)$/i.test(value)) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
if (/^(false|0)$/i.test(value)) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return !!value.trim();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Read environment variable value and convert it to number.
|
|
109
|
+
* Returns undefined if the value is not set or cannot be converted to a valid number.
|
|
110
|
+
*/
|
|
111
|
+
getEnvConfigValueAsNumber(
|
|
112
|
+
key: (typeof STRING_ENV_KEYS)[number] | (typeof NUMBER_ENV_KEYS)[number],
|
|
113
|
+
): number | undefined {
|
|
114
|
+
if (
|
|
115
|
+
!STRING_ENV_KEYS.includes(key as never) &&
|
|
116
|
+
!NUMBER_ENV_KEYS.includes(key as never)
|
|
117
|
+
) {
|
|
118
|
+
throw new Error(
|
|
119
|
+
`getEnvConfigValueAsNumber with key ${key} is not supported.`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const allConfig = this.getAllEnvConfig();
|
|
124
|
+
const value = allConfig[key];
|
|
125
|
+
this.keysHaveBeenRead[key] = true;
|
|
126
|
+
|
|
127
|
+
if (typeof value !== 'string') {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
const trimmed = value.trim();
|
|
131
|
+
if (!trimmed) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const numValue = Number(trimmed);
|
|
135
|
+
return Number.isNaN(numValue) ? undefined : numValue;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
registerModelConfigManager(globalModelConfigManager: ModelConfigManager) {
|
|
139
|
+
this.globalModelConfigManager = globalModelConfigManager;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @deprecated use the modelConfig param in Agent constructor instead
|
|
144
|
+
*/
|
|
145
|
+
overrideAIConfig(
|
|
146
|
+
newConfig: Partial<
|
|
147
|
+
Record<
|
|
148
|
+
(typeof GLOBAL_ENV_KEYS)[number] | (typeof MODEL_ENV_KEYS)[number],
|
|
149
|
+
string
|
|
150
|
+
>
|
|
151
|
+
>,
|
|
152
|
+
extendMode = false, // true: merge with global config, false: override global config
|
|
153
|
+
) {
|
|
154
|
+
for (const key in newConfig) {
|
|
155
|
+
if (![...GLOBAL_ENV_KEYS, ...MODEL_ENV_KEYS].includes(key as never)) {
|
|
156
|
+
throw new Error(`Failed to override AI config, invalid key: ${key}`);
|
|
157
|
+
}
|
|
158
|
+
const value = newConfig[key as keyof typeof newConfig];
|
|
159
|
+
if (typeof value !== 'string') {
|
|
160
|
+
throw new Error(
|
|
161
|
+
`Failed to override AI config, value for key ${key} must be a string, but got with type ${typeof value}`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
if (this.keysHaveBeenRead[key]) {
|
|
165
|
+
console.warn(
|
|
166
|
+
`Warning: try to override AI config with key ${key} ,but it has been read.`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const savedNewConfig = extendMode
|
|
171
|
+
? {
|
|
172
|
+
...this.override?.newConfig,
|
|
173
|
+
...newConfig,
|
|
174
|
+
}
|
|
175
|
+
: newConfig;
|
|
176
|
+
|
|
177
|
+
this.override = {
|
|
178
|
+
newConfig: {
|
|
179
|
+
...savedNewConfig,
|
|
180
|
+
},
|
|
181
|
+
extendMode,
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
if (!this.globalModelConfigManager) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
'globalModelConfigManager is not registered, which should not happen',
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
this.globalModelConfigManager.clearModelConfigMap();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { assert } from '../utils';
|
|
2
|
+
import type { IModelConfig } from './types';
|
|
3
|
+
|
|
4
|
+
const maskKey = (key: string, maskChar = '*') => {
|
|
5
|
+
if (typeof key !== 'string' || key.length === 0) {
|
|
6
|
+
return key;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const prefixLen = 3;
|
|
10
|
+
const suffixLen = 3;
|
|
11
|
+
const keepLength = prefixLen + suffixLen;
|
|
12
|
+
|
|
13
|
+
if (key.length <= keepLength) {
|
|
14
|
+
return key;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const prefix = key.substring(0, prefixLen);
|
|
18
|
+
const suffix = key.substring(key.length - suffixLen);
|
|
19
|
+
const maskLength = key.length - keepLength;
|
|
20
|
+
const mask = maskChar.repeat(maskLength);
|
|
21
|
+
|
|
22
|
+
return `${prefix}${mask}${suffix}`;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const maskConfig = (config: Record<string, unknown>) => {
|
|
26
|
+
return Object.fromEntries(
|
|
27
|
+
Object.entries(config).map(([key, value]) => {
|
|
28
|
+
if (!value) return [key, value];
|
|
29
|
+
|
|
30
|
+
if (typeof value === 'string' && /key/i.test(key)) {
|
|
31
|
+
return [key, maskKey(value)];
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === 'object') {
|
|
34
|
+
const valueStr = JSON.stringify(value);
|
|
35
|
+
if (/key/i.test(valueStr)) {
|
|
36
|
+
return [key, maskKey(valueStr)];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return [key, value];
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const parseJson = (key: string, value: string | undefined) => {
|
|
45
|
+
if (value) {
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(value);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Failed to parse ${key} as a JSON. ${(e as Error).message}`,
|
|
51
|
+
{
|
|
52
|
+
cause: e,
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
};
|
package/src/env/index.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { enableDebug } from '../logger';
|
|
2
|
+
import { getBasicEnvValue } from './basic';
|
|
3
|
+
import {
|
|
4
|
+
MIDSCENE_DEBUG_MODEL_PROFILE,
|
|
5
|
+
MIDSCENE_DEBUG_MODEL_RESPONSE,
|
|
6
|
+
} from './types';
|
|
7
|
+
|
|
8
|
+
export const initDebugConfig = () => {
|
|
9
|
+
const shouldPrintTiming = getBasicEnvValue(MIDSCENE_DEBUG_MODEL_PROFILE);
|
|
10
|
+
let debugConfig = '';
|
|
11
|
+
if (shouldPrintTiming) {
|
|
12
|
+
console.warn(
|
|
13
|
+
'MIDSCENE_DEBUG_MODEL_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead',
|
|
14
|
+
);
|
|
15
|
+
debugConfig = 'ai:profile';
|
|
16
|
+
}
|
|
17
|
+
const shouldPrintModelResponse = getBasicEnvValue(
|
|
18
|
+
MIDSCENE_DEBUG_MODEL_RESPONSE,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (shouldPrintModelResponse) {
|
|
22
|
+
console.warn(
|
|
23
|
+
'MIDSCENE_DEBUG_MODEL_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead',
|
|
24
|
+
);
|
|
25
|
+
if (debugConfig) {
|
|
26
|
+
debugConfig = 'ai:*';
|
|
27
|
+
} else {
|
|
28
|
+
debugConfig = 'ai:call';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (debugConfig) {
|
|
32
|
+
enableDebug(debugConfig);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { GlobalConfigManager } from './global-config-manager';
|
|
2
|
+
import { decideModelConfigFromIntentConfig } from './parse-model-config';
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
CreateOpenAIClientFn,
|
|
6
|
+
IModelConfig,
|
|
7
|
+
TIntent,
|
|
8
|
+
TModelConfig,
|
|
9
|
+
} from './types';
|
|
10
|
+
|
|
11
|
+
export class ModelConfigManager {
|
|
12
|
+
private modelConfigMap: Record<TIntent, IModelConfig> | undefined = undefined;
|
|
13
|
+
|
|
14
|
+
private isInitialized = false;
|
|
15
|
+
|
|
16
|
+
// once modelConfig is set, isolatedMode will be true
|
|
17
|
+
// modelConfigMap will only depend on provided config and not be affected by process.env
|
|
18
|
+
private isolatedMode = false;
|
|
19
|
+
|
|
20
|
+
private globalConfigManager: GlobalConfigManager | undefined = undefined;
|
|
21
|
+
|
|
22
|
+
private modelConfig?: TModelConfig;
|
|
23
|
+
private createOpenAIClientFn?: CreateOpenAIClientFn;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
modelConfig?: TModelConfig,
|
|
27
|
+
createOpenAIClientFn?: CreateOpenAIClientFn,
|
|
28
|
+
) {
|
|
29
|
+
this.modelConfig = modelConfig;
|
|
30
|
+
this.createOpenAIClientFn = createOpenAIClientFn;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private initialize() {
|
|
34
|
+
if (this.isInitialized) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let configMap: Record<string, string | undefined>;
|
|
39
|
+
if (this.modelConfig) {
|
|
40
|
+
this.isolatedMode = true;
|
|
41
|
+
configMap = this.normalizeModelConfig(this.modelConfig);
|
|
42
|
+
} else {
|
|
43
|
+
configMap = this.globalConfigManager?.getAllEnvConfig() || {};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const defaultConfig = decideModelConfigFromIntentConfig(
|
|
47
|
+
'default',
|
|
48
|
+
configMap,
|
|
49
|
+
);
|
|
50
|
+
if (!defaultConfig) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
'Model configuration is incomplete: model name (MIDSCENE_MODEL_NAME) is required. See https://midscenejs.com/model-strategy.html',
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const insightConfig = decideModelConfigFromIntentConfig(
|
|
57
|
+
'insight',
|
|
58
|
+
configMap,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const planningConfig = decideModelConfigFromIntentConfig(
|
|
62
|
+
'planning',
|
|
63
|
+
configMap,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
// Each intent uses its own timeout from parsed config (MIDSCENE_MODEL_TIMEOUT,
|
|
67
|
+
// MIDSCENE_INSIGHT_MODEL_TIMEOUT, MIDSCENE_PLANNING_MODEL_TIMEOUT).
|
|
68
|
+
this.modelConfigMap = {
|
|
69
|
+
default: {
|
|
70
|
+
...defaultConfig,
|
|
71
|
+
createOpenAIClient: this.createOpenAIClientFn,
|
|
72
|
+
},
|
|
73
|
+
insight: {
|
|
74
|
+
...(insightConfig || defaultConfig),
|
|
75
|
+
createOpenAIClient: this.createOpenAIClientFn,
|
|
76
|
+
},
|
|
77
|
+
planning: {
|
|
78
|
+
...(planningConfig || defaultConfig),
|
|
79
|
+
createOpenAIClient: this.createOpenAIClientFn,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
this.isInitialized = true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private normalizeModelConfig(
|
|
87
|
+
config: TModelConfig,
|
|
88
|
+
): Record<string, string | undefined> {
|
|
89
|
+
return Object.entries(config).reduce<Record<string, string | undefined>>(
|
|
90
|
+
(acc, [key, value]) => {
|
|
91
|
+
if (value === undefined || value === null) {
|
|
92
|
+
return acc;
|
|
93
|
+
}
|
|
94
|
+
acc[key] = String(value);
|
|
95
|
+
return acc;
|
|
96
|
+
},
|
|
97
|
+
Object.create(null),
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* should only be called by GlobalConfigManager
|
|
103
|
+
*/
|
|
104
|
+
clearModelConfigMap() {
|
|
105
|
+
if (this.isolatedMode) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'ModelConfigManager work in isolated mode, so clearModelConfigMap should not be called',
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
this.isInitialized = false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* if isolatedMode is true, modelConfigMap was initialized in constructor and can't be changed
|
|
115
|
+
* if isolatedMode is false, modelConfigMap can be changed by process.env so we need to recalculate it when it's undefined
|
|
116
|
+
*/
|
|
117
|
+
getModelConfig(intent: TIntent): IModelConfig {
|
|
118
|
+
// check if initialized
|
|
119
|
+
if (!this.isInitialized) {
|
|
120
|
+
this.initialize();
|
|
121
|
+
}
|
|
122
|
+
if (!this.modelConfigMap) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
'modelConfigMap is not initialized, which should not happen',
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return this.modelConfigMap[intent];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
getUploadTestServerUrl(): string | undefined {
|
|
131
|
+
const { openaiExtraConfig } = this.getModelConfig('default');
|
|
132
|
+
const serverUrl = openaiExtraConfig?.REPORT_SERVER_URL as string;
|
|
133
|
+
return serverUrl;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
registerGlobalConfigManager(globalConfigManager: GlobalConfigManager) {
|
|
137
|
+
this.globalConfigManager = globalConfigManager;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
throwErrorIfNonVLModel() {
|
|
141
|
+
const modelConfig = this.getModelConfig('default');
|
|
142
|
+
|
|
143
|
+
if (!modelConfig.modelFamily) {
|
|
144
|
+
throw new Error(
|
|
145
|
+
'MIDSCENE_MODEL_FAMILY is not set to a visual language model (VL model), the element localization can not be achieved. Check your model configuration. See https://midscenejs.com/model-strategy.html',
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|