@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.
Files changed (177) hide show
  1. package/dist/es/agent-tools/agent-behavior-init-args.mjs +44 -0
  2. package/dist/es/agent-tools/base-tools.mjs +163 -0
  3. package/dist/es/agent-tools/chrome-path.mjs +50 -0
  4. package/dist/es/agent-tools/cli-report-session.mjs +78 -0
  5. package/dist/es/agent-tools/error-formatter.mjs +106 -0
  6. package/dist/es/agent-tools/index.mjs +9 -0
  7. package/dist/es/agent-tools/init-arg-utils.mjs +38 -0
  8. package/dist/es/agent-tools/observation-artifact.mjs +5 -0
  9. package/dist/es/agent-tools/observation-record.mjs +248 -0
  10. package/dist/es/agent-tools/tool-defaults.mjs +54 -0
  11. package/dist/es/agent-tools/tool-generator.mjs +529 -0
  12. package/dist/es/agent-tools/types.mjs +3 -0
  13. package/dist/es/agent-tools/user-prompt.mjs +66 -0
  14. package/dist/es/cli/cli-args.mjs +95 -0
  15. package/dist/es/cli/cli-error.mjs +24 -0
  16. package/dist/es/cli/cli-runner.mjs +10 -40
  17. package/dist/es/cli/index.mjs +4 -2
  18. package/dist/es/cli/interrupt.mjs +116 -0
  19. package/dist/es/cli/record-command.mjs +130 -0
  20. package/dist/es/cli/screenshot-file.mjs +24 -0
  21. package/dist/es/cli/verbose-ai-act.mjs +230 -0
  22. package/dist/es/cli/verbose-screenshot.mjs +134 -0
  23. package/dist/es/cli/verbose.mjs +404 -0
  24. package/dist/es/constants/example-code.mjs +2 -2
  25. package/dist/es/constants/index.mjs +6 -1
  26. package/dist/es/env/model-config-manager.mjs +3 -0
  27. package/dist/es/env/parse-model-config.mjs +6 -1
  28. package/dist/es/env/types.mjs +4 -1
  29. package/dist/es/env/utils.mjs +1 -9
  30. package/dist/es/extractor/index.mjs +2 -2
  31. package/dist/es/img/index.mjs +2 -2
  32. package/dist/es/img/info.mjs +58 -17
  33. package/dist/es/img/photon-loader.mjs +4 -0
  34. package/dist/es/key-alias-utils.mjs +19 -0
  35. package/dist/es/mcp/base-server.mjs +10 -9
  36. package/dist/es/mcp/base-tools.mjs +72 -4
  37. package/dist/es/mcp/cli-report-session.mjs +78 -0
  38. package/dist/es/mcp/error-formatter.mjs +19 -0
  39. package/dist/es/mcp/index.mjs +2 -0
  40. package/dist/es/mcp/init-arg-utils.mjs +38 -0
  41. package/dist/es/mcp/inject-report-html-plugin.mjs +1 -1
  42. package/dist/es/mcp/tool-generator.mjs +65 -17
  43. package/dist/es/node/fs.mjs +1 -1
  44. package/dist/es/recorder.mjs +249 -0
  45. package/dist/lib/agent-tools/agent-behavior-init-args.js +87 -0
  46. package/dist/lib/agent-tools/base-tools.js +197 -0
  47. package/dist/lib/agent-tools/chrome-path.js +87 -0
  48. package/dist/lib/agent-tools/cli-report-session.js +121 -0
  49. package/dist/lib/agent-tools/error-formatter.js +149 -0
  50. package/dist/lib/agent-tools/index.js +114 -0
  51. package/dist/lib/agent-tools/init-arg-utils.js +78 -0
  52. package/dist/lib/agent-tools/observation-artifact.js +42 -0
  53. package/dist/lib/agent-tools/observation-record.js +297 -0
  54. package/dist/lib/agent-tools/tool-defaults.js +97 -0
  55. package/dist/lib/agent-tools/tool-generator.js +569 -0
  56. package/dist/lib/agent-tools/types.js +40 -0
  57. package/dist/lib/agent-tools/user-prompt.js +103 -0
  58. package/dist/lib/cli/cli-args.js +138 -0
  59. package/dist/lib/cli/cli-error.js +61 -0
  60. package/dist/lib/cli/cli-runner.js +19 -46
  61. package/dist/lib/cli/index.js +8 -3
  62. package/dist/lib/cli/interrupt.js +156 -0
  63. package/dist/lib/cli/record-command.js +164 -0
  64. package/dist/lib/cli/screenshot-file.js +58 -0
  65. package/dist/lib/cli/verbose-ai-act.js +273 -0
  66. package/dist/lib/cli/verbose-screenshot.js +177 -0
  67. package/dist/lib/cli/verbose.js +465 -0
  68. package/dist/lib/constants/example-code.js +2 -2
  69. package/dist/lib/constants/index.js +23 -3
  70. package/dist/lib/env/model-config-manager.js +3 -0
  71. package/dist/lib/env/parse-model-config.js +6 -1
  72. package/dist/lib/env/types.js +9 -0
  73. package/dist/lib/env/utils.js +0 -11
  74. package/dist/lib/extractor/index.js +3 -0
  75. package/dist/lib/img/index.js +3 -0
  76. package/dist/lib/img/info.js +65 -18
  77. package/dist/lib/img/photon-loader.js +38 -0
  78. package/dist/lib/key-alias-utils.js +62 -0
  79. package/dist/lib/mcp/base-server.js +11 -10
  80. package/dist/lib/mcp/base-tools.js +74 -6
  81. package/dist/lib/mcp/cli-report-session.js +121 -0
  82. package/dist/lib/mcp/error-formatter.js +53 -0
  83. package/dist/lib/mcp/index.js +24 -10
  84. package/dist/lib/mcp/init-arg-utils.js +78 -0
  85. package/dist/lib/mcp/inject-report-html-plugin.js +1 -1
  86. package/dist/lib/mcp/tool-generator.js +74 -26
  87. package/dist/lib/node/fs.js +1 -1
  88. package/dist/lib/recorder.js +307 -0
  89. package/dist/types/agent-tools/agent-behavior-init-args.d.ts +17 -0
  90. package/dist/types/agent-tools/base-tools.d.ts +158 -0
  91. package/dist/types/agent-tools/chrome-path.d.ts +2 -0
  92. package/dist/types/agent-tools/cli-report-session.d.ts +12 -0
  93. package/dist/types/agent-tools/error-formatter.d.ts +30 -0
  94. package/dist/types/agent-tools/index.d.ts +9 -0
  95. package/dist/types/agent-tools/init-arg-utils.d.ts +13 -0
  96. package/dist/types/agent-tools/observation-artifact.d.ts +10 -0
  97. package/dist/types/agent-tools/observation-record.d.ts +38 -0
  98. package/dist/types/agent-tools/tool-defaults.d.ts +63 -0
  99. package/dist/types/agent-tools/tool-generator.d.ts +13 -0
  100. package/dist/types/agent-tools/types.d.ts +213 -0
  101. package/dist/types/agent-tools/user-prompt.d.ts +13 -0
  102. package/dist/types/cli/cli-args.d.ts +8 -0
  103. package/dist/types/cli/cli-error.d.ts +5 -0
  104. package/dist/types/cli/cli-runner.d.ts +4 -7
  105. package/dist/types/cli/index.d.ts +3 -1
  106. package/dist/types/cli/interrupt.d.ts +49 -0
  107. package/dist/types/cli/record-command.d.ts +3 -0
  108. package/dist/types/cli/screenshot-file.d.ts +10 -0
  109. package/dist/types/cli/verbose-ai-act.d.ts +44 -0
  110. package/dist/types/cli/verbose-screenshot.d.ts +10 -0
  111. package/dist/types/cli/verbose.d.ts +40 -0
  112. package/dist/types/constants/example-code.d.ts +1 -1
  113. package/dist/types/constants/index.d.ts +5 -0
  114. package/dist/types/env/types.d.ts +14 -5
  115. package/dist/types/env/utils.d.ts +0 -31
  116. package/dist/types/extractor/index.d.ts +1 -1
  117. package/dist/types/img/index.d.ts +1 -1
  118. package/dist/types/img/info.d.ts +7 -0
  119. package/dist/types/img/photon-loader.d.ts +2 -0
  120. package/dist/types/key-alias-utils.d.ts +9 -0
  121. package/dist/types/mcp/base-tools.d.ts +74 -5
  122. package/dist/types/mcp/cli-report-session.d.ts +12 -0
  123. package/dist/types/mcp/error-formatter.d.ts +12 -0
  124. package/dist/types/mcp/index.d.ts +2 -0
  125. package/dist/types/mcp/init-arg-utils.d.ts +13 -0
  126. package/dist/types/mcp/inject-report-html-plugin.d.ts +2 -2
  127. package/dist/types/mcp/launcher-helper.d.ts +3 -3
  128. package/dist/types/mcp/tool-generator.d.ts +3 -3
  129. package/dist/types/mcp/types.d.ts +10 -0
  130. package/dist/types/recorder.d.ts +113 -0
  131. package/package.json +1 -1
  132. package/src/agent-tools/agent-behavior-init-args.ts +109 -0
  133. package/src/agent-tools/base-tools.ts +399 -0
  134. package/src/agent-tools/chrome-path.ts +74 -0
  135. package/src/agent-tools/cli-report-session.ts +130 -0
  136. package/src/agent-tools/error-formatter.ts +177 -0
  137. package/src/agent-tools/index.ts +9 -0
  138. package/src/agent-tools/init-arg-utils.ts +105 -0
  139. package/src/agent-tools/observation-artifact.ts +29 -0
  140. package/src/agent-tools/observation-record.ts +331 -0
  141. package/src/agent-tools/tool-defaults.ts +119 -0
  142. package/src/agent-tools/tool-generator.ts +866 -0
  143. package/src/agent-tools/types.ts +250 -0
  144. package/src/agent-tools/user-prompt.ts +102 -0
  145. package/src/cli/cli-args.ts +173 -0
  146. package/src/cli/cli-error.ts +24 -0
  147. package/src/cli/cli-runner.ts +37 -56
  148. package/src/cli/index.ts +3 -7
  149. package/src/cli/interrupt.ts +207 -0
  150. package/src/cli/record-command.ts +177 -0
  151. package/src/cli/screenshot-file.ts +61 -0
  152. package/src/cli/verbose-ai-act.ts +387 -0
  153. package/src/cli/verbose-screenshot.ts +269 -0
  154. package/src/cli/verbose.ts +753 -0
  155. package/src/constants/example-code.ts +2 -2
  156. package/src/constants/index.ts +10 -0
  157. package/src/env/model-config-manager.ts +3 -0
  158. package/src/env/parse-model-config.ts +19 -1
  159. package/src/env/types.ts +13 -2
  160. package/src/env/utils.ts +0 -50
  161. package/src/extractor/index.ts +1 -1
  162. package/src/img/index.ts +14 -0
  163. package/src/img/info.ts +97 -45
  164. package/src/img/photon-loader.ts +5 -0
  165. package/src/img/transform.ts +261 -2
  166. package/src/key-alias-utils.ts +23 -0
  167. package/src/mcp/base-server.ts +10 -12
  168. package/src/mcp/base-tools.ts +218 -11
  169. package/src/mcp/cli-report-session.ts +130 -0
  170. package/src/mcp/error-formatter.ts +52 -0
  171. package/src/mcp/index.ts +2 -0
  172. package/src/mcp/init-arg-utils.ts +105 -0
  173. package/src/mcp/inject-report-html-plugin.ts +3 -3
  174. package/src/mcp/launcher-helper.ts +3 -3
  175. package/src/mcp/tool-generator.ts +98 -20
  176. package/src/mcp/types.ts +18 -1
  177. package/src/recorder.ts +625 -0
