@testdriverai/mcp 7.10.0-canary.0 → 7.10.1-test

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 (196) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/agent/index.js +116 -71
  3. package/agent/interface.js +13 -1
  4. package/agent/lib/commands.js +35 -15
  5. package/agent/lib/provision-commands.js +92 -11
  6. package/agent/lib/sandbox.js +263 -30
  7. package/agent/lib/sdk.js +16 -12
  8. package/agent/lib/system.js +107 -31
  9. package/ai/.claude-plugin/plugin.json +89 -4
  10. package/ai/agents/testdriver.md +4 -8
  11. package/ai/skills/testdriver-assert/SKILL.md +0 -1
  12. package/ai/skills/testdriver-aws-setup/SKILL.md +1 -1
  13. package/ai/skills/testdriver-caching/SKILL.md +13 -6
  14. package/ai/skills/testdriver-ci-cd/SKILL.md +57 -14
  15. package/ai/skills/testdriver-client/SKILL.md +10 -6
  16. package/ai/skills/testdriver-customizing-devices/SKILL.md +7 -5
  17. package/ai/skills/testdriver-dashcam/SKILL.md +36 -3
  18. package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +28 -4
  19. package/ai/skills/testdriver-device-config/SKILL.md +5 -5
  20. package/ai/skills/testdriver-find/SKILL.md +50 -11
  21. package/ai/skills/testdriver-generating-tests/SKILL.md +163 -8
  22. package/ai/skills/testdriver-hosted/SKILL.md +1 -1
  23. package/ai/skills/testdriver-machine-setup/SKILL.md +331 -0
  24. package/ai/skills/testdriver-making-assertions/SKILL.md +78 -2
  25. package/ai/skills/testdriver-mcp-workflow/SKILL.md +2 -2
  26. package/ai/skills/testdriver-parse/SKILL.md +1 -1
  27. package/ai/skills/testdriver-performing-actions/SKILL.md +97 -3
  28. package/ai/skills/testdriver-provision/SKILL.md +0 -20
  29. package/ai/skills/testdriver-quickstart/SKILL.md +299 -21
  30. package/ai/skills/testdriver-reusable-code/SKILL.md +3 -3
  31. package/ai/skills/testdriver-running-tests/SKILL.md +1 -1
  32. package/ai/skills/testdriver-screenshot/SKILL.md +5 -5
  33. package/ai/skills/testdriver-scroll/SKILL.md +30 -160
  34. package/ai/skills/testdriver-test-writer/SKILL.md +3 -5
  35. package/ai/skills/testdriver-testdriver/SKILL.md +3 -7
  36. package/ai/skills/testdriver-wait/SKILL.md +1 -1
  37. package/{docs/v7/ai.mdx → ai/skills/testdriver:ai/SKILL.md} +3 -4
  38. package/ai/skills/testdriver:assert/SKILL.md +315 -0
  39. package/ai/skills/testdriver:aws-setup/SKILL.md +448 -0
  40. package/ai/skills/testdriver:cache/SKILL.md +221 -0
  41. package/ai/skills/testdriver:caching/SKILL.md +124 -0
  42. package/ai/skills/testdriver:captcha/SKILL.md +158 -0
  43. package/ai/skills/testdriver:ci-cd/SKILL.md +659 -0
  44. package/ai/skills/testdriver:click/SKILL.md +286 -0
  45. package/ai/skills/testdriver:client/SKILL.md +477 -0
  46. package/ai/skills/testdriver:customizing-devices/SKILL.md +319 -0
  47. package/ai/skills/testdriver:dashcam/SKILL.md +451 -0
  48. package/ai/skills/testdriver:debugging-with-screenshots/SKILL.md +415 -0
  49. package/{docs/v7/device-config.mdx → ai/skills/testdriver:device-config/SKILL.md} +8 -8
  50. package/ai/skills/testdriver:double-click/SKILL.md +102 -0
  51. package/ai/skills/testdriver:elements/SKILL.md +605 -0
  52. package/ai/skills/testdriver:enterprise/SKILL.md +7 -0
  53. package/ai/skills/testdriver:errors/SKILL.md +246 -0
  54. package/ai/skills/testdriver:events/SKILL.md +356 -0
  55. package/ai/skills/testdriver:exec/SKILL.md +317 -0
  56. package/ai/skills/testdriver:find/SKILL.md +860 -0
  57. package/ai/skills/testdriver:focus-application/SKILL.md +293 -0
  58. package/ai/skills/testdriver:generating-tests/SKILL.md +25 -0
  59. package/ai/skills/testdriver:hosted/SKILL.md +156 -0
  60. package/ai/skills/testdriver:hover/SKILL.md +278 -0
  61. package/{docs/v7/locating-elements.mdx → ai/skills/testdriver:locating-elements/SKILL.md} +3 -3
  62. package/ai/skills/testdriver:making-assertions/SKILL.md +32 -0
  63. package/ai/skills/testdriver:mcp/SKILL.md +7 -0
  64. package/ai/skills/testdriver:mouse-down/SKILL.md +161 -0
  65. package/ai/skills/testdriver:mouse-up/SKILL.md +164 -0
  66. package/ai/skills/testdriver:parse/SKILL.md +236 -0
  67. package/ai/skills/testdriver:performing-actions/SKILL.md +53 -0
  68. package/ai/skills/testdriver:press-keys/SKILL.md +348 -0
  69. package/ai/skills/testdriver:provision/SKILL.md +331 -0
  70. package/ai/skills/testdriver:quickstart/SKILL.md +172 -0
  71. package/ai/skills/testdriver:redraw/SKILL.md +214 -0
  72. package/ai/skills/testdriver:reusable-code/SKILL.md +249 -0
  73. package/ai/skills/testdriver:right-click/SKILL.md +123 -0
  74. package/{docs/v7/running-tests.mdx → ai/skills/testdriver:running-tests/SKILL.md} +4 -4
  75. package/ai/skills/testdriver:screenshot/SKILL.md +248 -0
  76. package/ai/skills/testdriver:screenshots/SKILL.md +184 -0
  77. package/ai/skills/testdriver:scroll/SKILL.md +205 -0
  78. package/ai/skills/testdriver:secrets/SKILL.md +115 -0
  79. package/ai/skills/testdriver:self-hosted/SKILL.md +147 -0
  80. package/ai/skills/testdriver:test-results-json/SKILL.md +257 -0
  81. package/ai/skills/testdriver:testdriver/SKILL.md +624 -0
  82. package/ai/skills/testdriver:type/SKILL.md +357 -0
  83. package/ai/skills/testdriver:variables/SKILL.md +111 -0
  84. package/ai/skills/testdriver:wait/SKILL.md +50 -0
  85. package/{docs/v7/waiting-for-elements.mdx → ai/skills/testdriver:waiting-for-elements/SKILL.md} +3 -3
  86. package/ai/skills/testdriver:what-is-testdriver/SKILL.md +54 -0
  87. package/debugger/index.html +12 -0
  88. package/docs/_data/examples-manifest.json +54 -46
  89. package/docs/_data/examples-manifest.schema.json +12 -2
  90. package/docs/_scripts/extract-example-urls.js +21 -3
  91. package/docs/_scripts/generate-examples.js +64 -16
  92. package/docs/changelog.mdx +29 -2
  93. package/docs/claude-mcp-plugin.mdx +65 -18
  94. package/docs/docs.json +16 -33
  95. package/docs/snippets/tests/scroll-yaml.mdx +2 -2
  96. package/docs/v6/commands/scroll-until-image.mdx +1 -1
  97. package/docs/v6/commands/scroll-until-text.mdx +2 -2
  98. package/docs/v6/commands/scroll.mdx +2 -2
  99. package/docs/v7/_drafts/agents.mdx +0 -4
  100. package/docs/v7/_drafts/best-practices.mdx +0 -12
  101. package/docs/v7/_drafts/commands/scroll-until-image.mdx +1 -1
  102. package/docs/v7/_drafts/commands/scroll-until-text.mdx +2 -2
  103. package/docs/v7/_drafts/commands/scroll.mdx +1 -1
  104. package/docs/v7/_drafts/configuration.mdx +0 -12
  105. package/docs/v7/_drafts/faq.mdx +2 -10
  106. package/docs/v7/_drafts/readme.mdx +0 -1
  107. package/docs/v7/_drafts/troubleshooting.mdx +1 -4
  108. package/docs/v7/assert.mdx +0 -1
  109. package/docs/v7/aws-setup.mdx +1 -1
  110. package/docs/v7/caching.mdx +14 -10
  111. package/docs/v7/ci-cd.mdx +98 -14
  112. package/docs/v7/client.mdx +10 -6
  113. package/docs/v7/copilot/auto-healing.mdx +167 -18
  114. package/docs/v7/copilot/running-tests.mdx +915 -54
  115. package/docs/v7/customizing-devices.mdx +7 -5
  116. package/docs/v7/dashcam.mdx +36 -3
  117. package/docs/v7/debugging-with-screenshots.mdx +31 -7
  118. package/docs/v7/examples/ai.mdx +13 -8
  119. package/docs/v7/examples/assert.mdx +1 -1
  120. package/docs/v7/examples/chrome-extension.mdx +30 -13
  121. package/docs/v7/examples/element-not-found.mdx +1 -1
  122. package/docs/v7/examples/findall-coffee-icons.mdx +3 -2
  123. package/docs/v7/examples/formatted-logging.mdx +74 -0
  124. package/docs/v7/examples/hover-image.mdx +1 -1
  125. package/docs/v7/examples/hover-text-with-description.mdx +2 -2
  126. package/docs/v7/examples/hover-text.mdx +1 -1
  127. package/docs/v7/examples/installer.mdx +1 -1
  128. package/docs/v7/examples/launch-vscode-linux.mdx +27 -27
  129. package/docs/v7/examples/match-image.mdx +1 -1
  130. package/docs/v7/examples/parse.mdx +3 -2
  131. package/docs/v7/examples/press-keys.mdx +2 -2
  132. package/docs/v7/examples/scroll-keyboard.mdx +2 -2
  133. package/docs/v7/examples/scroll-until-text.mdx +1 -1
  134. package/docs/v7/examples/scroll.mdx +1 -1
  135. package/docs/v7/examples/type.mdx +1 -1
  136. package/docs/v7/find.mdx +50 -11
  137. package/docs/v7/generating-tests.mdx +166 -10
  138. package/docs/v7/hosted.mdx +1 -1
  139. package/docs/v7/making-assertions.mdx +81 -4
  140. package/docs/v7/parse.mdx +1 -1
  141. package/docs/v7/performing-actions.mdx +100 -5
  142. package/docs/v7/provision.mdx +0 -20
  143. package/docs/v7/quickstart.mdx +299 -21
  144. package/docs/v7/reusable-code.mdx +3 -3
  145. package/docs/v7/screenshot.mdx +5 -5
  146. package/docs/v7/scroll.mdx +30 -160
  147. package/docs/v7/wait.mdx +1 -1
  148. package/examples/chrome-extension.test.mjs +29 -12
  149. package/examples/config.mjs +1 -1
  150. package/examples/launch-vscode-linux.test.mjs +25 -25
  151. package/interfaces/cli/commands/init.js +84 -2
  152. package/interfaces/vitest-plugin.mjs +51 -61
  153. package/lib/core/Dashcam.js +43 -2
  154. package/lib/core/index.d.ts +13 -1
  155. package/lib/github-comment.mjs +11 -5
  156. package/lib/init-project.js +98 -44
  157. package/lib/install-clients.js +470 -0
  158. package/lib/provision.js +749 -0
  159. package/lib/resolve-channel.js +2 -2
  160. package/lib/sentry.js +15 -2
  161. package/lib/vitest/hooks.mjs +44 -34
  162. package/mcp-server/README.md +32 -0
  163. package/mcp-server/dist/core/actions.d.ts +176 -0
  164. package/mcp-server/dist/core/actions.js +753 -0
  165. package/mcp-server/dist/env-utils.d.ts +45 -0
  166. package/mcp-server/dist/env-utils.js +63 -0
  167. package/mcp-server/dist/provision-types.d.ts +6 -2
  168. package/mcp-server/dist/provision-types.js +3 -1
  169. package/mcp-server/dist/server.mjs +449 -751
  170. package/mcp-server/package-lock.json +384 -1
  171. package/mcp-server/package.json +5 -2
  172. package/mcp-server/src/core/actions.ts +912 -0
  173. package/mcp-server/src/env-utils.test.ts +82 -0
  174. package/mcp-server/src/env-utils.ts +77 -0
  175. package/mcp-server/src/provision-types.ts +4 -1
  176. package/mcp-server/src/server.ts +533 -954
  177. package/mcp-server/tsconfig.json +1 -1
  178. package/mcp-server/vitest.config.ts +7 -0
  179. package/package.json +15 -3
  180. package/sdk.d.ts +11 -9
  181. package/sdk.js +116 -746
  182. package/setup/aws/spawn-runner.sh +24 -3
  183. package/docs/v7/_drafts/caching-ai.mdx +0 -215
  184. package/docs/v7/_drafts/caching.mdx +0 -366
  185. package/docs/v7/_drafts/prompt-cache.mdx +0 -200
  186. package/docs/v7/copilot/creating-tests.mdx +0 -156
  187. package/docs/v7/copilot/github.mdx +0 -143
  188. package/docs/v7/copilot/setup.mdx +0 -143
  189. package/docs/v7/examples/exec-output.mdx +0 -84
  190. package/docs/v7/examples/exec-pwsh.mdx +0 -82
  191. package/docs/v7/examples/focus-window.mdx +0 -61
  192. package/docs/v7/examples/scroll-until-image.mdx +0 -82
  193. package/docs/v7/examples/windows-installer.mdx +0 -95
  194. package/examples/formatted-logging.test.mjs +0 -27
  195. package/examples/match-image.test.mjs +0 -55
  196. package/manual/exec-stream-logs.test.mjs +0 -25
