@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.
Files changed (382) hide show
  1. package/README.md +9 -0
  2. package/dist/es/baseDB.mjs +109 -0
  3. package/dist/es/baseDB.mjs.bak +109 -0
  4. package/dist/es/build/copy-static.mjs +31 -0
  5. package/dist/es/build/copy-static.mjs.bak +31 -0
  6. package/dist/es/build/rspack-config.mjs +4 -0
  7. package/dist/es/build/rspack-config.mjs.bak +4 -0
  8. package/dist/es/cli/cli-runner.mjs +140 -0
  9. package/dist/es/cli/cli-runner.mjs.bak +140 -0
  10. package/dist/es/cli/index.mjs +2 -0
  11. package/dist/es/cli/index.mjs.bak +2 -0
  12. package/dist/es/common.mjs +37 -0
  13. package/dist/es/common.mjs.bak +37 -0
  14. package/dist/es/constants/example-code.mjs +223 -0
  15. package/dist/es/constants/example-code.mjs.bak +223 -0
  16. package/dist/es/constants/index.mjs +23 -0
  17. package/dist/es/constants/index.mjs.bak +23 -0
  18. package/dist/es/env/basic.mjs +6 -0
  19. package/dist/es/env/basic.mjs.bak +6 -0
  20. package/dist/es/env/constants.mjs +70 -0
  21. package/dist/es/env/constants.mjs.bak +70 -0
  22. package/dist/es/env/global-config-manager.mjs +94 -0
  23. package/dist/es/env/global-config-manager.mjs.bak +94 -0
  24. package/dist/es/env/helper.mjs +43 -0
  25. package/dist/es/env/helper.mjs.bak +43 -0
  26. package/dist/es/env/index.mjs +5 -0
  27. package/dist/es/env/index.mjs.bak +5 -0
  28. package/dist/es/env/init-debug.mjs +18 -0
  29. package/dist/es/env/init-debug.mjs.bak +18 -0
  30. package/dist/es/env/model-config-manager.mjs +79 -0
  31. package/dist/es/env/model-config-manager.mjs.bak +79 -0
  32. package/dist/es/env/parse-model-config.mjs +132 -0
  33. package/dist/es/env/parse-model-config.mjs.bak +132 -0
  34. package/dist/es/env/types.mjs +220 -0
  35. package/dist/es/env/types.mjs.bak +220 -0
  36. package/dist/es/env/utils.mjs +26 -0
  37. package/dist/es/env/utils.mjs.bak +26 -0
  38. package/dist/es/extractor/constants.mjs +2 -0
  39. package/dist/es/extractor/constants.mjs.bak +2 -0
  40. package/dist/es/extractor/debug.mjs +6 -0
  41. package/dist/es/extractor/debug.mjs.bak +6 -0
  42. package/dist/es/extractor/dom-util.mjs +92 -0
  43. package/dist/es/extractor/dom-util.mjs.bak +92 -0
  44. package/dist/es/extractor/index.mjs +5 -0
  45. package/dist/es/extractor/index.mjs.bak +5 -0
  46. package/dist/es/extractor/locator.mjs +250 -0
  47. package/dist/es/extractor/locator.mjs.bak +250 -0
  48. package/dist/es/extractor/tree.mjs +78 -0
  49. package/dist/es/extractor/tree.mjs.bak +78 -0
  50. package/dist/es/extractor/util.mjs +245 -0
  51. package/dist/es/extractor/util.mjs.bak +245 -0
  52. package/dist/es/extractor/web-extractor.mjs +303 -0
  53. package/dist/es/extractor/web-extractor.mjs.bak +303 -0
  54. package/dist/es/img/box-select.mjs +824 -0
  55. package/dist/es/img/box-select.mjs.bak +824 -0
  56. package/dist/es/img/canvas-fallback.mjs +238 -0
  57. package/dist/es/img/canvas-fallback.mjs.bak +238 -0
  58. package/dist/es/img/get-photon.mjs +45 -0
  59. package/dist/es/img/get-photon.mjs.bak +45 -0
  60. package/dist/es/img/get-sharp.mjs +11 -0
  61. package/dist/es/img/get-sharp.mjs.bak +11 -0
  62. package/dist/es/img/index.mjs +4 -0
  63. package/dist/es/img/index.mjs.bak +4 -0
  64. package/dist/es/img/info.mjs +29 -0
  65. package/dist/es/img/info.mjs.bak +29 -0
  66. package/dist/es/img/transform.mjs +295 -0
  67. package/dist/es/img/transform.mjs.bak +295 -0
  68. package/dist/es/index.mjs +4 -0
  69. package/dist/es/index.mjs.bak +4 -0
  70. package/dist/es/logger.mjs +64 -0
  71. package/dist/es/logger.mjs.bak +64 -0
  72. package/dist/es/mcp/base-server.mjs +281 -0
  73. package/dist/es/mcp/base-server.mjs.bak +281 -0
  74. package/dist/es/mcp/base-tools.mjs +91 -0
  75. package/dist/es/mcp/base-tools.mjs.bak +91 -0
  76. package/dist/es/mcp/chrome-path.mjs +35 -0
  77. package/dist/es/mcp/chrome-path.mjs.bak +35 -0
  78. package/dist/es/mcp/index.mjs +7 -0
  79. package/dist/es/mcp/index.mjs.bak +7 -0
  80. package/dist/es/mcp/inject-report-html-plugin.mjs +53 -0
  81. package/dist/es/mcp/inject-report-html-plugin.mjs.bak +53 -0
  82. package/dist/es/mcp/launcher-helper.mjs +52 -0
  83. package/dist/es/mcp/launcher-helper.mjs.bak +52 -0
  84. package/dist/es/mcp/tool-generator.mjs +297 -0
  85. package/dist/es/mcp/tool-generator.mjs.bak +297 -0
  86. package/dist/es/mcp/types.mjs +3 -0
  87. package/dist/es/mcp/types.mjs.bak +3 -0
  88. package/dist/es/node/fs.mjs +44 -0
  89. package/dist/es/node/fs.mjs.bak +44 -0
  90. package/dist/es/node/index.mjs +2 -0
  91. package/dist/es/node/index.mjs.bak +2 -0
  92. package/dist/es/node/port.mjs +24 -0
  93. package/dist/es/node/port.mjs.bak +24 -0
  94. package/dist/es/oss/demo.mjs +30 -0
  95. package/dist/es/oss/demo.mjs.bak +30 -0
  96. package/dist/es/oss/index.mjs +90 -0
  97. package/dist/es/oss/index.mjs.bak +90 -0
  98. package/dist/es/polyfills/async-hooks.mjs +2 -0
  99. package/dist/es/polyfills/async-hooks.mjs.bak +2 -0
  100. package/dist/es/polyfills/index.mjs +1 -0
  101. package/dist/es/polyfills/index.mjs.bak +1 -0
  102. package/dist/es/types/index.mjs +3 -0
  103. package/dist/es/types/index.mjs.bak +3 -0
  104. package/dist/es/us-keyboard-layout.mjs +1414 -0
  105. package/dist/es/us-keyboard-layout.mjs.LICENSE.txt +5 -0
  106. package/dist/es/us-keyboard-layout.mjs.bak +1414 -0
  107. package/dist/es/utils.mjs +72 -0
  108. package/dist/es/utils.mjs.bak +72 -0
  109. package/dist/es/zod-schema-utils.mjs +54 -0
  110. package/dist/es/zod-schema-utils.mjs.bak +54 -0
  111. package/dist/lib/baseDB.js +149 -0
  112. package/dist/lib/baseDB.js.bak +149 -0
  113. package/dist/lib/build/copy-static.js +79 -0
  114. package/dist/lib/build/copy-static.js.bak +79 -0
  115. package/dist/lib/build/rspack-config.js +38 -0
  116. package/dist/lib/build/rspack-config.js.bak +38 -0
  117. package/dist/lib/cli/cli-runner.js +196 -0
  118. package/dist/lib/cli/cli-runner.js.bak +196 -0
  119. package/dist/lib/cli/index.js +48 -0
  120. package/dist/lib/cli/index.js.bak +48 -0
  121. package/dist/lib/common.js +93 -0
  122. package/dist/lib/common.js.bak +93 -0
  123. package/dist/lib/constants/example-code.js +260 -0
  124. package/dist/lib/constants/example-code.js.bak +260 -0
  125. package/dist/lib/constants/index.js +96 -0
  126. package/dist/lib/constants/index.js.bak +96 -0
  127. package/dist/lib/env/basic.js +40 -0
  128. package/dist/lib/env/basic.js.bak +40 -0
  129. package/dist/lib/env/constants.js +113 -0
  130. package/dist/lib/env/constants.js.bak +113 -0
  131. package/dist/lib/env/global-config-manager.js +128 -0
  132. package/dist/lib/env/global-config-manager.js.bak +128 -0
  133. package/dist/lib/env/helper.js +80 -0
  134. package/dist/lib/env/helper.js.bak +80 -0
  135. package/dist/lib/env/index.js +90 -0
  136. package/dist/lib/env/index.js.bak +90 -0
  137. package/dist/lib/env/init-debug.js +52 -0
  138. package/dist/lib/env/init-debug.js.bak +52 -0
  139. package/dist/lib/env/model-config-manager.js +113 -0
  140. package/dist/lib/env/model-config-manager.js.bak +113 -0
  141. package/dist/lib/env/parse-model-config.js +178 -0
  142. package/dist/lib/env/parse-model-config.js.bak +178 -0
  143. package/dist/lib/env/types.js +554 -0
  144. package/dist/lib/env/types.js.bak +554 -0
  145. package/dist/lib/env/utils.js +72 -0
  146. package/dist/lib/env/utils.js.bak +72 -0
  147. package/dist/lib/extractor/constants.js +42 -0
  148. package/dist/lib/extractor/constants.js.bak +42 -0
  149. package/dist/lib/extractor/debug.js +12 -0
  150. package/dist/lib/extractor/debug.js.bak +12 -0
  151. package/dist/lib/extractor/dom-util.js +153 -0
  152. package/dist/lib/extractor/dom-util.js.bak +153 -0
  153. package/dist/lib/extractor/index.js +81 -0
  154. package/dist/lib/extractor/index.js.bak +81 -0
  155. package/dist/lib/extractor/locator.js +296 -0
  156. package/dist/lib/extractor/locator.js.bak +296 -0
  157. package/dist/lib/extractor/tree.js +124 -0
  158. package/dist/lib/extractor/tree.js.bak +124 -0
  159. package/dist/lib/extractor/util.js +336 -0
  160. package/dist/lib/extractor/util.js.bak +336 -0
  161. package/dist/lib/extractor/web-extractor.js +349 -0
  162. package/dist/lib/extractor/web-extractor.js.bak +349 -0
  163. package/dist/lib/img/box-select.js +875 -0
  164. package/dist/lib/img/box-select.js.bak +875 -0
  165. package/dist/lib/img/canvas-fallback.js +305 -0
  166. package/dist/lib/img/canvas-fallback.js.bak +305 -0
  167. package/dist/lib/img/get-photon.js +82 -0
  168. package/dist/lib/img/get-photon.js.bak +82 -0
  169. package/dist/lib/img/get-sharp.js +45 -0
  170. package/dist/lib/img/get-sharp.js.bak +45 -0
  171. package/dist/lib/img/index.js +95 -0
  172. package/dist/lib/img/index.js.bak +95 -0
  173. package/dist/lib/img/info.js +83 -0
  174. package/dist/lib/img/info.js.bak +83 -0
  175. package/dist/lib/img/transform.js +387 -0
  176. package/dist/lib/img/transform.js.bak +387 -0
  177. package/dist/lib/index.js +47 -0
  178. package/dist/lib/index.js.bak +47 -0
  179. package/dist/lib/logger.js +114 -0
  180. package/dist/lib/logger.js.bak +114 -0
  181. package/dist/lib/mcp/base-server.js +331 -0
  182. package/dist/lib/mcp/base-server.js.bak +331 -0
  183. package/dist/lib/mcp/base-tools.js +125 -0
  184. package/dist/lib/mcp/base-tools.js.bak +125 -0
  185. package/dist/lib/mcp/chrome-path.js +72 -0
  186. package/dist/lib/mcp/chrome-path.js.bak +72 -0
  187. package/dist/lib/mcp/index.js +100 -0
  188. package/dist/lib/mcp/index.js.bak +100 -0
  189. package/dist/lib/mcp/inject-report-html-plugin.js +98 -0
  190. package/dist/lib/mcp/inject-report-html-plugin.js.bak +98 -0
  191. package/dist/lib/mcp/launcher-helper.js +86 -0
  192. package/dist/lib/mcp/launcher-helper.js.bak +86 -0
  193. package/dist/lib/mcp/tool-generator.js +334 -0
  194. package/dist/lib/mcp/tool-generator.js.bak +334 -0
  195. package/dist/lib/mcp/types.js +40 -0
  196. package/dist/lib/mcp/types.js.bak +40 -0
  197. package/dist/lib/node/fs.js +97 -0
  198. package/dist/lib/node/fs.js.bak +97 -0
  199. package/dist/lib/node/index.js +65 -0
  200. package/dist/lib/node/index.js.bak +65 -0
  201. package/dist/lib/node/port.js +61 -0
  202. package/dist/lib/node/port.js.bak +61 -0
  203. package/dist/lib/oss/demo.js +36 -0
  204. package/dist/lib/oss/demo.js.bak +36 -0
  205. package/dist/lib/oss/index.js +138 -0
  206. package/dist/lib/oss/index.js.bak +138 -0
  207. package/dist/lib/polyfills/async-hooks.js +36 -0
  208. package/dist/lib/polyfills/async-hooks.js.bak +36 -0
  209. package/dist/lib/polyfills/index.js +58 -0
  210. package/dist/lib/polyfills/index.js.bak +58 -0
  211. package/dist/lib/types/index.js +37 -0
  212. package/dist/lib/types/index.js.bak +37 -0
  213. package/dist/lib/us-keyboard-layout.js +1457 -0
  214. package/dist/lib/us-keyboard-layout.js.LICENSE.txt +5 -0
  215. package/dist/lib/us-keyboard-layout.js.bak +1457 -0
  216. package/dist/lib/utils.js +148 -0
  217. package/dist/lib/utils.js.bak +148 -0
  218. package/dist/lib/zod-schema-utils.js +97 -0
  219. package/dist/lib/zod-schema-utils.js.bak +97 -0
  220. package/dist/types/baseDB.d.ts +25 -0
  221. package/dist/types/baseDB.d.ts.bak +25 -0
  222. package/dist/types/build/copy-static.d.ts +31 -0
  223. package/dist/types/build/copy-static.d.ts.bak +31 -0
  224. package/dist/types/build/rspack-config.d.ts +8 -0
  225. package/dist/types/build/rspack-config.d.ts.bak +8 -0
  226. package/dist/types/cli/cli-runner.d.ts +14 -0
  227. package/dist/types/cli/cli-runner.d.ts.bak +14 -0
  228. package/dist/types/cli/index.d.ts +2 -0
  229. package/dist/types/cli/index.d.ts.bak +2 -0
  230. package/dist/types/common.d.ts +12 -0
  231. package/dist/types/common.d.ts.bak +12 -0
  232. package/dist/types/constants/example-code.d.ts +2 -0
  233. package/dist/types/constants/example-code.d.ts.bak +2 -0
  234. package/dist/types/constants/index.d.ts +21 -0
  235. package/dist/types/constants/index.d.ts.bak +21 -0
  236. package/dist/types/env/basic.d.ts +6 -0
  237. package/dist/types/env/basic.d.ts.bak +6 -0
  238. package/dist/types/env/constants.d.ts +40 -0
  239. package/dist/types/env/constants.d.ts.bak +40 -0
  240. package/dist/types/env/global-config-manager.d.ts +32 -0
  241. package/dist/types/env/global-config-manager.d.ts.bak +32 -0
  242. package/dist/types/env/helper.d.ts +4 -0
  243. package/dist/types/env/helper.d.ts.bak +4 -0
  244. package/dist/types/env/index.d.ts +4 -0
  245. package/dist/types/env/index.d.ts.bak +4 -0
  246. package/dist/types/env/init-debug.d.ts +1 -0
  247. package/dist/types/env/init-debug.d.ts.bak +1 -0
  248. package/dist/types/env/model-config-manager.d.ts +25 -0
  249. package/dist/types/env/model-config-manager.d.ts.bak +25 -0
  250. package/dist/types/env/parse-model-config.d.ts +31 -0
  251. package/dist/types/env/parse-model-config.d.ts.bak +31 -0
  252. package/dist/types/env/types.d.ts +318 -0
  253. package/dist/types/env/types.d.ts.bak +318 -0
  254. package/dist/types/env/utils.d.ts +38 -0
  255. package/dist/types/env/utils.d.ts.bak +38 -0
  256. package/dist/types/extractor/constants.d.ts +1 -0
  257. package/dist/types/extractor/constants.d.ts.bak +1 -0
  258. package/dist/types/extractor/debug.d.ts +1 -0
  259. package/dist/types/extractor/debug.d.ts.bak +1 -0
  260. package/dist/types/extractor/dom-util.d.ts +56 -0
  261. package/dist/types/extractor/dom-util.d.ts.bak +56 -0
  262. package/dist/types/extractor/index.d.ts +32 -0
  263. package/dist/types/extractor/index.d.ts.bak +32 -0
  264. package/dist/types/extractor/locator.d.ts +9 -0
  265. package/dist/types/extractor/locator.d.ts.bak +9 -0
  266. package/dist/types/extractor/tree.d.ts +6 -0
  267. package/dist/types/extractor/tree.d.ts.bak +6 -0
  268. package/dist/types/extractor/util.d.ts +47 -0
  269. package/dist/types/extractor/util.d.ts.bak +47 -0
  270. package/dist/types/extractor/web-extractor.d.ts +19 -0
  271. package/dist/types/extractor/web-extractor.d.ts.bak +19 -0
  272. package/dist/types/img/box-select.d.ts +26 -0
  273. package/dist/types/img/box-select.d.ts.bak +26 -0
  274. package/dist/types/img/canvas-fallback.d.ts +105 -0
  275. package/dist/types/img/canvas-fallback.d.ts.bak +105 -0
  276. package/dist/types/img/get-photon.d.ts +19 -0
  277. package/dist/types/img/get-photon.d.ts.bak +19 -0
  278. package/dist/types/img/get-sharp.d.ts +3 -0
  279. package/dist/types/img/get-sharp.d.ts.bak +3 -0
  280. package/dist/types/img/index.d.ts +3 -0
  281. package/dist/types/img/index.d.ts.bak +3 -0
  282. package/dist/types/img/info.d.ts +29 -0
  283. package/dist/types/img/info.d.ts.bak +29 -0
  284. package/dist/types/img/transform.d.ts +107 -0
  285. package/dist/types/img/transform.d.ts.bak +107 -0
  286. package/dist/types/index.d.ts +4 -0
  287. package/dist/types/index.d.ts.bak +4 -0
  288. package/dist/types/logger.d.ts +5 -0
  289. package/dist/types/logger.d.ts.bak +5 -0
  290. package/dist/types/mcp/base-server.d.ts +93 -0
  291. package/dist/types/mcp/base-server.d.ts.bak +93 -0
  292. package/dist/types/mcp/base-tools.d.ts +79 -0
  293. package/dist/types/mcp/base-tools.d.ts.bak +79 -0
  294. package/dist/types/mcp/chrome-path.d.ts +2 -0
  295. package/dist/types/mcp/chrome-path.d.ts.bak +2 -0
  296. package/dist/types/mcp/index.d.ts +7 -0
  297. package/dist/types/mcp/index.d.ts.bak +7 -0
  298. package/dist/types/mcp/inject-report-html-plugin.d.ts +18 -0
  299. package/dist/types/mcp/inject-report-html-plugin.d.ts.bak +18 -0
  300. package/dist/types/mcp/launcher-helper.d.ts +94 -0
  301. package/dist/types/mcp/launcher-helper.d.ts.bak +94 -0
  302. package/dist/types/mcp/tool-generator.d.ts +10 -0
  303. package/dist/types/mcp/tool-generator.d.ts.bak +10 -0
  304. package/dist/types/mcp/types.d.ts +103 -0
  305. package/dist/types/mcp/types.d.ts.bak +103 -0
  306. package/dist/types/node/fs.d.ts +15 -0
  307. package/dist/types/node/fs.d.ts.bak +15 -0
  308. package/dist/types/node/index.d.ts +2 -0
  309. package/dist/types/node/index.d.ts.bak +2 -0
  310. package/dist/types/node/port.d.ts +8 -0
  311. package/dist/types/node/port.d.ts.bak +8 -0
  312. package/dist/types/oss/demo.d.ts +1 -0
  313. package/dist/types/oss/demo.d.ts.bak +1 -0
  314. package/dist/types/oss/index.d.ts +34 -0
  315. package/dist/types/oss/index.d.ts.bak +34 -0
  316. package/dist/types/polyfills/async-hooks.d.ts +6 -0
  317. package/dist/types/polyfills/async-hooks.d.ts.bak +6 -0
  318. package/dist/types/polyfills/index.d.ts +4 -0
  319. package/dist/types/polyfills/index.d.ts.bak +4 -0
  320. package/dist/types/types/index.d.ts +34 -0
  321. package/dist/types/types/index.d.ts.bak +34 -0
  322. package/dist/types/us-keyboard-layout.d.ts +32 -0
  323. package/dist/types/us-keyboard-layout.d.ts.bak +32 -0
  324. package/dist/types/utils.d.ts +34 -0
  325. package/dist/types/utils.d.ts.bak +34 -0
  326. package/dist/types/zod-schema-utils.d.ts +23 -0
  327. package/dist/types/zod-schema-utils.d.ts.bak +23 -0
  328. package/package.json +132 -0
  329. package/src/baseDB.ts +158 -0
  330. package/src/build/copy-static.ts +68 -0
  331. package/src/build/rspack-config.ts +12 -0
  332. package/src/cli/cli-runner.ts +224 -0
  333. package/src/cli/index.ts +8 -0
  334. package/src/common.ts +67 -0
  335. package/src/constants/example-code.ts +223 -0
  336. package/src/constants/index.ts +29 -0
  337. package/src/env/basic.ts +12 -0
  338. package/src/env/constants.ts +234 -0
  339. package/src/env/global-config-manager.ts +191 -0
  340. package/src/env/helper.ts +58 -0
  341. package/src/env/index.ts +4 -0
  342. package/src/env/init-debug.ts +34 -0
  343. package/src/env/model-config-manager.ts +149 -0
  344. package/src/env/parse-model-config.ts +294 -0
  345. package/src/env/types.ts +547 -0
  346. package/src/env/utils.ts +89 -0
  347. package/src/extractor/constants.ts +5 -0
  348. package/src/extractor/debug.ts +10 -0
  349. package/src/extractor/dom-util.ts +226 -0
  350. package/src/extractor/index.ts +48 -0
  351. package/src/extractor/locator.ts +469 -0
  352. package/src/extractor/tree.ts +179 -0
  353. package/src/extractor/util.ts +482 -0
  354. package/src/extractor/web-extractor.ts +481 -0
  355. package/src/img/box-select.ts +588 -0
  356. package/src/img/canvas-fallback.ts +393 -0
  357. package/src/img/get-photon.ts +108 -0
  358. package/src/img/get-sharp.ts +18 -0
  359. package/src/img/index.ts +26 -0
  360. package/src/img/info.ts +75 -0
  361. package/src/img/transform.ts +594 -0
  362. package/src/index.ts +8 -0
  363. package/src/logger.ts +96 -0
  364. package/src/mcp/base-server.ts +502 -0
  365. package/src/mcp/base-tools.ts +185 -0
  366. package/src/mcp/chrome-path.ts +48 -0
  367. package/src/mcp/index.ts +7 -0
  368. package/src/mcp/inject-report-html-plugin.ts +119 -0
  369. package/src/mcp/launcher-helper.ts +200 -0
  370. package/src/mcp/tool-generator.ts +429 -0
  371. package/src/mcp/types.ts +112 -0
  372. package/src/node/fs.ts +84 -0
  373. package/src/node/index.ts +2 -0
  374. package/src/node/port.ts +37 -0
  375. package/src/oss/demo.ts +61 -0
  376. package/src/oss/index.ts +187 -0
  377. package/src/polyfills/async-hooks.ts +6 -0
  378. package/src/polyfills/index.ts +4 -0
  379. package/src/types/index.ts +52 -0
  380. package/src/us-keyboard-layout.ts +723 -0
  381. package/src/utils.ts +149 -0
  382. package/src/zod-schema-utils.ts +133 -0
