agent-web-interface 4.4.0 → 4.5.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 (319) hide show
  1. package/dist/src/browser/browser-session-config.d.ts +33 -0
  2. package/dist/src/browser/browser-session-config.d.ts.map +1 -0
  3. package/dist/src/browser/browser-session-config.js +24 -0
  4. package/dist/src/browser/browser-session-config.js.map +1 -0
  5. package/dist/src/browser/ensure-browser.d.ts +12 -27
  6. package/dist/src/browser/ensure-browser.d.ts.map +1 -1
  7. package/dist/src/browser/ensure-browser.js +104 -37
  8. package/dist/src/browser/ensure-browser.js.map +1 -1
  9. package/dist/src/browser/index.d.ts +2 -1
  10. package/dist/src/browser/index.d.ts.map +1 -1
  11. package/dist/src/browser/index.js +1 -0
  12. package/dist/src/browser/index.js.map +1 -1
  13. package/dist/src/browser/session-manager.d.ts +20 -0
  14. package/dist/src/browser/session-manager.d.ts.map +1 -1
  15. package/dist/src/browser/session-manager.js +122 -17
  16. package/dist/src/browser/session-manager.js.map +1 -1
  17. package/dist/src/browser/session-manager.types.d.ts +14 -2
  18. package/dist/src/browser/session-manager.types.d.ts.map +1 -1
  19. package/dist/src/browser/session-manager.types.js +5 -1
  20. package/dist/src/browser/session-manager.types.js.map +1 -1
  21. package/dist/src/cli/args.d.ts +12 -18
  22. package/dist/src/cli/args.d.ts.map +1 -1
  23. package/dist/src/cli/args.js +35 -40
  24. package/dist/src/cli/args.js.map +1 -1
  25. package/dist/src/form/constraint-extraction.d.ts +5 -0
  26. package/dist/src/form/constraint-extraction.d.ts.map +1 -1
  27. package/dist/src/form/constraint-extraction.js +13 -6
  28. package/dist/src/form/constraint-extraction.js.map +1 -1
  29. package/dist/src/form/field-extractor.d.ts.map +1 -1
  30. package/dist/src/form/field-extractor.js +14 -7
  31. package/dist/src/form/field-extractor.js.map +1 -1
  32. package/dist/src/form/form-state.d.ts.map +1 -1
  33. package/dist/src/form/form-state.js +16 -4
  34. package/dist/src/form/form-state.js.map +1 -1
  35. package/dist/src/gateway/http-gateway.d.ts +56 -0
  36. package/dist/src/gateway/http-gateway.d.ts.map +1 -0
  37. package/dist/src/gateway/http-gateway.js +229 -0
  38. package/dist/src/gateway/http-gateway.js.map +1 -0
  39. package/dist/src/gateway/json-rpc-errors.d.ts +6 -0
  40. package/dist/src/gateway/json-rpc-errors.d.ts.map +1 -0
  41. package/dist/src/gateway/json-rpc-errors.js +11 -0
  42. package/dist/src/gateway/json-rpc-errors.js.map +1 -0
  43. package/dist/src/gateway/session-router.d.ts +80 -0
  44. package/dist/src/gateway/session-router.d.ts.map +1 -0
  45. package/dist/src/gateway/session-router.js +177 -0
  46. package/dist/src/gateway/session-router.js.map +1 -0
  47. package/dist/src/http-entry.d.ts +20 -0
  48. package/dist/src/http-entry.d.ts.map +1 -0
  49. package/dist/src/http-entry.js +112 -0
  50. package/dist/src/http-entry.js.map +1 -0
  51. package/dist/src/index.d.ts +1 -10
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +25 -232
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/lib/text-utils.d.ts +0 -24
  56. package/dist/src/lib/text-utils.d.ts.map +1 -1
  57. package/dist/src/lib/text-utils.js +2 -38
  58. package/dist/src/lib/text-utils.js.map +1 -1
  59. package/dist/src/observation/eid-linker.d.ts.map +1 -1
  60. package/dist/src/observation/eid-linker.js +1 -21
  61. package/dist/src/observation/eid-linker.js.map +1 -1
  62. package/dist/src/server/index.d.ts +0 -1
  63. package/dist/src/server/index.d.ts.map +1 -1
  64. package/dist/src/server/index.js +0 -1
  65. package/dist/src/server/index.js.map +1 -1
  66. package/dist/src/server/mcp-server.d.ts +6 -2
  67. package/dist/src/server/mcp-server.d.ts.map +1 -1
  68. package/dist/src/server/mcp-server.js +3 -91
  69. package/dist/src/server/mcp-server.js.map +1 -1
  70. package/dist/src/server/server-config.d.ts +4 -20
  71. package/dist/src/server/server-config.d.ts.map +1 -1
  72. package/dist/src/server/server-config.js +6 -50
  73. package/dist/src/server/server-config.js.map +1 -1
  74. package/dist/src/server/tool-registrar.types.d.ts +25 -0
  75. package/dist/src/server/tool-registrar.types.d.ts.map +1 -0
  76. package/dist/src/server/tool-registrar.types.js +10 -0
  77. package/dist/src/server/tool-registrar.types.js.map +1 -0
  78. package/dist/src/server/tool-result-handler.d.ts +61 -0
  79. package/dist/src/server/tool-result-handler.d.ts.map +1 -0
  80. package/dist/src/server/tool-result-handler.js +137 -0
  81. package/dist/src/server/tool-result-handler.js.map +1 -0
  82. package/dist/src/session/session-controller.d.ts +123 -0
  83. package/dist/src/session/session-controller.d.ts.map +1 -0
  84. package/dist/src/session/session-controller.js +273 -0
  85. package/dist/src/session/session-controller.js.map +1 -0
  86. package/dist/src/shared/services/index.d.ts +0 -2
  87. package/dist/src/shared/services/index.d.ts.map +1 -1
  88. package/dist/src/shared/services/index.js +0 -2
  89. package/dist/src/shared/services/index.js.map +1 -1
  90. package/dist/src/shared/version.d.ts +10 -0
  91. package/dist/src/shared/version.d.ts.map +1 -0
  92. package/dist/src/shared/version.js +32 -0
  93. package/dist/src/shared/version.js.map +1 -0
  94. package/dist/src/snapshot/element-resolver.d.ts +3 -2
  95. package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
  96. package/dist/src/snapshot/element-resolver.js +83 -8
  97. package/dist/src/snapshot/element-resolver.js.map +1 -1
  98. package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -1
  99. package/dist/src/snapshot/extractors/attribute-extractor.js +4 -0
  100. package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -1
  101. package/dist/src/snapshot/extractors/layout-extractor.d.ts +9 -7
  102. package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -1
  103. package/dist/src/snapshot/extractors/layout-extractor.js +34 -19
  104. package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -1
  105. package/dist/src/snapshot/extractors/state-extractor.d.ts +2 -2
  106. package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -1
  107. package/dist/src/snapshot/extractors/state-extractor.js +22 -2
  108. package/dist/src/snapshot/extractors/state-extractor.js.map +1 -1
  109. package/dist/src/snapshot/extractors/types.d.ts +6 -0
  110. package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
  111. package/dist/src/snapshot/extractors/types.js.map +1 -1
  112. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
  113. package/dist/src/snapshot/snapshot-compiler.js +15 -2
  114. package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
  115. package/dist/src/snapshot/snapshot.types.d.ts +10 -1
  116. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
  117. package/dist/src/snapshot/snapshot.types.js.map +1 -1
  118. package/dist/src/state/actionables-filter.d.ts.map +1 -1
  119. package/dist/src/state/actionables-filter.js +7 -3
  120. package/dist/src/state/actionables-filter.js.map +1 -1
  121. package/dist/src/state/atoms-extractor.d.ts.map +1 -1
  122. package/dist/src/state/atoms-extractor.js +3 -23
  123. package/dist/src/state/atoms-extractor.js.map +1 -1
  124. package/dist/src/state/diff-engine.d.ts.map +1 -1
  125. package/dist/src/state/diff-engine.js +6 -33
  126. package/dist/src/state/diff-engine.js.map +1 -1
  127. package/dist/src/state/element-identity.d.ts +3 -6
  128. package/dist/src/state/element-identity.d.ts.map +1 -1
  129. package/dist/src/state/element-identity.js +10 -7
  130. package/dist/src/state/element-identity.js.map +1 -1
  131. package/dist/src/state/element-ref.types.d.ts +5 -27
  132. package/dist/src/state/element-ref.types.d.ts.map +1 -1
  133. package/dist/src/state/state-manager.d.ts.map +1 -1
  134. package/dist/src/state/state-manager.js +3 -1
  135. package/dist/src/state/state-manager.js.map +1 -1
  136. package/dist/src/state/state-renderer.d.ts.map +1 -1
  137. package/dist/src/state/state-renderer.js +3 -1
  138. package/dist/src/state/state-renderer.js.map +1 -1
  139. package/dist/src/state/types.d.ts +2 -1
  140. package/dist/src/state/types.d.ts.map +1 -1
  141. package/dist/src/state/url-sanitization.d.ts +1 -1
  142. package/dist/src/state/url-sanitization.d.ts.map +1 -1
  143. package/dist/src/state/url-sanitization.js +29 -13
  144. package/dist/src/state/url-sanitization.js.map +1 -1
  145. package/dist/src/tools/action-context.d.ts +6 -11
  146. package/dist/src/tools/action-context.d.ts.map +1 -1
  147. package/dist/src/tools/action-context.js +10 -19
  148. package/dist/src/tools/action-context.js.map +1 -1
  149. package/dist/src/tools/action-stabilization.d.ts.map +1 -1
  150. package/dist/src/tools/action-stabilization.js +6 -0
  151. package/dist/src/tools/action-stabilization.js.map +1 -1
  152. package/dist/src/tools/browser-tools.d.ts +3 -2
  153. package/dist/src/tools/browser-tools.d.ts.map +1 -1
  154. package/dist/src/tools/browser-tools.js +5 -3
  155. package/dist/src/tools/browser-tools.js.map +1 -1
  156. package/dist/src/tools/canvas-tools.d.ts +2 -1
  157. package/dist/src/tools/canvas-tools.d.ts.map +1 -1
  158. package/dist/src/tools/canvas-tools.js +5 -7
  159. package/dist/src/tools/canvas-tools.js.map +1 -1
  160. package/dist/src/tools/errors.d.ts +2 -34
  161. package/dist/src/tools/errors.d.ts.map +1 -1
  162. package/dist/src/tools/errors.js +1 -44
  163. package/dist/src/tools/errors.js.map +1 -1
  164. package/dist/src/tools/execute-action.d.ts +4 -3
  165. package/dist/src/tools/execute-action.d.ts.map +1 -1
  166. package/dist/src/tools/execute-action.js +32 -23
  167. package/dist/src/tools/execute-action.js.map +1 -1
  168. package/dist/src/tools/form-tools.d.ts +3 -8
  169. package/dist/src/tools/form-tools.d.ts.map +1 -1
  170. package/dist/src/tools/form-tools.js +38 -18
  171. package/dist/src/tools/form-tools.js.map +1 -1
  172. package/dist/src/tools/index.d.ts +6 -6
  173. package/dist/src/tools/index.d.ts.map +1 -1
  174. package/dist/src/tools/index.js +7 -10
  175. package/dist/src/tools/index.js.map +1 -1
  176. package/dist/src/tools/interaction-tools.d.ts +6 -5
  177. package/dist/src/tools/interaction-tools.d.ts.map +1 -1
  178. package/dist/src/tools/interaction-tools.js +29 -32
  179. package/dist/src/tools/interaction-tools.js.map +1 -1
  180. package/dist/src/tools/navigation-tools.d.ts +7 -13
  181. package/dist/src/tools/navigation-tools.d.ts.map +1 -1
  182. package/dist/src/tools/navigation-tools.js +52 -59
  183. package/dist/src/tools/navigation-tools.js.map +1 -1
  184. package/dist/src/tools/observation-tools.d.ts +6 -5
  185. package/dist/src/tools/observation-tools.d.ts.map +1 -1
  186. package/dist/src/tools/observation-tools.js +30 -34
  187. package/dist/src/tools/observation-tools.js.map +1 -1
  188. package/dist/src/tools/readability-tools.d.ts +16 -0
  189. package/dist/src/tools/readability-tools.d.ts.map +1 -0
  190. package/dist/src/tools/readability-tools.js +45 -0
  191. package/dist/src/tools/readability-tools.js.map +1 -0
  192. package/dist/src/tools/response-builder.d.ts +20 -32
  193. package/dist/src/tools/response-builder.d.ts.map +1 -1
  194. package/dist/src/tools/response-builder.js +31 -47
  195. package/dist/src/tools/response-builder.js.map +1 -1
  196. package/dist/src/tools/stale-element-retry.d.ts.map +1 -1
  197. package/dist/src/tools/stale-element-retry.js +37 -2
  198. package/dist/src/tools/stale-element-retry.js.map +1 -1
  199. package/dist/src/tools/tool-context.d.ts +4 -36
  200. package/dist/src/tools/tool-context.d.ts.map +1 -1
  201. package/dist/src/tools/tool-context.js +6 -75
  202. package/dist/src/tools/tool-context.js.map +1 -1
  203. package/dist/src/tools/tool-context.types.d.ts +141 -0
  204. package/dist/src/tools/tool-context.types.d.ts.map +1 -0
  205. package/dist/src/tools/tool-context.types.js +11 -0
  206. package/dist/src/tools/tool-context.types.js.map +1 -0
  207. package/dist/src/tools/tool-registration.d.ts +25 -0
  208. package/dist/src/tools/tool-registration.d.ts.map +1 -0
  209. package/dist/src/tools/tool-registration.js +180 -0
  210. package/dist/src/tools/tool-registration.js.map +1 -0
  211. package/dist/src/tools/tool-schemas.d.ts +88 -1947
  212. package/dist/src/tools/tool-schemas.d.ts.map +1 -1
  213. package/dist/src/tools/tool-schemas.js +21 -302
  214. package/dist/src/tools/tool-schemas.js.map +1 -1
  215. package/dist/src/tools/viewport-tools.d.ts +4 -3
  216. package/dist/src/tools/viewport-tools.d.ts.map +1 -1
  217. package/dist/src/tools/viewport-tools.js +17 -21
  218. package/dist/src/tools/viewport-tools.js.map +1 -1
  219. package/dist/src/worker/chrome-worker-process.d.ts +4 -0
  220. package/dist/src/worker/chrome-worker-process.d.ts.map +1 -1
  221. package/dist/src/worker/chrome-worker-process.js +1 -1
  222. package/dist/src/worker/chrome-worker-process.js.map +1 -1
  223. package/package.json +7 -3
  224. package/dist/src/factpack/action-selector.d.ts +0 -36
  225. package/dist/src/factpack/action-selector.d.ts.map +0 -1
  226. package/dist/src/factpack/action-selector.js +0 -367
  227. package/dist/src/factpack/action-selector.js.map +0 -1
  228. package/dist/src/factpack/dialog-detector.d.ts +0 -19
  229. package/dist/src/factpack/dialog-detector.d.ts.map +0 -1
  230. package/dist/src/factpack/dialog-detector.js +0 -354
  231. package/dist/src/factpack/dialog-detector.js.map +0 -1
  232. package/dist/src/factpack/form-detector.d.ts +0 -28
  233. package/dist/src/factpack/form-detector.d.ts.map +0 -1
  234. package/dist/src/factpack/form-detector.js +0 -555
  235. package/dist/src/factpack/form-detector.js.map +0 -1
  236. package/dist/src/factpack/index.d.ts +0 -32
  237. package/dist/src/factpack/index.d.ts.map +0 -1
  238. package/dist/src/factpack/index.js +0 -73
  239. package/dist/src/factpack/index.js.map +0 -1
  240. package/dist/src/factpack/page-classifier.d.ts +0 -22
  241. package/dist/src/factpack/page-classifier.d.ts.map +0 -1
  242. package/dist/src/factpack/page-classifier.js +0 -526
  243. package/dist/src/factpack/page-classifier.js.map +0 -1
  244. package/dist/src/factpack/types.d.ts +0 -307
  245. package/dist/src/factpack/types.d.ts.map +0 -1
  246. package/dist/src/factpack/types.js +0 -12
  247. package/dist/src/factpack/types.js.map +0 -1
  248. package/dist/src/lib/constants.d.ts +0 -27
  249. package/dist/src/lib/constants.d.ts.map +0 -1
  250. package/dist/src/lib/constants.js +0 -63
  251. package/dist/src/lib/constants.js.map +0 -1
  252. package/dist/src/lib/index.d.ts +0 -12
  253. package/dist/src/lib/index.d.ts.map +0 -1
  254. package/dist/src/lib/index.js +0 -17
  255. package/dist/src/lib/index.js.map +0 -1
  256. package/dist/src/lib/regions.d.ts +0 -29
  257. package/dist/src/lib/regions.d.ts.map +0 -1
  258. package/dist/src/lib/regions.js +0 -93
  259. package/dist/src/lib/regions.js.map +0 -1
  260. package/dist/src/lib/scoring.d.ts +0 -47
  261. package/dist/src/lib/scoring.d.ts.map +0 -1
  262. package/dist/src/lib/scoring.js +0 -79
  263. package/dist/src/lib/scoring.js.map +0 -1
  264. package/dist/src/lib/selectors.d.ts +0 -42
  265. package/dist/src/lib/selectors.d.ts.map +0 -1
  266. package/dist/src/lib/selectors.js +0 -138
  267. package/dist/src/lib/selectors.js.map +0 -1
  268. package/dist/src/renderer/budget-manager.d.ts +0 -46
  269. package/dist/src/renderer/budget-manager.d.ts.map +0 -1
  270. package/dist/src/renderer/budget-manager.js +0 -133
  271. package/dist/src/renderer/budget-manager.js.map +0 -1
  272. package/dist/src/renderer/constants.d.ts +0 -38
  273. package/dist/src/renderer/constants.d.ts.map +0 -1
  274. package/dist/src/renderer/constants.js +0 -29
  275. package/dist/src/renderer/constants.js.map +0 -1
  276. package/dist/src/renderer/index.d.ts +0 -12
  277. package/dist/src/renderer/index.d.ts.map +0 -1
  278. package/dist/src/renderer/index.js +0 -16
  279. package/dist/src/renderer/index.js.map +0 -1
  280. package/dist/src/renderer/section-renderers.d.ts +0 -42
  281. package/dist/src/renderer/section-renderers.d.ts.map +0 -1
  282. package/dist/src/renderer/section-renderers.js +0 -252
  283. package/dist/src/renderer/section-renderers.js.map +0 -1
  284. package/dist/src/renderer/token-counter.d.ts +0 -45
  285. package/dist/src/renderer/token-counter.d.ts.map +0 -1
  286. package/dist/src/renderer/token-counter.js +0 -65
  287. package/dist/src/renderer/token-counter.js.map +0 -1
  288. package/dist/src/renderer/types.d.ts +0 -71
  289. package/dist/src/renderer/types.d.ts.map +0 -1
  290. package/dist/src/renderer/types.js +0 -7
  291. package/dist/src/renderer/types.js.map +0 -1
  292. package/dist/src/renderer/xml-renderer.d.ts +0 -42
  293. package/dist/src/renderer/xml-renderer.d.ts.map +0 -1
  294. package/dist/src/renderer/xml-renderer.js +0 -103
  295. package/dist/src/renderer/xml-renderer.js.map +0 -1
  296. package/dist/src/server/session-store.d.ts +0 -163
  297. package/dist/src/server/session-store.d.ts.map +0 -1
  298. package/dist/src/server/session-store.js +0 -248
  299. package/dist/src/server/session-store.js.map +0 -1
  300. package/dist/src/session/session-worker-binding.d.ts +0 -57
  301. package/dist/src/session/session-worker-binding.d.ts.map +0 -1
  302. package/dist/src/session/session-worker-binding.js +0 -109
  303. package/dist/src/session/session-worker-binding.js.map +0 -1
  304. package/dist/src/shared/services/dom-transformer.service.d.ts +0 -71
  305. package/dist/src/shared/services/dom-transformer.service.d.ts.map +0 -1
  306. package/dist/src/shared/services/dom-transformer.service.js +0 -190
  307. package/dist/src/shared/services/dom-transformer.service.js.map +0 -1
  308. package/dist/src/shared/services/selector-builder.service.d.ts +0 -53
  309. package/dist/src/shared/services/selector-builder.service.d.ts.map +0 -1
  310. package/dist/src/shared/services/selector-builder.service.js +0 -240
  311. package/dist/src/shared/services/selector-builder.service.js.map +0 -1
  312. package/dist/src/state/constants.d.ts +0 -125
  313. package/dist/src/state/constants.d.ts.map +0 -1
  314. package/dist/src/state/constants.js +0 -131
  315. package/dist/src/state/constants.js.map +0 -1
  316. package/dist/src/tools/state-manager-registry.d.ts +0 -26
  317. package/dist/src/tools/state-manager-registry.d.ts.map +0 -1
  318. package/dist/src/tools/state-manager-registry.js +0 -39
  319. package/dist/src/tools/state-manager-registry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../../src/server/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAA6B,MAAM,8BAA8B,CAAC;AAE7F,sBAAsB;AACtB,IAAI,YAAY,GAAsB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,uCAAuC;IACvC,qFAAqF;IACrF,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,cAAc,KAAK,IAAI,cAAc,EAAE,CAAC;IACxC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,cAAc,KAAK,IAAI,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,MAAM,OAAO,GAAyB;QACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IAEF,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;IACpB,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../../src/server/server-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAC;AAE5D,mBAAmB;AACnB,IAAI,YAAY,GAAsB,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Tool Registrar Types