@@ -21,7 +21,8 @@
21
21
  "tsx": "^4.19.0",
22
22
  "typescript": "^5.6.0",
23
23
  "vite": "^6.0.0",
24
- "vite-plugin-singlefile": "^2.3.0"
24
+ "vite-plugin-singlefile": "^2.3.0",
25
+ "vitest": "^4.0.18"
25
26
  }
26
27
  },
27
28
  "node_modules/@esbuild/aix-ppc64": {
@@ -478,6 +479,13 @@
478
479
  "hono": "^4"
479
480
  }
480
481
  },
482
+ "node_modules/@jridgewell/sourcemap-codec": {
483
+ "version": "1.5.5",
484
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
485
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
486
+ "dev": true,
487
+ "license": "MIT"
488
+ },
481
489
  "node_modules/@modelcontextprotocol/ext-apps": {
482
490
  "version": "1.0.1",
483
491
  "resolved": "https://registry.npmjs.org/@modelcontextprotocol/ext-apps/-/ext-apps-1.0.1.tgz",
@@ -1693,6 +1701,24 @@
1693
1701
  "@opentelemetry/semantic-conventions": "^1.34.0"
1694
1702
  }
1695
1703
  },
1704
+ "node_modules/@standard-schema/spec": {
1705
+ "version": "1.1.0",
1706
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
1707
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
1708
+ "dev": true,
1709
+ "license": "MIT"
1710
+ },
1711
+ "node_modules/@types/chai": {
1712
+ "version": "5.2.3",
1713
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
1714
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
1715
+ "dev": true,
1716
+ "license": "MIT",
1717
+ "dependencies": {
1718
+ "@types/deep-eql": "*",
1719
+ "assertion-error": "^2.0.1"
1720
+ }
1721
+ },
1696
1722
  "node_modules/@types/connect": {
1697
1723
  "version": "3.4.38",
1698
1724
  "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
@@ -1702,6 +1728,13 @@
1702
1728
  "@types/node": "*"
1703
1729
  }
