@aiscene/shared 8.0.2 → 8.0.4
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/es/agent-tools/agent-behavior-init-args.mjs +44 -0
- package/dist/es/agent-tools/base-tools.mjs +163 -0
- package/dist/es/agent-tools/chrome-path.mjs +50 -0
- package/dist/es/agent-tools/cli-report-session.mjs +78 -0
- package/dist/es/agent-tools/error-formatter.mjs +106 -0
- package/dist/es/agent-tools/index.mjs +9 -0
- package/dist/es/agent-tools/init-arg-utils.mjs +38 -0
- package/dist/es/agent-tools/observation-artifact.mjs +5 -0
- package/dist/es/agent-tools/observation-record.mjs +248 -0
- package/dist/es/agent-tools/tool-defaults.mjs +54 -0
- package/dist/es/agent-tools/tool-generator.mjs +529 -0
- package/dist/es/agent-tools/types.mjs +3 -0
- package/dist/es/agent-tools/user-prompt.mjs +66 -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 +10 -40
- package/dist/es/cli/index.mjs +4 -2
- package/dist/es/cli/interrupt.mjs +116 -0
- package/dist/es/cli/record-command.mjs +130 -0
- package/dist/es/cli/screenshot-file.mjs +24 -0
- package/dist/es/cli/verbose-ai-act.mjs +230 -0
- package/dist/es/cli/verbose-screenshot.mjs +134 -0
- package/dist/es/cli/verbose.mjs +404 -0
- package/dist/es/constants/example-code.mjs +2 -2
- package/dist/es/constants/index.mjs +6 -1
- package/dist/es/env/model-config-manager.mjs +3 -0
- package/dist/es/env/parse-model-config.mjs +6 -1
- package/dist/es/env/types.mjs +4 -1
- package/dist/es/env/utils.mjs +1 -9
- package/dist/es/extractor/index.mjs +2 -2
- package/dist/es/img/index.mjs +2 -2
- package/dist/es/img/info.mjs +58 -17
- package/dist/es/img/photon-loader.mjs +4 -0
- package/dist/es/key-alias-utils.mjs +19 -0
- package/dist/es/mcp/base-server.mjs +10 -9
- package/dist/es/mcp/base-tools.mjs +72 -4
- 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 +2 -0
- package/dist/es/mcp/init-arg-utils.mjs +38 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs +1 -1
- package/dist/es/mcp/tool-generator.mjs +65 -17
- package/dist/es/node/fs.mjs +1 -1
- package/dist/es/recorder.mjs +249 -0
- package/dist/lib/agent-tools/agent-behavior-init-args.js +87 -0
- package/dist/lib/agent-tools/base-tools.js +197 -0
- package/dist/lib/agent-tools/chrome-path.js +87 -0
- package/dist/lib/agent-tools/cli-report-session.js +121 -0
- package/dist/lib/agent-tools/error-formatter.js +149 -0
- package/dist/lib/agent-tools/index.js +114 -0
- package/dist/lib/agent-tools/init-arg-utils.js +78 -0
- package/dist/lib/agent-tools/observation-artifact.js +42 -0
- package/dist/lib/agent-tools/observation-record.js +297 -0
- package/dist/lib/agent-tools/tool-defaults.js +97 -0
- package/dist/lib/agent-tools/tool-generator.js +569 -0
- package/dist/lib/agent-tools/types.js +40 -0
- package/dist/lib/agent-tools/user-prompt.js +103 -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 +19 -46
- package/dist/lib/cli/index.js +8 -3
- package/dist/lib/cli/interrupt.js +156 -0
- package/dist/lib/cli/record-command.js +164 -0
- package/dist/lib/cli/screenshot-file.js +58 -0
- package/dist/lib/cli/verbose-ai-act.js +273 -0
- package/dist/lib/cli/verbose-screenshot.js +177 -0
- package/dist/lib/cli/verbose.js +465 -0
- package/dist/lib/constants/example-code.js +2 -2
- package/dist/lib/constants/index.js +23 -3
- package/dist/lib/env/model-config-manager.js +3 -0
- package/dist/lib/env/parse-model-config.js +6 -1
- package/dist/lib/env/types.js +9 -0
- package/dist/lib/env/utils.js +0 -11
- package/dist/lib/extractor/index.js +3 -0
- package/dist/lib/img/index.js +3 -0
- package/dist/lib/img/info.js +65 -18
- package/dist/lib/img/photon-loader.js +38 -0
- package/dist/lib/key-alias-utils.js +62 -0
- package/dist/lib/mcp/base-server.js +11 -10
- package/dist/lib/mcp/base-tools.js +74 -6
- 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 +24 -10
- package/dist/lib/mcp/init-arg-utils.js +78 -0
- package/dist/lib/mcp/inject-report-html-plugin.js +1 -1
- package/dist/lib/mcp/tool-generator.js +74 -26
- package/dist/lib/node/fs.js +1 -1
- package/dist/lib/recorder.js +307 -0
- package/dist/types/agent-tools/agent-behavior-init-args.d.ts +17 -0
- package/dist/types/agent-tools/base-tools.d.ts +158 -0
- package/dist/types/agent-tools/chrome-path.d.ts +2 -0
- package/dist/types/agent-tools/cli-report-session.d.ts +12 -0
- package/dist/types/agent-tools/error-formatter.d.ts +30 -0
- package/dist/types/agent-tools/index.d.ts +9 -0
- package/dist/types/agent-tools/init-arg-utils.d.ts +13 -0
- package/dist/types/agent-tools/observation-artifact.d.ts +10 -0
- package/dist/types/agent-tools/observation-record.d.ts +38 -0
- package/dist/types/agent-tools/tool-defaults.d.ts +63 -0
- package/dist/types/agent-tools/tool-generator.d.ts +13 -0
- package/dist/types/agent-tools/types.d.ts +213 -0
- package/dist/types/agent-tools/user-prompt.d.ts +13 -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 +4 -7
- package/dist/types/cli/index.d.ts +3 -1
- package/dist/types/cli/interrupt.d.ts +49 -0
- package/dist/types/cli/record-command.d.ts +3 -0
- package/dist/types/cli/screenshot-file.d.ts +10 -0
- package/dist/types/cli/verbose-ai-act.d.ts +44 -0
- package/dist/types/cli/verbose-screenshot.d.ts +10 -0
- package/dist/types/cli/verbose.d.ts +40 -0
- package/dist/types/constants/example-code.d.ts +1 -1
- package/dist/types/constants/index.d.ts +5 -0
- package/dist/types/env/types.d.ts +14 -5
- package/dist/types/env/utils.d.ts +0 -31
- package/dist/types/extractor/index.d.ts +1 -1
- package/dist/types/img/index.d.ts +1 -1
- package/dist/types/img/info.d.ts +7 -0
- package/dist/types/img/photon-loader.d.ts +2 -0
- package/dist/types/key-alias-utils.d.ts +9 -0
- package/dist/types/mcp/base-tools.d.ts +74 -5
- 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 +2 -0
- package/dist/types/mcp/init-arg-utils.d.ts +13 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts +2 -2
- package/dist/types/mcp/launcher-helper.d.ts +3 -3
- package/dist/types/mcp/tool-generator.d.ts +3 -3
- package/dist/types/mcp/types.d.ts +10 -0
- package/dist/types/recorder.d.ts +113 -0
- package/package.json +1 -1
- package/src/agent-tools/agent-behavior-init-args.ts +109 -0
- package/src/agent-tools/base-tools.ts +399 -0
- package/src/agent-tools/chrome-path.ts +74 -0
- package/src/agent-tools/cli-report-session.ts +130 -0
- package/src/agent-tools/error-formatter.ts +177 -0
- package/src/agent-tools/index.ts +9 -0
- package/src/agent-tools/init-arg-utils.ts +105 -0
- package/src/agent-tools/observation-artifact.ts +29 -0
- package/src/agent-tools/observation-record.ts +331 -0
- package/src/agent-tools/tool-defaults.ts +119 -0
- package/src/agent-tools/tool-generator.ts +866 -0
- package/src/agent-tools/types.ts +250 -0
- package/src/agent-tools/user-prompt.ts +102 -0
- package/src/cli/cli-args.ts +173 -0
- package/src/cli/cli-error.ts +24 -0
- package/src/cli/cli-runner.ts +37 -56
- package/src/cli/index.ts +3 -7
- package/src/cli/interrupt.ts +207 -0
- package/src/cli/record-command.ts +177 -0
- package/src/cli/screenshot-file.ts +61 -0
- package/src/cli/verbose-ai-act.ts +387 -0
- package/src/cli/verbose-screenshot.ts +269 -0
- package/src/cli/verbose.ts +753 -0
- package/src/constants/example-code.ts +2 -2
- package/src/constants/index.ts +10 -0
- package/src/env/model-config-manager.ts +3 -0
- package/src/env/parse-model-config.ts +19 -1
- package/src/env/types.ts +13 -2
- package/src/env/utils.ts +0 -50
- package/src/extractor/index.ts +1 -1
- package/src/img/index.ts +14 -0
- package/src/img/info.ts +97 -45
- package/src/img/photon-loader.ts +5 -0
- package/src/img/transform.ts +261 -2
- package/src/key-alias-utils.ts +23 -0
- package/src/mcp/base-server.ts +10 -12
- package/src/mcp/base-tools.ts +218 -11
- package/src/mcp/cli-report-session.ts +130 -0
- package/src/mcp/error-formatter.ts +52 -0
- package/src/mcp/index.ts +2 -0
- package/src/mcp/init-arg-utils.ts +105 -0
- package/src/mcp/inject-report-html-plugin.ts +3 -3
- package/src/mcp/launcher-helper.ts +3 -3
- package/src/mcp/tool-generator.ts +98 -20
- package/src/mcp/types.ts +18 -1
- package/src/recorder.ts +625 -0
package/dist/lib/env/utils.js
CHANGED
|
@@ -27,7 +27,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
27
27
|
overrideAIConfig: ()=>overrideAIConfig,
|
|
28
28
|
globalModelConfigManager: ()=>globalModelConfigManager,
|
|
29
29
|
getPreferredLanguage: ()=>getPreferredLanguage,
|
|
30
|
-
getCurrentTime: ()=>getCurrentTime,
|
|
31
30
|
globalConfigManager: ()=>globalConfigManager
|
|
32
31
|
});
|
|
33
32
|
const external_global_config_manager_js_namespaceObject = require("./global-config-manager.js");
|
|
@@ -37,14 +36,6 @@ const globalModelConfigManager = new external_model_config_manager_js_namespaceO
|
|
|
37
36
|
const globalConfigManager = new external_global_config_manager_js_namespaceObject.GlobalConfigManager();
|
|
38
37
|
globalConfigManager.registerModelConfigManager(globalModelConfigManager);
|
|
39
38
|
globalModelConfigManager.registerGlobalConfigManager(globalConfigManager);
|
|
40
|
-
async function getCurrentTime(device, useDeviceTimestamp) {
|
|
41
|
-
if (useDeviceTimestamp && device?.getTimestamp) try {
|
|
42
|
-
return await device.getTimestamp();
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.warn(`Failed to get device time, falling back to system time: ${error}`);
|
|
45
|
-
}
|
|
46
|
-
return Date.now();
|
|
47
|
-
}
|
|
48
39
|
const getPreferredLanguage = ()=>{
|
|
49
40
|
const prefer = globalConfigManager.getEnvConfigValue(external_types_js_namespaceObject.MIDSCENE_PREFERRED_LANGUAGE);
|
|
50
41
|
if (prefer) return prefer;
|
|
@@ -55,13 +46,11 @@ const getPreferredLanguage = ()=>{
|
|
|
55
46
|
const overrideAIConfig = (newConfig, extendMode = false)=>{
|
|
56
47
|
globalConfigManager.overrideAIConfig(newConfig, extendMode);
|
|
57
48
|
};
|
|
58
|
-
exports.getCurrentTime = __webpack_exports__.getCurrentTime;
|
|
59
49
|
exports.getPreferredLanguage = __webpack_exports__.getPreferredLanguage;
|
|
60
50
|
exports.globalConfigManager = __webpack_exports__.globalConfigManager;
|
|
61
51
|
exports.globalModelConfigManager = __webpack_exports__.globalModelConfigManager;
|
|
62
52
|
exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
|
|
63
53
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
64
|
-
"getCurrentTime",
|
|
65
54
|
"getPreferredLanguage",
|
|
66
55
|
"globalConfigManager",
|
|
67
56
|
"globalModelConfigManager",
|
|
@@ -24,6 +24,7 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
generateElementByPoint: ()=>external_dom_util_js_namespaceObject.generateElementByPoint,
|
|
27
28
|
getNodeInfoByXpath: ()=>external_locator_js_namespaceObject.getNodeInfoByXpath,
|
|
28
29
|
getXpathsById: ()=>external_locator_js_namespaceObject.getXpathsById,
|
|
29
30
|
trimAttributes: ()=>external_tree_js_namespaceObject.trimAttributes,
|
|
@@ -45,6 +46,7 @@ const external_web_extractor_js_namespaceObject = require("./web-extractor.js");
|
|
|
45
46
|
const external_locator_js_namespaceObject = require("./locator.js");
|
|
46
47
|
const external_dom_util_js_namespaceObject = require("./dom-util.js");
|
|
47
48
|
exports.descriptionOfTree = __webpack_exports__.descriptionOfTree;
|
|
49
|
+
exports.generateElementByPoint = __webpack_exports__.generateElementByPoint;
|
|
48
50
|
exports.generateElementByRect = __webpack_exports__.generateElementByRect;
|
|
49
51
|
exports.getElementInfoByXpath = __webpack_exports__.getElementInfoByXpath;
|
|
50
52
|
exports.getElementXpath = __webpack_exports__.getElementXpath;
|
|
@@ -61,6 +63,7 @@ exports.webExtractNodeTreeAsString = __webpack_exports__.webExtractNodeTreeAsStr
|
|
|
61
63
|
exports.webExtractTextWithPosition = __webpack_exports__.webExtractTextWithPosition;
|
|
62
64
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
63
65
|
"descriptionOfTree",
|
|
66
|
+
"generateElementByPoint",
|
|
64
67
|
"generateElementByRect",
|
|
65
68
|
"getElementInfoByXpath",
|
|
66
69
|
"getElementXpath",
|
package/dist/lib/img/index.js
CHANGED
|
@@ -31,6 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
resizeImgBase64: ()=>external_transform_js_namespaceObject.resizeImgBase64,
|
|
32
32
|
saveBase64Image: ()=>external_transform_js_namespaceObject.saveBase64Image,
|
|
33
33
|
isValidImageBuffer: ()=>external_info_js_namespaceObject.isValidImageBuffer,
|
|
34
|
+
validateScreenshotBuffer: ()=>external_info_js_namespaceObject.validateScreenshotBuffer,
|
|
34
35
|
preProcessImageUrl: ()=>external_transform_js_namespaceObject.preProcessImageUrl,
|
|
35
36
|
annotateRects: ()=>external_box_select_js_namespaceObject.annotateRects,
|
|
36
37
|
compositeElementInfoImg: ()=>external_box_select_js_namespaceObject.compositeElementInfoImg,
|
|
@@ -65,6 +66,7 @@ exports.resizeAndConvertImgBuffer = __webpack_exports__.resizeAndConvertImgBuffe
|
|
|
65
66
|
exports.resizeImgBase64 = __webpack_exports__.resizeImgBase64;
|
|
66
67
|
exports.saveBase64Image = __webpack_exports__.saveBase64Image;
|
|
67
68
|
exports.scaleImage = __webpack_exports__.scaleImage;
|
|
69
|
+
exports.validateScreenshotBuffer = __webpack_exports__.validateScreenshotBuffer;
|
|
68
70
|
exports.zoomForGPT4o = __webpack_exports__.zoomForGPT4o;
|
|
69
71
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
70
72
|
"annotateRects",
|
|
@@ -85,6 +87,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
85
87
|
"resizeImgBase64",
|
|
86
88
|
"saveBase64Image",
|
|
87
89
|
"scaleImage",
|
|
90
|
+
"validateScreenshotBuffer",
|
|
88
91
|
"zoomForGPT4o"
|
|
89
92
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
90
93
|
Object.defineProperty(exports, '__esModule', {
|
package/dist/lib/img/info.js
CHANGED
|
@@ -33,8 +33,10 @@ var __webpack_require__ = {};
|
|
|
33
33
|
var __webpack_exports__ = {};
|
|
34
34
|
__webpack_require__.r(__webpack_exports__);
|
|
35
35
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
-
|
|
36
|
+
encodedImageInfoOfBuffer: ()=>encodedImageInfoOfBuffer,
|
|
37
37
|
isValidImageBuffer: ()=>isValidImageBuffer,
|
|
38
|
+
isValidPNGImageBuffer: ()=>isValidPNGImageBuffer,
|
|
39
|
+
validateScreenshotBuffer: ()=>validateScreenshotBuffer,
|
|
38
40
|
imageInfoOfBase64: ()=>imageInfoOfBase64,
|
|
39
41
|
isValidJPEGImageBuffer: ()=>isValidJPEGImageBuffer
|
|
40
42
|
});
|
|
@@ -42,28 +44,63 @@ const external_node_assert_namespaceObject = require("node:assert");
|
|
|
42
44
|
var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
|
|
43
45
|
const external_get_photon_js_namespaceObject = require("./get-photon.js");
|
|
44
46
|
var external_get_photon_js_default = /*#__PURE__*/ __webpack_require__.n(external_get_photon_js_namespaceObject);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
const isJpegStartOfFrameMarker = (marker)=>marker >= 0xc0 && marker <= 0xcf && 0xc4 !== marker && 0xc8 !== marker && 0xcc !== marker;
|
|
48
|
+
function jpegInfoFromBuffer(imageBuffer) {
|
|
49
|
+
let offset = 2;
|
|
50
|
+
while(offset < imageBuffer.length){
|
|
51
|
+
if (0xff !== imageBuffer[offset]) {
|
|
52
|
+
offset += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
while(offset < imageBuffer.length && 0xff === imageBuffer[offset])offset += 1;
|
|
56
|
+
if (offset >= imageBuffer.length) break;
|
|
57
|
+
const marker = imageBuffer[offset];
|
|
58
|
+
offset += 1;
|
|
59
|
+
if (0xd9 === marker || 0xda === marker) break;
|
|
60
|
+
if (0x01 === marker || 0xd8 === marker || marker >= 0xd0 && marker <= 0xd7) continue;
|
|
61
|
+
if (offset + 2 > imageBuffer.length) break;
|
|
62
|
+
const segmentLength = imageBuffer.readUInt16BE(offset);
|
|
63
|
+
if (segmentLength < 2 || offset + segmentLength > imageBuffer.length) break;
|
|
64
|
+
if (isJpegStartOfFrameMarker(marker)) {
|
|
65
|
+
if (segmentLength < 7) break;
|
|
66
|
+
const height = imageBuffer.readUInt16BE(offset + 3);
|
|
67
|
+
const width = imageBuffer.readUInt16BE(offset + 5);
|
|
68
|
+
external_node_assert_default()(width && height, 'Invalid image: cannot get width or height');
|
|
69
|
+
return {
|
|
70
|
+
width,
|
|
71
|
+
height
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
offset += segmentLength;
|
|
75
|
+
}
|
|
76
|
+
throw new Error('Invalid image: cannot get JPEG width or height');
|
|
77
|
+
}
|
|
78
|
+
function encodedImageInfoOfBuffer(imageBuffer) {
|
|
79
|
+
if (isValidPNGImageBuffer(imageBuffer)) {
|
|
80
|
+
const width = imageBuffer.readUInt32BE(16);
|
|
81
|
+
const height = imageBuffer.readUInt32BE(20);
|
|
58
82
|
external_node_assert_default()(width && height, 'Invalid image: cannot get width or height');
|
|
59
83
|
return {
|
|
60
84
|
width,
|
|
61
85
|
height
|
|
62
86
|
};
|
|
63
|
-
} catch (error) {
|
|
64
|
-
if (error instanceof Error && error.message.includes('unreachable')) throw new Error(`Failed to decode image: invalid or corrupted image data. Original error: ${error.message}`);
|
|
65
|
-
throw error;
|
|
66
87
|
}
|
|
88
|
+
if (isValidJPEGImageBuffer(imageBuffer)) return jpegInfoFromBuffer(imageBuffer);
|
|
89
|
+
throw new Error('Invalid image: unsupported format');
|
|
90
|
+
}
|
|
91
|
+
async function imageInfoOfBase64(imageBase64) {
|
|
92
|
+
const { PhotonImage } = await external_get_photon_js_default()();
|
|
93
|
+
const base64Data = imageBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
94
|
+
const result = PhotonImage.new_from_base64(base64Data);
|
|
95
|
+
const image = result instanceof Promise ? await result : result;
|
|
96
|
+
const width = image.get_width();
|
|
97
|
+
const height = image.get_height();
|
|
98
|
+
image.free();
|
|
99
|
+
external_node_assert_default()(width && height, 'Invalid image: cannot get width or height');
|
|
100
|
+
return {
|
|
101
|
+
width,
|
|
102
|
+
height
|
|
103
|
+
};
|
|
67
104
|
}
|
|
68
105
|
function isValidPNGImageBuffer(buffer) {
|
|
69
106
|
if (!buffer || buffer.length < 8) return false;
|
|
@@ -77,15 +114,25 @@ function isValidJPEGImageBuffer(buffer) {
|
|
|
77
114
|
function isValidImageBuffer(buffer) {
|
|
78
115
|
return isValidPNGImageBuffer(buffer) || isValidJPEGImageBuffer(buffer);
|
|
79
116
|
}
|
|
117
|
+
function validateScreenshotBuffer(screenshotBuffer, { label, minBufferSize = 0 }) {
|
|
118
|
+
const bufferSize = screenshotBuffer?.length ?? 0;
|
|
119
|
+
if (!screenshotBuffer || 0 === bufferSize) throw new Error(`${label} validation failed: buffer size ${bufferSize} bytes`);
|
|
120
|
+
if (!isValidImageBuffer(screenshotBuffer)) throw new Error(`${label} buffer has invalid image format`);
|
|
121
|
+
if (minBufferSize > 0 && bufferSize < minBufferSize) throw new Error(`${label} validation failed: buffer size ${bufferSize} bytes (minimum: ${minBufferSize})`);
|
|
122
|
+
}
|
|
123
|
+
exports.encodedImageInfoOfBuffer = __webpack_exports__.encodedImageInfoOfBuffer;
|
|
80
124
|
exports.imageInfoOfBase64 = __webpack_exports__.imageInfoOfBase64;
|
|
81
125
|
exports.isValidImageBuffer = __webpack_exports__.isValidImageBuffer;
|
|
82
126
|
exports.isValidJPEGImageBuffer = __webpack_exports__.isValidJPEGImageBuffer;
|
|
83
127
|
exports.isValidPNGImageBuffer = __webpack_exports__.isValidPNGImageBuffer;
|
|
128
|
+
exports.validateScreenshotBuffer = __webpack_exports__.validateScreenshotBuffer;
|
|
84
129
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
130
|
+
"encodedImageInfoOfBuffer",
|
|
85
131
|
"imageInfoOfBase64",
|
|
86
132
|
"isValidImageBuffer",
|
|
87
133
|
"isValidJPEGImageBuffer",
|
|
88
|
-
"isValidPNGImageBuffer"
|
|
134
|
+
"isValidPNGImageBuffer",
|
|
135
|
+
"validateScreenshotBuffer"
|
|
89
136
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
90
137
|
Object.defineProperty(exports, '__esModule', {
|
|
91
138
|
value: true
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
loadPhotonModule: ()=>loadPhotonModule
|
|
28
|
+
});
|
|
29
|
+
async function loadPhotonModule() {
|
|
30
|
+
return import("@silvia-odwyer/photon");
|
|
31
|
+
}
|
|
32
|
+
exports.loadPhotonModule = __webpack_exports__.loadPhotonModule;
|
|
33
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
34
|
+
"loadPhotonModule"
|
|
35
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
36
|
+
Object.defineProperty(exports, '__esModule', {
|
|
37
|
+
value: true
|
|
38
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
camelToKebab: ()=>camelToKebab,
|
|
28
|
+
getKeyAliases: ()=>getKeyAliases,
|
|
29
|
+
isRecord: ()=>isRecord,
|
|
30
|
+
kebabToCamel: ()=>kebabToCamel
|
|
31
|
+
});
|
|
32
|
+
function kebabToCamel(str) {
|
|
33
|
+
return str.replace(/-([a-z])/g, (_, letter)=>letter.toUpperCase());
|
|
34
|
+
}
|
|
35
|
+
function camelToKebab(str) {
|
|
36
|
+
return str.replace(/[A-Z]/g, (letter)=>`-${letter.toLowerCase()}`).replace(/^-/, '');
|
|
37
|
+
}
|
|
38
|
+
function getKeyAliases(key) {
|
|
39
|
+
return [
|
|
40
|
+
...new Set([
|
|
41
|
+
key,
|
|
42
|
+
kebabToCamel(key),
|
|
43
|
+
camelToKebab(key)
|
|
44
|
+
])
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
function isRecord(value) {
|
|
48
|
+
return 'object' == typeof value && null !== value && !Array.isArray(value);
|
|
49
|
+
}
|
|
50
|
+
exports.camelToKebab = __webpack_exports__.camelToKebab;
|
|
51
|
+
exports.getKeyAliases = __webpack_exports__.getKeyAliases;
|
|
52
|
+
exports.isRecord = __webpack_exports__.isRecord;
|
|
53
|
+
exports.kebabToCamel = __webpack_exports__.kebabToCamel;
|
|
54
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
55
|
+
"camelToKebab",
|
|
56
|
+
"getKeyAliases",
|
|
57
|
+
"isRecord",
|
|
58
|
+
"kebabToCamel"
|
|
59
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
60
|
+
Object.defineProperty(exports, '__esModule', {
|
|
61
|
+
value: true
|
|
62
|
+
});
|
|
@@ -38,12 +38,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
38
38
|
BaseMCPServer: ()=>BaseMCPServer
|
|
39
39
|
});
|
|
40
40
|
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
41
|
+
const utils_namespaceObject = require("@aiscene/shared/utils");
|
|
41
42
|
const mcp_js_namespaceObject = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
42
43
|
const stdio_js_namespaceObject = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
43
44
|
const streamableHttp_js_namespaceObject = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
44
45
|
const external_express_namespaceObject = require("express");
|
|
45
46
|
var external_express_default = /*#__PURE__*/ __webpack_require__.n(external_express_namespaceObject);
|
|
46
|
-
const
|
|
47
|
+
const external_error_formatter_js_namespaceObject = require("./error-formatter.js");
|
|
47
48
|
function _define_property(obj, key, value) {
|
|
48
49
|
if (key in obj) Object.defineProperty(obj, key, {
|
|
49
50
|
value: value,
|
|
@@ -80,12 +81,12 @@ const CLEANUP_INTERVAL_MS = 300000;
|
|
|
80
81
|
const MAX_SESSIONS = 100;
|
|
81
82
|
class BaseMCPServer {
|
|
82
83
|
async initializeToolsManager() {
|
|
83
|
-
(0,
|
|
84
|
+
(0, utils_namespaceObject.setIsMcp)(true);
|
|
84
85
|
this.toolsManager = this.providedToolsManager || this.createToolsManager();
|
|
85
86
|
try {
|
|
86
87
|
await this.toolsManager.initTools();
|
|
87
88
|
} catch (error) {
|
|
88
|
-
const message =
|
|
89
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
89
90
|
console.error(`Failed to initialize tools: ${message}`);
|
|
90
91
|
console.error('Tools will be initialized on first use');
|
|
91
92
|
}
|
|
@@ -111,7 +112,7 @@ class BaseMCPServer {
|
|
|
111
112
|
try {
|
|
112
113
|
await this.mcpServer.connect(transport);
|
|
113
114
|
} catch (error) {
|
|
114
|
-
const message =
|
|
115
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
115
116
|
console.error(`Failed to connect MCP stdio transport: ${message}`);
|
|
116
117
|
throw new Error(`Failed to initialize MCP stdio transport: ${message}`);
|
|
117
118
|
}
|
|
@@ -182,7 +183,7 @@ class BaseMCPServer {
|
|
|
182
183
|
});
|
|
183
184
|
}
|
|
184
185
|
} catch (error) {
|
|
185
|
-
const message =
|
|
186
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
186
187
|
const duration = Date.now() - startTime;
|
|
187
188
|
console.error(`[${new Date().toISOString()}] [${requestId}] MCP request error after ${duration}ms: ${message}`);
|
|
188
189
|
if (!res.headersSent) res.status(500).json({
|
|
@@ -210,7 +211,7 @@ class BaseMCPServer {
|
|
|
210
211
|
for (const session of sessions.values())try {
|
|
211
212
|
await session.transport.close();
|
|
212
213
|
} catch (error) {
|
|
213
|
-
const message =
|
|
214
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
214
215
|
console.error(`Failed to close session ${session.transport.sessionId}: ${message}`);
|
|
215
216
|
}
|
|
216
217
|
sessions.clear();
|
|
@@ -245,7 +246,7 @@ class BaseMCPServer {
|
|
|
245
246
|
try {
|
|
246
247
|
await this.mcpServer.connect(transport);
|
|
247
248
|
} catch (error) {
|
|
248
|
-
const message =
|
|
249
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
249
250
|
console.error(`[${new Date().toISOString()}] Failed to connect MCP transport: ${message}`);
|
|
250
251
|
if (transport.sessionId) sessions.delete(transport.sessionId);
|
|
251
252
|
throw new Error(`Failed to initialize MCP session: ${message}`);
|
|
@@ -264,7 +265,7 @@ class BaseMCPServer {
|
|
|
264
265
|
sessions.delete(sid);
|
|
265
266
|
console.log(`[${new Date().toISOString()}] Session ${sid} cleaned up due to inactivity (remaining: ${sessions.size})`);
|
|
266
267
|
} catch (error) {
|
|
267
|
-
const message =
|
|
268
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
268
269
|
console.error(`[${new Date().toISOString()}] Failed to close session ${sid} during cleanup: ${message}`);
|
|
269
270
|
sessions.delete(sid);
|
|
270
271
|
}
|
|
@@ -277,7 +278,7 @@ class BaseMCPServer {
|
|
|
277
278
|
for (const session of sessions.values())try {
|
|
278
279
|
session.transport.close();
|
|
279
280
|
} catch (error) {
|
|
280
|
-
const message =
|
|
281
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
281
282
|
console.error(`Error closing session during shutdown: ${message}`);
|
|
282
283
|
}
|
|
283
284
|
sessions.clear();
|
|
@@ -290,7 +291,7 @@ class BaseMCPServer {
|
|
|
290
291
|
this.performCleanup().finally(()=>process.exit(1));
|
|
291
292
|
}, 5000);
|
|
292
293
|
} catch (error) {
|
|
293
|
-
const message =
|
|
294
|
+
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
294
295
|
console.error(`Error closing HTTP server: ${message}`);
|
|
295
296
|
this.performCleanup().finally(()=>process.exit(1));
|
|
296
297
|
}
|
|
@@ -26,8 +26,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
27
|
BaseMidsceneTools: ()=>BaseMidsceneTools
|
|
28
28
|
});
|
|
29
|
-
const
|
|
30
|
-
const
|
|
29
|
+
const img_namespaceObject = require("@aiscene/shared/img");
|
|
30
|
+
const logger_namespaceObject = require("@aiscene/shared/logger");
|
|
31
|
+
const external_key_alias_utils_js_namespaceObject = require("../key-alias-utils.js");
|
|
32
|
+
const external_cli_report_session_js_namespaceObject = require("./cli-report-session.js");
|
|
33
|
+
const external_init_arg_utils_js_namespaceObject = require("./init-arg-utils.js");
|
|
31
34
|
const external_tool_generator_js_namespaceObject = require("./tool-generator.js");
|
|
32
35
|
function _define_property(obj, key, value) {
|
|
33
36
|
if (key in obj) Object.defineProperty(obj, key, {
|
|
@@ -39,11 +42,76 @@ function _define_property(obj, key, value) {
|
|
|
39
42
|
else obj[key] = value;
|
|
40
43
|
return obj;
|
|
41
44
|
}
|
|
42
|
-
const debug = (0,
|
|
45
|
+
const debug = (0, logger_namespaceObject.getDebug)('mcp:base-tools');
|
|
43
46
|
class BaseMidsceneTools {
|
|
47
|
+
getInitArgKeys() {
|
|
48
|
+
return this.initArgSpec ? Object.keys(this.initArgSpec.shape) : [];
|
|
49
|
+
}
|
|
50
|
+
extractAgentInitParam(args) {
|
|
51
|
+
if (!this.initArgSpec) return;
|
|
52
|
+
const extracted = (0, external_init_arg_utils_js_namespaceObject.extractNamespacedArgs)(args, this.initArgSpec.namespace, this.getInitArgKeys());
|
|
53
|
+
if (this.initArgSpec.adapt) return this.initArgSpec.adapt(extracted);
|
|
54
|
+
return extracted;
|
|
55
|
+
}
|
|
56
|
+
sanitizeToolArgs(args) {
|
|
57
|
+
if (!this.initArgSpec) return args;
|
|
58
|
+
return (0, external_init_arg_utils_js_namespaceObject.sanitizeNamespacedArgs)(args, this.initArgSpec.namespace, this.getInitArgKeys());
|
|
59
|
+
}
|
|
60
|
+
getAgentInitArgSchema() {
|
|
61
|
+
if (!this.initArgSpec) return {};
|
|
62
|
+
return (0, external_init_arg_utils_js_namespaceObject.createNamespacedInitArgSchema)(this.initArgSpec.namespace, this.initArgSpec.shape);
|
|
63
|
+
}
|
|
64
|
+
getAgentInitArgCliMetadata() {
|
|
65
|
+
if (!this.initArgSpec?.cli) return;
|
|
66
|
+
const options = Object.fromEntries(this.getInitArgKeys().map((key)=>{
|
|
67
|
+
const canonicalKey = `${this.initArgSpec.namespace}.${key}`;
|
|
68
|
+
const preferredName = this.initArgSpec.cli?.preferredNames?.[key] ?? (this.initArgSpec.cli?.preferBareKeys ? (0, external_key_alias_utils_js_namespaceObject.camelToKebab)(key) : canonicalKey);
|
|
69
|
+
const acceptedNames = new Set([
|
|
70
|
+
preferredName,
|
|
71
|
+
...this.initArgSpec.cli?.preferBareKeys ? (0, external_key_alias_utils_js_namespaceObject.getKeyAliases)(key) : (0, external_key_alias_utils_js_namespaceObject.getKeyAliases)(canonicalKey)
|
|
72
|
+
]);
|
|
73
|
+
acceptedNames.delete(preferredName);
|
|
74
|
+
return [
|
|
75
|
+
canonicalKey,
|
|
76
|
+
{
|
|
77
|
+
preferredName,
|
|
78
|
+
aliases: [
|
|
79
|
+
...acceptedNames
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
}));
|
|
84
|
+
return {
|
|
85
|
+
options
|
|
86
|
+
};
|
|
87
|
+
}
|
|
44
88
|
preparePlatformTools() {
|
|
45
89
|
return [];
|
|
46
90
|
}
|
|
91
|
+
getCliReportSessionName() {}
|
|
92
|
+
createNewCliReportSession(targetIdentity) {
|
|
93
|
+
const sessionName = this.getCliReportSessionName();
|
|
94
|
+
if (!sessionName) return;
|
|
95
|
+
return (0, external_cli_report_session_js_namespaceObject.generateCliReportSession)(sessionName, targetIdentity);
|
|
96
|
+
}
|
|
97
|
+
commitCliReportSession(session) {
|
|
98
|
+
if (session) (0, external_cli_report_session_js_namespaceObject.writeCliReportSession)(session);
|
|
99
|
+
}
|
|
100
|
+
readCliReportFileName() {
|
|
101
|
+
const sessionName = this.getCliReportSessionName();
|
|
102
|
+
if (!sessionName) return;
|
|
103
|
+
return (0, external_cli_report_session_js_namespaceObject.readCliReportSession)(sessionName)?.reportFileName;
|
|
104
|
+
}
|
|
105
|
+
readCliReportAgentOptions() {
|
|
106
|
+
const reportFileName = this.readCliReportFileName();
|
|
107
|
+
if (!reportFileName) return;
|
|
108
|
+
return {
|
|
109
|
+
reportFileName,
|
|
110
|
+
reportAttributes: {
|
|
111
|
+
'data-group-id': reportFileName
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
47
115
|
async initTools() {
|
|
48
116
|
this.toolDefinitions = [];
|
|
49
117
|
const platformTools = this.preparePlatformTools();
|
|
@@ -58,8 +126,8 @@ class BaseMidsceneTools {
|
|
|
58
126
|
await tempDevice.destroy?.();
|
|
59
127
|
debug('Action space from temporary device:', actionSpace.map((a)=>a.name).join(', '));
|
|
60
128
|
}
|
|
61
|
-
const actionTools = (0, external_tool_generator_js_namespaceObject.generateToolsFromActionSpace)(actionSpace, ()=>this.ensureAgent());
|
|
62
|
-
const commonTools = (0, external_tool_generator_js_namespaceObject.generateCommonTools)(()=>this.ensureAgent());
|
|
129
|
+
const actionTools = (0, external_tool_generator_js_namespaceObject.generateToolsFromActionSpace)(actionSpace, (args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), (args = {})=>this.sanitizeToolArgs(args), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
|
|
130
|
+
const commonTools = (0, external_tool_generator_js_namespaceObject.generateCommonTools)((args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
|
|
63
131
|
this.toolDefinitions.push(...actionTools, ...commonTools);
|
|
64
132
|
debug('Total tools prepared:', this.toolDefinitions.length);
|
|
65
133
|
}
|
|
@@ -79,7 +147,7 @@ class BaseMidsceneTools {
|
|
|
79
147
|
this.agent = agent;
|
|
80
148
|
}
|
|
81
149
|
buildScreenshotContent(screenshot) {
|
|
82
|
-
const { mimeType, body } = (0,
|
|
150
|
+
const { mimeType, body } = (0, img_namespaceObject.parseBase64)(screenshot);
|
|
83
151
|
return [
|
|
84
152
|
{
|
|
85
153
|
type: 'image',
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
createCliReportSession: ()=>createCliReportSession,
|
|
28
|
+
generateCliReportSession: ()=>generateCliReportSession,
|
|
29
|
+
readCliReportSession: ()=>readCliReportSession,
|
|
30
|
+
writeCliReportSession: ()=>writeCliReportSession
|
|
31
|
+
});
|
|
32
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
33
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
34
|
+
const external_common_js_namespaceObject = require("../common.js");
|
|
35
|
+
const sessionDirName = 'cli-report-session';
|
|
36
|
+
function sanitizeSessionName(sessionName) {
|
|
37
|
+
return sessionName.replace(/[^a-zA-Z0-9._-]/g, '_') || 'default';
|
|
38
|
+
}
|
|
39
|
+
function sanitizeFileSegment(segment) {
|
|
40
|
+
const sanitized = segment.replace(/[^a-zA-Z0-9._-]/g, '_') || 'unknown';
|
|
41
|
+
return sanitized.slice(0, 80);
|
|
42
|
+
}
|
|
43
|
+
function ensureHtmlFileName(reportFileName) {
|
|
44
|
+
return reportFileName.endsWith('.html') ? reportFileName : `${reportFileName}.html`;
|
|
45
|
+
}
|
|
46
|
+
function formatDateForFileName(date) {
|
|
47
|
+
const pad = (value)=>String(value).padStart(2, '0');
|
|
48
|
+
const day = [
|
|
49
|
+
date.getFullYear(),
|
|
50
|
+
pad(date.getMonth() + 1),
|
|
51
|
+
pad(date.getDate())
|
|
52
|
+
].join('-');
|
|
53
|
+
const time = [
|
|
54
|
+
pad(date.getHours()),
|
|
55
|
+
pad(date.getMinutes()),
|
|
56
|
+
pad(date.getSeconds())
|
|
57
|
+
].join('-');
|
|
58
|
+
return `${day}_${time}`;
|
|
59
|
+
}
|
|
60
|
+
function randomId() {
|
|
61
|
+
return Math.random().toString(36).slice(2, 10);
|
|
62
|
+
}
|
|
63
|
+
function getCliReportSessionDir() {
|
|
64
|
+
const dir = (0, external_node_path_namespaceObject.join)((0, external_common_js_namespaceObject.getMidsceneRunBaseDir)(), sessionDirName);
|
|
65
|
+
if (!(0, external_node_fs_namespaceObject.existsSync)(dir)) (0, external_node_fs_namespaceObject.mkdirSync)(dir, {
|
|
66
|
+
recursive: true
|
|
67
|
+
});
|
|
68
|
+
return dir;
|
|
69
|
+
}
|
|
70
|
+
function getCliReportSessionPath(sessionName) {
|
|
71
|
+
return (0, external_node_path_namespaceObject.join)(getCliReportSessionDir(), `${sanitizeSessionName(sessionName)}.json`);
|
|
72
|
+
}
|
|
73
|
+
function generateCliReportSession(sessionName, targetIdentity) {
|
|
74
|
+
const identitySegment = targetIdentity ? `-${sanitizeFileSegment(targetIdentity)}` : '';
|
|
75
|
+
const reportFileName = `${sanitizeSessionName(sessionName)}${identitySegment}-${formatDateForFileName(new Date())}-${randomId()}`;
|
|
76
|
+
const reportPath = (0, external_node_path_namespaceObject.join)((0, external_common_js_namespaceObject.getMidsceneRunSubDir)('report'), ensureHtmlFileName(reportFileName));
|
|
77
|
+
const session = {
|
|
78
|
+
version: 1,
|
|
79
|
+
sessionName,
|
|
80
|
+
...targetIdentity ? {
|
|
81
|
+
targetIdentity
|
|
82
|
+
} : {},
|
|
83
|
+
reportFileName,
|
|
84
|
+
reportPath,
|
|
85
|
+
createdAt: Date.now()
|
|
86
|
+
};
|
|
87
|
+
return session;
|
|
88
|
+
}
|
|
89
|
+
function writeCliReportSession(session) {
|
|
90
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(getCliReportSessionPath(session.sessionName), JSON.stringify(session, null, 2), 'utf-8');
|
|
91
|
+
}
|
|
92
|
+
function createCliReportSession(sessionName, targetIdentity) {
|
|
93
|
+
const session = generateCliReportSession(sessionName, targetIdentity);
|
|
94
|
+
writeCliReportSession(session);
|
|
95
|
+
return session;
|
|
96
|
+
}
|
|
97
|
+
function readCliReportSession(sessionName) {
|
|
98
|
+
const sessionPath = getCliReportSessionPath(sessionName);
|
|
99
|
+
if (!(0, external_node_fs_namespaceObject.existsSync)(sessionPath)) return;
|
|
100
|
+
try {
|
|
101
|
+
const raw = (0, external_node_fs_namespaceObject.readFileSync)(sessionPath, 'utf-8');
|
|
102
|
+
const parsed = JSON.parse(raw);
|
|
103
|
+
if (1 !== parsed.version || parsed.sessionName !== sessionName || 'string' != typeof parsed.reportFileName || !parsed.reportFileName.trim() || /[\\/]/.test(parsed.reportFileName)) return;
|
|
104
|
+
return parsed;
|
|
105
|
+
} catch {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.createCliReportSession = __webpack_exports__.createCliReportSession;
|
|
110
|
+
exports.generateCliReportSession = __webpack_exports__.generateCliReportSession;
|
|
111
|
+
exports.readCliReportSession = __webpack_exports__.readCliReportSession;
|
|
112
|
+
exports.writeCliReportSession = __webpack_exports__.writeCliReportSession;
|
|
113
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
114
|
+
"createCliReportSession",
|
|
115
|
+
"generateCliReportSession",
|
|
116
|
+
"readCliReportSession",
|
|
117
|
+
"writeCliReportSession"
|
|
118
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
119
|
+
Object.defineProperty(exports, '__esModule', {
|
|
120
|
+
value: true
|
|
121
|
+
});
|