3
+ *
4
+ * Defines the minimal interface for registering MCP tools.
5
+ * Used by both BrowserAutomationServer (stdio) and HttpGateway (HTTP).
6
+ *
7
+ * @module server/tool-registrar.types
8
+ */
9
+ import type { ZodRawShape } from 'zod';
10
+ /**
11
+ * Minimal interface for registering tools on an MCP server.
12
+ *
13
+ * Implemented by:
14
+ * - BrowserAutomationServer (stdio transport with logging/error wrapping)
15
+ * - HttpToolRegistrar (HTTP transport, wraps McpServer.registerTool)
16
+ */
17
+ export interface ToolRegistrar {
18
+ registerTool(name: string, definition: {
19
+ title: string;
20
+ description?: string;
21
+ inputSchema: ZodRawShape;
22
+ outputSchema?: ZodRawShape;
23
+ }, handler: (input: unknown) => Promise<unknown>): void;
24
+ }
25
+ //# sourceMappingURL=tool-registrar.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registrar.types.d.ts","sourceRoot":"","sources":["../../../src/server/tool-registrar.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,CAAC,EAAE,WAAW,CAAC;KAC5B,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,IAAI,CAAC;CACT"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tool Registrar Types
3
+ *
4
+ * Defines the minimal interface for registering MCP tools.
5
+ * Used by both BrowserAutomationServer (stdio) and HttpGateway (HTTP).
6
+ *
7
+ * @module server/tool-registrar.types
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=tool-registrar.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registrar.types.js","sourceRoot":"","sources":["../../../src/server/tool-registrar.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Tool Result Handler
3
+ *
4
+ * Shared result-wrapping logic for converting tool handler return values
5
+ * into MCP-compatible content arrays. Used by both BrowserAutomationServer
6
+ * (stdio) and HttpToolRegistrar (HTTP) to avoid duplication.
7
+ *
8
+ * @module server/tool-result-handler
9
+ */
10
+ /** MCP text content */
11
+ interface TextContent {
12
+ readonly type: 'text';
13
+ readonly text: string;
14
+ }
15
+ /** MCP image content */
16
+ interface ImageContent {
17
+ readonly type: 'image';
18
+ readonly data: string;
19
+ readonly mimeType: string;
20
+ }
21
+ /** Union of MCP content types produced by this module */
22
+ export type Content = TextContent | ImageContent;
23
+ /** Formatted tool result ready for MCP response */
24
+ export interface FormattedToolResult {
25
+ [key: string]: unknown;
26
+ content: Content[];
27
+ structuredContent?: Record<string, unknown>;
28
+ isError?: boolean;
29
+ }
30
+ /**
31
+ * Format a tool handler result into an MCP-compatible content array.
32
+ *
33
+ * Handles CompositeResult, ImageResult, FileResult, structured output,
34
+ * plain strings, and arbitrary objects (JSON-stringified).
35
+ *
36
+ * @param result - The raw return value from a tool handler
37
+ * @param hasOutputSchema - Whether the tool definition has an outputSchema
38
+ * @returns MCP-compatible content array with optional structuredContent
39
+ */
40
+ export declare function formatToolResult(result: unknown, hasOutputSchema?: boolean): FormattedToolResult;
41
+ /**
42
+ * Format an error into an MCP-compatible error response.
43
+ *
44
+ * @param error - The caught error
45
+ * @returns MCP-compatible error content
46
+ */
47
+ export declare function formatToolError(error: unknown): FormattedToolResult;
48
+ /**
49
+ * Wrap a tool handler with logging, timing, and MCP result formatting.
50
+ *
51
+ * Shared by both BrowserAutomationServer (stdio) and HttpToolRegistrar (HTTP)
52
+ * to avoid duplicating the try/catch/timing/logging boilerplate.
53
+ *
54
+ * @param name - Tool name used in log messages
55
+ * @param handler - The raw tool handler function
56
+ * @param hasOutputSchema - Whether the tool definition has an outputSchema
57
+ * @returns A wrapped handler that returns a FormattedToolResult
58
+ */
59
+ export declare function wrapToolHandler<T>(name: string, handler: (input: T) => Promise<unknown>, hasOutputSchema: boolean): (input: T) => Promise<FormattedToolResult>;
60
+ export {};
61
+ //# sourceMappingURL=tool-result-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-handler.d.ts","sourceRoot":"","sources":["../../../src/server/tool-result-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,uBAAuB;AACvB,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAwB;AACxB,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yDAAyD;AACzD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC;AAEjD,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,UAAQ,GAAG,mBAAmB,CAqE9F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAYnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EACvC,eAAe,EAAE,OAAO,GACvB,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAmB5C"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Tool Result Handler
3
+ *
4
+ * Shared result-wrapping logic for converting tool handler return values
5
+ * into MCP-compatible content arrays. Used by both BrowserAutomationServer
6
+ * (stdio) and HttpToolRegistrar (HTTP) to avoid duplication.
7
+ *
8
+ * @module server/tool-result-handler
9
+ */
10
+ import { isCompositeResult, isImageResult, isFileResult } from '../tools/tool-result.types.js';
11
+ import { getLogger } from '../shared/services/logging.service.js';
12
+ /**
13
+ * Format a tool handler result into an MCP-compatible content array.
14
+ *
15
+ * Handles CompositeResult, ImageResult, FileResult, structured output,
16
+ * plain strings, and arbitrary objects (JSON-stringified).
17
+ *
18
+ * @param result - The raw return value from a tool handler
19
+ * @param hasOutputSchema - Whether the tool definition has an outputSchema
20
+ * @returns MCP-compatible content array with optional structuredContent
21
+ */
22
+ export function formatToolResult(result, hasOutputSchema = false) {
23
+ // Composite result - return as multi-content (text + image)
24
+ if (isCompositeResult(result)) {
25
+ if (isImageResult(result.image)) {
26
+ return {
27
+ content: [
28
+ { type: 'text', text: result.text },
29
+ {
30
+ type: 'image',
31
+ data: result.image.data,
32
+ mimeType: result.image.mimeType,
33
+ },
34
+ ],
35
+ };
36
+ }
37
+ else {
38
+ // FileResult fallback - return text + file path
39
+ const sizeMB = (result.image.sizeBytes / 1024 / 1024).toFixed(2);
40
+ return {
41
+ content: [
42
+ { type: 'text', text: result.text },
43
+ {
44
+ type: 'text',
45
+ text: `Screenshot saved to: ${result.image.path} (${sizeMB} MB, ${result.image.mimeType})`,
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ }
51
+ // Image result - return as MCP ImageContent (inline base64)
52
+ if (isImageResult(result)) {
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'image',
57
+ data: result.data,
58
+ mimeType: result.mimeType,
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ // File result - return file path as text (for large screenshots)
64
+ if (isFileResult(result)) {
65
+ const sizeMB = (result.sizeBytes / 1024 / 1024).toFixed(2);
66
+ return {
67
+ content: [
68
+ {
69
+ type: 'text',
70
+ text: `Screenshot saved to: ${result.path} (${sizeMB} MB, ${result.mimeType})`,
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ // When outputSchema is defined, return structuredContent for MCP validation
76
+ if (hasOutputSchema) {
77
+ return {
78
+ content: [{ type: 'text', text: JSON.stringify(result) }],
79
+ structuredContent: result,
80
+ };
81
+ }
82
+ // If result is already a string (e.g., XML), use it directly
83
+ // Otherwise JSON.stringify it
84
+ const textContent = typeof result === 'string' ? result : JSON.stringify(result);
85
+ return {
86
+ content: [{ type: 'text', text: textContent }],
87
+ };
88
+ }
89
+ /**
90
+ * Format an error into an MCP-compatible error response.
91
+ *
92
+ * @param error - The caught error
93
+ * @returns MCP-compatible error content
94
+ */
95
+ export function formatToolError(error) {
96
+ return {
97
+ content: [
98
+ {
99
+ type: 'text',
100
+ text: JSON.stringify({
101
+ error: error instanceof Error ? error.message : String(error),
102
+ }),
103
+ },
104
+ ],
105
+ isError: true,
106
+ };
107
+ }
108
+ /**
109
+ * Wrap a tool handler with logging, timing, and MCP result formatting.
110
+ *
111
+ * Shared by both BrowserAutomationServer (stdio) and HttpToolRegistrar (HTTP)
112
+ * to avoid duplicating the try/catch/timing/logging boilerplate.
113
+ *
114
+ * @param name - Tool name used in log messages
115
+ * @param handler - The raw tool handler function
116
+ * @param hasOutputSchema - Whether the tool definition has an outputSchema
117
+ * @returns A wrapped handler that returns a FormattedToolResult
118
+ */
119
+ export function wrapToolHandler(name, handler, hasOutputSchema) {
120
+ const logger = getLogger();
121
+ return async (input) => {
122
+ const startTime = Date.now();
123
+ logger.debug(`Executing tool: ${name}`);
124
+ try {
125
+ const result = await handler(input);
126
+ const executionTime = Date.now() - startTime;
127
+ logger.debug(`Tool ${name} completed in ${executionTime}ms`);
128
+ return formatToolResult(result, hasOutputSchema);
129
+ }
130
+ catch (error) {
131
+ const executionTime = Date.now() - startTime;
132
+ logger.error(`Tool ${name} failed after ${executionTime}ms`, error instanceof Error ? error : undefined);
133
+ return formatToolError(error);
134
+ }
135
+ };
136
+ }
137
+ //# sourceMappingURL=tool-result-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-handler.js","sourceRoot":"","sources":["../../../src/server/tool-result-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Session Controller
3
+ *
4
+ * Per-tenant state container that implements ToolContext.
5
+ * Each agent/session gets its own SessionController instance
6
+ * with isolated pages, snapshots, state managers, and registries.
7
+ *
8
+ * Each session owns its own SessionManager and browser lifecycle,
9
+ * configured independently via BrowserSessionConfig.
10
+ *
11
+ * @module session/session-controller
12
+ */
13
+ import type { BaseSnapshot, ReadableNode } from '../snapshot/snapshot.types.js';
14
+ import { SessionManager } from '../browser/session-manager.js';
15
+ import { SnapshotStore } from '../snapshot/snapshot-store.js';
16
+ import { StateManager } from '../state/state-manager.js';
17
+ import { DependencyTracker } from '../form/dependency-tracker.js';
18
+ import { ObservationAccumulator } from '../observation/observation-accumulator.js';
19
+ import type { ToolContext, CdpSessionResult, SnapshotCaptureResult } from '../tools/tool-context.types.js';
20
+ import { type BrowserSessionConfig } from '../browser/browser-session-config.js';
21
+ import type { PageHandle } from '../browser/page-registry.js';
22
+ /**
23
+ * Session state machine.
24
+ */
25
+ export type SessionState = 'initializing' | 'active' | 'closing' | 'closed';
26
+ /**
27
+ * SessionController configuration.
28
+ */
29
+ export interface SessionControllerOptions {
30
+ /** Unique session identifier */
31
+ sessionId: string;
32
+ /** Optional browser configuration for this session */
33
+ browserConfig?: BrowserSessionConfig;
34
+ }
35
+ /**
36
+ * Per-tenant session controller implementing ToolContext.
37
+ *
38
+ * Owns all per-session state:
39
+ * - SessionManager (per-session browser lifecycle)
40
+ * - SnapshotStore (per-session snapshot cache)
41
+ * - StateManagers (one per page)
42
+ * - DependencyTracker (per-session form dependencies)
43
+ * - ObservationAccumulator (per-session DOM mutation tracking)
44
+ */
45
+ export declare class SessionController implements ToolContext {
46
+ readonly sessionId: string;
47
+ private _sessionManager;
48
+ private _browserConfig;
49
+ private readonly _snapshotStore;
50
+ private readonly _stateManagers;
51
+ private readonly _dependencyTracker;
52
+ private readonly _observationAccumulator;
53
+ /** Deduplication promise for concurrent ensureBrowser() calls */
54
+ private _ensureBrowserPromise;
55
+ /** Unsubscribe from SessionManager state changes (cleanup in close()) */
56
+ private _unsubStateChange;
57
+ private _state;
58
+ private _lastActivity;
59
+ constructor(options: SessionControllerOptions);
60
+ /** Get the current session state. */
61
+ get state(): SessionState;
62
+ /** Touch the session to update last activity timestamp. */
63
+ touch(): void;
64
+ /** Get the time of last activity. */
65
+ get lastActivity(): number;
66
+ /**
67
+ * Close the session and clean up all resources, including the owned browser.
68
+ */
69
+ close(): Promise<void>;
70
+ /**
71
+ * Check if browser configuration can be changed.
72
+ * Returns true when no browser is running (before first launch or after crash).
73
+ */
74
+ canReconfigure(): boolean;
75
+ /**
76
+ * Shut down the current browser and clear session state so the browser
77
+ * can be reconfigured (e.g., switch from a launched browser to auto_connect).
78
+ */
79
+ resetBrowser(): Promise<void>;
80
+ /**
81
+ * Set the browser configuration for this session.
82
+ *
83
+ * Must be called before the browser is launched/connected (i.e., before
84
+ * the first browser-touching tool call). Throws if browser is already running.
85
+ */
86
+ setBrowserConfig(config: BrowserSessionConfig): void;
87
+ /**
88
+ * Ensure the session's browser is ready.
89
+ *
90
+ * Lazily creates a SessionManager and launches/connects based on
91
+ * the session's BrowserSessionConfig. Idempotent — returns immediately
92
+ * if the browser is already running. Concurrent calls are deduplicated.
93
+ */
94
+ ensureBrowser(): Promise<void>;
95
+ resolvePage(pageId?: string): PageHandle | undefined;
96
+ resolvePageOrCreate(pageId?: string): Promise<PageHandle>;
97
+ resolveExistingPage(pageId?: string): PageHandle;
98
+ touchPage(pageId: string): void;
99
+ closePage(pageId: string): Promise<boolean>;
100
+ syncPages(): Promise<PageHandle[]>;
101
+ navigateTo(pageId: string, url: string): Promise<void>;
102
+ getSessionManager(): SessionManager;
103
+ getSnapshotStore(): SnapshotStore;
104
+ getStateManager(pageId: string): StateManager;
105
+ removeStateManager(pageId: string): void;
106
+ clearAllStateManagers(): void;
107
+ getDependencyTracker(): DependencyTracker;
108
+ getObservationAccumulator(): ObservationAccumulator;
109
+ ensureCdpSession(handle: PageHandle): Promise<CdpSessionResult>;
110
+ captureSnapshotWithRecovery(handle: PageHandle, pageId: string): Promise<SnapshotCaptureResult>;
111
+ requireSnapshot(pageId: string): BaseSnapshot;
112
+ resolveElementByEid(pageId: string, eid: string, snapshot: BaseSnapshot): ReadableNode;
113
+ /**
114
+ * Get or lazily create the session's own SessionManager.
115
+ */
116
+ private getOrCreateSessionManager;
117
+ /**
118
+ * Clear stale per-page state (snapshots, state managers, dependencies).
119
+ * Called when the browser crashes or disconnects unexpectedly.
120
+ */
121
+ private clearSessionState;
122
+ }
123
+ //# sourceMappingURL=session-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-controller.d.ts","sourceRoot":"","sources":["../../../src/session/session-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Session Controller
3
+ *
4
+ * Per-tenant state container that implements ToolContext.
5
+ * Each agent/session gets its own SessionController instance
6
+ * with isolated pages, snapshots, state managers, and registries.
7
+ *
8
+ * Each session owns its own SessionManager and browser lifecycle,
9
+ * configured independently via BrowserSessionConfig.
10
+ *
11
+ * @module session/session-controller
12
+ */
13
+ import { SessionManager } from '../browser/session-manager.js';
14
+ import { SnapshotStore } from '../snapshot/snapshot-store.js';
15
+ import { StateManager } from '../state/state-manager.js';
16
+ import { DependencyTracker } from '../form/dependency-tracker.js';
17
+ import { ObservationAccumulator } from '../observation/observation-accumulator.js';
18
+ import { ensureCdpSession as ensureCdpSessionImpl, resolveExistingPage as resolveExistingPageImpl, } from '../tools/tool-context.js';
19
+ import { captureSnapshotWithRecovery as captureSnapshotWithRecoveryImpl } from '../tools/action-context.js';
20
+ import { ElementNotFoundError, StaleElementError, SnapshotRequiredError } from '../tools/errors.js';
21
+ import { defaultBrowserConfig, } from '../browser/browser-session-config.js';
22
+ import { ensureBrowserReady } from '../browser/ensure-browser.js';
23
+ import { getLogger } from '../shared/services/logging.service.js';
24
+ const logger = getLogger();
25
+ /**
26
+ * Per-tenant session controller implementing ToolContext.
27
+ *
28
+ * Owns all per-session state:
29
+ * - SessionManager (per-session browser lifecycle)
30
+ * - SnapshotStore (per-session snapshot cache)
31
+ * - StateManagers (one per page)
32
+ * - DependencyTracker (per-session form dependencies)
33
+ * - ObservationAccumulator (per-session DOM mutation tracking)
34
+ */
35
+ export class SessionController {
36
+ sessionId;
37
+ _sessionManager = null;
38
+ _browserConfig;
39
+ _snapshotStore;
40
+ _stateManagers = new Map();
41
+ _dependencyTracker;
42
+ _observationAccumulator;
43
+ /** Deduplication promise for concurrent ensureBrowser() calls */
44
+ _ensureBrowserPromise = null;
45
+ /** Unsubscribe from SessionManager state changes (cleanup in close()) */
46
+ _unsubStateChange = null;
47
+ _state = 'initializing';
48
+ _lastActivity = Date.now();
49
+ constructor(options) {
50
+ this.sessionId = options.sessionId;
51
+ this._browserConfig = options.browserConfig ?? defaultBrowserConfig();
52
+ this._snapshotStore = new SnapshotStore();
53
+ this._dependencyTracker = new DependencyTracker();
54
+ this._observationAccumulator = new ObservationAccumulator();
55
+ this._state = 'active';
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Session lifecycle
59
+ // ---------------------------------------------------------------------------
60
+ /** Get the current session state. */
61
+ get state() {
62
+ return this._state;
63
+ }
64
+ /** Touch the session to update last activity timestamp. */
65
+ touch() {
66
+ this._lastActivity = Date.now();
67
+ }
68
+ /** Get the time of last activity. */
69
+ get lastActivity() {
70
+ return this._lastActivity;
71
+ }
72
+ /**
73
+ * Close the session and clean up all resources, including the owned browser.
74
+ */
75
+ async close() {
76
+ if (this._state === 'closing' || this._state === 'closed')
77
+ return;
78
+ this._state = 'closing';
79
+ this._unsubStateChange?.();
80
+ this._unsubStateChange = null;
81
+ this._snapshotStore.destroy();
82
+ this._stateManagers.clear();
83
+ this._dependencyTracker.clearAll();
84
+ // Shut down the owned browser
85
+ if (this._sessionManager) {
86
+ try {
87
+ await this._sessionManager.shutdown();
88
+ }
89
+ catch (err) {
90
+ logger.error('Error shutting down session browser', err instanceof Error ? err : undefined, { sessionId: this.sessionId });
91
+ }
92
+ this._sessionManager = null;
93
+ }
94
+ this._state = 'closed';
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Browser lifecycle (ToolContext implementation)
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Check if browser configuration can be changed.
101
+ * Returns true when no browser is running (before first launch or after crash).
102
+ */
103
+ canReconfigure() {
104
+ if (this._ensureBrowserPromise)
105
+ return false;
106
+ return !(this._sessionManager?.isRunning() ?? false);
107
+ }
108
+ /**
109
+ * Shut down the current browser and clear session state so the browser
110
+ * can be reconfigured (e.g., switch from a launched browser to auto_connect).
111
+ */
112
+ async resetBrowser() {
113
+ if (this._sessionManager) {
114
+ await this._sessionManager.shutdown();
115
+ }
116
+ this.clearSessionState();
117
+ }
118
+ /**
119
+ * Set the browser configuration for this session.
120
+ *
121
+ * Must be called before the browser is launched/connected (i.e., before
122
+ * the first browser-touching tool call). Throws if browser is already running.
123
+ */
124
+ setBrowserConfig(config) {
125
+ if (!this.canReconfigure()) {
126
+ throw new Error('Cannot change browser configuration while the browser is running.');
127
+ }
128
+ const overrides = Object.fromEntries(Object.entries(config).filter(([, v]) => v !== undefined));
129
+ this._browserConfig = { ...this._browserConfig, ...overrides };
130
+ }
131
+ /**
132
+ * Ensure the session's browser is ready.
133
+ *
134
+ * Lazily creates a SessionManager and launches/connects based on
135
+ * the session's BrowserSessionConfig. Idempotent — returns immediately
136
+ * if the browser is already running. Concurrent calls are deduplicated.
137
+ */
138
+ async ensureBrowser() {
139
+ // Deduplicate concurrent calls — all callers await the same promise
140
+ if (this._ensureBrowserPromise) {
141
+ await this._ensureBrowserPromise;
142
+ return;
143
+ }
144
+ const session = this.getOrCreateSessionManager();
145
+ // ensureBrowserReady handles the isRunning() fast-path internally
146
+ this._ensureBrowserPromise = ensureBrowserReady(session, this._browserConfig);
147
+ try {
148
+ await this._ensureBrowserPromise;
149
+ }
150
+ finally {
151
+ this._ensureBrowserPromise = null;
152
+ }
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Page lifecycle (ToolContext implementation)
156
+ // ---------------------------------------------------------------------------
157
+ resolvePage(pageId) {
158
+ this.touch();
159
+ return this.getSessionManager().resolvePage(pageId);
160
+ }
161
+ async resolvePageOrCreate(pageId) {
162
+ this.touch();
163
+ return this.getSessionManager().resolvePageOrCreate(pageId);
164
+ }
165
+ resolveExistingPage(pageId) {
166
+ this.touch();
167
+ return resolveExistingPageImpl(this.getSessionManager(), pageId);
168
+ }
169
+ touchPage(pageId) {
170
+ this.getSessionManager().touchPage(pageId);
171
+ }
172
+ async closePage(pageId) {
173
+ return this.getSessionManager().closePage(pageId);
174
+ }
175
+ async syncPages() {
176
+ return this.getSessionManager().syncPages();
177
+ }
178
+ async navigateTo(pageId, url) {
179
+ await this.getSessionManager().navigateTo(pageId, url);
180
+ }
181
+ // ---------------------------------------------------------------------------
182
+ // State access (ToolContext implementation)
183
+ // ---------------------------------------------------------------------------
184
+ getSessionManager() {
185
+ return this.getOrCreateSessionManager();
186
+ }
187
+ getSnapshotStore() {
188
+ return this._snapshotStore;
189
+ }
190
+ getStateManager(pageId) {
191
+ if (!this._stateManagers.has(pageId)) {
192
+ this._stateManagers.set(pageId, new StateManager({ pageId }));
193
+ }
194
+ return this._stateManagers.get(pageId);
195
+ }
196
+ removeStateManager(pageId) {
197
+ this._stateManagers.delete(pageId);
198
+ }
199
+ clearAllStateManagers() {
200
+ this._stateManagers.clear();
201
+ }
202
+ getDependencyTracker() {
203
+ return this._dependencyTracker;
204
+ }
205
+ getObservationAccumulator() {
206
+ return this._observationAccumulator;
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // CDP health (ToolContext implementation)
210
+ // ---------------------------------------------------------------------------
211
+ async ensureCdpSession(handle) {
212
+ return ensureCdpSessionImpl(this.getSessionManager(), handle);
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Snapshot capture (ToolContext implementation)
216
+ // ---------------------------------------------------------------------------
217
+ async captureSnapshotWithRecovery(handle, pageId) {
218
+ return captureSnapshotWithRecoveryImpl(this, handle, pageId);
219
+ }
220
+ // ---------------------------------------------------------------------------
221
+ // Element resolution (ToolContext implementation)
222
+ // ---------------------------------------------------------------------------
223
+ requireSnapshot(pageId) {
224
+ const snap = this._snapshotStore.getByPageId(pageId);
225
+ if (!snap) {
226
+ throw new SnapshotRequiredError(pageId);
227
+ }
228
+ return snap;
229
+ }
230
+ resolveElementByEid(pageId, eid, snapshot) {
231
+ const stateManager = this.getStateManager(pageId);
232
+ const registry = stateManager.getElementRegistry();
233
+ const elementRef = registry.getByEid(eid);
234
+ if (!elementRef) {
235
+ throw new ElementNotFoundError(eid);
236
+ }
237
+ if (registry.isStale(eid)) {
238
+ throw new StaleElementError(eid);
239
+ }
240
+ const node = snapshot.nodes.find((n) => n.backend_node_id === elementRef.ref.backend_node_id);
241
+ if (!node) {
242
+ throw new StaleElementError(eid);
243
+ }
244
+ return node;
245
+ }
246
+ // ---------------------------------------------------------------------------
247
+ // Private helpers
248
+ // ---------------------------------------------------------------------------
249
+ /**
250
+ * Get or lazily create the session's own SessionManager.
251
+ */
252
+ getOrCreateSessionManager() {
253
+ if (!this._sessionManager) {
254
+ this._sessionManager = new SessionManager();
255
+ this._unsubStateChange = this._sessionManager.onStateChange((event) => {
256
+ if (event.currentState === 'failed') {
257
+ this.clearSessionState();
258
+ }
259
+ });
260
+ }
261
+ return this._sessionManager;
262
+ }
263
+ /**
264
+ * Clear stale per-page state (snapshots, state managers, dependencies).
265
+ * Called when the browser crashes or disconnects unexpectedly.
266
+ */
267
+ clearSessionState() {
268
+ this._snapshotStore.clear();
269
+ this._stateManagers.clear();
270
+ this._dependencyTracker.clearAll();
271
+ }
272
+ }
273
+ //# sourceMappingURL=session-controller.js.map