1704
1730
  },
1731
+ "node_modules/@types/deep-eql": {
1732
+ "version": "4.0.2",
1733
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
1734
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
1735
+ "dev": true,
1736
+ "license": "MIT"
1737
+ },
1705
1738
  "node_modules/@types/estree": {
1706
1739
  "version": "1.0.8",
1707
1740
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -1769,6 +1802,119 @@
1769
1802
  "@types/node": "*"
1770
1803
  }
1771
1804
  },
1805
+ "node_modules/@vitest/expect": {
1806
+ "version": "4.1.5",
1807
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz",
1808
+ "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==",
1809
+ "dev": true,
1810
+ "license": "MIT",
1811
+ "dependencies": {
1812
+ "@standard-schema/spec": "^1.1.0",
1813
+ "@types/chai": "^5.2.2",
1814
+ "@vitest/spy": "4.1.5",
1815
+ "@vitest/utils": "4.1.5",
1816
+ "chai": "^6.2.2",
1817
+ "tinyrainbow": "^3.1.0"
1818
+ },
1819
+ "funding": {
1820
+ "url": "https://opencollective.com/vitest"
1821
+ }
1822
+ },
1823
+ "node_modules/@vitest/mocker": {
1824
+ "version": "4.1.5",
1825
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz",
1826
+ "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==",
1827
+ "dev": true,
1828
+ "license": "MIT",
1829
+ "dependencies": {
1830
+ "@vitest/spy": "4.1.5",
1831
+ "estree-walker": "^3.0.3",
1832
+ "magic-string": "^0.30.21"
1833
+ },
1834
+ "funding": {
1835
+ "url": "https://opencollective.com/vitest"
1836
+ },
1837
+ "peerDependencies": {
1838
+ "msw": "^2.4.9",
1839
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
1840
+ },
1841
+ "peerDependenciesMeta": {
1842
+ "msw": {
1843
+ "optional": true
1844
+ },
1845
+ "vite": {
1846
+ "optional": true
1847
+ }
1848
+ }
1849
+ },
1850
+ "node_modules/@vitest/pretty-format": {
1851
+ "version": "4.1.5",
1852
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz",
1853
+ "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==",
1854
+ "dev": true,
1855
+ "license": "MIT",
1856
+ "dependencies": {
1857
+ "tinyrainbow": "^3.1.0"
1858
+ },
1859
+ "funding": {
1860
+ "url": "https://opencollective.com/vitest"
1861
+ }
1862
+ },
1863
+ "node_modules/@vitest/runner": {
1864
+ "version": "4.1.5",
1865
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz",
1866
+ "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==",
1867
+ "dev": true,
1868
+ "license": "MIT",
1869
+ "dependencies": {
1870
+ "@vitest/utils": "4.1.5",
1871
+ "pathe": "^2.0.3"
1872
+ },
1873
+ "funding": {
1874
+ "url": "https://opencollective.com/vitest"
1875
+ }
1876
+ },
1877
+ "node_modules/@vitest/snapshot": {
1878
+ "version": "4.1.5",
1879
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz",
1880
+ "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==",
1881
+ "dev": true,
1882
+ "license": "MIT",
1883
+ "dependencies": {
1884
+ "@vitest/pretty-format": "4.1.5",
1885
+ "@vitest/utils": "4.1.5",
1886
+ "magic-string": "^0.30.21",
1887
+ "pathe": "^2.0.3"
1888
+ },
1889
+ "funding": {
1890
+ "url": "https://opencollective.com/vitest"
1891
+ }
1892
+ },
1893
+ "node_modules/@vitest/spy": {
1894
+ "version": "4.1.5",
1895
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz",
1896
+ "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==",
1897
+ "dev": true,
1898
+ "license": "MIT",
1899
+ "funding": {
1900
+ "url": "https://opencollective.com/vitest"
1901
+ }
1902
+ },
1903
+ "node_modules/@vitest/utils": {
1904
+ "version": "4.1.5",
1905
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz",
1906
+ "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==",
1907
+ "dev": true,
1908
+ "license": "MIT",
1909
+ "dependencies": {
1910
+ "@vitest/pretty-format": "4.1.5",
1911
+ "convert-source-map": "^2.0.0",
1912
+ "tinyrainbow": "^3.1.0"
1913
+ },
1914
+ "funding": {
1915
+ "url": "https://opencollective.com/vitest"
1916
+ }
1917
+ },
1772
1918
  "node_modules/accepts": {
1773
1919
  "version": "2.0.0",
1774
1920
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -1836,6 +1982,16 @@
1836
1982
  }
