agent-web-interface 4.4.0 → 4.5.1

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 (334) hide show
  1. package/README.md +35 -34
  2. package/dist/src/browser/browser-session-config.d.ts +33 -0
  3. package/dist/src/browser/browser-session-config.d.ts.map +1 -0
  4. package/dist/src/browser/browser-session-config.js +25 -0
  5. package/dist/src/browser/browser-session-config.js.map +1 -0
  6. package/dist/src/browser/ensure-browser.d.ts +12 -27
  7. package/dist/src/browser/ensure-browser.d.ts.map +1 -1
  8. package/dist/src/browser/ensure-browser.js +131 -39
  9. package/dist/src/browser/ensure-browser.js.map +1 -1
  10. package/dist/src/browser/index.d.ts +2 -1
  11. package/dist/src/browser/index.d.ts.map +1 -1
  12. package/dist/src/browser/index.js +1 -0
  13. package/dist/src/browser/index.js.map +1 -1
  14. package/dist/src/browser/page-network-recorder.d.ts +95 -0
  15. package/dist/src/browser/page-network-recorder.d.ts.map +1 -0
  16. package/dist/src/browser/page-network-recorder.js +306 -0
  17. package/dist/src/browser/page-network-recorder.js.map +1 -0
  18. package/dist/src/browser/session-manager.d.ts +20 -0
  19. package/dist/src/browser/session-manager.d.ts.map +1 -1
  20. package/dist/src/browser/session-manager.js +169 -20
  21. package/dist/src/browser/session-manager.js.map +1 -1
  22. package/dist/src/browser/session-manager.types.d.ts +14 -2
  23. package/dist/src/browser/session-manager.types.d.ts.map +1 -1
  24. package/dist/src/browser/session-manager.types.js +5 -1
  25. package/dist/src/browser/session-manager.types.js.map +1 -1
  26. package/dist/src/cli/args.d.ts +12 -18
  27. package/dist/src/cli/args.d.ts.map +1 -1
  28. package/dist/src/cli/args.js +35 -40
  29. package/dist/src/cli/args.js.map +1 -1
  30. package/dist/src/form/constraint-extraction.d.ts +5 -0
  31. package/dist/src/form/constraint-extraction.d.ts.map +1 -1
  32. package/dist/src/form/constraint-extraction.js +13 -6
  33. package/dist/src/form/constraint-extraction.js.map +1 -1
  34. package/dist/src/form/field-extractor.d.ts.map +1 -1
  35. package/dist/src/form/field-extractor.js +14 -7
  36. package/dist/src/form/field-extractor.js.map +1 -1
  37. package/dist/src/form/form-state.d.ts.map +1 -1
  38. package/dist/src/form/form-state.js +16 -4
  39. package/dist/src/form/form-state.js.map +1 -1
  40. package/dist/src/gateway/http-gateway.d.ts +56 -0
  41. package/dist/src/gateway/http-gateway.d.ts.map +1 -0
  42. package/dist/src/gateway/http-gateway.js +229 -0
  43. package/dist/src/gateway/http-gateway.js.map +1 -0
  44. package/dist/src/gateway/json-rpc-errors.d.ts +6 -0
  45. package/dist/src/gateway/json-rpc-errors.d.ts.map +1 -0
  46. package/dist/src/gateway/json-rpc-errors.js +11 -0
  47. package/dist/src/gateway/json-rpc-errors.js.map +1 -0
  48. package/dist/src/gateway/session-router.d.ts +80 -0
  49. package/dist/src/gateway/session-router.d.ts.map +1 -0
  50. package/dist/src/gateway/session-router.js +177 -0
  51. package/dist/src/gateway/session-router.js.map +1 -0
  52. package/dist/src/http-entry.d.ts +20 -0
  53. package/dist/src/http-entry.d.ts.map +1 -0
  54. package/dist/src/http-entry.js +112 -0
  55. package/dist/src/http-entry.js.map +1 -0
  56. package/dist/src/index.d.ts +1 -10
  57. package/dist/src/index.d.ts.map +1 -1
  58. package/dist/src/index.js +25 -232
  59. package/dist/src/index.js.map +1 -1
  60. package/dist/src/lib/text-utils.d.ts +0 -24
  61. package/dist/src/lib/text-utils.d.ts.map +1 -1
  62. package/dist/src/lib/text-utils.js +2 -38
  63. package/dist/src/lib/text-utils.js.map +1 -1
  64. package/dist/src/observation/eid-linker.d.ts.map +1 -1
  65. package/dist/src/observation/eid-linker.js +1 -21
  66. package/dist/src/observation/eid-linker.js.map +1 -1
  67. package/dist/src/server/index.d.ts +0 -1
  68. package/dist/src/server/index.d.ts.map +1 -1
  69. package/dist/src/server/index.js +0 -1
  70. package/dist/src/server/index.js.map +1 -1
  71. package/dist/src/server/mcp-server.d.ts +6 -2
  72. package/dist/src/server/mcp-server.d.ts.map +1 -1
  73. package/dist/src/server/mcp-server.js +3 -91
  74. package/dist/src/server/mcp-server.js.map +1 -1
  75. package/dist/src/server/server-config.d.ts +4 -20
  76. package/dist/src/server/server-config.d.ts.map +1 -1
  77. package/dist/src/server/server-config.js +6 -50
  78. package/dist/src/server/server-config.js.map +1 -1
  79. package/dist/src/server/tool-registrar.types.d.ts +25 -0
  80. package/dist/src/server/tool-registrar.types.d.ts.map +1 -0
  81. package/dist/src/server/tool-registrar.types.js +10 -0
  82. package/dist/src/server/tool-registrar.types.js.map +1 -0
  83. package/dist/src/server/tool-result-handler.d.ts +61 -0
  84. package/dist/src/server/tool-result-handler.d.ts.map +1 -0
  85. package/dist/src/server/tool-result-handler.js +155 -0
  86. package/dist/src/server/tool-result-handler.js.map +1 -0
  87. package/dist/src/session/session-controller.d.ts +124 -0
  88. package/dist/src/session/session-controller.d.ts.map +1 -0
  89. package/dist/src/session/session-controller.js +276 -0
  90. package/dist/src/session/session-controller.js.map +1 -0
  91. package/dist/src/shared/services/index.d.ts +0 -2
  92. package/dist/src/shared/services/index.d.ts.map +1 -1
  93. package/dist/src/shared/services/index.js +0 -2
  94. package/dist/src/shared/services/index.js.map +1 -1
  95. package/dist/src/shared/version.d.ts +10 -0
  96. package/dist/src/shared/version.d.ts.map +1 -0
  97. package/dist/src/shared/version.js +32 -0
  98. package/dist/src/shared/version.js.map +1 -0
  99. package/dist/src/snapshot/element-resolver.d.ts +3 -2
  100. package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
  101. package/dist/src/snapshot/element-resolver.js +83 -8
  102. package/dist/src/snapshot/element-resolver.js.map +1 -1
  103. package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -1
  104. package/dist/src/snapshot/extractors/attribute-extractor.js +4 -0
  105. package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -1
  106. package/dist/src/snapshot/extractors/layout-extractor.d.ts +9 -7
  107. package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -1
  108. package/dist/src/snapshot/extractors/layout-extractor.js +34 -19
  109. package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -1
  110. package/dist/src/snapshot/extractors/state-extractor.d.ts +2 -2
  111. package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -1
  112. package/dist/src/snapshot/extractors/state-extractor.js +22 -2
  113. package/dist/src/snapshot/extractors/state-extractor.js.map +1 -1
  114. package/dist/src/snapshot/extractors/types.d.ts +6 -0
  115. package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
  116. package/dist/src/snapshot/extractors/types.js.map +1 -1
  117. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
  118. package/dist/src/snapshot/snapshot-compiler.js +15 -2
  119. package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
  120. package/dist/src/snapshot/snapshot.types.d.ts +10 -1
  121. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
  122. package/dist/src/snapshot/snapshot.types.js.map +1 -1
  123. package/dist/src/state/actionables-filter.d.ts.map +1 -1
  124. package/dist/src/state/actionables-filter.js +7 -3
  125. package/dist/src/state/actionables-filter.js.map +1 -1
  126. package/dist/src/state/atoms-extractor.d.ts.map +1 -1
  127. package/dist/src/state/atoms-extractor.js +3 -23
  128. package/dist/src/state/atoms-extractor.js.map +1 -1
  129. package/dist/src/state/diff-engine.d.ts.map +1 -1
  130. package/dist/src/state/diff-engine.js +6 -33
  131. package/dist/src/state/diff-engine.js.map +1 -1
  132. package/dist/src/state/element-identity.d.ts +3 -6
  133. package/dist/src/state/element-identity.d.ts.map +1 -1
  134. package/dist/src/state/element-identity.js +10 -7
  135. package/dist/src/state/element-identity.js.map +1 -1
  136. package/dist/src/state/element-ref.types.d.ts +5 -27
  137. package/dist/src/state/element-ref.types.d.ts.map +1 -1
  138. package/dist/src/state/state-manager.d.ts.map +1 -1
  139. package/dist/src/state/state-manager.js +3 -1
  140. package/dist/src/state/state-manager.js.map +1 -1
  141. package/dist/src/state/state-renderer.d.ts.map +1 -1
  142. package/dist/src/state/state-renderer.js +3 -1
  143. package/dist/src/state/state-renderer.js.map +1 -1
  144. package/dist/src/state/types.d.ts +2 -1
  145. package/dist/src/state/types.d.ts.map +1 -1
  146. package/dist/src/state/url-sanitization.d.ts +1 -1
  147. package/dist/src/state/url-sanitization.d.ts.map +1 -1
  148. package/dist/src/state/url-sanitization.js +29 -13
  149. package/dist/src/state/url-sanitization.js.map +1 -1
  150. package/dist/src/tools/action-context.d.ts +6 -11
  151. package/dist/src/tools/action-context.d.ts.map +1 -1
  152. package/dist/src/tools/action-context.js +10 -19
  153. package/dist/src/tools/action-context.js.map +1 -1
  154. package/dist/src/tools/action-stabilization.d.ts.map +1 -1
  155. package/dist/src/tools/action-stabilization.js +6 -0
  156. package/dist/src/tools/action-stabilization.js.map +1 -1
  157. package/dist/src/tools/browser-tools.d.ts +4 -2
  158. package/dist/src/tools/browser-tools.d.ts.map +1 -1
  159. package/dist/src/tools/browser-tools.js +7 -3
  160. package/dist/src/tools/browser-tools.js.map +1 -1
  161. package/dist/src/tools/canvas-tools.d.ts +2 -1
  162. package/dist/src/tools/canvas-tools.d.ts.map +1 -1
  163. package/dist/src/tools/canvas-tools.js +5 -7
  164. package/dist/src/tools/canvas-tools.js.map +1 -1
  165. package/dist/src/tools/errors.d.ts +2 -34
  166. package/dist/src/tools/errors.d.ts.map +1 -1
  167. package/dist/src/tools/errors.js +1 -44
  168. package/dist/src/tools/errors.js.map +1 -1
  169. package/dist/src/tools/execute-action.d.ts +4 -3
  170. package/dist/src/tools/execute-action.d.ts.map +1 -1
  171. package/dist/src/tools/execute-action.js +32 -23
  172. package/dist/src/tools/execute-action.js.map +1 -1
  173. package/dist/src/tools/form-tools.d.ts +3 -8
  174. package/dist/src/tools/form-tools.d.ts.map +1 -1
  175. package/dist/src/tools/form-tools.js +38 -18
  176. package/dist/src/tools/form-tools.js.map +1 -1
  177. package/dist/src/tools/index.d.ts +8 -6
  178. package/dist/src/tools/index.d.ts.map +1 -1
  179. package/dist/src/tools/index.js +10 -10
  180. package/dist/src/tools/index.js.map +1 -1
  181. package/dist/src/tools/interaction-tools.d.ts +6 -5
  182. package/dist/src/tools/interaction-tools.d.ts.map +1 -1
  183. package/dist/src/tools/interaction-tools.js +29 -32
  184. package/dist/src/tools/interaction-tools.js.map +1 -1
  185. package/dist/src/tools/navigation-tools.d.ts +7 -13
  186. package/dist/src/tools/navigation-tools.d.ts.map +1 -1
  187. package/dist/src/tools/navigation-tools.js +57 -59
  188. package/dist/src/tools/navigation-tools.js.map +1 -1
  189. package/dist/src/tools/network-tools.d.ts +10 -0
  190. package/dist/src/tools/network-tools.d.ts.map +1 -0
  191. package/dist/src/tools/network-tools.js +117 -0
  192. package/dist/src/tools/network-tools.js.map +1 -0
  193. package/dist/src/tools/observation-tools.d.ts +6 -5
  194. package/dist/src/tools/observation-tools.d.ts.map +1 -1
  195. package/dist/src/tools/observation-tools.js +30 -34
  196. package/dist/src/tools/observation-tools.js.map +1 -1
  197. package/dist/src/tools/readability-tools.d.ts +16 -0
  198. package/dist/src/tools/readability-tools.d.ts.map +1 -0
  199. package/dist/src/tools/readability-tools.js +45 -0
  200. package/dist/src/tools/readability-tools.js.map +1 -0
  201. package/dist/src/tools/response-builder.d.ts +20 -32
  202. package/dist/src/tools/response-builder.d.ts.map +1 -1
  203. package/dist/src/tools/response-builder.js +31 -47
  204. package/dist/src/tools/response-builder.js.map +1 -1
  205. package/dist/src/tools/stale-element-retry.d.ts.map +1 -1
  206. package/dist/src/tools/stale-element-retry.js +37 -2
  207. package/dist/src/tools/stale-element-retry.js.map +1 -1
  208. package/dist/src/tools/tool-context.d.ts +4 -36
  209. package/dist/src/tools/tool-context.d.ts.map +1 -1
  210. package/dist/src/tools/tool-context.js +6 -75
  211. package/dist/src/tools/tool-context.js.map +1 -1
  212. package/dist/src/tools/tool-context.types.d.ts +147 -0
  213. package/dist/src/tools/tool-context.types.d.ts.map +1 -0
  214. package/dist/src/tools/tool-context.types.js +11 -0
  215. package/dist/src/tools/tool-context.types.js.map +1 -0
  216. package/dist/src/tools/tool-registration.d.ts +25 -0
  217. package/dist/src/tools/tool-registration.d.ts.map +1 -0
  218. package/dist/src/tools/tool-registration.js +195 -0
  219. package/dist/src/tools/tool-registration.js.map +1 -0
  220. package/dist/src/tools/tool-schemas.d.ts +178 -1947
  221. package/dist/src/tools/tool-schemas.d.ts.map +1 -1
  222. package/dist/src/tools/tool-schemas.js +130 -302
  223. package/dist/src/tools/tool-schemas.js.map +1 -1
  224. package/dist/src/tools/viewport-tools.d.ts +4 -3
  225. package/dist/src/tools/viewport-tools.d.ts.map +1 -1
  226. package/dist/src/tools/viewport-tools.js +17 -21
  227. package/dist/src/tools/viewport-tools.js.map +1 -1
  228. package/dist/src/worker/chrome-worker-process.d.ts +4 -0
  229. package/dist/src/worker/chrome-worker-process.d.ts.map +1 -1
  230. package/dist/src/worker/chrome-worker-process.js +1 -1
  231. package/dist/src/worker/chrome-worker-process.js.map +1 -1
  232. package/dist/vitest.config.js +1 -1
  233. package/dist/vitest.config.js.map +1 -1
  234. package/dist/vitest.integration.config.d.ts +3 -0
  235. package/dist/vitest.integration.config.d.ts.map +1 -0
  236. package/dist/vitest.integration.config.js +11 -0
  237. package/dist/vitest.integration.config.js.map +1 -0
  238. package/package.json +20 -5
  239. package/dist/src/factpack/action-selector.d.ts +0 -36
  240. package/dist/src/factpack/action-selector.d.ts.map +0 -1
  241. package/dist/src/factpack/action-selector.js +0 -367
  242. package/dist/src/factpack/action-selector.js.map +0 -1
  243. package/dist/src/factpack/dialog-detector.d.ts +0 -19
  244. package/dist/src/factpack/dialog-detector.d.ts.map +0 -1
  245. package/dist/src/factpack/dialog-detector.js +0 -354
  246. package/dist/src/factpack/dialog-detector.js.map +0 -1
  247. package/dist/src/factpack/form-detector.d.ts +0 -28
  248. package/dist/src/factpack/form-detector.d.ts.map +0 -1
  249. package/dist/src/factpack/form-detector.js +0 -555
  250. package/dist/src/factpack/form-detector.js.map +0 -1
  251. package/dist/src/factpack/index.d.ts +0 -32
  252. package/dist/src/factpack/index.d.ts.map +0 -1
  253. package/dist/src/factpack/index.js +0 -73
  254. package/dist/src/factpack/index.js.map +0 -1
  255. package/dist/src/factpack/page-classifier.d.ts +0 -22
  256. package/dist/src/factpack/page-classifier.d.ts.map +0 -1
  257. package/dist/src/factpack/page-classifier.js +0 -526
  258. package/dist/src/factpack/page-classifier.js.map +0 -1
  259. package/dist/src/factpack/types.d.ts +0 -307
  260. package/dist/src/factpack/types.d.ts.map +0 -1
  261. package/dist/src/factpack/types.js +0 -12
  262. package/dist/src/factpack/types.js.map +0 -1
  263. package/dist/src/lib/constants.d.ts +0 -27
  264. package/dist/src/lib/constants.d.ts.map +0 -1
  265. package/dist/src/lib/constants.js +0 -63
  266. package/dist/src/lib/constants.js.map +0 -1
  267. package/dist/src/lib/index.d.ts +0 -12
  268. package/dist/src/lib/index.d.ts.map +0 -1
  269. package/dist/src/lib/index.js +0 -17
  270. package/dist/src/lib/index.js.map +0 -1
  271. package/dist/src/lib/regions.d.ts +0 -29
  272. package/dist/src/lib/regions.d.ts.map +0 -1
  273. package/dist/src/lib/regions.js +0 -93
  274. package/dist/src/lib/regions.js.map +0 -1
  275. package/dist/src/lib/scoring.d.ts +0 -47
  276. package/dist/src/lib/scoring.d.ts.map +0 -1
  277. package/dist/src/lib/scoring.js +0 -79
  278. package/dist/src/lib/scoring.js.map +0 -1
  279. package/dist/src/lib/selectors.d.ts +0 -42
  280. package/dist/src/lib/selectors.d.ts.map +0 -1
  281. package/dist/src/lib/selectors.js +0 -138
  282. package/dist/src/lib/selectors.js.map +0 -1
  283. package/dist/src/renderer/budget-manager.d.ts +0 -46
  284. package/dist/src/renderer/budget-manager.d.ts.map +0 -1
  285. package/dist/src/renderer/budget-manager.js +0 -133
  286. package/dist/src/renderer/budget-manager.js.map +0 -1
  287. package/dist/src/renderer/constants.d.ts +0 -38
  288. package/dist/src/renderer/constants.d.ts.map +0 -1
  289. package/dist/src/renderer/constants.js +0 -29
  290. package/dist/src/renderer/constants.js.map +0 -1
  291. package/dist/src/renderer/index.d.ts +0 -12
  292. package/dist/src/renderer/index.d.ts.map +0 -1
  293. package/dist/src/renderer/index.js +0 -16
  294. package/dist/src/renderer/index.js.map +0 -1
  295. package/dist/src/renderer/section-renderers.d.ts +0 -42
  296. package/dist/src/renderer/section-renderers.d.ts.map +0 -1
  297. package/dist/src/renderer/section-renderers.js +0 -252
  298. package/dist/src/renderer/section-renderers.js.map +0 -1
  299. package/dist/src/renderer/token-counter.d.ts +0 -45
  300. package/dist/src/renderer/token-counter.d.ts.map +0 -1
  301. package/dist/src/renderer/token-counter.js +0 -65
  302. package/dist/src/renderer/token-counter.js.map +0 -1
  303. package/dist/src/renderer/types.d.ts +0 -71
  304. package/dist/src/renderer/types.d.ts.map +0 -1
  305. package/dist/src/renderer/types.js +0 -7
  306. package/dist/src/renderer/types.js.map +0 -1
  307. package/dist/src/renderer/xml-renderer.d.ts +0 -42
  308. package/dist/src/renderer/xml-renderer.d.ts.map +0 -1
  309. package/dist/src/renderer/xml-renderer.js +0 -103
  310. package/dist/src/renderer/xml-renderer.js.map +0 -1
  311. package/dist/src/server/session-store.d.ts +0 -163
  312. package/dist/src/server/session-store.d.ts.map +0 -1
  313. package/dist/src/server/session-store.js +0 -248
  314. package/dist/src/server/session-store.js.map +0 -1
  315. package/dist/src/session/session-worker-binding.d.ts +0 -57
  316. package/dist/src/session/session-worker-binding.d.ts.map +0 -1
  317. package/dist/src/session/session-worker-binding.js +0 -109
  318. package/dist/src/session/session-worker-binding.js.map +0 -1
  319. package/dist/src/shared/services/dom-transformer.service.d.ts +0 -71
  320. package/dist/src/shared/services/dom-transformer.service.d.ts.map +0 -1
  321. package/dist/src/shared/services/dom-transformer.service.js +0 -190
  322. package/dist/src/shared/services/dom-transformer.service.js.map +0 -1
  323. package/dist/src/shared/services/selector-builder.service.d.ts +0 -53
  324. package/dist/src/shared/services/selector-builder.service.d.ts.map +0 -1
  325. package/dist/src/shared/services/selector-builder.service.js +0 -240
  326. package/dist/src/shared/services/selector-builder.service.js.map +0 -1
  327. package/dist/src/state/constants.d.ts +0 -125
  328. package/dist/src/state/constants.d.ts.map +0 -1
  329. package/dist/src/state/constants.js +0 -131
  330. package/dist/src/state/constants.js.map +0 -1
  331. package/dist/src/tools/state-manager-registry.d.ts +0 -26
  332. package/dist/src/tools/state-manager-registry.d.ts.map +0 -1
  333. package/dist/src/tools/state-manager-registry.js +0 -39
  334. package/dist/src/tools/state-manager-registry.js.map +0 -1