@@ -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",
@@ -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', {
@@ -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
- isValidPNGImageBuffer: ()=>isValidPNGImageBuffer,
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
- async function imageInfoOfBase64(imageBase64) {
46
- if (!imageBase64 || 'string' != typeof imageBase64) throw new Error('Invalid image base64: data is empty or not a string');
47
- const base64Data = imageBase64.replace(/^data:image\/\w+;base64,/, '');
48
- if (!base64Data || 0 === base64Data.length) throw new Error('Invalid image base64: no data after stripping prefix');
49
- if (!/^[A-Za-z0-9+/]*={0,2}$/.test(base64Data)) throw new Error('Invalid image base64: contains invalid characters');
50
- if (base64Data.length < 4) throw new Error(`Invalid image base64: data too short (${base64Data.length} characters)`);
51
- try {
52
- const { PhotonImage } = await external_get_photon_js_default()();
53
- const result = PhotonImage.new_from_base64(base64Data);
54
- const image = result instanceof Promise ? await result : result;
55
- const width = image.get_width();
56
- const height = image.get_height();
57
- image.free();
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 external_utils_js_namespaceObject = require("../utils.js");
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, external_utils_js_namespaceObject.setIsMcp)(true);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 = error instanceof Error ? error.message : String(error);
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 index_js_namespaceObject = require("../img/index.js");
30
- const external_logger_js_namespaceObject = require("../logger.js");
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, external_logger_js_namespaceObject.getDebug)('mcp:base-tools');
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, index_js_namespaceObject.parseBase64)(screenshot);
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
+ });