1837
1983
  }
1838
1984
  },
1985
+ "node_modules/assertion-error": {
1986
+ "version": "2.0.1",
1987
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
1988
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
1989
+ "dev": true,
1990
+ "license": "MIT",
1991
+ "engines": {
1992
+ "node": ">=12"
1993
+ }
1994
+ },
1839
1995
  "node_modules/balanced-match": {
1840
1996
  "version": "1.0.2",
1841
1997
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1926,6 +2082,16 @@
1926
2082
  "url": "https://github.com/sponsors/ljharb"
1927
2083
  }
1928
2084
  },
2085
+ "node_modules/chai": {
2086
+ "version": "6.2.2",
2087
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
2088
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
2089
+ "dev": true,
2090
+ "license": "MIT",
2091
+ "engines": {
2092
+ "node": ">=18"
2093
+ }
2094
+ },
1929
2095
  "node_modules/cjs-module-lexer": {
1930
2096
  "version": "1.4.3",
1931
2097
  "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
@@ -1954,6 +2120,13 @@
1954
2120
  "node": ">= 0.6"
1955
2121
  }
1956
2122
  },
2123
+ "node_modules/convert-source-map": {
2124
+ "version": "2.0.0",
2125
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
2126
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2127
+ "dev": true,
2128
+ "license": "MIT"
2129
+ },
1957
2130
  "node_modules/cookie": {
1958
2131
  "version": "0.7.2",
1959
2132
  "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
@@ -2095,6 +2268,13 @@
2095
2268
  "node": ">= 0.4"
2096
2269
  }
