@metamask/client-mcp-core 0.1.0

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 (486) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +6 -0
  3. package/LICENSE.APACHE2 +201 -0
  4. package/LICENSE.MIT +21 -0
  5. package/README.md +1459 -0
  6. package/dist/capabilities/context.cjs +34 -0
  7. package/dist/capabilities/context.cjs.map +1 -0
  8. package/dist/capabilities/context.d.cts +101 -0
  9. package/dist/capabilities/context.d.cts.map +1 -0
  10. package/dist/capabilities/context.d.mts +101 -0
  11. package/dist/capabilities/context.d.mts.map +1 -0
  12. package/dist/capabilities/context.mjs +29 -0
  13. package/dist/capabilities/context.mjs.map +1 -0
  14. package/dist/capabilities/index.cjs +18 -0
  15. package/dist/capabilities/index.cjs.map +1 -0
  16. package/dist/capabilities/index.d.cts +3 -0
  17. package/dist/capabilities/index.d.cts.map +1 -0
  18. package/dist/capabilities/index.d.mts +3 -0
  19. package/dist/capabilities/index.d.mts.map +1 -0
  20. package/dist/capabilities/index.mjs +2 -0
  21. package/dist/capabilities/index.mjs.map +1 -0
  22. package/dist/capabilities/types.cjs +3 -0
  23. package/dist/capabilities/types.cjs.map +1 -0
  24. package/dist/capabilities/types.d.cts +152 -0
  25. package/dist/capabilities/types.d.cts.map +1 -0
  26. package/dist/capabilities/types.d.mts +152 -0
  27. package/dist/capabilities/types.d.mts.map +1 -0
  28. package/dist/capabilities/types.mjs +2 -0
  29. package/dist/capabilities/types.mjs.map +1 -0
  30. package/dist/index.cjs +59 -0
  31. package/dist/index.cjs.map +1 -0
  32. package/dist/index.d.cts +33 -0
  33. package/dist/index.d.cts.map +1 -0
  34. package/dist/index.d.mts +33 -0
  35. package/dist/index.d.mts.map +1 -0
  36. package/dist/index.mjs +43 -0
  37. package/dist/index.mjs.map +1 -0
  38. package/dist/launcher/console-error-buffer.cjs +72 -0
  39. package/dist/launcher/console-error-buffer.cjs.map +1 -0
  40. package/dist/launcher/console-error-buffer.d.cts +43 -0
  41. package/dist/launcher/console-error-buffer.d.cts.map +1 -0
  42. package/dist/launcher/console-error-buffer.d.mts +43 -0
  43. package/dist/launcher/console-error-buffer.d.mts.map +1 -0
  44. package/dist/launcher/console-error-buffer.mjs +68 -0
  45. package/dist/launcher/console-error-buffer.mjs.map +1 -0
  46. package/dist/launcher/extension-id-resolver.cjs +177 -0
  47. package/dist/launcher/extension-id-resolver.cjs.map +1 -0
  48. package/dist/launcher/extension-id-resolver.d.cts +32 -0
  49. package/dist/launcher/extension-id-resolver.d.cts.map +1 -0
  50. package/dist/launcher/extension-id-resolver.d.mts +32 -0
  51. package/dist/launcher/extension-id-resolver.d.mts.map +1 -0
  52. package/dist/launcher/extension-id-resolver.mjs +173 -0
  53. package/dist/launcher/extension-id-resolver.mjs.map +1 -0
  54. package/dist/launcher/extension-readiness.cjs +50 -0
  55. package/dist/launcher/extension-readiness.cjs.map +1 -0
  56. package/dist/launcher/extension-readiness.d.cts +37 -0
  57. package/dist/launcher/extension-readiness.d.cts.map +1 -0
  58. package/dist/launcher/extension-readiness.d.mts +37 -0
  59. package/dist/launcher/extension-readiness.d.mts.map +1 -0
  60. package/dist/launcher/extension-readiness.mjs +43 -0
  61. package/dist/launcher/extension-readiness.mjs.map +1 -0
  62. package/dist/launcher/index.cjs +21 -0
  63. package/dist/launcher/index.cjs.map +1 -0
  64. package/dist/launcher/index.d.cts +5 -0
  65. package/dist/launcher/index.d.cts.map +1 -0
  66. package/dist/launcher/index.d.mts +5 -0
  67. package/dist/launcher/index.d.mts.map +1 -0
  68. package/dist/launcher/index.mjs +5 -0
  69. package/dist/launcher/index.mjs.map +1 -0
  70. package/dist/launcher/retry.cjs +35 -0
  71. package/dist/launcher/retry.cjs.map +1 -0
  72. package/dist/launcher/retry.d.cts +20 -0
  73. package/dist/launcher/retry.d.cts.map +1 -0
  74. package/dist/launcher/retry.d.mts +20 -0
  75. package/dist/launcher/retry.d.mts.map +1 -0
  76. package/dist/launcher/retry.mjs +31 -0
  77. package/dist/launcher/retry.mjs.map +1 -0
  78. package/dist/mcp-server/constants.cjs +22 -0
  79. package/dist/mcp-server/constants.cjs.map +1 -0
  80. package/dist/mcp-server/constants.d.cts +13 -0
  81. package/dist/mcp-server/constants.d.cts.map +1 -0
  82. package/dist/mcp-server/constants.d.mts +13 -0
  83. package/dist/mcp-server/constants.d.mts.map +1 -0
  84. package/dist/mcp-server/constants.mjs +19 -0
  85. package/dist/mcp-server/constants.mjs.map +1 -0
  86. package/dist/mcp-server/discovery.cjs +299 -0
  87. package/dist/mcp-server/discovery.cjs.map +1 -0
  88. package/dist/mcp-server/discovery.d.cts +56 -0
  89. package/dist/mcp-server/discovery.d.cts.map +1 -0
  90. package/dist/mcp-server/discovery.d.mts +56 -0
  91. package/dist/mcp-server/discovery.d.mts.map +1 -0
  92. package/dist/mcp-server/discovery.mjs +292 -0
  93. package/dist/mcp-server/discovery.mjs.map +1 -0
  94. package/dist/mcp-server/knowledge-store.cjs +1196 -0
  95. package/dist/mcp-server/knowledge-store.cjs.map +1 -0
  96. package/dist/mcp-server/knowledge-store.d.cts +249 -0
  97. package/dist/mcp-server/knowledge-store.d.cts.map +1 -0
  98. package/dist/mcp-server/knowledge-store.d.mts +249 -0
  99. package/dist/mcp-server/knowledge-store.d.mts.map +1 -0
  100. package/dist/mcp-server/knowledge-store.mjs +1154 -0
  101. package/dist/mcp-server/knowledge-store.mjs.map +1 -0
  102. package/dist/mcp-server/schemas.cjs +433 -0
  103. package/dist/mcp-server/schemas.cjs.map +1 -0
  104. package/dist/mcp-server/schemas.d.cts +557 -0
  105. package/dist/mcp-server/schemas.d.cts.map +1 -0
  106. package/dist/mcp-server/schemas.d.mts +557 -0
  107. package/dist/mcp-server/schemas.d.mts.map +1 -0
  108. package/dist/mcp-server/schemas.mjs +430 -0
  109. package/dist/mcp-server/schemas.mjs.map +1 -0
  110. package/dist/mcp-server/server.cjs +161 -0
  111. package/dist/mcp-server/server.cjs.map +1 -0
  112. package/dist/mcp-server/server.d.cts +24 -0
  113. package/dist/mcp-server/server.d.cts.map +1 -0
  114. package/dist/mcp-server/server.d.mts +24 -0
  115. package/dist/mcp-server/server.d.mts.map +1 -0
  116. package/dist/mcp-server/server.mjs +158 -0
  117. package/dist/mcp-server/server.mjs.map +1 -0
  118. package/dist/mcp-server/session-manager.cjs +53 -0
  119. package/dist/mcp-server/session-manager.cjs.map +1 -0
  120. package/dist/mcp-server/session-manager.d.cts +240 -0
  121. package/dist/mcp-server/session-manager.d.cts.map +1 -0
  122. package/dist/mcp-server/session-manager.d.mts +240 -0
  123. package/dist/mcp-server/session-manager.d.mts.map +1 -0
  124. package/dist/mcp-server/session-manager.mjs +48 -0
  125. package/dist/mcp-server/session-manager.mjs.map +1 -0
  126. package/dist/mcp-server/test-utils/flush-promises.cjs +10 -0
  127. package/dist/mcp-server/test-utils/flush-promises.cjs.map +1 -0
  128. package/dist/mcp-server/test-utils/flush-promises.d.cts +2 -0
  129. package/dist/mcp-server/test-utils/flush-promises.d.cts.map +1 -0
  130. package/dist/mcp-server/test-utils/flush-promises.d.mts +2 -0
  131. package/dist/mcp-server/test-utils/flush-promises.d.mts.map +1 -0
  132. package/dist/mcp-server/test-utils/flush-promises.mjs +7 -0
  133. package/dist/mcp-server/test-utils/flush-promises.mjs.map +1 -0
  134. package/dist/mcp-server/test-utils/index.cjs +13 -0
  135. package/dist/mcp-server/test-utils/index.cjs.map +1 -0
  136. package/dist/mcp-server/test-utils/index.d.cts +4 -0
  137. package/dist/mcp-server/test-utils/index.d.cts.map +1 -0
  138. package/dist/mcp-server/test-utils/index.d.mts +4 -0
  139. package/dist/mcp-server/test-utils/index.d.mts.map +1 -0
  140. package/dist/mcp-server/test-utils/index.mjs +4 -0
  141. package/dist/mcp-server/test-utils/index.mjs.map +1 -0
  142. package/dist/mcp-server/test-utils/mock-factories.cjs +129 -0
  143. package/dist/mcp-server/test-utils/mock-factories.cjs.map +1 -0
  144. package/dist/mcp-server/test-utils/mock-factories.d.cts +89 -0
  145. package/dist/mcp-server/test-utils/mock-factories.d.cts.map +1 -0
  146. package/dist/mcp-server/test-utils/mock-factories.d.mts +89 -0
  147. package/dist/mcp-server/test-utils/mock-factories.d.mts.map +1 -0
  148. package/dist/mcp-server/test-utils/mock-factories.mjs +125 -0
  149. package/dist/mcp-server/test-utils/mock-factories.mjs.map +1 -0
  150. package/dist/mcp-server/test-utils/mock-playwright.cjs +205 -0
  151. package/dist/mcp-server/test-utils/mock-playwright.cjs.map +1 -0
  152. package/dist/mcp-server/test-utils/mock-playwright.d.cts +69 -0
  153. package/dist/mcp-server/test-utils/mock-playwright.d.cts.map +1 -0
  154. package/dist/mcp-server/test-utils/mock-playwright.d.mts +69 -0
  155. package/dist/mcp-server/test-utils/mock-playwright.d.mts.map +1 -0
  156. package/dist/mcp-server/test-utils/mock-playwright.mjs +200 -0
  157. package/dist/mcp-server/test-utils/mock-playwright.mjs.map +1 -0
  158. package/dist/mcp-server/tokenization.cjs +117 -0
  159. package/dist/mcp-server/tokenization.cjs.map +1 -0
  160. package/dist/mcp-server/tokenization.d.cts +22 -0
  161. package/dist/mcp-server/tokenization.d.cts.map +1 -0
  162. package/dist/mcp-server/tokenization.d.mts +22 -0
  163. package/dist/mcp-server/tokenization.d.mts.map +1 -0
  164. package/dist/mcp-server/tokenization.mjs +112 -0
  165. package/dist/mcp-server/tokenization.mjs.map +1 -0
  166. package/dist/mcp-server/tools/batch.cjs +199 -0
  167. package/dist/mcp-server/tools/batch.cjs.map +1 -0
  168. package/dist/mcp-server/tools/batch.d.cts +81 -0
  169. package/dist/mcp-server/tools/batch.d.cts.map +1 -0
  170. package/dist/mcp-server/tools/batch.d.mts +81 -0
  171. package/dist/mcp-server/tools/batch.d.mts.map +1 -0
  172. package/dist/mcp-server/tools/batch.mjs +191 -0
  173. package/dist/mcp-server/tools/batch.mjs.map +1 -0
  174. package/dist/mcp-server/tools/build.cjs +47 -0
  175. package/dist/mcp-server/tools/build.cjs.map +1 -0
  176. package/dist/mcp-server/tools/build.d.cts +22 -0
  177. package/dist/mcp-server/tools/build.d.cts.map +1 -0
  178. package/dist/mcp-server/tools/build.d.mts +22 -0
  179. package/dist/mcp-server/tools/build.d.mts.map +1 -0
  180. package/dist/mcp-server/tools/build.mjs +44 -0
  181. package/dist/mcp-server/tools/build.mjs.map +1 -0
  182. package/dist/mcp-server/tools/cleanup.cjs +20 -0
  183. package/dist/mcp-server/tools/cleanup.cjs.map +1 -0
  184. package/dist/mcp-server/tools/cleanup.d.cts +10 -0
  185. package/dist/mcp-server/tools/cleanup.d.cts.map +1 -0
  186. package/dist/mcp-server/tools/cleanup.d.mts +10 -0
  187. package/dist/mcp-server/tools/cleanup.d.mts.map +1 -0
  188. package/dist/mcp-server/tools/cleanup.mjs +17 -0
  189. package/dist/mcp-server/tools/cleanup.mjs.map +1 -0
  190. package/dist/mcp-server/tools/clipboard.cjs +100 -0
  191. package/dist/mcp-server/tools/clipboard.cjs.map +1 -0
  192. package/dist/mcp-server/tools/clipboard.d.cts +16 -0
  193. package/dist/mcp-server/tools/clipboard.d.cts.map +1 -0
  194. package/dist/mcp-server/tools/clipboard.d.mts +16 -0
  195. package/dist/mcp-server/tools/clipboard.d.mts.map +1 -0
  196. package/dist/mcp-server/tools/clipboard.mjs +97 -0
  197. package/dist/mcp-server/tools/clipboard.mjs.map +1 -0
  198. package/dist/mcp-server/tools/context.cjs +66 -0
  199. package/dist/mcp-server/tools/context.cjs.map +1 -0
  200. package/dist/mcp-server/tools/context.d.cts +35 -0
  201. package/dist/mcp-server/tools/context.d.cts.map +1 -0
  202. package/dist/mcp-server/tools/context.d.mts +35 -0
  203. package/dist/mcp-server/tools/context.d.mts.map +1 -0
  204. package/dist/mcp-server/tools/context.mjs +62 -0
  205. package/dist/mcp-server/tools/context.mjs.map +1 -0
  206. package/dist/mcp-server/tools/definitions.cjs +463 -0
  207. package/dist/mcp-server/tools/definitions.cjs.map +1 -0
  208. package/dist/mcp-server/tools/definitions.d.cts +97 -0
  209. package/dist/mcp-server/tools/definitions.d.cts.map +1 -0
  210. package/dist/mcp-server/tools/definitions.d.mts +97 -0
  211. package/dist/mcp-server/tools/definitions.d.mts.map +1 -0
  212. package/dist/mcp-server/tools/definitions.mjs +451 -0
  213. package/dist/mcp-server/tools/definitions.mjs.map +1 -0
  214. package/dist/mcp-server/tools/discovery-tools.cjs +162 -0
  215. package/dist/mcp-server/tools/discovery-tools.cjs.map +1 -0
  216. package/dist/mcp-server/tools/discovery-tools.d.cts +26 -0
  217. package/dist/mcp-server/tools/discovery-tools.d.cts.map +1 -0
  218. package/dist/mcp-server/tools/discovery-tools.d.mts +26 -0
  219. package/dist/mcp-server/tools/discovery-tools.d.mts.map +1 -0
  220. package/dist/mcp-server/tools/discovery-tools.mjs +157 -0
  221. package/dist/mcp-server/tools/discovery-tools.mjs.map +1 -0
  222. package/dist/mcp-server/tools/error-classification.cjs +296 -0
  223. package/dist/mcp-server/tools/error-classification.cjs.map +1 -0
  224. package/dist/mcp-server/tools/error-classification.d.cts +135 -0
  225. package/dist/mcp-server/tools/error-classification.d.cts.map +1 -0
  226. package/dist/mcp-server/tools/error-classification.d.mts +135 -0
  227. package/dist/mcp-server/tools/error-classification.d.mts.map +1 -0
  228. package/dist/mcp-server/tools/error-classification.mjs +281 -0
  229. package/dist/mcp-server/tools/error-classification.mjs.map +1 -0
  230. package/dist/mcp-server/tools/helpers.cjs +149 -0
  231. package/dist/mcp-server/tools/helpers.cjs.map +1 -0
  232. package/dist/mcp-server/tools/helpers.d.cts +149 -0
  233. package/dist/mcp-server/tools/helpers.d.cts.map +1 -0
  234. package/dist/mcp-server/tools/helpers.d.mts +149 -0
  235. package/dist/mcp-server/tools/helpers.d.mts.map +1 -0
  236. package/dist/mcp-server/tools/helpers.mjs +141 -0
  237. package/dist/mcp-server/tools/helpers.mjs.map +1 -0
  238. package/dist/mcp-server/tools/index.cjs +27 -0
  239. package/dist/mcp-server/tools/index.cjs.map +1 -0
  240. package/dist/mcp-server/tools/index.d.cts +11 -0
  241. package/dist/mcp-server/tools/index.d.cts.map +1 -0
  242. package/dist/mcp-server/tools/index.d.mts +11 -0
  243. package/dist/mcp-server/tools/index.d.mts.map +1 -0
  244. package/dist/mcp-server/tools/index.mjs +11 -0
  245. package/dist/mcp-server/tools/index.mjs.map +1 -0
  246. package/dist/mcp-server/tools/interaction.cjs +190 -0
  247. package/dist/mcp-server/tools/interaction.cjs.map +1 -0
  248. package/dist/mcp-server/tools/interaction.d.cts +26 -0
  249. package/dist/mcp-server/tools/interaction.d.cts.map +1 -0
  250. package/dist/mcp-server/tools/interaction.d.mts +26 -0
  251. package/dist/mcp-server/tools/interaction.d.mts.map +1 -0
  252. package/dist/mcp-server/tools/interaction.mjs +185 -0
  253. package/dist/mcp-server/tools/interaction.mjs.map +1 -0
  254. package/dist/mcp-server/tools/knowledge.cjs +120 -0
  255. package/dist/mcp-server/tools/knowledge.cjs.map +1 -0
  256. package/dist/mcp-server/tools/knowledge.d.cts +34 -0
  257. package/dist/mcp-server/tools/knowledge.d.cts.map +1 -0
  258. package/dist/mcp-server/tools/knowledge.d.mts +34 -0
  259. package/dist/mcp-server/tools/knowledge.d.mts.map +1 -0
  260. package/dist/mcp-server/tools/knowledge.mjs +114 -0
  261. package/dist/mcp-server/tools/knowledge.mjs.map +1 -0
  262. package/dist/mcp-server/tools/launch.cjs +51 -0
  263. package/dist/mcp-server/tools/launch.cjs.map +1 -0
  264. package/dist/mcp-server/tools/launch.d.cts +10 -0
  265. package/dist/mcp-server/tools/launch.d.cts.map +1 -0
  266. package/dist/mcp-server/tools/launch.d.mts +10 -0
  267. package/dist/mcp-server/tools/launch.d.mts.map +1 -0
  268. package/dist/mcp-server/tools/launch.mjs +48 -0
  269. package/dist/mcp-server/tools/launch.mjs.map +1 -0
  270. package/dist/mcp-server/tools/navigation.cjs +242 -0
  271. package/dist/mcp-server/tools/navigation.cjs.map +1 -0
  272. package/dist/mcp-server/tools/navigation.d.cts +34 -0
  273. package/dist/mcp-server/tools/navigation.d.cts.map +1 -0
  274. package/dist/mcp-server/tools/navigation.d.mts +34 -0
  275. package/dist/mcp-server/tools/navigation.d.mts.map +1 -0
  276. package/dist/mcp-server/tools/navigation.mjs +236 -0
  277. package/dist/mcp-server/tools/navigation.mjs.map +1 -0
  278. package/dist/mcp-server/tools/registry.cjs +10 -0
  279. package/dist/mcp-server/tools/registry.cjs.map +1 -0
  280. package/dist/mcp-server/tools/registry.d.cts +4 -0
  281. package/dist/mcp-server/tools/registry.d.cts.map +1 -0
  282. package/dist/mcp-server/tools/registry.d.mts +4 -0
  283. package/dist/mcp-server/tools/registry.d.mts.map +1 -0
  284. package/dist/mcp-server/tools/registry.mjs +4 -0
  285. package/dist/mcp-server/tools/registry.mjs.map +1 -0
  286. package/dist/mcp-server/tools/run-tool.cjs +140 -0
  287. package/dist/mcp-server/tools/run-tool.cjs.map +1 -0
  288. package/dist/mcp-server/tools/run-tool.d.cts +39 -0
  289. package/dist/mcp-server/tools/run-tool.d.cts.map +1 -0
  290. package/dist/mcp-server/tools/run-tool.d.mts +39 -0
  291. package/dist/mcp-server/tools/run-tool.d.mts.map +1 -0
  292. package/dist/mcp-server/tools/run-tool.mjs +137 -0
  293. package/dist/mcp-server/tools/run-tool.mjs.map +1 -0
  294. package/dist/mcp-server/tools/screenshot.cjs +55 -0
  295. package/dist/mcp-server/tools/screenshot.cjs.map +1 -0
  296. package/dist/mcp-server/tools/screenshot.d.cts +10 -0
  297. package/dist/mcp-server/tools/screenshot.d.cts.map +1 -0
  298. package/dist/mcp-server/tools/screenshot.d.mts +10 -0
  299. package/dist/mcp-server/tools/screenshot.d.mts.map +1 -0
  300. package/dist/mcp-server/tools/screenshot.mjs +52 -0
  301. package/dist/mcp-server/tools/screenshot.mjs.map +1 -0
  302. package/dist/mcp-server/tools/seeding.cjs +214 -0
  303. package/dist/mcp-server/tools/seeding.cjs.map +1 -0
  304. package/dist/mcp-server/tools/seeding.d.cts +38 -0
  305. package/dist/mcp-server/tools/seeding.d.cts.map +1 -0
  306. package/dist/mcp-server/tools/seeding.d.mts +38 -0
  307. package/dist/mcp-server/tools/seeding.d.mts.map +1 -0
  308. package/dist/mcp-server/tools/seeding.mjs +208 -0
  309. package/dist/mcp-server/tools/seeding.mjs.map +1 -0
  310. package/dist/mcp-server/tools/state.cjs +69 -0
  311. package/dist/mcp-server/tools/state.cjs.map +1 -0
  312. package/dist/mcp-server/tools/state.d.cts +19 -0
  313. package/dist/mcp-server/tools/state.d.cts.map +1 -0
  314. package/dist/mcp-server/tools/state.d.mts +19 -0
  315. package/dist/mcp-server/tools/state.d.mts.map +1 -0
  316. package/dist/mcp-server/tools/state.mjs +66 -0
  317. package/dist/mcp-server/tools/state.mjs.map +1 -0
  318. package/dist/mcp-server/types/discovery.cjs +24 -0
  319. package/dist/mcp-server/types/discovery.cjs.map +1 -0
  320. package/dist/mcp-server/types/discovery.d.cts +30 -0
  321. package/dist/mcp-server/types/discovery.d.cts.map +1 -0
  322. package/dist/mcp-server/types/discovery.d.mts +30 -0
  323. package/dist/mcp-server/types/discovery.d.mts.map +1 -0
  324. package/dist/mcp-server/types/discovery.mjs +21 -0
  325. package/dist/mcp-server/types/discovery.mjs.map +1 -0
  326. package/dist/mcp-server/types/errors.cjs +33 -0
  327. package/dist/mcp-server/types/errors.cjs.map +1 -0
  328. package/dist/mcp-server/types/errors.d.cts +31 -0
  329. package/dist/mcp-server/types/errors.d.cts.map +1 -0
  330. package/dist/mcp-server/types/errors.d.mts +31 -0
  331. package/dist/mcp-server/types/errors.d.mts.map +1 -0
  332. package/dist/mcp-server/types/errors.mjs +30 -0
  333. package/dist/mcp-server/types/errors.mjs.map +1 -0
  334. package/dist/mcp-server/types/index.cjs +21 -0
  335. package/dist/mcp-server/types/index.cjs.map +1 -0
  336. package/dist/mcp-server/types/index.d.cts +10 -0
  337. package/dist/mcp-server/types/index.d.cts.map +1 -0
  338. package/dist/mcp-server/types/index.d.mts +10 -0
  339. package/dist/mcp-server/types/index.d.mts.map +1 -0
  340. package/dist/mcp-server/types/index.mjs +5 -0
  341. package/dist/mcp-server/types/index.mjs.map +1 -0
  342. package/dist/mcp-server/types/knowledge.cjs +3 -0
  343. package/dist/mcp-server/types/knowledge.cjs.map +1 -0
  344. package/dist/mcp-server/types/knowledge.d.cts +116 -0
  345. package/dist/mcp-server/types/knowledge.d.cts.map +1 -0
  346. package/dist/mcp-server/types/knowledge.d.mts +116 -0
  347. package/dist/mcp-server/types/knowledge.d.mts.map +1 -0
  348. package/dist/mcp-server/types/knowledge.mjs +2 -0
  349. package/dist/mcp-server/types/knowledge.mjs.map +1 -0
  350. package/dist/mcp-server/types/responses.cjs +3 -0
  351. package/dist/mcp-server/types/responses.cjs.map +1 -0
  352. package/dist/mcp-server/types/responses.d.cts +22 -0
  353. package/dist/mcp-server/types/responses.d.cts.map +1 -0
  354. package/dist/mcp-server/types/responses.d.mts +22 -0
  355. package/dist/mcp-server/types/responses.d.mts.map +1 -0
  356. package/dist/mcp-server/types/responses.mjs +2 -0
  357. package/dist/mcp-server/types/responses.mjs.map +1 -0
  358. package/dist/mcp-server/types/seeding.cjs +34 -0
  359. package/dist/mcp-server/types/seeding.cjs.map +1 -0
  360. package/dist/mcp-server/types/seeding.d.cts +40 -0
  361. package/dist/mcp-server/types/seeding.d.cts.map +1 -0
  362. package/dist/mcp-server/types/seeding.d.mts +40 -0
  363. package/dist/mcp-server/types/seeding.d.mts.map +1 -0
  364. package/dist/mcp-server/types/seeding.mjs +31 -0
  365. package/dist/mcp-server/types/seeding.mjs.map +1 -0
  366. package/dist/mcp-server/types/session.cjs +3 -0
  367. package/dist/mcp-server/types/session.cjs.map +1 -0
  368. package/dist/mcp-server/types/session.d.cts +11 -0
  369. package/dist/mcp-server/types/session.d.cts.map +1 -0
  370. package/dist/mcp-server/types/session.d.mts +11 -0
  371. package/dist/mcp-server/types/session.d.mts.map +1 -0
  372. package/dist/mcp-server/types/session.mjs +2 -0
  373. package/dist/mcp-server/types/session.mjs.map +1 -0
  374. package/dist/mcp-server/types/step-record.cjs +20 -0
  375. package/dist/mcp-server/types/step-record.cjs.map +1 -0
  376. package/dist/mcp-server/types/step-record.d.cts +86 -0
  377. package/dist/mcp-server/types/step-record.d.cts.map +1 -0
  378. package/dist/mcp-server/types/step-record.d.mts +86 -0
  379. package/dist/mcp-server/types/step-record.d.mts.map +1 -0
  380. package/dist/mcp-server/types/step-record.mjs +17 -0
  381. package/dist/mcp-server/types/step-record.mjs.map +1 -0
  382. package/dist/mcp-server/types/tool-inputs.cjs +3 -0
  383. package/dist/mcp-server/types/tool-inputs.cjs.map +1 -0
  384. package/dist/mcp-server/types/tool-inputs.d.cts +118 -0
  385. package/dist/mcp-server/types/tool-inputs.d.cts.map +1 -0
  386. package/dist/mcp-server/types/tool-inputs.d.mts +118 -0
  387. package/dist/mcp-server/types/tool-inputs.d.mts.map +1 -0
  388. package/dist/mcp-server/types/tool-inputs.mjs +2 -0
  389. package/dist/mcp-server/types/tool-inputs.mjs.map +1 -0
  390. package/dist/mcp-server/types/tool-outputs.cjs +3 -0
  391. package/dist/mcp-server/types/tool-outputs.cjs.map +1 -0
  392. package/dist/mcp-server/types/tool-outputs.d.cts +121 -0
  393. package/dist/mcp-server/types/tool-outputs.d.cts.map +1 -0
  394. package/dist/mcp-server/types/tool-outputs.d.mts +121 -0
  395. package/dist/mcp-server/types/tool-outputs.d.mts.map +1 -0
  396. package/dist/mcp-server/types/tool-outputs.mjs +2 -0
  397. package/dist/mcp-server/types/tool-outputs.mjs.map +1 -0
  398. package/dist/mcp-server/utils/errors.cjs +14 -0
  399. package/dist/mcp-server/utils/errors.cjs.map +1 -0
  400. package/dist/mcp-server/utils/errors.d.cts +9 -0
  401. package/dist/mcp-server/utils/errors.d.cts.map +1 -0
  402. package/dist/mcp-server/utils/errors.d.mts +9 -0
  403. package/dist/mcp-server/utils/errors.d.mts.map +1 -0
  404. package/dist/mcp-server/utils/errors.mjs +11 -0
  405. package/dist/mcp-server/utils/errors.mjs.map +1 -0
  406. package/dist/mcp-server/utils/index.cjs +22 -0
  407. package/dist/mcp-server/utils/index.cjs.map +1 -0
  408. package/dist/mcp-server/utils/index.d.cts +8 -0
  409. package/dist/mcp-server/utils/index.d.cts.map +1 -0
  410. package/dist/mcp-server/utils/index.d.mts +8 -0
  411. package/dist/mcp-server/utils/index.d.mts.map +1 -0
  412. package/dist/mcp-server/utils/index.mjs +8 -0
  413. package/dist/mcp-server/utils/index.mjs.map +1 -0
  414. package/dist/mcp-server/utils/logger.cjs +25 -0
  415. package/dist/mcp-server/utils/logger.cjs.map +1 -0
  416. package/dist/mcp-server/utils/logger.d.cts +9 -0
  417. package/dist/mcp-server/utils/logger.d.cts.map +1 -0
  418. package/dist/mcp-server/utils/logger.d.mts +9 -0
  419. package/dist/mcp-server/utils/logger.d.mts.map +1 -0
  420. package/dist/mcp-server/utils/logger.mjs +22 -0
  421. package/dist/mcp-server/utils/logger.mjs.map +1 -0
  422. package/dist/mcp-server/utils/redaction.cjs +24 -0
  423. package/dist/mcp-server/utils/redaction.cjs.map +1 -0
  424. package/dist/mcp-server/utils/redaction.d.cts +9 -0
  425. package/dist/mcp-server/utils/redaction.d.cts.map +1 -0
  426. package/dist/mcp-server/utils/redaction.d.mts +9 -0
  427. package/dist/mcp-server/utils/redaction.d.mts.map +1 -0
  428. package/dist/mcp-server/utils/redaction.mjs +20 -0
  429. package/dist/mcp-server/utils/redaction.mjs.map +1 -0
  430. package/dist/mcp-server/utils/response.cjs +49 -0
  431. package/dist/mcp-server/utils/response.cjs.map +1 -0
  432. package/dist/mcp-server/utils/response.d.cts +22 -0
  433. package/dist/mcp-server/utils/response.d.cts.map +1 -0
  434. package/dist/mcp-server/utils/response.d.mts +22 -0
  435. package/dist/mcp-server/utils/response.d.mts.map +1 -0
  436. package/dist/mcp-server/utils/response.mjs +45 -0
  437. package/dist/mcp-server/utils/response.mjs.map +1 -0
  438. package/dist/mcp-server/utils/targets.cjs +32 -0
  439. package/dist/mcp-server/utils/targets.cjs.map +1 -0
  440. package/dist/mcp-server/utils/targets.d.cts +25 -0
  441. package/dist/mcp-server/utils/targets.d.cts.map +1 -0
  442. package/dist/mcp-server/utils/targets.d.mts +25 -0
  443. package/dist/mcp-server/utils/targets.d.mts.map +1 -0
  444. package/dist/mcp-server/utils/targets.mjs +29 -0
  445. package/dist/mcp-server/utils/targets.mjs.map +1 -0
  446. package/dist/mcp-server/utils/time.cjs +39 -0
  447. package/dist/mcp-server/utils/time.cjs.map +1 -0
  448. package/dist/mcp-server/utils/time.d.cts +15 -0
  449. package/dist/mcp-server/utils/time.d.cts.map +1 -0
  450. package/dist/mcp-server/utils/time.d.mts +15 -0
  451. package/dist/mcp-server/utils/time.d.mts.map +1 -0
  452. package/dist/mcp-server/utils/time.mjs +35 -0
  453. package/dist/mcp-server/utils/time.mjs.map +1 -0
  454. package/dist/mcp-server/utils/type-guards.cjs +42 -0
  455. package/dist/mcp-server/utils/type-guards.cjs.map +1 -0
  456. package/dist/mcp-server/utils/type-guards.d.cts +30 -0
  457. package/dist/mcp-server/utils/type-guards.d.cts.map +1 -0
  458. package/dist/mcp-server/utils/type-guards.d.mts +30 -0
  459. package/dist/mcp-server/utils/type-guards.d.mts.map +1 -0
  460. package/dist/mcp-server/utils/type-guards.mjs +38 -0
  461. package/dist/mcp-server/utils/type-guards.mjs.map +1 -0
  462. package/dist/utils/fetch.cjs +36 -0
  463. package/dist/utils/fetch.cjs.map +1 -0
  464. package/dist/utils/fetch.d.cts +20 -0
  465. package/dist/utils/fetch.d.cts.map +1 -0
  466. package/dist/utils/fetch.d.mts +20 -0
  467. package/dist/utils/fetch.d.mts.map +1 -0
  468. package/dist/utils/fetch.mjs +33 -0
  469. package/dist/utils/fetch.mjs.map +1 -0
  470. package/dist/utils/index.cjs +11 -0
  471. package/dist/utils/index.cjs.map +1 -0
  472. package/dist/utils/index.d.cts +6 -0
  473. package/dist/utils/index.d.cts.map +1 -0
  474. package/dist/utils/index.d.mts +6 -0
  475. package/dist/utils/index.d.mts.map +1 -0
  476. package/dist/utils/index.mjs +6 -0
  477. package/dist/utils/index.mjs.map +1 -0
  478. package/dist/utils/service-readiness.cjs +75 -0
  479. package/dist/utils/service-readiness.cjs.map +1 -0
  480. package/dist/utils/service-readiness.d.cts +61 -0
  481. package/dist/utils/service-readiness.d.cts.map +1 -0
  482. package/dist/utils/service-readiness.d.mts +61 -0
  483. package/dist/utils/service-readiness.d.mts.map +1 -0
  484. package/dist/utils/service-readiness.mjs +72 -0
  485. package/dist/utils/service-readiness.mjs.map +1 -0
  486. package/package.json +119 -0
