@xiuchang-midscene/shared 2.0.2
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/baseDB.mjs.bak +109 -0
- package/dist/es/build/copy-static.mjs +31 -0
- package/dist/es/build/copy-static.mjs.bak +31 -0
- package/dist/es/build/rspack-config.mjs +4 -0
- package/dist/es/build/rspack-config.mjs.bak +4 -0
- package/dist/es/cli/cli-runner.mjs +140 -0
- package/dist/es/cli/cli-runner.mjs.bak +140 -0
- package/dist/es/cli/index.mjs +2 -0
- package/dist/es/cli/index.mjs.bak +2 -0
- package/dist/es/common.mjs +37 -0
- package/dist/es/common.mjs.bak +37 -0
- package/dist/es/constants/example-code.mjs +223 -0
- package/dist/es/constants/example-code.mjs.bak +223 -0
- package/dist/es/constants/index.mjs +23 -0
- package/dist/es/constants/index.mjs.bak +23 -0
- package/dist/es/env/basic.mjs +6 -0
- package/dist/es/env/basic.mjs.bak +6 -0
- package/dist/es/env/constants.mjs +70 -0
- package/dist/es/env/constants.mjs.bak +70 -0
- package/dist/es/env/global-config-manager.mjs +94 -0
- package/dist/es/env/global-config-manager.mjs.bak +94 -0
- package/dist/es/env/helper.mjs +43 -0
- package/dist/es/env/helper.mjs.bak +43 -0
- package/dist/es/env/index.mjs +5 -0
- package/dist/es/env/index.mjs.bak +5 -0
- package/dist/es/env/init-debug.mjs +18 -0
- package/dist/es/env/init-debug.mjs.bak +18 -0
- package/dist/es/env/model-config-manager.mjs +79 -0
- package/dist/es/env/model-config-manager.mjs.bak +79 -0
- package/dist/es/env/parse-model-config.mjs +132 -0
- package/dist/es/env/parse-model-config.mjs.bak +132 -0
- package/dist/es/env/types.mjs +220 -0
- package/dist/es/env/types.mjs.bak +220 -0
- package/dist/es/env/utils.mjs +26 -0
- package/dist/es/env/utils.mjs.bak +26 -0
- package/dist/es/extractor/constants.mjs +2 -0
- package/dist/es/extractor/constants.mjs.bak +2 -0
- package/dist/es/extractor/debug.mjs +6 -0
- package/dist/es/extractor/debug.mjs.bak +6 -0
- package/dist/es/extractor/dom-util.mjs +92 -0
- package/dist/es/extractor/dom-util.mjs.bak +92 -0
- package/dist/es/extractor/index.mjs +5 -0
- package/dist/es/extractor/index.mjs.bak +5 -0
- package/dist/es/extractor/locator.mjs +250 -0
- package/dist/es/extractor/locator.mjs.bak +250 -0
- package/dist/es/extractor/tree.mjs +78 -0
- package/dist/es/extractor/tree.mjs.bak +78 -0
- package/dist/es/extractor/util.mjs +245 -0
- package/dist/es/extractor/util.mjs.bak +245 -0
- package/dist/es/extractor/web-extractor.mjs +303 -0
- package/dist/es/extractor/web-extractor.mjs.bak +303 -0
- package/dist/es/img/box-select.mjs +824 -0
- package/dist/es/img/box-select.mjs.bak +824 -0
- package/dist/es/img/canvas-fallback.mjs +238 -0
- package/dist/es/img/canvas-fallback.mjs.bak +238 -0
- package/dist/es/img/get-photon.mjs +45 -0
- package/dist/es/img/get-photon.mjs.bak +45 -0
- package/dist/es/img/get-sharp.mjs +11 -0
- package/dist/es/img/get-sharp.mjs.bak +11 -0
- package/dist/es/img/index.mjs +4 -0
- package/dist/es/img/index.mjs.bak +4 -0
- package/dist/es/img/info.mjs +29 -0
- package/dist/es/img/info.mjs.bak +29 -0
- package/dist/es/img/transform.mjs +295 -0
- package/dist/es/img/transform.mjs.bak +295 -0
- package/dist/es/index.mjs +4 -0
- package/dist/es/index.mjs.bak +4 -0
- package/dist/es/logger.mjs +64 -0
- package/dist/es/logger.mjs.bak +64 -0
- package/dist/es/mcp/base-server.mjs +281 -0
- package/dist/es/mcp/base-server.mjs.bak +281 -0
- package/dist/es/mcp/base-tools.mjs +91 -0
- package/dist/es/mcp/base-tools.mjs.bak +91 -0
- package/dist/es/mcp/chrome-path.mjs +35 -0
- package/dist/es/mcp/chrome-path.mjs.bak +35 -0
- package/dist/es/mcp/index.mjs +7 -0
- package/dist/es/mcp/index.mjs.bak +7 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs +53 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs.bak +53 -0
- package/dist/es/mcp/launcher-helper.mjs +52 -0
- package/dist/es/mcp/launcher-helper.mjs.bak +52 -0
- package/dist/es/mcp/tool-generator.mjs +297 -0
- package/dist/es/mcp/tool-generator.mjs.bak +297 -0
- package/dist/es/mcp/types.mjs +3 -0
- package/dist/es/mcp/types.mjs.bak +3 -0
- package/dist/es/node/fs.mjs +44 -0
- package/dist/es/node/fs.mjs.bak +44 -0
- package/dist/es/node/index.mjs +2 -0
- package/dist/es/node/index.mjs.bak +2 -0
- package/dist/es/node/port.mjs +24 -0
- package/dist/es/node/port.mjs.bak +24 -0
- package/dist/es/oss/demo.mjs +30 -0
- package/dist/es/oss/demo.mjs.bak +30 -0
- package/dist/es/oss/index.mjs +90 -0
- package/dist/es/oss/index.mjs.bak +90 -0
- package/dist/es/polyfills/async-hooks.mjs +2 -0
- package/dist/es/polyfills/async-hooks.mjs.bak +2 -0
- package/dist/es/polyfills/index.mjs +1 -0
- package/dist/es/polyfills/index.mjs.bak +1 -0
- package/dist/es/types/index.mjs +3 -0
- package/dist/es/types/index.mjs.bak +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/us-keyboard-layout.mjs.bak +1414 -0
- package/dist/es/utils.mjs +72 -0
- package/dist/es/utils.mjs.bak +72 -0
- package/dist/es/zod-schema-utils.mjs +54 -0
- package/dist/es/zod-schema-utils.mjs.bak +54 -0
- package/dist/lib/baseDB.js +149 -0
- package/dist/lib/baseDB.js.bak +149 -0
- package/dist/lib/build/copy-static.js +79 -0
- package/dist/lib/build/copy-static.js.bak +79 -0
- package/dist/lib/build/rspack-config.js +38 -0
- package/dist/lib/build/rspack-config.js.bak +38 -0
- package/dist/lib/cli/cli-runner.js +196 -0
- package/dist/lib/cli/cli-runner.js.bak +196 -0
- package/dist/lib/cli/index.js +48 -0
- package/dist/lib/cli/index.js.bak +48 -0
- package/dist/lib/common.js +93 -0
- package/dist/lib/common.js.bak +93 -0
- package/dist/lib/constants/example-code.js +260 -0
- package/dist/lib/constants/example-code.js.bak +260 -0
- package/dist/lib/constants/index.js +96 -0
- package/dist/lib/constants/index.js.bak +96 -0
- package/dist/lib/env/basic.js +40 -0
- package/dist/lib/env/basic.js.bak +40 -0
- package/dist/lib/env/constants.js +113 -0
- package/dist/lib/env/constants.js.bak +113 -0
- package/dist/lib/env/global-config-manager.js +128 -0
- package/dist/lib/env/global-config-manager.js.bak +128 -0
- package/dist/lib/env/helper.js +80 -0
- package/dist/lib/env/helper.js.bak +80 -0
- package/dist/lib/env/index.js +90 -0
- package/dist/lib/env/index.js.bak +90 -0
- package/dist/lib/env/init-debug.js +52 -0
- package/dist/lib/env/init-debug.js.bak +52 -0
- package/dist/lib/env/model-config-manager.js +113 -0
- package/dist/lib/env/model-config-manager.js.bak +113 -0
- package/dist/lib/env/parse-model-config.js +178 -0
- package/dist/lib/env/parse-model-config.js.bak +178 -0
- package/dist/lib/env/types.js +554 -0
- package/dist/lib/env/types.js.bak +554 -0
- package/dist/lib/env/utils.js +72 -0
- package/dist/lib/env/utils.js.bak +72 -0
- package/dist/lib/extractor/constants.js +42 -0
- package/dist/lib/extractor/constants.js.bak +42 -0
- package/dist/lib/extractor/debug.js +12 -0
- package/dist/lib/extractor/debug.js.bak +12 -0
- package/dist/lib/extractor/dom-util.js +153 -0
- package/dist/lib/extractor/dom-util.js.bak +153 -0
- package/dist/lib/extractor/index.js +81 -0
- package/dist/lib/extractor/index.js.bak +81 -0
- package/dist/lib/extractor/locator.js +296 -0
- package/dist/lib/extractor/locator.js.bak +296 -0
- package/dist/lib/extractor/tree.js +124 -0
- package/dist/lib/extractor/tree.js.bak +124 -0
- package/dist/lib/extractor/util.js +336 -0
- package/dist/lib/extractor/util.js.bak +336 -0
- package/dist/lib/extractor/web-extractor.js +349 -0
- package/dist/lib/extractor/web-extractor.js.bak +349 -0
- package/dist/lib/img/box-select.js +875 -0
- package/dist/lib/img/box-select.js.bak +875 -0
- package/dist/lib/img/canvas-fallback.js +305 -0
- package/dist/lib/img/canvas-fallback.js.bak +305 -0
- package/dist/lib/img/get-photon.js +82 -0
- package/dist/lib/img/get-photon.js.bak +82 -0
- package/dist/lib/img/get-sharp.js +45 -0
- package/dist/lib/img/get-sharp.js.bak +45 -0
- package/dist/lib/img/index.js +95 -0
- package/dist/lib/img/index.js.bak +95 -0
- package/dist/lib/img/info.js +83 -0
- package/dist/lib/img/info.js.bak +83 -0
- package/dist/lib/img/transform.js +387 -0
- package/dist/lib/img/transform.js.bak +387 -0
- package/dist/lib/index.js +47 -0
- package/dist/lib/index.js.bak +47 -0
- package/dist/lib/logger.js +114 -0
- package/dist/lib/logger.js.bak +114 -0
- package/dist/lib/mcp/base-server.js +331 -0
- package/dist/lib/mcp/base-server.js.bak +331 -0
- package/dist/lib/mcp/base-tools.js +125 -0
- package/dist/lib/mcp/base-tools.js.bak +125 -0
- package/dist/lib/mcp/chrome-path.js +72 -0
- package/dist/lib/mcp/chrome-path.js.bak +72 -0
- package/dist/lib/mcp/index.js +100 -0
- package/dist/lib/mcp/index.js.bak +100 -0
- package/dist/lib/mcp/inject-report-html-plugin.js +98 -0
- package/dist/lib/mcp/inject-report-html-plugin.js.bak +98 -0
- package/dist/lib/mcp/launcher-helper.js +86 -0
- package/dist/lib/mcp/launcher-helper.js.bak +86 -0
- package/dist/lib/mcp/tool-generator.js +334 -0
- package/dist/lib/mcp/tool-generator.js.bak +334 -0
- package/dist/lib/mcp/types.js +40 -0
- package/dist/lib/mcp/types.js.bak +40 -0
- package/dist/lib/node/fs.js +97 -0
- package/dist/lib/node/fs.js.bak +97 -0
- package/dist/lib/node/index.js +65 -0
- package/dist/lib/node/index.js.bak +65 -0
- package/dist/lib/node/port.js +61 -0
- package/dist/lib/node/port.js.bak +61 -0
- package/dist/lib/oss/demo.js +36 -0
- package/dist/lib/oss/demo.js.bak +36 -0
- package/dist/lib/oss/index.js +138 -0
- package/dist/lib/oss/index.js.bak +138 -0
- package/dist/lib/polyfills/async-hooks.js +36 -0
- package/dist/lib/polyfills/async-hooks.js.bak +36 -0
- package/dist/lib/polyfills/index.js +58 -0
- package/dist/lib/polyfills/index.js.bak +58 -0
- package/dist/lib/types/index.js +37 -0
- package/dist/lib/types/index.js.bak +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/us-keyboard-layout.js.bak +1457 -0
- package/dist/lib/utils.js +148 -0
- package/dist/lib/utils.js.bak +148 -0
- package/dist/lib/zod-schema-utils.js +97 -0
- package/dist/lib/zod-schema-utils.js.bak +97 -0
- package/dist/types/baseDB.d.ts +25 -0
- package/dist/types/baseDB.d.ts.bak +25 -0
- package/dist/types/build/copy-static.d.ts +31 -0
- package/dist/types/build/copy-static.d.ts.bak +31 -0
- package/dist/types/build/rspack-config.d.ts +8 -0
- package/dist/types/build/rspack-config.d.ts.bak +8 -0
- package/dist/types/cli/cli-runner.d.ts +14 -0
- package/dist/types/cli/cli-runner.d.ts.bak +14 -0
- package/dist/types/cli/index.d.ts +2 -0
- package/dist/types/cli/index.d.ts.bak +2 -0
- package/dist/types/common.d.ts +12 -0
- package/dist/types/common.d.ts.bak +12 -0
- package/dist/types/constants/example-code.d.ts +2 -0
- package/dist/types/constants/example-code.d.ts.bak +2 -0
- package/dist/types/constants/index.d.ts +21 -0
- package/dist/types/constants/index.d.ts.bak +21 -0
- package/dist/types/env/basic.d.ts +6 -0
- package/dist/types/env/basic.d.ts.bak +6 -0
- package/dist/types/env/constants.d.ts +40 -0
- package/dist/types/env/constants.d.ts.bak +40 -0
- package/dist/types/env/global-config-manager.d.ts +32 -0
- package/dist/types/env/global-config-manager.d.ts.bak +32 -0
- package/dist/types/env/helper.d.ts +4 -0
- package/dist/types/env/helper.d.ts.bak +4 -0
- package/dist/types/env/index.d.ts +4 -0
- package/dist/types/env/index.d.ts.bak +4 -0
- package/dist/types/env/init-debug.d.ts +1 -0
- package/dist/types/env/init-debug.d.ts.bak +1 -0
- package/dist/types/env/model-config-manager.d.ts +25 -0
- package/dist/types/env/model-config-manager.d.ts.bak +25 -0
- package/dist/types/env/parse-model-config.d.ts +31 -0
- package/dist/types/env/parse-model-config.d.ts.bak +31 -0
- package/dist/types/env/types.d.ts +318 -0
- package/dist/types/env/types.d.ts.bak +318 -0
- package/dist/types/env/utils.d.ts +38 -0
- package/dist/types/env/utils.d.ts.bak +38 -0
- package/dist/types/extractor/constants.d.ts +1 -0
- package/dist/types/extractor/constants.d.ts.bak +1 -0
- package/dist/types/extractor/debug.d.ts +1 -0
- package/dist/types/extractor/debug.d.ts.bak +1 -0
- package/dist/types/extractor/dom-util.d.ts +56 -0
- package/dist/types/extractor/dom-util.d.ts.bak +56 -0
- package/dist/types/extractor/index.d.ts +32 -0
- package/dist/types/extractor/index.d.ts.bak +32 -0
- package/dist/types/extractor/locator.d.ts +9 -0
- package/dist/types/extractor/locator.d.ts.bak +9 -0
- package/dist/types/extractor/tree.d.ts +6 -0
- package/dist/types/extractor/tree.d.ts.bak +6 -0
- package/dist/types/extractor/util.d.ts +47 -0
- package/dist/types/extractor/util.d.ts.bak +47 -0
- package/dist/types/extractor/web-extractor.d.ts +19 -0
- package/dist/types/extractor/web-extractor.d.ts.bak +19 -0
- package/dist/types/img/box-select.d.ts +26 -0
- package/dist/types/img/box-select.d.ts.bak +26 -0
- package/dist/types/img/canvas-fallback.d.ts +105 -0
- package/dist/types/img/canvas-fallback.d.ts.bak +105 -0
- package/dist/types/img/get-photon.d.ts +19 -0
- package/dist/types/img/get-photon.d.ts.bak +19 -0
- package/dist/types/img/get-sharp.d.ts +3 -0
- package/dist/types/img/get-sharp.d.ts.bak +3 -0
- package/dist/types/img/index.d.ts +3 -0
- package/dist/types/img/index.d.ts.bak +3 -0
- package/dist/types/img/info.d.ts +29 -0
- package/dist/types/img/info.d.ts.bak +29 -0
- package/dist/types/img/transform.d.ts +107 -0
- package/dist/types/img/transform.d.ts.bak +107 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.bak +4 -0
- package/dist/types/logger.d.ts +5 -0
- package/dist/types/logger.d.ts.bak +5 -0
- package/dist/types/mcp/base-server.d.ts +93 -0
- package/dist/types/mcp/base-server.d.ts.bak +93 -0
- package/dist/types/mcp/base-tools.d.ts +79 -0
- package/dist/types/mcp/base-tools.d.ts.bak +79 -0
- package/dist/types/mcp/chrome-path.d.ts +2 -0
- package/dist/types/mcp/chrome-path.d.ts.bak +2 -0
- package/dist/types/mcp/index.d.ts +7 -0
- package/dist/types/mcp/index.d.ts.bak +7 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts +18 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts.bak +18 -0
- package/dist/types/mcp/launcher-helper.d.ts +94 -0
- package/dist/types/mcp/launcher-helper.d.ts.bak +94 -0
- package/dist/types/mcp/tool-generator.d.ts +10 -0
- package/dist/types/mcp/tool-generator.d.ts.bak +10 -0
- package/dist/types/mcp/types.d.ts +103 -0
- package/dist/types/mcp/types.d.ts.bak +103 -0
- package/dist/types/node/fs.d.ts +15 -0
- package/dist/types/node/fs.d.ts.bak +15 -0
- package/dist/types/node/index.d.ts +2 -0
- package/dist/types/node/index.d.ts.bak +2 -0
- package/dist/types/node/port.d.ts +8 -0
- package/dist/types/node/port.d.ts.bak +8 -0
- package/dist/types/oss/demo.d.ts +1 -0
- package/dist/types/oss/demo.d.ts.bak +1 -0
- package/dist/types/oss/index.d.ts +34 -0
- package/dist/types/oss/index.d.ts.bak +34 -0
- package/dist/types/polyfills/async-hooks.d.ts +6 -0
- package/dist/types/polyfills/async-hooks.d.ts.bak +6 -0
- package/dist/types/polyfills/index.d.ts +4 -0
- package/dist/types/polyfills/index.d.ts.bak +4 -0
- package/dist/types/types/index.d.ts +34 -0
- package/dist/types/types/index.d.ts.bak +34 -0
- package/dist/types/us-keyboard-layout.d.ts +32 -0
- package/dist/types/us-keyboard-layout.d.ts.bak +32 -0
- package/dist/types/utils.d.ts +34 -0
- package/dist/types/utils.d.ts.bak +34 -0
- package/dist/types/zod-schema-utils.d.ts +23 -0
- package/dist/types/zod-schema-utils.d.ts.bak +23 -0
- package/package.json +132 -0
- package/src/baseDB.ts +158 -0
- package/src/build/copy-static.ts +68 -0
- package/src/build/rspack-config.ts +12 -0
- package/src/cli/cli-runner.ts +224 -0
- package/src/cli/index.ts +8 -0
- package/src/common.ts +67 -0
- package/src/constants/example-code.ts +223 -0
- package/src/constants/index.ts +29 -0
- package/src/env/basic.ts +12 -0
- package/src/env/constants.ts +234 -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 +294 -0
- package/src/env/types.ts +547 -0
- package/src/env/utils.ts +89 -0
- package/src/extractor/constants.ts +5 -0
- package/src/extractor/debug.ts +10 -0
- package/src/extractor/dom-util.ts +226 -0
- package/src/extractor/index.ts +48 -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 +481 -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 +26 -0
- package/src/img/info.ts +75 -0
- package/src/img/transform.ts +594 -0
- package/src/index.ts +8 -0
- package/src/logger.ts +96 -0
- package/src/mcp/base-server.ts +502 -0
- package/src/mcp/base-tools.ts +185 -0
- package/src/mcp/chrome-path.ts +48 -0
- package/src/mcp/index.ts +7 -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 +429 -0
- package/src/mcp/types.ts +112 -0
- package/src/node/fs.ts +84 -0
- package/src/node/index.ts +2 -0
- package/src/node/port.ts +37 -0
- package/src/oss/demo.ts +61 -0
- package/src/oss/index.ts +187 -0
- package/src/polyfills/async-hooks.ts +6 -0
- package/src/polyfills/index.ts +4 -0
- package/src/types/index.ts +52 -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,91 @@
|
|
|
1
|
+
import { parseBase64 } from "@xiuchang-midscene/shared/img";
|
|
2
|
+
import { getDebug } from "@xiuchang-midscene/shared/logger";
|
|
3
|
+
import { generateCommonTools, generateToolsFromActionSpace } from "./tool-generator.mjs";
|
|
4
|
+
function _define_property(obj, key, value) {
|
|
5
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
6
|
+
value: value,
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true
|
|
10
|
+
});
|
|
11
|
+
else obj[key] = value;
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
const debug = getDebug('mcp:base-tools');
|
|
15
|
+
class BaseMidsceneTools {
|
|
16
|
+
preparePlatformTools() {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
async initTools() {
|
|
20
|
+
this.toolDefinitions = [];
|
|
21
|
+
const platformTools = this.preparePlatformTools();
|
|
22
|
+
this.toolDefinitions.push(...platformTools);
|
|
23
|
+
let actionSpace;
|
|
24
|
+
if (this.agent) {
|
|
25
|
+
actionSpace = await this.agent.getActionSpace();
|
|
26
|
+
debug('Action space from agent:', actionSpace.map((a)=>a.name).join(', '));
|
|
27
|
+
} else {
|
|
28
|
+
const tempDevice = this.createTemporaryDevice();
|
|
29
|
+
actionSpace = tempDevice.actionSpace();
|
|
30
|
+
await tempDevice.destroy?.();
|
|
31
|
+
debug('Action space from temporary device:', actionSpace.map((a)=>a.name).join(', '));
|
|
32
|
+
}
|
|
33
|
+
const actionTools = generateToolsFromActionSpace(actionSpace, ()=>this.ensureAgent());
|
|
34
|
+
const commonTools = generateCommonTools(()=>this.ensureAgent());
|
|
35
|
+
this.toolDefinitions.push(...actionTools, ...commonTools);
|
|
36
|
+
debug('Total tools prepared:', this.toolDefinitions.length);
|
|
37
|
+
}
|
|
38
|
+
attachToServer(server) {
|
|
39
|
+
this.mcpServer = server;
|
|
40
|
+
if (0 === this.toolDefinitions.length) debug('Warning: No tools to register. Tools may be initialized lazily.');
|
|
41
|
+
for (const toolDef of this.toolDefinitions)this.mcpServer.tool(toolDef.name, toolDef.description, toolDef.schema, toolDef.handler);
|
|
42
|
+
debug('Registered', this.toolDefinitions.length, 'tools');
|
|
43
|
+
}
|
|
44
|
+
async destroy() {
|
|
45
|
+
await this.agent?.destroy?.();
|
|
46
|
+
}
|
|
47
|
+
getToolDefinitions() {
|
|
48
|
+
return this.toolDefinitions;
|
|
49
|
+
}
|
|
50
|
+
setAgent(agent) {
|
|
51
|
+
this.agent = agent;
|
|
52
|
+
}
|
|
53
|
+
buildScreenshotContent(screenshot) {
|
|
54
|
+
const { mimeType, body } = parseBase64(screenshot);
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
type: 'image',
|
|
58
|
+
data: body,
|
|
59
|
+
mimeType
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
buildTextResult(text) {
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
createDisconnectHandler(platformName) {
|
|
74
|
+
return async ()=>{
|
|
75
|
+
if (!this.agent) return this.buildTextResult('No active connection to disconnect');
|
|
76
|
+
try {
|
|
77
|
+
await this.agent.destroy?.();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
debug('Failed to destroy agent during disconnect:', error);
|
|
80
|
+
}
|
|
81
|
+
this.agent = void 0;
|
|
82
|
+
return this.buildTextResult(`Disconnected from ${platformName}`);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
constructor(){
|
|
86
|
+
_define_property(this, "mcpServer", void 0);
|
|
87
|
+
_define_property(this, "agent", void 0);
|
|
88
|
+
_define_property(this, "toolDefinitions", []);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export { BaseMidsceneTools };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { parseBase64 } from "@midscene/shared/img";
|
|
2
|
+
import { getDebug } from "@midscene/shared/logger";
|
|
3
|
+
import { generateCommonTools, generateToolsFromActionSpace } from "./tool-generator.mjs";
|
|
4
|
+
function _define_property(obj, key, value) {
|
|
5
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
6
|
+
value: value,
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true
|
|
10
|
+
});
|
|
11
|
+
else obj[key] = value;
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
const debug = getDebug('mcp:base-tools');
|
|
15
|
+
class BaseMidsceneTools {
|
|
16
|
+
preparePlatformTools() {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
async initTools() {
|
|
20
|
+
this.toolDefinitions = [];
|
|
21
|
+
const platformTools = this.preparePlatformTools();
|
|
22
|
+
this.toolDefinitions.push(...platformTools);
|
|
23
|
+
let actionSpace;
|
|
24
|
+
if (this.agent) {
|
|
25
|
+
actionSpace = await this.agent.getActionSpace();
|
|
26
|
+
debug('Action space from agent:', actionSpace.map((a)=>a.name).join(', '));
|
|
27
|
+
} else {
|
|
28
|
+
const tempDevice = this.createTemporaryDevice();
|
|
29
|
+
actionSpace = tempDevice.actionSpace();
|
|
30
|
+
await tempDevice.destroy?.();
|
|
31
|
+
debug('Action space from temporary device:', actionSpace.map((a)=>a.name).join(', '));
|
|
32
|
+
}
|
|
33
|
+
const actionTools = generateToolsFromActionSpace(actionSpace, ()=>this.ensureAgent());
|
|
34
|
+
const commonTools = generateCommonTools(()=>this.ensureAgent());
|
|
35
|
+
this.toolDefinitions.push(...actionTools, ...commonTools);
|
|
36
|
+
debug('Total tools prepared:', this.toolDefinitions.length);
|
|
37
|
+
}
|
|
38
|
+
attachToServer(server) {
|
|
39
|
+
this.mcpServer = server;
|
|
40
|
+
if (0 === this.toolDefinitions.length) debug('Warning: No tools to register. Tools may be initialized lazily.');
|
|
41
|
+
for (const toolDef of this.toolDefinitions)this.mcpServer.tool(toolDef.name, toolDef.description, toolDef.schema, toolDef.handler);
|
|
42
|
+
debug('Registered', this.toolDefinitions.length, 'tools');
|
|
43
|
+
}
|
|
44
|
+
async destroy() {
|
|
45
|
+
await this.agent?.destroy?.();
|
|
46
|
+
}
|
|
47
|
+
getToolDefinitions() {
|
|
48
|
+
return this.toolDefinitions;
|
|
49
|
+
}
|
|
50
|
+
setAgent(agent) {
|
|
51
|
+
this.agent = agent;
|
|
52
|
+
}
|
|
53
|
+
buildScreenshotContent(screenshot) {
|
|
54
|
+
const { mimeType, body } = parseBase64(screenshot);
|
|
55
|
+
return [
|
|
56
|
+
{
|
|
57
|
+
type: 'image',
|
|
58
|
+
data: body,
|
|
59
|
+
mimeType
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
buildTextResult(text) {
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
createDisconnectHandler(platformName) {
|
|
74
|
+
return async ()=>{
|
|
75
|
+
if (!this.agent) return this.buildTextResult('No active connection to disconnect');
|
|
76
|
+
try {
|
|
77
|
+
await this.agent.destroy?.();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
debug('Failed to destroy agent during disconnect:', error);
|
|
80
|
+
}
|
|
81
|
+
this.agent = void 0;
|
|
82
|
+
return this.buildTextResult(`Disconnected from ${platformName}`);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
constructor(){
|
|
86
|
+
_define_property(this, "mcpServer", void 0);
|
|
87
|
+
_define_property(this, "agent", void 0);
|
|
88
|
+
_define_property(this, "toolDefinitions", []);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export { BaseMidsceneTools };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { MIDSCENE_MCP_CHROME_PATH, globalConfigManager } from "../env/index.mjs";
|
|
3
|
+
function getSystemChromePath() {
|
|
4
|
+
const platform = process.platform;
|
|
5
|
+
const chromePaths = {
|
|
6
|
+
darwin: [
|
|
7
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
8
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium'
|
|
9
|
+
],
|
|
10
|
+
win32: [
|
|
11
|
+
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
12
|
+
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
|
13
|
+
`C:\\Users\\${process.env.USERNAME ?? process.env.USER}\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe`
|
|
14
|
+
],
|
|
15
|
+
linux: [
|
|
16
|
+
'/opt/google/chrome/chrome',
|
|
17
|
+
'/opt/google/chrome/google-chrome',
|
|
18
|
+
'/usr/bin/google-chrome-stable',
|
|
19
|
+
'/usr/bin/google-chrome',
|
|
20
|
+
'/usr/bin/chromium-browser',
|
|
21
|
+
'/usr/bin/chromium',
|
|
22
|
+
'/snap/bin/chromium'
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
const paths = chromePaths[platform] ?? [];
|
|
26
|
+
return paths.find((p)=>existsSync(p));
|
|
27
|
+
}
|
|
28
|
+
function resolveChromePath() {
|
|
29
|
+
const envPath = globalConfigManager.getEnvConfigValue(MIDSCENE_MCP_CHROME_PATH);
|
|
30
|
+
if (envPath && 'auto' !== envPath && existsSync(envPath)) return envPath;
|
|
31
|
+
const systemPath = getSystemChromePath();
|
|
32
|
+
if (systemPath) return systemPath;
|
|
33
|
+
throw new Error('Chrome not found. Install Google Chrome or set MIDSCENE_MCP_CHROME_PATH environment variable.');
|
|
34
|
+
}
|
|
35
|
+
export { getSystemChromePath, resolveChromePath };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { MIDSCENE_MCP_CHROME_PATH, globalConfigManager } from "../env/index.mjs";
|
|
3
|
+
function getSystemChromePath() {
|
|
4
|
+
const platform = process.platform;
|
|
5
|
+
const chromePaths = {
|
|
6
|
+
darwin: [
|
|
7
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
8
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium'
|
|
9
|
+
],
|
|
10
|
+
win32: [
|
|
11
|
+
'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
12
|
+
'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
|
|
13
|
+
`C:\\Users\\${process.env.USERNAME ?? process.env.USER}\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe`
|
|
14
|
+
],
|
|
15
|
+
linux: [
|
|
16
|
+
'/opt/google/chrome/chrome',
|
|
17
|
+
'/opt/google/chrome/google-chrome',
|
|
18
|
+
'/usr/bin/google-chrome-stable',
|
|
19
|
+
'/usr/bin/google-chrome',
|
|
20
|
+
'/usr/bin/chromium-browser',
|
|
21
|
+
'/usr/bin/chromium',
|
|
22
|
+
'/snap/bin/chromium'
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
const paths = chromePaths[platform] ?? [];
|
|
26
|
+
return paths.find((p)=>existsSync(p));
|
|
27
|
+
}
|
|
28
|
+
function resolveChromePath() {
|
|
29
|
+
const envPath = globalConfigManager.getEnvConfigValue(MIDSCENE_MCP_CHROME_PATH);
|
|
30
|
+
if (envPath && 'auto' !== envPath && existsSync(envPath)) return envPath;
|
|
31
|
+
const systemPath = getSystemChromePath();
|
|
32
|
+
if (systemPath) return systemPath;
|
|
33
|
+
throw new Error('Chrome not found. Install Google Chrome or set MIDSCENE_MCP_CHROME_PATH environment variable.');
|
|
34
|
+
}
|
|
35
|
+
export { getSystemChromePath, resolveChromePath };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./base-server.mjs";
|
|
2
|
+
export * from "./base-tools.mjs";
|
|
3
|
+
export * from "./tool-generator.mjs";
|
|
4
|
+
export * from "./types.mjs";
|
|
5
|
+
export * from "./inject-report-html-plugin.mjs";
|
|
6
|
+
export * from "./launcher-helper.mjs";
|
|
7
|
+
export * from "./chrome-path.mjs";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./base-server.mjs";
|
|
2
|
+
export * from "./base-tools.mjs";
|
|
3
|
+
export * from "./tool-generator.mjs";
|
|
4
|
+
export * from "./types.mjs";
|
|
5
|
+
export * from "./inject-report-html-plugin.mjs";
|
|
6
|
+
export * from "./launcher-helper.mjs";
|
|
7
|
+
export * from "./chrome-path.mjs";
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
const MAGIC_STRING = 'REPLACE_ME_WITH_REPORT_HTML';
|
|
4
|
+
const REPLACED_MARK = '/*REPORT_HTML_REPLACED*/';
|
|
5
|
+
const REG_EXP_FOR_REPLACE = /\/\*REPORT_HTML_REPLACED\*\/.*/;
|
|
6
|
+
function injectReportHtmlFromCore(packageDir) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'inject-report-html-from-core',
|
|
9
|
+
setup (api) {
|
|
10
|
+
api.onAfterBuild(()=>{
|
|
11
|
+
const coreUtilsPath = node_path.resolve(packageDir, '..', 'core', 'dist', 'lib', 'utils.js');
|
|
12
|
+
if (!node_fs.existsSync(coreUtilsPath)) return void console.warn('[inject-report-html] @xiuchang-midscene/core dist not found, skipping');
|
|
13
|
+
const coreContent = node_fs.readFileSync(coreUtilsPath, 'utf-8');
|
|
14
|
+
if (!coreContent.includes(REPLACED_MARK)) return void console.warn('[inject-report-html] HTML not found in core dist. Ensure report builds first.');
|
|
15
|
+
const markerIndex = coreContent.indexOf(REPLACED_MARK);
|
|
16
|
+
const jsonStart = markerIndex + REPLACED_MARK.length;
|
|
17
|
+
let jsonEnd = jsonStart;
|
|
18
|
+
if ('"' === coreContent[jsonStart]) {
|
|
19
|
+
jsonEnd = jsonStart + 1;
|
|
20
|
+
while(jsonEnd < coreContent.length)if ('\\' === coreContent[jsonEnd]) jsonEnd += 2;
|
|
21
|
+
else if ('"' === coreContent[jsonEnd]) {
|
|
22
|
+
jsonEnd += 1;
|
|
23
|
+
break;
|
|
24
|
+
} else jsonEnd += 1;
|
|
25
|
+
}
|
|
26
|
+
const jsonString = coreContent.slice(jsonStart, jsonEnd);
|
|
27
|
+
if (!jsonString || jsonString.length < 10) return void console.warn('[inject-report-html] Failed to extract HTML from core');
|
|
28
|
+
const finalContent = `${REPLACED_MARK}${jsonString}`;
|
|
29
|
+
const distDir = node_path.join(packageDir, 'dist');
|
|
30
|
+
if (!node_fs.existsSync(distDir)) return;
|
|
31
|
+
const jsFiles = node_fs.readdirSync(distDir).filter((f)=>f.endsWith('.js'));
|
|
32
|
+
let injectedCount = 0;
|
|
33
|
+
for (const file of jsFiles){
|
|
34
|
+
const filePath = node_path.join(distDir, file);
|
|
35
|
+
const content = node_fs.readFileSync(filePath, 'utf-8');
|
|
36
|
+
if (content.includes(REPLACED_MARK)) {
|
|
37
|
+
if (REG_EXP_FOR_REPLACE.test(content)) {
|
|
38
|
+
node_fs.writeFileSync(filePath, content.replace(REG_EXP_FOR_REPLACE, ()=>finalContent));
|
|
39
|
+
console.log(`[inject-report-html] Updated: ${file}`);
|
|
40
|
+
injectedCount++;
|
|
41
|
+
}
|
|
42
|
+
} else if (content.includes(`'${MAGIC_STRING}'`)) {
|
|
43
|
+
node_fs.writeFileSync(filePath, content.replace(`'${MAGIC_STRING}'`, ()=>finalContent));
|
|
44
|
+
console.log(`[inject-report-html] Injected: ${file}`);
|
|
45
|
+
injectedCount++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (injectedCount > 0) console.log(`[inject-report-html] Completed: ${injectedCount} file(s)`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export { injectReportHtmlFromCore };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
const MAGIC_STRING = 'REPLACE_ME_WITH_REPORT_HTML';
|
|
4
|
+
const REPLACED_MARK = '/*REPORT_HTML_REPLACED*/';
|
|
5
|
+
const REG_EXP_FOR_REPLACE = /\/\*REPORT_HTML_REPLACED\*\/.*/;
|
|
6
|
+
function injectReportHtmlFromCore(packageDir) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'inject-report-html-from-core',
|
|
9
|
+
setup (api) {
|
|
10
|
+
api.onAfterBuild(()=>{
|
|
11
|
+
const coreUtilsPath = node_path.resolve(packageDir, '..', 'core', 'dist', 'lib', 'utils.js');
|
|
12
|
+
if (!node_fs.existsSync(coreUtilsPath)) return void console.warn('[inject-report-html] @midscene/core dist not found, skipping');
|
|
13
|
+
const coreContent = node_fs.readFileSync(coreUtilsPath, 'utf-8');
|
|
14
|
+
if (!coreContent.includes(REPLACED_MARK)) return void console.warn('[inject-report-html] HTML not found in core dist. Ensure report builds first.');
|
|
15
|
+
const markerIndex = coreContent.indexOf(REPLACED_MARK);
|
|
16
|
+
const jsonStart = markerIndex + REPLACED_MARK.length;
|
|
17
|
+
let jsonEnd = jsonStart;
|
|
18
|
+
if ('"' === coreContent[jsonStart]) {
|
|
19
|
+
jsonEnd = jsonStart + 1;
|
|
20
|
+
while(jsonEnd < coreContent.length)if ('\\' === coreContent[jsonEnd]) jsonEnd += 2;
|
|
21
|
+
else if ('"' === coreContent[jsonEnd]) {
|
|
22
|
+
jsonEnd += 1;
|
|
23
|
+
break;
|
|
24
|
+
} else jsonEnd += 1;
|
|
25
|
+
}
|
|
26
|
+
const jsonString = coreContent.slice(jsonStart, jsonEnd);
|
|
27
|
+
if (!jsonString || jsonString.length < 10) return void console.warn('[inject-report-html] Failed to extract HTML from core');
|
|
28
|
+
const finalContent = `${REPLACED_MARK}${jsonString}`;
|
|
29
|
+
const distDir = node_path.join(packageDir, 'dist');
|
|
30
|
+
if (!node_fs.existsSync(distDir)) return;
|
|
31
|
+
const jsFiles = node_fs.readdirSync(distDir).filter((f)=>f.endsWith('.js'));
|
|
32
|
+
let injectedCount = 0;
|
|
33
|
+
for (const file of jsFiles){
|
|
34
|
+
const filePath = node_path.join(distDir, file);
|
|
35
|
+
const content = node_fs.readFileSync(filePath, 'utf-8');
|
|
36
|
+
if (content.includes(REPLACED_MARK)) {
|
|
37
|
+
if (REG_EXP_FOR_REPLACE.test(content)) {
|
|
38
|
+
node_fs.writeFileSync(filePath, content.replace(REG_EXP_FOR_REPLACE, ()=>finalContent));
|
|
39
|
+
console.log(`[inject-report-html] Updated: ${file}`);
|
|
40
|
+
injectedCount++;
|
|
41
|
+
}
|
|
42
|
+
} else if (content.includes(`'${MAGIC_STRING}'`)) {
|
|
43
|
+
node_fs.writeFileSync(filePath, content.replace(`'${MAGIC_STRING}'`, ()=>finalContent));
|
|
44
|
+
console.log(`[inject-report-html] Injected: ${file}`);
|
|
45
|
+
injectedCount++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (injectedCount > 0) console.log(`[inject-report-html] Completed: ${injectedCount} file(s)`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export { injectReportHtmlFromCore };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function createMCPServerLauncher(config) {
|
|
2
|
+
const { agent, platformName, ToolsManagerClass, MCPServerClass } = config;
|
|
3
|
+
function validateAgent() {
|
|
4
|
+
const device = agent.interface;
|
|
5
|
+
if (!device) throw new Error(`Agent must have an 'interface' property that references the underlying device.
|
|
6
|
+
Please ensure your agent instance is properly initialized with a device interface.
|
|
7
|
+
Expected: agent.interface to be defined, but got: ${typeof device}
|
|
8
|
+
Solution: Check that your agent constructor properly sets the interface property.`);
|
|
9
|
+
}
|
|
10
|
+
function createToolsManager() {
|
|
11
|
+
const toolsManager = new ToolsManagerClass();
|
|
12
|
+
toolsManager.agent = agent;
|
|
13
|
+
return toolsManager;
|
|
14
|
+
}
|
|
15
|
+
function logStartupInfo(mode, additionalInfo) {
|
|
16
|
+
const device = agent.interface;
|
|
17
|
+
console.log(`Starting Midscene ${platformName} MCP Server (${mode})...`);
|
|
18
|
+
console.log(`Agent: ${agent.constructor.name}`);
|
|
19
|
+
console.log(`Device: ${device.constructor.name}`);
|
|
20
|
+
if (additionalInfo?.port !== void 0) console.log(`Port: ${additionalInfo.port}`);
|
|
21
|
+
if (additionalInfo?.host) console.log(`Host: ${additionalInfo.host}`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
async launch (options = {}) {
|
|
25
|
+
const { verbose = true } = options;
|
|
26
|
+
validateAgent();
|
|
27
|
+
if (verbose) logStartupInfo('stdio');
|
|
28
|
+
const toolsManager = createToolsManager();
|
|
29
|
+
const server = new MCPServerClass(toolsManager);
|
|
30
|
+
const result = await server.launch();
|
|
31
|
+
if (verbose) console.log(`${platformName} MCP Server started (stdio mode)`);
|
|
32
|
+
return result;
|
|
33
|
+
},
|
|
34
|
+
async launchHttp (options) {
|
|
35
|
+
const { port, host = 'localhost', verbose = true } = options;
|
|
36
|
+
validateAgent();
|
|
37
|
+
if (verbose) logStartupInfo('HTTP', {
|
|
38
|
+
port,
|
|
39
|
+
host
|
|
40
|
+
});
|
|
41
|
+
const toolsManager = createToolsManager();
|
|
42
|
+
const server = new MCPServerClass(toolsManager);
|
|
43
|
+
const result = await server.launchHttp({
|
|
44
|
+
port,
|
|
45
|
+
host
|
|
46
|
+
});
|
|
47
|
+
if (verbose) console.log(`${platformName} MCP Server started on http://${result.host}:${result.port}/mcp`);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export { createMCPServerLauncher };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function createMCPServerLauncher(config) {
|
|
2
|
+
const { agent, platformName, ToolsManagerClass, MCPServerClass } = config;
|
|
3
|
+
function validateAgent() {
|
|
4
|
+
const device = agent.interface;
|
|
5
|
+
if (!device) throw new Error(`Agent must have an 'interface' property that references the underlying device.
|
|
6
|
+
Please ensure your agent instance is properly initialized with a device interface.
|
|
7
|
+
Expected: agent.interface to be defined, but got: ${typeof device}
|
|
8
|
+
Solution: Check that your agent constructor properly sets the interface property.`);
|
|
9
|
+
}
|
|
10
|
+
function createToolsManager() {
|
|
11
|
+
const toolsManager = new ToolsManagerClass();
|
|
12
|
+
toolsManager.agent = agent;
|
|
13
|
+
return toolsManager;
|
|
14
|
+
}
|
|
15
|
+
function logStartupInfo(mode, additionalInfo) {
|
|
16
|
+
const device = agent.interface;
|
|
17
|
+
console.log(`Starting Midscene ${platformName} MCP Server (${mode})...`);
|
|
18
|
+
console.log(`Agent: ${agent.constructor.name}`);
|
|
19
|
+
console.log(`Device: ${device.constructor.name}`);
|
|
20
|
+
if (additionalInfo?.port !== void 0) console.log(`Port: ${additionalInfo.port}`);
|
|
21
|
+
if (additionalInfo?.host) console.log(`Host: ${additionalInfo.host}`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
async launch (options = {}) {
|
|
25
|
+
const { verbose = true } = options;
|
|
26
|
+
validateAgent();
|
|
27
|
+
if (verbose) logStartupInfo('stdio');
|
|
28
|
+
const toolsManager = createToolsManager();
|
|
29
|
+
const server = new MCPServerClass(toolsManager);
|
|
30
|
+
const result = await server.launch();
|
|
31
|
+
if (verbose) console.log(`${platformName} MCP Server started (stdio mode)`);
|
|
32
|
+
return result;
|
|
33
|
+
},
|
|
34
|
+
async launchHttp (options) {
|
|
35
|
+
const { port, host = 'localhost', verbose = true } = options;
|
|
36
|
+
validateAgent();
|
|
37
|
+
if (verbose) logStartupInfo('HTTP', {
|
|
38
|
+
port,
|
|
39
|
+
host
|
|
40
|
+
});
|
|
41
|
+
const toolsManager = createToolsManager();
|
|
42
|
+
const server = new MCPServerClass(toolsManager);
|
|
43
|
+
const result = await server.launchHttp({
|
|
44
|
+
port,
|
|
45
|
+
host
|
|
46
|
+
});
|
|
47
|
+
if (verbose) console.log(`${platformName} MCP Server started on http://${result.host}:${result.port}/mcp`);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export { createMCPServerLauncher };
|