@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
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
3
|
+
value: value,
|
|
4
|
+
enumerable: true,
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true
|
|
7
|
+
});
|
|
8
|
+
else obj[key] = value;
|
|
9
|
+
return obj;
|
|
10
|
+
}
|
|
11
|
+
class IndexedDBManager {
|
|
12
|
+
initDB() {
|
|
13
|
+
return new Promise((resolve, reject)=>{
|
|
14
|
+
const request = indexedDB.open(this.dbName, this.version);
|
|
15
|
+
request.onerror = ()=>reject(request.error);
|
|
16
|
+
request.onsuccess = ()=>resolve(request.result);
|
|
17
|
+
request.onupgradeneeded = (event)=>{
|
|
18
|
+
const db = event.target.result;
|
|
19
|
+
this.storeConfigs.forEach(({ name, keyPath })=>{
|
|
20
|
+
if (!db.objectStoreNames.contains(name)) {
|
|
21
|
+
const store = db.createObjectStore(name, {
|
|
22
|
+
keyPath
|
|
23
|
+
});
|
|
24
|
+
store.createIndex('timestamp', 'timestamp', {
|
|
25
|
+
unique: false
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async withTransaction(storeNames, mode, operation) {
|
|
33
|
+
const db = await this.dbPromise;
|
|
34
|
+
const transaction = db.transaction(storeNames, mode);
|
|
35
|
+
const stores = Array.isArray(storeNames) ? storeNames.map((name)=>transaction.objectStore(name)) : transaction.objectStore(storeNames);
|
|
36
|
+
return operation(stores);
|
|
37
|
+
}
|
|
38
|
+
promisifyRequest(request) {
|
|
39
|
+
return new Promise((resolve, reject)=>{
|
|
40
|
+
request.onsuccess = ()=>resolve(request.result);
|
|
41
|
+
request.onerror = ()=>reject(request.error);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async put(storeName, data) {
|
|
45
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
46
|
+
await this.promisifyRequest(store.put(data));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async get(storeName, key) {
|
|
50
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.get(key)));
|
|
51
|
+
}
|
|
52
|
+
async getAll(storeName, sortByTimestamp = true) {
|
|
53
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>{
|
|
54
|
+
const objectStore = store;
|
|
55
|
+
const results = sortByTimestamp ? await this.promisifyRequest(objectStore.index('timestamp').getAll()) : await this.promisifyRequest(objectStore.getAll());
|
|
56
|
+
return sortByTimestamp ? results.sort((a, b)=>a.timestamp - b.timestamp) : results;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async clear(storeName) {
|
|
60
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
61
|
+
await this.promisifyRequest(store.clear());
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async delete(storeName, key) {
|
|
65
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
66
|
+
await this.promisifyRequest(store.delete(key));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async count(storeName) {
|
|
70
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.count()));
|
|
71
|
+
}
|
|
72
|
+
getDBPromise() {
|
|
73
|
+
return this.dbPromise;
|
|
74
|
+
}
|
|
75
|
+
constructor(dbName, version, storeConfigs){
|
|
76
|
+
_define_property(this, "dbPromise", void 0);
|
|
77
|
+
_define_property(this, "dbName", void 0);
|
|
78
|
+
_define_property(this, "version", void 0);
|
|
79
|
+
_define_property(this, "storeConfigs", void 0);
|
|
80
|
+
this.dbName = dbName;
|
|
81
|
+
this.version = version;
|
|
82
|
+
this.storeConfigs = storeConfigs;
|
|
83
|
+
this.dbPromise = this.initDB();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const withErrorHandling = async (operation, errorMessage, defaultValue, onQuotaExceeded)=>{
|
|
87
|
+
try {
|
|
88
|
+
return await operation();
|
|
89
|
+
} catch (e) {
|
|
90
|
+
console.error(errorMessage, e);
|
|
91
|
+
if (e instanceof Error && 'QuotaExceededError' === e.name && onQuotaExceeded) {
|
|
92
|
+
console.log('Storage quota exceeded, running cleanup...');
|
|
93
|
+
await onQuotaExceeded();
|
|
94
|
+
}
|
|
95
|
+
return defaultValue;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const createCleanupFunction = (dbManager, storeName, maxItems)=>async ()=>{
|
|
99
|
+
try {
|
|
100
|
+
const results = await dbManager.getAll(storeName);
|
|
101
|
+
if (results.length > maxItems) {
|
|
102
|
+
const toDelete = results.sort((a, b)=>a.timestamp - b.timestamp).slice(0, results.length - maxItems);
|
|
103
|
+
await Promise.all(toDelete.map((item)=>dbManager.delete(storeName, item.id)));
|
|
104
|
+
}
|
|
105
|
+
} catch (e) {
|
|
106
|
+
console.error(`Failed to cleanup ${storeName}:`, e);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
export { IndexedDBManager, createCleanupFunction, withErrorHandling };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
3
|
+
value: value,
|
|
4
|
+
enumerable: true,
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true
|
|
7
|
+
});
|
|
8
|
+
else obj[key] = value;
|
|
9
|
+
return obj;
|
|
10
|
+
}
|
|
11
|
+
class IndexedDBManager {
|
|
12
|
+
initDB() {
|
|
13
|
+
return new Promise((resolve, reject)=>{
|
|
14
|
+
const request = indexedDB.open(this.dbName, this.version);
|
|
15
|
+
request.onerror = ()=>reject(request.error);
|
|
16
|
+
request.onsuccess = ()=>resolve(request.result);
|
|
17
|
+
request.onupgradeneeded = (event)=>{
|
|
18
|
+
const db = event.target.result;
|
|
19
|
+
this.storeConfigs.forEach(({ name, keyPath })=>{
|
|
20
|
+
if (!db.objectStoreNames.contains(name)) {
|
|
21
|
+
const store = db.createObjectStore(name, {
|
|
22
|
+
keyPath
|
|
23
|
+
});
|
|
24
|
+
store.createIndex('timestamp', 'timestamp', {
|
|
25
|
+
unique: false
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async withTransaction(storeNames, mode, operation) {
|
|
33
|
+
const db = await this.dbPromise;
|
|
34
|
+
const transaction = db.transaction(storeNames, mode);
|
|
35
|
+
const stores = Array.isArray(storeNames) ? storeNames.map((name)=>transaction.objectStore(name)) : transaction.objectStore(storeNames);
|
|
36
|
+
return operation(stores);
|
|
37
|
+
}
|
|
38
|
+
promisifyRequest(request) {
|
|
39
|
+
return new Promise((resolve, reject)=>{
|
|
40
|
+
request.onsuccess = ()=>resolve(request.result);
|
|
41
|
+
request.onerror = ()=>reject(request.error);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async put(storeName, data) {
|
|
45
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
46
|
+
await this.promisifyRequest(store.put(data));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async get(storeName, key) {
|
|
50
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.get(key)));
|
|
51
|
+
}
|
|
52
|
+
async getAll(storeName, sortByTimestamp = true) {
|
|
53
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>{
|
|
54
|
+
const objectStore = store;
|
|
55
|
+
const results = sortByTimestamp ? await this.promisifyRequest(objectStore.index('timestamp').getAll()) : await this.promisifyRequest(objectStore.getAll());
|
|
56
|
+
return sortByTimestamp ? results.sort((a, b)=>a.timestamp - b.timestamp) : results;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async clear(storeName) {
|
|
60
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
61
|
+
await this.promisifyRequest(store.clear());
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async delete(storeName, key) {
|
|
65
|
+
await this.withTransaction(storeName, 'readwrite', async (store)=>{
|
|
66
|
+
await this.promisifyRequest(store.delete(key));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async count(storeName) {
|
|
70
|
+
return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.count()));
|
|
71
|
+
}
|
|
72
|
+
getDBPromise() {
|
|
73
|
+
return this.dbPromise;
|
|
74
|
+
}
|
|
75
|
+
constructor(dbName, version, storeConfigs){
|
|
76
|
+
_define_property(this, "dbPromise", void 0);
|
|
77
|
+
_define_property(this, "dbName", void 0);
|
|
78
|
+
_define_property(this, "version", void 0);
|
|
79
|
+
_define_property(this, "storeConfigs", void 0);
|
|
80
|
+
this.dbName = dbName;
|
|
81
|
+
this.version = version;
|
|
82
|
+
this.storeConfigs = storeConfigs;
|
|
83
|
+
this.dbPromise = this.initDB();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const withErrorHandling = async (operation, errorMessage, defaultValue, onQuotaExceeded)=>{
|
|
87
|
+
try {
|
|
88
|
+
return await operation();
|
|
89
|
+
} catch (e) {
|
|
90
|
+
console.error(errorMessage, e);
|
|
91
|
+
if (e instanceof Error && 'QuotaExceededError' === e.name && onQuotaExceeded) {
|
|
92
|
+
console.log('Storage quota exceeded, running cleanup...');
|
|
93
|
+
await onQuotaExceeded();
|
|
94
|
+
}
|
|
95
|
+
return defaultValue;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const createCleanupFunction = (dbManager, storeName, maxItems)=>async ()=>{
|
|
99
|
+
try {
|
|
100
|
+
const results = await dbManager.getAll(storeName);
|
|
101
|
+
if (results.length > maxItems) {
|
|
102
|
+
const toDelete = results.sort((a, b)=>a.timestamp - b.timestamp).slice(0, results.length - maxItems);
|
|
103
|
+
await Promise.all(toDelete.map((item)=>dbManager.delete(storeName, item.id)));
|
|
104
|
+
}
|
|
105
|
+
} catch (e) {
|
|
106
|
+
console.error(`Failed to cleanup ${storeName}:`, e);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
export { IndexedDBManager, createCleanupFunction, withErrorHandling };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
const createCopyStaticPlugin = (options)=>({
|
|
4
|
+
name: options.pluginName || 'copy-static',
|
|
5
|
+
setup (api) {
|
|
6
|
+
api.onAfterBuild(async ()=>{
|
|
7
|
+
const { srcDir, destDir, faviconPath } = options;
|
|
8
|
+
const stat = await node_fs.promises.lstat(destDir).catch(()=>null);
|
|
9
|
+
if (stat?.isSymbolicLink()) await node_fs.promises.unlink(destDir);
|
|
10
|
+
await node_fs.promises.mkdir(destDir, {
|
|
11
|
+
recursive: true
|
|
12
|
+
});
|
|
13
|
+
await node_fs.promises.cp(srcDir, destDir, {
|
|
14
|
+
recursive: true
|
|
15
|
+
});
|
|
16
|
+
console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
|
|
17
|
+
if (faviconPath) {
|
|
18
|
+
const faviconDest = node_path.join(destDir, 'favicon.ico');
|
|
19
|
+
await node_fs.promises.copyFile(faviconPath, faviconDest);
|
|
20
|
+
console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const createPlaygroundCopyPlugin = (srcDir, destDir, pluginName, faviconSrc)=>createCopyStaticPlugin({
|
|
26
|
+
srcDir,
|
|
27
|
+
destDir,
|
|
28
|
+
faviconPath: faviconSrc,
|
|
29
|
+
pluginName
|
|
30
|
+
});
|
|
31
|
+
export { createCopyStaticPlugin, createPlaygroundCopyPlugin };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
const createCopyStaticPlugin = (options)=>({
|
|
4
|
+
name: options.pluginName || 'copy-static',
|
|
5
|
+
setup (api) {
|
|
6
|
+
api.onAfterBuild(async ()=>{
|
|
7
|
+
const { srcDir, destDir, faviconPath } = options;
|
|
8
|
+
const stat = await node_fs.promises.lstat(destDir).catch(()=>null);
|
|
9
|
+
if (stat?.isSymbolicLink()) await node_fs.promises.unlink(destDir);
|
|
10
|
+
await node_fs.promises.mkdir(destDir, {
|
|
11
|
+
recursive: true
|
|
12
|
+
});
|
|
13
|
+
await node_fs.promises.cp(srcDir, destDir, {
|
|
14
|
+
recursive: true
|
|
15
|
+
});
|
|
16
|
+
console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
|
|
17
|
+
if (faviconPath) {
|
|
18
|
+
const faviconDest = node_path.join(destDir, 'favicon.ico');
|
|
19
|
+
await node_fs.promises.copyFile(faviconPath, faviconDest);
|
|
20
|
+
console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const createPlaygroundCopyPlugin = (srcDir, destDir, pluginName, faviconSrc)=>createCopyStaticPlugin({
|
|
26
|
+
srcDir,
|
|
27
|
+
destDir,
|
|
28
|
+
faviconPath: faviconSrc,
|
|
29
|
+
pluginName
|
|
30
|
+
});
|
|
31
|
+
export { createCopyStaticPlugin, createPlaygroundCopyPlugin };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
|
+
import { getDebug } from "../logger.mjs";
|
|
6
|
+
function _define_property(obj, key, value) {
|
|
7
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
8
|
+
value: value,
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true
|
|
12
|
+
});
|
|
13
|
+
else obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
const debug = getDebug('cli-runner');
|
|
17
|
+
class CLIError extends Error {
|
|
18
|
+
constructor(message, exitCode = 1){
|
|
19
|
+
super(message), _define_property(this, "exitCode", void 0), this.exitCode = exitCode;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function parseValue(raw) {
|
|
23
|
+
if (raw.startsWith('{') || raw.startsWith('[')) try {
|
|
24
|
+
return JSON.parse(raw);
|
|
25
|
+
} catch {}
|
|
26
|
+
if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw);
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
function parseCliArgs(args) {
|
|
30
|
+
const result = {};
|
|
31
|
+
for(let i = 0; i < args.length; i++){
|
|
32
|
+
const arg = args[i];
|
|
33
|
+
if (!arg.startsWith('--')) continue;
|
|
34
|
+
const body = arg.slice(2);
|
|
35
|
+
const eqIdx = body.indexOf('=');
|
|
36
|
+
if (eqIdx >= 0) result[body.slice(0, eqIdx)] = parseValue(body.slice(eqIdx + 1));
|
|
37
|
+
else if (args[i + 1] && !args[i + 1].startsWith('--')) {
|
|
38
|
+
i++;
|
|
39
|
+
result[body] = parseValue(args[i]);
|
|
40
|
+
} else result[body] = true;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function outputContentItem(item, isError) {
|
|
45
|
+
switch(item.type){
|
|
46
|
+
case 'text':
|
|
47
|
+
if (isError) console.error(item.text);
|
|
48
|
+
else console.log(item.text);
|
|
49
|
+
break;
|
|
50
|
+
case 'image':
|
|
51
|
+
{
|
|
52
|
+
const filename = `screenshot-${Date.now()}.png`;
|
|
53
|
+
const filepath = join(tmpdir(), filename);
|
|
54
|
+
writeFileSync(filepath, Buffer.from(item.data, 'base64'));
|
|
55
|
+
console.log(`Screenshot saved: ${filepath}`);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
default:
|
|
59
|
+
console.log(`[${item.type} content not displayed in CLI]`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function outputResult(result) {
|
|
63
|
+
for (const item of result.content)outputContentItem(item, result.isError ?? false);
|
|
64
|
+
}
|
|
65
|
+
function removePrefix(name, prefix) {
|
|
66
|
+
if (prefix && name.startsWith(prefix)) return name.slice(prefix.length);
|
|
67
|
+
return name;
|
|
68
|
+
}
|
|
69
|
+
function printCommandHelp(scriptName, cmd) {
|
|
70
|
+
const { def } = cmd;
|
|
71
|
+
console.log(`\nUsage: ${scriptName} ${cmd.name} [options]\n`);
|
|
72
|
+
console.log(def.description);
|
|
73
|
+
const schemaEntries = Object.entries(def.schema);
|
|
74
|
+
if (schemaEntries.length > 0) {
|
|
75
|
+
console.log('\nOptions:');
|
|
76
|
+
for (const [key, zodType] of schemaEntries){
|
|
77
|
+
const desc = zodType.description ?? '';
|
|
78
|
+
console.log(` --${key.padEnd(20)} ${desc}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function printVersion(scriptName, version) {
|
|
83
|
+
console.log(`${scriptName} v${version}`);
|
|
84
|
+
}
|
|
85
|
+
function printHelp(scriptName, commands, version) {
|
|
86
|
+
if (version) {
|
|
87
|
+
printVersion(scriptName, version);
|
|
88
|
+
console.log('');
|
|
89
|
+
}
|
|
90
|
+
console.log(`\nUsage: ${scriptName} <command> [options]\n`);
|
|
91
|
+
console.log('Commands:');
|
|
92
|
+
for (const { name, def } of commands)console.log(` ${name.padEnd(30)} ${def.description}`);
|
|
93
|
+
console.log(` ${'version'.padEnd(30)} Show CLI version`);
|
|
94
|
+
console.log(`\nRun "${scriptName} <command> --help" for more info.`);
|
|
95
|
+
}
|
|
96
|
+
async function runToolsCLI(tools, scriptName, options) {
|
|
97
|
+
const rawArgs = options?.argv ?? process.argv.slice(2);
|
|
98
|
+
debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
|
|
99
|
+
const envFile = join(process.cwd(), '.env');
|
|
100
|
+
if (existsSync(envFile)) dotenv.config({
|
|
101
|
+
path: envFile
|
|
102
|
+
});
|
|
103
|
+
await tools.initTools();
|
|
104
|
+
const commands = tools.getToolDefinitions().map((def)=>({
|
|
105
|
+
name: removePrefix(def.name, options?.stripPrefix).toLowerCase(),
|
|
106
|
+
def
|
|
107
|
+
}));
|
|
108
|
+
const cliVersion = options?.version;
|
|
109
|
+
const [commandName, ...restArgs] = rawArgs;
|
|
110
|
+
if (!commandName || '--help' === commandName || '-h' === commandName) {
|
|
111
|
+
debug('showing help (no command or --help flag)');
|
|
112
|
+
printHelp(scriptName, commands, cliVersion);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if ('--version' === commandName || '-v' === commandName || 'version' === commandName.toLowerCase()) {
|
|
116
|
+
if (!cliVersion) throw new CLIError('Failed to determine CLI version');
|
|
117
|
+
printVersion(scriptName, cliVersion);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const match = commands.find((c)=>c.name.toLowerCase() === commandName.toLowerCase());
|
|
121
|
+
if (!match) {
|
|
122
|
+
debug('unknown command: %s', commandName);
|
|
123
|
+
console.error(`Unknown command: ${commandName}`);
|
|
124
|
+
printHelp(scriptName, commands, cliVersion);
|
|
125
|
+
throw new CLIError(`Unknown command: ${commandName}`);
|
|
126
|
+
}
|
|
127
|
+
const parsedArgs = parseCliArgs(restArgs);
|
|
128
|
+
debug('command: %s, args: %s', match.name, JSON.stringify(parsedArgs));
|
|
129
|
+
if (true === parsedArgs.help) {
|
|
130
|
+
debug('showing command help for: %s', match.name);
|
|
131
|
+
printCommandHelp(scriptName, match);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const result = await match.def.handler(parsedArgs);
|
|
135
|
+
debug('command %s completed, isError: %s', match.name, result.isError ?? false);
|
|
136
|
+
outputResult(result);
|
|
137
|
+
await tools.destroy();
|
|
138
|
+
if (result.isError) throw new CLIError('Command failed', 1);
|
|
139
|
+
}
|
|
140
|
+
export { CLIError, parseCliArgs, parseValue, removePrefix, runToolsCLI };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
|
+
import { getDebug } from "../logger.mjs";
|
|
6
|
+
function _define_property(obj, key, value) {
|
|
7
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
8
|
+
value: value,
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true
|
|
12
|
+
});
|
|
13
|
+
else obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
const debug = getDebug('cli-runner');
|
|
17
|
+
class CLIError extends Error {
|
|
18
|
+
constructor(message, exitCode = 1){
|
|
19
|
+
super(message), _define_property(this, "exitCode", void 0), this.exitCode = exitCode;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function parseValue(raw) {
|
|
23
|
+
if (raw.startsWith('{') || raw.startsWith('[')) try {
|
|
24
|
+
return JSON.parse(raw);
|
|
25
|
+
} catch {}
|
|
26
|
+
if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw);
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
function parseCliArgs(args) {
|
|
30
|
+
const result = {};
|
|
31
|
+
for(let i = 0; i < args.length; i++){
|
|
32
|
+
const arg = args[i];
|
|
33
|
+
if (!arg.startsWith('--')) continue;
|
|
34
|
+
const body = arg.slice(2);
|
|
35
|
+
const eqIdx = body.indexOf('=');
|
|
36
|
+
if (eqIdx >= 0) result[body.slice(0, eqIdx)] = parseValue(body.slice(eqIdx + 1));
|
|
37
|
+
else if (args[i + 1] && !args[i + 1].startsWith('--')) {
|
|
38
|
+
i++;
|
|
39
|
+
result[body] = parseValue(args[i]);
|
|
40
|
+
} else result[body] = true;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function outputContentItem(item, isError) {
|
|
45
|
+
switch(item.type){
|
|
46
|
+
case 'text':
|
|
47
|
+
if (isError) console.error(item.text);
|
|
48
|
+
else console.log(item.text);
|
|
49
|
+
break;
|
|
50
|
+
case 'image':
|
|
51
|
+
{
|
|
52
|
+
const filename = `screenshot-${Date.now()}.png`;
|
|
53
|
+
const filepath = join(tmpdir(), filename);
|
|
54
|
+
writeFileSync(filepath, Buffer.from(item.data, 'base64'));
|
|
55
|
+
console.log(`Screenshot saved: ${filepath}`);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
default:
|
|
59
|
+
console.log(`[${item.type} content not displayed in CLI]`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function outputResult(result) {
|
|
63
|
+
for (const item of result.content)outputContentItem(item, result.isError ?? false);
|
|
64
|
+
}
|
|
65
|
+
function removePrefix(name, prefix) {
|
|
66
|
+
if (prefix && name.startsWith(prefix)) return name.slice(prefix.length);
|
|
67
|
+
return name;
|
|
68
|
+
}
|
|
69
|
+
function printCommandHelp(scriptName, cmd) {
|
|
70
|
+
const { def } = cmd;
|
|
71
|
+
console.log(`\nUsage: ${scriptName} ${cmd.name} [options]\n`);
|
|
72
|
+
console.log(def.description);
|
|
73
|
+
const schemaEntries = Object.entries(def.schema);
|
|
74
|
+
if (schemaEntries.length > 0) {
|
|
75
|
+
console.log('\nOptions:');
|
|
76
|
+
for (const [key, zodType] of schemaEntries){
|
|
77
|
+
const desc = zodType.description ?? '';
|
|
78
|
+
console.log(` --${key.padEnd(20)} ${desc}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function printVersion(scriptName, version) {
|
|
83
|
+
console.log(`${scriptName} v${version}`);
|
|
84
|
+
}
|
|
85
|
+
function printHelp(scriptName, commands, version) {
|
|
86
|
+
if (version) {
|
|
87
|
+
printVersion(scriptName, version);
|
|
88
|
+
console.log('');
|
|
89
|
+
}
|
|
90
|
+
console.log(`\nUsage: ${scriptName} <command> [options]\n`);
|
|
91
|
+
console.log('Commands:');
|
|
92
|
+
for (const { name, def } of commands)console.log(` ${name.padEnd(30)} ${def.description}`);
|
|
93
|
+
console.log(` ${'version'.padEnd(30)} Show CLI version`);
|
|
94
|
+
console.log(`\nRun "${scriptName} <command> --help" for more info.`);
|
|
95
|
+
}
|
|
96
|
+
async function runToolsCLI(tools, scriptName, options) {
|
|
97
|
+
const rawArgs = options?.argv ?? process.argv.slice(2);
|
|
98
|
+
debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
|
|
99
|
+
const envFile = join(process.cwd(), '.env');
|
|
100
|
+
if (existsSync(envFile)) dotenv.config({
|
|
101
|
+
path: envFile
|
|
102
|
+
});
|
|
103
|
+
await tools.initTools();
|
|
104
|
+
const commands = tools.getToolDefinitions().map((def)=>({
|
|
105
|
+
name: removePrefix(def.name, options?.stripPrefix).toLowerCase(),
|
|
106
|
+
def
|
|
107
|
+
}));
|
|
108
|
+
const cliVersion = options?.version;
|
|
109
|
+
const [commandName, ...restArgs] = rawArgs;
|
|
110
|
+
if (!commandName || '--help' === commandName || '-h' === commandName) {
|
|
111
|
+
debug('showing help (no command or --help flag)');
|
|
112
|
+
printHelp(scriptName, commands, cliVersion);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if ('--version' === commandName || '-v' === commandName || 'version' === commandName.toLowerCase()) {
|
|
116
|
+
if (!cliVersion) throw new CLIError('Failed to determine CLI version');
|
|
117
|
+
printVersion(scriptName, cliVersion);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const match = commands.find((c)=>c.name.toLowerCase() === commandName.toLowerCase());
|
|
121
|
+
if (!match) {
|
|
122
|
+
debug('unknown command: %s', commandName);
|
|
123
|
+
console.error(`Unknown command: ${commandName}`);
|
|
124
|
+
printHelp(scriptName, commands, cliVersion);
|
|
125
|
+
throw new CLIError(`Unknown command: ${commandName}`);
|
|
126
|
+
}
|
|
127
|
+
const parsedArgs = parseCliArgs(restArgs);
|
|
128
|
+
debug('command: %s, args: %s', match.name, JSON.stringify(parsedArgs));
|
|
129
|
+
if (true === parsedArgs.help) {
|
|
130
|
+
debug('showing command help for: %s', match.name);
|
|
131
|
+
printCommandHelp(scriptName, match);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const result = await match.def.handler(parsedArgs);
|
|
135
|
+
debug('command %s completed, isError: %s', match.name, result.isError ?? false);
|
|
136
|
+
outputResult(result);
|
|
137
|
+
await tools.destroy();
|
|
138
|
+
if (result.isError) throw new CLIError('Command failed', 1);
|
|
139
|
+
}
|
|
140
|
+
export { CLIError, parseCliArgs, parseValue, removePrefix, runToolsCLI };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { getBasicEnvValue } from "./env/basic.mjs";
|
|
5
|
+
import { MIDSCENE_RUN_DIR } from "./env/types.mjs";
|
|
6
|
+
import { ifInNode } from "./utils.mjs";
|
|
7
|
+
const defaultRunDirName = 'midscene_run';
|
|
8
|
+
const getMidsceneRunDir = ()=>{
|
|
9
|
+
if (!ifInNode) return '';
|
|
10
|
+
return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;
|
|
11
|
+
};
|
|
12
|
+
const getMidsceneRunBaseDir = ()=>{
|
|
13
|
+
if (!ifInNode) return '';
|
|
14
|
+
let basePath = node_path.resolve(process.cwd(), getMidsceneRunDir());
|
|
15
|
+
if (!existsSync(basePath)) try {
|
|
16
|
+
mkdirSync(basePath, {
|
|
17
|
+
recursive: true
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {
|
|
20
|
+
basePath = node_path.join(tmpdir(), defaultRunDirName);
|
|
21
|
+
mkdirSync(basePath, {
|
|
22
|
+
recursive: true
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return basePath;
|
|
26
|
+
};
|
|
27
|
+
const getMidsceneRunSubDir = (subdir)=>{
|
|
28
|
+
if (!ifInNode) return '';
|
|
29
|
+
const basePath = getMidsceneRunBaseDir();
|
|
30
|
+
const logPath = node_path.join(basePath, subdir);
|
|
31
|
+
if (!existsSync(logPath)) mkdirSync(logPath, {
|
|
32
|
+
recursive: true
|
|
33
|
+
});
|
|
34
|
+
return logPath;
|
|
35
|
+
};
|
|
36
|
+
const ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = 'NOT_IMPLEMENTED_AS_DESIGNED';
|
|
37
|
+
export { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, defaultRunDirName, getMidsceneRunBaseDir, getMidsceneRunDir, getMidsceneRunSubDir };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { getBasicEnvValue } from "./env/basic.mjs";
|
|
5
|
+
import { MIDSCENE_RUN_DIR } from "./env/types.mjs";
|
|
6
|
+
import { ifInNode } from "./utils.mjs";
|
|
7
|
+
const defaultRunDirName = 'midscene_run';
|
|
8
|
+
const getMidsceneRunDir = ()=>{
|
|
9
|
+
if (!ifInNode) return '';
|
|
10
|
+
return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;
|
|
11
|
+
};
|
|
12
|
+
const getMidsceneRunBaseDir = ()=>{
|
|
13
|
+
if (!ifInNode) return '';
|
|
14
|
+
let basePath = node_path.resolve(process.cwd(), getMidsceneRunDir());
|
|
15
|
+
if (!existsSync(basePath)) try {
|
|
16
|
+
mkdirSync(basePath, {
|
|
17
|
+
recursive: true
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {
|
|
20
|
+
basePath = node_path.join(tmpdir(), defaultRunDirName);
|
|
21
|
+
mkdirSync(basePath, {
|
|
22
|
+
recursive: true
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return basePath;
|
|
26
|
+
};
|
|
27
|
+
const getMidsceneRunSubDir = (subdir)=>{
|
|
28
|
+
if (!ifInNode) return '';
|
|
29
|
+
const basePath = getMidsceneRunBaseDir();
|
|
30
|
+
const logPath = node_path.join(basePath, subdir);
|
|
31
|
+
if (!existsSync(logPath)) mkdirSync(logPath, {
|
|
32
|
+
recursive: true
|
|
33
|
+
});
|
|
34
|
+
return logPath;
|
|
35
|
+
};
|
|
36
|
+
const ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = 'NOT_IMPLEMENTED_AS_DESIGNED';
|
|
37
|
+
export { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, defaultRunDirName, getMidsceneRunBaseDir, getMidsceneRunDir, getMidsceneRunSubDir };
|