@@ -0,0 +1,1154 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _KnowledgeStore_instances, _KnowledgeStore_knowledgeRoot, _KnowledgeStore_sessionIdPrefix, _KnowledgeStore_toolPrefix, _KnowledgeStore_sessionMetadataCache, _KnowledgeStore_actionableTools, _KnowledgeStore_toolActionMap, _KnowledgeStore_discoveryTools, _KnowledgeStore_readSessionMetadata, _KnowledgeStore_matchesFilters, _KnowledgeStore_computeLabels, _KnowledgeStore_stepMatchesFilters, _KnowledgeStore_loadSessionSteps, _KnowledgeStore_sanitizeInput, _KnowledgeStore_getEnvironmentInfo, _KnowledgeStore_summarizeStep, _KnowledgeStore_generateSnippet, _KnowledgeStore_generateStepNotes, _KnowledgeStore_computeSessionScore, _KnowledgeStore_computeSearchScore, _KnowledgeStore_getRelatedSessions, _KnowledgeStore_getSimilarSteps, _KnowledgeStore_lookupA11yHint, _KnowledgeStore_computeSimilarityScore, _KnowledgeStore_buildSuggestedActions, _KnowledgeStore_buildPreferredTarget, _KnowledgeStore_buildFallbackTargets, _KnowledgeStore_toolToAction, _KnowledgeStore_buildAvoidList;
13
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
14
+ /* eslint-disable id-length */
15
+ import { promises as fs } from "fs";
16
+ import * as path from "path";
17
+ import { expandWithSynonyms, tokenize, tokenizeIdentifier } from "./tokenization.mjs";
18
+ import { generateFilesafeTimestamp, isSensitiveField, SENSITIVE_FIELD_PATTERNS, debugWarn } from "./utils/index.mjs";
19
+ const KNOWLEDGE_ROOT = 'test-artifacts/llm-knowledge';
20
+ const SCHEMA_VERSION = 1;
21
+ const PRIOR_KNOWLEDGE_CONFIG = {
22
+ /** Look back 48 hours for related sessions - balances recency with having enough data */
23
+ windowHours: 48,
24
+ /** Limit to 5 related sessions to keep context focused and token-efficient */
25
+ maxRelatedSessions: 5,
26
+ /** Maximum 10 similar steps to include - prevents overwhelming the context */
27
+ maxSimilarSteps: 10,
28
+ /** Limit to 5 suggested actions to keep recommendations focused and actionable */
29
+ maxSuggestedActions: 5,
30
+ /** Maximum 5 items in avoid list to prevent excessive warnings */
31
+ maxAvoid: 5,
32
+ /** Require at least 2 failures before suggesting avoidance - prevents false positives */
33
+ minAvoidFailureCount: 2,
34
+ };
35
+ const SCAN_LIMITS = {
36
+ /** Scan up to 20 sessions to balance thoroughness with performance */
37
+ maxSessionsToScan: 20,
38
+ /** Limit to 500 steps per session to avoid memory issues with large sessions */
39
+ maxStepsPerSession: 500,
40
+ /** Hard limit of 2000 total steps across all sessions to prevent excessive scanning */
41
+ maxTotalSteps: 2000,
42
+ };
43
+ const SIMILARITY_WEIGHTS = {
44
+ /** Highest weight - same screen is the strongest indicator of relevance */
45
+ sameScreen: 8,
46
+ /** URL path overlap indicates similar context/feature area */
47
+ urlPathOverlap: 6,
48
+ /** Test ID overlap shows similar UI elements are present */
49
+ testIdOverlap: 3,
50
+ /** Accessibility node overlap provides additional context matching */
51
+ a11yOverlap: 2,
52
+ /** Actionable tools (click, type, etc.) are more relevant than discovery tools */
53
+ actionableTool: 2,
54
+ };
55
+ const MAX_SIMILARITY_SCORE = SIMILARITY_WEIGHTS.sameScreen +
56
+ SIMILARITY_WEIGHTS.urlPathOverlap +
57
+ SIMILARITY_WEIGHTS.testIdOverlap * 3 +
58
+ SIMILARITY_WEIGHTS.a11yOverlap * 2 +
59
+ SIMILARITY_WEIGHTS.actionableTool;
60
+ /**
61
+ * Extract path tokens from URL hash fragment
62
+ *
63
+ * @param url - The URL to extract tokens from
64
+ * @returns Array of path tokens from the hash fragment
65
+ */
66
+ function extractPathTokens(url) {
67
+ try {
68
+ const hashPart = url.split('#')[1] ?? '';
69
+ return hashPart
70
+ .split('/')
71
+ .filter((t) => t.length > 0 && !t.startsWith('0x'));
72
+ }
73
+ catch (error) {
74
+ debugWarn('knowledge-store.extractPathTokens', error);
75
+ return [];
76
+ }
77
+ }
78
+ /**
79
+ * Persistent cross-session knowledge store for recording and querying tool invocations.
80
+ */
81
+ export class KnowledgeStore {
82
+ /**
83
+ * Initialize KnowledgeStore with optional configuration
84
+ *
85
+ * @param config - Configuration options for the store
86
+ */
87
+ constructor(config = {}) {
88
+ _KnowledgeStore_instances.add(this);
89
+ _KnowledgeStore_knowledgeRoot.set(this, void 0);
90
+ _KnowledgeStore_sessionIdPrefix.set(this, void 0);
91
+ _KnowledgeStore_toolPrefix.set(this, void 0);
92
+ _KnowledgeStore_sessionMetadataCache.set(this, new Map());
93
+ _KnowledgeStore_actionableTools.set(this, void 0);
94
+ _KnowledgeStore_toolActionMap.set(this, void 0);
95
+ _KnowledgeStore_discoveryTools.set(this, void 0);
96
+ __classPrivateFieldSet(this, _KnowledgeStore_knowledgeRoot, config.rootDir ?? path.join(process.cwd(), KNOWLEDGE_ROOT), "f");
97
+ __classPrivateFieldSet(this, _KnowledgeStore_sessionIdPrefix, config.sessionIdPrefix ?? 'mm-', "f");
98
+ __classPrivateFieldSet(this, _KnowledgeStore_toolPrefix, config.toolPrefix ?? 'mm', "f");
99
+ const prefix = __classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f");
100
+ __classPrivateFieldSet(this, _KnowledgeStore_actionableTools, [
101
+ `${prefix}_click`,
102
+ `${prefix}_type`,
103
+ `${prefix}_wait_for`,
104
+ `${prefix}_navigate`,
105
+ `${prefix}_wait_for_notification`,
106
+ ], "f");
107
+ __classPrivateFieldSet(this, _KnowledgeStore_toolActionMap, {
108
+ [`${prefix}_click`]: 'click',
109
+ [`${prefix}_type`]: 'type',
110
+ [`${prefix}_wait_for`]: 'wait_for',
111
+ [`${prefix}_navigate`]: 'navigate',
112
+ [`${prefix}_wait_for_notification`]: 'wait_for_notification',
113
+ }, "f");
114
+ __classPrivateFieldSet(this, _KnowledgeStore_discoveryTools, [
115
+ `${prefix}_describe_screen`,
116
+ `${prefix}_list_testids`,
117
+ `${prefix}_accessibility_snapshot`,
118
+ `${prefix}_get_state`,
119
+ ], "f");
120
+ }
121
+ /**
122
+ * Write session metadata to disk
123
+ *
124
+ * @param metadata - Session metadata to persist
125
+ * @returns Path to the written metadata file
126
+ */
127
+ async writeSessionMetadata(metadata) {
128
+ const sessionDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), metadata.sessionId);
129
+ await fs.mkdir(sessionDir, { recursive: true });
130
+ const filepath = path.join(sessionDir, 'session.json');
131
+ await fs.writeFile(filepath, JSON.stringify(metadata, null, 2));
132
+ __classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(metadata.sessionId, metadata);
133
+ return filepath;
134
+ }
135
+ /**
136
+ * List sessions with optional filtering and limit
137
+ *
138
+ * @param limit - Maximum number of sessions to return
139
+ * @param filters - Optional filters for sessions
140
+ * @returns Array of session summaries
141
+ */
142
+ async listSessions(limit, filters) {
143
+ const sessionIds = await this.getAllSessionIds();
144
+ const sessions = [];
145
+ for (const sid of sessionIds) {
146
+ const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
147
+ if (!metadata) {
148
+ continue;
149
+ }
150
+ if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
151
+ continue;
152
+ }
153
+ sessions.push({
154
+ metadata,
155
+ createdAt: new Date(metadata.createdAt),
156
+ });
157
+ }
158
+ sessions.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
159
+ return sessions.slice(0, limit).map((s) => ({
160
+ sessionId: s.metadata.sessionId,
161
+ createdAt: s.metadata.createdAt,
162
+ goal: s.metadata.goal,
163
+ flowTags: s.metadata.flowTags,
164
+ tags: s.metadata.tags,
165
+ }));
166
+ }
167
+ /**
168
+ * Resolve session IDs based on scope and filters
169
+ *
170
+ * @param scope - Scope for session resolution (current, all, or specific sessionId)
171
+ * @param currentSessionId - Current session ID for scope resolution
172
+ * @param filters - Optional filters to apply to sessions
173
+ * @returns Array of resolved session IDs
174
+ */
175
+ async resolveSessionIds(scope, currentSessionId, filters) {
176
+ if (scope === 'current') {
177
+ return currentSessionId ? [currentSessionId] : [];
178
+ }
179
+ if (typeof scope === 'object' && 'sessionId' in scope) {
180
+ return [scope.sessionId];
181
+ }
182
+ const allIds = await this.getAllSessionIds();
183
+ if (!filters) {
184
+ return allIds;
185
+ }
186
+ const filtered = [];
187
+ for (const sid of allIds) {
188
+ const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
189
+ if (metadata && __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
190
+ filtered.push(sid);
191
+ }
192
+ else if (!metadata) {
193
+ filtered.push(sid);
194
+ }
195
+ }
196
+ return filtered;
197
+ }
198
+ /**
199
+ * Record a tool execution step with context and artifacts
200
+ *
201
+ * @param params - Step recording parameters
202
+ * @param params.sessionId - Session ID for this step
203
+ * @param params.toolName - Name of the tool executed
204
+ * @param params.input - Tool input parameters
205
+ * @param params.target - Target element information
206
+ * @param params.outcome - Execution outcome (success/failure)
207
+ * @param params.observation - Observed state after execution
208
+ * @param params.durationMs - Execution duration in milliseconds
209
+ * @param params.screenshotPath - Path to screenshot artifact
210
+ * @param params.screenshotDimensions - Screenshot dimensions
211
+ * @param params.screenshotDimensions.width - Screenshot width in pixels
212
+ * @param params.screenshotDimensions.height - Screenshot height in pixels
213
+ * @param params.context - Execution context (e2e or prod)
214
+ * @returns Path to the recorded step file
215
+ */
216
+ async recordStep(params) {
217
+ const timestamp = new Date();
218
+ const filesafeTimestamp = generateFilesafeTimestamp(timestamp);
219
+ const sessionDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), params.sessionId);
220
+ const stepsDir = path.join(sessionDir, 'steps');
221
+ await fs.mkdir(stepsDir, { recursive: true });
222
+ const sanitizedInput = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_sanitizeInput).call(this, params.toolName, params.input);
223
+ const labels = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeLabels).call(this, params.toolName, params.target, params.outcome);
224
+ const stepRecord = {
225
+ schemaVersion: SCHEMA_VERSION,
226
+ timestamp: timestamp.toISOString(),
227
+ sessionId: params.sessionId,
228
+ context: params.context,
229
+ environment: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getEnvironmentInfo).call(this),
230
+ tool: {
231
+ name: params.toolName,
232
+ input: sanitizedInput.input,
233
+ target: params.target,
234
+ textRedacted: sanitizedInput.textRedacted,
235
+ textLength: sanitizedInput.textLength,
236
+ },
237
+ timing: {
238
+ durationMs: params.durationMs,
239
+ },
240
+ outcome: params.outcome,
241
+ observation: params.observation,
242
+ labels,
243
+ };
244
+ if (params.screenshotPath) {
245
+ stepRecord.artifacts = {
246
+ screenshot: {
247
+ path: params.screenshotPath,
248
+ width: params.screenshotDimensions?.width,
249
+ height: params.screenshotDimensions?.height,
250
+ },
251
+ };
252
+ }
253
+ const filename = `${filesafeTimestamp}-${params.toolName}.json`;
254
+ const filepath = path.join(stepsDir, filename);
255
+ await fs.writeFile(filepath, JSON.stringify(stepRecord, null, 2));
256
+ return filepath;
257
+ }
258
+ /**
259
+ * Get the last N steps from the knowledge store
260
+ *
261
+ * @param n - Number of steps to retrieve
262
+ * @param scope - Scope for step retrieval (current, all, or specific sessionId)
263
+ * @param currentSessionId - Current session ID for scope resolution
264
+ * @param filters - Optional filters to apply to steps
265
+ * @returns Array of step summaries
266
+ */
267
+ async getLastSteps(n, scope, currentSessionId, filters) {
268
+ const sessionIds = await this.resolveSessionIds(scope, currentSessionId, filters);
269
+ const allSteps = [];
270
+ for (const sid of sessionIds) {
271
+ const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
272
+ for (const s of steps) {
273
+ if (__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, s.step, filters)) {
274
+ allSteps.push(s);
275
+ }
276
+ }
277
+ }
278
+ allSteps.sort((a, b) => new Date(b.step.timestamp).getTime() -
279
+ new Date(a.step.timestamp).getTime());
280
+ return allSteps.slice(0, n).map((item) => __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_summarizeStep).call(this, item.step));
281
+ }
282
+ /**
283
+ * Search steps by query across sessions
284
+ *
285
+ * @param query - Search query string
286
+ * @param limit - Maximum number of results to return
287
+ * @param scope - Scope for search (current, all, or specific sessionId)
288
+ * @param currentSessionId - Current session ID for scope resolution
289
+ * @param filters - Optional filters to apply to steps
290
+ * @returns Array of matching step summaries
291
+ */
292
+ async searchSteps(query, limit, scope, currentSessionId, filters) {
293
+ const queryTokens = tokenize(query);
294
+ if (queryTokens.length === 0) {
295
+ return [];
296
+ }
297
+ const expandedTokens = expandWithSynonyms(queryTokens);
298
+ const sessionIds = await this.resolveSessionIds(scope, currentSessionId, filters);
299
+ const scoredSessions = [];
300
+ for (const sid of sessionIds) {
301
+ const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
302
+ const sessionScore = metadata
303
+ ? __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSessionScore).call(this, metadata, expandedTokens)
304
+ : 0;
305
+ scoredSessions.push({
306
+ sessionId: sid,
307
+ score: sessionScore,
308
+ metadata: metadata ?? undefined,
309
+ });
310
+ }
311
+ scoredSessions.sort((a, b) => {
312
+ if (b.score !== a.score) {
313
+ return b.score - a.score;
314
+ }
315
+ const aTime = a.metadata?.createdAt
316
+ ? new Date(a.metadata.createdAt).getTime()
317
+ : 0;
318
+ const bTime = b.metadata?.createdAt
319
+ ? new Date(b.metadata.createdAt).getTime()
320
+ : 0;
321
+ if (bTime !== aTime) {
322
+ return bTime - aTime;
323
+ }
324
+ return a.sessionId.localeCompare(b.sessionId);
325
+ });
326
+ const topSessions = scoredSessions.slice(0, SCAN_LIMITS.maxSessionsToScan);
327
+ const matches = [];
328
+ let totalStepsScanned = 0;
329
+ for (const { sessionId: sid, score: sessionScore, metadata, } of topSessions) {
330
+ if (totalStepsScanned >= SCAN_LIMITS.maxTotalSteps) {
331
+ break;
332
+ }
333
+ const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
334
+ const limitedSteps = steps.slice(0, SCAN_LIMITS.maxStepsPerSession);
335
+ totalStepsScanned += limitedSteps.length;
336
+ for (const { step } of limitedSteps) {
337
+ if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, step, filters)) {
338
+ continue;
339
+ }
340
+ const { score: stepScore, matchedFields } = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSearchScore).call(this, step, expandedTokens);
341
+ const combinedScore = sessionScore + stepScore;
342
+ if (combinedScore > 0) {
343
+ matches.push({
344
+ step,
345
+ score: combinedScore,
346
+ sessionScore,
347
+ sessionGoal: metadata?.goal,
348
+ matchedFields,
349
+ });
350
+ }
351
+ }
352
+ }
353
+ matches.sort((a, b) => b.score - a.score);
354
+ return matches
355
+ .slice(0, limit)
356
+ .map((m) => __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_summarizeStep).call(this, m.step, m.matchedFields, m.sessionGoal));
357
+ }
358
+ /**
359
+ * Generate a recipe summary of steps in a session
360
+ *
361
+ * @param sessionId - Session ID to summarize
362
+ * @returns Session summary with recipe steps
363
+ */
364
+ async summarizeSession(sessionId) {
365
+ const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sessionId);
366
+ steps.sort((a, b) => new Date(a.step.timestamp).getTime() -
367
+ new Date(b.step.timestamp).getTime());
368
+ const recipe = steps.map(({ step }, index) => ({
369
+ stepNumber: index + 1,
370
+ tool: step.tool.name,
371
+ notes: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateStepNotes).call(this, step),
372
+ }));
373
+ return {
374
+ sessionId,
375
+ stepCount: steps.length,
376
+ recipe,
377
+ };
378
+ }
379
+ /**
380
+ * Get all session IDs from the knowledge store
381
+ *
382
+ * @returns Array of all session IDs
383
+ */
384
+ async getAllSessionIds() {
385
+ try {
386
+ const entries = await fs.readdir(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), {
387
+ withFileTypes: true,
388
+ });
389
+ return entries
390
+ .filter((e) => e.isDirectory() &&
391
+ (e.name.startsWith('mm-') ||
392
+ e.name.startsWith(__classPrivateFieldGet(this, _KnowledgeStore_sessionIdPrefix, "f"))))
393
+ .map((e) => e.name);
394
+ }
395
+ catch (error) {
396
+ debugWarn('knowledge-store.getAllSessionIds', error);
397
+ return [];
398
+ }
399
+ }
400
+ /**
401
+ * Generate prior knowledge from historical sessions
402
+ *
403
+ * @param context - Current context for knowledge generation
404
+ * @param currentSessionId - Current session ID to exclude from results
405
+ * @returns Prior knowledge object or undefined if no relevant data found
406
+ */
407
+ async generatePriorKnowledge(context, currentSessionId) {
408
+ const { windowHours } = PRIOR_KNOWLEDGE_CONFIG;
409
+ const filters = {
410
+ sinceHours: windowHours,
411
+ };
412
+ if (context.currentSessionFlowTags?.length) {
413
+ filters.flowTag = context.currentSessionFlowTags[0];
414
+ }
415
+ const sessionIds = await this.resolveSessionIds('all', undefined, filters);
416
+ const candidateSessionIds = sessionIds.filter((sid) => sid !== currentSessionId);
417
+ if (candidateSessionIds.length === 0) {
418
+ return undefined;
419
+ }
420
+ const relatedSessions = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getRelatedSessions).call(this, candidateSessionIds, filters, PRIOR_KNOWLEDGE_CONFIG.maxRelatedSessions);
421
+ const { similarSteps, candidateStepCount } = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getSimilarSteps).call(this, context, candidateSessionIds, filters);
422
+ const suggestedNextActions = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildSuggestedActions).call(this, similarSteps, context);
423
+ const avoidList = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildAvoidList).call(this, context, candidateSessionIds);
424
+ if (relatedSessions.length === 0 &&
425
+ similarSteps.length === 0 &&
426
+ suggestedNextActions.length === 0) {
427
+ return undefined;
428
+ }
429
+ return {
430
+ schemaVersion: 1,
431
+ generatedAt: new Date().toISOString(),
432
+ query: {
433
+ windowHours,
434
+ usedFlowTags: context.currentSessionFlowTags ?? [],
435
+ usedFilters: filters,
436
+ candidateSessions: candidateSessionIds.length,
437
+ candidateSteps: candidateStepCount,
438
+ },
439
+ relatedSessions,
440
+ similarSteps: similarSteps.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSimilarSteps),
441
+ suggestedNextActions: suggestedNextActions.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSuggestedActions),
442
+ avoid: avoidList.length > 0
443
+ ? avoidList.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxAvoid)
444
+ : undefined,
445
+ };
446
+ }
447
+ }
448
+ _KnowledgeStore_knowledgeRoot = new WeakMap(), _KnowledgeStore_sessionIdPrefix = new WeakMap(), _KnowledgeStore_toolPrefix = new WeakMap(), _KnowledgeStore_sessionMetadataCache = new WeakMap(), _KnowledgeStore_actionableTools = new WeakMap(), _KnowledgeStore_toolActionMap = new WeakMap(), _KnowledgeStore_discoveryTools = new WeakMap(), _KnowledgeStore_instances = new WeakSet(), _KnowledgeStore_readSessionMetadata =
449
+ /**
450
+ * Read session metadata from disk (private)
451
+ *
452
+ * @param sessionId - Session ID to read metadata for
453
+ * @returns Session metadata or null if not found
454
+ */
455
+ async function _KnowledgeStore_readSessionMetadata(sessionId) {
456
+ if (__classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").has(sessionId)) {
457
+ return __classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").get(sessionId) ?? null;
458
+ }
459
+ const filepath = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), sessionId, 'session.json');
460
+ try {
461
+ const content = await fs.readFile(filepath, 'utf-8');
462
+ const metadata = JSON.parse(content);
463
+ __classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(sessionId, metadata);
464
+ return metadata;
465
+ }
466
+ catch (error) {
467
+ debugWarn('knowledge-store.readSessionMetadata', error);
468
+ __classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(sessionId, null);
469
+ return null;
470
+ }
471
+ }, _KnowledgeStore_matchesFilters = function _KnowledgeStore_matchesFilters(metadata, filters) {
472
+ if (!filters) {
473
+ return true;
474
+ }
475
+ if (filters.flowTag && !metadata.flowTags.includes(filters.flowTag)) {
476
+ return false;
477
+ }
478
+ if (filters.tag && !metadata.tags.includes(filters.tag)) {
479
+ return false;
480
+ }
481
+ if (filters.sinceHours) {
482
+ const cutoff = Date.now() - filters.sinceHours * 60 * 60 * 1000;
483
+ const createdAt = new Date(metadata.createdAt).getTime();
484
+ if (createdAt < cutoff) {
485
+ return false;
486
+ }
487
+ }
488
+ return true;
489
+ }, _KnowledgeStore_computeLabels = function _KnowledgeStore_computeLabels(toolName, target, outcome) {
490
+ const labels = [];
491
+ const navigationTools = [
492
+ `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_navigate`,
493
+ `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_wait_for_notification`,
494
+ ];
495
+ const interactionTools = [
496
+ `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_click`,
497
+ `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_type`,
498
+ `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_wait_for`,
499
+ ];
500
+ if (__classPrivateFieldGet(this, _KnowledgeStore_discoveryTools, "f").includes(toolName)) {
501
+ labels.push('discovery');
502
+ }
503
+ else if (navigationTools.includes(toolName)) {
504
+ labels.push('navigation');
505
+ }
506
+ else if (interactionTools.includes(toolName)) {
507
+ labels.push('interaction');
508
+ const targetStr = JSON.stringify(target ?? {}).toLowerCase();
509
+ if (targetStr.includes('confirm') ||
510
+ targetStr.includes('approve') ||
511
+ targetStr.includes('submit')) {
512
+ labels.push('confirmation');
513
+ }
514
+ }
515
+ if (outcome && !outcome.ok) {
516
+ labels.push('error-recovery');
517
+ }
518
+ return labels;
519
+ }, _KnowledgeStore_stepMatchesFilters = function _KnowledgeStore_stepMatchesFilters(step, filters) {
520
+ if (!filters) {
521
+ return true;
522
+ }
523
+ if (filters.screen &&
524
+ step.observation?.state?.currentScreen !== filters.screen) {
525
+ return false;
526
+ }
527
+ return true;
528
+ }, _KnowledgeStore_loadSessionSteps =
529
+ /**
530
+ * Load all step records from a session
531
+ *
532
+ * @param sessionId - Session ID to load steps from
533
+ * @returns Array of step records with file paths
534
+ */
535
+ async function _KnowledgeStore_loadSessionSteps(sessionId) {
536
+ const stepsDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), sessionId, 'steps');
537
+ try {
538
+ const files = await fs.readdir(stepsDir);
539
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
540
+ const steps = [];
541
+ for (const file of jsonFiles) {
542
+ const filepath = path.join(stepsDir, file);
543
+ try {
544
+ const content = await fs.readFile(filepath, 'utf-8');
545
+ const step = JSON.parse(content);
546
+ steps.push({ step, filepath });
547
+ }
548
+ catch (error) {
549
+ debugWarn('knowledge-store.loadSessionSteps', error);
550
+ continue;
551
+ }
552
+ }
553
+ return steps;
554
+ }
555
+ catch (error) {
556
+ debugWarn('knowledge-store.loadSessionSteps', error);
557
+ return [];
558
+ }
559
+ }, _KnowledgeStore_sanitizeInput = function _KnowledgeStore_sanitizeInput(toolName, input) {
560
+ if (!input) {
561
+ return {};
562
+ }
563
+ const sanitized = {};
564
+ let textRedacted = false;
565
+ let textLength;
566
+ const typeToolName = `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_type`;
567
+ for (const [key, value] of Object.entries(input)) {
568
+ if (toolName === typeToolName && key === 'text') {
569
+ const textValue = String(value);
570
+ const targetTestId = input.testId;
571
+ const targetSelector = input.selector;
572
+ const isSensitive = isSensitiveField(targetTestId ?? '') ||
573
+ isSensitiveField(targetSelector ?? '') ||
574
+ SENSITIVE_FIELD_PATTERNS.some((p) => p.test(key));
575
+ if (isSensitive) {
576
+ textRedacted = true;
577
+ textLength = textValue.length;
578
+ sanitized[key] = '[REDACTED]';
579
+ }
580
+ else {
581
+ sanitized[key] = value;
582
+ }
583
+ }
584
+ else if (isSensitiveField(key)) {
585
+ sanitized[key] = '[REDACTED]';
586
+ }
587
+ else {
588
+ sanitized[key] = value;
589
+ }
590
+ }
591
+ return {
592
+ input: sanitized,
593
+ textRedacted: textRedacted || undefined,
594
+ textLength,
595
+ };
596
+ }, _KnowledgeStore_getEnvironmentInfo = function _KnowledgeStore_getEnvironmentInfo() {
597
+ return {
598
+ platform: process.platform,
599
+ nodeVersion: process.version,
600
+ };
601
+ }, _KnowledgeStore_summarizeStep = function _KnowledgeStore_summarizeStep(step, matchedFields, sessionGoal) {
602
+ const screen = step.observation?.state?.currentScreen ?? 'unknown';
603
+ const snippet = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateSnippet).call(this, step, matchedFields);
604
+ return {
605
+ timestamp: step.timestamp,
606
+ tool: step.tool.name,
607
+ screen,
608
+ snippet,
609
+ sessionId: step.sessionId,
610
+ matchedFields: matchedFields?.length ? matchedFields : undefined,
611
+ sessionGoal,
612
+ };
613
+ }, _KnowledgeStore_generateSnippet = function _KnowledgeStore_generateSnippet(step, matchedFields) {
614
+ const parts = [];
615
+ if (matchedFields && matchedFields.length > 0) {
616
+ const topMatches = matchedFields.slice(0, 3).join(', ');
617
+ parts.push(`match: ${topMatches}`);
618
+ }
619
+ if (step.tool.target?.testId) {
620
+ parts.push(`testId: ${step.tool.target.testId}`);
621
+ }
622
+ else if (step.tool.target?.a11yRef) {
623
+ parts.push(`ref: ${step.tool.target.a11yRef}`);
624
+ }
625
+ else if (step.tool.target?.selector) {
626
+ const shortSelector = step.tool.target.selector.substring(0, 30);
627
+ parts.push(`selector: ${shortSelector}`);
628
+ }
629
+ if (step.labels && step.labels.length > 0) {
630
+ parts.push(`labels: ${step.labels.join(', ')}`);
631
+ }
632
+ if (step.observation?.state?.currentScreen) {
633
+ parts.push(`screen: ${step.observation.state.currentScreen}`);
634
+ }
635
+ if (!step.outcome.ok && step.outcome.error) {
636
+ parts.push(`error: ${step.outcome.error.code}`);
637
+ }
638
+ return parts.join(', ') || step.tool.name;
639
+ }, _KnowledgeStore_generateStepNotes = function _KnowledgeStore_generateStepNotes(step) {
640
+ const notes = [];
641
+ if (step.tool.target?.testId) {
642
+ notes.push(`target: [data-testid="${step.tool.target.testId}"]`);
643
+ }
644
+ else if (step.tool.target?.a11yRef) {
645
+ notes.push(`target: ${step.tool.target.a11yRef}`);
646
+ }
647
+ if (step.observation?.state?.currentScreen) {
648
+ notes.push(`on screen: ${step.observation.state.currentScreen}`);
649
+ }
650
+ if (!step.outcome.ok && step.outcome.error) {
651
+ notes.push(`FAILED: ${step.outcome.error.message}`);
652
+ }
653
+ if (step.artifacts?.screenshot?.path) {
654
+ notes.push('screenshot captured');
655
+ }
656
+ return notes.join('; ') || 'executed';
657
+ }, _KnowledgeStore_computeSessionScore = function _KnowledgeStore_computeSessionScore(metadata, queryTokens) {
658
+ let score = 0;
659
+ for (const token of queryTokens) {
660
+ for (const flowTag of metadata.flowTags) {
661
+ if (flowTag.toLowerCase().includes(token)) {
662
+ score += 12;
663
+ break;
664
+ }
665
+ }
666
+ }
667
+ const goalTokens = tokenize(metadata.goal ?? '');
668
+ for (const token of queryTokens) {
669
+ if (goalTokens.includes(token)) {
670
+ score += 6;
671
+ }
672
+ }
673
+ for (const token of queryTokens) {
674
+ for (const tag of metadata.tags) {
675
+ if (tag.toLowerCase().includes(token)) {
676
+ score += 4;
677
+ break;
678
+ }
679
+ }
680
+ }
681
+ const ageHours = (Date.now() - new Date(metadata.createdAt).getTime()) / (1000 * 60 * 60);
682
+ if (ageHours < 24) {
683
+ score += 3;
684
+ }
685
+ else if (ageHours < 72) {
686
+ score += 1;
687
+ }
688
+ return score;
689
+ }, _KnowledgeStore_computeSearchScore = function _KnowledgeStore_computeSearchScore(step, queryTokens) {
690
+ let score = 0;
691
+ const matchedFieldsSet = new Set();
692
+ let matchedTokens = 0;
693
+ const targetTestIdTokens = step.tool.target?.testId
694
+ ? tokenizeIdentifier(step.tool.target.testId)
695
+ : [];
696
+ const observedTestIdTokensMap = new Map();
697
+ for (const testIdItem of step.observation?.testIds ?? []) {
698
+ observedTestIdTokensMap.set(testIdItem.testId, tokenizeIdentifier(testIdItem.testId));
699
+ }
700
+ for (const token of queryTokens) {
701
+ let tokenMatched = false;
702
+ if (step.tool.name.toLowerCase().includes(token)) {
703
+ score += 10;
704
+ matchedFieldsSet.add(`tool:${step.tool.name}`);
705
+ tokenMatched = true;
706
+ }
707
+ const screen = step.observation?.state?.currentScreen;
708
+ if (screen?.toLowerCase().includes(token)) {
709
+ score += 8;
710
+ matchedFieldsSet.add(`screen:${screen}`);
711
+ tokenMatched = true;
712
+ }
713
+ if (step.tool.target?.testId && targetTestIdTokens.includes(token)) {
714
+ score += 6;
715
+ matchedFieldsSet.add(`testId:${step.tool.target.testId}`);
716
+ tokenMatched = true;
717
+ }
718
+ for (const label of step.labels ?? []) {
719
+ if (label.toLowerCase().includes(token)) {
720
+ score += 5;
721
+ matchedFieldsSet.add(`label:${label}`);
722
+ tokenMatched = true;
723
+ break;
724
+ }
725
+ }
726
+ for (const [testId, tokens] of observedTestIdTokensMap) {
727
+ if (tokens.includes(token)) {
728
+ score += 3;
729
+ matchedFieldsSet.add(`testId:${testId}`);
730
+ tokenMatched = true;
731
+ break;
732
+ }
733
+ }
734
+ for (const node of step.observation?.a11y?.nodes ?? []) {
735
+ if (node.name.toLowerCase().includes(token)) {
736
+ score += 2;
737
+ matchedFieldsSet.add(`a11y:${node.role}:"${node.name}"`);
738
+ tokenMatched = true;
739
+ break;
740
+ }
741
+ if (node.role.toLowerCase().includes(token)) {
742
+ score += 2;
743
+ matchedFieldsSet.add(`a11y:${node.role}`);
744
+ tokenMatched = true;
745
+ break;
746
+ }
747
+ }
748
+ if (tokenMatched) {
749
+ matchedTokens += 1;
750
+ }
751
+ }
752
+ if (queryTokens.length > 0) {
753
+ const coverageRatio = matchedTokens / queryTokens.length;
754
+ score += Math.floor(coverageRatio * 5);
755
+ }
756
+ return { score, matchedFields: [...matchedFieldsSet] };
757
+ }, _KnowledgeStore_getRelatedSessions =
758
+ /**
759
+ * Get related sessions based on filters
760
+ *
761
+ * @param sessionIds - Session IDs to filter
762
+ * @param filters - Filters to apply
763
+ * @param limit - Maximum number of sessions to return
764
+ * @returns Array of related session summaries
765
+ */
766
+ async function _KnowledgeStore_getRelatedSessions(sessionIds, filters, limit) {
767
+ const sessions = [];
768
+ for (const sid of sessionIds) {
769
+ if (sessions.length >= limit) {
770
+ break;
771
+ }
772
+ const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
773
+ if (!metadata) {
774
+ continue;
775
+ }
776
+ if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
777
+ continue;
778
+ }
779
+ sessions.push({
780
+ sessionId: metadata.sessionId,
781
+ createdAt: metadata.createdAt,
782
+ goal: metadata.goal,
783
+ flowTags: metadata.flowTags,
784
+ tags: metadata.tags,
785
+ });
786
+ }
787
+ return sessions;
788
+ }, _KnowledgeStore_getSimilarSteps =
789
+ /**
790
+ * Find similar steps from historical sessions
791
+ *
792
+ * @param context - Current context for similarity matching
793
+ * @param sessionIds - Session IDs to search
794
+ * @param filters - Filters to apply to steps
795
+ * @returns Similar steps and total candidate count
796
+ */
797
+ async function _KnowledgeStore_getSimilarSteps(context, sessionIds, filters) {
798
+ const scoredSteps = [];
799
+ let candidateStepCount = 0;
800
+ const visibleTestIdSet = new Set(context.visibleTestIds.map((t) => t.testId));
801
+ const visibleA11yNames = new Set(context.a11yNodes.map((n) => n.name.toLowerCase()));
802
+ const limitedSessionIds = sessionIds.slice(0, SCAN_LIMITS.maxSessionsToScan);
803
+ for (const sid of limitedSessionIds) {
804
+ if (candidateStepCount >= SCAN_LIMITS.maxTotalSteps) {
805
+ break;
806
+ }
807
+ const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
808
+ const limitedSteps = steps.slice(0, SCAN_LIMITS.maxStepsPerSession);
809
+ for (const { step } of limitedSteps) {
810
+ candidateStepCount += 1;
811
+ if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, step, filters)) {
812
+ continue;
813
+ }
814
+ if (__classPrivateFieldGet(this, _KnowledgeStore_discoveryTools, "f").includes(step.tool.name)) {
815
+ continue;
816
+ }
817
+ const score = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSimilarityScore).call(this, step, context, visibleTestIdSet, visibleA11yNames);
818
+ if (score > 0) {
819
+ scoredSteps.push({ step, score });
820
+ }
821
+ }
822
+ }
823
+ scoredSteps.sort((a, b) => b.score - a.score);
824
+ const similarSteps = scoredSteps
825
+ .slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSimilarSteps)
826
+ .map(({ step, score }) => {
827
+ const a11yHint = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_lookupA11yHint).call(this, step);
828
+ return {
829
+ sessionId: step.sessionId,
830
+ timestamp: step.timestamp,
831
+ tool: step.tool.name,
832
+ screen: step.observation?.state?.currentScreen ?? 'unknown',
833
+ snippet: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateSnippet).call(this, step),
834
+ labels: step.labels,
835
+ target: step.tool.target
836
+ ? {
837
+ testId: step.tool.target.testId,
838
+ selector: step.tool.target.selector,
839
+ }
840
+ : undefined,
841
+ a11yHint,
842
+ confidence: Math.min(score / MAX_SIMILARITY_SCORE, 1),
843
+ };
844
+ });
845
+ return { similarSteps, candidateStepCount };
846
+ }, _KnowledgeStore_lookupA11yHint = function _KnowledgeStore_lookupA11yHint(step) {
847
+ const a11yRef = step.tool.target?.a11yRef;
848
+ if (!a11yRef) {
849
+ return undefined;
850
+ }
851
+ const nodes = step.observation?.a11y?.nodes ?? [];
852
+ const matchingNode = nodes.find((node) => node.ref === a11yRef);
853
+ if (!matchingNode?.name) {
854
+ return undefined;
855
+ }
856
+ return { role: matchingNode.role, name: matchingNode.name };
857
+ }, _KnowledgeStore_computeSimilarityScore = function _KnowledgeStore_computeSimilarityScore(step, context, visibleTestIdSet, visibleA11yNames) {
858
+ let score = 0;
859
+ const stepScreen = step.observation?.state?.currentScreen;
860
+ const contextScreen = context.currentScreen;
861
+ if (stepScreen === contextScreen && stepScreen !== 'unknown') {
862
+ score += SIMILARITY_WEIGHTS.sameScreen;
863
+ }
864
+ if (context.currentUrl && step.observation?.state) {
865
+ const currentPathTokens = extractPathTokens(context.currentUrl);
866
+ const stepUrl = step.observation.state.currentUrl ?? '';
867
+ const stepPathTokens = extractPathTokens(stepUrl);
868
+ for (const token of currentPathTokens) {
869
+ if (stepPathTokens.includes(token)) {
870
+ score += SIMILARITY_WEIGHTS.urlPathOverlap;
871
+ break;
872
+ }
873
+ }
874
+ }
875
+ let testIdOverlapCount = 0;
876
+ for (const testId of step.observation?.testIds ?? []) {
877
+ if (visibleTestIdSet.has(testId.testId)) {
878
+ testIdOverlapCount += 1;
879
+ if (testIdOverlapCount >= 3) {
880
+ break;
881
+ }
882
+ }
883
+ }
884
+ score += Math.min(testIdOverlapCount, 3) * SIMILARITY_WEIGHTS.testIdOverlap;
885
+ let a11yOverlapCount = 0;
886
+ for (const node of step.observation?.a11y?.nodes ?? []) {
887
+ if (visibleA11yNames.has(node.name.toLowerCase())) {
888
+ a11yOverlapCount += 1;
889
+ if (a11yOverlapCount >= 2) {
890
+ break;
891
+ }
892
+ }
893
+ }
894
+ score += Math.min(a11yOverlapCount, 2) * SIMILARITY_WEIGHTS.a11yOverlap;
895
+ if (__classPrivateFieldGet(this, _KnowledgeStore_actionableTools, "f").includes(step.tool.name)) {
896
+ score += SIMILARITY_WEIGHTS.actionableTool;
897
+ }
898
+ return score;
899
+ }, _KnowledgeStore_buildSuggestedActions = function _KnowledgeStore_buildSuggestedActions(similarSteps, context) {
900
+ const visibleTestIdSet = new Set(context.visibleTestIds.map((t) => t.testId));
901
+ const visibleA11yMap = new Map(context.a11yNodes.map((n) => [n.name.toLowerCase(), n]));
902
+ const actionCounts = new Map();
903
+ for (const step of similarSteps) {
904
+ if (!step.target?.testId && !step.target?.selector) {
905
+ continue;
906
+ }
907
+ const key = step.target.testId ?? step.target.selector ?? '';
908
+ const existing = actionCounts.get(key);
909
+ if (existing) {
910
+ existing.count += 1;
911
+ existing.confidenceSum += step.confidence;
912
+ }
913
+ else {
914
+ actionCounts.set(key, {
915
+ step,
916
+ count: 1,
917
+ confidenceSum: step.confidence,
918
+ });
919
+ }
920
+ }
921
+ const suggestions = [];
922
+ const sortedActions = Array.from(actionCounts.entries()).sort(([, a], [, b]) => b.confidenceSum - a.confidenceSum);
923
+ for (const [, { step, count, confidenceSum }] of sortedActions) {
924
+ if (suggestions.length >= PRIOR_KNOWLEDGE_CONFIG.maxSuggestedActions) {
925
+ break;
926
+ }
927
+ const preferredTarget = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildPreferredTarget).call(this, step, visibleTestIdSet);
928
+ if (!preferredTarget) {
929
+ continue;
930
+ }
931
+ const fallbackTargets = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildFallbackTargets).call(this, preferredTarget, visibleA11yMap);
932
+ const action = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_toolToAction).call(this, step.tool);
933
+ if (!action) {
934
+ continue;
935
+ }
936
+ suggestions.push({
937
+ rank: suggestions.length + 1,
938
+ action,
939
+ rationale: count > 1
940
+ ? `Used ${count} times successfully on this screen`
941
+ : 'Most common next successful step on this screen',
942
+ confidence: Math.min(confidenceSum / count, 1),
943
+ preferredTarget,
944
+ fallbackTargets: fallbackTargets.length > 0 ? fallbackTargets : undefined,
945
+ });
946
+ }
947
+ return suggestions;
948
+ }, _KnowledgeStore_buildPreferredTarget = function _KnowledgeStore_buildPreferredTarget(priorStep, visibleTestIdSet) {
949
+ if (priorStep.target?.testId &&
950
+ visibleTestIdSet.has(priorStep.target.testId)) {
951
+ return { type: 'testId', value: priorStep.target.testId };
952
+ }
953
+ if (priorStep.target?.selector) {
954
+ return { type: 'selector', value: priorStep.target.selector };
955
+ }
956
+ if (priorStep.a11yHint) {
957
+ return { type: 'a11yHint', value: priorStep.a11yHint };
958
+ }
959
+ return null;
960
+ }, _KnowledgeStore_buildFallbackTargets = function _KnowledgeStore_buildFallbackTargets(preferredTarget, visibleA11yMap) {
961
+ const fallbacks = [];
962
+ if (preferredTarget.type === 'testId') {
963
+ const testId = preferredTarget.value;
964
+ const entries = Array.from(visibleA11yMap.entries());
965
+ for (const [name, node] of entries) {
966
+ if (name.includes(testId.replace(/-/gu, ' ').toLowerCase()) ||
967
+ testId.toLowerCase().includes(name)) {
968
+ fallbacks.push({
969
+ type: 'a11yHint',
970
+ value: { role: node.role, name: node.name },
971
+ });
972
+ break;
973
+ }
974
+ }
975
+ }
976
+ return fallbacks;
977
+ }, _KnowledgeStore_toolToAction = function _KnowledgeStore_toolToAction(toolName) {
978
+ return __classPrivateFieldGet(this, _KnowledgeStore_toolActionMap, "f")[toolName] ?? null;
979
+ }, _KnowledgeStore_buildAvoidList =
980
+ /**
981
+ * Build list of actions to avoid based on failure history
982
+ *
983
+ * @param context - Current context for avoid list building
984
+ * @param sessionIds - Session IDs to analyze for failures
985
+ * @returns Array of actions to avoid
986
+ */
987
+ async function _KnowledgeStore_buildAvoidList(context, sessionIds) {
988
+ const failureCounts = new Map();
989
+ for (const sid of sessionIds) {
990
+ const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
991
+ for (const { step } of steps) {
992
+ if (step.outcome.ok) {
993
+ continue;
994
+ }
995
+ if (step.observation?.state?.currentScreen !== context.currentScreen) {
996
+ continue;
997
+ }
998
+ const targetKey = step.tool.target?.testId ?? step.tool.target?.selector ?? 'unknown';
999
+ const existing = failureCounts.get(targetKey);
1000
+ if (existing) {
1001
+ existing.count += 1;
1002
+ }
1003
+ else {
1004
+ failureCounts.set(targetKey, {
1005
+ errorCode: step.outcome.error?.code,
1006
+ testId: step.tool.target?.testId,
1007
+ selector: step.tool.target?.selector,
1008
+ count: 1,
1009
+ });
1010
+ }
1011
+ }
1012
+ }
1013
+ const avoidList = [];
1014
+ const failureEntries = Array.from(failureCounts.values());
1015
+ for (const failure of failureEntries) {
1016
+ if (failure.count < PRIOR_KNOWLEDGE_CONFIG.minAvoidFailureCount) {
1017
+ continue;
1018
+ }
1019
+ avoidList.push({
1020
+ rationale: 'Frequently fails due to UI churn',
1021
+ target: {
1022
+ testId: failure.testId,
1023
+ selector: failure.selector,
1024
+ },
1025
+ errorCode: failure.errorCode,
1026
+ frequency: failure.count,
1027
+ });
1028
+ }
1029
+ avoidList.sort((a, b) => b.frequency - a.frequency);
1030
+ return avoidList;
1031
+ };
1032
+ /**
1033
+ * Create a default observation object with state and optional artifacts
1034
+ *
1035
+ * @param state - Extension state snapshot
1036
+ * @param testIds - Array of visible test IDs
1037
+ * @param a11yNodes - Array of accessibility nodes
1038
+ * @param priorKnowledge - Optional prior knowledge from history
1039
+ * @returns Observation object for step recording
1040
+ */
1041
+ export function createDefaultObservation(state, testIds = [], a11yNodes = [], priorKnowledge) {
1042
+ const observation = {
1043
+ state,
1044
+ testIds,
1045
+ a11y: { nodes: a11yNodes },
1046
+ };
1047
+ if (priorKnowledge) {
1048
+ observation.priorKnowledge = priorKnowledge;
1049
+ }
1050
+ return observation;
1051
+ }
1052
+ /**
1053
+ * Create a new KnowledgeStore instance
1054
+ *
1055
+ * @param config - Optional configuration for the store
1056
+ * @returns New KnowledgeStore instance
1057
+ */
1058
+ export function createKnowledgeStore(config) {
1059
+ return new KnowledgeStore(config);
1060
+ }
1061
+ let _knowledgeStore;
1062
+ /**
1063
+ * Set the global knowledge store instance
1064
+ *
1065
+ * @param store - KnowledgeStore instance to set as global
1066
+ */
1067
+ export function setKnowledgeStore(store) {
1068
+ _knowledgeStore = store;
1069
+ }
1070
+ /**
1071
+ * Get the global knowledge store instance
1072
+ *
1073
+ * @returns The global KnowledgeStore instance
1074
+ */
1075
+ export function getKnowledgeStore() {
1076
+ if (!_knowledgeStore) {
1077
+ throw new Error('Knowledge store not initialized. Call setKnowledgeStore() first.');
1078
+ }
1079
+ return _knowledgeStore;
1080
+ }
1081
+ /**
1082
+ * Check if a knowledge store has been initialized
1083
+ *
1084
+ * @returns True if knowledge store is initialized
1085
+ */
1086
+ export function hasKnowledgeStore() {
1087
+ return _knowledgeStore !== undefined;
1088
+ }
1089
+ export const knowledgeStore = {
1090
+ /**
1091
+ * Record a tool execution step
1092
+ *
1093
+ * @param params - Step recording parameters
1094
+ * @returns Path to the recorded step file
1095
+ */
1096
+ recordStep: async (params) => {
1097
+ return getKnowledgeStore().recordStep(params);
1098
+ },
1099
+ /**
1100
+ * Get the last N steps from the knowledge store
1101
+ *
1102
+ * @param args - Arguments for getLastSteps
1103
+ * @returns Array of step summaries
1104
+ */
1105
+ getLastSteps: async (...args) => {
1106
+ return getKnowledgeStore().getLastSteps(...args);
1107
+ },
1108
+ /**
1109
+ * Search steps by query
1110
+ *
1111
+ * @param args - Arguments for searchSteps
1112
+ * @returns Array of matching step summaries
1113
+ */
1114
+ searchSteps: async (...args) => {
1115
+ return getKnowledgeStore().searchSteps(...args);
1116
+ },
1117
+ /**
1118
+ * Generate a recipe summary of a session
1119
+ *
1120
+ * @param args - Arguments for summarizeSession
1121
+ * @returns Session summary with recipe steps
1122
+ */
1123
+ summarizeSession: async (...args) => {
1124
+ return getKnowledgeStore().summarizeSession(...args);
1125
+ },
1126
+ /**
1127
+ * List sessions with optional filtering
1128
+ *
1129
+ * @param args - Arguments for listSessions
1130
+ * @returns Array of session summaries
1131
+ */
1132
+ listSessions: async (...args) => {
1133
+ return getKnowledgeStore().listSessions(...args);
1134
+ },
1135
+ /**
1136
+ * Generate prior knowledge from historical sessions
1137
+ *
1138
+ * @param args - Arguments for generatePriorKnowledge
1139
+ * @returns Prior knowledge object or undefined
1140
+ */
1141
+ generatePriorKnowledge: async (...args) => {
1142
+ return getKnowledgeStore().generatePriorKnowledge(...args);
1143
+ },
1144
+ /**
1145
+ * Write session metadata to disk
1146
+ *
1147
+ * @param metadata - Session metadata to persist
1148
+ * @returns Path to the written metadata file
1149
+ */
1150
+ writeSessionMetadata: async (metadata) => {
1151
+ return getKnowledgeStore().writeSessionMetadata(metadata);
1152
+ },
1153
+ };
1154
+ //# sourceMappingURL=knowledge-store.mjs.map