2097
2270
  },
2271
+ "node_modules/es-module-lexer": {
2272
+ "version": "2.0.0",
2273
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
2274
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
2275
+ "dev": true,
2276
+ "license": "MIT"
2277
+ },
2098
2278
  "node_modules/es-object-atoms": {
2099
2279
  "version": "1.1.1",
2100
2280
  "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
@@ -2155,6 +2335,16 @@
2155
2335
  "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
2156
2336
  "license": "MIT"
2157
2337
  },
2338
+ "node_modules/estree-walker": {
2339
+ "version": "3.0.3",
2340
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
2341
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
2342
+ "dev": true,
2343
+ "license": "MIT",
2344
+ "dependencies": {
2345
+ "@types/estree": "^1.0.0"
2346
+ }
2347
+ },
2158
2348
  "node_modules/etag": {
2159
2349
  "version": "1.8.1",
2160
2350
  "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -2185,6 +2375,16 @@
2185
2375
  "node": ">=18.0.0"
2186
2376
  }
2187
2377
  },
2378
+ "node_modules/expect-type": {
2379
+ "version": "1.3.0",
2380
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
2381
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
2382
+ "dev": true,
2383
+ "license": "Apache-2.0",
2384
+ "engines": {
2385
+ "node": ">=12.0.0"
2386
+ }
2387
+ },
2188
2388
  "node_modules/express": {
2189
2389
  "version": "5.2.1",
2190
2390
  "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
@@ -2582,6 +2782,16 @@
2582
2782
  "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
2583
2783
  "license": "BSD-2-Clause"
2584
2784
  },