package/src/baseDB.ts ADDED
@@ -0,0 +1,158 @@
1
+ // Generic database operations class
2
+ export class IndexedDBManager {
3
+ private dbPromise: Promise<IDBDatabase>;
4
+ private dbName: string;
5
+ private version: number;
6
+ private storeConfigs: Array<{ name: string; keyPath: string }>;
7
+
8
+ constructor(
9
+ dbName: string,
10
+ version: number,
11
+ storeConfigs: Array<{ name: string; keyPath: string }>,
12
+ ) {
13
+ this.dbName = dbName;
14
+ this.version = version;
15
+ this.storeConfigs = storeConfigs;
16
+ this.dbPromise = this.initDB();
17
+ }
18
+
19
+ private initDB(): Promise<IDBDatabase> {
20
+ return new Promise((resolve, reject) => {
21
+ const request = indexedDB.open(this.dbName, this.version);
22
+
23
+ request.onerror = () => reject(request.error);
24
+ request.onsuccess = () => resolve(request.result);
25
+
26
+ request.onupgradeneeded = (event) => {
27
+ const db = (event.target as IDBOpenDBRequest).result;
28
+
29
+ // Create stores if they don't exist
30
+ this.storeConfigs.forEach(({ name, keyPath }) => {
31
+ if (!db.objectStoreNames.contains(name)) {
32
+ const store = db.createObjectStore(name, { keyPath });
33
+ store.createIndex('timestamp', 'timestamp', { unique: false });
34
+ }
35
+ });
36
+ };
37
+ });
38
+ }
39
+
40
+ private async withTransaction<T>(
41
+ storeNames: string | string[],
42
+ mode: IDBTransactionMode,
43
+ operation: (stores: IDBObjectStore | IDBObjectStore[]) => Promise<T>,
44
+ ): Promise<T> {
45
+ const db = await this.dbPromise;
46
+ const transaction = db.transaction(storeNames, mode);
47
+
48
+ const stores = Array.isArray(storeNames)
49
+ ? storeNames.map((name) => transaction.objectStore(name))
50
+ : transaction.objectStore(storeNames);
51
+
52
+ return operation(stores);
53
+ }
54
+
55
+ private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {
56
+ return new Promise((resolve, reject) => {
57
+ request.onsuccess = () => resolve(request.result);
58
+ request.onerror = () => reject(request.error);
59
+ });
60
+ }
61
+
62
+ async put<T>(storeName: string, data: T): Promise<void> {
63
+ await this.withTransaction(storeName, 'readwrite', async (store) => {
64
+ await this.promisifyRequest((store as IDBObjectStore).put(data));
65
+ });
66
+ }
67
+
68
+ async get<T>(storeName: string, key: string): Promise<T | undefined> {
69
+ return this.withTransaction(storeName, 'readonly', async (store) => {
70
+ return this.promisifyRequest((store as IDBObjectStore).get(key));
71
+ });
72
+ }
73
+
74
+ async getAll<T>(storeName: string, sortByTimestamp = true): Promise<T[]> {
75
+ return this.withTransaction(storeName, 'readonly', async (store) => {
76
+ const objectStore = store as IDBObjectStore;
77
+ const results = sortByTimestamp
78
+ ? await this.promisifyRequest(objectStore.index('timestamp').getAll())
79
+ : await this.promisifyRequest(objectStore.getAll());
80
+
81
+ return sortByTimestamp
82
+ ? results.sort((a: any, b: any) => a.timestamp - b.timestamp)
83
+ : results;
84
+ });
85
+ }
86
+
87
+ async clear(storeName: string): Promise<void> {
88
+ await this.withTransaction(storeName, 'readwrite', async (store) => {
89
+ await this.promisifyRequest((store as IDBObjectStore).clear());
90
+ });
91
+ }
92
+
93
+ async delete(storeName: string, key: string): Promise<void> {
94
+ await this.withTransaction(storeName, 'readwrite', async (store) => {
95
+ await this.promisifyRequest((store as IDBObjectStore).delete(key));
96
+ });
97
+ }
98
+
99
+ async count(storeName: string): Promise<number> {
100
+ return this.withTransaction(storeName, 'readonly', async (store) => {
101
+ return this.promisifyRequest((store as IDBObjectStore).count());
102
+ });
103
+ }
104
+
105
+ getDBPromise(): Promise<IDBDatabase> {
106
+ return this.dbPromise;
107
+ }
108
+ }
109
+
110
+ // Generic error handler wrapper
111
+ export const withErrorHandling = async <T>(
112
+ operation: () => Promise<T>,
113
+ errorMessage: string,
114
+ defaultValue?: T,
115
+ onQuotaExceeded?: () => Promise<void>,
116
+ ): Promise<T | undefined> => {
117
+ try {
118
+ return await operation();
119
+ } catch (e) {
120
+ console.error(errorMessage, e);
121
+ if (
122
+ e instanceof Error &&
123
+ e.name === 'QuotaExceededError' &&
124
+ onQuotaExceeded
125
+ ) {
126
+ console.log('Storage quota exceeded, running cleanup...');
127
+ await onQuotaExceeded();
128
+ }
129
+ return defaultValue;
130
+ }
131
+ };
132
+
133
+ // Base cleanup function for managing storage space
134
+ export const createCleanupFunction = <
135
+ T extends { id: string; timestamp: number },
136
+ >(
137
+ dbManager: IndexedDBManager,
138
+ storeName: string,
139
+ maxItems: number,
140
+ ) => {
141
+ return async (): Promise<void> => {
142
+ try {
143
+ const results = await dbManager.getAll<T>(storeName);
144
+
145
+ if (results.length > maxItems) {
146
+ const toDelete = results
147
+ .sort((a, b) => a.timestamp - b.timestamp)
148
+ .slice(0, results.length - maxItems);
149
+
150
+ await Promise.all(
151
+ toDelete.map((item) => dbManager.delete(storeName, item.id)),
152
+ );
153
+ }
154
+ } catch (e) {
155
+ console.error(`Failed to cleanup ${storeName}:`, e);
156
+ }
157
+ };
158
+ };
@@ -0,0 +1,68 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export interface CopyStaticOptions {
5
+ /** Source directory to copy from */
6
+ srcDir: string;
7
+ /** Destination directory to copy to */
8
+ destDir: string;
9
+ /** Optional favicon source path (relative to directory containing srcDir) */
10
+ faviconPath?: string;
11
+ /** Name for the rsbuild plugin */
12
+ pluginName?: string;
13
+ }
14
+
15
+ /**
16
+ * Creates an rsbuild plugin that copies static files after build
17
+ * @param options Configuration options for copying static files
18
+ * @returns Rsbuild plugin object
19
+ */
20
+ export const createCopyStaticPlugin = (options: CopyStaticOptions) => ({
21
+ name: options.pluginName || 'copy-static',
22
+ setup(api: any) {
23
+ api.onAfterBuild(async () => {
24
+ const { srcDir, destDir, faviconPath } = options;
25
+
26
+ // Remove symlink left by dev mode before copying
27
+ const stat = await fs.promises.lstat(destDir).catch(() => null);
28
+ if (stat?.isSymbolicLink()) {
29
+ await fs.promises.unlink(destDir);
30
+ }
31
+
32
+ await fs.promises.mkdir(destDir, { recursive: true });
33
+
34
+ // Copy directory contents recursively
35
+ await fs.promises.cp(srcDir, destDir, { recursive: true });
36
+ console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
37
+
38
+ // Copy favicon if specified
39
+ if (faviconPath) {
40
+ const faviconDest = path.join(destDir, 'favicon.ico');
41
+ await fs.promises.copyFile(faviconPath, faviconDest);
42
+ console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
43
+ }
44
+ });
45
+ },
46
+ });
47
+
48
+ /**
49
+ * Helper function to create a copy static plugin for playground builds
50
+ * @param srcDir Source directory (usually dist directory)
51
+ * @param destDir Destination directory
52
+ * @param pluginName Optional plugin name
53
+ * @param faviconSrc Optional favicon source path
54
+ * @returns Rsbuild plugin
55
+ */
56
+ export const createPlaygroundCopyPlugin = (
57
+ srcDir: string,
58
+ destDir: string,
59
+ pluginName?: string,
60
+ faviconSrc?: string,
61
+ ) => {
62
+ return createCopyStaticPlugin({
63
+ srcDir,
64
+ destDir,
65
+ faviconPath: faviconSrc,
66
+ pluginName,
67
+ });
68
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Common Rspack configuration helpers for rsbuild projects
3
+ */
4
+
5
+ /**
6
+ * Common warning patterns to ignore in Rspack builds.
7
+ * These warnings are typically from optional dependencies or known non-critical issues.
8
+ */
9
+ export const commonIgnoreWarnings = [
10
+ // Ignore dynamic import warnings from langsmith/langfuse optional dependencies
11
+ /Critical dependency: the request of a dependency is an expression/,
12
+ ];
@@ -0,0 +1,224 @@
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';
6
+ import type { BaseMidsceneTools } from '../mcp/base-tools';
7
+ import type {
8
+ ToolDefinition,
9
+ ToolResult,
10
+ ToolResultContent,
11
+ } from '../mcp/types';
12
+
13
+ const debug = getDebug('cli-runner');
14
+
15
+ interface CLICommand {
16
+ name: string;
17
+ def: ToolDefinition;
18
+ }
19
+
20
+ export interface CLIRunnerOptions {
21
+ stripPrefix?: string;
22
+ argv?: string[];
23
+ version?: string;
24
+ }
25
+
26
+ export class CLIError extends Error {
27
+ constructor(
28
+ message: string,
29
+ public exitCode = 1,
30
+ ) {
31
+ super(message);
32
+ }
33
+ }
34
+
35
+ export function parseValue(raw: string): unknown {
36
+ // JSON objects/arrays
37
+ if (raw.startsWith('{') || raw.startsWith('[')) {
38
+ try {
39
+ return JSON.parse(raw);
40
+ } catch {
41
+ // Not valid JSON, treat as string below
42
+ }
43
+ }
44
+
45
+ // Numbers
46
+ if (/^-?\d+(\.\d+)?$/.test(raw)) {
47
+ return Number(raw);
48
+ }
49
+
50
+ return raw;
51
+ }
52
+
53
+ export function parseCliArgs(args: string[]): Record<string, unknown> {
54
+ const result: Record<string, unknown> = {};
55
+
56
+ for (let i = 0; i < args.length; i++) {
57
+ const arg = args[i];
58
+ if (!arg.startsWith('--')) continue;
59
+
60
+ const body = arg.slice(2);
61
+ const eqIdx = body.indexOf('=');
62
+
63
+ if (eqIdx >= 0) {
64
+ // --key=value
65
+ result[body.slice(0, eqIdx)] = parseValue(body.slice(eqIdx + 1));
66
+ } else if (args[i + 1] && !args[i + 1].startsWith('--')) {
67
+ // --key value
68
+ i++;
69
+ result[body] = parseValue(args[i]);
70
+ } else {
71
+ // --flag (boolean)
72
+ result[body] = true;
73
+ }
74
+ }
75
+
76
+ return result;
77
+ }
78
+
79
+ function outputContentItem(item: ToolResultContent, isError: boolean): void {
80
+ switch (item.type) {
81
+ case 'text':
82
+ if (isError) {
83
+ console.error(item.text);
84
+ } else {
85
+ console.log(item.text);
86
+ }
87
+ break;
88
+
89
+ case 'image': {
90
+ const filename = `screenshot-${Date.now()}.png`;
91
+ const filepath = join(tmpdir(), filename);
92
+ writeFileSync(filepath, Buffer.from(item.data, 'base64'));
93
+ console.log(`Screenshot saved: ${filepath}`);
94
+ break;
95
+ }
96
+
97
+ default:
98
+ console.log(`[${item.type} content not displayed in CLI]`);
99
+ }
100
+ }
101
+
102
+ function outputResult(result: ToolResult): void {
103
+ for (const item of result.content) {
104
+ outputContentItem(item, result.isError ?? false);
105
+ }
106
+ }
107
+
108
+ export function removePrefix(name: string, prefix?: string): string {
109
+ if (prefix && name.startsWith(prefix)) {
110
+ return name.slice(prefix.length);
111
+ }
112
+ return name;
113
+ }
114
+
115
+ function printCommandHelp(scriptName: string, cmd: CLICommand): void {
116
+ const { def } = cmd;
117
+ console.log(`\nUsage: ${scriptName} ${cmd.name} [options]\n`);
118
+ console.log(def.description);
119
+
120
+ const schemaEntries = Object.entries(def.schema);
121
+ if (schemaEntries.length > 0) {
122
+ console.log('\nOptions:');
123
+ for (const [key, zodType] of schemaEntries) {
124
+ const desc = zodType.description ?? '';
125
+ console.log(` --${key.padEnd(20)} ${desc}`);
126
+ }
127
+ }
128
+ }
129
+
130
+ function printVersion(scriptName: string, version: string): void {
131
+ console.log(`${scriptName} v${version}`);
132
+ }
133
+
134
+ function printHelp(
135
+ scriptName: string,
136
+ commands: CLICommand[],
137
+ version?: string,
138
+ ): void {
139
+ if (version) {
140
+ printVersion(scriptName, version);
141
+ console.log('');
142
+ }
143
+ console.log(`\nUsage: ${scriptName} <command> [options]\n`);
144
+ console.log('Commands:');
145
+ for (const { name, def } of commands) {
146
+ console.log(` ${name.padEnd(30)} ${def.description}`);
147
+ }
148
+ console.log(` ${'version'.padEnd(30)} Show CLI version`);
149
+ console.log(`\nRun "${scriptName} <command> --help" for more info.`);
150
+ }
151
+
152
+ export async function runToolsCLI(
153
+ tools: BaseMidsceneTools,
154
+ scriptName: string,
155
+ options?: CLIRunnerOptions,
156
+ ): Promise<void> {
157
+ const rawArgs = options?.argv ?? process.argv.slice(2);
158
+ debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
159
+
160
+ // Load .env from cwd before any tool initialization
161
+ const envFile = join(process.cwd(), '.env');
162
+ if (existsSync(envFile)) {
163
+ dotenv.config({ path: envFile });
164
+ }
165
+
166
+ await tools.initTools();
167
+
168
+ const commands: CLICommand[] = tools.getToolDefinitions().map((def) => ({
169
+ name: removePrefix(def.name, options?.stripPrefix).toLowerCase(),
170
+ def,
171
+ }));
172
+ const cliVersion = options?.version;
173
+
174
+ const [commandName, ...restArgs] = rawArgs;
175
+
176
+ if (!commandName || commandName === '--help' || commandName === '-h') {
177
+ debug('showing help (no command or --help flag)');
178
+ printHelp(scriptName, commands, cliVersion);
179
+ return;
180
+ }
181
+
182
+ if (
183
+ commandName === '--version' ||
184
+ commandName === '-v' ||
185
+ commandName.toLowerCase() === 'version'
186
+ ) {
187
+ if (!cliVersion) {
188
+ throw new CLIError('Failed to determine CLI version');
189
+ }
190
+ printVersion(scriptName, cliVersion);
191
+ return;
192
+ }
193
+
194
+ const match = commands.find(
195
+ (c) => c.name.toLowerCase() === commandName.toLowerCase(),
196
+ );
197
+ if (!match) {
198
+ debug('unknown command: %s', commandName);
199
+ console.error(`Unknown command: ${commandName}`);
200
+ printHelp(scriptName, commands, cliVersion);
201
+ throw new CLIError(`Unknown command: ${commandName}`);
202
+ }
203
+
204
+ const parsedArgs = parseCliArgs(restArgs);
205
+ debug('command: %s, args: %s', match.name, JSON.stringify(parsedArgs));
206
+
207
+ if (parsedArgs.help === true) {
208
+ debug('showing command help for: %s', match.name);
209
+ printCommandHelp(scriptName, match);
210
+ return;
211
+ }
212
+
213
+ const result = await match.def.handler(parsedArgs);
214
+ debug(
215
+ 'command %s completed, isError: %s',
216
+ match.name,
217
+ result.isError ?? false,
218
+ );
219
+ outputResult(result);
220
+ await tools.destroy();
221
+ if (result.isError) {
222
+ throw new CLIError('Command failed', 1);
223
+ }
224
+ }
@@ -0,0 +1,8 @@
1
+ export {
2
+ runToolsCLI,
3
+ CLIError,
4
+ parseValue,
5
+ parseCliArgs,
6
+ removePrefix,
7
+ } from './cli-runner';
8
+ export type { CLIRunnerOptions } from './cli-runner';
package/src/common.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { existsSync, mkdirSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ // do not import getBasicEnvValue and MIDSCENE_RUN_DIR directly from ./env,
5
+ // because it will cause circular dependency
6
+ import { getBasicEnvValue } from './env/basic';
7
+ import { MIDSCENE_RUN_DIR } from './env/types';
8
+ import { ifInNode } from './utils';
9
+
10
+ export const defaultRunDirName = 'midscene_run';
11
+ // Define locally for now to avoid import issues
12
+
13
+ export const getMidsceneRunDir = () => {
14
+ if (!ifInNode) {
15
+ return '';
16
+ }
17
+
18
+ return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;
19
+ };
20
+
21
+ export const getMidsceneRunBaseDir = () => {
22
+ if (!ifInNode) {
23
+ return '';
24
+ }
25
+
26
+ let basePath = path.resolve(process.cwd(), getMidsceneRunDir());
27
+
28
+ // Create a base directory
29
+ if (!existsSync(basePath)) {
30
+ try {
31
+ mkdirSync(basePath, { recursive: true });
32
+ } catch (error) {
33
+ // console.error(`Failed to create ${runDirName} directory: ${error}`);
34
+ basePath = path.join(tmpdir(), defaultRunDirName);
35
+ mkdirSync(basePath, { recursive: true });
36
+ }
37
+ }
38
+
39
+ return basePath;
40
+ };
41
+
42
+ /**
43
+ * Get the path to the midscene_run directory or a subdirectory within it.
44
+ * Creates the directory if it doesn't exist.
45
+ *
46
+ * @param subdir - Optional subdirectory name (e.g., 'log', 'report')
47
+ * @returns The absolute path to the requested directory
48
+ */
49
+ export const getMidsceneRunSubDir = (
50
+ subdir: 'dump' | 'cache' | 'report' | 'tmp' | 'log' | 'output',
51
+ ): string => {
52
+ if (!ifInNode) {
53
+ return '';
54
+ }
55
+
56
+ // Create a log directory
57
+ const basePath = getMidsceneRunBaseDir();
58
+ const logPath = path.join(basePath, subdir);
59
+ if (!existsSync(logPath)) {
60
+ mkdirSync(logPath, { recursive: true });
61
+ }
62
+
63
+ return logPath;
64
+ };
65
+
66
+ export const ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED =
67
+ 'NOT_IMPLEMENTED_AS_DESIGNED';