@@ -2,19 +2,11 @@
2
2
  * CLI Argument Parsing
3
3
  *
4
4
  * Parses command-line arguments for server configuration.
5
- * All browser initialization is controlled via these arguments.
5
+ * Browser configuration is per-session (via navigate tool params),
6
+ * so only transport-level settings remain here.
6
7
  */
7
8
  /** Known CLI argument base names for validation */
8
- const KNOWN_ARG_NAMES = new Set([
9
- 'headless',
10
- 'isolated',
11
- 'autoConnect',
12
- 'browserUrl',
13
- 'wsEndpoint',
14
- 'userDataDir',
15
- 'channel',
16
- 'executablePath',
17
- ]);
9
+ const KNOWN_ARG_NAMES = new Set(['transport', 'port']);
18
10
  /**
19
11
  * Check if an argument is a known CLI flag (handles --arg and --arg=value forms).
20
12
  */
@@ -33,44 +25,47 @@ function isKnownArg(arg) {
33
25
  */
34
26
  export function parseArgs(argv) {
35
27
  const args = {
36
- headless: false,
37
- isolated: false,
38
- autoConnect: false,
28
+ transport: 'stdio',
29
+ port: 3000,
39
30
  };
40
31
  for (let i = 0; i < argv.length; i++) {
41
32
  const arg = argv[i];
42
- if (arg === '--headless=false' || arg === '--headless=0') {
43
- args.headless = false;
33
+ if (arg === '--transport' && argv[i + 1]) {
34
+ const value = argv[++i];
35
+ if (value === 'stdio' || value === 'http') {
36
+ args.transport = value;
37
+ }
38
+ else {
39
+ console.warn(`Warning: Unknown transport "${value}" - defaulting to stdio`);
40
+ }
44
41
  }
45
- else if (arg === '--headless=true' || arg === '--headless=1' || arg === '--headless') {
46
- args.headless = true;
47
- }
48
- else if (arg === '--isolated') {
49
- args.isolated = true;
50
- }
51
- else if (arg === '--autoConnect') {
52
- args.autoConnect = true;
53
- }
54
- else if (arg === '--browserUrl' && argv[i + 1]) {
55
- args.browserUrl = argv[++i];
56
- }
57
- else if (arg === '--wsEndpoint' && argv[i + 1]) {
58
- args.wsEndpoint = argv[++i];
59
- }
60
- else if (arg === '--userDataDir' && argv[i + 1]) {
61
- args.userDataDir = argv[++i];
62
- }
63
- else if (arg === '--channel' && argv[i + 1]) {
64
- args.channel = argv[++i];
65
- }
66
- else if (arg === '--executablePath' && argv[i + 1]) {
67
- args.executablePath = argv[++i];
42
+ else if (arg === '--port' && argv[i + 1]) {
43
+ const parsed = parseInt(argv[++i], 10);
44
+ if (isNaN(parsed) || parsed < 1 || parsed > 65535) {
45
+ console.warn(`Warning: Invalid port "${argv[i]}" - defaulting to 3000`);
46
+ }
47
+ else {
48
+ args.port = parsed;
49
+ }
68
50
  }
69
51
  else if (!isKnownArg(arg)) {
70
- // Warn about unknown arguments to catch typos like --hedless
52
+ // Warn about unknown arguments to catch typos
71
53
  console.warn(`Warning: Unknown argument "${arg}" - ignored`);
72
54
  }
73
55
  }
56
+ // Environment variable overrides for transport settings
57
+ if (process.env.TRANSPORT === 'http') {
58
+ args.transport = 'http';
59
+ }
60
+ if (process.env.HTTP_PORT) {
61
+ const parsed = parseInt(process.env.HTTP_PORT, 10);
62
+ if (isNaN(parsed) || parsed < 1 || parsed > 65535) {
63
+ console.warn(`Warning: Invalid HTTP_PORT "${process.env.HTTP_PORT}" - defaulting to 3000`);
64
+ }
65
+ else {
66
+ args.port = parsed;
67
+ }
68
+ }
74
69
  return args;
75
70
  }
76
71
  //# sourceMappingURL=args.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,mDAAmD;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,UAAU;IACV,UAAU;IACV,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,SAAS;IACT,gBAAgB;CACjB,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;IACtE,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAe;QACvB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YACzD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,iBAAiB,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAA0B,CAAC;QACpD,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,6DAA6D;YAC7D,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,aAAa,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,mDAAmD;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;IACtE,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAe;QACvB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;KACX,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,+BAA+B,KAAK,yBAAyB,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,8CAA8C;YAC9C,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,aAAa,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,GAAG,CAAC,SAAS,wBAAwB,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -12,6 +12,11 @@ import type { FieldConstraints, FieldOption } from './types.js';
12
12
  * Extract constraints for a field.
13
13
  */
14
14
  export declare function extractConstraints(node: ReadableNode, snapshot: BaseSnapshot): FieldConstraints;
15
+ /**
16
+ * Check if two radio nodes belong to the same group.
17
+ * Uses `name` attribute as primary signal, falls back to heading/group context.
18
+ */
19
+ export declare function sameRadioGroup(a: ReadableNode, b: ReadableNode): boolean;
15
20
  /**
16
21
  * Extract options for radio button groups.
17
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constraint-extraction.d.ts","sourceRoot":"","sources":["../../../src/form/constraint-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,gBAAgB,CAkC/F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,WAAW,EAAE,CAuB7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,WAAW,EAAE,CAwC9F"}
1
+ {"version":3,"file":"constraint-extraction.d.ts","sourceRoot":"","sources":["../../../src/form/constraint-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,gBAAgB,CAkC/F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAMxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,WAAW,EAAE,CAgB7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,WAAW,EAAE,CAwC9F"}
@@ -42,21 +42,28 @@ export function extractConstraints(node, snapshot) {
42
42
  // - pattern
43
43
  return constraints;
44
44
  }
45
+ /**
46
+ * Check if two radio nodes belong to the same group.
47
+ * Uses `name` attribute as primary signal, falls back to heading/group context.
48
+ */
49
+ export function sameRadioGroup(a, b) {
50
+ if (a.where.region !== b.where.region)
51
+ return false;
52
+ if (a.attributes?.name && b.attributes?.name)
53
+ return a.attributes.name === b.attributes.name;
54
+ return (a.where.heading_context === b.where.heading_context || a.where.group_id === b.where.group_id);
55
+ }
45
56
  /**
46
57
  * Extract options for radio button groups.
47
58
  */
48
59
  export function extractRadioOptions(node, snapshot) {
49
60
  const options = [];
50
- // Find all radio buttons in the same region/group
51
- const radioButtons = snapshot.nodes.filter((n) => n.kind === 'radio' &&
52
- n.where.region === node.where.region &&
53
- (n.where.heading_context === node.where.heading_context ||
54
- n.where.group_id === node.where.group_id));
61
+ const radioButtons = snapshot.nodes.filter((n) => n.kind === 'radio' && sameRadioGroup(node, n));
55
62
  for (const radio of radioButtons) {
56
63
  options.push({
57
64
  value: radio.label,
58
65
  label: radio.label,
59
- selected: radio.state?.checked ?? false,
66
+ selected: radio.state?.checked === true || radio.state?.checked === 'mixed',
60
67
  disabled: !(radio.state?.enabled ?? true),
61
68
  eid: radio.node_id,
62
69
  });
@@ -1 +1 @@
1
- {"version":3,"file":"constraint-extraction.js","sourceRoot":"","sources":["../../../src/form/constraint-extraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constraint-extraction.js","sourceRoot":"","sources":["../../../src/form/constraint-extraction.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"field-extractor.d.ts","sourceRoot":"","sources":["../../../src/form/field-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKjE;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,mBAAmB,GAC1B,SAAS,EAAE,CAmBb;AAiED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC1B,SAAS,GAAG,IAAI,CAIlB"}
1
+ {"version":3,"file":"field-extractor.d.ts","sourceRoot":"","sources":["../../../src/form/field-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKjE;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,mBAAmB,GAC1B,SAAS,EAAE,CAmBb;AAuED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC1B,SAAS,GAAG,IAAI,CAIlB"}
@@ -15,7 +15,7 @@
15
15
  * @module form/field-extractor
16
16
  */
17
17
  import { inferPurpose } from './purpose-inference.js';
18
- import { extractConstraints } from './constraint-extraction.js';
18
+ import { extractConstraints, sameRadioGroup } from './constraint-extraction.js';
19
19
  import { extractFieldState } from './field-state-extractor.js';
20
20
  /**
21
21
  * Extract form fields from a snapshot for given field EIDs.
@@ -47,9 +47,7 @@ export function extractFields(snapshot, fieldEids, config) {
47
47
  function extractField(node, sequence, snapshot, config) {
48
48
  // Infer purpose
49
49
  const purpose = inferPurpose(node);
50
- // Extract constraints
51
50
  const constraints = extractConstraints(node, snapshot);
52
- // Extract state
53
51
  const state = extractFieldState(node, config, purpose.semantic_type);
54
52
  return {
55
53
  eid: node.node_id,
@@ -74,10 +72,19 @@ function linkRadioGroups(fields, snapshot) {
74
72
  const node = snapshot.nodes.find((n) => n.node_id === field.eid);
75
73
  if (!node)
76
74
  continue;
77
- const key = `${node.where.region}:${node.where.heading_context ?? ''}:${node.where.group_id ?? ''}`;
78
- const group = groups.get(key) ?? [];
79
- group.push(field);
80
- groups.set(key, group);
75
+ // Find existing group this radio belongs to
76
+ let matched = false;
77
+ for (const [, group] of groups) {
78
+ const groupNode = snapshot.nodes.find((n) => n.node_id === group[0].eid);
79
+ if (groupNode && sameRadioGroup(node, groupNode)) {
80
+ group.push(field);
81
+ matched = true;
82
+ break;
83
+ }
84
+ }
85
+ if (!matched) {
86
+ groups.set(`radio-${groups.size}`, [field]);
87
+ }
81
88
  }
82
89
  // Link fields within each group
83
90
  let groupIndex = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"field-extractor.js","sourceRoot":"","sources":["../../../src/form/field-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAsB,EACtB,SAAmB,EACnB,MAA2B;IAE3B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,IAAkB,EAClB,QAAgB,EAChB,QAAsB,EACtB,MAA2B;IAE3B,gBAAgB;IAChB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnC,sBAAsB;IACtB,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEvD,gBAAgB;IAChB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAErE,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,OAAO;QACjB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,WAAW;QACX,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAmB,EAAE,QAAsB;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAE7D,oCAAoC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACpG,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,gCAAgC;IAChC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,eAAe,UAAU,EAAE,EAAE,CAAC;YAC9C,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACzB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAsB,EACtB,GAAW,EACX,MAA2B;IAE3B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"field-extractor.js","sourceRoot":"","sources":["../../../src/form/field-extractor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-state.d.ts","sourceRoot":"","sources":["../../../src/form/form-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAsB/D"}
1
+ {"version":3,"file":"form-state.d.ts","sourceRoot":"","sources":["../../../src/form/form-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CA+B/D"}
@@ -23,10 +23,22 @@ export function computeFormState(fields) {
23
23
  const filledRequiredFields = requiredFields.filter((f) => f.state.filled);
24
24
  const errorFields = fields.filter((f) => !f.state.valid);
25
25
  const dirtyFields = fields.filter((f) => f.state.touched);
26
- const completionPct = requiredFields.length > 0
27
- ? Math.round((filledRequiredFields.length / requiredFields.length) * 100)
28
- : 100;
29
- const canSubmit = errorFields.length === 0 && filledRequiredFields.length === requiredFields.length;
26
+ let completionPct;
27
+ if (requiredFields.length > 0) {
28
+ completionPct = Math.round((filledRequiredFields.length / requiredFields.length) * 100);
29
+ }
30
+ else if (fields.length > 0) {
31
+ // No explicit required fields — use fill ratio so agents see progress
32
+ const filledFields = fields.filter((f) => f.state.filled);
33
+ completionPct = Math.round((filledFields.length / fields.length) * 100);
34
+ }
35
+ else {
36
+ completionPct = 100;
37
+ }
38
+ const canSubmit = errorFields.length === 0 &&
39
+ (requiredFields.length > 0
40
+ ? filledRequiredFields.length === requiredFields.length
41
+ : fields.length === 0 || fields.some((f) => f.state.filled));
30
42
  return {
31
43
  completion_pct: completionPct,
32
44
  error_count: errorFields.length,
@@ -1 +1 @@
1
- {"version":3,"file":"form-state.js","sourceRoot":"","sources":["../../../src/form/form-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpE,MAAM,oBAAoB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;QACzE,CAAC,CAAC,GAAG,CAAC;IAEV,MAAM,SAAS,GACb,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,oBAAoB,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,CAAC;IAEpF,OAAO;QACL,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;QAC7B,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,qBAAqB,EAAE,oBAAoB,CAAC,MAAM;KACnD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"form-state.js","sourceRoot":"","sources":["../../../src/form/form-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpE,MAAM,oBAAoB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1D,IAAI,aAAqB,CAAC;IAC1B,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,sEAAsE;QACtE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1D,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,GAAG,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GACb,WAAW,CAAC,MAAM,KAAK,CAAC;QACxB,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,oBAAoB,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM;YACvD,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;QAC7B,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,qBAAqB,EAAE,oBAAoB,CAAC,MAAM;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * HTTP Gateway
3
+ *
4
+ * Supports multiple concurrent AI agents via Streamable HTTP transport.
5
+ * Each client connection gets its own McpServer instance with tools
6
+ * closing over a dedicated SessionController.
7
+ *
8
+ * Architecture: per-session McpServer - each HTTP client connection gets
9
+ * its own McpServer + transport pair. This avoids the problem that the
10
+ * MCP SDK does not expose which transport triggered a tool call.
11
+ *
12
+ * @module gateway/http-gateway
13
+ */
14
+ import type { Request, Response } from 'express';
15
+ import { SessionRouter } from './session-router.js';
16
+ export interface HttpGatewayOptions {
17
+ router: SessionRouter;
18
+ version?: string;
19
+ }
20
+ export declare class HttpGateway {
21
+ private readonly sessions;
22
+ private readonly router;
23
+ private readonly version;
24
+ constructor(options: HttpGatewayOptions);
25
+ /**
26
+ * Handle POST requests to the /mcp endpoint.
27
+ *
28
+ * Routing logic follows the MCP Streamable HTTP specification:
29
+ * - Requests with a valid mcp-session-id are routed to the existing transport
30
+ * - POST without a session ID that contains an initialize request creates a new session
31
+ * - All other requests are rejected with 400
32
+ */
33
+ handlePost(req: Request, res: Response): Promise<void>;
34
+ /**
35
+ * Handle GET requests to the /mcp endpoint (SSE streams).
36
+ */
37
+ handleGet(req: Request, res: Response): Promise<void>;
38
+ /**
39
+ * Handle DELETE requests to the /mcp endpoint (session termination).
40
+ */
41
+ handleDelete(req: Request, res: Response): Promise<void>;
42
+ private createNewSession;
43
+ private closeSession;
44
+ /**
45
+ * Clean up gateway-owned resources (McpServer + transport) for a session
46
+ * that was already destroyed by the router (e.g., idle eviction).
47
+ * Unlike closeSession(), this does NOT call router.destroySession().
48
+ */
49
+ private cleanupGatewaySession;
50
+ private teardownOrphanedSession;
51
+ /** Get count of active HTTP sessions */
52
+ get sessionCount(): number;
53
+ /** Shutdown all HTTP sessions */
54
+ shutdown(): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=http-gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-gateway.d.ts","sourceRoot":"","sources":["../../../src/gateway/http-gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAkBpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkCD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,kBAAkB;IAWvC;;;;;;;OAOG;IACG,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5D;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3D;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAYhD,gBAAgB;YAgEhB,YAAY;IAkB1B;;;;OAIG;YACW,qBAAqB;YAwBrB,uBAAuB;IAYrC,wCAAwC;IACxC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,iCAAiC;IAC3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * HTTP Gateway
3
+ *
4
+ * Supports multiple concurrent AI agents via Streamable HTTP transport.
5
+ * Each client connection gets its own McpServer instance with tools
6
+ * closing over a dedicated SessionController.
7
+ *
8
+ * Architecture: per-session McpServer - each HTTP client connection gets
9
+ * its own McpServer + transport pair. This avoids the problem that the
10
+ * MCP SDK does not expose which transport triggered a tool call.
11
+ *
12
+ * @module gateway/http-gateway
13
+ */
14
+ import { randomUUID } from 'node:crypto';
15
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
16
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
17
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
18
+ import { registerAllTools } from '../tools/tool-registration.js';
19
+ import { wrapToolHandler } from '../server/tool-result-handler.js';
20
+ import { getLogger } from '../shared/services/logging.service.js';
21
+ import { VERSION } from '../shared/version.js';
22
+ import { sendJsonRpcError } from './json-rpc-errors.js';
23
+ const logger = getLogger();
24
+ /**
25
+ * Adapts McpServer.registerTool to the ToolRegistrar interface,
26
+ * adding the same logging/error-handling/result-type wrapping that
27
+ * BrowserAutomationServer provides for stdio.
28
+ */
29
+ class HttpToolRegistrar {
30
+ server;
31
+ constructor(server) {
32
+ this.server = server;
33
+ }
34
+ registerTool(name, definition, handler) {
35
+ const wrapped = wrapToolHandler(name, handler, !!definition.outputSchema);
36
+ this.server.registerTool(name, {
37
+ title: definition.title,
38
+ description: definition.description,
39
+ inputSchema: definition.inputSchema,
40
+ outputSchema: definition.outputSchema,
41
+ }, wrapped);
42
+ }
43
+ }
44
+ export class HttpGateway {
45
+ sessions = new Map();
46
+ router;
47
+ version;
48
+ constructor(options) {
49
+ this.router = options.router;
50
+ this.version = options.version ?? VERSION;
51
+ // When the router evicts an idle session, clean up the gateway-owned
52
+ // transport and McpServer so the sessions map does not leak entries.
53
+ this.router.setOnSessionDestroyed((sessionId) => {
54
+ void this.cleanupGatewaySession(sessionId);
55
+ });
56
+ }
57
+ /**
58
+ * Handle POST requests to the /mcp endpoint.
59
+ *
60
+ * Routing logic follows the MCP Streamable HTTP specification:
61
+ * - Requests with a valid mcp-session-id are routed to the existing transport
62
+ * - POST without a session ID that contains an initialize request creates a new session
63
+ * - All other requests are rejected with 400
64
+ */
65
+ async handlePost(req, res) {
66
+ const sessionId = req.headers['mcp-session-id'];
67
+ try {
68
+ if (sessionId && this.sessions.has(sessionId)) {
69
+ // Route to existing session transport
70
+ const session = this.sessions.get(sessionId);
71
+ await session.transport.handleRequest(req, res, req.body);
72
+ }
73
+ else if (!sessionId && isInitializeRequest(req.body)) {
74
+ // New connection: create transport + McpServer + SessionController
75
+ await this.createNewSession(req, res);
76
+ }
77
+ else if (sessionId && !this.sessions.has(sessionId)) {
78
+ sendJsonRpcError(res, 404, -32000, 'Session not found. The session may have expired or been closed.');
79
+ }
80
+ else {
81
+ sendJsonRpcError(res, 400, -32000, 'Bad Request: No valid session ID provided');
82
+ }
83
+ }
84
+ catch (error) {
85
+ logger.error('Error handling MCP POST request', error instanceof Error ? error : undefined);
86
+ if (!res.headersSent) {
87
+ sendJsonRpcError(res, 500, -32603, 'Internal server error');
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Handle GET requests to the /mcp endpoint (SSE streams).
93
+ */
94
+ async handleGet(req, res) {
95
+ const sessionId = req.headers['mcp-session-id'];
96
+ if (!sessionId || !this.sessions.has(sessionId)) {
97
+ sendJsonRpcError(res, 400, -32000, 'Bad Request: Invalid or missing session ID');
98
+ return;
99
+ }
100
+ const session = this.sessions.get(sessionId);
101
+ await session.transport.handleRequest(req, res);
102
+ }
103
+ /**
104
+ * Handle DELETE requests to the /mcp endpoint (session termination).
105
+ */
106
+ async handleDelete(req, res) {
107
+ const sessionId = req.headers['mcp-session-id'];
108
+ if (!sessionId || !this.sessions.has(sessionId)) {
109
+ sendJsonRpcError(res, 404, -32000, 'Session not found');
110
+ return;
111
+ }
112
+ const session = this.sessions.get(sessionId);
113
+ await session.transport.handleRequest(req, res);
114
+ }
115
+ async createNewSession(req, res) {
116
+ // Mutable references set during the onsessioninitialized callback.
117
+ // The callback fires synchronously during handleRequest() when the
118
+ // MCP initialize handshake completes, so these are populated before
119
+ // any tool invocation can occur.
120
+ let controller = null;
121
+ let sessionId = null;
122
+ const transport = new StreamableHTTPServerTransport({
123
+ sessionIdGenerator: () => randomUUID(),
124
+ onsessioninitialized: async (sid) => {
125
+ sessionId = sid;
126
+ controller = await this.router.createSession(sid);
127
+ this.sessions.set(sid, { server: mcpServer, transport, controller });
128
+ logger.info('HTTP session initialized', { sessionId: sid });
129
+ },
130
+ });
131
+ const mcpServer = new McpServer({
132
+ name: 'agent-web-interface',
133
+ version: this.version,
134
+ }, {
135
+ capabilities: {
136
+ logging: {},
137
+ },
138
+ });
139
+ // Register all 22 tools with logging/error wrapping via HttpToolRegistrar.
140
+ // The resolver lazily reads the mutable `controller` reference which is
141
+ // guaranteed to be set by onsessioninitialized before any tool runs.
142
+ const registrar = new HttpToolRegistrar(mcpServer);
143
+ registerAllTools(registrar, () => {
144
+ if (!controller)
145
+ throw new Error('Session not initialized');
146
+ return controller;
147
+ });
148
+ // Connect transport to server before handling the first request
149
+ await mcpServer.connect(transport);
150
+ // Clean up when transport closes
151
+ transport.onclose = () => {
152
+ if (sessionId) {
153
+ void this.closeSession(sessionId);
154
+ }
155
+ };
156
+ // Handle the initial request — onsessioninitialized fires during this call
157
+ try {
158
+ await transport.handleRequest(req, res, req.body);
159
+ }
160
+ catch (err) {
161
+ if (!sessionId)
162
+ await this.teardownOrphanedSession(mcpServer, transport);
163
+ throw err;
164
+ }
165
+ // If onsessioninitialized never fired (e.g., non-initialize request hit this path),
166
+ // clean up the leaked server and transport.
167
+ if (!sessionId) {
168
+ await this.teardownOrphanedSession(mcpServer, transport);
169
+ }
170
+ }
171
+ async closeSession(sessionId) {
172
+ const session = this.sessions.get(sessionId);
173
+ if (!session)
174
+ return;
175
+ // Remove from the map first so the onSessionDestroyed callback
176
+ // (fired by router.destroySession) is a harmless no-op.
177
+ this.sessions.delete(sessionId);
178
+ try {
179
+ await session.server.close();
180
+ }
181
+ catch (err) {
182
+ logger.error('Error closing HTTP session server', err instanceof Error ? err : undefined);
183
+ }
184
+ await this.router.destroySession(sessionId);
185
+ logger.info('HTTP session closed', { sessionId });
186
+ }
187
+ /**
188
+ * Clean up gateway-owned resources (McpServer + transport) for a session
189
+ * that was already destroyed by the router (e.g., idle eviction).
190
+ * Unlike closeSession(), this does NOT call router.destroySession().
191
+ */
192
+ async cleanupGatewaySession(sessionId) {
193
+ const session = this.sessions.get(sessionId);
194
+ if (!session)
195
+ return;
196
+ this.sessions.delete(sessionId);
197
+ try {
198
+ await session.transport.close?.();
199
+ }
200
+ catch {
201
+ // Transport may already be closed
202
+ }
203
+ try {
204
+ await session.server.close();
205
+ }
206
+ catch (err) {
207
+ logger.error('Error closing evicted HTTP session server', err instanceof Error ? err : undefined);
208
+ }
209
+ logger.info('Gateway session cleaned up after eviction', { sessionId });
210
+ }
211
+ async teardownOrphanedSession(mcpServer, transport) {
212
+ await mcpServer.close().catch(() => {
213
+ /* intentionally swallowed */
214
+ });
215
+ await transport.close?.().catch(() => {
216
+ /* intentionally swallowed */
217
+ });
218
+ }
219
+ /** Get count of active HTTP sessions */
220
+ get sessionCount() {
221
+ return this.sessions.size;
222
+ }
223
+ /** Shutdown all HTTP sessions */
224
+ async shutdown() {
225
+ const ids = Array.from(this.sessions.keys());
226
+ await Promise.all(ids.map((id) => this.closeSession(id)));
227
+ }
228
+ }
229
+ //# sourceMappingURL=http-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-gateway.js","sourceRoot":"","sources":["../../../src/gateway/http-gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Response } from 'express';
2
+ /**
3
+ * Send a JSON-RPC 2.0 error response.
4
+ */
5
+ export declare function sendJsonRpcError(res: Response, httpStatus: number, code: number, message: string): void;
6
+ //# sourceMappingURL=json-rpc-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-errors.d.ts","sourceRoot":"","sources":["../../../src/gateway/json-rpc-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,QAAQ,EACb,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAMN"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Send a JSON-RPC 2.0 error response.
3
+ */
4
+ export function sendJsonRpcError(res, httpStatus, code, message) {
5
+ res.status(httpStatus).json({
6
+ jsonrpc: '2.0',
7
+ error: { code, message },
8
+ id: null,
9
+ });
10
+ }
11
+ //# sourceMappingURL=json-rpc-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-errors.js","sourceRoot":"","sources":["../../../src/gateway/json-rpc-errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAa,EACb,UAAkB,EAClB,IAAY,EACZ,OAAe;IAEf,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,EAAE,EAAE,IAAI;KACT,CAAC,CAAC;AACL,CAAC"}