2785
+ "node_modules/magic-string": {
2786
+ "version": "0.30.21",
2787
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
2788
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
2789
+ "dev": true,
2790
+ "license": "MIT",
2791
+ "dependencies": {
2792
+ "@jridgewell/sourcemap-codec": "^1.5.5"
2793
+ }
2794
+ },
2585
2795
  "node_modules/math-intrinsics": {
2586
2796
  "version": "1.1.0",
2587
2797
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -2740,6 +2950,17 @@
2740
2950
  "url": "https://github.com/sponsors/ljharb"
2741
2951
  }
2742
2952
  },
2953
+ "node_modules/obug": {
2954
+ "version": "2.1.1",
2955
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
2956
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
2957
+ "dev": true,
2958
+ "funding": [
2959
+ "https://github.com/sponsors/sxzz",
2960
+ "https://opencollective.com/debug"
2961
+ ],
2962
+ "license": "MIT"
2963
+ },
2743
2964
  "node_modules/on-finished": {
2744
2965
  "version": "2.4.1",
2745
2966
  "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -2795,6 +3016,13 @@
2795
3016
  "url": "https://opencollective.com/express"
2796
3017
  }
2797
3018
  },
3019
+ "node_modules/pathe": {
3020
+ "version": "2.0.3",
3021
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
3022
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
3023
+ "dev": true,
3024
+ "license": "MIT"
3025
+ },
2798
3026
  "node_modules/pg-int8": {
2799
3027
  "version": "1.0.1",
2800
3028
  "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
@@ -3257,6 +3485,13 @@
3257
3485
  "url": "https://github.com/sponsors/ljharb"
3258
3486
  }
3259
3487
  },
3488
+ "node_modules/siginfo": {
3489
+ "version": "2.0.0",
3490
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
3491
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
3492
+ "dev": true,
3493
+ "license": "ISC"
3494
+ },
3260
3495
  "node_modules/source-map-js": {
3261
3496
  "version": "1.2.1",
3262
3497
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -3267,6 +3502,13 @@
3267
3502
  "node": ">=0.10.0"
3268
3503
  }
3269
3504
  },
3505
+ "node_modules/stackback": {
3506
+ "version": "0.0.2",
3507
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
3508
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
3509
+ "dev": true,
3510
+ "license": "MIT"
3511
+ },
3270
3512
  "node_modules/statuses": {
3271
3513
  "version": "2.0.2",
3272
3514
  "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
@@ -3276,6 +3518,13 @@
3276
3518
  "node": ">= 0.8"
3277
3519
  }
3278
3520
  },
3521
+ "node_modules/std-env": {
3522
+ "version": "4.1.0",
3523
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz",
3524
+ "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==",
3525
+ "dev": true,
3526
+ "license": "MIT"
3527
+ },
3279
3528
  "node_modules/supports-preserve-symlinks-flag": {
3280
3529
  "version": "1.0.0",
3281
3530
  "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -3288,6 +3537,23 @@
3288
3537
  "url": "https://github.com/sponsors/ljharb"
3289
3538
  }
3290
3539
  },
3540
+ "node_modules/tinybench": {
3541
+ "version": "2.9.0",
3542
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
3543
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
3544
+ "dev": true,
3545
+ "license": "MIT"
3546
+ },
3547
+ "node_modules/tinyexec": {
3548
+ "version": "1.1.1",
3549
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
3550
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
3551
+ "dev": true,
3552
+ "license": "MIT",
3553
+ "engines": {
3554
+ "node": ">=18"
3555
+ }
3556
+ },
3291
3557
  "node_modules/tinyglobby": {
3292
3558
  "version": "0.2.15",
3293
3559
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -3305,6 +3571,16 @@
3305
3571
  "url": "https://github.com/sponsors/SuperchupuDev"
3306
3572
  }
3307
3573
  },
3574
+ "node_modules/tinyrainbow": {
3575
+ "version": "3.1.0",
3576
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
3577
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
3578
+ "dev": true,
3579
+ "license": "MIT",
3580
+ "engines": {
3581
+ "node": ">=14.0.0"
3582
+ }
3583
+ },
3308
3584
  "node_modules/to-regex-range": {
3309
3585
  "version": "5.0.1",
3310
3586
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -3975,6 +4251,96 @@
3975
4251
  "@esbuild/win32-x64": "0.25.12"
3976
4252
  }
3977
4253
  },
4254
+ "node_modules/vitest": {
4255
+ "version": "4.1.5",
4256
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz",
4257
+ "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==",
4258
+ "dev": true,
4259
+ "license": "MIT",
4260
+ "dependencies": {
4261
+ "@vitest/expect": "4.1.5",
4262
+ "@vitest/mocker": "4.1.5",
4263
+ "@vitest/pretty-format": "4.1.5",
4264
+ "@vitest/runner": "4.1.5",
4265
+ "@vitest/snapshot": "4.1.5",
4266
+ "@vitest/spy": "4.1.5",
4267
+ "@vitest/utils": "4.1.5",
4268
+ "es-module-lexer": "^2.0.0",
4269
+ "expect-type": "^1.3.0",
4270
+ "magic-string": "^0.30.21",
4271
+ "obug": "^2.1.1",
4272
+ "pathe": "^2.0.3",
4273
+ "picomatch": "^4.0.3",
4274
+ "std-env": "^4.0.0-rc.1",
4275
+ "tinybench": "^2.9.0",
4276
+ "tinyexec": "^1.0.2",
4277
+ "tinyglobby": "^0.2.15",
4278
+ "tinyrainbow": "^3.1.0",
4279
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
4280
+ "why-is-node-running": "^2.3.0"
4281
+ },
4282
+ "bin": {
4283
+ "vitest": "vitest.mjs"
4284
+ },
4285
+ "engines": {
4286
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
4287
+ },
4288
+ "funding": {
4289
+ "url": "https://opencollective.com/vitest"
4290
+ },
4291
+ "peerDependencies": {
4292
+ "@edge-runtime/vm": "*",
4293
+ "@opentelemetry/api": "^1.9.0",
4294
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
4295
+ "@vitest/browser-playwright": "4.1.5",
4296
+ "@vitest/browser-preview": "4.1.5",
4297
+ "@vitest/browser-webdriverio": "4.1.5",
4298
+ "@vitest/coverage-istanbul": "4.1.5",
4299
+ "@vitest/coverage-v8": "4.1.5",
4300
+ "@vitest/ui": "4.1.5",
4301
+ "happy-dom": "*",
4302
+ "jsdom": "*",
4303
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
4304
+ },
4305
+ "peerDependenciesMeta": {
4306
+ "@edge-runtime/vm": {
4307
+ "optional": true
4308
+ },
4309
+ "@opentelemetry/api": {
4310
+ "optional": true
4311
+ },
4312
+ "@types/node": {
4313
+ "optional": true
4314
+ },
4315
+ "@vitest/browser-playwright": {
4316
+ "optional": true
4317
+ },
4318
+ "@vitest/browser-preview": {
4319
+ "optional": true
4320
+ },
4321
+ "@vitest/browser-webdriverio": {
4322
+ "optional": true
4323
+ },
4324
+ "@vitest/coverage-istanbul": {
4325
+ "optional": true
4326
+ },
4327
+ "@vitest/coverage-v8": {
4328
+ "optional": true
4329
+ },
4330
+ "@vitest/ui": {
4331
+ "optional": true
4332
+ },
4333
+ "happy-dom": {
4334
+ "optional": true
4335
+ },
4336
+ "jsdom": {
4337
+ "optional": true
4338
+ },
4339
+ "vite": {
4340
+ "optional": false
4341
+ }
4342
+ }
4343
+ },
3978
4344
  "node_modules/which": {
3979
4345
  "version": "2.0.2",
3980
4346
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -3990,6 +4356,23 @@
3990
4356
  "node": ">= 8"
3991
4357
  }
3992
4358
  },
4359
+ "node_modules/why-is-node-running": {
4360
+ "version": "2.3.0",
4361
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
4362
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
4363
+ "dev": true,
4364
+ "license": "MIT",
4365
+ "dependencies": {
4366
+ "siginfo": "^2.0.0",
4367
+ "stackback": "0.0.2"
4368
+ },
4369
+ "bin": {
4370
+ "why-is-node-running": "cli.js"
4371
+ },
4372
+ "engines": {
4373
+ "node": ">=8"
4374
+ }
4375
+ },
3993
4376
  "node_modules/wrappy": {
3994
4377
  "version": "1.0.2",
3995
4378
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -10,7 +10,9 @@
10
10
  "build:ui": "cross-env INPUT=mcp-app.html vite build",
11
11
  "dev": "tsx watch src/server.ts",
12
12
  "serve": "tsx src/server.ts",
13
- "start": "node dist/server.js"
13
+ "serve:http": "cross-env TD_MCP_TRANSPORT=http tsx src/server.ts",
14
+ "start": "node dist/server.js",
15
+ "test": "vitest run"
14
16
  },
15
17
  "dependencies": {
16
18
  "@modelcontextprotocol/ext-apps": "^1.0.0",
@@ -26,6 +28,7 @@
26
28
  "tsx": "^4.19.0",
27
29
  "typescript": "^5.6.0",
28
30
  "vite": "^6.0.0",
29
- "vite-plugin-singlefile": "^2.3.0"
31
+ "vite-plugin-singlefile": "^2.3.0",
32
+ "vitest": "^4.0.18"
30
33
  }
31
34
  }