@qontinui/ui-bridge 0.17.0 → 0.18.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 (100) hide show
  1. package/dist/ai/index.d.mts +5 -5
  2. package/dist/ai/index.d.ts +5 -5
  3. package/dist/artifacts/index.d.mts +6 -6
  4. package/dist/artifacts/index.d.ts +6 -6
  5. package/dist/{assertions-Cuf-hvNa.d.ts → assertions-DwPKlu6v.d.ts} +1 -1
  6. package/dist/{assertions-C-uxQGa8.d.mts → assertions-j3SVwQrW.d.mts} +1 -1
  7. package/dist/{browser-capture-9-HEYLK-.d.ts → browser-capture-CDRUbuDp.d.ts} +1 -1
  8. package/dist/{browser-capture-CrytvSDO.d.mts → browser-capture-CRVnwBE4.d.mts} +1 -1
  9. package/dist/{change-observer-CBfJ5biX.d.mts → change-observer-DMXmff2q.d.mts} +1 -1
  10. package/dist/{change-observer-DRBa79aK.d.ts → change-observer-DWhgnunJ.d.ts} +1 -1
  11. package/dist/contracts/index.d.mts +5 -5
  12. package/dist/contracts/index.d.ts +5 -5
  13. package/dist/control/index.d.mts +4 -4
  14. package/dist/control/index.d.ts +4 -4
  15. package/dist/core/index.d.mts +9 -9
  16. package/dist/core/index.d.ts +9 -9
  17. package/dist/ctr/index.d.mts +4 -4
  18. package/dist/ctr/index.d.ts +4 -4
  19. package/dist/ctr/migrate.d.mts +3 -3
  20. package/dist/ctr/migrate.d.ts +3 -3
  21. package/dist/debug/index.d.mts +6 -6
  22. package/dist/debug/index.d.ts +6 -6
  23. package/dist/{drag-drop-detector-CXlhwPb7.d.mts → drag-drop-detector-Baq_Ixcc.d.mts} +1 -1
  24. package/dist/{drag-drop-detector-B8j1bMWp.d.ts → drag-drop-detector-gMHP_QIg.d.ts} +1 -1
  25. package/dist/{effect-store-Cp6Kb2-X.d.ts → effect-store-C0YCNUMx.d.ts} +1 -1
  26. package/dist/{effect-store-C7l209DQ.d.mts → effect-store-CATaXg5u.d.mts} +1 -1
  27. package/dist/{error-snapshot-DCr4oUYq.d.mts → error-snapshot-CmaQu6Ox.d.mts} +1 -1
  28. package/dist/{error-snapshot-owQQTv8i.d.ts → error-snapshot-DENlqCYO.d.ts} +1 -1
  29. package/dist/{find-B4dTGeqA.d.mts → find-A7hwZli6.d.mts} +1 -1
  30. package/dist/{find-DWZC8yoa.d.ts → find-DpPytcRP.d.ts} +1 -1
  31. package/dist/index.d.mts +20 -20
  32. package/dist/index.d.ts +20 -20
  33. package/dist/index.js +1 -1
  34. package/dist/index.mjs +1 -1
  35. package/dist/injected/bundle.global.js +1 -1
  36. package/dist/injected/index.d.mts +1 -1
  37. package/dist/injected/index.d.ts +1 -1
  38. package/dist/{metrics-Bz_3-pCs.d.mts → metrics-Bqs3Guh-.d.mts} +1 -1
  39. package/dist/{metrics-Dc2AV4Dr.d.ts → metrics-CnWC5_lF.d.ts} +1 -1
  40. package/dist/{migrate-specs-to-ctr-Dem0JPuu.d.ts → migrate-specs-to-ctr-BdcTdvZZ.d.ts} +2 -2
  41. package/dist/{migrate-specs-to-ctr-CUWHsCz-.d.mts → migrate-specs-to-ctr-KlH3DlnN.d.mts} +2 -2
  42. package/dist/{nextjs-CkNdxAF9.d.mts → nextjs-BN5L-0yi.d.mts} +2 -2
  43. package/dist/{nextjs-CF71sn2M.d.ts → nextjs-C1cIi_zY.d.ts} +2 -2
  44. package/dist/react/index.d.mts +4 -4
  45. package/dist/react/index.d.ts +4 -4
  46. package/dist/react/index.js +1 -1
  47. package/dist/react/index.mjs +1 -1
  48. package/dist/render-log/index.d.mts +1 -1
  49. package/dist/render-log/index.d.ts +1 -1
  50. package/dist/server/express.d.mts +7 -7
  51. package/dist/server/express.d.ts +7 -7
  52. package/dist/server/express.js.map +1 -1
  53. package/dist/server/express.mjs.map +1 -1
  54. package/dist/server/handlers.d.mts +9 -9
  55. package/dist/server/handlers.d.ts +9 -9
  56. package/dist/server/index.d.mts +17 -17
  57. package/dist/server/index.d.ts +17 -17
  58. package/dist/server/index.js +2 -1
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/index.mjs +2 -1
  61. package/dist/server/index.mjs.map +1 -1
  62. package/dist/server/nextjs.d.mts +8 -8
  63. package/dist/server/nextjs.d.ts +8 -8
  64. package/dist/server/nextjs.js +2 -1
  65. package/dist/server/nextjs.js.map +1 -1
  66. package/dist/server/nextjs.mjs +2 -1
  67. package/dist/server/nextjs.mjs.map +1 -1
  68. package/dist/server/standalone.d.mts +9 -9
  69. package/dist/server/standalone.d.ts +9 -9
  70. package/dist/server/standalone.js.map +1 -1
  71. package/dist/server/standalone.mjs.map +1 -1
  72. package/dist/specs/index.d.mts +10 -10
  73. package/dist/specs/index.d.ts +10 -10
  74. package/dist/{sse-handler-CpB3bJ2N.d.mts → sse-handler-BE5cyXF7.d.mts} +1 -1
  75. package/dist/{sse-handler-BpZ9QtRm.d.ts → sse-handler-Bw_4h2AN.d.ts} +1 -1
  76. package/dist/{standalone-C_knSpNG.d.ts → standalone-7VEHUTla.d.ts} +4 -4
  77. package/dist/{standalone-CY0Uj5LQ.d.mts → standalone-DCGkT2Ad.d.mts} +4 -4
  78. package/dist/{store-Bv5wJ91r.d.mts → store-BHzSGFU2.d.mts} +1 -1
  79. package/dist/{store-BjSi35SI.d.ts → store-DH3LUEjx.d.ts} +1 -1
  80. package/dist/{style-types-mvMAEeSI.d.mts → style-types-CtwPR05K.d.mts} +1 -1
  81. package/dist/{style-types-De_9GaYG.d.ts → style-types-lmRdKbT8.d.ts} +1 -1
  82. package/dist/{types-BUCPM1o1.d.mts → types-CB7QpT8R.d.mts} +3 -3
  83. package/dist/{types-IQUAZlE2.d.mts → types-CgsWB31c.d.mts} +1 -1
  84. package/dist/{types-zS11cuej.d.ts → types-Chf3cfrT.d.ts} +12 -0
  85. package/dist/{types-C6ix-zFE.d.ts → types-CovPz-sh.d.ts} +1 -1
  86. package/dist/{types-DUVvn3yt.d.ts → types-DP4N3eYZ.d.ts} +36 -7
  87. package/dist/{types-Bubo62kN.d.mts → types-DTGf8Noz.d.mts} +36 -7
  88. package/dist/{types-vftd8HsR.d.ts → types-DgIxG1sS.d.ts} +1 -1
  89. package/dist/{types-Bz40rWAT.d.ts → types-DhJE_FQX.d.ts} +3 -3
  90. package/dist/{types-D1UiLr75.d.mts → types-DnqZodFb.d.mts} +12 -0
  91. package/dist/{types-cfwRCpgn.d.ts → types-bG3xLcjL.d.ts} +1 -1
  92. package/dist/{types-q-2aMSnI.d.mts → types-cQzKFRd5.d.mts} +1 -1
  93. package/dist/{types-BYhYroLP.d.mts → types-gusNHeJt.d.mts} +1 -1
  94. package/dist/verification-layers/index.d.mts +5 -5
  95. package/dist/verification-layers/index.d.ts +5 -5
  96. package/dist/{websocket-client-Bmt4YNSR.d.ts → websocket-client-BEtd7_GO.d.ts} +1 -1
  97. package/dist/{websocket-client-B_W7ZvT0.d.mts → websocket-client-CDRMdZdU.d.mts} +1 -1
  98. package/dist/{ws-streaming-DGiomqt_.d.mts → ws-streaming-BzumSnWw.d.mts} +1 -1
  99. package/dist/{ws-streaming-D_tat1kF.d.ts → ws-streaming-DweATXes.d.ts} +1 -1
  100. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/types.ts","../../src/diagnostics/codes.generated.ts","../../src/diagnostics/index.ts","../../src/core/class-name.ts","../../src/core/element-fingerprint.ts","../../src/recording/interaction-interceptor.ts","../../src/recording/session-manager.ts","../../src/server/websocket-handler.ts","../../src/server/ws-stream-adapter.ts","../../src/server/sse-handler.ts","../../src/server/standalone.ts"],"names":["m","generateId"],"mappings":";AA4gDO,IAAM,gBAAA,GAAsC;AAAA;AAAA,EAEjD,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,SAAS,cAAA,EAAe;AAAA,EAC9D,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,cAAA,EAAe;AAAA;AAAA,EACtE,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,SAAS,gBAAA,EAAiB;AAAA,EACnE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,sBAAA,EAAwB,SAAS,iBAAA,EAAkB;AAAA,EAC3E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,kBAAA,EAAmB;AAAA;AAAA,EAGvE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,SAAS,aAAA,EAAc;AAAA,EACnE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,sBAAA,EAAwB,SAAS,YAAA,EAAc,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EACrF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,4BAAA,EAA8B,SAAS,iBAAA,EAAmB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EAChG;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,kCAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,oBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,eAAA,EAAgB;AAAA,EACvE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,wBAAA,EAA0B,SAAS,cAAA,EAAgB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EACzF;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,8BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,yCAAA;AAAA,IACN,OAAA,EAAS,wBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAA,EAAM,UAAU,CAAA;AAAA,IACzB,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,SAAS,MAAA,EAAO;AAAA,EACzD,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,mBAAA,EAAqB,SAAS,UAAA,EAAW;AAAA;AAAA,EACjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,SAAS,oBAAA,EAAqB;AAAA;AAAA;AAAA,EAG1E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,wBAAA,EAA0B,SAAS,iBAAA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,sBAAA,EAAwB,SAAS,YAAA,EAAa;AAAA;AAAA,EAGtE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,oBAAA,EAAsB,SAAS,cAAA,EAAe;AAAA,EACrE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,2BAAA,EAA6B,SAAS,aAAA,EAAe,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EAC5F;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,iCAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,OAAO;AAAA,GAClB;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,uBAAA,EAAyB,SAAS,kBAAA,EAAmB;AAAA;AAAA,EAE5E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,iBAAA,EAAmB,SAAS,kBAAA,EAAmB;AAAA,EACtE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,SAAS,YAAA,EAAa;AAAA,EAC/D,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,sBAAA,EAAwB,SAAS,kBAAA,EAAoB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EAC5F,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,gBAAA,EAAiB;AAAA,EACxE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,kBAAA,EAAmB;AAAA,EAC9E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,+BAAA,EAAiC,SAAS,oBAAA,EAAqB;AAAA;AAAA,EAGvF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,cAAc,OAAA,EAAS,UAAA,EAAY,cAAc,IAAA,EAAK;AAAA,EAC9E,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,YAAY,OAAA,EAAS,QAAA,EAAU,cAAc,IAAA,EAAK;AAAA,EAC1E,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,eAAe,OAAA,EAAS,WAAA,EAAa,cAAc,IAAA,EAAK;AAAA,EAChF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,cAAc,OAAA,EAAS,UAAA,EAAY,cAAc,IAAA,EAAK;AAAA,EAC9E,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,oBAAoB,OAAA,EAAS,eAAA,EAAiB,cAAc,IAAA,EAAK;AAAA,EACzF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,SAAS,qBAAA,EAAsB;AAAA,EACtE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,SAAS,iBAAA,EAAkB;AAAA,EAC9D,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,SAAS,gBAAA,EAAiB;AAAA,EAChE,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAuB,OAAA,EAAS,kBAAA,EAAoB,cAAc,IAAA,EAAK;AAAA;AAAA,EAG/F;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS,iBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,qBAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,0BAAA,EAA4B,SAAS,oBAAA,EAAqB;AAAA,EACjF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,mBAAmB,OAAA,EAAS,eAAA,EAAiB,cAAc,IAAA,EAAK;AAAA,EACxF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,0BAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,0BAAA,EAA4B,SAAS,oBAAA,EAAqB;AAAA,EAClF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,2BAAA,EAA6B,SAAS,qBAAA,EAAsB;AAAA,EACpF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,yBAAA,EAA2B,SAAS,mBAAA,EAAoB;AAAA,EAChF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,wBAAA,EAA0B,SAAS,qBAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAiB,OAAA,EAAS,cAAA,EAAgB,cAAc,IAAA,EAAK;AAAA,EACrF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,eAAA,EAAiB,SAAS,eAAA,EAAgB;AAAA,EACjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,oBAAA,EAAsB,SAAS,aAAA,EAAe,MAAA,EAAQ,CAAC,MAAM,CAAA,EAAE;AAAA,EACtF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,aAAA,EAAe,MAAA,EAAQ,CAAC,MAAM,CAAA,EAAE;AAAA,EACvF;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,gBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,MAAM;AAAA,GACjB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,qBAAA;AAAA,IACN,OAAA,EAAS,gBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,MAAM;AAAA,GACjB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,yBAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,MAAM;AAAA,GACjB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,0BAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,MAAM;AAAA,GACjB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,iBAAA,EAAmB,SAAS,WAAA,EAAY;AAAA,EAC/D,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,wBAAA,EAA0B,SAAS,iBAAA,EAAkB;AAAA,EAC5E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,0BAAA,EAA4B,SAAS,kBAAA,EAAmB;AAAA,EAC/E,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,6BAA6B,OAAA,EAAS,UAAA,EAAY,cAAc,IAAA,EAAK;AAAA,EAC7F,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,4BAA4B,OAAA,EAAS,YAAA,EAAc,cAAc,IAAA,EAAK;AAAA,EAC9F,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,oBAAA,EAAsB,SAAS,UAAA,EAAY,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EACjF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,6BAAA,EAA+B,SAAS,eAAA,EAAiB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EAChG;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,+BAAA;AAAA,IACN,OAAA,EAAS,iBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,uBAAA,EAAyB,SAAS,gBAAA,EAAiB;AAAA,EAC1E;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,mCAAA;AAAA,IACN,OAAA,EAAS,oBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,qCAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,sBAAA,EAAwB,SAAS,gBAAA,EAAiB;AAAA,EACzE;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,qCAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,iCAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,aAAA,EAAe,SAAS,aAAA,EAAc;AAAA,EAC7D,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAuB,OAAA,EAAS,eAAA,EAAiB,cAAc,IAAA,EAAK;AAAA,EAC5F,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,oBAAoB,OAAA,EAAS,YAAA,EAAc,cAAc,IAAA,EAAK;AAAA,EACtF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,wBAAwB,OAAA,EAAS,gBAAA,EAAkB,cAAc,IAAA,EAAK;AAAA,EAC9F;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS,wBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS,iBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,iBAAA,EAAkB;AAAA,EACtE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,oBAAA,EAAqB;AAAA,EAC5E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,6BAAA,EAA+B,SAAS,uBAAA,EAAwB;AAAA,EACvF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,+BAAA;AAAA,IACN,OAAA,EAAS,iBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAA,EAAyB,SAAS,aAAA,EAAc;AAAA,EACxE,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,0BAA0B,OAAA,EAAS,cAAA,EAAgB,cAAc,IAAA,EAAK;AAAA,EAC9F,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,oBAAA,EAAsB,SAAS,YAAA,EAAa;AAAA,EACpE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAA,EAAyB,SAAS,eAAA,EAAgB;AAAA,EAC1E,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,0BAA0B,OAAA,EAAS,cAAA,EAAgB,cAAc,IAAA,EAAK;AAAA,EAC9F,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,wBAAwB,OAAA,EAAS,YAAA,EAAc,cAAc,IAAA,EAAK;AAAA;AAAA,EAG1F;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,0BAAA;AAAA,IACN,OAAA,EAAS,gBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,eAAA,EAAgB;AAAA;AAAA,EAG3E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,SAAS,gBAAA,EAAiB;AAAA,EACjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,mBAAA,EAAoB;AAAA,EAC3E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,uBAAA,EAAyB,SAAS,uBAAA,EAAwB;AAAA,EACjF,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAuB,OAAA,EAAS,mBAAA,EAAqB,cAAc,IAAA,EAAK;AAAA,EAChG,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,eAAA,EAAiB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EACpF;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,kBAAA,EAAoB,SAAS,kBAAA,EAAoB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA;AAAA,EAG1F,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,8BAAA,EAAgC,SAAS,uBAAA,EAAwB;AAAA,EACxF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,oCAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,kBAAA,EAAmB;AAAA,EAC9E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,SAAS,aAAA,EAAc;AAAA,EACnE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,iBAAA,EAAmB,SAAS,iBAAA,EAAkB;AAAA,EACrE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,kBAAA,EAAmB;AAAA,EAC9E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,+BAAA,EAAiC,SAAS,mBAAA,EAAoB;AAAA,EACtF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,6BAAA,EAA+B,SAAS,iBAAA,EAAkB;AAAA,EAClF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,kBAAA,EAAmB;AAAA,EAC9E;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,kCAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,kCAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,0BAAA,EAA4B,SAAS,mBAAA,EAAoB;AAAA,EAChF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,uBAAA,EAAyB,SAAS,gBAAA,EAAiB;AAAA;AAAA,EAG1E;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,kCAAA;AAAA,IACN,OAAA,EAAS,uBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,kBAAA,EAAoB,SAAS,mBAAA,EAAoB;AAAA,EACzE;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,wBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,+BAAA;AAAA,IACN,OAAA,EAAS,wBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,SAAS,gBAAA,EAAiB;AAAA,EACnE;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,0BAAA;AAAA,IACN,OAAA,EAAS,gBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,eAAA,EAAgB;AAAA,EACvE,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,qBAAA,EAAuB,SAAS,iBAAA,EAAkB;AAAA;AAAA,EAG5E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,kBAAA,EAAoB,SAAS,iBAAA,EAAkB;AAAA,EACvE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,2BAAA,EAA6B,SAAS,oBAAA,EAAqB;AAAA,EAClF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,2BAAA,EAA6B,SAAS,cAAA,EAAe;AAAA,EAC7E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAA,EAAyB,SAAS,cAAA,EAAe;AAAA;AAAA,EAGzE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,SAAS,UAAA,EAAW;AAAA,EAC7D,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAiB,OAAA,EAAS,UAAA,EAAY,cAAc,IAAA,EAAK;AAAA,EACjF,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,yBAAA,EAA2B,SAAS,eAAA,EAAgB;AAAA,EAC5E;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,qBAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,oBAAA,EAAsB,SAAS,cAAA,EAAe;AAAA,EACrE,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,sBAAsB,OAAA,EAAS,cAAA,EAAgB,cAAc,IAAA,EAAK;AAAA;AAAA,EAG1F,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,2BAAA,EAA6B,SAAS,oBAAA,EAAqB;AAAA,EAClF;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,qCAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS,uBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,8BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,sBAAA,EAAwB,SAAS,eAAA,EAAgB;AAAA,EACxE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,iBAAA,EAAmB,SAAS,eAAA,EAAgB;AAAA,EACnE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,wBAAA,EAA0B,SAAS,aAAA,EAAc;AAAA,EACzE;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,2BAAA;AAAA,IACN,OAAA,EAAS,gBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,8BAAA;AAAA,IACN,OAAA,EAAS,qBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,QAAQ;AAAA,GACnB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,QAAQ;AAAA,GACnB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,qBAAA,EAAuB,SAAS,cAAA,EAAe;AAAA,EACtE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,SAAS,aAAA,EAAc;AAAA,EAChE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,SAAS,aAAA,EAAc;AAAA;AAAA,EAGhE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,eAAA,EAAiB,SAAS,iBAAA,EAAkB;AAAA;AAAA,EAGnE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,SAAS,UAAA,EAAW;AAAA;AAAA,EAG7D,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,SAAS,kBAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAA,EAAmB,SAAS,eAAA,EAAgB;AAAA,EACpE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,kBAAA,EAAoB,SAAS,gBAAA,EAAiB;AAAA,EACtE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,cAAA,EAAgB,SAAS,YAAA,EAAa;AAAA,EAC9D,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,aAAA,EAAe,SAAS,WAAA,EAAY;AAAA;AAAA,EAE5D,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAA,EAAmB,SAAS,eAAA,EAAgB;AAAA,EACpE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,kBAAA,EAAoB,SAAS,gBAAA,EAAiB;AAAA;AAAA,EAEtE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAA,EAAmB,SAAS,eAAA,EAAgB;AAAA,EACpE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,gBAAA,EAAkB,SAAS,cAAA,EAAe;AAAA,EAClE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,kBAAA,EAAoB,SAAS,gBAAA,EAAiB;AAAA,EACtE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,mBAAA,EAAqB,SAAS,qBAAA,EAAsB;AAAA;AAAA,EAE3E;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,2BAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,QAAQ;AAAA,GACnB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,gBAAA,EAAkB,SAAS,cAAA,EAAe;AAAA;AAAA,EAGjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,wBAAA,EAA0B,SAAS,iBAAA,EAAkB;AAAA;AAAA;AAAA;AAAA,EAM5E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,0BAAA,EAA4B,SAAS,mBAAA,EAAoB;AAAA,EACjF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAS,wBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,uBAAA,EAAyB,SAAS,gBAAA,EAAiB;AAAA,EAC3E;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,oCAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,0CAAA;AAAA,IACN,OAAA,EAAS,uBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,sBAAA,EAAwB,SAAS,gBAAA,EAAiB;AAAA,EACzE;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,yBAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,6BAAA,EAA+B,SAAS,mBAAA,EAAoB;AAAA,EACnF,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,+BAAA,EAAiC,SAAS,uBAAA,EAAwB;AAAA,EACzF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,eAAA,EAAiB,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAE;AAAA,EAC3F;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,yBAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,yBAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,yBAAA,EAA2B,SAAS,kBAAA,EAAmB;AAAA,EAC9E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,kBAAA,EAAmB;AAAA,EACvE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,YAAA,EAAa;AAAA,EACjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,8BAAA,EAAgC,SAAS,YAAA,EAAa;AAAA,EAC7E;AAAA,IACE,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,8BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ,CAAC,IAAI;AAAA,GACf;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,kBAAA,EAAoB,SAAS,aAAA,EAAc;AAAA,EAClE,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,oBAAoB,OAAA,EAAS,gBAAA,EAAkB,cAAc,IAAA,EAAK;AAAA,EAC1F;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,+BAAA;AAAA,IACN,OAAA,EAAS,eAAA;AAAA,IACT,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,uBAAA,EAAyB,SAAS,cAAA,EAAgB,MAAA,EAAQ,CAAC,MAAM,CAAA,EAAE;AAAA;AAAA,EAG7F,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,oBAAoB,OAAA,EAAS,eAAA,EAAiB,cAAc,IAAA,EAAK;AAAA;AAAA,EAGzF;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,6BAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,iCAAA;AAAA,IACN,OAAA,EAAS,iBAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,yBAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,0BAAA;AAAA,IACN,OAAA,EAAS,WAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS,2BAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,2BAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS,0BAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAGA,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,SAAS,gBAAA,EAAiB;AAAA;AAAA,EAGjE,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,sBAAA,EAAwB,SAAS,WAAA,EAAY;AAAA,EACpE;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,2BAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,YAAA,EAAc;AAAA;AAElB,CAAA;;;AClhEO,IAAM,WAAA,GAA0D;AAAA,EACrE,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,oCAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gDAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,sCAAA,EAAwC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MACrG,EAAE,UAAA,EAAY,2BAAA,EAA6B,OAAA,EAAS,0BAAA,EAA4B,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAChI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EAAa,yFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,mCAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,4DAAA,EAA8D,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC3H,EAAE,YAAY,8CAAA,EAAgD,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KAC9G;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,WAAA,EAAa,yDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,8CAAA;AAAA,MACA,uDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,4EAAA,EAA8E,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,MAC1I,EAAE,YAAY,2DAAA,EAA6D,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC1H,EAAE,UAAA,EAAY,+BAAA,EAAiC,OAAA,EAAS,mBAAA,EAAqB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAC7H;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EAAa,2FAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,+CAAA;AAAA,MACA,mDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,+CAAA,EAAiD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC9G,EAAE,YAAY,qDAAA,EAAuD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MACpH,EAAE,YAAY,6BAAA,EAA+B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC9F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EAAa,oDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,4DAAA;AAAA,MACA,iCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,6DAAA,EAA+D,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC9H;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,WAAA,EAAa,uDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,qDAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,yEAAA,EAA2E,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtK;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,0EAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,yDAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,yCAAA,EAA2C,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KACzG;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,WAAA,EAAa,iFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gDAAA;AAAA,MACA,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,sFAAA,EAAwF,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KACtJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,WAAA,EAAa,mDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,0CAAA;AAAA,MACA,2DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,mEAAA,EAAqE,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KACnI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EAAa,+CAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gEAAA;AAAA,MACA,qDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,qEAAA,EAAuE,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAClK;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,WAAA,EAAa,+EAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,wCAAA;AAAA,MACA,2DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,0BAAA,EAA4B,OAAA,EAAS,oBAAA,EAAsB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MACvH,EAAE,YAAY,qBAAA,EAAuB,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,MACnF,EAAE,YAAY,4CAAA,EAA8C,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KAC5G;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,wDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,iDAAA;AAAA,MACA,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,+BAAA,EAAiC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC9F,EAAE,YAAY,6BAAA,EAA+B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC5F,EAAE,UAAA,EAAY,2CAAA,EAA6C,OAAA,EAAS,gCAAA,EAAkC,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EAAa,mFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,2CAAA;AAAA,MACA,iDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,+BAAA,EAAiC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC9F,EAAE,YAAY,yCAAA,EAA2C,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MACxG,EAAE,UAAA,EAAY,wCAAA,EAA0C,OAAA,EAAS,gCAAA,EAAkC,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACnJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,WAAA,EAAa,wEAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,uDAAA;AAAA,MACA,uDAAA;AAAA,MACA,iEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,qEAAA,EAAuE,OAAA,EAAS,uBAAA,EAAyB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MACrK,EAAE,YAAY,4DAAA,EAA8D,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC3H,EAAE,UAAA,EAAY,0CAAA,EAA4C,OAAA,EAAS,aAAA,EAAe,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAClI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EAAa,0HAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,4CAAA;AAAA,MACA,8CAAA;AAAA,MACA,+CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,+CAAA,EAAiD,OAAA,EAAS,oBAAA,EAAsB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MAC5I,EAAE,UAAA,EAAY,sCAAA,EAAwC,OAAA,EAAS,mBAAA,EAAqB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MAClI,EAAE,YAAY,iCAAA,EAAmC,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KACjG;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EAAa,6DAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,6CAAA;AAAA,MACA,2CAAA;AAAA,MACA,gDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,uCAAA,EAAyC,OAAA,EAAS,mBAAA,EAAqB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MACnI,EAAE,UAAA,EAAY,qCAAA,EAAuC,OAAA,EAAS,oBAAA,EAAsB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MAClI,EAAE,UAAA,EAAY,4CAAA,EAA8C,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACzI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,8BAAA,EAAgC;AAAA,IAC9B,WAAA,EAAa,+FAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,oCAAA;AAAA,MACA,wCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,6CAAA,EAA+C,OAAA,EAAS,cAAA,EAAgB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,6BAAA,EAA+B;AAAA,IAC7B,WAAA,EAAa,iFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,8BAAA;AAAA,MACA,+BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,8EAAA,EAAgF,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC/I;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,6BAAA,EAA+B;AAAA,IAC7B,WAAA,EAAa,8DAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,+CAAA;AAAA,MACA,2CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,8EAAA,EAAgF,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC/I;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,gCAAA,EAAkC;AAAA,IAChC,WAAA,EAAa,sFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,wCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,qEAAA,EAAuE,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAClK;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,+BAAA,EAAiC;AAAA,IAC/B,WAAA,EAAa,wFAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,oCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,0DAAA,EAA4D,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACvJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,iCAAA,EAAmC;AAAA,IACjC,WAAA,EAAa,gGAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,mDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,6CAAA,EAA+C,OAAA,EAAS,cAAA,EAAgB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,gCAAA,EAAkC;AAAA,IAChC,WAAA,EAAa,+FAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,mCAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,iEAAA,EAAmE,OAAA,EAAS,uBAAA,EAAyB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACnK;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qCAAA,EAAuC;AAAA,IACrC,WAAA,EAAa,8DAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gDAAA;AAAA,MACA,wCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,kFAAA,EAAoF,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KACnJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,+BAAA,EAAiC;AAAA,IAC/B,WAAA,EAAa,4DAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gCAAA;AAAA,MACA,0CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,6CAAA,EAA+C,OAAA,EAAS,cAAA,EAAgB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtI;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,8BAAA,EAAgC;AAAA,IAC9B,WAAA,EAAa,mEAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,iFAAA,EAAmF,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAClJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EAAa,wDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,oCAAA;AAAA,MACA,sCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,gEAAA,EAAkE,OAAA,EAAS,kBAAA,EAAoB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KAC7J;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,6BAAA,EAA+B;AAAA,IAC7B,WAAA,EAAa,0DAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,wCAAA;AAAA,MACA,oDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,+EAAA,EAAiF,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAChJ;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,WAAA,EAAa,0EAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,2DAAA;AAAA,MACA,mEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,yCAAA,EAA2C,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MACxG,EAAE,YAAY,mEAAA,EAAqE,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAClI,EAAE,YAAY,wDAAA,EAA0D,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KACxH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EAAa,mEAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gCAAA;AAAA,MACA,+CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,iCAAA,EAAmC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAChG,EAAE,YAAY,oDAAA,EAAsD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MACnH,EAAE,YAAY,6BAAA,EAA+B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC9F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EAAa,uCAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,4CAAA;AAAA,MACA,sCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,0BAAA,EAA4B,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,MACxF,EAAE,YAAY,6BAAA,EAA+B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC9F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,WAAA,EAAa,uEAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,yCAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,gDAAA,EAAkD,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,MAC9G,EAAE,YAAY,4BAAA,EAA8B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC7F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EAAa,oCAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,oCAAA;AAAA,MACA,uCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,kBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MACzG,EAAE,YAAY,4BAAA,EAA8B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC7F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,WAAA,EAAa,mDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,sDAAA;AAAA,MACA,0DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,6DAAA,EAAiE,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC9H,EAAE,YAAY,gDAAA,EAAkD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KACjH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,yDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,sDAAA;AAAA,MACA,uCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,wBAAA,EAA0B,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,MACtF,EAAE,UAAA,EAAY,4BAAA,EAA8B,OAAA,EAAS,eAAA,EAAiB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACtH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EAAa,iDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,0DAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,0CAAA,EAA4C,OAAA,EAAS,gBAAA,EAAkB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MACnI,EAAE,YAAY,gDAAA,EAAkD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KACjH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EAAa,gDAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,uDAAA;AAAA,MACA,uCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,wBAAA,EAA0B,OAAA,EAAS,SAAA,EAAW,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,MAC1G,EAAE,UAAA,EAAY,6BAAA,EAA+B,OAAA,EAAS,gBAAA,EAAkB,YAAY,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AAAE,KACxH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,6CAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,uDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,kDAAA,EAAoD,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KACnH;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,uBAAA,EAAyB;AAAA,IACvB,WAAA,EAAa,yEAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,yDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,6BAAA,EAA+B,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC5F,EAAE,YAAY,iCAAA,EAAmC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAClG;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EAAa,sCAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,gDAAA;AAAA,MACA,qDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,4CAAA,EAA8C,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,MAC3G,EAAE,YAAY,8BAAA,EAAgC,UAAA,EAAY,KAAK,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAE,KAC/F;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,8BAAA,EAAgC;AAAA,IAC9B,WAAA,EAAa,6IAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,8DAAA;AAAA,MACA,4DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,YAAY,kEAAA,EAAoE,UAAA,EAAY,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAE,KAClI;AAAA,IACA,QAAA,EAAU;AAAA;AAEd,CAAA;;;AC5mBE,MAAA,CAAO,WAAA;AAAA,EACJ,OAAO,IAAA,CAAK,WAAW,CAAA,CAA0B,GAAA,CAAI,CAAC,IAAA,KAAS;AAAA,IAC9D,IAAA;AAAA,IACA,WAAA,CAAY,IAAI,CAAA,CAAE,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE;AAAA,GACzD;AACH;AA+HF,IAAM,0BAAA,GAAgE;AAAA,EACpE,SAAA,EAAW,mBAAA;AAAA,EACX,iBAAA,EAAmB,mBAAA;AAAA,EACnB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,eAAA,EAAiB,qBAAA;AAAA,EACjB,gBAAA,EAAkB,qBAAA;AAAA,EAClB,eAAA,EAAiB,uBAAA;AAAA,EACjB,eAAA,EAAiB,oBAAA;AAAA,EACjB,kBAAA,EAAoB,cAAA;AAAA,EACpB,YAAA,EAAc,cAAA;AAAA,EACd,cAAA,EAAgB,kBAAA;AAAA,EAChB,mCAAA,EAAqC,uBAAA;AAAA,EACrC,uBAAA,EAAyB,oBAAA;AAAA,EACzB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,kBAAA;AAAA,EACxB,UAAA,EAAY,mBAAA;AAAA,EACZ,iBAAA,EAAmB,kBAAA;AAAA,EACnB,WAAA,EAAa,qBAAA;AAAA,EACb,YAAA,EAAc,oBAAA;AAAA,EACd,YAAA,EAAc,oBAAA;AAAA,EACd,cAAA,EAAgB;AAClB,CAAA;AAEO,SAAS,oBAAA,CACd,cACA,OAAA,EACmB;AACnB,EAAA,IAAI,YAAA,EAAc;AAEhB,IAAA,IAAK,WAAA,CAAwC,YAAY,CAAA,EAAG;AAC1D,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,2BAA2B,YAAY,CAAA;AACtD,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AACnC,MAAA,MAAMA,EAAAA,GAAAA,CAAK,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY;AACtC,MAAA,IAAIA,GAAE,QAAA,CAAS,WAAW,CAAA,IAAKA,EAAAA,CAAE,SAAS,gBAAgB,CAAA;AACxD,QAAA,OAAO,mBAAA;AACT,MAAA,IAAIA,GAAE,QAAA,CAAS,SAAS,CAAA,IAAKA,EAAAA,CAAE,SAAS,WAAW,CAAA;AACjD,QAAA,OAAO,mBAAA;AACT,MAAA,OAAO,kBAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAA,CAAK,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY;AACtC,EAAA,IAAI,EAAE,QAAA,CAAS,WAAW,CAAA,IAAK,CAAA,CAAE,SAAS,gBAAgB,CAAA;AACxD,IAAA,OAAO,mBAAA;AACT,EAAA,IAAI,EAAE,QAAA,CAAS,aAAa,CAAA,IAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAClD,IAAA,OAAO,qBAAA;AACT,EAAA,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,kBAAA;AACnC,EAAA,IAAI,EAAE,QAAA,CAAS,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,WAAW,CAAA;AACjD,IAAA,OAAO,mBAAA;AACT,EAAA,IAAI,EAAE,QAAA,CAAS,UAAU,CAAA,IAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAChD,IAAA,OAAO,qBAAA;AACT,EAAA,IAAI,EAAE,QAAA,CAAS,SAAS,CAAA,IAAK,CAAA,CAAE,SAAS,cAAc,CAAA;AACpD,IAAA,OAAO,cAAA;AAET,EAAA,OAAO,kBAAA;AACT;;;ACzMO,SAAS,YAAY,EAAA,EAAwC;AAClE,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,KAAM,EAAA,CAAmB,SAAA;AAC/B,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,OAAO,EAAA;AACnC,EAAA,MAAM,UAAW,EAAA,EAAsC,OAAA;AACvD,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,EAAA;AACjD;AAOO,SAAS,UAAU,EAAA,EAA0C;AAClE,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,EAAE,CAAA,CAAE,IAAA,EAAK;AAC/B,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAK,IAAI,EAAC;AAC/B;;;ACqBA,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,kBAAA,GAA6C;AAAA,EACjD,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,aAAA;AAAA,EACR,KAAA,EAAO,eAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAGA,IAAM,cAAA,GAAyE;AAAA,EAC7E,MAAA,EAAQ,QAAA;AAAA,EACR,GAAG,CAAC,EAAA,KAAQ,GAAG,YAAA,CAAa,MAAM,IAAI,MAAA,GAAS,EAAA;AAAA,EAC/C,KAAA,EAAO,CAAC,EAAA,KAAO;AACb,IAAA,MAAM,IAAA,GAAQ,EAAA,CAAwB,IAAA,EAAM,WAAA,EAAY;AACxD,IAAA,IAAI,IAAA,KAAS,YAAY,OAAO,UAAA;AAChC,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,OAAA;AAC7B,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,QAAA;AAC7B,IAAA,IAAI,SAAS,QAAA,IAAY,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,UAAU,OAAO,QAAA;AACvE,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,EAAA,KAAS,EAAA,CAAyB,WAAW,SAAA,GAAY,UAAA;AAAA,EAClE,QAAA,EAAU,SAAA;AAAA,EACV,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,aAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAEvB,gEAAA;AAAA;AAAA,EAEA,yCAAA;AAAA;AAAA,EAEA,gBAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,kCAAA;AAAA;AAAA,EAEA;AACF,CAAA;AAWA,SAAS,sBAAsB,OAAA,EAA8B;AAC3D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAA8B,OAAA;AAElC,EAAA,OAAO,WAAW,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAU,OAAA,CAAQ,YAAY,MAAA,EAAQ;AAC1E,IAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAA;AAC3C,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,EACpB;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAKA,SAAS,oBAAoB,OAAA,EAA8B;AAEzD,EAAA,IAAI,QAAA,GAA+B,OAAA;AACnC,EAAA,OAAO,QAAA,EAAU;AACf,IAAA,IACE,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,KAAM,QAAA,IAClC,QAAA,CAAS,YAAA,CAAa,YAAY,CAAA,KAAM,MAAA,IACxC,QAAA,CAAS,OAAA,KAAY,QAAA,EACrB;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,QAAA,GAAW,QAAA,CAAS,aAAA;AAAA,EACtB;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,EAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAElB,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,MAAA;AAEjC,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,UAAU,CAAA,GAAI,EAAA;AAC/C,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAS,CAAA,GAAI,EAAA;AAE/C,EAAA,IAAI,OAAA,GAAU,KAAK,OAAO,QAAA;AAC1B,EAAA,IAAI,OAAA,GAAU,KAAK,OAAO,QAAA;AAC1B,EAAA,IAAI,OAAA,GAAU,KAAK,OAAO,cAAA;AAC1B,EAAA,IAAI,OAAA,GAAU,KAAK,OAAO,eAAA;AAE1B,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,OAAA,EAA8B;AACjD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AAC/C,EAAA,IAAI,OAAO,QAAA,KAAa,UAAA,EAAY,OAAO,SAAS,OAAO,CAAA;AAC3D,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AAEzC,EAAA,OAAO,EAAA;AACT;AAOA,SAAS,sBAAsB,OAAA,EAA0C;AAEvE,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACnD,EAAA,IAAI,SAAA,EAAW,OAAO,aAAA,CAAc,SAAS,CAAA;AAG7C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,QAAQ,UAAA,CACX,KAAA,CAAM,KAAK,CAAA,CACX,IAAI,CAAC,EAAA,KAAO,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,WAAA,EAAa,MAAM,CAAA,CAC5D,OAAO,OAAO,CAAA;AACjB,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,OAAO,cAAc,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,MAAM,OAAA,CAAQ,OAAA;AACpB,EAAA,IACE,GAAA,KAAQ,QAAA,IACR,GAAA,KAAQ,GAAA,IACR,GAAA,KAAQ,aACR,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IACpB,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,KAAM,QAAA,IACjC,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,KAAM,UACjC,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,KAAM,KAAA,EACjC;AACA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK;AACvC,IAAA,IAAI,IAAA,EAAM,OAAO,aAAA,CAAc,IAAI,CAAA;AAAA,EACrC;AAGA,EAAA,IACE,OAAA,YAAmB,gBAAA,IACnB,OAAA,YAAmB,mBAAA,IACnB,mBAAmB,iBAAA,EACnB;AAEA,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,MAAM,KAAA,GAAQ,SAAS,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAC7E,MAAA,IAAI,KAAA,EAAO,aAAa,IAAA,EAAK,SAAU,aAAA,CAAc,KAAA,CAAM,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC7C,IAAA,IAAI,aAAA,EAAe,aAAa,IAAA,EAAK,SAAU,aAAA,CAAc,aAAA,CAAc,WAAA,CAAY,IAAA,EAAM,CAAA;AAE7F,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACtD,IAAA,IAAI,WAAA,EAAa,OAAO,aAAA,CAAc,WAAW,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,IAAI,UAAA,GAAa,KAAK,IAAA,EAAK;AAG3B,EAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,IAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,UAAK,CAAA;AAAA,EAChD;AAGA,EAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAG3C,EAAA,IAAI,UAAA,CAAW,SAAS,EAAA,EAAI;AAC1B,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,oBAAoB,OAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,WAAA;AAEhD,EAAA,IAAI,YAAA,KAAiB,GAAG,OAAO,QAAA;AAE/B,EAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAU,YAAA;AAE3C,EAAA,IAAI,KAAA,GAAQ,MAAO,OAAO,MAAA;AAC1B,EAAA,IAAI,KAAA,GAAQ,MAAM,OAAO,QAAA;AACzB,EAAA,IAAI,KAAA,GAAQ,MAAM,OAAO,OAAA;AACzB,EAAA,IAAI,KAAA,GAAQ,KAAK,OAAO,QAAA;AACxB,EAAA,IAAI,KAAA,GAAQ,KAAK,OAAO,OAAA;AACxB,EAAA,IAAI,KAAA,GAAQ,KAAK,OAAO,WAAA;AACxB,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,uBAAuB,OAAA,EAG9B;AACA,EAAA,IAAI,UAA8B,OAAA,CAAQ,aAAA;AAE1C,EAAA,OAAO,WAAW,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAU,OAAA,CAAQ,YAAY,MAAA,EAAQ;AAE1E,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,IAAA,IAAI,IAAA,IAAQ,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,EAAE,UAAU,IAAA,EAAM,KAAA,EAAO,QAAQ,YAAA,CAAa,YAAY,KAAK,MAAA,EAAU;AAAA,IAClF;AAGA,IAAA,MAAM,gBAAA,GAAmB,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA;AAC3D,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,EAAE,UAAU,gBAAA,EAAkB,KAAA,EAAO,QAAQ,YAAA,CAAa,YAAY,KAAK,MAAA,EAAU;AAAA,IAC9F;AAEA,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,MAAA,EAAU;AAC1C;AAKA,SAAS,qBAAqB,OAAA,EAAqD;AACjF,EAAA,MAAM,SAAS,OAAA,CAAQ,aAAA;AACvB,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAGpB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAC7C,EAAA,MAAM,YAAY,MAAA,CAAO,OAAA;AAEzB,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,UAAA,KAAe,MAAA,IAAU,SAAA,KAAc,IAAA,IAAQ,cAAc,IAAA,EAAM;AACrE,IAAA,aAAA,GAAgB,MAAA;AAAA,EAClB,CAAA,MAAA,IAAW,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,KAAA,EAAO;AACxD,IAAA,aAAA,GAAgB,MAAA;AAAA,EAClB,WAAW,SAAA,KAAc,OAAA,IAAW,SAAA,KAAc,OAAA,IAAW,cAAc,OAAA,EAAS;AAClF,IAAA,aAAA,GAAgB,OAAA;AAAA,EAClB;AAGA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC3C,IAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,MAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAgB,CAAA,EAAG,GAAG,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,EAAE,CAAC,CAAA,CAAA;AACnE,MAAA,MAAM,GAAA,GAAM,UAAU,OAAO,CAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,SAAA,CAAU,CAAC,MAAM,GAAG,CAAA;AAC3D,MAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,QAAA,aAAA,GAAgB,MAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC3C,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,EAAA,MAAM,SAAA,GAAY,YAAY,OAAO,CAAA;AACrC,EAAA,MAAM,mBAAmB,QAAA,CAAS,MAAA;AAAA,IAChC,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAA,IAAW,WAAA,CAAY,CAAC,CAAA,KAAM;AAAA,GACrD;AACA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAG9C,EAAA,MAAM,iBAAA,GAAoB,uBAAuB,MAAM,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,UAAU,OAAO,CAAA;AACzC,EAAA,MAAM,YAAA,GAAe,GAAG,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,EACnD,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,gBAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,EAC3F,CAAA,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,IACxB,YAAY,gBAAA,CAAiB;AAAA,GAC/B;AACF;AAKA,SAAS,uBAAuB,OAAA,EAA8B;AAC5D,EAAA,IAAI,OAAA,CAAQ,IAAI,OAAO,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,EAAA,IAAI,MAAA,EAAQ,OAAO,CAAA,cAAA,EAAiB,MAAM,CAAA,EAAA,CAAA;AAC1C,EAAA,OAAO,OAAA,CAAQ,QAAQ,WAAA,EAAY;AACrC;AASA,SAAS,eAAA,CACP,cAAA,EACA,YAAA,EACA,IAAA,EACA,gBACA,YAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,cAAA,IAAkB,EAAE,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AAG/F,EAAA,IAAI,EAAA,GAAK,UAAA;AACT,EAAA,IAAI,EAAA,GAAK,UAAA;AAET,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,EAAA,IAAM,CAAA;AACN,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AAC7B,IAAA,EAAA,IAAM,CAAA,GAAI,EAAA;AACV,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACpD,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACpD,EAAA,OAAO,IAAA,GAAO,IAAA;AAChB;AAYO,SAAS,0BAA0B,OAAA,EAA8C;AACtF,EAAA,MAAM,cAAA,GAAiB,sBAAsB,OAAO,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,oBAAoB,OAAO,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,EAAA,MAAM,cAAA,GAAiB,sBAAsB,OAAO,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,oBAAoB,OAAO,CAAA;AAChD,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,aAAA,EAAc,GAAI,uBAAuB,OAAO,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,qBAAqB,OAAO,CAAA;AAElD,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,EAAA,GAAK,OAAO,UAAA,IAAc,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,OAAO,WAAA,IAAe,CAAA;AAEjC,EAAA,MAAM,WAAA,GAAsC;AAAA,IAC1C,MAAM,eAAA,CAAgB,cAAA,EAAgB,YAAA,EAAc,IAAA,EAAM,gBAAgB,YAAY,CAAA;AAAA,IACtF,cAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA,EAAiB,QAAA;AAAA,IACjB,IAAA;AAAA,IACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,IACrC,YAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,KAAK,IAAA,CAAK,KAAA,CAAO,KAAK,GAAA,GAAM,EAAA,GAAM,GAAI,CAAA,GAAI,GAAA;AAAA,MAC1C,MAAM,IAAA,CAAK,KAAA,CAAO,KAAK,IAAA,GAAO,EAAA,GAAM,GAAI,CAAA,GAAI;AAAA,KAC9C;AAAA,IACA,aAAa,aAAA,KAAkB;AAAA,GACjC;AAEA,EAAA,IAAI,aAAA,cAA2B,aAAA,GAAgB,aAAA;AAC/C,EAAA,IAAI,cAAA,cAA4B,cAAA,GAAiB,cAAA;AACjD,EAAA,IAAI,aAAA,cAA2B,aAAA,GAAgB,aAAA;AAE/C,EAAA,OAAO,WAAA;AACT;AAmCO,SAAS,+BAA+B,QAAA,EAI7C;AACA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoC;AAC7D,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAsB;AACnD,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAEhD,EAAA,MAAM,QAAA,GAAW,SAAS,cAAA,EAAe;AAEzC,EAAA,KAAA,MAAW,cAAc,QAAA,EAAU;AACjC,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,UAAA,CAAW,QAAQ,WAAA,EAAa;AAE5D,IAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,UAAA,CAAW,OAAO,CAAA;AAEhE,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,EAAG;AACvC,MAAA,YAAA,CAAa,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,MAAM,gBAAA,CAAiB,GAAA,CAAI,WAAA,CAAY,IAAI,KAAK,EAAC;AACvD,IAAA,GAAA,CAAI,IAAA,CAAK,WAAW,EAAE,CAAA;AACtB,IAAA,gBAAA,CAAiB,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA;AAC1C,IAAA,eAAA,CAAgB,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,EAAE,YAAA,EAAc,gBAAA,EAAkB,eAAA,EAAgB;AAC3D;AAMO,SAAS,4BAAA,CACd,QACA,QAAA,EAC+B;AAC/B,EAAA,IAAI,OAAA,GAA8B,MAAA;AAElC,EAAA,OAAO,OAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAQ;AAC5C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA;AACpD,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;;;AC/gBO,IAAM,yBAAN,MAA6B;AAAA,EAmBlC,WAAA,CACE,QAAA,EACA,QAAA,EACA,MAAA,GAAgD,EAAC,EACjD;AAnBF,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAGjB;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,eAAA,GAAkB,EAAA;AAC1B,IAAA,IAAA,CAAQ,iBAAA,GAAmC,IAAA;AAC3C,IAAA,IAAA,CAAQ,sBAAA,GAA6C,IAAA;AAcnD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,IAAA;AAAA,MACjD,mBAAA,EAAqB,OAAO,mBAAA,IAAuB;AAAA,KACrD;AAGA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAGd,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,IAAA,CAAK,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AACrF,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,IAAA,CAAK,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AACrF,IAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,IAAA,CAAK,YAAA,EAAc,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AACvF,IAAA,QAAA,CAAS,gBAAA,CAAiB,UAAU,IAAA,CAAK,YAAA,EAAc,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AACvF,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,IAAA,CAAK,aAAA,EAAe,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC3F;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAGd,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAE1B,IAAA,QAAA,CAAS,oBAAoB,OAAA,EAAS,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AACzE,IAAA,QAAA,CAAS,oBAAoB,OAAA,EAAS,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AACzE,IAAA,QAAA,CAAS,oBAAoB,QAAA,EAAU,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3E,IAAA,QAAA,CAAS,oBAAoB,QAAA,EAAU,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3E,IAAA,QAAA,CAAS,oBAAoB,SAAA,EAAW,IAAA,CAAK,eAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC/E;AAAA,EAEQ,cACN,SAAA,EACoD;AACpD,IAAA,IAAI,EAAE,SAAA,YAAqB,WAAA,CAAA,EAAc,OAAO,IAAA;AAEhD,IAAA,MAAM,UAAA,GAAa,4BAAA,CAA6B,SAAA,EAAW,IAAA,CAAK,QAAQ,CAAA;AACxE,IAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,oBAAoB,OAAO,IAAA;AAC1D,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,IAAA,OAAO,EAAE,SAAA,EAAW,UAAA,CAAW,EAAA,EAAI,OAAA,EAAS,WAAW,OAAA,EAAQ;AAAA,EACjE;AAAA,EAEQ,IAAA,CACN,UAAA,EACA,SAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA;AAAA,MACA,eAAA,EAAiB,SAAA;AAAA,MACjB,aAAA,EAAe,OAAA;AAAA,MACf;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,QAAQ,CAAA,EAAqB;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,cAAc,gBAAA,KAAqB,EAAA,CAAG,SAAS,UAAA,IAAc,EAAA,CAAG,SAAS,OAAA,CAAA,EAAU;AAEvF,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,EACrD;AAAA,EAEQ,QAAQ,CAAA,EAAgB;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,EAAE,EAAA,YAAc,gBAAA,IAAoB,EAAA,YAAc,mBAAA,CAAA,EAAsB;AAG5E,IAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,MAAA,CAAO,SAAA,EAAW;AAE/C,MAAA,IAAA,CAAK,kBAAkB,EAAA,CAAG,KAAA;AAAA,IAC5B,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,SAAA;AAChC,MAAA,IAAA,CAAK,yBAAyB,MAAA,CAAO,OAAA;AACrC,MAAA,IAAA,CAAK,kBAAkB,EAAA,CAAG,KAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AACzD,IAAA,IAAA,CAAK,cAAA,GAAiB,UAAA;AAAA,MACpB,MAAM,KAAK,oBAAA,EAAqB;AAAA,MAChC,KAAK,MAAA,CAAO;AAAA,KACd;AAAA,EACF;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAEA,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,sBAAA,IAA0B,KAAK,eAAA,EAAiB;AACjF,MAAA,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,mBAAmB,IAAA,CAAK,sBAAA,EAAwB,KAAK,eAAe,CAAA;AAAA,IAC7F;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAA;AAAA,EACzB;AAAA,EAEQ,SAAS,CAAA,EAAgB;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAElB,IAAA,IAAI,cAAc,iBAAA,EAAmB;AACnC,MAAA,IAAA,CAAK,KAAK,QAAA,EAAU,MAAA,CAAO,WAAW,MAAA,CAAO,OAAA,EAAS,GAAG,KAAK,CAAA;AAAA,IAChE,CAAA,MAAA,IAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,IAAI,EAAA,CAAG,SAAS,UAAA,EAAY;AAC1B,QAAA,IAAA,CAAK,IAAA;AAAA,UACH,EAAA,CAAG,UAAU,OAAA,GAAU,SAAA;AAAA,UACvB,MAAA,CAAO,SAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,GAAG,OAAO;AAAA,SACnB;AAAA,MACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,OAAA,EAAS;AAC9B,QAAA,IAAA,CAAK,KAAK,OAAA,EAAS,MAAA,CAAO,WAAW,MAAA,CAAO,OAAA,EAAS,GAAG,KAAK,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,CAAA,EAAgB;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAE1B,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,EACtD;AAAA,EAEQ,UAAU,CAAA,EAAwB;AAExC,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,QAAA,EAAU;AAE7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAErB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AAGV,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,IACtD;AAAA,EAEF;AACF,CAAA;;;AC5KO,IAAM,0BAAN,MAA8B;AAAA,EA0CnC,YACE,QAAA,EACA,cAAA,GAAwC,IAAA,EACxC,MAAA,GAAiC,EAAC,EAClC;AA7BF;AAAA,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,IAAA,IAAA,CAAQ,WAAA,GAA6C,IAAA;AACrD,IAAA,IAAA,CAAQ,aAAA,GAAuD,IAAA;AAG/D;AAAA,IAAA,IAAA,CAAQ,WAA8B,EAAC;AACvC,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAAoC;AAClE,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAAoB;AAClD,IAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAAsB;AACrD,IAAA,IAAA,CAAQ,eAAsC,EAAC;AAC/C,IAAA,IAAA,CAAQ,cAAsC,EAAC;AAC/C,IAAA,IAAA,CAAQ,YAAiC,EAAC;AAG1C;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAA;AAC1B,IAAA,IAAA,CAAQ,aAAA,GAA+B,IAAA;AAGvC;AAAA,IAAA,IAAA,CAAQ,sBAGH,EAAC;AAOJ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,UAAA,EAAY,OAAO,UAAA,IAAc,GAAA;AAAA,MACjC,WAAA,EAAa,OAAO,WAAA,IAAe,GAAA;AAAA,MACnC,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,IAAA;AAAA,MACjD,mBAAA,EAAqB,OAAO,mBAAA,IAAuB,GAAA;AAAA,MACnD,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,GAAA;AAAA,MACjD,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,EAAuC;AAC3C,IAAA,IAAI,KAAK,MAAA,EAAQ;AAGjB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,MAAA,GAAS;AAAA,QACZ,GAAG,IAAA,CAAK,MAAA;AAAA,QACR,GAAG;AAAA,OACL;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAGd,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,gBAAA,uBAAuB,GAAA,EAAI;AAChC,IAAA,IAAA,CAAK,eAAe,EAAC;AACrB,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAGrB,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAG1B,IAAA,IAAA,CAAK,cAAc,IAAI,sBAAA;AAAA,MACrB,IAAA,CAAK,QAAA;AAAA,MACL,CAAC,KAAA,KAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAAA,MACnC;AAAA,QACE,kBAAA,EAAoB,KAAK,MAAA,CAAO,kBAAA;AAAA,QAChC,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA;AACnC,KACF;AACA,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAGvB,IAAA,IAAI,KAAK,MAAA,CAAO,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,qBAAqB,CAAA,EAAG;AAChE,MAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,MAAM;AACrC,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAK,WAAA,EAAY;AACvC,UAAA,IAAA,CAAK,MAAA,CAAO,aAAa,aAAa,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,kBAAkB,CAAA;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,IAAA,GAA+B;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,SAAA,EAAW;AACnC,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,mBAAA,EAAqB;AAC9C,MAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,MAAA,OAAA,CAAQ,WAAA,IAAc;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,sBAAsB,EAAC;AAG5B,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAGxB,IAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AAEnC,IAAA,MAAM,MAAA,GAAiC;AAAA,MACrC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,gBAAA,EAAkB,KAAK,YAAA,CAAa,MAAA;AAAA,MACpC,YAAA,EAAc,KAAK,QAAA,CAAS;AAAA,KAC9B;AAGA,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAA6B;AAC3B,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,KAAK,SAAA,IAAa,MAAA;AAAA,MAC7B,UAAU,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,EAAI,GAAI,KAAK,SAAA,GAAY,CAAA;AAAA,MACtD,gBAAA,EAAkB,KAAK,YAAA,CAAa,MAAA;AAAA,MACpC,YAAA,EAAc,KAAK,QAAA,CAAS;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,KAAA,EAA+B;AACnD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAGlB,IAAA,MAAM,eAAA,GAAkB,KAAK,sBAAA,EAAuB;AAIpD,IAAA,MAAM,aAAA,GAAgB,KAAA;AAEtB,IAAA,IAAA,CAAK,cAAc,MAAM;AACvB,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAGlB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAGhD,MAAA,MAAM,oBAAoB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,aAAA,CAAc,eAAe,CAAA,IAAK,IAAA;AAGrF,MAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,eAAe,CAAA;AACxE,MAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,cAAc,CAAA;AACtE,MAAA,MAAM,YAAY,IAAI,GAAA,CAAI,aAAA,EAAe,iBAAA,IAAqB,EAAE,CAAA;AAChE,MAAA,MAAM,WAAW,IAAI,GAAA,CAAI,YAAA,EAAc,iBAAA,IAAqB,EAAE,CAAA;AAE9D,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA;AAGjE,MAAA,MAAM,gBAAA,GAAyC;AAAA,QAC7C,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,QAC7B,YAAY,aAAA,CAAc,UAAA;AAAA,QAC1B,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,cAAA;AAAA,QACA,oBAAA,EAAsB,QAAA;AAAA,QACtB,uBAAA,EAAyB,WAAA;AAAA,QACzB,WAAW,aAAA,CAAc;AAAA,OAC3B;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAGtC,MAAA,MAAM,QAAA,GAAgC;AAAA,QACpC,IAAI,gBAAA,CAAiB,QAAA;AAAA,QACrB,WAAW,aAAA,CAAc,SAAA;AAAA,QACzB,YAAY,aAAA,CAAc,UAAA;AAAA,QAC1B,iBAAA;AAAA,QACA,iBAAiB,aAAA,CAAc,eAAA;AAAA,QAC/B,eAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAO,aAAA,CAAc;AAAA,OACvB;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,QAAQ,CAAA;AAG/B,MAAA,IACE,cAAc,KAAA,KACb,aAAA,CAAc,eAAe,MAAA,IAAU,aAAA,CAAc,eAAe,QAAA,CAAA,EACrE;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,eAAe,iBAAiB,CAAA;AAAA,MACtD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,GAAiC;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,GAAA,GAAM,IAAA,CAAK,kBAAkB,GAAA,EAAK;AAC1D,MAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IACd;AACA,IAAA,OAAO,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,QAAA,EAA4B;AAChD,IAAA,IAAI,KAAK,cAAA,EAAgB;AAEvB,MAAA,IAAI,aAAA;AAEJ,MAAA,IAAI,WAAA;AACJ,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,aAAA,EAAgB,aAAa,MAAA,EAAsC;AAE1F,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,WAAA,IAAc;AAEd,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAQ,KAAK,CAAA;AAClD,QAAA,IAAI,OAAO,CAAA,EAAG,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAC,CAAA;AACpD,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAEA,MAAA,MAAM,cAAc,MAAM;AACxB,QAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,QAAA,aAAA,GAAgB,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAC3D,QAAA,KAAA,CAAM,KAAA,GAAQ,aAAA;AAAA,MAChB,CAAA;AAEA,MAAA,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAM;AAChD,QAAA,WAAA,EAAY;AAAA,MACd,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,WAAA,GAAc,WAAA;AAEpB,MAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,KAAK,CAAA;AACnC,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,MAAO;AAEL,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,MAAM,GAAA,GAAM,KAAK,mBAAA,CAAoB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvE,QAAA,IAAI,OAAO,CAAA,EAAG,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAC,CAAA;AACpD,QAAA,QAAA,EAAS;AAAA,MACX,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AACzB,MAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,YAAA,EAA8B;AAChD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,IAAA,CAAK,OAAO,WAAA,EAAa;AAEnD,MAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,WAAA,EAAa;AAChC,QAAA,aAAA,CAAc,GAAA,CAAI,EAAE,eAAe,CAAA;AACnC,QAAA,aAAA,CAAc,GAAA,CAAI,EAAE,cAAc,CAAA;AAAA,MACpC;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,aAAA,CAAc,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,CAAE,EAAE,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAC,EAAE,EAAE,CAAA;AAE1F,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACxE,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEnC,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,YAAA,EAAc,gBAAA,EAAkB,eAAA,EAAgB,GAAI,8BAAA;AAAA,MAC1D,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,YAAA,EAAc;AACrC,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,MACnC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,IACrC;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,eAAA,EAAiB;AACxC,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,SAAA,GAAY,WAAW,SAAS,CAAA;AACtC,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,EAAA,EAAI,SAAA;AAAA,MACJ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,GAAA,EAAK,OAAO,QAAA,CAAS,IAAA;AAAA,MACrB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,iBAAA,EAAmB,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAM;AAAA,KACnD;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAC1B,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,SAAA;AAC/B,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AAErB,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,OAAyB,WAAA,EAAkC;AAChF,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,KAAA,CAAM,KAAA,EAAO;AAGlC,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,WAAA,KAAgB,WAAW,CAAA,EAAG;AAE7D,MAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,WAAW,CAAA;AACzE,MAAA,IAAI,QAAA,EAAU,QAAA,CAAS,YAAA,GAAe,KAAA,CAAM,KAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,aAAA;AACjB,IAAA,MAAM,SAAA,GACJ,EAAA,YAAc,gBAAA,GACV,EAAA,CAAG,IAAA,GACH,cAAc,iBAAA,GACZ,QAAA,GACA,EAAA,YAAc,mBAAA,GACZ,UAAA,GACA,MAAA;AAGV,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAErC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK;AAAA,MAClB,WAAA;AAAA,MACA,WAAW,KAAA,CAAM,eAAA;AAAA,MACjB,SAAA;AAAA,MACA,cAAc,KAAA,CAAM,KAAA;AAAA,MACpB,KAAA;AAAA,MACA,kBAAA,EAAoB,iBAAiB,KAAK;AAAA,KAC3C,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,EAAA,EAAyB;AAE/C,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,IAAA,IAAI,WAAW,OAAO,SAAA;AAGtB,IAAA,IAAI,GAAG,EAAA,EAAI;AACT,MAAA,MAAM,KAAA,GAAQ,SAAS,aAAA,CAAc,CAAA,WAAA,EAAc,IAAI,MAAA,CAAO,EAAA,CAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACxE,MAAA,IAAI,OAAO,WAAA,EAAa,IAAA,IAAQ,OAAO,KAAA,CAAM,YAAY,IAAA,EAAK;AAAA,IAChE;AACA,IAAA,MAAM,aAAA,GAAgB,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,eAAe,WAAA,EAAa,IAAA,IAAQ,OAAO,aAAA,CAAc,YAAY,IAAA,EAAK;AAG9E,IAAA,IAAI,EAAA,YAAc,gBAAA,IAAoB,EAAA,YAAc,mBAAA,EAAqB;AACvE,MAAA,IAAI,EAAA,CAAG,WAAA,EAAa,OAAO,EAAA,CAAG,WAAA;AAAA,IAChC;AAGA,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,IAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,GAAsC;AAC5C,IAAA,MAAM,uBAAuB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAGnE,IAAA,MAAM,qBAA6D,EAAC;AACpE,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC7C,MAAA,kBAAA,CAAmB,IAAI,CAAA,GAAI,EAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,cAAA,GAA4C,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1E,WAAW,CAAA,CAAE,EAAA;AAAA,MACb,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,cAAc,CAAA,CAAE;AAAA,KAClB,CAAE,CAAA;AAGF,IAAA,MAAM,qBAA6D,EAAC;AACpE,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,MAAM,SAAS,OAAA,CAAQ,iBAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC1C,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,IAAI,CAAC,kBAAA,CAAmB,CAAC,GAAG,kBAAA,CAAmB,CAAC,IAAI,EAAC;AACrD,UAAA,IAAI,CAAC,kBAAA,CAAmB,CAAC,GAAG,kBAAA,CAAmB,CAAC,IAAI,EAAC;AACrD,UAAA,kBAAA,CAAmB,CAAC,EAAE,CAAC,CAAA,GAAA,CAAK,mBAAmB,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA;AAC7D,UAAA,kBAAA,CAAmB,CAAC,EAAE,CAAC,CAAA,GAAA,CAAK,mBAAmB,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAsD;AACvF,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,iBAAiB,CAAA;AACjD,MAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,IAAI,OAAA,GAAU,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,EAAC;AACX,UAAA,oBAAA,CAAqB,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,QACxC;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAI,SAAA,EAAW,OAAA,CAAQ,WAAW,CAAA;AAAA,MAC/D;AAAA,IACF;AAGA,IAAA,MAAM,mBAAyD,EAAC;AAChE,IAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,MAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,GAAA,CAAI,IAAI,KAAK,EAAC;AACnD,MAAA,IAAI,SAAA,GAAY,QAAA;AAChB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,aAAuB,EAAC;AAE9B,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,UAAA,CAAW,IAAA,CAAK,MAAM,EAAE,CAAA;AACxB,QAAA,IAAI,KAAA,CAAM,SAAA,GAAY,SAAA,EAAW,SAAA,GAAY,KAAA,CAAM,SAAA;AACnD,QAAA,IAAI,KAAA,CAAM,SAAA,GAAY,QAAA,EAAU,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA,MACnD;AAEA,MAAA,gBAAA,CAAiB,IAAI,CAAA,GAAI;AAAA,QACvB,kBAAkB,UAAA,CAAW,MAAA;AAAA,QAC7B,UAAA;AAAA,QACA,SAAA,EAAW,SAAA,KAAc,QAAA,GAAW,CAAA,GAAI,SAAA;AAAA,QACxC;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,oBAAA,EAAsB,oBAAoB,CAAA;AAE9F,IAAA,OAAO;AAAA,MACL,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,MACrB,eAAA,EAAiB,oBAAA;AAAA,MACjB,kBAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,sBAAA,CACN,WACA,oBAAA,EACsB;AAEtB,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAsB;AAElD,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAE5B,MAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,GAAA,CAAI,IAAI,KAAK,EAAC;AACnD,MAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,EAAE,IAAA,EAAK;AACjD,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAErC,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,EAAC;AACjD,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,eAAA,CAAgB,GAAA,CAAI,WAAW,KAAK,CAAA;AAAA,IACtC;AAGA,IAAA,MAAM,aAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,eAAA,EAAiB;AACvC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAGtB,MAAA,MAAM,KAAA,GAAQ,KAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG,YAAY,CAAA,CACpD,OAAO,OAAO,CAAA;AACjB,MAAA,MAAM,SAAA,GAAY,KAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG,eAAe,CAAA,CACvD,OAAO,OAAO,CAAA;AAEjB,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,YAAA,EAAc,MAAM,IAAA,EAAK;AAAA,QACzB,gBAAA,EAAkB,CAAA;AAAA;AAAA,QAClB,YAAA,EAAc,aAAa,KAAK,CAAA;AAAA,QAChC,eAAA,EAAiB,aAAa,SAAS;AAAA,OACxC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AACF,CAAA;AAMA,IAAI,SAAA,GAAY,CAAA;AAEhB,SAAS,WAAW,MAAA,EAAwB;AAC1C,EAAA,SAAA,EAAA;AACA,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAA,EAAK,IAAI,SAAS,CAAA,CAAA;AAC7C;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,OACE,KAAA,CACG,QAAQ,iBAAA,EAAmB,EAAE,EAC7B,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,CAAA,KACV,MAAM,CAAA,GAAI,IAAA,CAAK,aAAY,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAK,KAAA,CAAM,CAAC,EAAE,WAAA;AAAY,GAC1F,CACC,IAAA,CAAK,EAAE,CAAA,IAAK,OAAA;AAEnB;AAEA,SAAS,aAAa,KAAA,EAAqC;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAA,CAAO,IAAI,IAAA,EAAA,CAAO,MAAA,CAAO,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,IAAA,GAAO,MAAM,CAAC,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,EAAQ;AAClC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;ACxkBA,SAASC,WAAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACjE;AAKA,IAAM,OAAA,GAAU,OAAA;AAKT,IAAM,oBAAN,MAAwB;AAAA,EAQ7B,WAAA,CACE,QAAA,EACA,OAAA,GAQI,EAAC,EACL;AAjBF,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAA6B;AAGnD,IAAA,IAAA,CAAQ,gBAAA,GAAmD,IAAA;AAC3D,IAAA,IAAA,CAAQ,mBAAA,GAAqD,IAAA;AAc3D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AAClC,IAAA,IAAA,CAAK,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AAGlC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,IAAA,CAAK,mBAAmB,IAAI,uBAAA;AAAA,QAC1B,QAAQ,SAAA,CAAU,QAAA;AAAA,QAClB,OAAA,CAAQ,UAAU,cAAA,IAAkB,IAAA;AAAA,QACpC;AAAA;AAAA,UAEE,UAAA,EAAY,CAAC,aAAA,KAAkB;AAC7B,YAAA,IAAA,CAAK,mBAAA,GAAsB,aAAA;AAAA,UAC7B;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,gBAAA,CAAiB,IAAmB,WAAA,EAA8B;AAChE,IAAA,MAAM,QAAA,GAAW,eAAe,WAAA,CAAY,IAAA,KAAS,WAAA,CAAY,IAAA,KAASA,WAAAA,EAAW;AAKrF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,EAAA,KAAO,EAAA,EAAI;AAClC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,GAAG,KAAA,IAAQ;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA;AAAA,MACA,YAAA,EAAc,UAAU,YAAA,IAAgB;AAAA,QACtC,MAAA,sBAAY,GAAA,EAAI;AAAA,QAChB,UAAA,sBAAgB,GAAA,EAAI;AAAA,QACpB,YAAA,sBAAkB,GAAA;AAAI,OACxB;AAAA,MACA,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAEjC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,YAAA,EAAe,WAAW,SAAA,GAAY,WAAW,KAAK,QAAQ,CAAA,CAAA,IAC3D,cAAc,uBAAA,GAA0B,EAAA;AAAA,OAC7C;AAAA,IACF;AAGA,IAAA,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAA4B;AAC1C,MAAA,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,KAAA,CAAM,IAAI,CAAA;AAAA,IACzC,CAAA;AAIA,IAAA,EAAA,CAAG,UAAU,MAAM;AACjB,MAAA,IAAA,CAAK,gBAAA,CAAiB,UAAU,EAAE,CAAA;AAAA,IACpC,CAAA;AAGA,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,OAAA;AAAA,QACT,QAAA,EAAU;AAAA,UACR,SAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,QACA;AAAA;AACF,KACmB,CAAA;AAErB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CAAiB,UAAkB,EAAA,EAA0B;AAC3D,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACzC,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,EAAA,KAAO,EAAA,EAAI;AAEhC,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAE5B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CAAc,QAAA,EAAkB,IAAA,EAA6B;AACzE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC3B,SAAS,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAA,EAAW,aAAA,EAAe,sBAAsB,CAAA;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,IAAI,CAAA,KAAA,EAAQ,QAAQ,CAAA,IAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,QAAQ,QAAQ,IAAA;AAAM,QACpB,KAAK,MAAA;AACH,UAAA,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,EAAE,CAAA;AACpC,UAAA;AAAA,QAEF,KAAK,WAAA;AACH,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAA;AAC5C,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA;AAC9C,UAAA;AAAA,QAEF,KAAK,MAAA;AACH,UAAA,MAAM,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA;AACvC,UAAA;AAAA,QAEF,KAAK,UAAA;AAEH,UAAA,MAAM,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,OAAwD,CAAA;AACxF,UAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AAC7C,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA;AAC9C,UAAA;AAAA,QAEF,KAAK,eAAA;AACH,UAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAChD,UAAA;AAAA,QAEF,KAAK,wBAAA;AACH,UAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,QAAA,EAAU,OAAO,CAAA;AACzD,UAAA;AAAA,QAEF,KAAK,iBAAA;AACH,UAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA;AAClD,UAAA;AAAA,QAEF,KAAK,mBAAA;AACH,UAAA,MAAM,IAAA,CAAK,uBAAA,CAAwB,QAAA,EAAU,OAAO,CAAA;AACpD,UAAA;AAAA,QAEF,KAAK,aAAA,EAAe;AAElB,UAAA,MAAM,gBAAiB,OAAA,CAAmD,OAAA;AAC1E,UAAA,IAAA,CAAK,cAAA;AAAA,YACH;AAAA,cACE,IAAA,EAAM,kBAAA;AAAA,cACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,cACpB,IAAA,EAAM,iBAAiB;AAAC,aAC1B;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,iBAAA;AACH,UAAA,IAAA,CAAK,oBAAA,CAAqB,UAAU,OAAO,CAAA;AAC3C,UAAA;AAAA,QAEF,KAAK,gBAAA;AACH,UAAA,IAAA,CAAK,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAC1C,UAAA;AAAA,QAEF,KAAK,kBAAA;AACH,UAAA,IAAA,CAAK,qBAAA,CAAsB,UAAU,OAAO,CAAA;AAC5C,UAAA;AAAA,QAEF,KAAK,oBAAA;AACH,UAAA,IAAA,CAAK,uBAAA,CAAwB,UAAU,OAAO,CAAA;AAC9C,UAAA;AAAA,QAEF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,sBAAA,CAAuB,UAAU,OAAO,CAAA;AAC7C,UAAA;AAAA,QAEF;AACE,UAAA,IAAA,CAAK,SAAA;AAAA,YACH,QAAA;AAAA,YACC,OAAA,CAA4B,EAAA;AAAA,YAC7B,iBAAA;AAAA,YACA,CAAA,sBAAA,EAA0B,QAA4B,IAAI,CAAA;AAAA,WAC5D;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,UAAU,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,eAAA,EAAiB,IAAI,OAAO,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CAAW,UAAkB,UAAA,EAA0B;AAC7D,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA;AAAI,KACJ,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,YAAA,KAAiB,OAAA,CAAQ,OAAA;AAGrD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtC;AAAA,IACF;AACA,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,QAAA,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,QAAA,MAAA,CAAO,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,aAAa,MAAM;AAAA;AAC/C,KACsB,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,CAAQ,OAAA;AAE3B,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,aAAA,GAAgB,MAAA,CAAO,OAAO,CAAC,CAAA,KAAuB,OAAO,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AACvF,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,MACzC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AACrD,MAAA,MAAA,CAAO,YAAA,CAAa,OAAO,KAAA,EAAM;AACjC,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,KAAA,EAAM;AACrC,MAAA,MAAA,CAAO,YAAA,CAAa,aAAa,KAAA,EAAM;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,cAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACwB,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,QAAW,4BAA4B,CAAA;AACtF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAE7D,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IAClF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,IAAI,KAAA,EAAO,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,OAAA;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY;AAC7B,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,QAAW,kCAAkC,CAAA;AAC5F,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,WAAW,SAAS,CAAA;AAEvD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,EAAE,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,IAAI,KAAA,EAAO,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAoB;AACrC,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAmB;AAEtD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,OAAO,IAAI,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,IAAI,KAAA,EAAO,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,OAAA,CAAQ,OAAA;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,oBAAA,EAAsB;AACvC,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,oBAAA,CAAqB,WAAW,MAAM,CAAA;AAEzE,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,4BAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,MAAA,KAAW,OAAA,CAAQ,OAAA;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,sBAAA,EAAwB;AACzC,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,uBAAuB,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAEzF,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,OAAA,CAAQ,OAAA;AAIvC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,UAAA,EAAY,EAAE,QAAQ,CAAA;AAErE,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAA,CACZ,QAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAmB;AACpC,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,WAAW,OAAO,CAAA;AAEvE,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,EAAE,OAAA,EAAS,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAa,QAAA,EAAU,OAAA,CAAQ,IAAI,KAAA,EAAO,MAAA,EAAW,OAAO,KAAK,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,CAAe,OAAoB,eAAA,EAAgC;AACjE,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC7C,MAAA,IAAI,aAAa,eAAA,EAAiB;AAElC,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,IAAA,KAAS,CAAA,IAAK,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAEvF,QAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAExB,QAAA,IACE,SAAA,CAAU,SAAA,IACV,MAAA,CAAO,YAAA,CAAa,WAAW,IAAA,GAAO,CAAA,IACtC,CAAC,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,EACvD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IACE,SAAA,CAAU,WAAA,IACV,MAAA,CAAO,YAAA,CAAa,aAAa,IAAA,GAAO,CAAA,IACxC,CAAC,MAAA,CAAO,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,WAAW,CAAA,EAC3D;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,UAC1B,IAAIA,WAAAA,EAAW;AAAA,UACf,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,OAAA,EAAS;AAAA,SACQ,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,UAAkB,OAAA,EAAgC;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,eAAe,CAAA,EAAG;AAE3C,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAEtC,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ;AAC3C,QAAA,IAAA,CAAK,IAAI,CAAA,KAAA,EAAQ,QAAQ,CAAA,IAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,QAAA,EACA,SAAA,EACA,OAAA,EACA,MACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AACF,KACuB,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CACN,QAAA,EACA,SAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAa,QAAA,EAAU;AAAA,MAC1B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA;AAAA,QACA;AAAA;AACF,KACiB,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAsB;AACxB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AAC9C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAG,KAAA,EAAM;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,CAAqB,UAAkB,OAAA,EAAgC;AAC7E,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,SAAA;AAAA,QACH,QAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,uBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,QAAsD,OAAA,EAAS,MAAA;AAC/E,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,MAAM,CAAA;AAClC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAU;AAC/C,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,MAAM,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,UAAU,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,uBAAA,EAAyB,IAAI,OAAO,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAEQ,mBAAA,CAAoB,UAAkB,OAAA,EAAgC;AAC5E,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,yBAAyB,0BAA0B,CAAA;AACxF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,MAAM,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,UAAU,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,sBAAA,EAAwB,IAAI,OAAO,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,qBAAA,CAAsB,UAAkB,OAAA,EAAgC;AAC9E,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM;AAAA,QAC5C,MAAA,EAAQ,KAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,gBAAA,EAAkB,CAAA;AAAA,QAClB,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAU;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,MAAM,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAA,CAAwB,UAAkB,OAAA,EAAgC;AAChF,IAAA,IAAI;AACF,MAAA,MAAM,UACJ,OAAA,CACA,OAAA;AACF,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,IAAA,CAAK,sBAAsB,OAAA,CAAQ,UAAA;AACnC,QAAA,IAAA,CAAK,YAAA,CAAa,UAAU,OAAA,CAAQ,EAAA,EAAI,MAAM,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA;AAAA,UACH,QAAA;AAAA,UACA,OAAA,CAAQ,EAAA;AAAA,UACR,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,UAAU,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,gBAAA,EAAkB,IAAI,OAAO,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAA,CAAuB,UAAkB,OAAA,EAAgC;AAC/E,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM;AAAA,QAC5C,SAAA,EAAW,IAAA;AAAA,QACX,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM;AAAA,QAC5C,SAAA,EAAW,KAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;;;AC1tBO,SAAS,uBAAA,CACd,WACA,MAAA,EAC8B;AAC9B,EAAA,MAAM,MAAM,MAAA,EAAQ,GAAA;AAEpB,EAAA,OAAO,CAAC,KAAA,KAAuB;AAC7B,IAAA,IAAI,SAAA,CAAU,gBAAgB,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,4BAA4B,KAAA,CAAM,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,WAAW,CAAA,UAAA,CAAY,CAAA;AAAA,IACpF;AAEA,IAAA,SAAA,CAAU,eAAe,KAAK,CAAA;AAAA,EAChC,CAAA;AACF;;;AC3CO,IAAM,aAAN,MAAiB;AAAA,EAKtB,WAAA,GAAc;AAJd,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAAuB;AAC7C,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA,IAAA,CAAQ,iBAAA,GAA2D,IAAA;AAIjE,IAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,MAAM;AACzC,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB,GAAG,IAAM,CAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAA,CACE,KAAA,EACA,KAAA,EACA,UAAA,EACA,aAAA,EACQ;AACR,IAAA,MAAM,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEtE,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AACvC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,QAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,QAAA,IAAI,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,OAA0B,CAAA;AAAA,MACnD;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,MAAW,CAAA,IAAK,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA,EAAG;AACxC,QAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,QAAA,IAAI,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAoB;AAAA,MACxB,EAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AAG3B,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAA,EAAa;AAAA,MACrC,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,QACP,OAAO,KAAA,CAAM,IAAA,GAAO,IAAI,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AAAA,QAC5C,UAAU,QAAA,CAAS,IAAA,GAAO,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI;AAAA;AACvD,KACD,CAAA;AAED,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,EAAA,EAAkB;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAA0B;AAClC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AAE7B,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,MAAM,SAAA,GAAY,SAAA,EAAW,SAAA,IAAa,SAAA,EAAW,EAAA;AAErD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAE1C,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,GAAO,CAAA,IAAK,CAAC,OAAO,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACpE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,aAAA,CAAc,IAAA,GAAO,CAAA,IAAK,SAAA,IAAa,CAAC,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACtF,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AACpC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA,EAIQ,YAAA,CAAa,MAAA,EAAmB,SAAA,EAAmB,IAAA,EAAqB;AAC9E,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,CAAK,QAAA;AAClB,IAAA,MAAM,OAAA,GAAU,UAAU,SAAS;AAAA,MAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA,IAAA,EAAS,EAAE;;AAAA,CAAA;AAC7E,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,OAAA,GAAU,CAAA;AAAA,MAAA,EAA2B,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAC;;AAAA,CAAA;AAChH,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACxB;AAAA,EACF;AACF,CAAA;;;ACtJA,IAAM,cAAA,GAEF;AAAA,EACF,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,IAAA;AAAA,EACf,KAAK,OAAA,CAAQ;AACf,CAAA;AAKA,SAAS,SAAA,CAAU,OAAuB,IAAA,EAAmC;AAC3E,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,OAAA;AAC1D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM,oBAAA,CAAqB,IAAA,EAAM,OAAO,CAAA;AAAA,IACxC,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAMO,IAAM,mBAAN,MAAuB;AAAA,EAY5B,WAAA,CAAY,QAAA,EAA2C,MAAA,GAAiC,EAAC,EAAG;AAX5F,IAAA,IAAA,CAAQ,MAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,QAAA,GAAoB,IAAA;AAM5B,IAAA,IAAA,CAAQ,SAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,aAAA,uBAAwC,GAAA,EAAI;AAIlD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,EAAW;AAGjC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,iBAAA,CAAkB,QAAA,EAAoC;AAAA,QACzE,OAAA,EAAS,IAAA;AAAA,QACT,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA4B;AAClC,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAEhC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,GAAA,KAAQ;AAClD,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAAA,IACnC,CAAC,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,SAAA,EAAW;AAC3C,MAAA,MAAM,KAAK,oBAAA,EAAqB;AAAA,IAClC;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAA,CAAK,MAAA,CAAQ,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM;AAC5D,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,UACV,wCAAwC,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,SAC9E;AACA,QAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,KAAK,MAAA,CAAO,IAAA;AACxD,UAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,YACV,CAAA,6CAAA,EAAgD,IAAA,CAAK,MAAA,CAAO,IAAI,IAAI,MAAM,CAAA;AAAA,WAC5E;AAAA,QACF;AACA,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,GAAsC;AAClD,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,IAAI,CAAA;AAE7C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,KAAK,MAAA,CAAO,IAAA;AACxD,MAAA,MAAM,WAAA,GAAc,MAAA,KAAW,IAAA,CAAK,MAAA,CAAO,IAAA;AAE3C,MAAA,IAAI,WAAA,IAAe,KAAK,MAAA,EAAQ;AAE9B,QAAA,IAAA,CAAK,WAAW,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC7D,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB;AAAA,UAClC,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,UAClB,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AASjB,MAAA,GAAA,CAAI,EAAA,CAAG,YAAA,EAAc,CAAC,EAAA,EAAI,OAAA,KAAY;AACpC,QAAA,IAAA,CAAK,aAAA,CAAc,IAAI,EAAE,CAAA;AAGzB,QAAA,IAAI,WAAA;AACJ,QAAA,MAAM,SAAS,OAAA,EAAS,GAAA;AACxB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI;AAEF,YAAA,WAAA,GAAc,IAAI,IAAI,MAAA,EAAQ,kBAAkB,EAAE,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,KAAA,CAAA;AAAA,UACjF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,IAAA,CAAK,SAAA,CAAW,gBAAA,CAAiB,EAAA,EAAI,WAAW,CAAA;AAEhD,QAAA,EAAA,CAAG,UAAU,MAAM;AACjB,UAAA,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,QAC9B,CAAA;AAAA,MACF,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACzB,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,wBAAA,EAA2B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5D,CAAC,CAAA;AAAA,IACH,SAAS,MAAA,EAAQ;AAEf,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAE1B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,aAAA,EAAc;AAAA,IAC/B;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAGA,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,aAAA,EAAe;AACnC,MAAA,EAAA,CAAG,KAAA,EAAM;AAAA,IACX;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAGzB,IAAA,IAAA,CAAK,WAAW,OAAA,EAAQ;AAExB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,GAAA,KAAQ;AACzB,QAAA,IAAI,GAAA,SAAY,GAAG,CAAA;AAAA,aACd,OAAA,EAAQ;AAAA,MACf,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,GAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,IAAO,KAAK,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,KAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,YAAA;AAGzC,IAAA,IAAI,IAAA,CAAK,OAAO,IAAA,EAAM;AACpB,MAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,GAAG,CAAA;AAChD,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,iCAAiC,CAAA;AAC/E,MAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,6BAA6B,CAAA;AAAA,IAC7E;AAGA,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,GAAA,EAAI;AACR,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,QAAA,KAAa,SAAA,IAAa,GAAA,CAAI,aAAa,SAAA,EAAW;AAC5D,MAAA,MAAM,iBAA0C,EAAE,MAAA,EAAQ,MAAM,SAAA,EAAW,IAAA,CAAK,KAAI,EAAE;AAGtF,MAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACvB,QAAA,MAAM,QAAA,GAAoC;AAAA,UACxC,OAAA,EAAS,OAAA;AAAA,UACT,GAAG,KAAK,MAAA,CAAO,OAAA;AAAA,UACf,YAAA,EAAc,KAAK,eAAA;AAAgB,SACrC;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,kBAAA,IAAqB;AAChE,UAAA,IAAI,cAAA,EAAgB,OAAA,IAAW,cAAA,CAAe,IAAA,EAAM;AAClD,YAAA,MAAM,OAAO,cAAA,CAAe,IAAA;AAI5B,YAAA,QAAA,CAAS,YAAA,GAAe,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU,CAAA;AACjD,YAAA,QAAA,CAAS,cAAA,GAAiB,IAAA,CAAK,UAAA,EAAY,MAAA,IAAU,CAAA;AAAA,UACvD;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,cAAA,CAAe,QAAA,GAAW,QAAA;AAAA,MAC5B;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,cAAc,CAAA;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA;AACf,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,GAAA;AAAA,IACxC;AAGA,IAAA,IAAI,IAAA,KAAS,wBAAA,IAA4B,MAAA,KAAW,KAAA,EAAO;AACzD,MAAA,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,QACjB,cAAA,EAAgB,mBAAA;AAAA,QAChB,eAAA,EAAiB,UAAA;AAAA,QACjB,UAAA,EAAY,YAAA;AAAA,QACZ,mBAAA,EAAqB;AAAA,OACtB,CAAA;AAED,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,MAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,IAAK,MAAA;AAErD,MAAA,MAAM,QAAA,GAAW,KAAK,UAAA,CAAW,SAAA;AAAA,QAC/B,CAAC,IAAA,KAAiB;AAChB,UAAA,GAAA,CAAI,MAAM,IAAI,CAAA;AACd,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,MAAM;AACJ,UAAA,IAAI,CAAC,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,GAAA,EAAI;AAAA,QAClC,CAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM;AACpB,QAAA,IAAA,CAAK,UAAA,CAAW,aAAa,QAAQ,CAAA;AAAA,MACvC,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,yBAAA,IAA6B,MAAA,KAAW,KAAA,EAAO;AAC1D,MAAA,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,QACjB,cAAA,EAAgB,mBAAA;AAAA,QAChB,eAAA,EAAiB,UAAA;AAAA,QACjB,UAAA,EAAY,YAAA;AAAA,QACZ,mBAAA,EAAqB;AAAA,OACtB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,KAAK,UAAA,CAAW,SAAA;AAAA,QAC/B,CAAC,IAAA,KAAiB;AAChB,UAAA,GAAA,CAAI,MAAM,IAAI,CAAA;AACd,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAAA,QACA,MAAM;AACJ,UAAA,IAAI,CAAC,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,GAAA,EAAI;AAAA,QAClC,CAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM;AACpB,QAAA,IAAA,CAAK,UAAA,CAAW,aAAa,QAAQ,CAAA;AAAA,MACvC,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,SAAS,GAAA,EAAK,SAAA,CAAU,WAAA,EAAa,WAAW,GAAG,GAAG,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,OAAgB,EAAC;AACrB,MAAA,IAAI,WAAW,MAAA,IAAU,MAAA,KAAW,SAAS,MAAA,KAAW,OAAA,IAAW,MAAM,YAAA,EAAc;AACrF,QAAA,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,MACjC;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,IAAI,CAAA;AAGlD,MAAA,MAAM,cAAc,KAAA,CAAM,OAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA;AAEzC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,SAAS,GAAA,EAAK,SAAA,CAAU,iBAAA,EAAmB,iBAAiB,GAAG,GAAG,CAAA;AACvE,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,OAAkB,EAAC;AAEzB,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,UAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzB;AAAA,MACF;AAKA,MAAA,MAAM,kBAAA,GAAA,CACH,OAAO,GAAA,CAAI,OAAA,CAAQ,kBAAkB,CAAA,KAAM,QAAA,GACvC,GAAA,CAAI,OAAA,CAAQ,kBAAkB,CAAA,GAC/B,KAAA,CAAA,KAAc,KAAA,CAAA;AAEpB,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,IACE,kBAAA,IACA,IAAA,KAAS,IAAA,IACT,OAAO,IAAA,KAAS,YAChB,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EACnB;AACA,UAAA,IAAA,GAAO,EAAE,GAAI,IAAA,EAAkC,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QACpF;AACA,QAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA;AACjD,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,QACjB;AAAA,MACF;AAKA,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,YAAA,EAAc,kBAAA,EAAoB,CAAA;AAG9C,MAAA,MAAM,SAAS,MAAO,OAAA;AAAA,QACpB,GAAG;AAAA,OACL;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,eAAA,EAAkB,MAAM,IAAI,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC5D,MAAA,IAAA,CAAK,SAAS,GAAA,EAAK,SAAA,CAAU,KAAA,EAAgB,gBAAgB,GAAG,GAAG,CAAA;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,MAAc,MAAA,EAAqD;AACnF,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAE7B,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,SAAS,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEhF,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAC1C,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AACpB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,MAAc,SAAA,EAA2C;AAC7E,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAEhC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,IAAI,UAAA,CAAW,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,QAAA,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,UAAU,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CACN,GAAA,EACA,QAAA,GAAW,EAAA,GAAK,OAAO,IAAA,EACL;AAClB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAA2B;AACzC,QAAA,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,GAAW,OAAO,UAAA,CAAW,KAAK,IAAI,KAAA,CAAM,MAAA;AACtE,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAC1C,UAAA;AAAA,QACF;AACA,QAAA,IAAA,IAAQ,KAAA;AAAA,MACV,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,EAAE,CAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,GAAA,EAAoC,IAAA,EAAe,MAAA,GAAS,GAAA,EAAW;AACtF,IAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC5D,IAAA,MAAM,IAAA,uBAAW,OAAA,EAAQ;AACzB,IAAA,GAAA,CAAI,GAAA;AAAA,MACF,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAC,MAAM,GAAA,KAAQ;AAClC,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,UAAA,IAAI,OAAO,IAAA,KAAS,WAAA,IAAe,GAAA,YAAe,IAAA;AAChD,YAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAA,CAAA;AACjC,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,YAAA;AAC1B,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,QACd;AACA,QAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,OAAO,MAAA;AACtC,QAAA,OAAO,GAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAiC;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,aAAA,EAAe;AACnC,MAAA,IAAI,EAAA,CAAG,eAAe,CAAA,EAAG;AAEvB,QAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAA0B;AACvC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,eAAe,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,0BAAA,GAAyE;AACvE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,uBAAA,CAAwB,KAAK,SAAA,EAAW,EAAE,KAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBAAA,GAA0D;AACxD,IAAA,OAAO,CAAC,KAAA,KAAuB;AAC7B,MAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAW,WAAA,IAAe,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoD;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAQ;AACrC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,IAAA;AACpD,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,OAAO,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,EACtD;AACF;AAKA,eAAsB,sBAAA,CACpB,UACA,MAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,QAAA,EAAU,MAAM,CAAA;AACpD,EAAA,MAAM,OAAO,KAAA,EAAM;AACnB,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,SACpB,QAAA,EACA,IAAA,GAAiB,QAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EACtB;AACf,EAAA,MAAM,SAAiC,EAAC;AAGxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAE1B,IAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AACpC,MAAA,MAAA,CAAO,IAAA,GAAO,SAAS,OAAO,CAAA;AAC9B,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,MAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AACd,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,QAAA,EAAU,MAAM,CAAA;AAG5D,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY;AAC/B,IAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,IAAA,MAAM,OAAO,IAAA,EAAK;AAClB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,YAAY;AAChC,IAAA,MAAM,OAAO,IAAA,EAAK;AAClB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACH","file":"standalone.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig, ElementHistoryOptions } from '../core';\nimport type { UiBridgeErrorCode } from '../diagnostics';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n BatchActionRequest,\n BatchActionResponse,\n FindRequest,\n FindResponse,\n ControlSnapshot,\n WorkflowRunRequest,\n WorkflowRunResponse,\n PageNavigateRequest,\n PageNavigationResponse,\n FillFormRequest,\n EffectRecordEntry,\n} from '../control';\nimport type { FillResult } from '../core/types';\nimport type { PageHealthReport } from './page-health';\nimport type { RenderLogEntry, RenderLogEntryType } from '../render-log';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n Intent,\n IntentSearchResponse,\n IntentExecutionResult,\n RecoveryAttemptRequest,\n RecoveryAttemptResult,\n PageDataMap,\n PageRegionMap,\n StructuredDataExtraction,\n CrossAppComparisonReport,\n ComponentInfo,\n ActionWithDiffRequest,\n ActionDiffResult,\n ChangePredicate,\n WaitForChangeOptions,\n CategorizedDiff,\n ChangeBufferDrainResult,\n SnapshotBookmark,\n FormsResponse,\n StructuredChangeAnalysis,\n FormSnapshot,\n FormDiff,\n FindResult,\n FindContext,\n} from '../ai';\nimport type {\n InteractionStateName,\n ElementDesignData,\n StateStyles,\n ResponsiveSnapshot,\n} from '../core/types';\nimport type { StyleGuideConfig, StyleAuditReport } from '../specs/style-types';\nimport type {\n QualityEvaluationReport,\n SnapshotDiffReport,\n EvaluateRequest,\n} from '../specs/quality-types';\nimport type {\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n} from '../core';\nimport type { ElementAnnotation, AnnotationConfig, AnnotationCoverage } from '../annotations';\nimport type { CapturedError, AnyCapturedEvent } from '../debug/browser-capture-types';\nimport type { FingerprintedEvent } from '../debug/error-fingerprint';\nimport type { TimelineEntry } from '../debug/error-timeline';\nimport type { HealthReport } from '../debug/health-score';\nimport type { ErrorSessionSummary, BaselineComparison } from '../debug/error-session';\nimport type { NetworkChain } from '../debug/network-chain';\nimport type { ErrorSnapshot } from '../debug/error-snapshot';\nimport type { CompositeIdleStatus, SignalStatus } from '../idle';\nimport type { NetworkRequestEntry, WaitForRequestOptions, WaitForRequestResult } from '../network';\nimport type { UndoRedoState } from '../undo';\n\n/**\n * Server configuration\n */\nexport interface UIBridgeServerConfig extends UIBridgeConfig {\n /** Base path for API routes */\n basePath?: string;\n /** Enable CORS */\n cors?: boolean | CORSOptions;\n /** Authentication middleware */\n authenticate?: (req: unknown) => boolean | Promise<boolean>;\n /** Rate limiting */\n rateLimit?: RateLimitOptions;\n}\n\n/**\n * CORS options\n */\nexport interface CORSOptions {\n /** Allowed origins */\n origin?: string | string[] | boolean;\n /** Allowed methods */\n methods?: string[];\n /** Allowed headers */\n headers?: string[];\n /** Expose headers */\n exposeHeaders?: string[];\n /** Allow credentials */\n credentials?: boolean;\n /** Max age for preflight cache */\n maxAge?: number;\n}\n\n/**\n * Rate limit options\n */\nexport interface RateLimitOptions {\n /** Time window in milliseconds */\n windowMs?: number;\n /** Max requests per window */\n max?: number;\n /** Message when rate limited */\n message?: string;\n}\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n /** Whether the request succeeded */\n success: boolean;\n /** Response data */\n data?: T;\n /** Error message if failed (human-readable, dual-audience — plan goal #3) */\n error?: string;\n /**\n * Stable machine-readable diagnostic code. Populated on every\n * `success: false` response (plan Phase 1 — required on failure;\n * optional at the type level only because successful responses omit it).\n * Always a canonical `UiBridgeErrorCode` (mapped from internal/legacy\n * codes via the diagnostics `mapInternalErrorCode`).\n */\n code?: UiBridgeErrorCode;\n /** Request timestamp */\n timestamp: number;\n /** Response metadata (staleness, diagnostics) */\n _meta?: {\n stale?: boolean;\n staleSinceMs?: number;\n cacheAgeMs?: number;\n fallback?: boolean;\n reason?: string;\n };\n /** Recovery suggestions for error responses */\n suggestions?: string[];\n /**\n * Optional HTTP status code hint. When set, the framework adapter\n * (Express / Next.js) will use this code instead of the default 200.\n * Used by endpoints that need 4xx semantics on logical failure (e.g.\n * Phase 2.1 `/control/element/:id/expect` returns 422 when the asserted\n * predicate doesn't hold). Stripped from the JSON body before send so\n * external consumers see the same envelope shape.\n */\n httpStatus?: number;\n}\n\n/**\n * Render log query parameters\n */\nexport interface RenderLogQuery {\n /** Filter by entry type */\n type?: RenderLogEntryType;\n /** Filter entries since timestamp */\n since?: number;\n /** Filter entries until timestamp */\n until?: number;\n /** Limit number of results */\n limit?: number;\n}\n\n/**\n * Browser events response — returned by GET /control/browser-events\n */\nexport interface BrowserEventsResponse {\n /** Raw events (filtered by params) */\n events: AnyCapturedEvent[] | CapturedError[];\n /** Total count of returned events */\n count: number;\n /** Deduplicated event groups (only when deduplicate=true) */\n deduplicated?: FingerprintedEvent[];\n /** Number of unique fingerprints (only when deduplicate=true) */\n uniqueCount?: number;\n}\n\n/**\n * Phase 2.1 (plan 2026-05-03) — body for POST /control/element/:id/expect.\n * Reuses the closed `WaitForElementState` enum from the SDK runtime so the\n * predicate evaluator is shared with `/ai/wait-for-element`. The critical\n * semantic difference: this endpoint **fails the request** with HTTP 422\n * when the predicate doesn't hold within `timeout`, instead of returning\n * 200 + `found:false`.\n */\nexport interface ElementExpectRequest {\n /** Predicate to assert. Closed enum mirroring WaitForElementState. */\n state:\n | 'present'\n | 'visible'\n | 'enabled'\n | 'disabled'\n | 'value-not-empty'\n | 'value-empty'\n | 'checked'\n | 'unchecked'\n | 'absent';\n /** Timeout in ms. Default 5000, capped at 30000. */\n timeout?: number;\n /** Poll interval in ms. Default 100, minimum 10. */\n pollMs?: number;\n}\n\n/**\n * Response from POST /control/element/:id/expect. `passed:true` rides on\n * HTTP 200; `passed:false` rides on HTTP 422 (set via `APIResponse.httpStatus`).\n */\nexport interface ElementExpectResponse {\n /** Whether the predicate held within the timeout window. */\n passed: boolean;\n /**\n * Element snapshot at the moment the predicate flipped true (on pass) or\n * the most recent registered snapshot before timeout (on fail). `null`\n * when the element was never registered during the wait.\n */\n observedState: {\n registered: boolean;\n state: Record<string, unknown> | null;\n } | null;\n /** Wall-clock duration of the wait in ms. */\n durationMs: number;\n}\n\n/**\n * Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n * page in a sensible state right now?\". Synthesized from the live snapshot,\n * console-errors buffer, and idle detector so the caller spends one round-\n * trip instead of four. Distinct from the NL `/ai/page-summary` digest.\n */\nexport interface StateSummary {\n /** Count of snapshot elements that are both layout-positioned and visible. */\n visibleElementCount: number;\n /** True when the snapshot's `modalStack` has at least one entry. */\n modalOpen: boolean;\n /** True when the console-errors buffer has at least one entry. */\n hasErrors: boolean;\n /**\n * Pass-through of the idle detector's composite status, or `null` when\n * idle detection is disabled. Lets callers gate work on idle without\n * issuing a separate `/control/idle-status` round-trip.\n */\n idleSignals: CompositeIdleStatus | null;\n /** Number of components currently registered. */\n registeredComponents: number;\n /** Current page route, or `null` when undeterminable. */\n route: string | null;\n /** Currently active tab id (for tab-based apps), or `null` when not provided. */\n activeTab: string | null;\n}\n\n/**\n * Phase 4.1 (plan 2026-05-03) — body for POST /control/sdk/spawn-headless.\n *\n * Wraps the already-shipped `@qontinui/ui-bridge-headless` package's\n * `launchHeadlessTab` so callers can spin up a real Chromium tab for testing\n * without manually opening a browser. The endpoint is gated behind the\n * `enableHeadlessSpawn` config flag (or `ENABLE_HEADLESS_SPAWN=1`); disabled\n * by default because it pulls in Playwright + Chromium at runtime.\n */\nexport interface SpawnHeadlessRequest {\n /** Target URL the headless tab should navigate to. Must start with http:// or https://. */\n url: string;\n /**\n * Max time (ms) to wait for the headless client to register a tab over UI Bridge.\n * Default 30000, capped at 60000.\n */\n timeoutMs?: number;\n /**\n * Auto-close timer (seconds). Tracked spawned tabs are also closed on\n * server shutdown. Default 300.\n */\n keepAliveSecs?: number;\n /**\n * Run Chromium without a visible window. Default `true` — the whole point\n * of this endpoint is \"no manual browser\".\n */\n headless?: boolean;\n /** Viewport size override. Default 1280x720. */\n viewport?: { width: number; height: number };\n}\n\n/**\n * Phase 4.1 — response from POST /control/sdk/spawn-headless.\n */\nexport interface SpawnHeadlessResponse {\n /** True when the tab was launched (regardless of UI Bridge registration). */\n spawned: boolean;\n /** Tab id assigned by the relay when registration succeeded; `null` otherwise. */\n tabId: string | null;\n /** True when the relay reported the tab as connected before timeout. */\n uiBridgeRegistered: boolean;\n /** URL the page actually ended up at after navigation. */\n finalUrl: string;\n}\n\n/**\n * Per-user tab scoping context (§4.2) — threaded as the final positional\n * argument of every relay-dispatching handler.\n *\n * The Next.js adapter populates `callerUserId` from the trusted\n * `X-Caller-User-Id` request header (set by the consumer's auth gate from\n * the authenticated identity — NEVER from a browser-supplied value). The\n * relay-handlers layer lifts `callerUserId` into `ownerCheck.userId` on the\n * downstream `relay.queueCommand` call so the relay refuses to dispatch\n * the command to a tab owned by a different user.\n *\n * The reason this is a dedicated final-arg `context` object instead of a\n * field in the request body / query: many handlers (e.g. `captureSnapshot`,\n * `clearRenderLog`, `getElementState(id)`) have zero-arg or args-without-bag\n * signatures, so there is no body/query for the adapter to splice\n * `__callerUserId` into. Without this explicit channel, those handlers\n * would bypass per-user scoping entirely and silently dispatch to whichever\n * tab happened to be `primaryTabId` — including tabs owned by other users.\n */\nexport interface HandlerContext {\n /**\n * Authenticated caller's user id, as supplied by the consumer's auth gate\n * via the `X-Caller-User-Id` header. When present, the relay restricts\n * dispatch to tabs owned by this user. When absent, the call is treated\n * as a trusted admin / server-side call and the unfiltered primary-tab\n * fallback applies.\n */\n callerUserId?: string;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n *\n * Per-user tab scoping (§4.2): handlers that dispatch to a browser tab\n * accept an optional final `context?: HandlerContext` parameter. The\n * Next.js / Express adapters thread the authenticated caller's user id\n * through that parameter so the relay can enforce per-user dispatch\n * boundaries.\n */\nexport interface UIBridgeServerHandlers {\n // Render log endpoints\n getRenderLog: (\n query?: RenderLogQuery,\n context?: HandlerContext\n ) => Promise<APIResponse<RenderLogEntry[]>>;\n clearRenderLog: (context?: HandlerContext) => Promise<APIResponse<void>>;\n captureSnapshot: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n // Control endpoints\n getElements: (\n options?: {\n recency?: string;\n /** Case-insensitive substring filter on the element's title DOM attribute */\n title?: string;\n /** Case-insensitive substring filter on the element's aria-label DOM attribute */\n aria_label?: string;\n /** Case-insensitive substring filter on the element's visible text / label */\n text?: string;\n /**\n * Phase 3.2 (plan 2026-05-03) — return only elements whose `reveals`\n * array contains an entry that matches this query. Bi-directional glob\n * match: query may be a concrete id matching a `*`-glob entry, or a\n * `*`-glob matching concrete entries.\n */\n revealsAny?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements']>>;\n getElement: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n getElementState: (id: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getElementReactState: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n executeElementAction: (\n id: string,\n request: ControlActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlActionResponse>>;\n executeBatchAction: (\n request: BatchActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchActionResponse>>;\n /**\n * Rank snapshot elements by natural-language query against the\n * structured disambiguation metadata (variant, position, color,\n * contextPath, label, type). Returns scored matches.\n *\n * Free-text input is tokenised and matched token-bag style; structured\n * filters (type, origin, visibleOnly, contextPathContains) act as hard\n * filters. See `@qontinui/ui-bridge/core` `findElements` for the\n * scoring model.\n */\n rankElements: (\n request: {\n text?: string;\n type?: string;\n variant?: string;\n position?: string;\n color?: string;\n contextPathContains?: string;\n origin?: 'hook' | 'auto';\n visibleOnly?: boolean;\n limit?: number;\n minScore?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n id: string;\n score: number;\n reasons: string[];\n element: ControlSnapshot['elements'][0];\n }>\n >\n >;\n\n // Component endpoints\n // F2 (Direction B): `data` is `{components: [...]}` so the envelope matches\n // the runner's direct `/ui-bridge/control/components` route and aligns with\n // every other rich endpoint convention (object-shaped `data`).\n getComponents: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ components: ControlSnapshot['components'] }>>;\n getComponent: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n getComponentState: (\n id: string,\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n state: Record<string, unknown>;\n computed: Record<string, unknown>;\n timestamp: number;\n }>\n >;\n executeComponentAction: (\n id: string,\n request: ComponentActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ComponentActionResponse>>;\n\n // Find endpoints\n find: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n /**\n * @deprecated Use find() instead\n */\n discover: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n getControlSnapshot: (\n request?: {\n targetTabId?: string;\n url?: string;\n skipSettle?: boolean | string;\n settleTimeout?: number | string;\n recency?: string;\n /**\n * Item 1 filter: when `true`, drop elements with `kind: \"content\"`\n * (semantic `data-ui-bridge-content` entries) from the response.\n * Default `false` — include everything.\n */\n interactiveOnly?: boolean | string;\n /** snake_case alias for `interactiveOnly`. */\n interactive_only?: boolean | string;\n /**\n * Manual-test remediation 2026-05-10 (Item 2) filter: when `true`,\n * keep only elements that report disabled by any of these signals in\n * the snapshot's `state`: `disabled === true`,\n * `ariaDisabled === \"true\"`, or `enabled === false`. Default `false` —\n * include everything. All other snapshot metadata (route, activeTab,\n * registration, viewport, errorSummary) is preserved unchanged.\n */\n withDisabledOnly?: boolean | string;\n /** snake_case alias for `withDisabledOnly`. */\n with_disabled_only?: boolean | string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot>>;\n\n // Vision pipeline endpoints — runner-direct; SDK stubs only.\n visionCapture: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAnnotate: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDiff: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionRaw: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionCacheStream: (sha256: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionHealth: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n // Phase 4 — text-bearing outputs.\n visionExtract: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDescribe: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n // Phase 6 — analyzers + assertion DSL + baselines + frontend mutation signal.\n visionAnalyze: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAssert: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaseline: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaselinesList: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionMutationOccurred: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Workflow endpoints\n getWorkflows: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['workflows']>>;\n runWorkflow: (\n id: string,\n request?: WorkflowRunRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n getWorkflowStatus: (\n runId: string,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n\n // Debug endpoints\n getActionHistory: (\n limit?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify\n // cycles from the process-global effect store. Newest-first; `limit` caps\n // the slice (omitted = all retained, default ring-buffer cap 100).\n getRecentEffects: (\n options?: { limit?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<EffectRecordEntry[]>>;\n getMetrics: () => Promise<APIResponse<unknown>>;\n highlightElement: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getElementTree: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getConsoleErrors: (\n params?: {\n since?: number;\n /**\n * Monotonic id cursor — return only entries with `id > sinceId`.\n * Paired with `nextSinceId` in the ungrouped response for pagination.\n * Takes precedence over the legacy `since` timestamp filter when both\n * are provided.\n */\n sinceId?: number;\n limit?: number;\n group?: boolean;\n groupBy?: 'fingerprint' | 'message' | 'source';\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | {\n errors: CapturedError[];\n count: number;\n /** Cursor for the next call — last returned entry's id, or `sinceId` if empty. */\n nextSinceId?: number;\n /** Lifetime total of entries evicted from the underlying buffer. */\n droppedCount?: number;\n /** Current buffer size (not filtered by level/since). */\n bufferedCount?: number;\n }\n | { groups: unknown[]; totalErrors: number; totalGroups: number }\n >\n >;\n clearConsoleErrors: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // AI-native endpoints\n aiSearch: (\n criteria: SearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SearchResponse>>;\n aiFind: (\n request: {\n query: string;\n context?: FindContext;\n confidenceThreshold?: number;\n /**\n * B2 — strict literal-match mode. When `true`, returns only elements\n * with a case-insensitive exact match against id / labelText /\n * ariaLabel / textContent / title / placeholder / value / name; no\n * fuzzy fallback. Default `false` keeps fuzzy behaviour.\n */\n strict?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResult>>;\n aiExecute: (\n request: NLActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<NLActionResponse>>;\n aiAssert: (\n request: AssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<AssertionResult>>;\n aiAssertBatch: (\n request: BatchAssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchAssertionResult>>;\n getSemanticSnapshot: (\n options?: {\n includeForms?: string | boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSnapshot>>;\n getSemanticDiff: (\n since?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n getPageSummary: (context?: HandlerContext) => Promise<APIResponse<string>>;\n\n // Change tracking endpoints\n executeWithDiff: (\n request: ActionWithDiffRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ActionDiffResult>>;\n waitForChange: (\n request: {\n predicate: ChangePredicate;\n options?: WaitForChangeOptions;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff>>;\n categorizeLastDiff: (context?: HandlerContext) => Promise<APIResponse<CategorizedDiff | null>>;\n getScopedDiff: (\n request: {\n scope: string;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n // Budget-aware diff summary\n summarizeDiff: (\n request: {\n budget: number;\n includeIds?: boolean;\n includeCategory?: boolean;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ summary: string }>>;\n // Structured change analysis (table/list-aware)\n analyzeStructuredChanges: (\n request: {\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredChangeAnalysis>>;\n\n // Change buffer endpoints\n enableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n disableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n drainChangeBuffer: (\n context?: HandlerContext\n ) => Promise<APIResponse<ChangeBufferDrainResult>>;\n getChangeBufferSize: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ size: number; enabled: boolean }>>;\n\n // Snapshot bookmark endpoints\n saveBookmark: (\n request: { name: string },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotBookmark>>;\n getBookmark: (name: string, context?: HandlerContext) => Promise<APIResponse<SnapshotBookmark>>;\n deleteBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n listBookmarks: (context?: HandlerContext) => Promise<APIResponse<string[]>>;\n diffFromBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n\n // Semantic search (embedding-based)\n aiSemanticSearch: (\n criteria: SemanticSearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n // State management endpoints\n getStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n getState: (id: string, context?: HandlerContext) => Promise<APIResponse<UIState>>;\n getActiveStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n activateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getStateGroups: (context?: HandlerContext) => Promise<APIResponse<UIStateGroup[]>>;\n activateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getTransitions: (context?: HandlerContext) => Promise<APIResponse<UITransition[]>>;\n canExecuteTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ canExecute: boolean; reason?: string }>>;\n executeTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<TransitionResult>>;\n findPath: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<PathResult>>;\n navigateTo: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<NavigationResult>>;\n getStateSnapshot: (context?: HandlerContext) => Promise<APIResponse<StateSnapshot>>;\n\n // Intent endpoints\n executeIntent: (\n request: {\n intentId: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n findIntent: (\n request: { query: string },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentSearchResponse>>;\n listIntents: (context?: HandlerContext) => Promise<APIResponse<Intent[]>>;\n registerIntent: (intent: Intent, context?: HandlerContext) => Promise<APIResponse<Intent>>;\n executeIntentFromQuery: (\n request: {\n query: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n deleteIntent: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n\n // Recovery endpoints\n attemptRecovery: (\n request: RecoveryAttemptRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<RecoveryAttemptResult>>;\n\n // Cross-app analysis endpoints\n analyzePageData: (context?: HandlerContext) => Promise<APIResponse<PageDataMap>>;\n analyzePageRegions: (context?: HandlerContext) => Promise<APIResponse<PageRegionMap>>;\n analyzeStructuredData: (\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredDataExtraction>>;\n crossAppCompare: (\n request: {\n sourceSnapshot: SemanticSnapshot;\n targetSnapshot: SemanticSnapshot;\n sourceComponents?: ComponentInfo[];\n targetComponents?: ComponentInfo[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CrossAppComparisonReport>>;\n\n // Page navigation endpoints\n pageRefresh: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageNavigate: (\n request: PageNavigateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoBack: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoForward: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageEvaluate: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n pageScroll: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Clipboard endpoints (browser gesture-based)\n clipboardWrite: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clipboardRead: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Annotation endpoints\n getAnnotations: (\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, ElementAnnotation>>>;\n getAnnotation: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n setAnnotation: (\n id: string,\n annotation: ElementAnnotation,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n deleteAnnotation: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n importAnnotations: (\n config: AnnotationConfig,\n context?: HandlerContext\n ) => Promise<APIResponse<{ count: number }>>;\n exportAnnotations: (context?: HandlerContext) => Promise<APIResponse<AnnotationConfig>>;\n getAnnotationCoverage: (\n context?: HandlerContext\n ) => Promise<APIResponse<AnnotationCoverage>>;\n\n // Performance diagnostics endpoints\n getPerformanceEntries: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clearPerformanceEntries: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ cleared: boolean }>>;\n getBrowserEvents: (\n params?: {\n type?: string;\n since?: number;\n limit?: number;\n severity?: string;\n deduplicate?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<BrowserEventsResponse>>;\n getTimeline: (\n params?: {\n since?: number;\n limit?: number;\n minSeverity?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ entries: TimelineEntry[]; count: number }>>;\n\n // Health score endpoint\n getHealthReport: (\n params?: { windowMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<HealthReport>>;\n\n // Network chain endpoints\n getNetworkChains: (\n params?: {\n since?: number;\n limit?: number;\n failuresOnly?: boolean;\n url?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ chains: NetworkChain[]; count: number }>>;\n\n // Error session endpoints\n startErrorSession: (\n request: { label?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ sessionId: string }>>;\n endErrorSession: (\n context?: HandlerContext\n ) => Promise<APIResponse<ErrorSessionSummary | null>>;\n getErrorSessions: (context?: HandlerContext) => Promise<APIResponse<ErrorSessionSummary[]>>;\n captureErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ label: string; capturedAt: number; fingerprintCount: number }>>;\n compareErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<BaselineComparison | null>>;\n\n // Error snapshots (auto-captured on significant errors)\n getErrorSnapshots: (\n params?: {\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ snapshots: ErrorSnapshot[]; count: number }>>;\n\n // Composite error report (health + recent errors + session in one call)\n getErrorReport: (\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n health: HealthReport;\n recentErrors: AnyCapturedEvent[];\n activeSession: ErrorSessionSummary | null;\n snapshots: ErrorSnapshot[];\n }>\n >;\n\n // Design review endpoints\n getElementStyles: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n id: string,\n request: { states?: InteractionStateName[] },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n request?: {\n elementIds?: string[];\n includePseudoElements?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (\n request: {\n viewports?: Record<string, number>;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n setViewportConstraints: (\n request: { width?: number; restore?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n success: boolean;\n viewportWidth: number;\n constrainedWidth: number;\n timestamp: number;\n }>\n >;\n runDesignAudit: (\n request?: {\n guide?: StyleGuideConfig;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StyleAuditReport>>;\n loadStyleGuide: (\n request: {\n guide: StyleGuideConfig;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (context?: HandlerContext) => Promise<APIResponse<StyleGuideConfig | null>>;\n clearStyleGuide: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // Quality evaluation endpoints\n evaluateQuality: (\n request?: EvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<QualityEvaluationReport>>;\n getQualityContexts: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n request?: {\n label?: string;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (\n request?: { elementIds?: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotDiffReport>>;\n\n // Form state awareness endpoints\n getForms: (context?: HandlerContext) => Promise<APIResponse<FormsResponse>>;\n fillForm: (\n request: FillFormRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<FillResult>>;\n snapshotForms: (context?: HandlerContext) => Promise<APIResponse<FormSnapshot>>;\n diffForms: (\n request: {\n before: FormSnapshot;\n after: FormSnapshot;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FormDiff>>;\n\n // Clipboard endpoints\n getClipboard: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ text: string | null; formats: string[] }>>;\n setClipboard: (\n request: {\n text: string;\n html?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ written: boolean; formats: string[] }>>;\n\n // Network request monitoring endpoints\n getNetworkRequests: (\n params?: {\n status?: string;\n method?: string;\n urlPattern?: string;\n failuresOnly?: boolean;\n since?: number;\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{ requests: NetworkRequestEntry[]; count: number; inFlightCount: number }>\n >;\n\n getNetworkRequestsInFlight: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ requests: NetworkRequestEntry[]; count: number }>>;\n\n waitForNetworkRequest: (\n request: WaitForRequestOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForRequestResult>>;\n\n getNetworkRequest: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<NetworkRequestEntry>>;\n\n // Idle detection endpoints\n getIdleStatus: (context?: HandlerContext) => Promise<APIResponse<CompositeIdleStatus>>;\n getIdleSignalStatus: (\n signal: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForIdle: (\n request?: {\n timeout?: number;\n minStableMs?: number;\n exclude?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CompositeIdleStatus>>;\n waitForSignalIdle: (\n signal: string,\n request?: { timeout?: number; minStableMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForTargets: (\n request: {\n targets: Array<string | { indicator: string }>;\n timeout?: number;\n minStableMs?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, SignalStatus>>>;\n\n // Undo/redo awareness endpoints\n getUndoState: (context?: HandlerContext) => Promise<APIResponse<UndoRedoState>>;\n executeUndo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n executeRedo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n\n // Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n // page in a sensible state right now?\" so callers don't have to fan out\n // five round-trips (snapshot + console-errors + idle-status + …) just to\n // pre-flight an interaction. Distinct from `/ai/page-summary` which\n // returns NL prose for human consumption.\n getStateSummary: () => Promise<APIResponse<StateSummary>>;\n\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate.\n // Returns 200 + passed:true on success, 422 + passed:false on timeout\n // (set via APIResponse.httpStatus). Shares predicate evaluation with\n // `/ai/wait-for-element` so semantics stay aligned.\n expectElement: (\n id: string,\n request: ElementExpectRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementExpectResponse>>;\n\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless` so callers can drive the web bridge\n // without manually opening a browser. Gated behind `enableHeadlessSpawn`\n // (off by default); returns 503 when disabled or when the optional peer\n // dependency isn't installed; 400 on bad input.\n spawnHeadless: (\n request: SpawnHeadlessRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<SpawnHeadlessResponse>>;\n\n // Page health diagnostics — runs the same spatial-coverage / layout /\n // text-signal heuristics as the runner's `/control/page-health` analyzer\n // (qontinui-runner src-tauri/src/mcp/ui_bridge/screenshots.rs) but\n // server-side over the current snapshot. Pure data-over-elements; no\n // browser context required beyond a relayed snapshot.\n pageHealth: () => Promise<APIResponse<PageHealthReport>>;\n\n // API discovery\n getCapabilities: () => Promise<APIResponse<CapabilitiesResponse>>;\n\n // Specs endpoint — serves all loaded specs for runner discovery\n getSpecs: () => Promise<APIResponse<Record<string, unknown>>>;\n\n // Heartbeat (app health detection)\n receiveHeartbeat: () => Promise<APIResponse<{ received: boolean }>>;\n\n // Element event log\n getElementHistory: (\n elementId: string,\n options?: ElementHistoryOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n\n // Media discovery & analysis endpoints — removed in Phase 2 of the\n // UI Bridge Vision Pipeline (2026-05-13). The `/control/screenshot`,\n // `/control/annotated-screenshot`, `/control/element-screenshot`,\n // `/control/capture-element-images`, `/control/get-element-images`,\n // `/control/diagnose-stuck-screen`, and `/ai/media/*` routes are\n // superseded by `/vision/{capture,annotate,diff,raw,cache,health}`\n // declared above (handlers prefixed `vision*`). The runner answers those\n // routes directly; the SDK keeps stubs for type-completeness.\n\n // Change observation (push-based)\n getChangesSince: (params?: {\n since?: number;\n limit?: number;\n }) => Promise<APIResponse<{ events: DOMChangeEvent[]; count: number }>>;\n\n /** Tear down internal subscriptions and observers to prevent resource leaks. */\n destroy?: () => void;\n\n // Enhanced discovery endpoints\n query: (\n request: {\n selector: string;\n limit?: number;\n includeState?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n waitForElement: (\n request: {\n selector?: string;\n elementId?: string;\n timeout?: number;\n pollInterval?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n /**\n * Tier 3.1 — Wait for an element matching a structured selector to satisfy\n * a given condition (present / visible / clickable / text-matches).\n *\n * Implemented via registry polling so it works with both DOM and native elements.\n */\n waitForElementByCondition: (\n request: WaitForElementByConditionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForElementByConditionResponse>>;\n\n /**\n * Testing-friendliness — Wait for an SPA route change with optional\n * from/to matching. Returns a timeout shape (reason: 'timeout') when no\n * matching navigation occurs before `timeoutMs`.\n */\n waitForRouteChange: (\n request?: WaitForRouteChangeRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n WaitForRouteChangeResponse | { reason: 'timeout'; lastKnownRoute?: string; elapsedMs: number }\n >\n >;\n\n /**\n * Testing-friendliness — Wait for an element matching `predicate` to be\n * registered (or visible / have layout, per `requirement`). Polls the\n * in-memory registry; falls back to `document.querySelector` when\n * `predicate.selector` is given.\n */\n waitForElementRegistered: (\n request: WaitForElementRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | WaitForElementSuccessResponse\n | { reason: 'timeout'; elapsedMs: number; closestMatch?: Record<string, unknown> }\n >\n >;\n\n /**\n * Tier 3.2 — Execute a heterogeneous sequence of actions, waits, and\n * snapshots in one round-trip.\n */\n controlBatch: (\n request: ControlBatchRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlBatchResponse>>;\n\n // App-agnostic convenience endpoints\n clickByText: (\n request: {\n text: string;\n tag?: string;\n exact?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n clickBySelector: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n typeInto: (\n request: {\n selector?: string;\n label?: string;\n text: string;\n clear?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n readValue: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n findByText: (\n request: { text: string; tag?: string; exact?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n index: number;\n tag: string;\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n disabled: boolean;\n visible: boolean;\n }>\n >\n >;\n\n // Diagnostics endpoint\n getDiagnostics: (context?: HandlerContext) => Promise<\n APIResponse<{\n sdk_initialized: boolean;\n auto_register_active: boolean;\n registered_elements: number;\n dom_interactive_elements: number;\n mutation_observer_active: boolean;\n navigation_adapter: string;\n page_title: string;\n page_url: string;\n page_ready: boolean;\n providers_mounted: string[];\n last_discover_at: string | null;\n capabilities: string[];\n }>\n >;\n\n // Navigation adapter endpoints\n getRoutes: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n navigateByAdapter: (\n request: { page: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\n}\n\n/**\n * Push-based DOM change event.\n *\n * Batched subtree-change events emitted by the ChangeObserver and relayed\n * through the CommandRelay. Inspired by folk-js/allio's SubtreeChanged event.\n */\nexport interface DOMChangeEvent {\n type: 'subtreeChanged';\n timestamp: number;\n added: string[];\n removed: string[];\n modified: string[];\n}\n\n/**\n * Endpoint description for API discovery\n */\nexport interface EndpointInfo {\n method: string;\n path: string;\n description: string;\n queryParams?: Record<string, string>;\n}\n\n/**\n * Category of related endpoints\n */\nexport interface EndpointCategory {\n description: string;\n endpoints: EndpointInfo[];\n}\n\n/**\n * Response from the /capabilities endpoint\n */\nexport interface CapabilitiesResponse {\n version: string;\n categories: Record<string, EndpointCategory>;\n}\n\n/**\n * Selector criteria for waitForElementByCondition.\n * All provided fields are ANDed together (case-insensitive substring match).\n */\nexport interface ElementConditionSelector {\n /** Match by element id (exact or substring) */\n id?: string;\n /** Match by title attribute (substring) */\n title?: string;\n /** Match by aria-label attribute (substring) */\n aria_label?: string;\n /** Match by visible text / label (substring) */\n text?: string;\n /** Match by element type (e.g. \"button\", \"input\") */\n type?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionRequest {\n /** Selector criteria — all provided fields must match */\n selector: ElementConditionSelector;\n /** Max wait in ms (default 5000, capped at 60000) */\n timeout_ms?: number;\n /** Condition to check on each poll */\n condition?: 'present' | 'visible' | 'clickable' | 'text-matches';\n /** Substring to match when condition is \"text-matches\" (case-insensitive) */\n text_match?: string;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionResponse {\n /** Whether the condition was satisfied before timeout */\n matched: boolean;\n /** The matched element (present when matched is true) */\n element?: unknown;\n /** How long we actually waited in ms */\n waited_ms: number;\n}\n\n/**\n * Request body for POST /ai/wait-for-route-change.\n *\n * Blocks until the SPA route changes. Optionally filters by the prior\n * route (`fromRoute`) and/or the new route (`toRoute` with `matchMode`).\n * When a matching route change happened between the request arriving and\n * the subscription being set, the handler resolves immediately with\n * `elapsedMs: 0` by scanning the always-on recent-route-change buffer.\n */\nexport interface WaitForRouteChangeRequest {\n /** Only fire when the prior route equals this exact string. */\n fromRoute?: string;\n /** Only fire when the new route matches this (per `matchMode`). */\n toRoute?: string;\n /** How to compare `toRoute` against the new route. Default: `\"exact\"`. */\n matchMode?: 'exact' | 'prefix' | 'regex';\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-route-change (success case).\n */\nexport interface WaitForRouteChangeResponse {\n from: string;\n to: string;\n elapsedMs: number;\n}\n\n/**\n * Selector predicate for POST /ai/wait-for-element.\n *\n * All provided fields are ANDed. At least one field should be provided;\n * otherwise the first registered element is returned.\n */\nexport interface WaitForElementPredicate {\n /** Match by element id (exact). */\n id?: string;\n /** Match by label / accessible name (case-insensitive substring). */\n label?: string;\n /** Match by data-testid attribute (exact). */\n testId?: string;\n /** CSS selector — falls back to document.querySelector if element is not in registry. */\n selector?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element.\n *\n * Polls the in-memory registry for an element matching `predicate`. When\n * `selector` is supplied, falls back to `document.querySelector` once per\n * poll so the wait also covers elements that aren't SDK-registered.\n */\nexport interface WaitForElementRequest {\n predicate: WaitForElementPredicate;\n /**\n * Additional requirement on the matched element.\n * - `\"registered\"` (default): element exists in the registry.\n * - `\"visible\"`: element exists AND is visible per snapshot rules.\n * - `\"has-layout\"`: element exists AND `layout.width > 0 && layout.height > 0`.\n */\n requirement?: 'registered' | 'visible' | 'has-layout';\n /** Poll interval in ms. Default 100, clamped to [50, 1000]. */\n pollMs?: number;\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (success case).\n */\nexport interface WaitForElementSuccessResponse {\n element: {\n id: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n };\n elapsedMs: number;\n}\n\n/**\n * A single step in a Tier 3.2 control batch request.\n */\nexport type ControlBatchStep =\n | {\n type: 'action';\n /** ID of the element to act on */\n element_id: string;\n /** Action name (click, type, focus, …) */\n action: string;\n /** Optional action parameters */\n params?: Record<string, unknown>;\n }\n | {\n type: 'wait';\n /** Milliseconds to sleep */\n ms: number;\n }\n | {\n type: 'snapshot';\n };\n\n/**\n * Request body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchRequest {\n actions: ControlBatchStep[];\n /** When true (default), stop executing on the first error */\n stop_on_error?: boolean;\n}\n\n/**\n * Per-step result in a Tier 3.2 batch response\n */\nexport interface ControlBatchStepResult {\n index: number;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Response body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchResponse {\n results: ControlBatchStepResult[];\n completed: number;\n total: number;\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n handler: string; // Key in UIBridgeServerHandlers\n params?: string[]; // URL params to extract\n bodyRequired?: boolean;\n}\n\n/**\n * All UI Bridge routes\n */\nexport const UI_BRIDGE_ROUTES: RouteDefinition[] = [\n // Render log\n { method: 'GET', path: '/render-log', handler: 'getRenderLog' },\n { method: 'GET', path: '/control/render-log', handler: 'getRenderLog' }, // Alias under /control/\n { method: 'DELETE', path: '/render-log', handler: 'clearRenderLog' },\n { method: 'POST', path: '/render-log/snapshot', handler: 'captureSnapshot' },\n { method: 'GET', path: '/render-log/path', handler: 'getRenderLogPath' },\n\n // Control - Elements\n { method: 'GET', path: '/control/elements', handler: 'getElements' },\n { method: 'GET', path: '/control/element/:id', handler: 'getElement', params: ['id'] },\n { method: 'GET', path: '/control/element/:id/state', handler: 'getElementState', params: ['id'] },\n {\n method: 'GET',\n path: '/control/element/:id/react-state',\n handler: 'getElementReactState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/element/:id/action',\n handler: 'executeElementAction',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate. Returns\n // 200 + passed:true on success, 422 + passed:false on timeout.\n {\n method: 'POST',\n path: '/control/element/:id/expect',\n handler: 'expectElement',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless`. Gated behind `enableHeadlessSpawn`\n // / `ENABLE_HEADLESS_SPAWN=1`; returns 503 when disabled or the\n // optional peer dependency is absent.\n {\n method: 'POST',\n path: '/control/sdk/spawn-headless',\n handler: 'spawnHeadless',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/actions/batch',\n handler: 'executeBatchAction',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/elements/rank',\n handler: 'rankElements',\n bodyRequired: true,\n },\n\n // Control - Components\n { method: 'GET', path: '/control/components', handler: 'getComponents' },\n { method: 'GET', path: '/control/component/:id', handler: 'getComponent', params: ['id'] },\n {\n method: 'GET',\n path: '/control/component/:id/state',\n handler: 'getComponentState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n params: ['id', 'actionId'],\n bodyRequired: true,\n },\n\n // Find (formerly Discovery)\n { method: 'POST', path: '/control/find', handler: 'find' },\n { method: 'POST', path: '/control/discover', handler: 'discover' }, // @deprecated Use /control/find\n { method: 'GET', path: '/control/snapshot', handler: 'getControlSnapshot' },\n // Phase 1.3 (plan 2026-05-03) — flat digest synthesized from snapshot +\n // console-errors + idle-status. One call instead of five.\n { method: 'GET', path: '/control/state-summary', handler: 'getStateSummary' },\n\n // Page health diagnostics — runs the spatial-coverage / layout / text-\n // signal heuristics defined in `./page-health.ts`. Byte-equivalent output\n // shape to the runner's `/control/page-health` handler so the page-health\n // skill (.claude/skills/page-health/SKILL.md) sees identical payloads\n // regardless of transport. POST (matches runner) — body reserved for\n // future per-check toggles (currently ignored).\n { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\n\n // Workflows\n { method: 'GET', path: '/control/workflows', handler: 'getWorkflows' },\n { method: 'POST', path: '/control/workflow/:id/run', handler: 'runWorkflow', params: ['id'] },\n {\n method: 'GET',\n path: '/control/workflow/:runId/status',\n handler: 'getWorkflowStatus',\n params: ['runId'],\n },\n\n // Element event log\n {\n method: 'GET',\n path: '/debug/element-history/:id',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Debug\n { method: 'GET', path: '/debug/action-history', handler: 'getActionHistory' },\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify cycles.\n { method: 'GET', path: '/effects/recent', handler: 'getRecentEffects' },\n { method: 'GET', path: '/debug/metrics', handler: 'getMetrics' },\n { method: 'POST', path: '/debug/highlight/:id', handler: 'highlightElement', params: ['id'] },\n { method: 'GET', path: '/debug/element-tree', handler: 'getElementTree' },\n { method: 'GET', path: '/control/console-errors', handler: 'getConsoleErrors' },\n { method: 'POST', path: '/control/console-errors/clear', handler: 'clearConsoleErrors' },\n\n // AI-native endpoints\n { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n { method: 'POST', path: '/ai/find', handler: 'aiFind', bodyRequired: true },\n { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n // Change tracking\n {\n method: 'POST',\n path: '/ai/execute-with-diff',\n handler: 'executeWithDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/wait-for-change',\n handler: 'waitForChange',\n bodyRequired: true,\n },\n { method: 'GET', path: '/ai/categorize-last-diff', handler: 'categorizeLastDiff' },\n { method: 'POST', path: '/ai/scoped-diff', handler: 'getScopedDiff', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/summarize-diff',\n handler: 'summarizeDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/structured-changes',\n handler: 'analyzeStructuredChanges',\n bodyRequired: true,\n },\n\n // Change buffer\n { method: 'POST', path: '/ai/change-buffer/enable', handler: 'enableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/disable', handler: 'disableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/drain', handler: 'drainChangeBuffer' },\n { method: 'GET', path: '/ai/change-buffer/size', handler: 'getChangeBufferSize' },\n\n // Snapshot bookmarks (static routes before parameterized).\n //\n // The list/save endpoints use the plural `/ai/bookmarks` while the\n // per-resource endpoints historically used the singular `/ai/bookmark/:name`.\n // The plural variants are aliased to the same handlers so callers reading\n // the canonical reference (which uses plural throughout) don't hit 404s\n // when paths drift in their head.\n { method: 'POST', path: '/ai/bookmarks', handler: 'saveBookmark', bodyRequired: true },\n { method: 'GET', path: '/ai/bookmarks', handler: 'listBookmarks' },\n { method: 'GET', path: '/ai/bookmark/:name', handler: 'getBookmark', params: ['name'] },\n { method: 'GET', path: '/ai/bookmarks/:name', handler: 'getBookmark', params: ['name'] },\n {\n method: 'DELETE',\n path: '/ai/bookmark/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'DELETE',\n path: '/ai/bookmarks/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmark/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmarks/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n\n // State management (static routes before parameterized)\n { method: 'GET', path: '/control/states', handler: 'getStates' },\n { method: 'GET', path: '/control/states/active', handler: 'getActiveStates' },\n { method: 'GET', path: '/control/states/snapshot', handler: 'getStateSnapshot' },\n { method: 'POST', path: '/control/states/find-path', handler: 'findPath', bodyRequired: true },\n { method: 'POST', path: '/control/states/navigate', handler: 'navigateTo', bodyRequired: true },\n { method: 'GET', path: '/control/state/:id', handler: 'getState', params: ['id'] },\n { method: 'POST', path: '/control/state/:id/activate', handler: 'activateState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/state/:id/deactivate',\n handler: 'deactivateState',\n params: ['id'],\n },\n { method: 'GET', path: '/control/state-groups', handler: 'getStateGroups' },\n {\n method: 'POST',\n path: '/control/state-group/:id/activate',\n handler: 'activateStateGroup',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/state-group/:id/deactivate',\n handler: 'deactivateStateGroup',\n params: ['id'],\n },\n { method: 'GET', path: '/control/transitions', handler: 'getTransitions' },\n {\n method: 'GET',\n path: '/control/transition/:id/can-execute',\n handler: 'canExecuteTransition',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/transition/:id/execute',\n handler: 'executeTransition',\n params: ['id'],\n },\n\n // Intent endpoints\n { method: 'GET', path: '/ai/intents', handler: 'listIntents' },\n { method: 'POST', path: '/ai/intents/execute', handler: 'executeIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/find', handler: 'findIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/register', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/intents/execute-from-query',\n handler: 'executeIntentFromQuery',\n bodyRequired: true,\n },\n\n // Recovery endpoints\n {\n method: 'POST',\n path: '/ai/recovery/attempt',\n handler: 'attemptRecovery',\n bodyRequired: true,\n },\n\n // Cross-app analysis endpoints\n { method: 'GET', path: '/ai/analyze/data', handler: 'analyzePageData' },\n { method: 'GET', path: '/ai/analyze/regions', handler: 'analyzePageRegions' },\n { method: 'GET', path: '/ai/analyze/structured-data', handler: 'analyzeStructuredData' },\n {\n method: 'POST',\n path: '/ai/analyze/cross-app-compare',\n handler: 'crossAppCompare',\n bodyRequired: true,\n },\n\n // Page navigation\n { method: 'POST', path: '/control/page/refresh', handler: 'pageRefresh' },\n { method: 'POST', path: '/control/page/navigate', handler: 'pageNavigate', bodyRequired: true },\n { method: 'POST', path: '/control/page/back', handler: 'pageGoBack' },\n { method: 'POST', path: '/control/page/forward', handler: 'pageGoForward' },\n { method: 'POST', path: '/control/page/evaluate', handler: 'pageEvaluate', bodyRequired: true },\n { method: 'POST', path: '/control/page/scroll', handler: 'pageScroll', bodyRequired: true },\n\n // Clipboard (relay to browser for gesture-based access)\n {\n method: 'POST',\n path: '/control/clipboard/write',\n handler: 'clipboardWrite',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/clipboard/read', handler: 'clipboardRead' },\n\n // Annotations (static routes before parameterized)\n { method: 'GET', path: '/annotations', handler: 'getAnnotations' },\n { method: 'GET', path: '/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/annotations/coverage', handler: 'getAnnotationCoverage' },\n { method: 'POST', path: '/annotations/import', handler: 'importAnnotations', bodyRequired: true },\n { method: 'GET', path: '/annotations/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/annotations/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/annotations/:id', handler: 'deleteAnnotation', params: ['id'] },\n\n // Performance diagnostics\n { method: 'GET', path: '/control/performance-entries', handler: 'getPerformanceEntries' },\n {\n method: 'POST',\n path: '/control/performance-entries/clear',\n handler: 'clearPerformanceEntries',\n },\n { method: 'GET', path: '/control/browser-events', handler: 'getBrowserEvents' },\n { method: 'GET', path: '/control/timeline', handler: 'getTimeline' },\n { method: 'GET', path: '/control/health', handler: 'getHealthReport' },\n { method: 'GET', path: '/control/network-chains', handler: 'getNetworkChains' },\n { method: 'POST', path: '/control/error-sessions/start', handler: 'startErrorSession' },\n { method: 'POST', path: '/control/error-sessions/end', handler: 'endErrorSession' },\n { method: 'GET', path: '/control/error-sessions', handler: 'getErrorSessions' },\n {\n method: 'POST',\n path: '/control/error-baselines/capture',\n handler: 'captureErrorBaseline',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/error-baselines/compare',\n handler: 'compareErrorBaseline',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/error-snapshots', handler: 'getErrorSnapshots' },\n { method: 'GET', path: '/control/error-report', handler: 'getErrorReport' },\n\n // Design review\n {\n method: 'GET',\n path: '/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n { method: 'POST', path: '/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/viewport-constraints',\n handler: 'setViewportConstraints',\n bodyRequired: true,\n },\n { method: 'POST', path: '/design/audit', handler: 'runDesignAudit' },\n {\n method: 'POST',\n path: '/design/style-guide/load',\n handler: 'loadStyleGuide',\n bodyRequired: true,\n },\n { method: 'GET', path: '/design/style-guide', handler: 'getStyleGuide' },\n { method: 'DELETE', path: '/design/style-guide', handler: 'clearStyleGuide' },\n\n // Quality evaluation\n { method: 'POST', path: '/design/evaluate', handler: 'evaluateQuality' },\n { method: 'GET', path: '/design/evaluate/contexts', handler: 'getQualityContexts' },\n { method: 'POST', path: '/design/evaluate/baseline', handler: 'saveBaseline' },\n { method: 'POST', path: '/design/evaluate/diff', handler: 'diffBaseline' },\n\n // Form state awareness\n { method: 'GET', path: '/control/forms', handler: 'getForms' },\n { method: 'POST', path: '/control/fill', handler: 'fillForm', bodyRequired: true },\n { method: 'POST', path: '/control/forms/snapshot', handler: 'snapshotForms' },\n {\n method: 'POST',\n path: '/control/forms/diff',\n handler: 'diffForms',\n bodyRequired: true,\n },\n\n // Clipboard\n { method: 'GET', path: '/control/clipboard', handler: 'getClipboard' },\n { method: 'POST', path: '/control/clipboard', handler: 'setClipboard', bodyRequired: true },\n\n // Network request monitoring (static routes before parameterized)\n { method: 'GET', path: '/control/network-requests', handler: 'getNetworkRequests' },\n {\n method: 'GET',\n path: '/control/network-requests/in-flight',\n handler: 'getNetworkRequestsInFlight',\n },\n {\n method: 'POST',\n path: '/control/network-requests/wait',\n handler: 'waitForNetworkRequest',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/network-request/:id',\n handler: 'getNetworkRequest',\n params: ['id'],\n },\n\n // Idle detection (static routes before parameterized).\n //\n // `/ai/idle-status` is a **byte-identical alias** of `/control/idle-status`\n // — same handler key, same payload. The `/control/*` form is canonical\n // (matches the `/control/*` family convention) and the `/ai/*` alias\n // exists so semantic-search / AI consumers can reach idle state under\n // the namespace they already query. Mirrors the runner's\n // `add_dual!(router, get, \"idle-status\", …)` registration at\n // `qontinui-runner/src-tauri/src/mcp/ui_bridge/errors.rs::routes`. See\n // `docs-site/docs/api/runner-features.md` for the canonicalisation rule.\n { method: 'GET', path: '/control/idle-status', handler: 'getIdleStatus' },\n { method: 'GET', path: '/ai/idle-status', handler: 'getIdleStatus' },\n { method: 'POST', path: '/control/wait-for-idle', handler: 'waitForIdle' },\n {\n method: 'POST',\n path: '/control/wait-for-targets',\n handler: 'waitForTargets',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/idle-status/:signal',\n handler: 'getIdleSignalStatus',\n params: ['signal'],\n },\n {\n method: 'POST',\n path: '/control/wait-for-idle/:signal',\n handler: 'waitForSignalIdle',\n params: ['signal'],\n },\n\n // Undo/redo awareness\n { method: 'GET', path: '/control/undo-state', handler: 'getUndoState' },\n { method: 'POST', path: '/control/undo', handler: 'executeUndo' },\n { method: 'POST', path: '/control/redo', handler: 'executeRedo' },\n\n // API discovery\n { method: 'GET', path: '/capabilities', handler: 'getCapabilities' },\n\n // Specs\n { method: 'GET', path: '/control/specs', handler: 'getSpecs' },\n\n // Heartbeat\n { method: 'POST', path: '/heartbeat', handler: 'receiveHeartbeat' },\n\n // Vision pipeline (Phase 2, plan 2026-05-13). Replaces the legacy\n // `/control/{screenshot,annotated-screenshot,element-screenshot,\n // capture-element-images,get-element-images,diagnose-stuck-screen}`\n // and `/ai/media/*` routes. The runner answers these directly; the\n // SDK exposes stubs that return `runner_required` so the route table\n // stays the single source of truth.\n { method: 'POST', path: '/vision/capture', handler: 'visionCapture' },\n { method: 'POST', path: '/vision/annotate', handler: 'visionAnnotate' },\n { method: 'POST', path: '/vision/diff', handler: 'visionDiff' },\n { method: 'POST', path: '/vision/raw', handler: 'visionRaw' },\n // Phase 4 — text-bearing outputs (OCR + VLM caption).\n { method: 'POST', path: '/vision/extract', handler: 'visionExtract' },\n { method: 'POST', path: '/vision/describe', handler: 'visionDescribe' },\n // Phase 6 — declarative analyzers + assertion DSL.\n { method: 'POST', path: '/vision/analyze', handler: 'visionAnalyze' },\n { method: 'POST', path: '/vision/assert', handler: 'visionAssert' },\n { method: 'POST', path: '/vision/baseline', handler: 'visionBaseline' },\n { method: 'GET', path: '/vision/baselines', handler: 'visionBaselinesList' },\n // Frontend → runner mutation signal (Phase 6).\n {\n method: 'POST',\n path: '/vision/mutation-occurred',\n handler: 'visionMutationOccurred',\n },\n {\n method: 'GET',\n path: '/vision/cache/:sha256',\n handler: 'visionCacheStream',\n params: ['sha256'],\n },\n { method: 'GET', path: '/vision/health', handler: 'visionHealth' },\n\n // Change observation (push-based)\n { method: 'GET', path: '/control/changes/since', handler: 'getChangesSince' },\n\n // ── Route aliases ──────────────────────────────────────────────────\n // These map commonly expected paths to existing handlers.\n\n // Design review aliases under /control/ (static before parameterized)\n { method: 'POST', path: '/control/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/control/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n { method: 'POST', path: '/control/design/audit', handler: 'runDesignAudit' },\n {\n method: 'GET',\n path: '/control/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n\n // Annotation aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/annotations', handler: 'getAnnotations' },\n {\n method: 'POST',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/control/annotations/coverage', handler: 'getAnnotationCoverage' },\n {\n method: 'POST',\n path: '/control/annotations/import',\n handler: 'importAnnotations',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotation/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n {\n method: 'DELETE',\n path: '/control/annotation/:id',\n handler: 'deleteAnnotation',\n params: ['id'],\n },\n\n // History/metrics aliases under /control/\n { method: 'GET', path: '/control/action-history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/metrics', handler: 'getMetrics' },\n { method: 'GET', path: '/control/interaction-metrics', handler: 'getMetrics' },\n {\n method: 'GET',\n path: '/control/element/:id/history',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Intent aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/intents', handler: 'listIntents' },\n { method: 'POST', path: '/control/intents', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/control/intent/:name/execute',\n handler: 'executeIntent',\n params: ['name'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/control/intent/:name', handler: 'deleteIntent', params: ['name'] },\n\n // AI assert-batch alias (hyphenated form)\n { method: 'POST', path: '/ai/assert-batch', handler: 'aiAssertBatch', bodyRequired: true },\n\n // App-agnostic convenience endpoints\n {\n method: 'POST',\n path: '/control/page/click-by-text',\n handler: 'clickByText',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/click-by-selector',\n handler: 'clickBySelector',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/type-into',\n handler: 'typeInto',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/read-value',\n handler: 'readValue',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/find-by-text',\n handler: 'findByText',\n bodyRequired: true,\n },\n\n // Tier 3.1 — registry-based element condition polling\n {\n method: 'POST',\n path: '/ai/wait-for-element-condition',\n handler: 'waitForElementByCondition',\n bodyRequired: true,\n },\n\n // Testing-friendliness — route-change wait\n {\n method: 'POST',\n path: '/ai/wait-for-route-change',\n handler: 'waitForRouteChange',\n },\n {\n method: 'POST',\n path: '/ai/wait-for-element',\n handler: 'waitForElementRegistered',\n bodyRequired: true,\n },\n\n // Tier 3.2 — mixed action/wait/snapshot batch\n {\n method: 'POST',\n path: '/control/batch-execute',\n handler: 'controlBatch',\n bodyRequired: true,\n },\n\n // Diagnostics\n { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\n\n // Navigation adapter\n { method: 'GET', path: '/control/page/routes', handler: 'getRoutes' },\n {\n method: 'POST',\n path: '/control/page/navigate-to',\n handler: 'navigateByAdapter',\n bodyRequired: true,\n },\n];\n\n/**\n * Canonical app-agnostic interaction relay command actions.\n *\n * These are the cross-platform \"convenience\" interactions (click/type/read)\n * that the server relays verbatim over the SDK command channel (SSE for web,\n * WebSocket for the runner). The *action string* here is the single source of\n * truth shared by three sites:\n *\n * 1. `relay-handlers.ts` — `relayCommand('<action>', request)` queues it for\n * the connected browser/native tab.\n * 2. `react/commandHandlers.ts` — the browser-side `executeCommand` switch\n * MUST have a matching `case '<action>'`, otherwise the relay hits\n * `default: throw new Error('Unknown command action')` and the runner\n * silently falls back to its own Tauri webview (masking the failure).\n * 3. `native/react/commandHandlers.ts` — the React-Native relay parity case.\n *\n * The drift guard test (`relay-handlers.contract.test.ts`) asserts every entry\n * here resolves to a handler case so the browser executor can never again\n * queue an action it cannot execute. Add new app-agnostic interactions here\n * first, then wire all three sites.\n */\nexport const INTERACTION_RELAY_COMMAND_ACTIONS = [\n 'clickByText',\n 'clickBySelector',\n 'typeInto',\n 'readValue',\n 'findByText',\n] as const;\n\n/**\n * Union of the canonical interaction relay command action strings.\n */\nexport type InteractionRelayCommandAction =\n (typeof INTERACTION_RELAY_COMMAND_ACTIONS)[number];\n\n/**\n * WebSocket message types\n */\nexport type WebSocketMessageType =\n | 'subscribe'\n | 'unsubscribe'\n | 'event'\n | 'snapshot'\n | 'action'\n | 'error';\n\n/**\n * WebSocket message\n */\nexport interface WebSocketMessage<T = unknown> {\n type: WebSocketMessageType;\n channel?: string;\n data?: T;\n error?: string;\n timestamp: number;\n}\n","// @generated from diagnostics/codes.json — do not edit\n/* eslint-disable */\n\n/**\n * Canonical UI Bridge diagnostic code vocabulary + recovery catalog.\n * Generated from `diagnostics/codes.json`. See `scripts/gen-diagnostics.ts`.\n */\n\nexport type UiBridgeErrorCode =\n | \"UB-ACTION-FAILED\"\n | \"UB-ACTION-REJECTED\"\n | \"UB-ACTION-TIMEOUT\"\n | \"UB-AMBIGUOUS-MATCH\"\n | \"UB-ASSERT-CONTRAST\"\n | \"UB-ASSERT-ELEMENT-MISSING\"\n | \"UB-ASSERT-LAYOUT\"\n | \"UB-ASSERT-TEXT-MISMATCH\"\n | \"UB-ASSERT-TIMEOUT\"\n | \"UB-ASSERT-VISIBILITY\"\n | \"UB-ELEM-BLOCKED\"\n | \"UB-ELEM-DISABLED\"\n | \"UB-ELEM-NOT-ENABLED\"\n | \"UB-ELEM-NOT-FOUND\"\n | \"UB-ELEM-NOT-INTERACTABLE\"\n | \"UB-ELEM-NOT-VISIBLE\"\n | \"UB-HEALTH-EMPTY-CONTENT-AREA\"\n | \"UB-HEALTH-EMPTY-TEXT-SIGNAL\"\n | \"UB-HEALTH-ERROR-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOADING-CLASS-SIGNAL\"\n | \"UB-HEALTH-LOADING-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\"\n | \"UB-HEALTH-LOW-SPATIAL-COVERAGE\"\n | \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\"\n | \"UB-HEALTH-NO-CONTENT-ELEMENTS\"\n | \"UB-HEALTH-OFF-SCREEN-ELEMENT\"\n | \"UB-HEALTH-SPARSE-CONTENT\"\n | \"UB-HEALTH-ZERO-SIZE-ELEMENT\"\n | \"UB-LOW-CONFIDENCE\"\n | \"UB-MULTIPLE-ELEMENTS\"\n | \"UB-NAVIGATION-ERROR\"\n | \"UB-NET-ERROR\"\n | \"UB-PAGE-LOAD-ERROR\"\n | \"UB-PARSE-ERROR\"\n | \"UB-STALE-ELEMENT\"\n | \"UB-STATE-NOT-REACHED\"\n | \"UB-UNEXPECTED-STATE\"\n | \"UB-UNKNOWN-ERROR\"\n | \"UB-UNSUPPORTED-ACTION\"\n | \"UB-VALIDATION-ERROR\"\n | \"UB-VLM-STRUCTURED-PARSE-FAIL\";\n\n/** All diagnostic codes, in stable sorted order. */\nexport const UI_BRIDGE_ERROR_CODES: readonly UiBridgeErrorCode[] = [\n \"UB-ACTION-FAILED\",\n \"UB-ACTION-REJECTED\",\n \"UB-ACTION-TIMEOUT\",\n \"UB-AMBIGUOUS-MATCH\",\n \"UB-ASSERT-CONTRAST\",\n \"UB-ASSERT-ELEMENT-MISSING\",\n \"UB-ASSERT-LAYOUT\",\n \"UB-ASSERT-TEXT-MISMATCH\",\n \"UB-ASSERT-TIMEOUT\",\n \"UB-ASSERT-VISIBILITY\",\n \"UB-ELEM-BLOCKED\",\n \"UB-ELEM-DISABLED\",\n \"UB-ELEM-NOT-ENABLED\",\n \"UB-ELEM-NOT-FOUND\",\n \"UB-ELEM-NOT-INTERACTABLE\",\n \"UB-ELEM-NOT-VISIBLE\",\n \"UB-HEALTH-EMPTY-CONTENT-AREA\",\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\",\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\",\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\",\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\",\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\",\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\",\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\",\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\",\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\",\n \"UB-HEALTH-SPARSE-CONTENT\",\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\",\n \"UB-LOW-CONFIDENCE\",\n \"UB-MULTIPLE-ELEMENTS\",\n \"UB-NAVIGATION-ERROR\",\n \"UB-NET-ERROR\",\n \"UB-PAGE-LOAD-ERROR\",\n \"UB-PARSE-ERROR\",\n \"UB-STALE-ELEMENT\",\n \"UB-STATE-NOT-REACHED\",\n \"UB-UNEXPECTED-STATE\",\n \"UB-UNKNOWN-ERROR\",\n \"UB-UNSUPPORTED-ACTION\",\n \"UB-VALIDATION-ERROR\",\n \"UB-VLM-STRUCTURED-PARSE-FAIL\",\n] as const;\n\nexport type DiagnosticCategory =\n | 'element'\n | 'action'\n | 'assertion'\n | 'network'\n | 'system';\n\n/**\n * Canonical recovery suggestion shape (D6). One type across every\n * failure surface: ActionFailureDetails, StructuredFailureInfo,\n * ERROR_SUGGESTIONS, getRecoverySuggestions, codes.json.recoveryTemplate.\n */\nexport interface RecoverySuggestion {\n /** Human-readable suggestion. */\n suggestion: string;\n /** Optional machine-executable command. */\n command?: string;\n /** Confidence this will help (0-1). */\n confidence: number;\n /** Whether retrying the original action may help. */\n retryable: boolean;\n /** Order hint (lower = try first). */\n priority?: number;\n}\n\nexport interface DiagnosticEntry {\n description: string;\n commonCauses: string[];\n recoveryTemplate: RecoverySuggestion[];\n category: DiagnosticCategory;\n}\n\nexport const DIAGNOSTICS: Record<UiBridgeErrorCode, DiagnosticEntry> = {\n \"UB-ACTION-FAILED\": {\n description: \"The action could not be completed.\",\n commonCauses: [\n \"The element became non-interactable mid-action\",\n \"A transient runtime error interrupted the action\",\n \"The underlying handler threw\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check if the element is interactable\", confidence: 0.7, retryable: false, priority: 1 },\n { suggestion: \"Wait and retry the action\", command: \"wait 1 second then retry\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-REJECTED\": {\n description: \"The action was rejected before execution (e.g. by a guard, policy, or validation gate).\",\n commonCauses: [\n \"A safety guard blocked the action\",\n \"The action is not permitted in the current state\",\n \"Preconditions for the action were not met\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check whether the action is permitted in the current state\", confidence: 0.6, retryable: false, priority: 1 },\n { suggestion: \"Satisfy the action's preconditions and retry\", confidence: 0.5, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-TIMEOUT\": {\n description: \"The action timed out waiting for a condition to be met.\",\n commonCauses: [\n \"The awaited condition can never be satisfied\",\n \"The configured timeout is too short for the operation\",\n \"The page stopped responding\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the timeout duration (the wait gave up after ${waitDurationMs}ms)\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check if the condition '${waitCondition}' can ever be met\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Verify the page is responding\", command: \"check page status\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"action\",\n },\n \"UB-AMBIGUOUS-MATCH\": {\n description: \"Multiple elements match with similar confidence; a single best match could not be chosen.\",\n commonCauses: [\n \"Two or more elements have near-identical text\",\n \"The search criteria are not discriminating enough\",\n \"Section context was not provided\",\n ],\n recoveryTemplate: [\n { suggestion: \"Be more specific about which element you mean\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the section or form name in the description\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ASSERT-CONTRAST\": {\n description: \"A color-contrast (accessibility) assertion failed.\",\n commonCauses: [\n \"Foreground/background contrast is below the required ratio\",\n \"A theme change reduced contrast\",\n \"The element is over a low-contrast background\",\n ],\n recoveryTemplate: [\n { suggestion: \"Adjust the color tokens to meet the required contrast ratio\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-ELEMENT-MISSING\": {\n description: \"An assertion targeted an element that does not exist.\",\n commonCauses: [\n \"The target element was never registered or rendered\",\n \"The element was removed before the assertion ran\",\n \"The selector/id is wrong\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the element id/selector and that it is rendered before asserting\", command: \"wait for element\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-LAYOUT\": {\n description: \"A layout/geometry assertion failed (position, size, alignment, overlap).\",\n commonCauses: [\n \"The element's geometry differs from the expected layout\",\n \"A responsive breakpoint changed the layout\",\n \"The assertion ran before layout settled\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for layout to settle and re-assert\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TEXT-MISMATCH\": {\n description: \"An assertion about element text content failed (exact/contains/regex mismatch).\",\n commonCauses: [\n \"The actual text differs from the expected text\",\n \"The text had not finished updating when asserted\",\n \"Whitespace or casing differences\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-read the element text and compare; relax to a contains/regex match if appropriate\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TIMEOUT\": {\n description: \"An assertion timed out waiting for its condition.\",\n commonCauses: [\n \"The asserted condition never became true\",\n \"The timeout was shorter than the time the condition needs\",\n \"The page stopped updating\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the assertion timeout or verify the condition can be met\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-VISIBILITY\": {\n description: \"An assertion about element visibility failed.\",\n commonCauses: [\n \"The element was expected visible but is hidden (or vice versa)\",\n \"The element had not rendered when the assertion ran\",\n \"An overlay changed effective visibility\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the element to reach the expected visibility and re-assert\", command: \"wait for element\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ELEM-BLOCKED\": {\n description: \"The element is blocked by another element such as a modal, overlay, or popup.\",\n commonCauses: [\n \"A modal dialog is open over the target\",\n \"A toast or notification overlay intercepts pointer events\",\n \"A full-screen loading layer is present\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close the modal or popup\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Dismiss the overlay\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for the blocking element to disappear\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-DISABLED\": {\n description: \"The element is disabled and cannot be interacted with.\",\n commonCauses: [\n \"Required prerequisite fields are not yet filled\",\n \"A guard condition keeps the control disabled\",\n \"An async dependency has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for '${elementId}' to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-ENABLED\": {\n description: \"The element is present and visible but disabled, so it cannot be interacted with.\",\n commonCauses: [\n \"Required form fields have not been filled\",\n \"A prerequisite step in a workflow is incomplete\",\n \"The element is intentionally disabled until an async operation completes\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps in the form\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for the element to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-FOUND\": {\n description: \"No element matching the target description or selector could be found.\",\n commonCauses: [\n \"The page had not finished loading when the action ran\",\n \"The element is rendered only after a user interaction\",\n \"The description/selector does not match any element on the page\",\n \"The element is in a different route or tab than the active one\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to fully load, then look for '${elementId}' again\", command: \"wait for page to load\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Use a different description for the element '${elementId}'\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Scroll the page to reveal '${elementId}'\", command: \"scroll down\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-INTERACTABLE\": {\n description: \"The element is visible and enabled but cannot receive the interaction (e.g. covered, animating, or pointer-events:none).\",\n commonCauses: [\n \"A modal or popup is overlaying the element\",\n \"A CSS animation or transition is in progress\",\n \"The element is partially outside the viewport\",\n \"pointer-events:none is set on the element or an ancestor\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close any modal or popup blocking the element\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Scroll the element into the viewport\", command: \"scroll to element\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for animations to complete\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-VISIBLE\": {\n description: \"The element exists in the DOM but is not currently visible.\",\n commonCauses: [\n \"The element is scrolled out of the viewport\",\n \"A loading overlay or modal is covering it\",\n \"A parent has display:none or visibility:hidden\",\n \"The element has zero size or no layout box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Scroll to make '${elementId}' visible\", command: \"scroll to element\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Close any blocking modals or popups\", command: \"click close button\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for any loading overlays to disappear\", command: \"wait for loading\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-HEALTH-EMPTY-CONTENT-AREA\": {\n description: \"Page health: the main content area is nearly empty while the sidebar/left region has content.\",\n commonCauses: [\n \"The content panel failed to render\",\n \"A data fetch for the main view errored\",\n \"A routing issue left the content region blank\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the view and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\": {\n description: \"Page health: empty-state text was detected (e.g. \\\"no results\\\", \\\"nothing here\\\").\",\n commonCauses: [\n \"A data set returned no items\",\n \"A filter excluded all results\",\n \"The expected data failed to load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the data source and filters; re-run the health check after data loads\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\": {\n description: \"Page health: error-indicating text was detected on the page.\",\n commonCauses: [\n \"An application error was rendered to the user\",\n \"A failed request surfaced an error banner\",\n \"An exception boundary rendered a fallback\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the error message and address the underlying failure before retrying\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\": {\n description: \"Page health: a loading/skeleton/spinner CSS class was detected on a visible element.\",\n commonCauses: [\n \"A skeleton or spinner is still showing\",\n \"An async region has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the loading indicator to clear and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\": {\n description: \"Page health: loading-indicating text was detected, suggesting the page is not settled.\",\n commonCauses: [\n \"An async load is still in progress\",\n \"The page is stuck in a loading state\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for loading to complete and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\": {\n description: \"Page health: all visible elements are navigation-type, suggesting the content body is missing.\",\n commonCauses: [\n \"Only chrome/navigation rendered; the body did not\",\n \"Content failed to load behind the navigation shell\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\": {\n description: \"Page health: rendered elements occupy a critically/abnormally small fraction of the viewport.\",\n commonCauses: [\n \"The page is still loading content\",\n \"A render error left most of the page blank\",\n \"The main content failed to mount\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to finish loading and re-run the health check\", command: \"wait for page to load\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\": {\n description: \"Page health: over half of interactive elements are disabled.\",\n commonCauses: [\n \"The page is gated behind an unmet precondition\",\n \"A loading state disabled most controls\",\n \"The user lacks permission for most actions\",\n ],\n recoveryTemplate: [\n { suggestion: \"Satisfy the precondition that enables the controls, then re-run the health check\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\": {\n description: \"Page health: no elements were found in the content region.\",\n commonCauses: [\n \"The content view did not mount\",\n \"An exception prevented content rendering\",\n \"The page is stuck before content load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\": {\n description: \"Page health: a visible element is positioned entirely off-screen.\",\n commonCauses: [\n \"A negative-offset or transform pushed the element out of view\",\n \"A layout bug positioned the element outside the viewport\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's positioning/CSS; this typically indicates a layout defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-SPARSE-CONTENT\": {\n description: \"Page health: the content region has very few elements.\",\n commonCauses: [\n \"Content is only partially rendered\",\n \"A list/grid returned few or no items\",\n \"The page is mid-load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for content to finish loading and re-run the health check\", command: \"wait for loading\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\": {\n description: \"Page health: a visible element has zero width or height.\",\n commonCauses: [\n \"A CSS layout bug collapsed the element\",\n \"Missing content gave the element no intrinsic size\",\n \"A fl/grid sizing rule produced a zero box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's layout/CSS; this typically indicates a rendering defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-LOW-CONFIDENCE\": {\n description: \"The best matching element has confidence below the acceptance threshold.\",\n commonCauses: [\n \"The description does not closely match any element's text\",\n \"The confidence threshold is set higher than the actual best match\",\n \"The element label differs from the human-expected wording\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use the exact text shown on the element\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Try a different description that more closely matches the element\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Lower the confidence threshold if the match is correct\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-MULTIPLE-ELEMENTS\": {\n description: \"Multiple elements match the description; the target is ambiguous.\",\n commonCauses: [\n \"The description is too generic\",\n \"Repeated list/grid items share the same label\",\n \"Several controls have identical accessible names\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a more specific description\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the element position (first, second, etc.)\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-NAVIGATION-ERROR\": {\n description: \"Navigation to the target page failed.\",\n commonCauses: [\n \"The target URL is incorrect or unreachable\",\n \"A navigation guard blocked the route\",\n \"The route does not exist\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try the navigation again\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Check if the URL is correct\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-NET-ERROR\": {\n description: \"A network error occurred while performing the action or loading data.\",\n commonCauses: [\n \"The backing request failed or timed out\",\n \"Connectivity was lost\",\n \"A CORS or proxy error blocked the request\",\n ],\n recoveryTemplate: [\n { suggestion: \"Retry the action once connectivity is restored\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PAGE-LOAD-ERROR\": {\n description: \"The page failed to load correctly.\",\n commonCauses: [\n \"A critical resource failed to load\",\n \"The server returned an error response\",\n \"Network connectivity was interrupted during load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page\", command: \"refresh page\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PARSE-ERROR\": {\n description: \"Could not parse the natural language instruction.\",\n commonCauses: [\n \"The instruction is too complex or ambiguous to parse\",\n \"The instruction does not reference a recognizable action\",\n \"The instruction format is unsupported\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a simpler instruction format like \\\"click Submit button\\\"\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Use specific element names visible on the page\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-STALE-ELEMENT\": {\n description: \"The element reference is no longer attached to the DOM.\",\n commonCauses: [\n \"The component unmounted between discovery and action\",\n \"A re-render replaced the element node\",\n \"The element was detached by a parent update\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-find '${elementId}'\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Wait for page to stabilize\", command: \"wait 1 second\", confidence: 0.7, retryable: true, priority: 2 },\n ],\n category: \"element\",\n },\n \"UB-STATE-NOT-REACHED\": {\n description: \"The expected post-action state was not reached.\",\n commonCauses: [\n \"The action did not produce the expected state transition\",\n \"An async side-effect has not completed yet\",\n \"The expected state assertion is incorrect\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for state to stabilize and re-check\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Verify the expected state condition is correct\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNEXPECTED-STATE\": {\n description: \"The element or page is in an unexpected state.\",\n commonCauses: [\n \"The page state drifted from what the workflow assumed\",\n \"A concurrent update changed the state\",\n \"Stale state was used for the decision\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page state\", command: \"refresh\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Wait for state to stabilize\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNKNOWN-ERROR\": {\n description: \"An unknown or uncategorized error occurred.\",\n commonCauses: [\n \"An unexpected runtime exception with no specific code\",\n \"An error path that has not yet been mapped to a stable code\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try a different approach or check the page state\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-UNSUPPORTED-ACTION\": {\n description: \"The requested action type is not supported for this element or surface.\",\n commonCauses: [\n \"The action verb is not implemented for the element type\",\n \"A composite action needs to be broken into primitives\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a different action type\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Break down into simpler actions\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-VALIDATION-ERROR\": {\n description: \"The parsed action failed validation.\",\n commonCauses: [\n \"Required parameters for the action are missing\",\n \"A parameter value is out of range or the wrong type\",\n \"The instruction format is invalid\",\n ],\n recoveryTemplate: [\n { suggestion: \"Provide required parameters for the action\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Check the instruction format\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-VLM-STRUCTURED-PARSE-FAIL\": {\n description: \"The VLM Describe response could not be parsed into the closed structured schema; the prose-only response was returned with structured=null.\",\n commonCauses: [\n \"The model returned malformed or non-JSON output in JSON mode\",\n \"The structured payload did not validate against the schema\",\n \"Model-specific JSON-mode unreliability\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fall back to the prose description; retry the describe call once\", confidence: 0.4, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n};\n","/**\n * UI Bridge diagnostics — single source of truth.\n *\n * The code vocabulary, recovery catalog, and canonical `RecoverySuggestion`\n * shape (D6) are generated from `diagnostics/codes.json` into\n * `codes.generated.ts`. This barrel re-exports them and folds the previously\n * hand-maintained `ERROR_SUGGESTIONS` map and `getRecoverySuggestions()` switch\n * onto that single source (plan D6 / §5).\n */\n\nexport type {\n UiBridgeErrorCode,\n DiagnosticCategory,\n RecoverySuggestion,\n DiagnosticEntry,\n} from './codes.generated';\nexport { UI_BRIDGE_ERROR_CODES, DIAGNOSTICS } from './codes.generated';\n\nimport type { UiBridgeErrorCode, RecoverySuggestion } from './codes.generated';\nimport { DIAGNOSTICS } from './codes.generated';\n\n/**\n * Recovery suggestions per code, sourced from the generated catalog.\n *\n * Replaces the former hand-maintained `ERROR_SUGGESTIONS` map in\n * `ai/error-context.ts` (D6 — one source). Returns a defensive copy so callers\n * may sort/mutate without corrupting the catalog.\n */\nexport const ERROR_SUGGESTIONS: Record<UiBridgeErrorCode, RecoverySuggestion[]> =\n Object.fromEntries(\n (Object.keys(DIAGNOSTICS) as UiBridgeErrorCode[]).map((code) => [\n code,\n DIAGNOSTICS[code].recoveryTemplate.map((r) => ({ ...r })),\n ])\n ) as Record<UiBridgeErrorCode, RecoverySuggestion[]>;\n\n/**\n * Context map used to render `${key}` placeholders inside recovery templates.\n * Values are coerced to strings at substitution time; `undefined`/`null`\n * entries leave their placeholder untouched (treated as \"unknown key\").\n */\nexport type RecoveryRenderContext = Record<\n string,\n string | number | boolean | null | undefined\n>;\n\nconst PLACEHOLDER_RE = /\\$\\{([^}]+)\\}/g;\n\n/**\n * Substitute `${key}` placeholders in a template string from a context map.\n *\n * - Any `${key}` present (and non-nullish) in `context` is replaced with its\n * stringified value (at minimum `${elementId}` / `${waitDurationMs}`, but\n * any key is supported).\n * - Unknown placeholders (key absent, or value `undefined`/`null`) are left\n * **verbatim** and nothing is logged (per Phase 3 spec).\n */\nfunction renderTemplateString(\n template: string,\n context: RecoveryRenderContext\n): string {\n if (template.indexOf('${') === -1) return template;\n return template.replace(PLACEHOLDER_RE, (whole, key: string) => {\n const value = context[key];\n if (value === undefined || value === null) return whole;\n return String(value);\n });\n}\n\n/**\n * Render a single recovery suggestion's `suggestion` and `command` strings\n * against a failure-context map, returning a fresh object (never mutates the\n * catalog entry).\n */\nfunction renderSuggestion(\n suggestion: RecoverySuggestion,\n context: RecoveryRenderContext\n): RecoverySuggestion {\n const rendered: RecoverySuggestion = {\n ...suggestion,\n suggestion: renderTemplateString(suggestion.suggestion, context),\n };\n if (suggestion.command !== undefined) {\n rendered.command = renderTemplateString(suggestion.command, context);\n }\n return rendered;\n}\n\n/**\n * Generate recovery suggestions for an error code.\n *\n * Replaces the duplicated `getRecoverySuggestions()` switch statements in\n * `server/handlers.ts` and `ui-bridge-server/handlers.ts` (D6 — one source).\n * Unknown codes fall back to the generic `UB-UNKNOWN-ERROR` template.\n *\n * When `context` is supplied, every `${key}` placeholder in each suggestion's\n * `suggestion`/`command` is substituted from it (Phase 3 — sync failure paths\n * pass `${elementId}` / `${waitDurationMs}` / etc.). Unknown placeholders are\n * left untouched. Without `context` the static catalog template is returned\n * (defensive copy).\n */\nexport function getRecoverySuggestions(\n errorCode: UiBridgeErrorCode,\n context?: RecoveryRenderContext\n): RecoverySuggestion[] {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n if (!context) {\n return entry.recoveryTemplate.map((r) => ({ ...r }));\n }\n return entry.recoveryTemplate.map((r) => renderSuggestion(r, context));\n}\n\n/**\n * Error codes for which retrying the original action is recommended.\n * Derived from the catalog: a code is retry-recommended when any of its\n * recovery template entries is `retryable: true`.\n */\nfunction isRetryRecommended(errorCode: UiBridgeErrorCode): boolean {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n return entry.recoveryTemplate.some((r) => r.retryable);\n}\n\n/**\n * Structured-failure shape mirror of `core/types.ts` `ActionFailureDetails`.\n * Re-declared structurally here (rather than imported) to keep the\n * diagnostics barrel free of a back-edge into `core`; the field set is the\n * subset every failure surface populates.\n */\nexport interface BuiltActionFailureDetails {\n errorCode: UiBridgeErrorCode;\n message: string;\n elementId?: string;\n suggestedActions: RecoverySuggestion[];\n retryRecommended: boolean;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /** Typed-reason discriminators (Phase 3) — mirror `ActionFailureDetails`. */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n}\n\n/**\n * Map a loosely-typed internal/legacy error code (the historical\n * `error(msg, 'NOT_FOUND')`-style strings used across `handlers.ts` /\n * `relay-handlers.ts`) plus its prose message to a canonical\n * `UiBridgeErrorCode`.\n *\n * Single source for `ui-bridge-server/src/error-mapper.ts` and the\n * `ui-bridge` `server/relay-handlers.ts` `error()` helper (Phase 1). The\n * legacy strings are an internal SDK convention, not a public wire vocabulary\n * (no `legacy:[]` recognition surface — D1); this mapper exists only to\n * convert them at the response boundary so `APIResponse.code` is canonical.\n *\n * Resolution order: explicit code mapping → message heuristic →\n * `UB-UNKNOWN-ERROR`.\n */\nconst INTERNAL_CODE_TO_CANONICAL: Record<string, UiBridgeErrorCode> = {\n NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n ELEMENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n COMPONENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n INVALID_REQUEST: 'UB-VALIDATION-ERROR',\n VALIDATION_ERROR: 'UB-VALIDATION-ERROR',\n NOT_IMPLEMENTED: 'UB-UNSUPPORTED-ACTION',\n RUNNER_REQUIRED: 'UB-ACTION-REJECTED',\n RUNNER_UNAVAILABLE: 'UB-NET-ERROR',\n RUNNER_ERROR: 'UB-NET-ERROR',\n COMMAND_FAILED: 'UB-ACTION-FAILED',\n HEADLESS_SPAWN_UNSUPPORTED_ON_RELAY: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_SPAWN_DISABLED: 'UB-ACTION-REJECTED',\n HEADLESS_PEER_MISSING: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_LAUNCH_FAILED: 'UB-ACTION-FAILED',\n WAIT_ERROR: 'UB-ACTION-TIMEOUT',\n PAGE_HEALTH_ERROR: 'UB-UNKNOWN-ERROR',\n QUERY_ERROR: 'UB-VALIDATION-ERROR',\n CDP_DISABLED: 'UB-ACTION-REJECTED',\n UNAUTHORIZED: 'UB-ACTION-REJECTED',\n INTERNAL_ERROR: 'UB-UNKNOWN-ERROR',\n};\n\nexport function mapInternalErrorCode(\n internalCode?: string,\n message?: string\n): UiBridgeErrorCode {\n if (internalCode) {\n // Already canonical — pass through.\n if ((DIAGNOSTICS as Record<string, unknown>)[internalCode]) {\n return internalCode as UiBridgeErrorCode;\n }\n const mapped = INTERNAL_CODE_TO_CANONICAL[internalCode];\n if (mapped) return mapped;\n // Generic `*_ERROR` convention → categorise by family below, else unknown.\n if (internalCode.endsWith('_ERROR')) {\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n return 'UB-UNKNOWN-ERROR';\n }\n }\n\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('not visible') || m.includes('hidden'))\n return 'UB-ELEM-NOT-VISIBLE';\n if (m.includes('disabled')) return 'UB-ELEM-DISABLED';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n if (m.includes('required') || m.includes('invalid'))\n return 'UB-VALIDATION-ERROR';\n if (m.includes('network') || m.includes('disconnected'))\n return 'UB-NET-ERROR';\n\n return 'UB-UNKNOWN-ERROR';\n}\n\n/**\n * Build canonical structured failure details from an error code + prose\n * message. Single source for the `failureDetails` field added to\n * `ComponentActionResponse` / `WorkflowStepResult` in Phase 1 (and reused by\n * the server `createFailureDetails`). `suggestedActions` and\n * `retryRecommended` are both derived from the generated catalog (D6) — no\n * hand-maintained tables.\n */\nexport function buildActionFailureDetails(\n errorCode: UiBridgeErrorCode,\n message: string,\n options: {\n elementId?: string;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /**\n * Failure-context map for rendering `${...}` placeholders in the catalog\n * recovery templates (Phase 3). `elementId` is auto-merged in when set.\n */\n renderContext?: RecoveryRenderContext;\n /** Typed-reason discriminators (Phase 3). */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n } = {}\n): BuiltActionFailureDetails {\n // The element id is always a valid `${elementId}` substitution source even\n // when the caller didn't pass an explicit renderContext.\n const renderContext: RecoveryRenderContext | undefined =\n options.renderContext || options.elementId !== undefined\n ? { elementId: options.elementId, ...options.renderContext }\n : undefined;\n\n return {\n errorCode,\n message,\n elementId: options.elementId,\n suggestedActions: getRecoverySuggestions(errorCode, renderContext),\n retryRecommended: isRetryRecommended(errorCode),\n context: options.context,\n durationMs: options.durationMs,\n timeoutMs: options.timeoutMs,\n disabledReason: options.disabledReason,\n visibilityReason: options.visibilityReason,\n staleReason: options.staleReason,\n waitCondition: options.waitCondition,\n waitTimedOutAfterMs: options.waitTimedOutAfterMs,\n timeoutType: options.timeoutType,\n };\n}\n","/**\n * SVG-safe helpers for reading an element's class string.\n *\n * Background: `Element.className` is typed as `string` on HTMLElement but as\n * `SVGAnimatedString` on SVGElement / MathMLElement. Calling `.split`,\n * `.toLowerCase`, `.trim`, etc. directly on `el.className` throws when the\n * element is an SVG/MathML node. Always route class-string reads through\n * these helpers.\n *\n * Writes (`el.className = '...'`) are fine via the native DOM API and do not\n * need this helper.\n */\n\n/**\n * Safely extract the class string from an element, handling both HTML\n * (string className) and SVG/MathML (SVGAnimatedString).\n *\n * Returns `''` for null/undefined elements or when className is unset.\n */\nexport function classString(el: Element | null | undefined): string {\n if (!el) return '';\n const cn = (el as HTMLElement).className;\n if (typeof cn === 'string') return cn;\n const baseVal = (cn as SVGAnimatedString | undefined)?.baseVal;\n return typeof baseVal === 'string' ? baseVal : '';\n}\n\n/**\n * Convenience: `classString(el)` split on whitespace, empty strings filtered.\n * Prefer `el.classList` when available — only use this when you need the\n * raw token array for string matching (e.g., `.some(c => c.startsWith('btn-'))`).\n */\nexport function classList(el: Element | null | undefined): string[] {\n const s = classString(el).trim();\n return s ? s.split(/\\s+/) : [];\n}\n","/**\n * Element Fingerprint Generation\n *\n * Computes stable fingerprints for DOM elements that enable cross-page element matching\n * and state discovery. Fingerprint hashes are deterministic and match the Python\n * ElementFingerprint schema in qontinui/state_machine/fingerprint_types.py.\n *\n * Fingerprints capture structural and semantic properties that remain stable across\n * page loads and navigation, enabling the state machine to identify states by\n * element composition rather than brittle selectors.\n */\n\nimport type { UIBridgeRegistry } from './registry';\nimport type { RegisteredElement } from './types';\nimport { classString, classList } from './class-name';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Repeat pattern information for list/grid/table items.\n * Matches Python RepeatPattern.to_dict() output.\n */\nexport interface RepeatPatternData {\n type: 'list' | 'grid' | 'table';\n containerSelector: string;\n itemSelector: string;\n index: number;\n totalCount: number;\n}\n\n/**\n * Browser-computed element fingerprint for stable identification.\n * Matches Python ElementFingerprint.to_dict() output (camelCase keys).\n */\nexport interface ElementFingerprintData {\n hash: string;\n structuralPath: string;\n positionZone: string;\n landmarkContext: string;\n landmarkLabel?: string;\n role: string;\n tagName: string;\n accessibleName?: string;\n sizeCategory: string;\n relativePosition: { top: number; left: number };\n isRepeating: boolean;\n repeatPattern?: RepeatPatternData;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ARIA landmark roles */\nconst ARIA_LANDMARKS = new Set([\n 'banner',\n 'complementary',\n 'contentinfo',\n 'form',\n 'main',\n 'navigation',\n 'region',\n 'search',\n]);\n\n/** Tag name to implicit landmark mapping */\nconst IMPLICIT_LANDMARKS: Record<string, string> = {\n NAV: 'navigation',\n MAIN: 'main',\n HEADER: 'banner',\n FOOTER: 'contentinfo',\n ASIDE: 'complementary',\n FORM: 'form',\n SEARCH: 'search',\n};\n\n/** Tag name to implicit ARIA role mapping */\nconst IMPLICIT_ROLES: Record<string, string | ((el: HTMLElement) => string)> = {\n BUTTON: 'button',\n A: (el) => (el.hasAttribute('href') ? 'link' : ''),\n INPUT: (el) => {\n const type = (el as HTMLInputElement).type?.toLowerCase();\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'range') return 'slider';\n if (type === 'submit' || type === 'reset' || type === 'button') return 'button';\n return 'textbox';\n },\n SELECT: (el) => ((el as HTMLSelectElement).multiple ? 'listbox' : 'combobox'),\n TEXTAREA: 'textbox',\n IMG: 'img',\n TABLE: 'table',\n UL: 'list',\n OL: 'list',\n LI: 'listitem',\n H1: 'heading',\n H2: 'heading',\n H3: 'heading',\n H4: 'heading',\n H5: 'heading',\n H6: 'heading',\n DIALOG: 'dialog',\n DETAILS: 'group',\n SUMMARY: 'button',\n PROGRESS: 'progressbar',\n METER: 'meter',\n};\n\n/** Dynamic content patterns to replace with placeholders */\nconst DYNAMIC_PATTERNS = [\n // UUIDs\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n // ISO dates\n /\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/g,\n // Timestamps (10+ digits)\n /\\b\\d{10,13}\\b/g,\n // Standalone numbers (3+ digits, not part of a word)\n /\\b\\d{3,}\\b/g,\n // Common date formats (MM/DD/YYYY, DD.MM.YYYY)\n /\\d{1,2}[/.-]\\d{1,2}[/.-]\\d{2,4}/g,\n // Time patterns\n /\\d{1,2}:\\d{2}(:\\d{2})?\\s*(AM|PM|am|pm)?/g,\n];\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Compute the structural path of an element (tag names only).\n * Walks up from the element to <body>, collecting only tag names.\n * Example: \"main > section > div > button\"\n */\nfunction computeStructuralPath(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.tagName !== 'BODY' && current.tagName !== 'HTML') {\n parts.unshift(current.tagName.toLowerCase());\n current = current.parentElement;\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Determine the position zone of an element based on viewport-relative position.\n */\nfunction computePositionZone(element: HTMLElement): string {\n // Check for modal first (walk up ancestors)\n let ancestor: HTMLElement | null = element;\n while (ancestor) {\n if (\n ancestor.getAttribute('role') === 'dialog' ||\n ancestor.getAttribute('aria-modal') === 'true' ||\n ancestor.tagName === 'DIALOG'\n ) {\n return 'modal';\n }\n ancestor = ancestor.parentElement;\n }\n\n const rect = element.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n if (vw === 0 || vh === 0) return 'main';\n\n const centerY = (rect.top + rect.bottom) / 2 / vh;\n const centerX = (rect.left + rect.right) / 2 / vw;\n\n if (centerY < 0.1) return 'header';\n if (centerY > 0.9) return 'footer';\n if (centerX < 0.2) return 'sidebar-left';\n if (centerX > 0.8) return 'sidebar-right';\n\n return 'main';\n}\n\n/**\n * Get the ARIA role of an element (explicit or implicit).\n */\nfunction computeRole(element: HTMLElement): string {\n const explicit = element.getAttribute('role');\n if (explicit) return explicit;\n\n const implicit = IMPLICIT_ROLES[element.tagName];\n if (typeof implicit === 'function') return implicit(element);\n if (typeof implicit === 'string') return implicit;\n\n return '';\n}\n\n/**\n * Get the accessible name of an element.\n * Priority: aria-label → resolved aria-labelledby → textContent for buttons/links.\n * Dynamic patterns (numbers, dates, UUIDs) are replaced with {…}.\n */\nfunction computeAccessibleName(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return normalizeName(ariaLabel);\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const parts = labelledBy\n .split(/\\s+/)\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (parts.length > 0) return normalizeName(parts.join(' '));\n }\n\n // For buttons, links, headings: use textContent\n const tag = element.tagName;\n if (\n tag === 'BUTTON' ||\n tag === 'A' ||\n tag === 'SUMMARY' ||\n tag.match(/^H[1-6]$/) ||\n element.getAttribute('role') === 'button' ||\n element.getAttribute('role') === 'link' ||\n element.getAttribute('role') === 'tab'\n ) {\n const text = element.textContent?.trim();\n if (text) return normalizeName(text);\n }\n\n // For inputs: use associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n // Check for label[for]\n if (element.id) {\n const label = document.querySelector(`label[for=\"${CSS.escape(element.id)}\"]`);\n if (label?.textContent?.trim()) return normalizeName(label.textContent.trim());\n }\n // Check for wrapping label\n const wrappingLabel = element.closest('label');\n if (wrappingLabel?.textContent?.trim()) return normalizeName(wrappingLabel.textContent.trim());\n // Placeholder as last resort\n const placeholder = element.getAttribute('placeholder');\n if (placeholder) return normalizeName(placeholder);\n }\n\n return undefined;\n}\n\n/**\n * Normalize an accessible name: truncate, replace dynamic patterns.\n */\nfunction normalizeName(name: string): string {\n let normalized = name.trim();\n\n // Replace dynamic patterns with placeholder\n for (const pattern of DYNAMIC_PATTERNS) {\n normalized = normalized.replace(pattern, '{…}');\n }\n\n // Collapse whitespace\n normalized = normalized.replace(/\\s+/g, ' ');\n\n // Truncate to 50 chars\n if (normalized.length > 50) {\n normalized = normalized.slice(0, 50);\n }\n\n return normalized;\n}\n\n/**\n * Compute the size category based on element area relative to viewport.\n */\nfunction computeSizeCategory(element: HTMLElement): string {\n const rect = element.getBoundingClientRect();\n const viewportArea = window.innerWidth * window.innerHeight;\n\n if (viewportArea === 0) return 'medium';\n\n const ratio = (rect.width * rect.height) / viewportArea;\n\n if (ratio < 0.005) return 'icon';\n if (ratio < 0.01) return 'button';\n if (ratio < 0.03) return 'small';\n if (ratio < 0.1) return 'medium';\n if (ratio < 0.3) return 'large';\n if (ratio < 0.6) return 'fullwidth';\n return 'panel';\n}\n\n/**\n * Find the nearest ARIA landmark context by walking up ancestors.\n * Returns { landmark, label } tuple.\n */\nfunction computeLandmarkContext(element: HTMLElement): {\n landmark: string;\n label: string | undefined;\n} {\n let current: HTMLElement | null = element.parentElement;\n\n while (current && current.tagName !== 'BODY' && current.tagName !== 'HTML') {\n // Explicit landmark role\n const role = current.getAttribute('role');\n if (role && ARIA_LANDMARKS.has(role)) {\n return { landmark: role, label: current.getAttribute('aria-label') || undefined };\n }\n\n // Implicit landmark from tag\n const implicitLandmark = IMPLICIT_LANDMARKS[current.tagName];\n if (implicitLandmark) {\n return { landmark: implicitLandmark, label: current.getAttribute('aria-label') || undefined };\n }\n\n current = current.parentElement;\n }\n\n return { landmark: '', label: undefined };\n}\n\n/**\n * Detect if an element is part of a repeating pattern (list, grid, table).\n */\nfunction computeRepeatPattern(element: HTMLElement): RepeatPatternData | undefined {\n const parent = element.parentElement;\n if (!parent) return undefined;\n\n // Check for semantic list/grid/table containers\n const parentRole = parent.getAttribute('role');\n const parentTag = parent.tagName;\n\n let containerType: 'list' | 'grid' | 'table' | undefined;\n\n if (parentRole === 'list' || parentTag === 'UL' || parentTag === 'OL') {\n containerType = 'list';\n } else if (parentRole === 'grid' || parentRole === 'row') {\n containerType = 'grid';\n } else if (parentTag === 'TABLE' || parentTag === 'TBODY' || parentTag === 'THEAD') {\n containerType = 'table';\n }\n\n // Fallback: check if parent has 3+ children with identical tag+class\n if (!containerType) {\n const children = Array.from(parent.children);\n if (children.length >= 3) {\n const signature = (el: Element) => `${el.tagName}|${classString(el)}`;\n const sig = signature(element);\n const matches = children.filter((c) => signature(c) === sig);\n if (matches.length >= 3) {\n containerType = 'list'; // Infer as list\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n }\n\n // Compute index and total\n const siblings = Array.from(parent.children);\n const itemTag = element.tagName;\n const itemClass = classString(element);\n const matchingSiblings = siblings.filter(\n (s) => s.tagName === itemTag && classString(s) === itemClass\n );\n const index = matchingSiblings.indexOf(element);\n\n // Generate selectors\n const containerSelector = generateSimpleSelector(parent);\n const itemClassTokens = classList(element);\n const itemSelector = `${element.tagName.toLowerCase()}${\n itemClassTokens.length > 0 ? '.' + itemClassTokens.map((c) => CSS.escape(c)).join('.') : ''\n }`;\n\n return {\n type: containerType,\n containerSelector,\n itemSelector,\n index: Math.max(0, index),\n totalCount: matchingSiblings.length,\n };\n}\n\n/**\n * Generate a simple CSS selector for an element (for container references only).\n */\nfunction generateSimpleSelector(element: HTMLElement): string {\n if (element.id) return `#${CSS.escape(element.id)}`;\n const testId = element.getAttribute('data-testid');\n if (testId) return `[data-testid=\"${testId}\"]`;\n return element.tagName.toLowerCase();\n}\n\n/**\n * Synchronous hash using FNV-1a.\n * Produces a deterministic 16-char hex string from fingerprint properties.\n *\n * NOTE: The Python backend must use the same algorithm and input format\n * to produce matching hashes. Input format: \"structuralPath|positionZone|role|accessibleName|sizeCategory\"\n */\nfunction computeHashSync(\n structuralPath: string,\n positionZone: string,\n role: string,\n accessibleName: string | undefined,\n sizeCategory: string\n): string {\n const input = `${structuralPath}|${positionZone}|${role}|${accessibleName ?? ''}|${sizeCategory}`;\n\n // FNV-1a 64-bit hash (split into two 32-bit parts for JS)\n let h1 = 0x811c9dc5;\n let h2 = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c * 31;\n h2 = Math.imul(h2, 0x01000193);\n }\n\n const hex1 = (h1 >>> 0).toString(16).padStart(8, '0');\n const hex2 = (h2 >>> 0).toString(16).padStart(8, '0');\n return hex1 + hex2;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compute an element fingerprint from a live DOM element.\n *\n * This is synchronous — uses the sync hash function.\n * For async SHA-256 hashing, use computeElementFingerprintAsync().\n */\nexport function computeElementFingerprint(element: HTMLElement): ElementFingerprintData {\n const structuralPath = computeStructuralPath(element);\n const positionZone = computePositionZone(element);\n const role = computeRole(element);\n const accessibleName = computeAccessibleName(element);\n const sizeCategory = computeSizeCategory(element);\n const { landmark, label: landmarkLabel } = computeLandmarkContext(element);\n const repeatPattern = computeRepeatPattern(element);\n\n const rect = element.getBoundingClientRect();\n const vw = window.innerWidth || 1;\n const vh = window.innerHeight || 1;\n\n const fingerprint: ElementFingerprintData = {\n hash: computeHashSync(structuralPath, positionZone, role, accessibleName, sizeCategory),\n structuralPath,\n positionZone,\n landmarkContext: landmark,\n role,\n tagName: element.tagName.toLowerCase(),\n sizeCategory,\n relativePosition: {\n top: Math.round((rect.top / vh) * 1000) / 1000,\n left: Math.round((rect.left / vw) * 1000) / 1000,\n },\n isRepeating: repeatPattern !== undefined,\n };\n\n if (landmarkLabel) fingerprint.landmarkLabel = landmarkLabel;\n if (accessibleName) fingerprint.accessibleName = accessibleName;\n if (repeatPattern) fingerprint.repeatPattern = repeatPattern;\n\n return fingerprint;\n}\n\n/**\n * Compute fingerprints for all registered elements in the registry.\n * Returns a map keyed by fingerprint hash.\n *\n * Elements that share a fingerprint hash (e.g., identical list items)\n * are deduplicated — only the first is kept.\n */\nexport function computeAllFingerprints(\n registry: UIBridgeRegistry\n): Map<string, ElementFingerprintData> {\n const result = new Map<string, ElementFingerprintData>();\n const elements = registry.getAllElements();\n\n for (const registered of elements) {\n if (!registered.mounted || !registered.element.isConnected) continue;\n\n const fingerprint = computeElementFingerprint(registered.element);\n // First-write wins for duplicate hashes (deduplicates repeating items)\n if (!result.has(fingerprint.hash)) {\n result.set(fingerprint.hash, fingerprint);\n }\n }\n\n return result;\n}\n\n/**\n * Compute fingerprints with element ID mapping.\n * Returns fingerprints map and a mapping from fingerprint hash → element IDs.\n *\n * This is useful for the recording session to track which registered elements\n * correspond to which fingerprints.\n */\nexport function computeFingerprintsWithMapping(registry: UIBridgeRegistry): {\n fingerprints: Map<string, ElementFingerprintData>;\n hashToElementIds: Map<string, string[]>;\n elementIdToHash: Map<string, string>;\n} {\n const fingerprints = new Map<string, ElementFingerprintData>();\n const hashToElementIds = new Map<string, string[]>();\n const elementIdToHash = new Map<string, string>();\n\n const elements = registry.getAllElements();\n\n for (const registered of elements) {\n if (!registered.mounted || !registered.element.isConnected) continue;\n\n const fingerprint = computeElementFingerprint(registered.element);\n\n if (!fingerprints.has(fingerprint.hash)) {\n fingerprints.set(fingerprint.hash, fingerprint);\n }\n\n const ids = hashToElementIds.get(fingerprint.hash) || [];\n ids.push(registered.id);\n hashToElementIds.set(fingerprint.hash, ids);\n elementIdToHash.set(registered.id, fingerprint.hash);\n }\n\n return { fingerprints, hashToElementIds, elementIdToHash };\n}\n\n/**\n * Find the nearest registered element for a DOM element by walking up ancestors.\n * Used by the interaction interceptor to map DOM events to registered elements.\n */\nexport function findNearestRegisteredElement(\n target: HTMLElement,\n registry: UIBridgeRegistry\n): RegisteredElement | undefined {\n let current: HTMLElement | null = target;\n\n while (current && current.tagName !== 'BODY') {\n const registered = registry.findByDOMElement(current);\n if (registered) return registered;\n current = current.parentElement;\n }\n\n return undefined;\n}\n","/**\n * Interaction Interceptor\n *\n * Attaches document-level event listeners to capture user interactions on\n * registered UI Bridge elements. Applies event segmentation (from OpenAdapt)\n * by only capturing interactions on registered elements and coalescing\n * rapid keystroke sequences.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport { findNearestRegisteredElement } from '../core/element-fingerprint';\nimport type { InteractionEvent, InteractionActionType } from './types';\n\nexport interface InteractionInterceptorConfig {\n /** Only capture interactions on registered elements (default: true) */\n filterUnregistered: boolean;\n /** Keystroke coalescing window in ms (default: 100) */\n keystrokeCoalesceMs: number;\n}\n\ntype InteractionCallback = (event: InteractionEvent) => void;\n\n/**\n * Intercepts user interactions on the document and emits structured\n * InteractionEvents for registered elements.\n */\nexport class InteractionInterceptor {\n private registry: UIBridgeRegistry;\n private config: InteractionInterceptorConfig;\n private callback: InteractionCallback;\n private active = false;\n\n // Keystroke coalescing state\n private keystrokeTimer: ReturnType<typeof setTimeout> | null = null;\n private keystrokeBuffer = '';\n private keystrokeTargetId: string | null = null;\n private keystrokeTargetElement: HTMLElement | null = null;\n\n // Bound handlers for cleanup\n private handleClick: (e: MouseEvent) => void;\n private handleInput: (e: Event) => void;\n private handleChange: (e: Event) => void;\n private handleSubmit: (e: Event) => void;\n private handleKeydown: (e: KeyboardEvent) => void;\n\n constructor(\n registry: UIBridgeRegistry,\n callback: InteractionCallback,\n config: Partial<InteractionInterceptorConfig> = {}\n ) {\n this.registry = registry;\n this.callback = callback;\n this.config = {\n filterUnregistered: config.filterUnregistered ?? true,\n keystrokeCoalesceMs: config.keystrokeCoalesceMs ?? 100,\n };\n\n // Bind handlers\n this.handleClick = this.onClick.bind(this);\n this.handleInput = this.onInput.bind(this);\n this.handleChange = this.onChange.bind(this);\n this.handleSubmit = this.onSubmit.bind(this);\n this.handleKeydown = this.onKeydown.bind(this);\n }\n\n start(): void {\n if (this.active) return;\n this.active = true;\n\n // Use capture phase to intercept before application handlers\n document.addEventListener('click', this.handleClick, { capture: true, passive: true });\n document.addEventListener('input', this.handleInput, { capture: true, passive: true });\n document.addEventListener('change', this.handleChange, { capture: true, passive: true });\n document.addEventListener('submit', this.handleSubmit, { capture: true, passive: true });\n document.addEventListener('keydown', this.handleKeydown, { capture: true, passive: true });\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n // Flush any pending keystroke buffer\n this.flushKeystrokeBuffer();\n\n document.removeEventListener('click', this.handleClick, { capture: true });\n document.removeEventListener('input', this.handleInput, { capture: true });\n document.removeEventListener('change', this.handleChange, { capture: true });\n document.removeEventListener('submit', this.handleSubmit, { capture: true });\n document.removeEventListener('keydown', this.handleKeydown, { capture: true });\n }\n\n private resolveTarget(\n domTarget: EventTarget | null\n ): { elementId: string; element: HTMLElement } | null {\n if (!(domTarget instanceof HTMLElement)) return null;\n\n const registered = findNearestRegisteredElement(domTarget, this.registry);\n if (!registered && this.config.filterUnregistered) return null;\n if (!registered) return null;\n\n return { elementId: registered.id, element: registered.element };\n }\n\n private emit(\n actionType: InteractionActionType,\n elementId: string,\n element: HTMLElement,\n value?: string\n ): void {\n this.callback({\n timestamp: Date.now(),\n actionType,\n targetElementId: elementId,\n targetElement: element,\n value,\n });\n }\n\n private onClick(e: MouseEvent): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n // Don't emit click for checkboxes/radios — handled by onChange\n const el = target.element;\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) return;\n\n this.emit('click', target.elementId, target.element);\n }\n\n private onInput(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n const el = target.element;\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) return;\n\n // Coalesce keystrokes: buffer input events and flush after a quiet period\n if (this.keystrokeTargetId === target.elementId) {\n // Same target — extend buffer\n this.keystrokeBuffer = el.value;\n } else {\n // Different target — flush previous and start new\n this.flushKeystrokeBuffer();\n this.keystrokeTargetId = target.elementId;\n this.keystrokeTargetElement = target.element;\n this.keystrokeBuffer = el.value;\n }\n\n // Reset coalescing timer\n if (this.keystrokeTimer) clearTimeout(this.keystrokeTimer);\n this.keystrokeTimer = setTimeout(\n () => this.flushKeystrokeBuffer(),\n this.config.keystrokeCoalesceMs\n );\n }\n\n private flushKeystrokeBuffer(): void {\n if (this.keystrokeTimer) {\n clearTimeout(this.keystrokeTimer);\n this.keystrokeTimer = null;\n }\n\n if (this.keystrokeTargetId && this.keystrokeTargetElement && this.keystrokeBuffer) {\n this.emit('type', this.keystrokeTargetId, this.keystrokeTargetElement, this.keystrokeBuffer);\n }\n\n this.keystrokeTargetId = null;\n this.keystrokeTargetElement = null;\n this.keystrokeBuffer = '';\n }\n\n private onChange(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n const el = target.element;\n\n if (el instanceof HTMLSelectElement) {\n this.emit('select', target.elementId, target.element, el.value);\n } else if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox') {\n this.emit(\n el.checked ? 'check' : 'uncheck',\n target.elementId,\n target.element,\n String(el.checked)\n );\n } else if (el.type === 'radio') {\n this.emit('check', target.elementId, target.element, el.value);\n }\n }\n }\n\n private onSubmit(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n // Flush any pending keystrokes before submit\n this.flushKeystrokeBuffer();\n\n this.emit('submit', target.elementId, target.element);\n }\n\n private onKeydown(e: KeyboardEvent): void {\n // Only capture Enter (as submit trigger) and Escape (as cancel)\n if (e.key !== 'Enter' && e.key !== 'Escape') return;\n\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n if (e.key === 'Enter') {\n // Flush keystrokes before Enter\n this.flushKeystrokeBuffer();\n\n // If inside a form, this will trigger submit — don't double-emit\n const form = target.element.closest('form');\n if (form) return;\n\n // Otherwise emit as submit\n this.emit('submit', target.elementId, target.element);\n }\n // Escape is captured but not emitted as an interaction — it's noise\n }\n}\n","/**\n * Recording Session Manager\n *\n * Captures user interactions with before/after fingerprint snapshots,\n * producing a CooccurrenceExport for state machine bootstrapping.\n *\n * Pipeline:\n * 1. User clicks \"Record\" → start() takes initial fingerprint snapshot\n * 2. User interacts with app → InteractionInterceptor captures events\n * 3. For each interaction: before snapshot → wait for DOM settle → after snapshot\n * 4. User clicks \"Stop\" → stop() computes CooccurrenceExport from all captures\n * 5. Export is sent to Python backend for state discovery\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { ChangeObserver } from '../core/change-observer';\nimport {\n computeFingerprintsWithMapping,\n type ElementFingerprintData,\n} from '../core/element-fingerprint';\nimport { InteractionInterceptor } from './interaction-interceptor';\nimport type {\n RecordingSessionConfig,\n RecordingSessionResult,\n RecordingStatus,\n RecordedInteraction,\n VariableCandidate,\n InteractionEvent,\n CooccurrenceExportData,\n TransitionRecordData,\n PresenceMatrixEntryData,\n FingerprintStatsData,\n StateCandidateData,\n} from './types';\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\ninterface CaptureSnapshot {\n id: string;\n timestamp: number;\n url: string;\n title: string;\n fingerprintHashes: string[];\n}\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport class RecordingSessionManager {\n private registry: UIBridgeRegistry;\n private changeObserver: ChangeObserver | null;\n private config: Required<\n Pick<\n RecordingSessionConfig,\n | 'debounceMs'\n | 'maxCaptures'\n | 'filterUnregistered'\n | 'keystrokeCoalesceMs'\n | 'autoSaveIntervalMs'\n >\n > & {\n onAutoSave: RecordingSessionConfig['onAutoSave'];\n };\n\n // Session state\n private sessionId: string | null = null;\n private startTime = 0;\n private active = false;\n private interceptor: InteractionInterceptor | null = null;\n private autoSaveTimer: ReturnType<typeof setInterval> | null = null;\n\n // Collected data\n private captures: CaptureSnapshot[] = [];\n private allFingerprints = new Map<string, ElementFingerprintData>();\n private elementIdToHash = new Map<string, string>();\n private hashToElementIds = new Map<string, string[]>();\n private interactions: RecordedInteraction[] = [];\n private transitions: TransitionRecordData[] = [];\n private variables: VariableCandidate[] = [];\n\n // Snapshot caching\n private lastCaptureTime = 0;\n private lastCaptureId: string | null = null;\n\n // Pending interaction processing (queue to avoid dropping rapid interactions)\n private pendingSettleTimers: Array<{\n timer: ReturnType<typeof setTimeout>;\n unsubscribe?: () => void;\n }> = [];\n\n constructor(\n registry: UIBridgeRegistry,\n changeObserver: ChangeObserver | null = null,\n config: RecordingSessionConfig = {}\n ) {\n this.registry = registry;\n this.changeObserver = changeObserver;\n this.config = {\n debounceMs: config.debounceMs ?? 300,\n maxCaptures: config.maxCaptures ?? 500,\n filterUnregistered: config.filterUnregistered ?? true,\n keystrokeCoalesceMs: config.keystrokeCoalesceMs ?? 100,\n autoSaveIntervalMs: config.autoSaveIntervalMs ?? 30000,\n onAutoSave: config.onAutoSave,\n };\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n start(config?: RecordingSessionConfig): void {\n if (this.active) return;\n\n // Apply config overrides\n if (config) {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n this.sessionId = generateId('session');\n this.startTime = Date.now();\n this.active = true;\n\n // Reset collected data\n this.captures = [];\n this.allFingerprints = new Map();\n this.elementIdToHash = new Map();\n this.hashToElementIds = new Map();\n this.interactions = [];\n this.transitions = [];\n this.variables = [];\n this.lastCaptureTime = 0;\n this.lastCaptureId = null;\n\n // Take initial fingerprint snapshot\n this.takeCapture('initial');\n\n // Start interaction interception\n this.interceptor = new InteractionInterceptor(\n this.registry,\n (event) => this.onInteraction(event),\n {\n filterUnregistered: this.config.filterUnregistered,\n keystrokeCoalesceMs: this.config.keystrokeCoalesceMs,\n }\n );\n this.interceptor.start();\n\n // Start periodic auto-save for crash recovery\n if (this.config.onAutoSave && this.config.autoSaveIntervalMs > 0) {\n this.autoSaveTimer = setInterval(() => {\n if (!this.active) return;\n try {\n const partialExport = this.buildExport();\n this.config.onAutoSave?.(partialExport);\n } catch {\n // Swallow errors in auto-save to avoid disrupting the recording\n }\n }, this.config.autoSaveIntervalMs);\n }\n }\n\n stop(): RecordingSessionResult {\n if (!this.active || !this.sessionId) {\n throw new Error('No active recording session');\n }\n\n // Stop interceptor\n this.interceptor?.stop();\n this.interceptor = null;\n\n // Clear auto-save interval\n if (this.autoSaveTimer !== null) {\n clearInterval(this.autoSaveTimer);\n this.autoSaveTimer = null;\n }\n\n // Cancel all pending settle timers\n for (const pending of this.pendingSettleTimers) {\n clearTimeout(pending.timer);\n pending.unsubscribe?.();\n }\n this.pendingSettleTimers = [];\n\n // Take final snapshot\n this.takeCapture('final');\n\n // Build export\n const exportData = this.buildExport();\n const duration = Date.now() - this.startTime;\n\n const result: RecordingSessionResult = {\n sessionId: this.sessionId,\n duration,\n exportData,\n variables: this.variables,\n interactionCount: this.interactions.length,\n captureCount: this.captures.length,\n };\n\n // Reset\n this.active = false;\n this.sessionId = null;\n\n return result;\n }\n\n getStatus(): RecordingStatus {\n return {\n active: this.active,\n sessionId: this.sessionId ?? undefined,\n duration: this.active ? Date.now() - this.startTime : 0,\n interactionCount: this.interactions.length,\n captureCount: this.captures.length,\n };\n }\n\n // ============================================================================\n // Interaction Handling\n // ============================================================================\n\n private onInteraction(event: InteractionEvent): void {\n if (!this.active) return;\n\n // Get \"before\" capture (use cached if recent)\n const beforeCaptureId = this.getOrTakeBeforeCapture();\n\n // Capture the event and beforeCaptureId in a closure — each interaction\n // gets its own settle timer so rapid sequences don't drop interactions.\n const capturedEvent = event;\n\n this.waitForSettle(() => {\n if (!this.active) return;\n\n // Take \"after\" capture\n const afterCaptureId = this.takeCapture('action');\n\n // Get fingerprint for the target element\n const targetFingerprint = this.elementIdToHash.get(capturedEvent.targetElementId) ?? null;\n\n // Compute appeared/disappeared fingerprints\n const beforeCapture = this.captures.find((c) => c.id === beforeCaptureId);\n const afterCapture = this.captures.find((c) => c.id === afterCaptureId);\n const beforeSet = new Set(beforeCapture?.fingerprintHashes ?? []);\n const afterSet = new Set(afterCapture?.fingerprintHashes ?? []);\n\n const appeared = [...afterSet].filter((h) => !beforeSet.has(h));\n const disappeared = [...beforeSet].filter((h) => !afterSet.has(h));\n\n // Build TransitionRecord\n const transitionRecord: TransitionRecordData = {\n actionId: generateId('action'),\n actionType: capturedEvent.actionType,\n targetFingerprint,\n beforeCaptureId,\n afterCaptureId,\n appearedFingerprints: appeared,\n disappearedFingerprints: disappeared,\n timestamp: capturedEvent.timestamp,\n };\n this.transitions.push(transitionRecord);\n\n // Build RecordedInteraction\n const recorded: RecordedInteraction = {\n id: transitionRecord.actionId,\n timestamp: capturedEvent.timestamp,\n actionType: capturedEvent.actionType,\n targetFingerprint,\n targetElementId: capturedEvent.targetElementId,\n beforeCaptureId,\n afterCaptureId,\n value: capturedEvent.value,\n };\n this.interactions.push(recorded);\n\n // Variable detection\n if (\n capturedEvent.value &&\n (capturedEvent.actionType === 'type' || capturedEvent.actionType === 'select')\n ) {\n this.detectVariable(capturedEvent, targetFingerprint);\n }\n });\n }\n\n private getOrTakeBeforeCapture(): string {\n const now = Date.now();\n // Use cached capture if less than 200ms old\n if (this.lastCaptureId && now - this.lastCaptureTime < 200) {\n return this.lastCaptureId;\n }\n return this.takeCapture('before-action');\n }\n\n /**\n * Wait for DOM to settle, then invoke callback.\n * Each call creates its own independent timer — no shared mutable state.\n */\n private waitForSettle(callback: () => void): void {\n if (this.changeObserver) {\n // Wait for ChangeObserver to report no changes for debounceMs\n let settleTimeout: ReturnType<typeof setTimeout>;\n // eslint-disable-next-line prefer-const -- reassigned on line below via changeObserver.subscribe()\n let unsubscribe: (() => void) | undefined;\n const entry = { timer: settleTimeout!, unsubscribe: undefined as (() => void) | undefined };\n\n const complete = () => {\n unsubscribe?.();\n // Remove from pending list\n const idx = this.pendingSettleTimers.indexOf(entry);\n if (idx >= 0) this.pendingSettleTimers.splice(idx, 1);\n callback();\n };\n\n const resetSettle = () => {\n clearTimeout(settleTimeout);\n settleTimeout = setTimeout(complete, this.config.debounceMs);\n entry.timer = settleTimeout;\n };\n\n unsubscribe = this.changeObserver.subscribe(() => {\n resetSettle();\n });\n entry.unsubscribe = unsubscribe;\n\n this.pendingSettleTimers.push(entry);\n resetSettle();\n } else {\n // Fallback: simple timeout\n const timer = setTimeout(() => {\n const idx = this.pendingSettleTimers.findIndex((e) => e.timer === timer);\n if (idx >= 0) this.pendingSettleTimers.splice(idx, 1);\n callback();\n }, this.config.debounceMs);\n this.pendingSettleTimers.push({ timer });\n }\n }\n\n // ============================================================================\n // Fingerprint Snapshots\n // ============================================================================\n\n private takeCapture(_triggeredBy: string): string {\n if (this.captures.length >= this.config.maxCaptures) {\n // Evict oldest capture that is not referenced by any transition\n const referencedIds = new Set<string>();\n for (const t of this.transitions) {\n referencedIds.add(t.beforeCaptureId);\n referencedIds.add(t.afterCaptureId);\n }\n // Also keep first and most recent captures\n if (this.captures.length > 0) referencedIds.add(this.captures[0].id);\n if (this.captures.length > 1) referencedIds.add(this.captures[this.captures.length - 1].id);\n\n const evictIdx = this.captures.findIndex((c) => !referencedIds.has(c.id));\n if (evictIdx >= 0) {\n this.captures.splice(evictIdx, 1);\n } else if (this.captures.length > 1) {\n // All captures are referenced — evict second-oldest as last resort\n this.captures.splice(1, 1);\n }\n }\n\n const { fingerprints, hashToElementIds, elementIdToHash } = computeFingerprintsWithMapping(\n this.registry\n );\n\n // Merge into global fingerprint map\n for (const [hash, fp] of fingerprints) {\n if (!this.allFingerprints.has(hash)) {\n this.allFingerprints.set(hash, fp);\n }\n }\n\n // Update mappings\n for (const [hash, ids] of hashToElementIds) {\n this.hashToElementIds.set(hash, ids);\n }\n for (const [id, hash] of elementIdToHash) {\n this.elementIdToHash.set(id, hash);\n }\n\n const captureId = generateId('capture');\n const capture: CaptureSnapshot = {\n id: captureId,\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n fingerprintHashes: Array.from(fingerprints.keys()),\n };\n\n this.captures.push(capture);\n this.lastCaptureTime = capture.timestamp;\n this.lastCaptureId = captureId;\n\n return captureId;\n }\n\n // ============================================================================\n // Variable Detection\n // ============================================================================\n\n private detectVariable(event: InteractionEvent, fingerprint: string | null): void {\n if (!fingerprint || !event.value) return;\n\n // Don't add duplicate variables for the same element\n if (this.variables.some((v) => v.fingerprint === fingerprint)) {\n // Update the entered value to the latest\n const existing = this.variables.find((v) => v.fingerprint === fingerprint);\n if (existing) existing.enteredValue = event.value;\n return;\n }\n\n const el = event.targetElement;\n const inputType =\n el instanceof HTMLInputElement\n ? el.type\n : el instanceof HTMLSelectElement\n ? 'select'\n : el instanceof HTMLTextAreaElement\n ? 'textarea'\n : 'text';\n\n // Get label\n const label = this.getElementLabel(el);\n\n this.variables.push({\n fingerprint,\n elementId: event.targetElementId,\n inputType,\n enteredValue: event.value,\n label,\n suggestedParamName: labelToCamelCase(label),\n });\n }\n\n private getElementLabel(el: HTMLElement): string {\n // aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // Associated label element\n if (el.id) {\n const label = document.querySelector(`label[for=\"${CSS.escape(el.id)}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n const wrappingLabel = el.closest('label');\n if (wrappingLabel?.textContent?.trim()) return wrappingLabel.textContent.trim();\n\n // Placeholder\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n if (el.placeholder) return el.placeholder;\n }\n\n // data-testid as fallback\n const testId = el.getAttribute('data-testid');\n if (testId) return testId;\n\n // Name attribute\n const name = el.getAttribute('name');\n if (name) return name;\n\n return 'field';\n }\n\n // ============================================================================\n // Export Building\n // ============================================================================\n\n private buildExport(): CooccurrenceExportData {\n const allFingerprintHashes = Array.from(this.allFingerprints.keys());\n\n // Build fingerprint details\n const fingerprintDetails: Record<string, ElementFingerprintData> = {};\n for (const [hash, fp] of this.allFingerprints) {\n fingerprintDetails[hash] = fp;\n }\n\n // Build presence matrix\n const presenceMatrix: PresenceMatrixEntryData[] = this.captures.map((c) => ({\n captureId: c.id,\n url: c.url,\n fingerprints: c.fingerprintHashes,\n }));\n\n // Build co-occurrence counts\n const cooccurrenceCounts: Record<string, Record<string, number>> = {};\n for (const capture of this.captures) {\n const hashes = capture.fingerprintHashes;\n for (let i = 0; i < hashes.length; i++) {\n for (let j = i + 1; j < hashes.length; j++) {\n const a = hashes[i];\n const b = hashes[j];\n if (!cooccurrenceCounts[a]) cooccurrenceCounts[a] = {};\n if (!cooccurrenceCounts[b]) cooccurrenceCounts[b] = {};\n cooccurrenceCounts[a][b] = (cooccurrenceCounts[a][b] || 0) + 1;\n cooccurrenceCounts[b][a] = (cooccurrenceCounts[b][a] || 0) + 1;\n }\n }\n }\n\n // Build inverted index: fingerprint hash → list of captures containing it\n const hashToCaptureEntries = new Map<string, Array<{ id: string; timestamp: number }>>();\n for (const capture of this.captures) {\n const hashSet = new Set(capture.fingerprintHashes);\n for (const hash of hashSet) {\n let entries = hashToCaptureEntries.get(hash);\n if (!entries) {\n entries = [];\n hashToCaptureEntries.set(hash, entries);\n }\n entries.push({ id: capture.id, timestamp: capture.timestamp });\n }\n }\n\n // Build fingerprint stats using the inverted index (O(F) instead of O(F*C*H))\n const fingerprintStats: Record<string, FingerprintStatsData> = {};\n for (const hash of allFingerprintHashes) {\n const entries = hashToCaptureEntries.get(hash) ?? [];\n let firstSeen = Infinity;\n let lastSeen = 0;\n const captureIds: string[] = [];\n\n for (const entry of entries) {\n captureIds.push(entry.id);\n if (entry.timestamp < firstSeen) firstSeen = entry.timestamp;\n if (entry.timestamp > lastSeen) lastSeen = entry.timestamp;\n }\n\n fingerprintStats[hash] = {\n totalAppearances: captureIds.length,\n captureIds,\n firstSeen: firstSeen === Infinity ? 0 : firstSeen,\n lastSeen,\n };\n }\n\n // Build state candidates: group fingerprints by identical presence signature\n const stateCandidates = this.computeStateCandidates(allFingerprintHashes, hashToCaptureEntries);\n\n return {\n sessionId: this.sessionId!,\n exportedAt: Date.now(),\n allFingerprints: allFingerprintHashes,\n fingerprintDetails,\n presenceMatrix,\n cooccurrenceCounts,\n fingerprintStats,\n transitions: this.transitions,\n stateCandidates,\n };\n }\n\n private computeStateCandidates(\n allHashes: string[],\n hashToCaptureEntries: Map<string, Array<{ id: string; timestamp: number }>>\n ): StateCandidateData[] {\n // Group fingerprints by their presence signature (which captures they appear in)\n const signatureGroups = new Map<string, string[]>();\n\n for (const hash of allHashes) {\n // Build a signature from the inverted index (already computed)\n const entries = hashToCaptureEntries.get(hash) ?? [];\n const captureIds = entries.map((e) => e.id).sort();\n const signature = captureIds.join(',');\n\n const group = signatureGroups.get(signature) || [];\n group.push(hash);\n signatureGroups.set(signature, group);\n }\n\n // Only emit groups with 2+ fingerprints (single elements aren't useful states)\n const candidates: StateCandidateData[] = [];\n for (const [, group] of signatureGroups) {\n if (group.length < 2) continue;\n\n // Determine dominant position zone and landmark\n const zones = group\n .map((h) => this.allFingerprints.get(h)?.positionZone)\n .filter(Boolean) as string[];\n const landmarks = group\n .map((h) => this.allFingerprints.get(h)?.landmarkContext)\n .filter(Boolean) as string[];\n\n candidates.push({\n fingerprints: group.sort(),\n cooccurrenceRate: 1.0, // By definition — identical presence signature\n positionZone: mostFrequent(zones),\n landmarkContext: mostFrequent(landmarks),\n });\n }\n\n return candidates;\n }\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nlet idCounter = 0;\n\nfunction generateId(prefix: string): string {\n idCounter++;\n return `${prefix}-${Date.now()}-${idCounter}`;\n}\n\nfunction labelToCamelCase(label: string): string {\n return (\n label\n .replace(/[^a-zA-Z0-9\\s]/g, '')\n .trim()\n .split(/\\s+/)\n .map((word, i) =>\n i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('') || 'field'\n );\n}\n\nfunction mostFrequent(items: string[]): string | undefined {\n if (items.length === 0) return undefined;\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item, (counts.get(item) || 0) + 1);\n }\n let best = items[0];\n let bestCount = 0;\n for (const [item, count] of counts) {\n if (count > bestCount) {\n best = item;\n bestCount = count;\n }\n }\n return best;\n}\n","/**\n * WebSocket Handler for UI Bridge Server\n *\n * Handles WebSocket connections and message routing.\n */\n\nimport type { UIBridgeServerHandlers } from './types';\nimport type {\n BridgeEvent,\n BridgeEventType,\n WSClientMessage,\n WSServerMessage,\n WSWelcomeMessage,\n WSPongMessage,\n WSSubscribedMessage,\n WSUnsubscribedMessage,\n WSEventMessage,\n WSResponseMessage,\n WSErrorMessage,\n} from '../core';\nimport { RecordingSessionManager } from '../recording/session-manager';\nimport type { CooccurrenceExportData } from '../recording/types';\n\n/**\n * WebSocket-like interface for compatibility\n */\nexport interface WebSocketLike {\n send(data: string): void;\n close(): void;\n readyState: number;\n onmessage?: ((event: { data: string }) => void) | null;\n onclose?: (() => void) | null;\n onerror?: ((error: unknown) => void) | null;\n}\n\n/**\n * Client subscription state\n */\ninterface ClientSubscription {\n events: Set<BridgeEventType>;\n elementIds: Set<string>;\n componentIds: Set<string>;\n}\n\n/**\n * Connected client info\n */\ninterface ConnectedClient {\n id: string;\n ws: WebSocketLike;\n subscription: ClientSubscription;\n connectedAt: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * UI Bridge server version\n */\nconst VERSION = '0.1.0';\n\n/**\n * WebSocket handler for UI Bridge server\n */\nexport class UIBridgeWSHandler {\n private handlers: Partial<UIBridgeServerHandlers>;\n private clients = new Map<string, ConnectedClient>();\n private verbose: boolean;\n private log: (message: string) => void;\n private recordingManager: RecordingSessionManager | null = null;\n private lastAutoSavedExport: CooccurrenceExportData | null = null;\n\n constructor(\n handlers: Partial<UIBridgeServerHandlers>,\n options: {\n verbose?: boolean;\n log?: (message: string) => void;\n /** Registry and change observer for recording session support */\n recording?: {\n registry: import('../core/registry').UIBridgeRegistry;\n changeObserver?: import('../core/change-observer').ChangeObserver;\n };\n } = {}\n ) {\n this.handlers = handlers;\n this.verbose = options.verbose ?? false;\n this.log = options.log ?? console.log;\n\n // Initialize recording support if registry is provided\n if (options.recording) {\n this.recordingManager = new RecordingSessionManager(\n options.recording.registry,\n options.recording.changeObserver ?? null,\n {\n // Wire auto-save to store exports server-side for disconnect recovery\n onAutoSave: (partialExport) => {\n this.lastAutoSavedExport = partialExport;\n },\n }\n );\n }\n }\n\n /**\n * Handle new WebSocket connection.\n *\n * @param preferredId Stable tab/client id supplied by the client (e.g. the\n * persisted `__uiBridge_tabId`, forwarded by the server adapter from the\n * `?tabId=` query param of the upgrade request). When present, the client\n * RESUMES under that id across reconnects instead of being assigned a fresh\n * one — otherwise a tab churns its server-side identity on every reconnect,\n * defeating `?tabId=` command pinning. Falls back to a generated id.\n */\n handleConnection(ws: WebSocketLike, preferredId?: string): string {\n const clientId = preferredId && preferredId.trim() ? preferredId.trim() : generateId();\n\n // Resume: if a prior socket is still registered under this id (stale\n // connection not yet reaped), evict it. The old socket's late `onclose`\n // is neutralised by the ws-identity guard in handleDisconnect below.\n const existing = this.clients.get(clientId);\n if (existing && existing.ws !== ws) {\n try {\n existing.ws.close?.();\n } catch {\n /* best-effort */\n }\n }\n\n const client: ConnectedClient = {\n id: clientId,\n ws,\n subscription: existing?.subscription ?? {\n events: new Set(),\n elementIds: new Set(),\n componentIds: new Set(),\n },\n connectedAt: Date.now(),\n };\n\n this.clients.set(clientId, client);\n\n if (this.verbose) {\n this.log(\n `[WS] Client ${existing ? 'resumed' : 'connected'}: ${clientId}` +\n (preferredId ? ' (client-supplied id)' : '')\n );\n }\n\n // Set up message handler\n ws.onmessage = (event: { data: string }) => {\n this.handleMessage(clientId, event.data);\n };\n\n // Set up close handler. Capture THIS ws so a stale socket's delayed close\n // cannot evict a newer resumed client registered under the same id.\n ws.onclose = () => {\n this.handleDisconnect(clientId, ws);\n };\n\n // Send welcome message\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'welcome',\n timestamp: Date.now(),\n payload: {\n version: VERSION,\n features: {\n renderLog: true,\n control: true,\n debug: true,\n },\n clientId,\n },\n } as WSWelcomeMessage);\n\n return clientId;\n }\n\n /**\n * Handle client disconnect.\n *\n * @param ws When provided, only evict the registered client if it is STILL\n * the same socket. This prevents a stale socket's late close from removing\n * a newer connection that resumed under the same id (see handleConnection).\n */\n handleDisconnect(clientId: string, ws?: WebSocketLike): void {\n if (ws) {\n const current = this.clients.get(clientId);\n if (current && current.ws !== ws) {\n // A newer socket already resumed this id — leave it intact.\n return;\n }\n }\n this.clients.delete(clientId);\n\n if (this.verbose) {\n this.log(`[WS] Client disconnected: ${clientId}`);\n }\n }\n\n /**\n * Handle incoming message\n */\n private async handleMessage(clientId: string, data: string): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n let message: WSClientMessage;\n try {\n message = JSON.parse(data) as WSClientMessage;\n } catch (_error) {\n this.sendError(clientId, undefined, 'PARSE_ERROR', 'Invalid JSON message');\n return;\n }\n\n if (this.verbose) {\n this.log(`[WS] ${clientId} -> ${message.type}`);\n }\n\n try {\n switch (message.type) {\n case 'ping':\n this.handlePing(clientId, message.id);\n break;\n\n case 'subscribe':\n await this.handleSubscribe(clientId, message);\n break;\n\n case 'unsubscribe':\n await this.handleUnsubscribe(clientId, message);\n break;\n\n case 'find':\n await this.handleFind(clientId, message);\n break;\n\n case 'discover':\n // @deprecated Use 'find' instead\n await this.handleFind(clientId, message as unknown as WSClientMessage & { type: 'find' });\n break;\n\n case 'getElement':\n await this.handleGetElement(clientId, message);\n break;\n\n case 'getSnapshot':\n await this.handleGetSnapshot(clientId, message);\n break;\n\n case 'executeAction':\n await this.handleExecuteAction(clientId, message);\n break;\n\n case 'executeComponentAction':\n await this.handleExecuteComponentAction(clientId, message);\n break;\n\n case 'executeWorkflow':\n await this.handleExecuteWorkflow(clientId, message);\n break;\n\n case 'getElementHistory':\n await this.handleGetElementHistory(clientId, message);\n break;\n\n case 'changeEvent': {\n // Push-based change observation: broadcast to all other subscribed clients\n const changePayload = (message as import('../core').WSChangeEventMessage).payload;\n this.broadcastEvent(\n {\n type: 'snapshot:changed',\n timestamp: Date.now(),\n data: changePayload ?? {},\n },\n clientId\n );\n break;\n }\n\n case 'recording:start':\n this.handleRecordingStart(clientId, message);\n break;\n\n case 'recording:stop':\n this.handleRecordingStop(clientId, message);\n break;\n\n case 'recording:status':\n this.handleRecordingStatus(clientId, message);\n break;\n\n case 'recording:autosave':\n this.handleRecordingAutoSave(clientId, message);\n break;\n\n case 'recording:recover':\n this.handleRecordingRecover(clientId, message);\n break;\n\n default:\n this.sendError(\n clientId,\n (message as WSClientMessage).id,\n 'UNKNOWN_MESSAGE',\n `Unknown message type: ${(message as WSClientMessage).type}`\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'HANDLER_ERROR', err.message);\n }\n }\n\n /**\n * Handle ping message\n */\n private handlePing(clientId: string, _requestId: string): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'pong',\n timestamp: Date.now(),\n } as WSPongMessage);\n }\n\n /**\n * Handle subscribe message\n */\n private async handleSubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'subscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events, elementIds, componentIds } = message.payload;\n\n // Add to subscriptions\n if (events?.length) {\n for (const event of events) {\n client.subscription.events.add(event);\n }\n }\n if (elementIds?.length) {\n for (const id of elementIds) {\n client.subscription.elementIds.add(id);\n }\n }\n if (componentIds?.length) {\n for (const id of componentIds) {\n client.subscription.componentIds.add(id);\n }\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'subscribed',\n timestamp: Date.now(),\n payload: {\n events: Array.from(client.subscription.events),\n },\n } as WSSubscribedMessage);\n }\n\n /**\n * Handle unsubscribe message\n */\n private async handleUnsubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'unsubscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events } = message.payload;\n\n let removedEvents: BridgeEventType[];\n if (events?.length) {\n removedEvents = events.filter((e: BridgeEventType) => client.subscription.events.has(e));\n for (const event of events) {\n client.subscription.events.delete(event);\n }\n } else {\n removedEvents = Array.from(client.subscription.events);\n client.subscription.events.clear();\n client.subscription.elementIds.clear();\n client.subscription.componentIds.clear();\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'unsubscribed',\n timestamp: Date.now(),\n payload: {\n events: removedEvents,\n },\n } as WSUnsubscribedMessage);\n }\n\n /**\n * Handle find message\n */\n private async handleFind(\n clientId: string,\n message: WSClientMessage & { type: 'find' }\n ): Promise<void> {\n if (!this.handlers.find) {\n this.sendResponse(clientId, message.id, false, undefined, 'find handler not available');\n return;\n }\n const result = await this.handlers.find(message.payload || {});\n\n if (result.success && result.data) {\n this.sendResponse(clientId, message.id, true, { elements: result.data.elements });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getElement message\n */\n private async handleGetElement(\n clientId: string,\n message: WSClientMessage & { type: 'getElement' }\n ): Promise<void> {\n const { elementId } = message.payload;\n if (!this.handlers.getElement) {\n this.sendResponse(clientId, message.id, false, undefined, 'getElement handler not available');\n return;\n }\n const result = await this.handlers.getElement(elementId);\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, { element: result.data });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getSnapshot message\n */\n private async handleGetSnapshot(\n clientId: string,\n message: WSClientMessage & { type: 'getSnapshot' }\n ): Promise<void> {\n if (!this.handlers.getControlSnapshot) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'getControlSnapshot handler not available'\n );\n return;\n }\n const result = await this.handlers.getControlSnapshot();\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, result.data);\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle executeAction message\n */\n private async handleExecuteAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeAction' }\n ): Promise<void> {\n const { elementId, action } = message.payload;\n if (!this.handlers.executeElementAction) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'executeElementAction handler not available'\n );\n return;\n }\n const result = await this.handlers.executeElementAction(elementId, action);\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeComponentAction message\n */\n private async handleExecuteComponentAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeComponentAction' }\n ): Promise<void> {\n const { componentId, action, params } = message.payload;\n if (!this.handlers.executeComponentAction) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'executeComponentAction handler not available'\n );\n return;\n }\n const result = await this.handlers.executeComponentAction(componentId, { action, params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeWorkflow message\n */\n private async handleExecuteWorkflow(\n clientId: string,\n message: WSClientMessage & { type: 'executeWorkflow' }\n ): Promise<void> {\n const { workflowId, params } = message.payload;\n\n // Note: Progress streaming would need to be added to the handlers interface\n // For now, we just run the workflow without progress callbacks\n if (!this.handlers.runWorkflow) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'runWorkflow handler not available'\n );\n return;\n }\n const result = await this.handlers.runWorkflow(workflowId, { params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle getElementHistory message\n */\n private async handleGetElementHistory(\n clientId: string,\n message: WSClientMessage & { type: 'getElementHistory' }\n ): Promise<void> {\n const { elementId, options } = message.payload;\n if (!this.handlers.getElementHistory) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'getElementHistory handler not available'\n );\n return;\n }\n const result = await this.handlers.getElementHistory(elementId, options);\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, { entries: result.data });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Broadcast event to all subscribed clients\n * @param excludeClientId - optional client ID to skip (e.g. the sender)\n */\n broadcastEvent(event: BridgeEvent, excludeClientId?: string): void {\n for (const [clientId, client] of this.clients) {\n if (clientId === excludeClientId) continue;\n // Check if client is subscribed to this event type\n if (client.subscription.events.size === 0 || client.subscription.events.has(event.type)) {\n // Check element/component filters if applicable\n const eventData = event.data as { elementId?: string; componentId?: string };\n\n if (\n eventData.elementId &&\n client.subscription.elementIds.size > 0 &&\n !client.subscription.elementIds.has(eventData.elementId)\n ) {\n continue;\n }\n\n if (\n eventData.componentId &&\n client.subscription.componentIds.size > 0 &&\n !client.subscription.componentIds.has(eventData.componentId)\n ) {\n continue;\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'event',\n timestamp: Date.now(),\n payload: event,\n } as WSEventMessage);\n }\n }\n }\n\n /**\n * Send message to specific client\n */\n private sendToClient(clientId: string, message: WSServerMessage): void {\n const client = this.clients.get(clientId);\n if (!client || client.ws.readyState !== 1) return;\n\n try {\n client.ws.send(JSON.stringify(message));\n\n if (this.verbose && message.type !== 'pong') {\n this.log(`[WS] ${clientId} <- ${message.type}`);\n }\n } catch (error) {\n console.error(`Failed to send message to ${clientId}:`, error);\n }\n }\n\n /**\n * Send response message\n */\n private sendResponse<T>(\n clientId: string,\n requestId: string,\n success: boolean,\n data?: T,\n error?: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'response',\n timestamp: Date.now(),\n requestId,\n payload: {\n success,\n data,\n error,\n },\n } as WSResponseMessage<T>);\n }\n\n /**\n * Send error message\n */\n private sendError(\n clientId: string,\n requestId: string | undefined,\n code: string,\n message: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n requestId,\n payload: {\n code,\n message,\n },\n } as WSErrorMessage);\n }\n\n /**\n * Get connected client count\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get all connected client IDs\n */\n get clientIds(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Disconnect all clients\n */\n disconnectAll(): void {\n for (const [_clientId, client] of this.clients) {\n try {\n client.ws.close();\n } catch {\n // Ignore close errors\n }\n }\n this.clients.clear();\n }\n\n // ==========================================================================\n // Recording Handlers\n // ==========================================================================\n\n private handleRecordingStart(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendError(\n clientId,\n message.id,\n 'RECORDING_UNAVAILABLE',\n 'Recording not configured — registry not provided'\n );\n return;\n }\n\n try {\n const config = (message as import('../core').WSRecordingStartMessage).payload?.config;\n this.recordingManager.start(config);\n const status = this.recordingManager.getStatus();\n this.sendResponse(clientId, message.id, true, status);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'RECORDING_START_ERROR', err.message);\n }\n }\n\n private handleRecordingStop(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendError(clientId, message.id, 'RECORDING_UNAVAILABLE', 'Recording not configured');\n return;\n }\n\n try {\n const result = this.recordingManager.stop();\n this.sendResponse(clientId, message.id, true, result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'RECORDING_STOP_ERROR', err.message);\n }\n }\n\n private handleRecordingStatus(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendResponse(clientId, message.id, true, {\n active: false,\n duration: 0,\n interactionCount: 0,\n captureCount: 0,\n });\n return;\n }\n\n const status = this.recordingManager.getStatus();\n this.sendResponse(clientId, message.id, true, status);\n }\n\n /**\n * Handle recording:autosave — stores the latest auto-saved export data.\n * Called by the client or internally when the auto-save callback fires.\n */\n private handleRecordingAutoSave(clientId: string, message: WSClientMessage): void {\n try {\n const payload = (\n message as WSClientMessage & { payload?: { exportData?: CooccurrenceExportData } }\n ).payload;\n if (payload?.exportData) {\n this.lastAutoSavedExport = payload.exportData;\n this.sendResponse(clientId, message.id, true, { stored: true });\n } else {\n this.sendError(\n clientId,\n message.id,\n 'AUTOSAVE_INVALID',\n 'Missing exportData in autosave payload'\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'AUTOSAVE_ERROR', err.message);\n }\n }\n\n /**\n * Handle recording:recover — returns the last auto-saved export data.\n * Used by clients to recover partial recording data after a disconnect.\n */\n private handleRecordingRecover(clientId: string, message: WSClientMessage): void {\n if (this.lastAutoSavedExport) {\n this.sendResponse(clientId, message.id, true, {\n recovered: true,\n exportData: this.lastAutoSavedExport,\n });\n } else {\n this.sendResponse(clientId, message.id, true, {\n recovered: false,\n exportData: null,\n });\n }\n }\n}\n","/**\n * WebSocket Stream Adapter\n *\n * Thin adapter that connects BrowserEventStream (transport-agnostic event\n * filtering/classification) to UIBridgeWSHandler (WebSocket broadcast).\n *\n * The adapter manages a BrowserEventStream subscription lifecycle that is\n * tied to WebSocket client presence: it subscribes when the first WS client\n * connects and unsubscribes when the last client disconnects.\n *\n * Two usage modes:\n *\n * 1. **Callback mode** (recommended) — returns an `onBrowserEvent` callback\n * to pass to `createHandlers`. The internal BrowserEventStream inside\n * handlers.ts must have a default subscription (added when onBrowserEvent\n * is provided). The adapter forwards classified BridgeEvents to broadcast.\n *\n * 2. **Direct mode** — accepts an external BrowserEventStream and manages\n * subscriptions directly. Useful for custom server setups.\n */\n\nimport type { BridgeEvent } from '../core';\nimport type {\n BrowserEventStream,\n BrowserEventStreamMessage,\n StreamSubscription,\n} from '../debug/ws-streaming';\nimport type { UIBridgeWSHandler } from './websocket-handler';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WSStreamAdapterConfig {\n /** Minimum severity to forward (default: 'warning') */\n minSeverity?: 'crash' | 'error' | 'warning' | 'noise';\n /** Enable fingerprint-based deduplication (default: true) */\n deduplicate?: boolean;\n /** Optional log function for debug output */\n log?: (message: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Callback-mode adapter (works with internal BrowserEventStream in handlers)\n// ---------------------------------------------------------------------------\n\n/**\n * Create an `onBrowserEvent` callback that forwards BridgeEvents to a\n * UIBridgeWSHandler's broadcastEvent method.\n *\n * Pass the returned callback as `config.onBrowserEvent` when calling\n * `createHandlers()`. The internal BrowserEventStream in handlers.ts will\n * auto-create a default subscription when `onBrowserEvent` is provided,\n * so classified events flow through to this callback automatically.\n *\n * @example\n * ```ts\n * const server = new StandaloneServer(handlers, { websocket: true });\n * // After server is created, wire the adapter:\n * const broadcast = createWSStreamBroadcast(server.getWSHandler()!);\n *\n * // Or pass during handler creation:\n * const handlers = createHandlers(registry, executor, {\n * onBrowserEvent: createWSStreamBroadcast(wsHandler),\n * });\n * ```\n */\nexport function createWSStreamBroadcast(\n wsHandler: UIBridgeWSHandler,\n config?: Pick<WSStreamAdapterConfig, 'log'>\n): (event: BridgeEvent) => void {\n const log = config?.log;\n\n return (event: BridgeEvent) => {\n if (wsHandler.clientCount === 0) {\n return; // No clients connected — skip serialization overhead\n }\n\n if (log) {\n log(`[ws-stream] Broadcasting ${event.type} to ${wsHandler.clientCount} client(s)`);\n }\n\n wsHandler.broadcastEvent(event);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Direct-mode adapter (manages subscriptions on an external stream)\n// ---------------------------------------------------------------------------\n\n/**\n * Full adapter that owns a subscription on an external BrowserEventStream\n * and forwards matching events to a broadcast function.\n *\n * Manages subscription lifecycle: subscribes on `attach()`, unsubscribes\n * on `detach()`. Use `notifyClientChange()` to auto-manage based on\n * connected WS client count.\n *\n * @example\n * ```ts\n * const stream = new BrowserEventStream();\n * const adapter = new WSStreamAdapter(stream, {\n * broadcast: (event) => wsHandler.broadcastEvent(event),\n * minSeverity: 'warning',\n * });\n * adapter.attach();\n *\n * // When a WS client connects/disconnects:\n * adapter.notifyClientChange(wsHandler.clientCount);\n * ```\n */\nexport class WSStreamAdapter {\n private stream: BrowserEventStream;\n private broadcast: (event: BridgeEvent) => void;\n private subscription: StreamSubscription | null = null;\n private config: Required<Pick<WSStreamAdapterConfig, 'minSeverity' | 'deduplicate'>>;\n private log?: (message: string) => void;\n\n constructor(\n stream: BrowserEventStream,\n options: {\n broadcast: (event: BridgeEvent) => void;\n } & WSStreamAdapterConfig\n ) {\n this.stream = stream;\n this.broadcast = options.broadcast;\n this.config = {\n minSeverity: options.minSeverity ?? 'warning',\n deduplicate: options.deduplicate ?? true,\n };\n this.log = options.log;\n }\n\n /**\n * Create a subscription on the stream. Safe to call multiple times\n * (no-op if already subscribed).\n */\n attach(): StreamSubscription {\n if (this.subscription) {\n return this.subscription;\n }\n\n this.subscription = this.stream.subscribe({\n minSeverity: this.config.minSeverity,\n deduplicate: this.config.deduplicate,\n });\n\n if (this.log) {\n this.log(\n `[ws-stream] Attached subscription ${this.subscription.id} ` +\n `(minSeverity=${this.config.minSeverity}, deduplicate=${this.config.deduplicate})`\n );\n }\n\n return this.subscription;\n }\n\n /**\n * Remove the subscription from the stream. Safe to call multiple times\n * (no-op if not subscribed).\n */\n detach(): void {\n if (!this.subscription) {\n return;\n }\n\n const id = this.subscription.id;\n this.stream.unsubscribe(id);\n this.subscription = null;\n\n if (this.log) {\n this.log(`[ws-stream] Detached subscription ${id}`);\n }\n }\n\n /**\n * Update subscription based on WS client count.\n * Subscribes when the first client connects, unsubscribes when the last\n * client disconnects.\n */\n notifyClientChange(clientCount: number): void {\n if (clientCount > 0 && !this.subscription) {\n this.attach();\n } else if (clientCount === 0 && this.subscription) {\n this.detach();\n }\n }\n\n /**\n * Process a raw browser event through the stream and broadcast any\n * messages that pass subscription filters.\n *\n * Call this from the capture's onEvent callback when using direct mode.\n */\n processAndBroadcast(event: import('../debug/browser-capture-types').AnyCapturedEvent): void {\n if (!this.subscription) {\n return; // Not subscribed — nothing to do\n }\n\n const messages = this.stream.processEvent(event);\n if (messages.size === 0) {\n return;\n }\n\n // Forward each matching message as a BridgeEvent\n for (const [_subId, message] of messages) {\n this.broadcast(toBridgeEvent(message));\n }\n }\n\n /** Whether the adapter currently has an active subscription */\n get isAttached(): boolean {\n return this.subscription !== null;\n }\n\n /** The current subscription ID, or null */\n get subscriptionId(): string | null {\n return this.subscription?.id ?? null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a BrowserEventStreamMessage to a BridgeEvent for WS broadcast.\n */\nfunction toBridgeEvent(message: BrowserEventStreamMessage): BridgeEvent {\n const eventType =\n message.severity === 'crash'\n ? 'browser:crash'\n : message.severity === 'error'\n ? 'browser:error'\n : 'browser:warning';\n\n return {\n type: eventType,\n timestamp: Date.now(),\n data: {\n event: message.event,\n severity: message.severity,\n reason: message.reason,\n fingerprint: message.fingerprint,\n ...(message.sourceLocation !== undefined ? { sourceLocation: message.sourceLocation } : {}),\n },\n };\n}\n","/**\n * SSE (Server-Sent Events) Handler for UI Bridge\n *\n * Streams real-time bridge events to connected clients via SSE.\n * Each event is a JSON-encoded BridgeEvent with optional type filtering.\n *\n * Usage:\n * GET /control/events/stream?types=element:stateChanged,action:completed\n *\n * Event format:\n * event: <BridgeEventType>\n * data: <JSON BridgeEvent>\n * id: <sequence number>\n *\n * Special events:\n * event: heartbeat (every 15s to keep connection alive)\n * event: connected (sent on initial connection)\n */\n\nimport type { BridgeEvent, BridgeEventType } from '../core';\n\n/**\n * A connected SSE client\n */\ninterface SSEClient {\n id: string;\n /** Write a raw string to the response stream */\n write: (data: string) => boolean;\n /** Close the connection */\n close: () => void;\n /** Event type filter (empty = all events) */\n typeFilter: Set<BridgeEventType>;\n /** Element ID filter (empty = all elements) */\n elementFilter: Set<string>;\n /** Connected timestamp */\n connectedAt: number;\n}\n\n/**\n * SSE Manager — manages SSE client connections and broadcasts events\n */\nexport class SSEManager {\n private clients = new Map<string, SSEClient>();\n private sequence = 0;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n // Start heartbeat to keep connections alive\n this.heartbeatInterval = setInterval(() => {\n this.sendHeartbeat();\n }, 15_000);\n }\n\n /**\n * Register a new SSE client connection.\n *\n * @param write - Function to write raw SSE data to the response\n * @param close - Function to close the connection\n * @param typeFilter - Optional comma-separated event types to filter\n * @param elementFilter - Optional comma-separated element IDs to filter\n * @returns Client ID (for cleanup on disconnect)\n */\n addClient(\n write: (data: string) => boolean,\n close: () => void,\n typeFilter?: string,\n elementFilter?: string\n ): string {\n const id = `sse-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n const types = new Set<BridgeEventType>();\n if (typeFilter) {\n for (const t of typeFilter.split(',')) {\n const trimmed = t.trim();\n if (trimmed) types.add(trimmed as BridgeEventType);\n }\n }\n\n const elements = new Set<string>();\n if (elementFilter) {\n for (const e of elementFilter.split(',')) {\n const trimmed = e.trim();\n if (trimmed) elements.add(trimmed);\n }\n }\n\n const client: SSEClient = {\n id,\n write,\n close,\n typeFilter: types,\n elementFilter: elements,\n connectedAt: Date.now(),\n };\n\n this.clients.set(id, client);\n\n // Send connected event\n this.sendToClient(client, 'connected', {\n clientId: id,\n timestamp: Date.now(),\n filters: {\n types: types.size > 0 ? Array.from(types) : 'all',\n elements: elements.size > 0 ? Array.from(elements) : 'all',\n },\n });\n\n return id;\n }\n\n /**\n * Remove a client (called on disconnect)\n */\n removeClient(id: string): void {\n this.clients.delete(id);\n }\n\n /**\n * Broadcast a BridgeEvent to all matching SSE clients.\n * Call this from the registry's onEvent callback.\n */\n broadcast(event: BridgeEvent): void {\n if (this.clients.size === 0) return;\n\n const eventData = event.data as { elementId?: string; id?: string } | undefined;\n const elementId = eventData?.elementId || eventData?.id;\n\n for (const client of this.clients.values()) {\n // Type filter\n if (client.typeFilter.size > 0 && !client.typeFilter.has(event.type)) {\n continue;\n }\n\n // Element filter\n if (client.elementFilter.size > 0 && elementId && !client.elementFilter.has(elementId)) {\n continue;\n }\n\n this.sendToClient(client, event.type, event);\n }\n }\n\n /**\n * Number of connected clients\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Dispose — stop heartbeat and close all connections\n */\n dispose(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n for (const client of this.clients.values()) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n this.clients.clear();\n }\n\n // ---- Private ----\n\n private sendToClient(client: SSEClient, eventType: string, data: unknown): void {\n const id = ++this.sequence;\n const payload = `event: ${eventType}\\ndata: ${JSON.stringify(data)}\\nid: ${id}\\n\\n`;\n try {\n client.write(payload);\n } catch {\n // Client disconnected — remove it\n this.clients.delete(client.id);\n }\n }\n\n private sendHeartbeat(): void {\n const payload = `event: heartbeat\\ndata: ${JSON.stringify({ timestamp: Date.now(), clients: this.clients.size })}\\n\\n`;\n const failed: string[] = [];\n for (const client of this.clients.values()) {\n try {\n client.write(payload);\n } catch {\n failed.push(client.id);\n }\n }\n for (const id of failed) {\n this.clients.delete(id);\n }\n }\n}\n","/**\n * Standalone Server\n *\n * Standalone HTTP server for UI Bridge that can run independently.\n * Supports both HTTP and WebSocket connections.\n */\n\nimport type {\n UIBridgeServerConfig,\n UIBridgeServerHandlers,\n APIResponse,\n WebSocketMessage,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport { mapInternalErrorCode } from '../diagnostics';\nimport { UIBridgeWSHandler, type WebSocketLike } from './websocket-handler';\nimport { createWSStreamBroadcast } from './ws-stream-adapter';\nimport { SSEManager } from './sse-handler';\nimport type { BridgeEvent } from '../core';\n\n/**\n * Standalone server configuration\n */\nexport interface StandaloneServerConfig extends UIBridgeServerConfig {\n /** Host to bind to */\n host?: string;\n /** Port to listen on */\n port?: number;\n /** Enable WebSocket support */\n websocket?: boolean;\n /** WebSocket port (defaults to port) */\n websocketPort?: number;\n /** Logging function */\n log?: (message: string) => void;\n /** Enable recording session support — pass the registry and optional changeObserver */\n recording?: {\n registry: import('../core/registry').UIBridgeRegistry;\n changeObserver?: import('../core/change-observer').ChangeObserver;\n };\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n> = {\n host: 'localhost',\n port: 9876,\n websocket: false,\n websocketPort: 9876,\n log: console.log,\n};\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n const message = typeof error === 'string' ? error : error.message;\n return {\n success: false,\n error: message,\n code: mapInternalErrorCode(code, message),\n timestamp: Date.now(),\n };\n}\n\n/**\n * Simple HTTP server implementation using Node.js built-in http module\n * with optional WebSocket support.\n */\nexport class StandaloneServer {\n private server: import('http').Server | null = null;\n private wsServer: unknown = null; // WebSocket.Server from 'ws' package\n private config: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n > &\n StandaloneServerConfig;\n private handlers: Partial<UIBridgeServerHandlers>;\n private wsHandler: UIBridgeWSHandler | null = null;\n private wsConnections: Set<WebSocketLike> = new Set();\n private sseManager: SSEManager;\n\n constructor(handlers: Partial<UIBridgeServerHandlers>, config: StandaloneServerConfig = {}) {\n this.handlers = handlers;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.sseManager = new SSEManager();\n\n // Create WebSocket handler if enabled\n if (this.config.websocket) {\n this.wsHandler = new UIBridgeWSHandler(handlers as UIBridgeServerHandlers, {\n verbose: true,\n log: this.config.log,\n recording: this.config.recording,\n });\n }\n }\n\n /**\n * Get enabled capabilities based on handlers\n */\n private getCapabilities(): string[] {\n return [\n 'elements',\n 'components',\n 'discovery',\n 'navigation',\n 'ai',\n 'change_tracking',\n 'idle_detection',\n 'network',\n 'forms',\n 'design',\n 'debug',\n 'events',\n 'annotations',\n 'state_management',\n 'clipboard',\n 'undo_redo',\n 'recovery',\n 'intents',\n ];\n }\n\n /**\n * Start the server\n */\n async start(): Promise<void> {\n const http = await import('http');\n\n this.server = http.createServer(async (req, res) => {\n await this.handleRequest(req, res);\n });\n\n // Start WebSocket server if enabled\n if (this.config.websocket && this.wsHandler) {\n await this.startWebSocketServer();\n }\n\n return new Promise((resolve, reject) => {\n this.server!.listen(this.config.port, this.config.host, () => {\n this.config.log(\n `UI Bridge server listening on http://${this.config.host}:${this.config.port}`\n );\n if (this.config.websocket) {\n const wsPort = this.config.websocketPort || this.config.port;\n this.config.log(\n `UI Bridge WebSocket server listening on ws://${this.config.host}:${wsPort}`\n );\n }\n resolve();\n });\n\n this.server!.on('error', reject);\n });\n }\n\n /**\n * Start WebSocket server\n */\n private async startWebSocketServer(): Promise<void> {\n try {\n // Dynamically import ws package\n const { WebSocketServer } = await import('ws');\n\n const wsPort = this.config.websocketPort || this.config.port;\n const useSamePort = wsPort === this.config.port;\n\n if (useSamePort && this.server) {\n // Attach to same HTTP server (upgrade handling)\n this.wsServer = new WebSocketServer({ server: this.server });\n } else {\n // Create separate WebSocket server\n this.wsServer = new WebSocketServer({\n host: this.config.host,\n port: wsPort,\n });\n }\n\n const wss = this.wsServer as {\n on(\n event: 'connection',\n callback: (ws: WebSocketLike, request?: { url?: string }) => void\n ): void;\n on(event: 'error', callback: (error: Error) => void): void;\n close(): void;\n };\n\n wss.on('connection', (ws, request) => {\n this.wsConnections.add(ws);\n // Forward the persisted tab id (?tabId=) so the client resumes its\n // server-side identity across reconnects instead of churning ids.\n let preferredId: string | undefined;\n const rawUrl = request?.url;\n if (rawUrl) {\n try {\n // request.url is path-relative (e.g. \"/?tabId=...\"); base is arbitrary.\n preferredId = new URL(rawUrl, 'http://localhost').searchParams.get('tabId') ?? undefined;\n } catch {\n /* malformed url — fall back to generated id */\n }\n }\n this.wsHandler!.handleConnection(ws, preferredId);\n\n ws.onclose = () => {\n this.wsConnections.delete(ws);\n };\n });\n\n wss.on('error', (error) => {\n this.config.log(`WebSocket server error: ${error.message}`);\n });\n } catch (_error) {\n // ws package not installed - WebSocket support disabled\n this.config.log(\n 'Warning: WebSocket support requires the \"ws\" package. Install it with: npm install ws'\n );\n this.wsHandler = null;\n }\n }\n\n /**\n * Stop the server\n */\n async stop(): Promise<void> {\n // Close WebSocket handler\n if (this.wsHandler) {\n this.wsHandler.disconnectAll();\n }\n\n // Close WebSocket server\n if (this.wsServer) {\n const wss = this.wsServer as { close(): void };\n wss.close();\n this.wsServer = null;\n }\n\n // Close WebSocket connections\n for (const ws of this.wsConnections) {\n ws.close();\n }\n this.wsConnections.clear();\n\n // Close SSE manager\n this.sseManager.dispose();\n\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n /**\n * Handle an HTTP request\n */\n private async handleRequest(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse\n ): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const method = req.method || 'GET';\n const basePath = this.config.basePath || '/ui-bridge';\n\n // Add CORS headers\n if (this.config.cors) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n\n // Handle preflight\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Health check (also served at /status)\n if (url.pathname === '/health' || url.pathname === '/status') {\n const healthResponse: Record<string, unknown> = { status: 'ok', timestamp: Date.now() };\n\n // Include UI Bridge metadata for app discovery\n if (this.config.appInfo) {\n const uiBridge: Record<string, unknown> = {\n version: '0.3.0',\n ...this.config.appInfo,\n capabilities: this.getCapabilities(),\n };\n\n // Try to get element/component counts from handlers\n try {\n const snapshotResult = await this.handlers.getControlSnapshot?.();\n if (snapshotResult?.success && snapshotResult.data) {\n const data = snapshotResult.data as {\n elements?: unknown[];\n components?: unknown[];\n };\n uiBridge.elementCount = data.elements?.length ?? 0;\n uiBridge.componentCount = data.components?.length ?? 0;\n }\n } catch {\n // Ignore - counts are optional\n }\n\n healthResponse.uiBridge = uiBridge;\n }\n\n this.sendJSON(res, healthResponse);\n return;\n }\n\n // Remove base path\n let path = url.pathname;\n if (path.startsWith(basePath)) {\n path = path.slice(basePath.length) || '/';\n }\n\n // SSE streaming endpoint — handled before normal routing\n if (path === '/control/events/stream' && method === 'GET') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const types = url.searchParams.get('types') || undefined;\n const elements = url.searchParams.get('elements') || undefined;\n\n const clientId = this.sseManager.addClient(\n (data: string) => {\n res.write(data);\n return true;\n },\n () => {\n if (!res.writableEnded) res.end();\n },\n types,\n elements\n );\n\n req.on('close', () => {\n this.sseManager.removeClient(clientId);\n });\n return;\n }\n\n // Change observation SSE stream — filters to snapshot:changed events only\n if (path === '/control/changes/stream' && method === 'GET') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const clientId = this.sseManager.addClient(\n (data: string) => {\n res.write(data);\n return true;\n },\n () => {\n if (!res.writableEnded) res.end();\n },\n 'snapshot:changed'\n );\n\n req.on('close', () => {\n this.sseManager.removeClient(clientId);\n });\n return;\n }\n\n // Find matching route\n const route = this.findRoute(path, method);\n if (!route) {\n this.sendJSON(res, wrapError('Not found', 'NOT_FOUND'), 404);\n return;\n }\n\n try {\n // Parse body for POST/PUT/PATCH requests or when body is required\n let body: unknown = {};\n if (method === 'POST' || method === 'PUT' || method === 'PATCH' || route.bodyRequired) {\n body = await this.parseBody(req);\n }\n\n // Extract params\n const params = this.extractParams(path, route.path);\n\n // Get handler\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = this.handlers[handlerName];\n\n if (!handler) {\n this.sendJSON(res, wrapError('Not implemented', 'NOT_IMPLEMENTED'), 501);\n return;\n }\n\n // Build arguments\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(params[param]);\n }\n }\n\n // Per-user tab scoping (§4.2): mirror the Next.js / Express\n // adapters' X-Caller-User-Id sniff so the trusted-identity-bound\n // `context` reaches every relay-dispatching handler.\n const headerCallerUserId =\n (typeof req.headers['x-caller-user-id'] === 'string'\n ? (req.headers['x-caller-user-id'] as string)\n : undefined) ?? undefined;\n\n if (route.bodyRequired) {\n if (\n headerCallerUserId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body)\n ) {\n body = { ...(body as Record<string, unknown>), __callerUserId: headerCallerUserId };\n }\n args.push(body);\n }\n\n if (method === 'GET') {\n const query = Object.fromEntries(url.searchParams);\n if (Object.keys(query).length > 0) {\n args.push(query);\n }\n }\n\n // Per-user tab scoping (§4.2) — trailing context arg. Adapter\n // always supplies it so zero-arg / id-only handlers still enforce\n // ownership.\n args.push({ callerUserId: headerCallerUserId });\n\n // Call handler\n const result = await (handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)(\n ...args\n );\n this.sendJSON(res, result);\n } catch (error) {\n this.config.log(`Error handling ${method} ${path}: ${error}`);\n this.sendJSON(res, wrapError(error as Error, 'INTERNAL_ERROR'), 500);\n }\n }\n\n /**\n * Find a matching route\n */\n private findRoute(path: string, method: string): (typeof UI_BRIDGE_ROUTES)[0] | null {\n for (const route of UI_BRIDGE_ROUTES) {\n if (route.method !== method) continue;\n\n const routeRegex = route.path.replace(/:[^/]+/g, '([^/]+)').replace(/\\//g, '\\\\/');\n\n const regex = new RegExp(`^${routeRegex}$`);\n if (regex.test(path)) {\n return route;\n }\n }\n return null;\n }\n\n /**\n * Extract params from path\n */\n private extractParams(path: string, routePath: string): Record<string, string> {\n const params: Record<string, string> = {};\n const routeParts = routePath.split('/');\n const pathParts = path.split('/');\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(':')) {\n params[routeParts[i].slice(1)] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * Parse request body\n */\n private parseBody(\n req: import('http').IncomingMessage,\n maxBytes = 10 * 1024 * 1024\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let data = '';\n let bytes = 0;\n req.on('data', (chunk: string | Buffer) => {\n bytes += typeof chunk === 'string' ? Buffer.byteLength(chunk) : chunk.length;\n if (bytes > maxBytes) {\n req.destroy();\n reject(new Error('Request body too large'));\n return;\n }\n data += chunk;\n });\n req.on('end', () => {\n try {\n resolve(data ? JSON.parse(data) : {});\n } catch {\n resolve({});\n }\n });\n req.on('error', reject);\n });\n }\n\n /**\n * Send JSON response (safe against circular refs from DOM nodes)\n */\n private sendJSON(res: import('http').ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n const seen = new WeakSet();\n res.end(\n JSON.stringify(data, (_key, val) => {\n if (val !== null && typeof val === 'object') {\n if (typeof Node !== 'undefined' && val instanceof Node)\n return `[${val.constructor.name}]`;\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n if (typeof val === 'function') return undefined;\n return val;\n })\n );\n }\n\n /**\n * Broadcast a message to all WebSocket connections (legacy)\n */\n broadcast(message: WebSocketMessage): void {\n const data = JSON.stringify(message);\n for (const ws of this.wsConnections) {\n if (ws.readyState === 1) {\n // OPEN\n ws.send(data);\n }\n }\n }\n\n /**\n * Broadcast an event to all subscribed WebSocket and SSE clients\n */\n broadcastEvent(event: BridgeEvent): void {\n if (this.wsHandler) {\n this.wsHandler.broadcastEvent(event);\n }\n this.sseManager.broadcast(event);\n }\n\n /**\n * Get the SSE manager for direct access (e.g., wiring to registry.onEvent)\n */\n getSSEManager(): SSEManager {\n return this.sseManager;\n }\n\n /**\n * Create an `onBrowserEvent` callback wired to the WS handler's broadcast.\n *\n * Call this **before** `createHandlers()` to get a callback you can pass as\n * `config.onBrowserEvent`. The internal BrowserEventStream in handlers.ts\n * will auto-subscribe and forward classified events through this callback\n * to all connected WebSocket clients.\n *\n * Returns `undefined` if WebSocket is not enabled, so it's safe to spread\n * into the config unconditionally.\n *\n * @example\n * ```ts\n * const server = new StandaloneServer({}, { websocket: true, port: 9876 });\n * const handlers = createHandlers(registry, executor, {\n * onBrowserEvent: server.createBrowserEventCallback(),\n * });\n * ```\n */\n createBrowserEventCallback(): ((event: BridgeEvent) => void) | undefined {\n if (!this.wsHandler) {\n return undefined;\n }\n\n return createWSStreamBroadcast(this.wsHandler, { log: this.config.log });\n }\n\n /**\n * Create an `onChangeEvent` callback wired to SSE + WS broadcast.\n *\n * Call this **before** `createHandlers()` to get a callback you can pass as\n * `config.onChangeEvent`. The ChangeObserver in handlers.ts will forward\n * batched DOM change events through this callback to all connected clients.\n */\n createChangeEventCallback(): (event: BridgeEvent) => void {\n return (event: BridgeEvent) => {\n this.broadcastEvent(event);\n };\n }\n\n /**\n * Get WebSocket handler for direct access\n */\n getWSHandler(): UIBridgeWSHandler | null {\n return this.wsHandler;\n }\n\n /**\n * Get number of connected WebSocket clients\n */\n get wsClientCount(): number {\n return this.wsHandler?.clientCount ?? 0;\n }\n\n /**\n * Get the server address\n */\n getAddress(): { host: string; port: number } | null {\n const address = this.server?.address();\n if (!address || typeof address === 'string') return null;\n return { host: this.config.host, port: address.port };\n }\n}\n\n/**\n * Create and start a standalone server\n */\nexport async function createStandaloneServer(\n handlers: Partial<UIBridgeServerHandlers>,\n config?: StandaloneServerConfig\n): Promise<StandaloneServer> {\n const server = new StandaloneServer(handlers, config);\n await server.start();\n return server;\n}\n\n/**\n * CLI entry point\n */\nexport async function startCLI(\n handlers: Partial<UIBridgeServerHandlers>,\n args: string[] = process.argv.slice(2)\n): Promise<void> {\n const config: StandaloneServerConfig = {};\n\n // Parse CLI args\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n if (arg === '--port' || arg === '-p') {\n config.port = parseInt(nextArg);\n i++;\n } else if (arg === '--host' || arg === '-h') {\n config.host = nextArg;\n i++;\n } else if (arg === '--cors') {\n config.cors = true;\n }\n }\n\n const server = await createStandaloneServer(handlers, config);\n\n // Handle shutdown\n process.on('SIGINT', async () => {\n console.log('\\nShutting down...');\n await server.stop();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await server.stop();\n process.exit(0);\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/types.ts","../../src/diagnostics/codes.generated.ts","../../src/diagnostics/index.ts","../../src/core/class-name.ts","../../src/core/element-fingerprint.ts","../../src/recording/interaction-interceptor.ts","../../src/recording/session-manager.ts","../../src/server/websocket-handler.ts","../../src/server/ws-stream-adapter.ts","../../src/server/sse-handler.ts","../../src/server/standalone.ts"],"names":["m","generateId"],"mappings":"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","file":"standalone.mjs","sourcesContent":["/**\n * UI Bridge Server Types\n *\n * Shared types for server adapters.\n */\n\nimport type { UIBridgeConfig, ElementHistoryOptions } from '../core';\nimport type { UiBridgeErrorCode } from '../diagnostics';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n BatchActionRequest,\n BatchActionResponse,\n FindRequest,\n FindResponse,\n ControlSnapshot,\n WorkflowRunRequest,\n WorkflowRunResponse,\n PageNavigateRequest,\n PageNavigationResponse,\n FillFormRequest,\n EffectRecordEntry,\n} from '../control';\nimport type { FillResult } from '../core/types';\nimport type { PageHealthReport } from './page-health';\nimport type { RenderLogEntry, RenderLogEntryType } from '../render-log';\nimport type {\n SearchCriteria,\n SearchResponse,\n NLActionRequest,\n NLActionResponse,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SemanticSnapshot,\n SemanticDiff,\n SemanticSearchCriteria,\n SemanticSearchResponse,\n Intent,\n IntentSearchResponse,\n IntentExecutionResult,\n RecoveryAttemptRequest,\n RecoveryAttemptResult,\n PageDataMap,\n PageRegionMap,\n StructuredDataExtraction,\n CrossAppComparisonReport,\n ComponentInfo,\n ActionWithDiffRequest,\n ActionDiffResult,\n ChangePredicate,\n WaitForChangeOptions,\n CategorizedDiff,\n ChangeBufferDrainResult,\n SnapshotBookmark,\n FormsResponse,\n StructuredChangeAnalysis,\n FormSnapshot,\n FormDiff,\n FindResult,\n FindContext,\n} from '../ai';\nimport type {\n InteractionStateName,\n ElementDesignData,\n StateStyles,\n ResponsiveSnapshot,\n} from '../core/types';\nimport type { StyleGuideConfig, StyleAuditReport } from '../specs/style-types';\nimport type {\n QualityEvaluationReport,\n SnapshotDiffReport,\n EvaluateRequest,\n} from '../specs/quality-types';\nimport type {\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n} from '../core';\nimport type { ElementAnnotation, AnnotationConfig, AnnotationCoverage } from '../annotations';\nimport type { CapturedError, AnyCapturedEvent } from '../debug/browser-capture-types';\nimport type { FingerprintedEvent } from '../debug/error-fingerprint';\nimport type { TimelineEntry } from '../debug/error-timeline';\nimport type { HealthReport } from '../debug/health-score';\nimport type { ErrorSessionSummary, BaselineComparison } from '../debug/error-session';\nimport type { NetworkChain } from '../debug/network-chain';\nimport type { ErrorSnapshot } from '../debug/error-snapshot';\nimport type { CompositeIdleStatus, SignalStatus } from '../idle';\nimport type { NetworkRequestEntry, WaitForRequestOptions, WaitForRequestResult } from '../network';\nimport type { UndoRedoState } from '../undo';\n\n/**\n * Server configuration\n */\nexport interface UIBridgeServerConfig extends UIBridgeConfig {\n /** Base path for API routes */\n basePath?: string;\n /** Enable CORS */\n cors?: boolean | CORSOptions;\n /** Authentication middleware */\n authenticate?: (req: unknown) => boolean | Promise<boolean>;\n /** Rate limiting */\n rateLimit?: RateLimitOptions;\n}\n\n/**\n * CORS options\n */\nexport interface CORSOptions {\n /** Allowed origins */\n origin?: string | string[] | boolean;\n /** Allowed methods */\n methods?: string[];\n /** Allowed headers */\n headers?: string[];\n /** Expose headers */\n exposeHeaders?: string[];\n /** Allow credentials */\n credentials?: boolean;\n /** Max age for preflight cache */\n maxAge?: number;\n}\n\n/**\n * Rate limit options\n */\nexport interface RateLimitOptions {\n /** Time window in milliseconds */\n windowMs?: number;\n /** Max requests per window */\n max?: number;\n /** Message when rate limited */\n message?: string;\n}\n\n/**\n * API response wrapper\n */\nexport interface APIResponse<T = unknown> {\n /** Whether the request succeeded */\n success: boolean;\n /** Response data */\n data?: T;\n /** Error message if failed (human-readable, dual-audience — plan goal #3) */\n error?: string;\n /**\n * Stable machine-readable diagnostic code. Populated on every\n * `success: false` response (plan Phase 1 — required on failure;\n * optional at the type level only because successful responses omit it).\n * Always a canonical `UiBridgeErrorCode` (mapped from internal/legacy\n * codes via the diagnostics `mapInternalErrorCode`).\n */\n code?: UiBridgeErrorCode;\n /** Request timestamp */\n timestamp: number;\n /** Response metadata (staleness, diagnostics) */\n _meta?: {\n stale?: boolean;\n staleSinceMs?: number;\n cacheAgeMs?: number;\n fallback?: boolean;\n reason?: string;\n };\n /** Recovery suggestions for error responses */\n suggestions?: string[];\n /**\n * Optional HTTP status code hint. When set, the framework adapter\n * (Express / Next.js) will use this code instead of the default 200.\n * Used by endpoints that need 4xx semantics on logical failure (e.g.\n * Phase 2.1 `/control/element/:id/expect` returns 422 when the asserted\n * predicate doesn't hold). Stripped from the JSON body before send so\n * external consumers see the same envelope shape.\n */\n httpStatus?: number;\n}\n\n/**\n * Render log query parameters\n */\n/**\n * Request body for `POST /control/page/evaluate` (`pageEvaluate`).\n *\n * The body is forwarded verbatim to the runner, so any additional fields are\n * preserved (index signature); the two known fields are typed for\n * discoverability.\n */\nexport interface PageEvaluateRequest {\n /** JavaScript expression to evaluate in the target window. */\n expression: string;\n /**\n * Target a runner pop-out window discoverable via `listWindows()`;\n * omit → the main window. The runner reads this from the request body\n * (`EvaluateQuery.window_label`) or the `?windowLabel=` query, **query\n * wins** (`resolve_evaluate_window`); unknown labels yield a structured\n * error naming the missing window.\n */\n windowLabel?: string;\n /** Forward-compatible: extra fields are forwarded to the runner verbatim. */\n [key: string]: unknown;\n}\n\nexport interface RenderLogQuery {\n /** Filter by entry type */\n type?: RenderLogEntryType;\n /** Filter entries since timestamp */\n since?: number;\n /** Filter entries until timestamp */\n until?: number;\n /** Limit number of results */\n limit?: number;\n}\n\n/**\n * Browser events response — returned by GET /control/browser-events\n */\nexport interface BrowserEventsResponse {\n /** Raw events (filtered by params) */\n events: AnyCapturedEvent[] | CapturedError[];\n /** Total count of returned events */\n count: number;\n /** Deduplicated event groups (only when deduplicate=true) */\n deduplicated?: FingerprintedEvent[];\n /** Number of unique fingerprints (only when deduplicate=true) */\n uniqueCount?: number;\n}\n\n/**\n * Phase 2.1 (plan 2026-05-03) — body for POST /control/element/:id/expect.\n * Reuses the closed `WaitForElementState` enum from the SDK runtime so the\n * predicate evaluator is shared with `/ai/wait-for-element`. The critical\n * semantic difference: this endpoint **fails the request** with HTTP 422\n * when the predicate doesn't hold within `timeout`, instead of returning\n * 200 + `found:false`.\n */\nexport interface ElementExpectRequest {\n /** Predicate to assert. Closed enum mirroring WaitForElementState. */\n state:\n | 'present'\n | 'visible'\n | 'enabled'\n | 'disabled'\n | 'value-not-empty'\n | 'value-empty'\n | 'checked'\n | 'unchecked'\n | 'absent';\n /** Timeout in ms. Default 5000, capped at 30000. */\n timeout?: number;\n /** Poll interval in ms. Default 100, minimum 10. */\n pollMs?: number;\n}\n\n/**\n * Response from POST /control/element/:id/expect. `passed:true` rides on\n * HTTP 200; `passed:false` rides on HTTP 422 (set via `APIResponse.httpStatus`).\n */\nexport interface ElementExpectResponse {\n /** Whether the predicate held within the timeout window. */\n passed: boolean;\n /**\n * Element snapshot at the moment the predicate flipped true (on pass) or\n * the most recent registered snapshot before timeout (on fail). `null`\n * when the element was never registered during the wait.\n */\n observedState: {\n registered: boolean;\n state: Record<string, unknown> | null;\n } | null;\n /** Wall-clock duration of the wait in ms. */\n durationMs: number;\n}\n\n/**\n * Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n * page in a sensible state right now?\". Synthesized from the live snapshot,\n * console-errors buffer, and idle detector so the caller spends one round-\n * trip instead of four. Distinct from the NL `/ai/page-summary` digest.\n */\nexport interface StateSummary {\n /** Count of snapshot elements that are both layout-positioned and visible. */\n visibleElementCount: number;\n /** True when the snapshot's `modalStack` has at least one entry. */\n modalOpen: boolean;\n /** True when the console-errors buffer has at least one entry. */\n hasErrors: boolean;\n /**\n * Pass-through of the idle detector's composite status, or `null` when\n * idle detection is disabled. Lets callers gate work on idle without\n * issuing a separate `/control/idle-status` round-trip.\n */\n idleSignals: CompositeIdleStatus | null;\n /** Number of components currently registered. */\n registeredComponents: number;\n /** Current page route, or `null` when undeterminable. */\n route: string | null;\n /** Currently active tab id (for tab-based apps), or `null` when not provided. */\n activeTab: string | null;\n}\n\n/**\n * Phase 4.1 (plan 2026-05-03) — body for POST /control/sdk/spawn-headless.\n *\n * Wraps the already-shipped `@qontinui/ui-bridge-headless` package's\n * `launchHeadlessTab` so callers can spin up a real Chromium tab for testing\n * without manually opening a browser. The endpoint is gated behind the\n * `enableHeadlessSpawn` config flag (or `ENABLE_HEADLESS_SPAWN=1`); disabled\n * by default because it pulls in Playwright + Chromium at runtime.\n */\nexport interface SpawnHeadlessRequest {\n /** Target URL the headless tab should navigate to. Must start with http:// or https://. */\n url: string;\n /**\n * Max time (ms) to wait for the headless client to register a tab over UI Bridge.\n * Default 30000, capped at 60000.\n */\n timeoutMs?: number;\n /**\n * Auto-close timer (seconds). Tracked spawned tabs are also closed on\n * server shutdown. Default 300.\n */\n keepAliveSecs?: number;\n /**\n * Run Chromium without a visible window. Default `true` — the whole point\n * of this endpoint is \"no manual browser\".\n */\n headless?: boolean;\n /** Viewport size override. Default 1280x720. */\n viewport?: { width: number; height: number };\n}\n\n/**\n * Phase 4.1 — response from POST /control/sdk/spawn-headless.\n */\nexport interface SpawnHeadlessResponse {\n /** True when the tab was launched (regardless of UI Bridge registration). */\n spawned: boolean;\n /** Tab id assigned by the relay when registration succeeded; `null` otherwise. */\n tabId: string | null;\n /** True when the relay reported the tab as connected before timeout. */\n uiBridgeRegistered: boolean;\n /** URL the page actually ended up at after navigation. */\n finalUrl: string;\n}\n\n/**\n * Per-user tab scoping context (§4.2) — threaded as the final positional\n * argument of every relay-dispatching handler.\n *\n * The Next.js adapter populates `callerUserId` from the trusted\n * `X-Caller-User-Id` request header (set by the consumer's auth gate from\n * the authenticated identity — NEVER from a browser-supplied value). The\n * relay-handlers layer lifts `callerUserId` into `ownerCheck.userId` on the\n * downstream `relay.queueCommand` call so the relay refuses to dispatch\n * the command to a tab owned by a different user.\n *\n * The reason this is a dedicated final-arg `context` object instead of a\n * field in the request body / query: many handlers (e.g. `captureSnapshot`,\n * `clearRenderLog`, `getElementState(id)`) have zero-arg or args-without-bag\n * signatures, so there is no body/query for the adapter to splice\n * `__callerUserId` into. Without this explicit channel, those handlers\n * would bypass per-user scoping entirely and silently dispatch to whichever\n * tab happened to be `primaryTabId` — including tabs owned by other users.\n */\nexport interface HandlerContext {\n /**\n * Authenticated caller's user id, as supplied by the consumer's auth gate\n * via the `X-Caller-User-Id` header. When present, the relay restricts\n * dispatch to tabs owned by this user. When absent, the call is treated\n * as a trusted admin / server-side call and the unfiltered primary-tab\n * fallback applies.\n */\n callerUserId?: string;\n}\n\n/**\n * Server handler interface\n *\n * Implementations provide these handlers for different frameworks.\n *\n * Per-user tab scoping (§4.2): handlers that dispatch to a browser tab\n * accept an optional final `context?: HandlerContext` parameter. The\n * Next.js / Express adapters thread the authenticated caller's user id\n * through that parameter so the relay can enforce per-user dispatch\n * boundaries.\n */\nexport interface UIBridgeServerHandlers {\n // Render log endpoints\n getRenderLog: (\n query?: RenderLogQuery,\n context?: HandlerContext\n ) => Promise<APIResponse<RenderLogEntry[]>>;\n clearRenderLog: (context?: HandlerContext) => Promise<APIResponse<void>>;\n captureSnapshot: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getRenderLogPath: () => Promise<APIResponse<{ path: string }>>;\n\n // Control endpoints\n getElements: (\n options?: {\n recency?: string;\n /** Case-insensitive substring filter on the element's title DOM attribute */\n title?: string;\n /** Case-insensitive substring filter on the element's aria-label DOM attribute */\n aria_label?: string;\n /** Case-insensitive substring filter on the element's visible text / label */\n text?: string;\n /**\n * Phase 3.2 (plan 2026-05-03) — return only elements whose `reveals`\n * array contains an entry that matches this query. Bi-directional glob\n * match: query may be a concrete id matching a `*`-glob entry, or a\n * `*`-glob matching concrete entries.\n */\n revealsAny?: string;\n /**\n * Target a runner pop-out window discoverable via `listWindows()`;\n * omit → the main window. Serialized as the `?windowLabel=` query\n * parameter (the runner reads it from the query on `GET\n * /control/elements`); unknown labels yield a structured error naming\n * the missing window.\n */\n windowLabel?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements']>>;\n getElement: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['elements'][0]>>;\n getElementState: (id: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getElementReactState: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n executeElementAction: (\n id: string,\n request: ControlActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlActionResponse>>;\n executeBatchAction: (\n request: BatchActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchActionResponse>>;\n /**\n * Rank snapshot elements by natural-language query against the\n * structured disambiguation metadata (variant, position, color,\n * contextPath, label, type). Returns scored matches.\n *\n * Free-text input is tokenised and matched token-bag style; structured\n * filters (type, origin, visibleOnly, contextPathContains) act as hard\n * filters. See `@qontinui/ui-bridge/core` `findElements` for the\n * scoring model.\n */\n rankElements: (\n request: {\n text?: string;\n type?: string;\n variant?: string;\n position?: string;\n color?: string;\n contextPathContains?: string;\n origin?: 'hook' | 'auto';\n visibleOnly?: boolean;\n limit?: number;\n minScore?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n id: string;\n score: number;\n reasons: string[];\n element: ControlSnapshot['elements'][0];\n }>\n >\n >;\n\n // Component endpoints\n // F2 (Direction B): `data` is `{components: [...]}` so the envelope matches\n // the runner's direct `/ui-bridge/control/components` route and aligns with\n // every other rich endpoint convention (object-shaped `data`).\n getComponents: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ components: ControlSnapshot['components'] }>>;\n getComponent: (\n id: string,\n options?: { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['components'][0]>>;\n getComponentState: (\n id: string,\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n state: Record<string, unknown>;\n computed: Record<string, unknown>;\n timestamp: number;\n }>\n >;\n executeComponentAction: (\n id: string,\n request: ComponentActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ComponentActionResponse>>;\n\n // Find endpoints\n find: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n /**\n * @deprecated Use find() instead\n */\n discover: (\n request?: FindRequest & { recency?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResponse>>;\n getControlSnapshot: (\n request?: {\n targetTabId?: string;\n url?: string;\n skipSettle?: boolean | string;\n settleTimeout?: number | string;\n recency?: string;\n /**\n * Item 1 filter: when `true`, drop elements with `kind: \"content\"`\n * (semantic `data-ui-bridge-content` entries) from the response.\n * Default `false` — include everything.\n */\n interactiveOnly?: boolean | string;\n /** snake_case alias for `interactiveOnly`. */\n interactive_only?: boolean | string;\n /**\n * Manual-test remediation 2026-05-10 (Item 2) filter: when `true`,\n * keep only elements that report disabled by any of these signals in\n * the snapshot's `state`: `disabled === true`,\n * `ariaDisabled === \"true\"`, or `enabled === false`. Default `false` —\n * include everything. All other snapshot metadata (route, activeTab,\n * registration, viewport, errorSummary) is preserved unchanged.\n */\n withDisabledOnly?: boolean | string;\n /** snake_case alias for `withDisabledOnly`. */\n with_disabled_only?: boolean | string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot>>;\n\n // Vision pipeline endpoints — runner-direct; SDK stubs only.\n visionCapture: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAnnotate: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDiff: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionRaw: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionCacheStream: (sha256: string, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionHealth: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n // Phase 4 — text-bearing outputs.\n visionExtract: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionDescribe: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n // Phase 6 — analyzers + assertion DSL + baselines + frontend mutation signal.\n visionAnalyze: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionAssert: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaseline: (\n request?: Record<string, unknown>,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n visionBaselinesList: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n visionMutationOccurred: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Workflow endpoints\n getWorkflows: (\n options?: {\n recency?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ControlSnapshot['workflows']>>;\n runWorkflow: (\n id: string,\n request?: WorkflowRunRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n getWorkflowStatus: (\n runId: string,\n context?: HandlerContext\n ) => Promise<APIResponse<WorkflowRunResponse>>;\n\n // Debug endpoints\n getActionHistory: (\n limit?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify\n // cycles from the process-global effect store. Newest-first; `limit` caps\n // the slice (omitted = all retained, default ring-buffer cap 100).\n getRecentEffects: (\n options?: { limit?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<EffectRecordEntry[]>>;\n getMetrics: () => Promise<APIResponse<unknown>>;\n highlightElement: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getElementTree: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n getConsoleErrors: (\n params?: {\n since?: number;\n /**\n * Monotonic id cursor — return only entries with `id > sinceId`.\n * Paired with `nextSinceId` in the ungrouped response for pagination.\n * Takes precedence over the legacy `since` timestamp filter when both\n * are provided.\n */\n sinceId?: number;\n limit?: number;\n group?: boolean;\n groupBy?: 'fingerprint' | 'message' | 'source';\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | {\n errors: CapturedError[];\n count: number;\n /** Cursor for the next call — last returned entry's id, or `sinceId` if empty. */\n nextSinceId?: number;\n /** Lifetime total of entries evicted from the underlying buffer. */\n droppedCount?: number;\n /** Current buffer size (not filtered by level/since). */\n bufferedCount?: number;\n }\n | { groups: unknown[]; totalErrors: number; totalGroups: number }\n >\n >;\n clearConsoleErrors: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // AI-native endpoints\n aiSearch: (\n criteria: SearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SearchResponse>>;\n aiFind: (\n request: {\n query: string;\n context?: FindContext;\n confidenceThreshold?: number;\n /**\n * B2 — strict literal-match mode. When `true`, returns only elements\n * with a case-insensitive exact match against id / labelText /\n * ariaLabel / textContent / title / placeholder / value / name; no\n * fuzzy fallback. Default `false` keeps fuzzy behaviour.\n */\n strict?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FindResult>>;\n aiExecute: (\n request: NLActionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<NLActionResponse>>;\n aiAssert: (\n request: AssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<AssertionResult>>;\n aiAssertBatch: (\n request: BatchAssertionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<BatchAssertionResult>>;\n getSemanticSnapshot: (\n options?: {\n includeForms?: string | boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSnapshot>>;\n getSemanticDiff: (\n since?: number,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n getPageSummary: (context?: HandlerContext) => Promise<APIResponse<string>>;\n\n // Change tracking endpoints\n executeWithDiff: (\n request: ActionWithDiffRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ActionDiffResult>>;\n waitForChange: (\n request: {\n predicate: ChangePredicate;\n options?: WaitForChangeOptions;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff>>;\n categorizeLastDiff: (context?: HandlerContext) => Promise<APIResponse<CategorizedDiff | null>>;\n getScopedDiff: (\n request: {\n scope: string;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n // Budget-aware diff summary\n summarizeDiff: (\n request: {\n budget: number;\n includeIds?: boolean;\n includeCategory?: boolean;\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ summary: string }>>;\n // Structured change analysis (table/list-aware)\n analyzeStructuredChanges: (\n request: {\n fromBookmark?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredChangeAnalysis>>;\n\n // Change buffer endpoints\n enableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n disableChangeBuffer: (context?: HandlerContext) => Promise<APIResponse<{ enabled: boolean }>>;\n drainChangeBuffer: (\n context?: HandlerContext\n ) => Promise<APIResponse<ChangeBufferDrainResult>>;\n getChangeBufferSize: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ size: number; enabled: boolean }>>;\n\n // Snapshot bookmark endpoints\n saveBookmark: (\n request: { name: string },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotBookmark>>;\n getBookmark: (name: string, context?: HandlerContext) => Promise<APIResponse<SnapshotBookmark>>;\n deleteBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n listBookmarks: (context?: HandlerContext) => Promise<APIResponse<string[]>>;\n diffFromBookmark: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticDiff | null>>;\n\n // Semantic search (embedding-based)\n aiSemanticSearch: (\n criteria: SemanticSearchCriteria,\n context?: HandlerContext\n ) => Promise<APIResponse<SemanticSearchResponse>>;\n\n // State management endpoints\n getStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n getState: (id: string, context?: HandlerContext) => Promise<APIResponse<UIState>>;\n getActiveStates: (context?: HandlerContext) => Promise<APIResponse<UIState[]>>;\n activateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateState: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getStateGroups: (context?: HandlerContext) => Promise<APIResponse<UIStateGroup[]>>;\n activateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n deactivateStateGroup: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n getTransitions: (context?: HandlerContext) => Promise<APIResponse<UITransition[]>>;\n canExecuteTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ canExecute: boolean; reason?: string }>>;\n executeTransition: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<TransitionResult>>;\n findPath: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<PathResult>>;\n navigateTo: (\n request: { targetStates: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<NavigationResult>>;\n getStateSnapshot: (context?: HandlerContext) => Promise<APIResponse<StateSnapshot>>;\n\n // Intent endpoints\n executeIntent: (\n request: {\n intentId: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n findIntent: (\n request: { query: string },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentSearchResponse>>;\n listIntents: (context?: HandlerContext) => Promise<APIResponse<Intent[]>>;\n registerIntent: (intent: Intent, context?: HandlerContext) => Promise<APIResponse<Intent>>;\n executeIntentFromQuery: (\n request: {\n query: string;\n params?: Record<string, unknown>;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<IntentExecutionResult>>;\n deleteIntent: (\n name: string,\n context?: HandlerContext\n ) => Promise<APIResponse<{ deleted: boolean }>>;\n\n // Recovery endpoints\n attemptRecovery: (\n request: RecoveryAttemptRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<RecoveryAttemptResult>>;\n\n // Cross-app analysis endpoints\n analyzePageData: (context?: HandlerContext) => Promise<APIResponse<PageDataMap>>;\n analyzePageRegions: (context?: HandlerContext) => Promise<APIResponse<PageRegionMap>>;\n analyzeStructuredData: (\n context?: HandlerContext\n ) => Promise<APIResponse<StructuredDataExtraction>>;\n crossAppCompare: (\n request: {\n sourceSnapshot: SemanticSnapshot;\n targetSnapshot: SemanticSnapshot;\n sourceComponents?: ComponentInfo[];\n targetComponents?: ComponentInfo[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CrossAppComparisonReport>>;\n\n // Page navigation endpoints\n pageRefresh: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageNavigate: (\n request: PageNavigateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoBack: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageGoForward: (context?: HandlerContext) => Promise<APIResponse<PageNavigationResponse>>;\n pageEvaluate: (\n request: PageEvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown>>;\n pageScroll: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Clipboard endpoints (browser gesture-based)\n clipboardWrite: (request: unknown, context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clipboardRead: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n\n // Annotation endpoints\n getAnnotations: (\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, ElementAnnotation>>>;\n getAnnotation: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n setAnnotation: (\n id: string,\n annotation: ElementAnnotation,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementAnnotation>>;\n deleteAnnotation: (id: string, context?: HandlerContext) => Promise<APIResponse<void>>;\n importAnnotations: (\n config: AnnotationConfig,\n context?: HandlerContext\n ) => Promise<APIResponse<{ count: number }>>;\n exportAnnotations: (context?: HandlerContext) => Promise<APIResponse<AnnotationConfig>>;\n getAnnotationCoverage: (\n context?: HandlerContext\n ) => Promise<APIResponse<AnnotationCoverage>>;\n\n // Performance diagnostics endpoints\n getPerformanceEntries: (context?: HandlerContext) => Promise<APIResponse<unknown>>;\n clearPerformanceEntries: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ cleared: boolean }>>;\n getBrowserEvents: (\n params?: {\n type?: string;\n since?: number;\n limit?: number;\n severity?: string;\n deduplicate?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<BrowserEventsResponse>>;\n getTimeline: (\n params?: {\n since?: number;\n limit?: number;\n minSeverity?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ entries: TimelineEntry[]; count: number }>>;\n\n // Health score endpoint\n getHealthReport: (\n params?: { windowMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<HealthReport>>;\n\n // Network chain endpoints\n getNetworkChains: (\n params?: {\n since?: number;\n limit?: number;\n failuresOnly?: boolean;\n url?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ chains: NetworkChain[]; count: number }>>;\n\n // Error session endpoints\n startErrorSession: (\n request: { label?: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ sessionId: string }>>;\n endErrorSession: (\n context?: HandlerContext\n ) => Promise<APIResponse<ErrorSessionSummary | null>>;\n getErrorSessions: (context?: HandlerContext) => Promise<APIResponse<ErrorSessionSummary[]>>;\n captureErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ label: string; capturedAt: number; fingerprintCount: number }>>;\n compareErrorBaseline: (\n request: { label: string },\n context?: HandlerContext\n ) => Promise<APIResponse<BaselineComparison | null>>;\n\n // Error snapshots (auto-captured on significant errors)\n getErrorSnapshots: (\n params?: {\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ snapshots: ErrorSnapshot[]; count: number }>>;\n\n // Composite error report (health + recent errors + session in one call)\n getErrorReport: (\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n health: HealthReport;\n recentErrors: AnyCapturedEvent[];\n activeSession: ErrorSessionSummary | null;\n snapshots: ErrorSnapshot[];\n }>\n >;\n\n // Design review endpoints\n getElementStyles: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementDesignData>>;\n getElementStateStyles: (\n id: string,\n request: { states?: InteractionStateName[] },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elementId: string; stateStyles: StateStyles[] }>>;\n getDesignSnapshot: (\n request?: {\n elementIds?: string[];\n includePseudoElements?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: ElementDesignData[]; timestamp: number }>>;\n getResponsiveSnapshots: (\n request: {\n viewports?: Record<string, number>;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<ResponsiveSnapshot[]>>;\n setViewportConstraints: (\n request: { width?: number; restore?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{\n success: boolean;\n viewportWidth: number;\n constrainedWidth: number;\n timestamp: number;\n }>\n >;\n runDesignAudit: (\n request?: {\n guide?: StyleGuideConfig;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<StyleAuditReport>>;\n loadStyleGuide: (\n request: {\n guide: StyleGuideConfig;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ loaded: boolean }>>;\n getStyleGuide: (context?: HandlerContext) => Promise<APIResponse<StyleGuideConfig | null>>;\n clearStyleGuide: (context?: HandlerContext) => Promise<APIResponse<{ cleared: boolean }>>;\n\n // Quality evaluation endpoints\n evaluateQuality: (\n request?: EvaluateRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<QualityEvaluationReport>>;\n getQualityContexts: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; description: string }>>>;\n saveBaseline: (\n request?: {\n label?: string;\n elementIds?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ saved: boolean; elementCount: number }>>;\n diffBaseline: (\n request?: { elementIds?: string[] },\n context?: HandlerContext\n ) => Promise<APIResponse<SnapshotDiffReport>>;\n\n // Form state awareness endpoints\n getForms: (context?: HandlerContext) => Promise<APIResponse<FormsResponse>>;\n fillForm: (\n request: FillFormRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<FillResult>>;\n snapshotForms: (context?: HandlerContext) => Promise<APIResponse<FormSnapshot>>;\n diffForms: (\n request: {\n before: FormSnapshot;\n after: FormSnapshot;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<FormDiff>>;\n\n // Clipboard endpoints\n getClipboard: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ text: string | null; formats: string[] }>>;\n setClipboard: (\n request: {\n text: string;\n html?: string;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ written: boolean; formats: string[] }>>;\n\n // Network request monitoring endpoints\n getNetworkRequests: (\n params?: {\n status?: string;\n method?: string;\n urlPattern?: string;\n failuresOnly?: boolean;\n since?: number;\n limit?: number;\n },\n context?: HandlerContext\n ) => Promise<\n APIResponse<{ requests: NetworkRequestEntry[]; count: number; inFlightCount: number }>\n >;\n\n getNetworkRequestsInFlight: (\n context?: HandlerContext\n ) => Promise<APIResponse<{ requests: NetworkRequestEntry[]; count: number }>>;\n\n waitForNetworkRequest: (\n request: WaitForRequestOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForRequestResult>>;\n\n getNetworkRequest: (\n id: string,\n context?: HandlerContext\n ) => Promise<APIResponse<NetworkRequestEntry>>;\n\n // Idle detection endpoints\n getIdleStatus: (context?: HandlerContext) => Promise<APIResponse<CompositeIdleStatus>>;\n getIdleSignalStatus: (\n signal: string,\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForIdle: (\n request?: {\n timeout?: number;\n minStableMs?: number;\n exclude?: string[];\n },\n context?: HandlerContext\n ) => Promise<APIResponse<CompositeIdleStatus>>;\n waitForSignalIdle: (\n signal: string,\n request?: { timeout?: number; minStableMs?: number },\n context?: HandlerContext\n ) => Promise<APIResponse<SignalStatus>>;\n waitForTargets: (\n request: {\n targets: Array<string | { indicator: string }>;\n timeout?: number;\n minStableMs?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<Record<string, SignalStatus>>>;\n\n // Undo/redo awareness endpoints\n getUndoState: (context?: HandlerContext) => Promise<APIResponse<UndoRedoState>>;\n executeUndo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n executeRedo: (context?: HandlerContext) => Promise<APIResponse<{ executed: boolean }>>;\n\n // Phase 1.3 (plan 2026-05-03) — flat machine-readable digest of \"is the\n // page in a sensible state right now?\" so callers don't have to fan out\n // five round-trips (snapshot + console-errors + idle-status + …) just to\n // pre-flight an interaction. Distinct from `/ai/page-summary` which\n // returns NL prose for human consumption.\n getStateSummary: () => Promise<APIResponse<StateSummary>>;\n\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate.\n // Returns 200 + passed:true on success, 422 + passed:false on timeout\n // (set via APIResponse.httpStatus). Shares predicate evaluation with\n // `/ai/wait-for-element` so semantics stay aligned.\n expectElement: (\n id: string,\n request: ElementExpectRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ElementExpectResponse>>;\n\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless` so callers can drive the web bridge\n // without manually opening a browser. Gated behind `enableHeadlessSpawn`\n // (off by default); returns 503 when disabled or when the optional peer\n // dependency isn't installed; 400 on bad input.\n spawnHeadless: (\n request: SpawnHeadlessRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<SpawnHeadlessResponse>>;\n\n // Page health diagnostics — runs the same spatial-coverage / layout /\n // text-signal heuristics as the runner's `/control/page-health` analyzer\n // (qontinui-runner src-tauri/src/mcp/ui_bridge/screenshots.rs) but\n // server-side over the current snapshot. Pure data-over-elements; no\n // browser context required beyond a relayed snapshot.\n pageHealth: () => Promise<APIResponse<PageHealthReport>>;\n\n // API discovery\n getCapabilities: () => Promise<APIResponse<CapabilitiesResponse>>;\n\n // Specs endpoint — serves all loaded specs for runner discovery\n getSpecs: () => Promise<APIResponse<Record<string, unknown>>>;\n\n // Heartbeat (app health detection)\n receiveHeartbeat: () => Promise<APIResponse<{ received: boolean }>>;\n\n // Element event log\n getElementHistory: (\n elementId: string,\n options?: ElementHistoryOptions,\n context?: HandlerContext\n ) => Promise<APIResponse<unknown[]>>;\n\n // Media discovery & analysis endpoints — removed in Phase 2 of the\n // UI Bridge Vision Pipeline (2026-05-13). The `/control/screenshot`,\n // `/control/annotated-screenshot`, `/control/element-screenshot`,\n // `/control/capture-element-images`, `/control/get-element-images`,\n // `/control/diagnose-stuck-screen`, and `/ai/media/*` routes are\n // superseded by `/vision/{capture,annotate,diff,raw,cache,health}`\n // declared above (handlers prefixed `vision*`). The runner answers those\n // routes directly; the SDK keeps stubs for type-completeness.\n\n // Change observation (push-based)\n getChangesSince: (params?: {\n since?: number;\n limit?: number;\n }) => Promise<APIResponse<{ events: DOMChangeEvent[]; count: number }>>;\n\n /** Tear down internal subscriptions and observers to prevent resource leaks. */\n destroy?: () => void;\n\n // Enhanced discovery endpoints\n query: (\n request: {\n selector: string;\n limit?: number;\n includeState?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ elements: unknown[]; count: number }>>;\n\n waitForElement: (\n request: {\n selector?: string;\n elementId?: string;\n timeout?: number;\n pollInterval?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ found: boolean; element?: unknown; waitedMs: number }>>;\n\n /**\n * Tier 3.1 — Wait for an element matching a structured selector to satisfy\n * a given condition (present / visible / clickable / text-matches).\n *\n * Implemented via registry polling so it works with both DOM and native elements.\n */\n waitForElementByCondition: (\n request: WaitForElementByConditionRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<WaitForElementByConditionResponse>>;\n\n /**\n * Testing-friendliness — Wait for an SPA route change with optional\n * from/to matching. Returns a timeout shape (reason: 'timeout') when no\n * matching navigation occurs before `timeoutMs`.\n */\n waitForRouteChange: (\n request?: WaitForRouteChangeRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n WaitForRouteChangeResponse | { reason: 'timeout'; lastKnownRoute?: string; elapsedMs: number }\n >\n >;\n\n /**\n * Testing-friendliness — Wait for an element matching `predicate` to be\n * registered (or visible / have layout, per `requirement`). Polls the\n * in-memory registry; falls back to `document.querySelector` when\n * `predicate.selector` is given.\n */\n waitForElementRegistered: (\n request: WaitForElementRequest,\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n | WaitForElementSuccessResponse\n | { reason: 'timeout'; elapsedMs: number; closestMatch?: Record<string, unknown> }\n >\n >;\n\n /**\n * Tier 3.2 — Execute a heterogeneous sequence of actions, waits, and\n * snapshots in one round-trip.\n */\n controlBatch: (\n request: ControlBatchRequest,\n context?: HandlerContext\n ) => Promise<APIResponse<ControlBatchResponse>>;\n\n // App-agnostic convenience endpoints\n clickByText: (\n request: {\n text: string;\n tag?: string;\n exact?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n clickBySelector: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ clicked: boolean; element?: unknown }>>;\n\n typeInto: (\n request: {\n selector?: string;\n label?: string;\n text: string;\n clear?: boolean;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ typed: boolean; element?: unknown }>>;\n\n readValue: (\n request: {\n selector: string;\n index?: number;\n },\n context?: HandlerContext\n ) => Promise<APIResponse<{ value: string | null; length: number }>>;\n\n findByText: (\n request: { text: string; tag?: string; exact?: boolean },\n context?: HandlerContext\n ) => Promise<\n APIResponse<\n Array<{\n index: number;\n tag: string;\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n disabled: boolean;\n visible: boolean;\n }>\n >\n >;\n\n // Diagnostics endpoint\n getDiagnostics: (context?: HandlerContext) => Promise<\n APIResponse<{\n sdk_initialized: boolean;\n auto_register_active: boolean;\n registered_elements: number;\n dom_interactive_elements: number;\n mutation_observer_active: boolean;\n navigation_adapter: string;\n page_title: string;\n page_url: string;\n page_ready: boolean;\n providers_mounted: string[];\n last_discover_at: string | null;\n capabilities: string[];\n }>\n >;\n\n // Navigation adapter endpoints\n getRoutes: (\n context?: HandlerContext\n ) => Promise<APIResponse<Array<{ name: string; path: string }>>>;\n navigateByAdapter: (\n request: { page: string },\n context?: HandlerContext\n ) => Promise<APIResponse<{ navigated: boolean; route: { name: string; path: string } }>>;\n}\n\n/**\n * Push-based DOM change event.\n *\n * Batched subtree-change events emitted by the ChangeObserver and relayed\n * through the CommandRelay. Inspired by folk-js/allio's SubtreeChanged event.\n */\nexport interface DOMChangeEvent {\n type: 'subtreeChanged';\n timestamp: number;\n added: string[];\n removed: string[];\n modified: string[];\n}\n\n/**\n * Endpoint description for API discovery\n */\nexport interface EndpointInfo {\n method: string;\n path: string;\n description: string;\n queryParams?: Record<string, string>;\n}\n\n/**\n * Category of related endpoints\n */\nexport interface EndpointCategory {\n description: string;\n endpoints: EndpointInfo[];\n}\n\n/**\n * Response from the /capabilities endpoint\n */\nexport interface CapabilitiesResponse {\n version: string;\n categories: Record<string, EndpointCategory>;\n}\n\n/**\n * Selector criteria for waitForElementByCondition.\n * All provided fields are ANDed together (case-insensitive substring match).\n */\nexport interface ElementConditionSelector {\n /** Match by element id (exact or substring) */\n id?: string;\n /** Match by title attribute (substring) */\n title?: string;\n /** Match by aria-label attribute (substring) */\n aria_label?: string;\n /** Match by visible text / label (substring) */\n text?: string;\n /** Match by element type (e.g. \"button\", \"input\") */\n type?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionRequest {\n /** Selector criteria — all provided fields must match */\n selector: ElementConditionSelector;\n /** Max wait in ms (default 5000, capped at 60000) */\n timeout_ms?: number;\n /** Condition to check on each poll */\n condition?: 'present' | 'visible' | 'clickable' | 'text-matches';\n /** Substring to match when condition is \"text-matches\" (case-insensitive) */\n text_match?: string;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (Tier 3.1)\n */\nexport interface WaitForElementByConditionResponse {\n /** Whether the condition was satisfied before timeout */\n matched: boolean;\n /** The matched element (present when matched is true) */\n element?: unknown;\n /** How long we actually waited in ms */\n waited_ms: number;\n}\n\n/**\n * Request body for POST /ai/wait-for-route-change.\n *\n * Blocks until the SPA route changes. Optionally filters by the prior\n * route (`fromRoute`) and/or the new route (`toRoute` with `matchMode`).\n * When a matching route change happened between the request arriving and\n * the subscription being set, the handler resolves immediately with\n * `elapsedMs: 0` by scanning the always-on recent-route-change buffer.\n */\nexport interface WaitForRouteChangeRequest {\n /** Only fire when the prior route equals this exact string. */\n fromRoute?: string;\n /** Only fire when the new route matches this (per `matchMode`). */\n toRoute?: string;\n /** How to compare `toRoute` against the new route. Default: `\"exact\"`. */\n matchMode?: 'exact' | 'prefix' | 'regex';\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-route-change (success case).\n */\nexport interface WaitForRouteChangeResponse {\n from: string;\n to: string;\n elapsedMs: number;\n}\n\n/**\n * Selector predicate for POST /ai/wait-for-element.\n *\n * All provided fields are ANDed. At least one field should be provided;\n * otherwise the first registered element is returned.\n */\nexport interface WaitForElementPredicate {\n /** Match by element id (exact). */\n id?: string;\n /** Match by label / accessible name (case-insensitive substring). */\n label?: string;\n /** Match by data-testid attribute (exact). */\n testId?: string;\n /** CSS selector — falls back to document.querySelector if element is not in registry. */\n selector?: string;\n}\n\n/**\n * Request body for POST /ai/wait-for-element.\n *\n * Polls the in-memory registry for an element matching `predicate`. When\n * `selector` is supplied, falls back to `document.querySelector` once per\n * poll so the wait also covers elements that aren't SDK-registered.\n */\nexport interface WaitForElementRequest {\n predicate: WaitForElementPredicate;\n /**\n * Additional requirement on the matched element.\n * - `\"registered\"` (default): element exists in the registry.\n * - `\"visible\"`: element exists AND is visible per snapshot rules.\n * - `\"has-layout\"`: element exists AND `layout.width > 0 && layout.height > 0`.\n */\n requirement?: 'registered' | 'visible' | 'has-layout';\n /** Poll interval in ms. Default 100, clamped to [50, 1000]. */\n pollMs?: number;\n /** Max wait in ms. Default 5000, clamped to [100, 60000]. */\n timeoutMs?: number;\n}\n\n/**\n * Response body for POST /ai/wait-for-element (success case).\n */\nexport interface WaitForElementSuccessResponse {\n element: {\n id: string;\n label?: string;\n type?: string;\n [key: string]: unknown;\n };\n elapsedMs: number;\n}\n\n/**\n * A single step in a Tier 3.2 control batch request.\n */\nexport type ControlBatchStep =\n | {\n type: 'action';\n /** ID of the element to act on */\n element_id: string;\n /** Action name (click, type, focus, …) */\n action: string;\n /** Optional action parameters */\n params?: Record<string, unknown>;\n }\n | {\n type: 'wait';\n /** Milliseconds to sleep */\n ms: number;\n }\n | {\n type: 'snapshot';\n };\n\n/**\n * Request body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchRequest {\n actions: ControlBatchStep[];\n /** When true (default), stop executing on the first error */\n stop_on_error?: boolean;\n}\n\n/**\n * Per-step result in a Tier 3.2 batch response\n */\nexport interface ControlBatchStepResult {\n index: number;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * Response body for POST /control/batch (Tier 3.2)\n */\nexport interface ControlBatchResponse {\n results: ControlBatchStepResult[];\n completed: number;\n total: number;\n}\n\n/**\n * Route definition\n */\nexport interface RouteDefinition {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n handler: string; // Key in UIBridgeServerHandlers\n params?: string[]; // URL params to extract\n bodyRequired?: boolean;\n}\n\n/**\n * All UI Bridge routes\n */\nexport const UI_BRIDGE_ROUTES: RouteDefinition[] = [\n // Render log\n { method: 'GET', path: '/render-log', handler: 'getRenderLog' },\n { method: 'GET', path: '/control/render-log', handler: 'getRenderLog' }, // Alias under /control/\n { method: 'DELETE', path: '/render-log', handler: 'clearRenderLog' },\n { method: 'POST', path: '/render-log/snapshot', handler: 'captureSnapshot' },\n { method: 'GET', path: '/render-log/path', handler: 'getRenderLogPath' },\n\n // Control - Elements\n { method: 'GET', path: '/control/elements', handler: 'getElements' },\n { method: 'GET', path: '/control/element/:id', handler: 'getElement', params: ['id'] },\n { method: 'GET', path: '/control/element/:id/state', handler: 'getElementState', params: ['id'] },\n {\n method: 'GET',\n path: '/control/element/:id/react-state',\n handler: 'getElementReactState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/element/:id/action',\n handler: 'executeElementAction',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 2.1 (plan 2026-05-03) — assert an element predicate. Returns\n // 200 + passed:true on success, 422 + passed:false on timeout.\n {\n method: 'POST',\n path: '/control/element/:id/expect',\n handler: 'expectElement',\n params: ['id'],\n bodyRequired: true,\n },\n // Phase 4.1 (plan 2026-05-03) — spawn a real Chromium tab via\n // `@qontinui/ui-bridge-headless`. Gated behind `enableHeadlessSpawn`\n // / `ENABLE_HEADLESS_SPAWN=1`; returns 503 when disabled or the\n // optional peer dependency is absent.\n {\n method: 'POST',\n path: '/control/sdk/spawn-headless',\n handler: 'spawnHeadless',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/actions/batch',\n handler: 'executeBatchAction',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/elements/rank',\n handler: 'rankElements',\n bodyRequired: true,\n },\n\n // Control - Components\n { method: 'GET', path: '/control/components', handler: 'getComponents' },\n { method: 'GET', path: '/control/component/:id', handler: 'getComponent', params: ['id'] },\n {\n method: 'GET',\n path: '/control/component/:id/state',\n handler: 'getComponentState',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/component/:id/action/:actionId',\n handler: 'executeComponentAction',\n params: ['id', 'actionId'],\n bodyRequired: true,\n },\n\n // Find (formerly Discovery)\n { method: 'POST', path: '/control/find', handler: 'find' },\n { method: 'POST', path: '/control/discover', handler: 'discover' }, // @deprecated Use /control/find\n { method: 'GET', path: '/control/snapshot', handler: 'getControlSnapshot' },\n // Phase 1.3 (plan 2026-05-03) — flat digest synthesized from snapshot +\n // console-errors + idle-status. One call instead of five.\n { method: 'GET', path: '/control/state-summary', handler: 'getStateSummary' },\n\n // Page health diagnostics — runs the spatial-coverage / layout / text-\n // signal heuristics defined in `./page-health.ts`. Byte-equivalent output\n // shape to the runner's `/control/page-health` handler so the page-health\n // skill (.claude/skills/page-health/SKILL.md) sees identical payloads\n // regardless of transport. POST (matches runner) — body reserved for\n // future per-check toggles (currently ignored).\n { method: 'POST', path: '/control/page-health', handler: 'pageHealth' },\n\n // Workflows\n { method: 'GET', path: '/control/workflows', handler: 'getWorkflows' },\n { method: 'POST', path: '/control/workflow/:id/run', handler: 'runWorkflow', params: ['id'] },\n {\n method: 'GET',\n path: '/control/workflow/:runId/status',\n handler: 'getWorkflowStatus',\n params: ['runId'],\n },\n\n // Element event log\n {\n method: 'GET',\n path: '/debug/element-history/:id',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Debug\n { method: 'GET', path: '/debug/action-history', handler: 'getActionHistory' },\n // D3 Effect Calculus (Phase 2) — read-only recent predict-then-verify cycles.\n { method: 'GET', path: '/effects/recent', handler: 'getRecentEffects' },\n { method: 'GET', path: '/debug/metrics', handler: 'getMetrics' },\n { method: 'POST', path: '/debug/highlight/:id', handler: 'highlightElement', params: ['id'] },\n { method: 'GET', path: '/debug/element-tree', handler: 'getElementTree' },\n { method: 'GET', path: '/control/console-errors', handler: 'getConsoleErrors' },\n { method: 'POST', path: '/control/console-errors/clear', handler: 'clearConsoleErrors' },\n\n // AI-native endpoints\n { method: 'POST', path: '/ai/search', handler: 'aiSearch', bodyRequired: true },\n { method: 'POST', path: '/ai/find', handler: 'aiFind', bodyRequired: true },\n { method: 'POST', path: '/ai/execute', handler: 'aiExecute', bodyRequired: true },\n { method: 'POST', path: '/ai/assert', handler: 'aiAssert', bodyRequired: true },\n { method: 'POST', path: '/ai/assert/batch', handler: 'aiAssertBatch', bodyRequired: true },\n { method: 'GET', path: '/ai/snapshot', handler: 'getSemanticSnapshot' },\n { method: 'GET', path: '/ai/diff', handler: 'getSemanticDiff' },\n { method: 'GET', path: '/ai/summary', handler: 'getPageSummary' },\n { method: 'POST', path: '/ai/semantic-search', handler: 'aiSemanticSearch', bodyRequired: true },\n\n // Change tracking\n {\n method: 'POST',\n path: '/ai/execute-with-diff',\n handler: 'executeWithDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/wait-for-change',\n handler: 'waitForChange',\n bodyRequired: true,\n },\n { method: 'GET', path: '/ai/categorize-last-diff', handler: 'categorizeLastDiff' },\n { method: 'POST', path: '/ai/scoped-diff', handler: 'getScopedDiff', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/summarize-diff',\n handler: 'summarizeDiff',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/ai/structured-changes',\n handler: 'analyzeStructuredChanges',\n bodyRequired: true,\n },\n\n // Change buffer\n { method: 'POST', path: '/ai/change-buffer/enable', handler: 'enableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/disable', handler: 'disableChangeBuffer' },\n { method: 'POST', path: '/ai/change-buffer/drain', handler: 'drainChangeBuffer' },\n { method: 'GET', path: '/ai/change-buffer/size', handler: 'getChangeBufferSize' },\n\n // Snapshot bookmarks (static routes before parameterized).\n //\n // The list/save endpoints use the plural `/ai/bookmarks` while the\n // per-resource endpoints historically used the singular `/ai/bookmark/:name`.\n // The plural variants are aliased to the same handlers so callers reading\n // the canonical reference (which uses plural throughout) don't hit 404s\n // when paths drift in their head.\n { method: 'POST', path: '/ai/bookmarks', handler: 'saveBookmark', bodyRequired: true },\n { method: 'GET', path: '/ai/bookmarks', handler: 'listBookmarks' },\n { method: 'GET', path: '/ai/bookmark/:name', handler: 'getBookmark', params: ['name'] },\n { method: 'GET', path: '/ai/bookmarks/:name', handler: 'getBookmark', params: ['name'] },\n {\n method: 'DELETE',\n path: '/ai/bookmark/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'DELETE',\n path: '/ai/bookmarks/:name',\n handler: 'deleteBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmark/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n {\n method: 'GET',\n path: '/ai/bookmarks/:name/diff',\n handler: 'diffFromBookmark',\n params: ['name'],\n },\n\n // State management (static routes before parameterized)\n { method: 'GET', path: '/control/states', handler: 'getStates' },\n { method: 'GET', path: '/control/states/active', handler: 'getActiveStates' },\n { method: 'GET', path: '/control/states/snapshot', handler: 'getStateSnapshot' },\n { method: 'POST', path: '/control/states/find-path', handler: 'findPath', bodyRequired: true },\n { method: 'POST', path: '/control/states/navigate', handler: 'navigateTo', bodyRequired: true },\n { method: 'GET', path: '/control/state/:id', handler: 'getState', params: ['id'] },\n { method: 'POST', path: '/control/state/:id/activate', handler: 'activateState', params: ['id'] },\n {\n method: 'POST',\n path: '/control/state/:id/deactivate',\n handler: 'deactivateState',\n params: ['id'],\n },\n { method: 'GET', path: '/control/state-groups', handler: 'getStateGroups' },\n {\n method: 'POST',\n path: '/control/state-group/:id/activate',\n handler: 'activateStateGroup',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/state-group/:id/deactivate',\n handler: 'deactivateStateGroup',\n params: ['id'],\n },\n { method: 'GET', path: '/control/transitions', handler: 'getTransitions' },\n {\n method: 'GET',\n path: '/control/transition/:id/can-execute',\n handler: 'canExecuteTransition',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/transition/:id/execute',\n handler: 'executeTransition',\n params: ['id'],\n },\n\n // Intent endpoints\n { method: 'GET', path: '/ai/intents', handler: 'listIntents' },\n { method: 'POST', path: '/ai/intents/execute', handler: 'executeIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/find', handler: 'findIntent', bodyRequired: true },\n { method: 'POST', path: '/ai/intents/register', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/ai/intents/execute-from-query',\n handler: 'executeIntentFromQuery',\n bodyRequired: true,\n },\n\n // Recovery endpoints\n {\n method: 'POST',\n path: '/ai/recovery/attempt',\n handler: 'attemptRecovery',\n bodyRequired: true,\n },\n\n // Cross-app analysis endpoints\n { method: 'GET', path: '/ai/analyze/data', handler: 'analyzePageData' },\n { method: 'GET', path: '/ai/analyze/regions', handler: 'analyzePageRegions' },\n { method: 'GET', path: '/ai/analyze/structured-data', handler: 'analyzeStructuredData' },\n {\n method: 'POST',\n path: '/ai/analyze/cross-app-compare',\n handler: 'crossAppCompare',\n bodyRequired: true,\n },\n\n // Page navigation\n { method: 'POST', path: '/control/page/refresh', handler: 'pageRefresh' },\n { method: 'POST', path: '/control/page/navigate', handler: 'pageNavigate', bodyRequired: true },\n { method: 'POST', path: '/control/page/back', handler: 'pageGoBack' },\n { method: 'POST', path: '/control/page/forward', handler: 'pageGoForward' },\n { method: 'POST', path: '/control/page/evaluate', handler: 'pageEvaluate', bodyRequired: true },\n { method: 'POST', path: '/control/page/scroll', handler: 'pageScroll', bodyRequired: true },\n\n // Clipboard (relay to browser for gesture-based access)\n {\n method: 'POST',\n path: '/control/clipboard/write',\n handler: 'clipboardWrite',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/clipboard/read', handler: 'clipboardRead' },\n\n // Annotations (static routes before parameterized)\n { method: 'GET', path: '/annotations', handler: 'getAnnotations' },\n { method: 'GET', path: '/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/annotations/coverage', handler: 'getAnnotationCoverage' },\n { method: 'POST', path: '/annotations/import', handler: 'importAnnotations', bodyRequired: true },\n { method: 'GET', path: '/annotations/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/annotations/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/annotations/:id', handler: 'deleteAnnotation', params: ['id'] },\n\n // Performance diagnostics\n { method: 'GET', path: '/control/performance-entries', handler: 'getPerformanceEntries' },\n {\n method: 'POST',\n path: '/control/performance-entries/clear',\n handler: 'clearPerformanceEntries',\n },\n { method: 'GET', path: '/control/browser-events', handler: 'getBrowserEvents' },\n { method: 'GET', path: '/control/timeline', handler: 'getTimeline' },\n { method: 'GET', path: '/control/health', handler: 'getHealthReport' },\n { method: 'GET', path: '/control/network-chains', handler: 'getNetworkChains' },\n { method: 'POST', path: '/control/error-sessions/start', handler: 'startErrorSession' },\n { method: 'POST', path: '/control/error-sessions/end', handler: 'endErrorSession' },\n { method: 'GET', path: '/control/error-sessions', handler: 'getErrorSessions' },\n {\n method: 'POST',\n path: '/control/error-baselines/capture',\n handler: 'captureErrorBaseline',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/error-baselines/compare',\n handler: 'compareErrorBaseline',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/error-snapshots', handler: 'getErrorSnapshots' },\n { method: 'GET', path: '/control/error-report', handler: 'getErrorReport' },\n\n // Design review\n {\n method: 'GET',\n path: '/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n { method: 'POST', path: '/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/viewport-constraints',\n handler: 'setViewportConstraints',\n bodyRequired: true,\n },\n { method: 'POST', path: '/design/audit', handler: 'runDesignAudit' },\n {\n method: 'POST',\n path: '/design/style-guide/load',\n handler: 'loadStyleGuide',\n bodyRequired: true,\n },\n { method: 'GET', path: '/design/style-guide', handler: 'getStyleGuide' },\n { method: 'DELETE', path: '/design/style-guide', handler: 'clearStyleGuide' },\n\n // Quality evaluation\n { method: 'POST', path: '/design/evaluate', handler: 'evaluateQuality' },\n { method: 'GET', path: '/design/evaluate/contexts', handler: 'getQualityContexts' },\n { method: 'POST', path: '/design/evaluate/baseline', handler: 'saveBaseline' },\n { method: 'POST', path: '/design/evaluate/diff', handler: 'diffBaseline' },\n\n // Form state awareness\n { method: 'GET', path: '/control/forms', handler: 'getForms' },\n { method: 'POST', path: '/control/fill', handler: 'fillForm', bodyRequired: true },\n { method: 'POST', path: '/control/forms/snapshot', handler: 'snapshotForms' },\n {\n method: 'POST',\n path: '/control/forms/diff',\n handler: 'diffForms',\n bodyRequired: true,\n },\n\n // Clipboard\n { method: 'GET', path: '/control/clipboard', handler: 'getClipboard' },\n { method: 'POST', path: '/control/clipboard', handler: 'setClipboard', bodyRequired: true },\n\n // Network request monitoring (static routes before parameterized)\n { method: 'GET', path: '/control/network-requests', handler: 'getNetworkRequests' },\n {\n method: 'GET',\n path: '/control/network-requests/in-flight',\n handler: 'getNetworkRequestsInFlight',\n },\n {\n method: 'POST',\n path: '/control/network-requests/wait',\n handler: 'waitForNetworkRequest',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/network-request/:id',\n handler: 'getNetworkRequest',\n params: ['id'],\n },\n\n // Idle detection (static routes before parameterized).\n //\n // `/ai/idle-status` is a **byte-identical alias** of `/control/idle-status`\n // — same handler key, same payload. The `/control/*` form is canonical\n // (matches the `/control/*` family convention) and the `/ai/*` alias\n // exists so semantic-search / AI consumers can reach idle state under\n // the namespace they already query. Mirrors the runner's\n // `add_dual!(router, get, \"idle-status\", …)` registration at\n // `qontinui-runner/src-tauri/src/mcp/ui_bridge/errors.rs::routes`. See\n // `docs-site/docs/api/runner-features.md` for the canonicalisation rule.\n { method: 'GET', path: '/control/idle-status', handler: 'getIdleStatus' },\n { method: 'GET', path: '/ai/idle-status', handler: 'getIdleStatus' },\n { method: 'POST', path: '/control/wait-for-idle', handler: 'waitForIdle' },\n {\n method: 'POST',\n path: '/control/wait-for-targets',\n handler: 'waitForTargets',\n bodyRequired: true,\n },\n {\n method: 'GET',\n path: '/control/idle-status/:signal',\n handler: 'getIdleSignalStatus',\n params: ['signal'],\n },\n {\n method: 'POST',\n path: '/control/wait-for-idle/:signal',\n handler: 'waitForSignalIdle',\n params: ['signal'],\n },\n\n // Undo/redo awareness\n { method: 'GET', path: '/control/undo-state', handler: 'getUndoState' },\n { method: 'POST', path: '/control/undo', handler: 'executeUndo' },\n { method: 'POST', path: '/control/redo', handler: 'executeRedo' },\n\n // API discovery\n { method: 'GET', path: '/capabilities', handler: 'getCapabilities' },\n\n // Specs\n { method: 'GET', path: '/control/specs', handler: 'getSpecs' },\n\n // Heartbeat\n { method: 'POST', path: '/heartbeat', handler: 'receiveHeartbeat' },\n\n // Vision pipeline (Phase 2, plan 2026-05-13). Replaces the legacy\n // `/control/{screenshot,annotated-screenshot,element-screenshot,\n // capture-element-images,get-element-images,diagnose-stuck-screen}`\n // and `/ai/media/*` routes. The runner answers these directly; the\n // SDK exposes stubs that return `runner_required` so the route table\n // stays the single source of truth.\n { method: 'POST', path: '/vision/capture', handler: 'visionCapture' },\n { method: 'POST', path: '/vision/annotate', handler: 'visionAnnotate' },\n { method: 'POST', path: '/vision/diff', handler: 'visionDiff' },\n { method: 'POST', path: '/vision/raw', handler: 'visionRaw' },\n // Phase 4 — text-bearing outputs (OCR + VLM caption).\n { method: 'POST', path: '/vision/extract', handler: 'visionExtract' },\n { method: 'POST', path: '/vision/describe', handler: 'visionDescribe' },\n // Phase 6 — declarative analyzers + assertion DSL.\n { method: 'POST', path: '/vision/analyze', handler: 'visionAnalyze' },\n { method: 'POST', path: '/vision/assert', handler: 'visionAssert' },\n { method: 'POST', path: '/vision/baseline', handler: 'visionBaseline' },\n { method: 'GET', path: '/vision/baselines', handler: 'visionBaselinesList' },\n // Frontend → runner mutation signal (Phase 6).\n {\n method: 'POST',\n path: '/vision/mutation-occurred',\n handler: 'visionMutationOccurred',\n },\n {\n method: 'GET',\n path: '/vision/cache/:sha256',\n handler: 'visionCacheStream',\n params: ['sha256'],\n },\n { method: 'GET', path: '/vision/health', handler: 'visionHealth' },\n\n // Change observation (push-based)\n { method: 'GET', path: '/control/changes/since', handler: 'getChangesSince' },\n\n // ── Route aliases ──────────────────────────────────────────────────\n // These map commonly expected paths to existing handlers.\n\n // Design review aliases under /control/ (static before parameterized)\n { method: 'POST', path: '/control/design/snapshot', handler: 'getDesignSnapshot' },\n {\n method: 'POST',\n path: '/control/design/responsive',\n handler: 'getResponsiveSnapshots',\n bodyRequired: true,\n },\n { method: 'POST', path: '/control/design/audit', handler: 'runDesignAudit' },\n {\n method: 'GET',\n path: '/control/design/element/:id/styles',\n handler: 'getElementStyles',\n params: ['id'],\n },\n {\n method: 'POST',\n path: '/control/design/element/:id/state-styles',\n handler: 'getElementStateStyles',\n params: ['id'],\n },\n\n // Annotation aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/annotations', handler: 'getAnnotations' },\n {\n method: 'POST',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotations/export', handler: 'exportAnnotations' },\n { method: 'GET', path: '/control/annotations/coverage', handler: 'getAnnotationCoverage' },\n {\n method: 'POST',\n path: '/control/annotations/import',\n handler: 'importAnnotations',\n bodyRequired: true,\n },\n { method: 'GET', path: '/control/annotation/:id', handler: 'getAnnotation', params: ['id'] },\n {\n method: 'PUT',\n path: '/control/annotation/:id',\n handler: 'setAnnotation',\n params: ['id'],\n bodyRequired: true,\n },\n {\n method: 'DELETE',\n path: '/control/annotation/:id',\n handler: 'deleteAnnotation',\n params: ['id'],\n },\n\n // History/metrics aliases under /control/\n { method: 'GET', path: '/control/action-history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/history', handler: 'getActionHistory' },\n { method: 'GET', path: '/control/metrics', handler: 'getMetrics' },\n { method: 'GET', path: '/control/interaction-metrics', handler: 'getMetrics' },\n {\n method: 'GET',\n path: '/control/element/:id/history',\n handler: 'getElementHistory',\n params: ['id'],\n },\n\n // Intent aliases under /control/ (static before parameterized)\n { method: 'GET', path: '/control/intents', handler: 'listIntents' },\n { method: 'POST', path: '/control/intents', handler: 'registerIntent', bodyRequired: true },\n {\n method: 'POST',\n path: '/control/intent/:name/execute',\n handler: 'executeIntent',\n params: ['name'],\n bodyRequired: true,\n },\n { method: 'DELETE', path: '/control/intent/:name', handler: 'deleteIntent', params: ['name'] },\n\n // AI assert-batch alias (hyphenated form)\n { method: 'POST', path: '/ai/assert-batch', handler: 'aiAssertBatch', bodyRequired: true },\n\n // App-agnostic convenience endpoints\n {\n method: 'POST',\n path: '/control/page/click-by-text',\n handler: 'clickByText',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/click-by-selector',\n handler: 'clickBySelector',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/type-into',\n handler: 'typeInto',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/read-value',\n handler: 'readValue',\n bodyRequired: true,\n },\n {\n method: 'POST',\n path: '/control/page/find-by-text',\n handler: 'findByText',\n bodyRequired: true,\n },\n\n // Tier 3.1 — registry-based element condition polling\n {\n method: 'POST',\n path: '/ai/wait-for-element-condition',\n handler: 'waitForElementByCondition',\n bodyRequired: true,\n },\n\n // Testing-friendliness — route-change wait\n {\n method: 'POST',\n path: '/ai/wait-for-route-change',\n handler: 'waitForRouteChange',\n },\n {\n method: 'POST',\n path: '/ai/wait-for-element',\n handler: 'waitForElementRegistered',\n bodyRequired: true,\n },\n\n // Tier 3.2 — mixed action/wait/snapshot batch\n {\n method: 'POST',\n path: '/control/batch-execute',\n handler: 'controlBatch',\n bodyRequired: true,\n },\n\n // Diagnostics\n { method: 'GET', path: '/diagnostics', handler: 'getDiagnostics' },\n\n // Navigation adapter\n { method: 'GET', path: '/control/page/routes', handler: 'getRoutes' },\n {\n method: 'POST',\n path: '/control/page/navigate-to',\n handler: 'navigateByAdapter',\n bodyRequired: true,\n },\n];\n\n/**\n * Canonical app-agnostic interaction relay command actions.\n *\n * These are the cross-platform \"convenience\" interactions (click/type/read)\n * that the server relays verbatim over the SDK command channel (SSE for web,\n * WebSocket for the runner). The *action string* here is the single source of\n * truth shared by three sites:\n *\n * 1. `relay-handlers.ts` — `relayCommand('<action>', request)` queues it for\n * the connected browser/native tab.\n * 2. `react/commandHandlers.ts` — the browser-side `executeCommand` switch\n * MUST have a matching `case '<action>'`, otherwise the relay hits\n * `default: throw new Error('Unknown command action')` and the runner\n * silently falls back to its own Tauri webview (masking the failure).\n * 3. `native/react/commandHandlers.ts` — the React-Native relay parity case.\n *\n * The drift guard test (`relay-handlers.contract.test.ts`) asserts every entry\n * here resolves to a handler case so the browser executor can never again\n * queue an action it cannot execute. Add new app-agnostic interactions here\n * first, then wire all three sites.\n */\nexport const INTERACTION_RELAY_COMMAND_ACTIONS = [\n 'clickByText',\n 'clickBySelector',\n 'typeInto',\n 'readValue',\n 'findByText',\n] as const;\n\n/**\n * Union of the canonical interaction relay command action strings.\n */\nexport type InteractionRelayCommandAction =\n (typeof INTERACTION_RELAY_COMMAND_ACTIONS)[number];\n\n/**\n * WebSocket message types\n */\nexport type WebSocketMessageType =\n | 'subscribe'\n | 'unsubscribe'\n | 'event'\n | 'snapshot'\n | 'action'\n | 'error';\n\n/**\n * WebSocket message\n */\nexport interface WebSocketMessage<T = unknown> {\n type: WebSocketMessageType;\n channel?: string;\n data?: T;\n error?: string;\n timestamp: number;\n}\n","// @generated from diagnostics/codes.json — do not edit\n/* eslint-disable */\n\n/**\n * Canonical UI Bridge diagnostic code vocabulary + recovery catalog.\n * Generated from `diagnostics/codes.json`. See `scripts/gen-diagnostics.ts`.\n */\n\nexport type UiBridgeErrorCode =\n | \"UB-ACTION-FAILED\"\n | \"UB-ACTION-REJECTED\"\n | \"UB-ACTION-TIMEOUT\"\n | \"UB-AMBIGUOUS-MATCH\"\n | \"UB-ASSERT-CONTRAST\"\n | \"UB-ASSERT-ELEMENT-MISSING\"\n | \"UB-ASSERT-LAYOUT\"\n | \"UB-ASSERT-TEXT-MISMATCH\"\n | \"UB-ASSERT-TIMEOUT\"\n | \"UB-ASSERT-VISIBILITY\"\n | \"UB-ELEM-BLOCKED\"\n | \"UB-ELEM-DISABLED\"\n | \"UB-ELEM-NOT-ENABLED\"\n | \"UB-ELEM-NOT-FOUND\"\n | \"UB-ELEM-NOT-INTERACTABLE\"\n | \"UB-ELEM-NOT-VISIBLE\"\n | \"UB-HEALTH-EMPTY-CONTENT-AREA\"\n | \"UB-HEALTH-EMPTY-TEXT-SIGNAL\"\n | \"UB-HEALTH-ERROR-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOADING-CLASS-SIGNAL\"\n | \"UB-HEALTH-LOADING-TEXT-SIGNAL\"\n | \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\"\n | \"UB-HEALTH-LOW-SPATIAL-COVERAGE\"\n | \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\"\n | \"UB-HEALTH-NO-CONTENT-ELEMENTS\"\n | \"UB-HEALTH-OFF-SCREEN-ELEMENT\"\n | \"UB-HEALTH-SPARSE-CONTENT\"\n | \"UB-HEALTH-ZERO-SIZE-ELEMENT\"\n | \"UB-LOW-CONFIDENCE\"\n | \"UB-MULTIPLE-ELEMENTS\"\n | \"UB-NAVIGATION-ERROR\"\n | \"UB-NET-ERROR\"\n | \"UB-PAGE-LOAD-ERROR\"\n | \"UB-PARSE-ERROR\"\n | \"UB-STALE-ELEMENT\"\n | \"UB-STATE-NOT-REACHED\"\n | \"UB-UNEXPECTED-STATE\"\n | \"UB-UNKNOWN-ERROR\"\n | \"UB-UNSUPPORTED-ACTION\"\n | \"UB-VALIDATION-ERROR\"\n | \"UB-VLM-STRUCTURED-PARSE-FAIL\";\n\n/** All diagnostic codes, in stable sorted order. */\nexport const UI_BRIDGE_ERROR_CODES: readonly UiBridgeErrorCode[] = [\n \"UB-ACTION-FAILED\",\n \"UB-ACTION-REJECTED\",\n \"UB-ACTION-TIMEOUT\",\n \"UB-AMBIGUOUS-MATCH\",\n \"UB-ASSERT-CONTRAST\",\n \"UB-ASSERT-ELEMENT-MISSING\",\n \"UB-ASSERT-LAYOUT\",\n \"UB-ASSERT-TEXT-MISMATCH\",\n \"UB-ASSERT-TIMEOUT\",\n \"UB-ASSERT-VISIBILITY\",\n \"UB-ELEM-BLOCKED\",\n \"UB-ELEM-DISABLED\",\n \"UB-ELEM-NOT-ENABLED\",\n \"UB-ELEM-NOT-FOUND\",\n \"UB-ELEM-NOT-INTERACTABLE\",\n \"UB-ELEM-NOT-VISIBLE\",\n \"UB-HEALTH-EMPTY-CONTENT-AREA\",\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\",\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\",\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\",\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\",\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\",\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\",\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\",\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\",\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\",\n \"UB-HEALTH-SPARSE-CONTENT\",\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\",\n \"UB-LOW-CONFIDENCE\",\n \"UB-MULTIPLE-ELEMENTS\",\n \"UB-NAVIGATION-ERROR\",\n \"UB-NET-ERROR\",\n \"UB-PAGE-LOAD-ERROR\",\n \"UB-PARSE-ERROR\",\n \"UB-STALE-ELEMENT\",\n \"UB-STATE-NOT-REACHED\",\n \"UB-UNEXPECTED-STATE\",\n \"UB-UNKNOWN-ERROR\",\n \"UB-UNSUPPORTED-ACTION\",\n \"UB-VALIDATION-ERROR\",\n \"UB-VLM-STRUCTURED-PARSE-FAIL\",\n] as const;\n\nexport type DiagnosticCategory =\n | 'element'\n | 'action'\n | 'assertion'\n | 'network'\n | 'system';\n\n/**\n * Canonical recovery suggestion shape (D6). One type across every\n * failure surface: ActionFailureDetails, StructuredFailureInfo,\n * ERROR_SUGGESTIONS, getRecoverySuggestions, codes.json.recoveryTemplate.\n */\nexport interface RecoverySuggestion {\n /** Human-readable suggestion. */\n suggestion: string;\n /** Optional machine-executable command. */\n command?: string;\n /** Confidence this will help (0-1). */\n confidence: number;\n /** Whether retrying the original action may help. */\n retryable: boolean;\n /** Order hint (lower = try first). */\n priority?: number;\n}\n\nexport interface DiagnosticEntry {\n description: string;\n commonCauses: string[];\n recoveryTemplate: RecoverySuggestion[];\n category: DiagnosticCategory;\n}\n\nexport const DIAGNOSTICS: Record<UiBridgeErrorCode, DiagnosticEntry> = {\n \"UB-ACTION-FAILED\": {\n description: \"The action could not be completed.\",\n commonCauses: [\n \"The element became non-interactable mid-action\",\n \"A transient runtime error interrupted the action\",\n \"The underlying handler threw\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check if the element is interactable\", confidence: 0.7, retryable: false, priority: 1 },\n { suggestion: \"Wait and retry the action\", command: \"wait 1 second then retry\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-REJECTED\": {\n description: \"The action was rejected before execution (e.g. by a guard, policy, or validation gate).\",\n commonCauses: [\n \"A safety guard blocked the action\",\n \"The action is not permitted in the current state\",\n \"Preconditions for the action were not met\",\n ],\n recoveryTemplate: [\n { suggestion: \"Check whether the action is permitted in the current state\", confidence: 0.6, retryable: false, priority: 1 },\n { suggestion: \"Satisfy the action's preconditions and retry\", confidence: 0.5, retryable: true, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-ACTION-TIMEOUT\": {\n description: \"The action timed out waiting for a condition to be met.\",\n commonCauses: [\n \"The awaited condition can never be satisfied\",\n \"The configured timeout is too short for the operation\",\n \"The page stopped responding\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the timeout duration (the wait gave up after ${waitDurationMs}ms)\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check if the condition '${waitCondition}' can ever be met\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Verify the page is responding\", command: \"check page status\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"action\",\n },\n \"UB-AMBIGUOUS-MATCH\": {\n description: \"Multiple elements match with similar confidence; a single best match could not be chosen.\",\n commonCauses: [\n \"Two or more elements have near-identical text\",\n \"The search criteria are not discriminating enough\",\n \"Section context was not provided\",\n ],\n recoveryTemplate: [\n { suggestion: \"Be more specific about which element you mean\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the section or form name in the description\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ASSERT-CONTRAST\": {\n description: \"A color-contrast (accessibility) assertion failed.\",\n commonCauses: [\n \"Foreground/background contrast is below the required ratio\",\n \"A theme change reduced contrast\",\n \"The element is over a low-contrast background\",\n ],\n recoveryTemplate: [\n { suggestion: \"Adjust the color tokens to meet the required contrast ratio\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-ELEMENT-MISSING\": {\n description: \"An assertion targeted an element that does not exist.\",\n commonCauses: [\n \"The target element was never registered or rendered\",\n \"The element was removed before the assertion ran\",\n \"The selector/id is wrong\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the element id/selector and that it is rendered before asserting\", command: \"wait for element\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-LAYOUT\": {\n description: \"A layout/geometry assertion failed (position, size, alignment, overlap).\",\n commonCauses: [\n \"The element's geometry differs from the expected layout\",\n \"A responsive breakpoint changed the layout\",\n \"The assertion ran before layout settled\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for layout to settle and re-assert\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TEXT-MISMATCH\": {\n description: \"An assertion about element text content failed (exact/contains/regex mismatch).\",\n commonCauses: [\n \"The actual text differs from the expected text\",\n \"The text had not finished updating when asserted\",\n \"Whitespace or casing differences\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-read the element text and compare; relax to a contains/regex match if appropriate\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-TIMEOUT\": {\n description: \"An assertion timed out waiting for its condition.\",\n commonCauses: [\n \"The asserted condition never became true\",\n \"The timeout was shorter than the time the condition needs\",\n \"The page stopped updating\",\n ],\n recoveryTemplate: [\n { suggestion: \"Increase the assertion timeout or verify the condition can be met\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ASSERT-VISIBILITY\": {\n description: \"An assertion about element visibility failed.\",\n commonCauses: [\n \"The element was expected visible but is hidden (or vice versa)\",\n \"The element had not rendered when the assertion ran\",\n \"An overlay changed effective visibility\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the element to reach the expected visibility and re-assert\", command: \"wait for element\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"assertion\",\n },\n \"UB-ELEM-BLOCKED\": {\n description: \"The element is blocked by another element such as a modal, overlay, or popup.\",\n commonCauses: [\n \"A modal dialog is open over the target\",\n \"A toast or notification overlay intercepts pointer events\",\n \"A full-screen loading layer is present\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close the modal or popup\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Dismiss the overlay\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for the blocking element to disappear\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-DISABLED\": {\n description: \"The element is disabled and cannot be interacted with.\",\n commonCauses: [\n \"Required prerequisite fields are not yet filled\",\n \"A guard condition keeps the control disabled\",\n \"An async dependency has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for '${elementId}' to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-ENABLED\": {\n description: \"The element is present and visible but disabled, so it cannot be interacted with.\",\n commonCauses: [\n \"Required form fields have not been filled\",\n \"A prerequisite step in a workflow is incomplete\",\n \"The element is intentionally disabled until an async operation completes\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fill in required fields first\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Complete prerequisite steps in the form\", confidence: 0.7, retryable: false, priority: 2 },\n { suggestion: \"Wait for the element to become enabled\", command: \"wait for element to be enabled\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-FOUND\": {\n description: \"No element matching the target description or selector could be found.\",\n commonCauses: [\n \"The page had not finished loading when the action ran\",\n \"The element is rendered only after a user interaction\",\n \"The description/selector does not match any element on the page\",\n \"The element is in a different route or tab than the active one\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to fully load, then look for '${elementId}' again\", command: \"wait for page to load\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Use a different description for the element '${elementId}'\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Scroll the page to reveal '${elementId}'\", command: \"scroll down\", confidence: 0.6, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-INTERACTABLE\": {\n description: \"The element is visible and enabled but cannot receive the interaction (e.g. covered, animating, or pointer-events:none).\",\n commonCauses: [\n \"A modal or popup is overlaying the element\",\n \"A CSS animation or transition is in progress\",\n \"The element is partially outside the viewport\",\n \"pointer-events:none is set on the element or an ancestor\",\n ],\n recoveryTemplate: [\n { suggestion: \"Close any modal or popup blocking the element\", command: \"click close button\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Scroll the element into the viewport\", command: \"scroll to element\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for animations to complete\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-ELEM-NOT-VISIBLE\": {\n description: \"The element exists in the DOM but is not currently visible.\",\n commonCauses: [\n \"The element is scrolled out of the viewport\",\n \"A loading overlay or modal is covering it\",\n \"A parent has display:none or visibility:hidden\",\n \"The element has zero size or no layout box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Scroll to make '${elementId}' visible\", command: \"scroll to element\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Close any blocking modals or popups\", command: \"click close button\", confidence: 0.8, retryable: true, priority: 2 },\n { suggestion: \"Wait for any loading overlays to disappear\", command: \"wait for loading\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-HEALTH-EMPTY-CONTENT-AREA\": {\n description: \"Page health: the main content area is nearly empty while the sidebar/left region has content.\",\n commonCauses: [\n \"The content panel failed to render\",\n \"A data fetch for the main view errored\",\n \"A routing issue left the content region blank\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the view and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-EMPTY-TEXT-SIGNAL\": {\n description: \"Page health: empty-state text was detected (e.g. \\\"no results\\\", \\\"nothing here\\\").\",\n commonCauses: [\n \"A data set returned no items\",\n \"A filter excluded all results\",\n \"The expected data failed to load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Verify the data source and filters; re-run the health check after data loads\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ERROR-TEXT-SIGNAL\": {\n description: \"Page health: error-indicating text was detected on the page.\",\n commonCauses: [\n \"An application error was rendered to the user\",\n \"A failed request surfaced an error banner\",\n \"An exception boundary rendered a fallback\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the error message and address the underlying failure before retrying\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-CLASS-SIGNAL\": {\n description: \"Page health: a loading/skeleton/spinner CSS class was detected on a visible element.\",\n commonCauses: [\n \"A skeleton or spinner is still showing\",\n \"An async region has not resolved\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the loading indicator to clear and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOADING-TEXT-SIGNAL\": {\n description: \"Page health: loading-indicating text was detected, suggesting the page is not settled.\",\n commonCauses: [\n \"An async load is still in progress\",\n \"The page is stuck in a loading state\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for loading to complete and re-run the health check\", command: \"wait for loading\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-ELEMENT-DIVERSITY\": {\n description: \"Page health: all visible elements are navigation-type, suggesting the content body is missing.\",\n commonCauses: [\n \"Only chrome/navigation rendered; the body did not\",\n \"Content failed to load behind the navigation shell\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-LOW-SPATIAL-COVERAGE\": {\n description: \"Page health: rendered elements occupy a critically/abnormally small fraction of the viewport.\",\n commonCauses: [\n \"The page is still loading content\",\n \"A render error left most of the page blank\",\n \"The main content failed to mount\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for the page to finish loading and re-run the health check\", command: \"wait for page to load\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-MANY-DISABLED-INTERACTIVE\": {\n description: \"Page health: over half of interactive elements are disabled.\",\n commonCauses: [\n \"The page is gated behind an unmet precondition\",\n \"A loading state disabled most controls\",\n \"The user lacks permission for most actions\",\n ],\n recoveryTemplate: [\n { suggestion: \"Satisfy the precondition that enables the controls, then re-run the health check\", confidence: 0.4, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-NO-CONTENT-ELEMENTS\": {\n description: \"Page health: no elements were found in the content region.\",\n commonCauses: [\n \"The content view did not mount\",\n \"An exception prevented content rendering\",\n \"The page is stuck before content load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Reload the page and re-run the health check\", command: \"refresh page\", confidence: 0.6, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-OFF-SCREEN-ELEMENT\": {\n description: \"Page health: a visible element is positioned entirely off-screen.\",\n commonCauses: [\n \"A negative-offset or transform pushed the element out of view\",\n \"A layout bug positioned the element outside the viewport\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's positioning/CSS; this typically indicates a layout defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-SPARSE-CONTENT\": {\n description: \"Page health: the content region has very few elements.\",\n commonCauses: [\n \"Content is only partially rendered\",\n \"A list/grid returned few or no items\",\n \"The page is mid-load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for content to finish loading and re-run the health check\", command: \"wait for loading\", confidence: 0.5, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-HEALTH-ZERO-SIZE-ELEMENT\": {\n description: \"Page health: a visible element has zero width or height.\",\n commonCauses: [\n \"A CSS layout bug collapsed the element\",\n \"Missing content gave the element no intrinsic size\",\n \"A fl/grid sizing rule produced a zero box\",\n ],\n recoveryTemplate: [\n { suggestion: \"Inspect the element's layout/CSS; this typically indicates a rendering defect\", confidence: 0.3, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-LOW-CONFIDENCE\": {\n description: \"The best matching element has confidence below the acceptance threshold.\",\n commonCauses: [\n \"The description does not closely match any element's text\",\n \"The confidence threshold is set higher than the actual best match\",\n \"The element label differs from the human-expected wording\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use the exact text shown on the element\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Try a different description that more closely matches the element\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Lower the confidence threshold if the match is correct\", confidence: 0.7, retryable: true, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-MULTIPLE-ELEMENTS\": {\n description: \"Multiple elements match the description; the target is ambiguous.\",\n commonCauses: [\n \"The description is too generic\",\n \"Repeated list/grid items share the same label\",\n \"Several controls have identical accessible names\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a more specific description\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Include the element position (first, second, etc.)\", confidence: 0.8, retryable: false, priority: 2 },\n { suggestion: \"Use the element ID directly\", confidence: 0.7, retryable: false, priority: 3 },\n ],\n category: \"element\",\n },\n \"UB-NAVIGATION-ERROR\": {\n description: \"Navigation to the target page failed.\",\n commonCauses: [\n \"The target URL is incorrect or unreachable\",\n \"A navigation guard blocked the route\",\n \"The route does not exist\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try the navigation again\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Check if the URL is correct\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-NET-ERROR\": {\n description: \"A network error occurred while performing the action or loading data.\",\n commonCauses: [\n \"The backing request failed or timed out\",\n \"Connectivity was lost\",\n \"A CORS or proxy error blocked the request\",\n ],\n recoveryTemplate: [\n { suggestion: \"Retry the action once connectivity is restored\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PAGE-LOAD-ERROR\": {\n description: \"The page failed to load correctly.\",\n commonCauses: [\n \"A critical resource failed to load\",\n \"The server returned an error response\",\n \"Network connectivity was interrupted during load\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page\", command: \"refresh page\", confidence: 0.8, retryable: true, priority: 1 },\n { suggestion: \"Check network connectivity\", confidence: 0.6, retryable: false, priority: 2 },\n ],\n category: \"network\",\n },\n \"UB-PARSE-ERROR\": {\n description: \"Could not parse the natural language instruction.\",\n commonCauses: [\n \"The instruction is too complex or ambiguous to parse\",\n \"The instruction does not reference a recognizable action\",\n \"The instruction format is unsupported\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a simpler instruction format like \\\"click Submit button\\\"\", confidence: 0.8, retryable: false, priority: 1 },\n { suggestion: \"Use specific element names visible on the page\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-STALE-ELEMENT\": {\n description: \"The element reference is no longer attached to the DOM.\",\n commonCauses: [\n \"The component unmounted between discovery and action\",\n \"A re-render replaced the element node\",\n \"The element was detached by a parent update\",\n ],\n recoveryTemplate: [\n { suggestion: \"Re-find '${elementId}'\", confidence: 0.9, retryable: true, priority: 1 },\n { suggestion: \"Wait for page to stabilize\", command: \"wait 1 second\", confidence: 0.7, retryable: true, priority: 2 },\n ],\n category: \"element\",\n },\n \"UB-STATE-NOT-REACHED\": {\n description: \"The expected post-action state was not reached.\",\n commonCauses: [\n \"The action did not produce the expected state transition\",\n \"An async side-effect has not completed yet\",\n \"The expected state assertion is incorrect\",\n ],\n recoveryTemplate: [\n { suggestion: \"Wait for state to stabilize and re-check\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 1 },\n { suggestion: \"Verify the expected state condition is correct\", confidence: 0.5, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNEXPECTED-STATE\": {\n description: \"The element or page is in an unexpected state.\",\n commonCauses: [\n \"The page state drifted from what the workflow assumed\",\n \"A concurrent update changed the state\",\n \"Stale state was used for the decision\",\n ],\n recoveryTemplate: [\n { suggestion: \"Refresh the page state\", command: \"refresh\", confidence: 0.7, retryable: true, priority: 1 },\n { suggestion: \"Wait for state to stabilize\", command: \"wait 2 seconds\", confidence: 0.6, retryable: true, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-UNKNOWN-ERROR\": {\n description: \"An unknown or uncategorized error occurred.\",\n commonCauses: [\n \"An unexpected runtime exception with no specific code\",\n \"An error path that has not yet been mapped to a stable code\",\n ],\n recoveryTemplate: [\n { suggestion: \"Try a different approach or check the page state\", confidence: 0.5, retryable: false, priority: 1 },\n ],\n category: \"system\",\n },\n \"UB-UNSUPPORTED-ACTION\": {\n description: \"The requested action type is not supported for this element or surface.\",\n commonCauses: [\n \"The action verb is not implemented for the element type\",\n \"A composite action needs to be broken into primitives\",\n ],\n recoveryTemplate: [\n { suggestion: \"Use a different action type\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Break down into simpler actions\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"action\",\n },\n \"UB-VALIDATION-ERROR\": {\n description: \"The parsed action failed validation.\",\n commonCauses: [\n \"Required parameters for the action are missing\",\n \"A parameter value is out of range or the wrong type\",\n \"The instruction format is invalid\",\n ],\n recoveryTemplate: [\n { suggestion: \"Provide required parameters for the action\", confidence: 0.9, retryable: false, priority: 1 },\n { suggestion: \"Check the instruction format\", confidence: 0.7, retryable: false, priority: 2 },\n ],\n category: \"system\",\n },\n \"UB-VLM-STRUCTURED-PARSE-FAIL\": {\n description: \"The VLM Describe response could not be parsed into the closed structured schema; the prose-only response was returned with structured=null.\",\n commonCauses: [\n \"The model returned malformed or non-JSON output in JSON mode\",\n \"The structured payload did not validate against the schema\",\n \"Model-specific JSON-mode unreliability\",\n ],\n recoveryTemplate: [\n { suggestion: \"Fall back to the prose description; retry the describe call once\", confidence: 0.4, retryable: true, priority: 1 },\n ],\n category: \"system\",\n },\n};\n","/**\n * UI Bridge diagnostics — single source of truth.\n *\n * The code vocabulary, recovery catalog, and canonical `RecoverySuggestion`\n * shape (D6) are generated from `diagnostics/codes.json` into\n * `codes.generated.ts`. This barrel re-exports them and folds the previously\n * hand-maintained `ERROR_SUGGESTIONS` map and `getRecoverySuggestions()` switch\n * onto that single source (plan D6 / §5).\n */\n\nexport type {\n UiBridgeErrorCode,\n DiagnosticCategory,\n RecoverySuggestion,\n DiagnosticEntry,\n} from './codes.generated';\nexport { UI_BRIDGE_ERROR_CODES, DIAGNOSTICS } from './codes.generated';\n\nimport type { UiBridgeErrorCode, RecoverySuggestion } from './codes.generated';\nimport { DIAGNOSTICS } from './codes.generated';\n\n/**\n * Recovery suggestions per code, sourced from the generated catalog.\n *\n * Replaces the former hand-maintained `ERROR_SUGGESTIONS` map in\n * `ai/error-context.ts` (D6 — one source). Returns a defensive copy so callers\n * may sort/mutate without corrupting the catalog.\n */\nexport const ERROR_SUGGESTIONS: Record<UiBridgeErrorCode, RecoverySuggestion[]> =\n Object.fromEntries(\n (Object.keys(DIAGNOSTICS) as UiBridgeErrorCode[]).map((code) => [\n code,\n DIAGNOSTICS[code].recoveryTemplate.map((r) => ({ ...r })),\n ])\n ) as Record<UiBridgeErrorCode, RecoverySuggestion[]>;\n\n/**\n * Context map used to render `${key}` placeholders inside recovery templates.\n * Values are coerced to strings at substitution time; `undefined`/`null`\n * entries leave their placeholder untouched (treated as \"unknown key\").\n */\nexport type RecoveryRenderContext = Record<\n string,\n string | number | boolean | null | undefined\n>;\n\nconst PLACEHOLDER_RE = /\\$\\{([^}]+)\\}/g;\n\n/**\n * Substitute `${key}` placeholders in a template string from a context map.\n *\n * - Any `${key}` present (and non-nullish) in `context` is replaced with its\n * stringified value (at minimum `${elementId}` / `${waitDurationMs}`, but\n * any key is supported).\n * - Unknown placeholders (key absent, or value `undefined`/`null`) are left\n * **verbatim** and nothing is logged (per Phase 3 spec).\n */\nfunction renderTemplateString(\n template: string,\n context: RecoveryRenderContext\n): string {\n if (template.indexOf('${') === -1) return template;\n return template.replace(PLACEHOLDER_RE, (whole, key: string) => {\n const value = context[key];\n if (value === undefined || value === null) return whole;\n return String(value);\n });\n}\n\n/**\n * Render a single recovery suggestion's `suggestion` and `command` strings\n * against a failure-context map, returning a fresh object (never mutates the\n * catalog entry).\n */\nfunction renderSuggestion(\n suggestion: RecoverySuggestion,\n context: RecoveryRenderContext\n): RecoverySuggestion {\n const rendered: RecoverySuggestion = {\n ...suggestion,\n suggestion: renderTemplateString(suggestion.suggestion, context),\n };\n if (suggestion.command !== undefined) {\n rendered.command = renderTemplateString(suggestion.command, context);\n }\n return rendered;\n}\n\n/**\n * Generate recovery suggestions for an error code.\n *\n * Replaces the duplicated `getRecoverySuggestions()` switch statements in\n * `server/handlers.ts` and `ui-bridge-server/handlers.ts` (D6 — one source).\n * Unknown codes fall back to the generic `UB-UNKNOWN-ERROR` template.\n *\n * When `context` is supplied, every `${key}` placeholder in each suggestion's\n * `suggestion`/`command` is substituted from it (Phase 3 — sync failure paths\n * pass `${elementId}` / `${waitDurationMs}` / etc.). Unknown placeholders are\n * left untouched. Without `context` the static catalog template is returned\n * (defensive copy).\n */\nexport function getRecoverySuggestions(\n errorCode: UiBridgeErrorCode,\n context?: RecoveryRenderContext\n): RecoverySuggestion[] {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n if (!context) {\n return entry.recoveryTemplate.map((r) => ({ ...r }));\n }\n return entry.recoveryTemplate.map((r) => renderSuggestion(r, context));\n}\n\n/**\n * Error codes for which retrying the original action is recommended.\n * Derived from the catalog: a code is retry-recommended when any of its\n * recovery template entries is `retryable: true`.\n */\nfunction isRetryRecommended(errorCode: UiBridgeErrorCode): boolean {\n const entry = DIAGNOSTICS[errorCode] ?? DIAGNOSTICS['UB-UNKNOWN-ERROR'];\n return entry.recoveryTemplate.some((r) => r.retryable);\n}\n\n/**\n * Structured-failure shape mirror of `core/types.ts` `ActionFailureDetails`.\n * Re-declared structurally here (rather than imported) to keep the\n * diagnostics barrel free of a back-edge into `core`; the field set is the\n * subset every failure surface populates.\n */\nexport interface BuiltActionFailureDetails {\n errorCode: UiBridgeErrorCode;\n message: string;\n elementId?: string;\n suggestedActions: RecoverySuggestion[];\n retryRecommended: boolean;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /** Typed-reason discriminators (Phase 3) — mirror `ActionFailureDetails`. */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n}\n\n/**\n * Map a loosely-typed internal/legacy error code (the historical\n * `error(msg, 'NOT_FOUND')`-style strings used across `handlers.ts` /\n * `relay-handlers.ts`) plus its prose message to a canonical\n * `UiBridgeErrorCode`.\n *\n * Single source for `ui-bridge-server/src/error-mapper.ts` and the\n * `ui-bridge` `server/relay-handlers.ts` `error()` helper (Phase 1). The\n * legacy strings are an internal SDK convention, not a public wire vocabulary\n * (no `legacy:[]` recognition surface — D1); this mapper exists only to\n * convert them at the response boundary so `APIResponse.code` is canonical.\n *\n * Resolution order: explicit code mapping → message heuristic →\n * `UB-UNKNOWN-ERROR`.\n */\nconst INTERNAL_CODE_TO_CANONICAL: Record<string, UiBridgeErrorCode> = {\n NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n ELEMENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n COMPONENT_NOT_FOUND: 'UB-ELEM-NOT-FOUND',\n INVALID_REQUEST: 'UB-VALIDATION-ERROR',\n VALIDATION_ERROR: 'UB-VALIDATION-ERROR',\n NOT_IMPLEMENTED: 'UB-UNSUPPORTED-ACTION',\n RUNNER_REQUIRED: 'UB-ACTION-REJECTED',\n RUNNER_UNAVAILABLE: 'UB-NET-ERROR',\n RUNNER_ERROR: 'UB-NET-ERROR',\n COMMAND_FAILED: 'UB-ACTION-FAILED',\n HEADLESS_SPAWN_UNSUPPORTED_ON_RELAY: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_SPAWN_DISABLED: 'UB-ACTION-REJECTED',\n HEADLESS_PEER_MISSING: 'UB-UNSUPPORTED-ACTION',\n HEADLESS_LAUNCH_FAILED: 'UB-ACTION-FAILED',\n WAIT_ERROR: 'UB-ACTION-TIMEOUT',\n PAGE_HEALTH_ERROR: 'UB-UNKNOWN-ERROR',\n QUERY_ERROR: 'UB-VALIDATION-ERROR',\n CDP_DISABLED: 'UB-ACTION-REJECTED',\n UNAUTHORIZED: 'UB-ACTION-REJECTED',\n INTERNAL_ERROR: 'UB-UNKNOWN-ERROR',\n};\n\nexport function mapInternalErrorCode(\n internalCode?: string,\n message?: string\n): UiBridgeErrorCode {\n if (internalCode) {\n // Already canonical — pass through.\n if ((DIAGNOSTICS as Record<string, unknown>)[internalCode]) {\n return internalCode as UiBridgeErrorCode;\n }\n const mapped = INTERNAL_CODE_TO_CANONICAL[internalCode];\n if (mapped) return mapped;\n // Generic `*_ERROR` convention → categorise by family below, else unknown.\n if (internalCode.endsWith('_ERROR')) {\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n return 'UB-UNKNOWN-ERROR';\n }\n }\n\n const m = (message ?? '').toLowerCase();\n if (m.includes('not found') || m.includes('does not exist'))\n return 'UB-ELEM-NOT-FOUND';\n if (m.includes('not visible') || m.includes('hidden'))\n return 'UB-ELEM-NOT-VISIBLE';\n if (m.includes('disabled')) return 'UB-ELEM-DISABLED';\n if (m.includes('timeout') || m.includes('timed out'))\n return 'UB-ACTION-TIMEOUT';\n if (m.includes('required') || m.includes('invalid'))\n return 'UB-VALIDATION-ERROR';\n if (m.includes('network') || m.includes('disconnected'))\n return 'UB-NET-ERROR';\n\n return 'UB-UNKNOWN-ERROR';\n}\n\n/**\n * Build canonical structured failure details from an error code + prose\n * message. Single source for the `failureDetails` field added to\n * `ComponentActionResponse` / `WorkflowStepResult` in Phase 1 (and reused by\n * the server `createFailureDetails`). `suggestedActions` and\n * `retryRecommended` are both derived from the generated catalog (D6) — no\n * hand-maintained tables.\n */\nexport function buildActionFailureDetails(\n errorCode: UiBridgeErrorCode,\n message: string,\n options: {\n elementId?: string;\n context?: Record<string, unknown>;\n durationMs?: number;\n timeoutMs?: number;\n /**\n * Failure-context map for rendering `${...}` placeholders in the catalog\n * recovery templates (Phase 3). `elementId` is auto-merged in when set.\n */\n renderContext?: RecoveryRenderContext;\n /** Typed-reason discriminators (Phase 3). */\n disabledReason?: 'native' | 'aria' | 'pointer-none';\n visibilityReason?: 'hidden' | 'off-screen' | 'occluded' | 'no-layout';\n staleReason?: 'unmounted' | 'rerendered' | 'detached';\n waitCondition?: string;\n waitTimedOutAfterMs?: number;\n timeoutType?: 'network' | 'navigation' | 'computation';\n } = {}\n): BuiltActionFailureDetails {\n // The element id is always a valid `${elementId}` substitution source even\n // when the caller didn't pass an explicit renderContext.\n const renderContext: RecoveryRenderContext | undefined =\n options.renderContext || options.elementId !== undefined\n ? { elementId: options.elementId, ...options.renderContext }\n : undefined;\n\n return {\n errorCode,\n message,\n elementId: options.elementId,\n suggestedActions: getRecoverySuggestions(errorCode, renderContext),\n retryRecommended: isRetryRecommended(errorCode),\n context: options.context,\n durationMs: options.durationMs,\n timeoutMs: options.timeoutMs,\n disabledReason: options.disabledReason,\n visibilityReason: options.visibilityReason,\n staleReason: options.staleReason,\n waitCondition: options.waitCondition,\n waitTimedOutAfterMs: options.waitTimedOutAfterMs,\n timeoutType: options.timeoutType,\n };\n}\n","/**\n * SVG-safe helpers for reading an element's class string.\n *\n * Background: `Element.className` is typed as `string` on HTMLElement but as\n * `SVGAnimatedString` on SVGElement / MathMLElement. Calling `.split`,\n * `.toLowerCase`, `.trim`, etc. directly on `el.className` throws when the\n * element is an SVG/MathML node. Always route class-string reads through\n * these helpers.\n *\n * Writes (`el.className = '...'`) are fine via the native DOM API and do not\n * need this helper.\n */\n\n/**\n * Safely extract the class string from an element, handling both HTML\n * (string className) and SVG/MathML (SVGAnimatedString).\n *\n * Returns `''` for null/undefined elements or when className is unset.\n */\nexport function classString(el: Element | null | undefined): string {\n if (!el) return '';\n const cn = (el as HTMLElement).className;\n if (typeof cn === 'string') return cn;\n const baseVal = (cn as SVGAnimatedString | undefined)?.baseVal;\n return typeof baseVal === 'string' ? baseVal : '';\n}\n\n/**\n * Convenience: `classString(el)` split on whitespace, empty strings filtered.\n * Prefer `el.classList` when available — only use this when you need the\n * raw token array for string matching (e.g., `.some(c => c.startsWith('btn-'))`).\n */\nexport function classList(el: Element | null | undefined): string[] {\n const s = classString(el).trim();\n return s ? s.split(/\\s+/) : [];\n}\n","/**\n * Element Fingerprint Generation\n *\n * Computes stable fingerprints for DOM elements that enable cross-page element matching\n * and state discovery. Fingerprint hashes are deterministic and match the Python\n * ElementFingerprint schema in qontinui/state_machine/fingerprint_types.py.\n *\n * Fingerprints capture structural and semantic properties that remain stable across\n * page loads and navigation, enabling the state machine to identify states by\n * element composition rather than brittle selectors.\n */\n\nimport type { UIBridgeRegistry } from './registry';\nimport type { RegisteredElement } from './types';\nimport { classString, classList } from './class-name';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Repeat pattern information for list/grid/table items.\n * Matches Python RepeatPattern.to_dict() output.\n */\nexport interface RepeatPatternData {\n type: 'list' | 'grid' | 'table';\n containerSelector: string;\n itemSelector: string;\n index: number;\n totalCount: number;\n}\n\n/**\n * Browser-computed element fingerprint for stable identification.\n * Matches Python ElementFingerprint.to_dict() output (camelCase keys).\n */\nexport interface ElementFingerprintData {\n hash: string;\n structuralPath: string;\n positionZone: string;\n landmarkContext: string;\n landmarkLabel?: string;\n role: string;\n tagName: string;\n accessibleName?: string;\n sizeCategory: string;\n relativePosition: { top: number; left: number };\n isRepeating: boolean;\n repeatPattern?: RepeatPatternData;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ARIA landmark roles */\nconst ARIA_LANDMARKS = new Set([\n 'banner',\n 'complementary',\n 'contentinfo',\n 'form',\n 'main',\n 'navigation',\n 'region',\n 'search',\n]);\n\n/** Tag name to implicit landmark mapping */\nconst IMPLICIT_LANDMARKS: Record<string, string> = {\n NAV: 'navigation',\n MAIN: 'main',\n HEADER: 'banner',\n FOOTER: 'contentinfo',\n ASIDE: 'complementary',\n FORM: 'form',\n SEARCH: 'search',\n};\n\n/** Tag name to implicit ARIA role mapping */\nconst IMPLICIT_ROLES: Record<string, string | ((el: HTMLElement) => string)> = {\n BUTTON: 'button',\n A: (el) => (el.hasAttribute('href') ? 'link' : ''),\n INPUT: (el) => {\n const type = (el as HTMLInputElement).type?.toLowerCase();\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'range') return 'slider';\n if (type === 'submit' || type === 'reset' || type === 'button') return 'button';\n return 'textbox';\n },\n SELECT: (el) => ((el as HTMLSelectElement).multiple ? 'listbox' : 'combobox'),\n TEXTAREA: 'textbox',\n IMG: 'img',\n TABLE: 'table',\n UL: 'list',\n OL: 'list',\n LI: 'listitem',\n H1: 'heading',\n H2: 'heading',\n H3: 'heading',\n H4: 'heading',\n H5: 'heading',\n H6: 'heading',\n DIALOG: 'dialog',\n DETAILS: 'group',\n SUMMARY: 'button',\n PROGRESS: 'progressbar',\n METER: 'meter',\n};\n\n/** Dynamic content patterns to replace with placeholders */\nconst DYNAMIC_PATTERNS = [\n // UUIDs\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n // ISO dates\n /\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/g,\n // Timestamps (10+ digits)\n /\\b\\d{10,13}\\b/g,\n // Standalone numbers (3+ digits, not part of a word)\n /\\b\\d{3,}\\b/g,\n // Common date formats (MM/DD/YYYY, DD.MM.YYYY)\n /\\d{1,2}[/.-]\\d{1,2}[/.-]\\d{2,4}/g,\n // Time patterns\n /\\d{1,2}:\\d{2}(:\\d{2})?\\s*(AM|PM|am|pm)?/g,\n];\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Compute the structural path of an element (tag names only).\n * Walks up from the element to <body>, collecting only tag names.\n * Example: \"main > section > div > button\"\n */\nfunction computeStructuralPath(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.tagName !== 'BODY' && current.tagName !== 'HTML') {\n parts.unshift(current.tagName.toLowerCase());\n current = current.parentElement;\n }\n\n return parts.join(' > ');\n}\n\n/**\n * Determine the position zone of an element based on viewport-relative position.\n */\nfunction computePositionZone(element: HTMLElement): string {\n // Check for modal first (walk up ancestors)\n let ancestor: HTMLElement | null = element;\n while (ancestor) {\n if (\n ancestor.getAttribute('role') === 'dialog' ||\n ancestor.getAttribute('aria-modal') === 'true' ||\n ancestor.tagName === 'DIALOG'\n ) {\n return 'modal';\n }\n ancestor = ancestor.parentElement;\n }\n\n const rect = element.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n if (vw === 0 || vh === 0) return 'main';\n\n const centerY = (rect.top + rect.bottom) / 2 / vh;\n const centerX = (rect.left + rect.right) / 2 / vw;\n\n if (centerY < 0.1) return 'header';\n if (centerY > 0.9) return 'footer';\n if (centerX < 0.2) return 'sidebar-left';\n if (centerX > 0.8) return 'sidebar-right';\n\n return 'main';\n}\n\n/**\n * Get the ARIA role of an element (explicit or implicit).\n */\nfunction computeRole(element: HTMLElement): string {\n const explicit = element.getAttribute('role');\n if (explicit) return explicit;\n\n const implicit = IMPLICIT_ROLES[element.tagName];\n if (typeof implicit === 'function') return implicit(element);\n if (typeof implicit === 'string') return implicit;\n\n return '';\n}\n\n/**\n * Get the accessible name of an element.\n * Priority: aria-label → resolved aria-labelledby → textContent for buttons/links.\n * Dynamic patterns (numbers, dates, UUIDs) are replaced with {…}.\n */\nfunction computeAccessibleName(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return normalizeName(ariaLabel);\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const parts = labelledBy\n .split(/\\s+/)\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (parts.length > 0) return normalizeName(parts.join(' '));\n }\n\n // For buttons, links, headings: use textContent\n const tag = element.tagName;\n if (\n tag === 'BUTTON' ||\n tag === 'A' ||\n tag === 'SUMMARY' ||\n tag.match(/^H[1-6]$/) ||\n element.getAttribute('role') === 'button' ||\n element.getAttribute('role') === 'link' ||\n element.getAttribute('role') === 'tab'\n ) {\n const text = element.textContent?.trim();\n if (text) return normalizeName(text);\n }\n\n // For inputs: use associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n // Check for label[for]\n if (element.id) {\n const label = document.querySelector(`label[for=\"${CSS.escape(element.id)}\"]`);\n if (label?.textContent?.trim()) return normalizeName(label.textContent.trim());\n }\n // Check for wrapping label\n const wrappingLabel = element.closest('label');\n if (wrappingLabel?.textContent?.trim()) return normalizeName(wrappingLabel.textContent.trim());\n // Placeholder as last resort\n const placeholder = element.getAttribute('placeholder');\n if (placeholder) return normalizeName(placeholder);\n }\n\n return undefined;\n}\n\n/**\n * Normalize an accessible name: truncate, replace dynamic patterns.\n */\nfunction normalizeName(name: string): string {\n let normalized = name.trim();\n\n // Replace dynamic patterns with placeholder\n for (const pattern of DYNAMIC_PATTERNS) {\n normalized = normalized.replace(pattern, '{…}');\n }\n\n // Collapse whitespace\n normalized = normalized.replace(/\\s+/g, ' ');\n\n // Truncate to 50 chars\n if (normalized.length > 50) {\n normalized = normalized.slice(0, 50);\n }\n\n return normalized;\n}\n\n/**\n * Compute the size category based on element area relative to viewport.\n */\nfunction computeSizeCategory(element: HTMLElement): string {\n const rect = element.getBoundingClientRect();\n const viewportArea = window.innerWidth * window.innerHeight;\n\n if (viewportArea === 0) return 'medium';\n\n const ratio = (rect.width * rect.height) / viewportArea;\n\n if (ratio < 0.005) return 'icon';\n if (ratio < 0.01) return 'button';\n if (ratio < 0.03) return 'small';\n if (ratio < 0.1) return 'medium';\n if (ratio < 0.3) return 'large';\n if (ratio < 0.6) return 'fullwidth';\n return 'panel';\n}\n\n/**\n * Find the nearest ARIA landmark context by walking up ancestors.\n * Returns { landmark, label } tuple.\n */\nfunction computeLandmarkContext(element: HTMLElement): {\n landmark: string;\n label: string | undefined;\n} {\n let current: HTMLElement | null = element.parentElement;\n\n while (current && current.tagName !== 'BODY' && current.tagName !== 'HTML') {\n // Explicit landmark role\n const role = current.getAttribute('role');\n if (role && ARIA_LANDMARKS.has(role)) {\n return { landmark: role, label: current.getAttribute('aria-label') || undefined };\n }\n\n // Implicit landmark from tag\n const implicitLandmark = IMPLICIT_LANDMARKS[current.tagName];\n if (implicitLandmark) {\n return { landmark: implicitLandmark, label: current.getAttribute('aria-label') || undefined };\n }\n\n current = current.parentElement;\n }\n\n return { landmark: '', label: undefined };\n}\n\n/**\n * Detect if an element is part of a repeating pattern (list, grid, table).\n */\nfunction computeRepeatPattern(element: HTMLElement): RepeatPatternData | undefined {\n const parent = element.parentElement;\n if (!parent) return undefined;\n\n // Check for semantic list/grid/table containers\n const parentRole = parent.getAttribute('role');\n const parentTag = parent.tagName;\n\n let containerType: 'list' | 'grid' | 'table' | undefined;\n\n if (parentRole === 'list' || parentTag === 'UL' || parentTag === 'OL') {\n containerType = 'list';\n } else if (parentRole === 'grid' || parentRole === 'row') {\n containerType = 'grid';\n } else if (parentTag === 'TABLE' || parentTag === 'TBODY' || parentTag === 'THEAD') {\n containerType = 'table';\n }\n\n // Fallback: check if parent has 3+ children with identical tag+class\n if (!containerType) {\n const children = Array.from(parent.children);\n if (children.length >= 3) {\n const signature = (el: Element) => `${el.tagName}|${classString(el)}`;\n const sig = signature(element);\n const matches = children.filter((c) => signature(c) === sig);\n if (matches.length >= 3) {\n containerType = 'list'; // Infer as list\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n }\n\n // Compute index and total\n const siblings = Array.from(parent.children);\n const itemTag = element.tagName;\n const itemClass = classString(element);\n const matchingSiblings = siblings.filter(\n (s) => s.tagName === itemTag && classString(s) === itemClass\n );\n const index = matchingSiblings.indexOf(element);\n\n // Generate selectors\n const containerSelector = generateSimpleSelector(parent);\n const itemClassTokens = classList(element);\n const itemSelector = `${element.tagName.toLowerCase()}${\n itemClassTokens.length > 0 ? '.' + itemClassTokens.map((c) => CSS.escape(c)).join('.') : ''\n }`;\n\n return {\n type: containerType,\n containerSelector,\n itemSelector,\n index: Math.max(0, index),\n totalCount: matchingSiblings.length,\n };\n}\n\n/**\n * Generate a simple CSS selector for an element (for container references only).\n */\nfunction generateSimpleSelector(element: HTMLElement): string {\n if (element.id) return `#${CSS.escape(element.id)}`;\n const testId = element.getAttribute('data-testid');\n if (testId) return `[data-testid=\"${testId}\"]`;\n return element.tagName.toLowerCase();\n}\n\n/**\n * Synchronous hash using FNV-1a.\n * Produces a deterministic 16-char hex string from fingerprint properties.\n *\n * NOTE: The Python backend must use the same algorithm and input format\n * to produce matching hashes. Input format: \"structuralPath|positionZone|role|accessibleName|sizeCategory\"\n */\nfunction computeHashSync(\n structuralPath: string,\n positionZone: string,\n role: string,\n accessibleName: string | undefined,\n sizeCategory: string\n): string {\n const input = `${structuralPath}|${positionZone}|${role}|${accessibleName ?? ''}|${sizeCategory}`;\n\n // FNV-1a 64-bit hash (split into two 32-bit parts for JS)\n let h1 = 0x811c9dc5;\n let h2 = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c * 31;\n h2 = Math.imul(h2, 0x01000193);\n }\n\n const hex1 = (h1 >>> 0).toString(16).padStart(8, '0');\n const hex2 = (h2 >>> 0).toString(16).padStart(8, '0');\n return hex1 + hex2;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compute an element fingerprint from a live DOM element.\n *\n * This is synchronous — uses the sync hash function.\n * For async SHA-256 hashing, use computeElementFingerprintAsync().\n */\nexport function computeElementFingerprint(element: HTMLElement): ElementFingerprintData {\n const structuralPath = computeStructuralPath(element);\n const positionZone = computePositionZone(element);\n const role = computeRole(element);\n const accessibleName = computeAccessibleName(element);\n const sizeCategory = computeSizeCategory(element);\n const { landmark, label: landmarkLabel } = computeLandmarkContext(element);\n const repeatPattern = computeRepeatPattern(element);\n\n const rect = element.getBoundingClientRect();\n const vw = window.innerWidth || 1;\n const vh = window.innerHeight || 1;\n\n const fingerprint: ElementFingerprintData = {\n hash: computeHashSync(structuralPath, positionZone, role, accessibleName, sizeCategory),\n structuralPath,\n positionZone,\n landmarkContext: landmark,\n role,\n tagName: element.tagName.toLowerCase(),\n sizeCategory,\n relativePosition: {\n top: Math.round((rect.top / vh) * 1000) / 1000,\n left: Math.round((rect.left / vw) * 1000) / 1000,\n },\n isRepeating: repeatPattern !== undefined,\n };\n\n if (landmarkLabel) fingerprint.landmarkLabel = landmarkLabel;\n if (accessibleName) fingerprint.accessibleName = accessibleName;\n if (repeatPattern) fingerprint.repeatPattern = repeatPattern;\n\n return fingerprint;\n}\n\n/**\n * Compute fingerprints for all registered elements in the registry.\n * Returns a map keyed by fingerprint hash.\n *\n * Elements that share a fingerprint hash (e.g., identical list items)\n * are deduplicated — only the first is kept.\n */\nexport function computeAllFingerprints(\n registry: UIBridgeRegistry\n): Map<string, ElementFingerprintData> {\n const result = new Map<string, ElementFingerprintData>();\n const elements = registry.getAllElements();\n\n for (const registered of elements) {\n if (!registered.mounted || !registered.element.isConnected) continue;\n\n const fingerprint = computeElementFingerprint(registered.element);\n // First-write wins for duplicate hashes (deduplicates repeating items)\n if (!result.has(fingerprint.hash)) {\n result.set(fingerprint.hash, fingerprint);\n }\n }\n\n return result;\n}\n\n/**\n * Compute fingerprints with element ID mapping.\n * Returns fingerprints map and a mapping from fingerprint hash → element IDs.\n *\n * This is useful for the recording session to track which registered elements\n * correspond to which fingerprints.\n */\nexport function computeFingerprintsWithMapping(registry: UIBridgeRegistry): {\n fingerprints: Map<string, ElementFingerprintData>;\n hashToElementIds: Map<string, string[]>;\n elementIdToHash: Map<string, string>;\n} {\n const fingerprints = new Map<string, ElementFingerprintData>();\n const hashToElementIds = new Map<string, string[]>();\n const elementIdToHash = new Map<string, string>();\n\n const elements = registry.getAllElements();\n\n for (const registered of elements) {\n if (!registered.mounted || !registered.element.isConnected) continue;\n\n const fingerprint = computeElementFingerprint(registered.element);\n\n if (!fingerprints.has(fingerprint.hash)) {\n fingerprints.set(fingerprint.hash, fingerprint);\n }\n\n const ids = hashToElementIds.get(fingerprint.hash) || [];\n ids.push(registered.id);\n hashToElementIds.set(fingerprint.hash, ids);\n elementIdToHash.set(registered.id, fingerprint.hash);\n }\n\n return { fingerprints, hashToElementIds, elementIdToHash };\n}\n\n/**\n * Find the nearest registered element for a DOM element by walking up ancestors.\n * Used by the interaction interceptor to map DOM events to registered elements.\n */\nexport function findNearestRegisteredElement(\n target: HTMLElement,\n registry: UIBridgeRegistry\n): RegisteredElement | undefined {\n let current: HTMLElement | null = target;\n\n while (current && current.tagName !== 'BODY') {\n const registered = registry.findByDOMElement(current);\n if (registered) return registered;\n current = current.parentElement;\n }\n\n return undefined;\n}\n","/**\n * Interaction Interceptor\n *\n * Attaches document-level event listeners to capture user interactions on\n * registered UI Bridge elements. Applies event segmentation (from OpenAdapt)\n * by only capturing interactions on registered elements and coalescing\n * rapid keystroke sequences.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport { findNearestRegisteredElement } from '../core/element-fingerprint';\nimport type { InteractionEvent, InteractionActionType } from './types';\n\nexport interface InteractionInterceptorConfig {\n /** Only capture interactions on registered elements (default: true) */\n filterUnregistered: boolean;\n /** Keystroke coalescing window in ms (default: 100) */\n keystrokeCoalesceMs: number;\n}\n\ntype InteractionCallback = (event: InteractionEvent) => void;\n\n/**\n * Intercepts user interactions on the document and emits structured\n * InteractionEvents for registered elements.\n */\nexport class InteractionInterceptor {\n private registry: UIBridgeRegistry;\n private config: InteractionInterceptorConfig;\n private callback: InteractionCallback;\n private active = false;\n\n // Keystroke coalescing state\n private keystrokeTimer: ReturnType<typeof setTimeout> | null = null;\n private keystrokeBuffer = '';\n private keystrokeTargetId: string | null = null;\n private keystrokeTargetElement: HTMLElement | null = null;\n\n // Bound handlers for cleanup\n private handleClick: (e: MouseEvent) => void;\n private handleInput: (e: Event) => void;\n private handleChange: (e: Event) => void;\n private handleSubmit: (e: Event) => void;\n private handleKeydown: (e: KeyboardEvent) => void;\n\n constructor(\n registry: UIBridgeRegistry,\n callback: InteractionCallback,\n config: Partial<InteractionInterceptorConfig> = {}\n ) {\n this.registry = registry;\n this.callback = callback;\n this.config = {\n filterUnregistered: config.filterUnregistered ?? true,\n keystrokeCoalesceMs: config.keystrokeCoalesceMs ?? 100,\n };\n\n // Bind handlers\n this.handleClick = this.onClick.bind(this);\n this.handleInput = this.onInput.bind(this);\n this.handleChange = this.onChange.bind(this);\n this.handleSubmit = this.onSubmit.bind(this);\n this.handleKeydown = this.onKeydown.bind(this);\n }\n\n start(): void {\n if (this.active) return;\n this.active = true;\n\n // Use capture phase to intercept before application handlers\n document.addEventListener('click', this.handleClick, { capture: true, passive: true });\n document.addEventListener('input', this.handleInput, { capture: true, passive: true });\n document.addEventListener('change', this.handleChange, { capture: true, passive: true });\n document.addEventListener('submit', this.handleSubmit, { capture: true, passive: true });\n document.addEventListener('keydown', this.handleKeydown, { capture: true, passive: true });\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n\n // Flush any pending keystroke buffer\n this.flushKeystrokeBuffer();\n\n document.removeEventListener('click', this.handleClick, { capture: true });\n document.removeEventListener('input', this.handleInput, { capture: true });\n document.removeEventListener('change', this.handleChange, { capture: true });\n document.removeEventListener('submit', this.handleSubmit, { capture: true });\n document.removeEventListener('keydown', this.handleKeydown, { capture: true });\n }\n\n private resolveTarget(\n domTarget: EventTarget | null\n ): { elementId: string; element: HTMLElement } | null {\n if (!(domTarget instanceof HTMLElement)) return null;\n\n const registered = findNearestRegisteredElement(domTarget, this.registry);\n if (!registered && this.config.filterUnregistered) return null;\n if (!registered) return null;\n\n return { elementId: registered.id, element: registered.element };\n }\n\n private emit(\n actionType: InteractionActionType,\n elementId: string,\n element: HTMLElement,\n value?: string\n ): void {\n this.callback({\n timestamp: Date.now(),\n actionType,\n targetElementId: elementId,\n targetElement: element,\n value,\n });\n }\n\n private onClick(e: MouseEvent): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n // Don't emit click for checkboxes/radios — handled by onChange\n const el = target.element;\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) return;\n\n this.emit('click', target.elementId, target.element);\n }\n\n private onInput(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n const el = target.element;\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) return;\n\n // Coalesce keystrokes: buffer input events and flush after a quiet period\n if (this.keystrokeTargetId === target.elementId) {\n // Same target — extend buffer\n this.keystrokeBuffer = el.value;\n } else {\n // Different target — flush previous and start new\n this.flushKeystrokeBuffer();\n this.keystrokeTargetId = target.elementId;\n this.keystrokeTargetElement = target.element;\n this.keystrokeBuffer = el.value;\n }\n\n // Reset coalescing timer\n if (this.keystrokeTimer) clearTimeout(this.keystrokeTimer);\n this.keystrokeTimer = setTimeout(\n () => this.flushKeystrokeBuffer(),\n this.config.keystrokeCoalesceMs\n );\n }\n\n private flushKeystrokeBuffer(): void {\n if (this.keystrokeTimer) {\n clearTimeout(this.keystrokeTimer);\n this.keystrokeTimer = null;\n }\n\n if (this.keystrokeTargetId && this.keystrokeTargetElement && this.keystrokeBuffer) {\n this.emit('type', this.keystrokeTargetId, this.keystrokeTargetElement, this.keystrokeBuffer);\n }\n\n this.keystrokeTargetId = null;\n this.keystrokeTargetElement = null;\n this.keystrokeBuffer = '';\n }\n\n private onChange(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n const el = target.element;\n\n if (el instanceof HTMLSelectElement) {\n this.emit('select', target.elementId, target.element, el.value);\n } else if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox') {\n this.emit(\n el.checked ? 'check' : 'uncheck',\n target.elementId,\n target.element,\n String(el.checked)\n );\n } else if (el.type === 'radio') {\n this.emit('check', target.elementId, target.element, el.value);\n }\n }\n }\n\n private onSubmit(e: Event): void {\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n // Flush any pending keystrokes before submit\n this.flushKeystrokeBuffer();\n\n this.emit('submit', target.elementId, target.element);\n }\n\n private onKeydown(e: KeyboardEvent): void {\n // Only capture Enter (as submit trigger) and Escape (as cancel)\n if (e.key !== 'Enter' && e.key !== 'Escape') return;\n\n const target = this.resolveTarget(e.target);\n if (!target) return;\n\n if (e.key === 'Enter') {\n // Flush keystrokes before Enter\n this.flushKeystrokeBuffer();\n\n // If inside a form, this will trigger submit — don't double-emit\n const form = target.element.closest('form');\n if (form) return;\n\n // Otherwise emit as submit\n this.emit('submit', target.elementId, target.element);\n }\n // Escape is captured but not emitted as an interaction — it's noise\n }\n}\n","/**\n * Recording Session Manager\n *\n * Captures user interactions with before/after fingerprint snapshots,\n * producing a CooccurrenceExport for state machine bootstrapping.\n *\n * Pipeline:\n * 1. User clicks \"Record\" → start() takes initial fingerprint snapshot\n * 2. User interacts with app → InteractionInterceptor captures events\n * 3. For each interaction: before snapshot → wait for DOM settle → after snapshot\n * 4. User clicks \"Stop\" → stop() computes CooccurrenceExport from all captures\n * 5. Export is sent to Python backend for state discovery\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { ChangeObserver } from '../core/change-observer';\nimport {\n computeFingerprintsWithMapping,\n type ElementFingerprintData,\n} from '../core/element-fingerprint';\nimport { InteractionInterceptor } from './interaction-interceptor';\nimport type {\n RecordingSessionConfig,\n RecordingSessionResult,\n RecordingStatus,\n RecordedInteraction,\n VariableCandidate,\n InteractionEvent,\n CooccurrenceExportData,\n TransitionRecordData,\n PresenceMatrixEntryData,\n FingerprintStatsData,\n StateCandidateData,\n} from './types';\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\ninterface CaptureSnapshot {\n id: string;\n timestamp: number;\n url: string;\n title: string;\n fingerprintHashes: string[];\n}\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport class RecordingSessionManager {\n private registry: UIBridgeRegistry;\n private changeObserver: ChangeObserver | null;\n private config: Required<\n Pick<\n RecordingSessionConfig,\n | 'debounceMs'\n | 'maxCaptures'\n | 'filterUnregistered'\n | 'keystrokeCoalesceMs'\n | 'autoSaveIntervalMs'\n >\n > & {\n onAutoSave: RecordingSessionConfig['onAutoSave'];\n };\n\n // Session state\n private sessionId: string | null = null;\n private startTime = 0;\n private active = false;\n private interceptor: InteractionInterceptor | null = null;\n private autoSaveTimer: ReturnType<typeof setInterval> | null = null;\n\n // Collected data\n private captures: CaptureSnapshot[] = [];\n private allFingerprints = new Map<string, ElementFingerprintData>();\n private elementIdToHash = new Map<string, string>();\n private hashToElementIds = new Map<string, string[]>();\n private interactions: RecordedInteraction[] = [];\n private transitions: TransitionRecordData[] = [];\n private variables: VariableCandidate[] = [];\n\n // Snapshot caching\n private lastCaptureTime = 0;\n private lastCaptureId: string | null = null;\n\n // Pending interaction processing (queue to avoid dropping rapid interactions)\n private pendingSettleTimers: Array<{\n timer: ReturnType<typeof setTimeout>;\n unsubscribe?: () => void;\n }> = [];\n\n constructor(\n registry: UIBridgeRegistry,\n changeObserver: ChangeObserver | null = null,\n config: RecordingSessionConfig = {}\n ) {\n this.registry = registry;\n this.changeObserver = changeObserver;\n this.config = {\n debounceMs: config.debounceMs ?? 300,\n maxCaptures: config.maxCaptures ?? 500,\n filterUnregistered: config.filterUnregistered ?? true,\n keystrokeCoalesceMs: config.keystrokeCoalesceMs ?? 100,\n autoSaveIntervalMs: config.autoSaveIntervalMs ?? 30000,\n onAutoSave: config.onAutoSave,\n };\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n start(config?: RecordingSessionConfig): void {\n if (this.active) return;\n\n // Apply config overrides\n if (config) {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n this.sessionId = generateId('session');\n this.startTime = Date.now();\n this.active = true;\n\n // Reset collected data\n this.captures = [];\n this.allFingerprints = new Map();\n this.elementIdToHash = new Map();\n this.hashToElementIds = new Map();\n this.interactions = [];\n this.transitions = [];\n this.variables = [];\n this.lastCaptureTime = 0;\n this.lastCaptureId = null;\n\n // Take initial fingerprint snapshot\n this.takeCapture('initial');\n\n // Start interaction interception\n this.interceptor = new InteractionInterceptor(\n this.registry,\n (event) => this.onInteraction(event),\n {\n filterUnregistered: this.config.filterUnregistered,\n keystrokeCoalesceMs: this.config.keystrokeCoalesceMs,\n }\n );\n this.interceptor.start();\n\n // Start periodic auto-save for crash recovery\n if (this.config.onAutoSave && this.config.autoSaveIntervalMs > 0) {\n this.autoSaveTimer = setInterval(() => {\n if (!this.active) return;\n try {\n const partialExport = this.buildExport();\n this.config.onAutoSave?.(partialExport);\n } catch {\n // Swallow errors in auto-save to avoid disrupting the recording\n }\n }, this.config.autoSaveIntervalMs);\n }\n }\n\n stop(): RecordingSessionResult {\n if (!this.active || !this.sessionId) {\n throw new Error('No active recording session');\n }\n\n // Stop interceptor\n this.interceptor?.stop();\n this.interceptor = null;\n\n // Clear auto-save interval\n if (this.autoSaveTimer !== null) {\n clearInterval(this.autoSaveTimer);\n this.autoSaveTimer = null;\n }\n\n // Cancel all pending settle timers\n for (const pending of this.pendingSettleTimers) {\n clearTimeout(pending.timer);\n pending.unsubscribe?.();\n }\n this.pendingSettleTimers = [];\n\n // Take final snapshot\n this.takeCapture('final');\n\n // Build export\n const exportData = this.buildExport();\n const duration = Date.now() - this.startTime;\n\n const result: RecordingSessionResult = {\n sessionId: this.sessionId,\n duration,\n exportData,\n variables: this.variables,\n interactionCount: this.interactions.length,\n captureCount: this.captures.length,\n };\n\n // Reset\n this.active = false;\n this.sessionId = null;\n\n return result;\n }\n\n getStatus(): RecordingStatus {\n return {\n active: this.active,\n sessionId: this.sessionId ?? undefined,\n duration: this.active ? Date.now() - this.startTime : 0,\n interactionCount: this.interactions.length,\n captureCount: this.captures.length,\n };\n }\n\n // ============================================================================\n // Interaction Handling\n // ============================================================================\n\n private onInteraction(event: InteractionEvent): void {\n if (!this.active) return;\n\n // Get \"before\" capture (use cached if recent)\n const beforeCaptureId = this.getOrTakeBeforeCapture();\n\n // Capture the event and beforeCaptureId in a closure — each interaction\n // gets its own settle timer so rapid sequences don't drop interactions.\n const capturedEvent = event;\n\n this.waitForSettle(() => {\n if (!this.active) return;\n\n // Take \"after\" capture\n const afterCaptureId = this.takeCapture('action');\n\n // Get fingerprint for the target element\n const targetFingerprint = this.elementIdToHash.get(capturedEvent.targetElementId) ?? null;\n\n // Compute appeared/disappeared fingerprints\n const beforeCapture = this.captures.find((c) => c.id === beforeCaptureId);\n const afterCapture = this.captures.find((c) => c.id === afterCaptureId);\n const beforeSet = new Set(beforeCapture?.fingerprintHashes ?? []);\n const afterSet = new Set(afterCapture?.fingerprintHashes ?? []);\n\n const appeared = [...afterSet].filter((h) => !beforeSet.has(h));\n const disappeared = [...beforeSet].filter((h) => !afterSet.has(h));\n\n // Build TransitionRecord\n const transitionRecord: TransitionRecordData = {\n actionId: generateId('action'),\n actionType: capturedEvent.actionType,\n targetFingerprint,\n beforeCaptureId,\n afterCaptureId,\n appearedFingerprints: appeared,\n disappearedFingerprints: disappeared,\n timestamp: capturedEvent.timestamp,\n };\n this.transitions.push(transitionRecord);\n\n // Build RecordedInteraction\n const recorded: RecordedInteraction = {\n id: transitionRecord.actionId,\n timestamp: capturedEvent.timestamp,\n actionType: capturedEvent.actionType,\n targetFingerprint,\n targetElementId: capturedEvent.targetElementId,\n beforeCaptureId,\n afterCaptureId,\n value: capturedEvent.value,\n };\n this.interactions.push(recorded);\n\n // Variable detection\n if (\n capturedEvent.value &&\n (capturedEvent.actionType === 'type' || capturedEvent.actionType === 'select')\n ) {\n this.detectVariable(capturedEvent, targetFingerprint);\n }\n });\n }\n\n private getOrTakeBeforeCapture(): string {\n const now = Date.now();\n // Use cached capture if less than 200ms old\n if (this.lastCaptureId && now - this.lastCaptureTime < 200) {\n return this.lastCaptureId;\n }\n return this.takeCapture('before-action');\n }\n\n /**\n * Wait for DOM to settle, then invoke callback.\n * Each call creates its own independent timer — no shared mutable state.\n */\n private waitForSettle(callback: () => void): void {\n if (this.changeObserver) {\n // Wait for ChangeObserver to report no changes for debounceMs\n let settleTimeout: ReturnType<typeof setTimeout>;\n // eslint-disable-next-line prefer-const -- reassigned on line below via changeObserver.subscribe()\n let unsubscribe: (() => void) | undefined;\n const entry = { timer: settleTimeout!, unsubscribe: undefined as (() => void) | undefined };\n\n const complete = () => {\n unsubscribe?.();\n // Remove from pending list\n const idx = this.pendingSettleTimers.indexOf(entry);\n if (idx >= 0) this.pendingSettleTimers.splice(idx, 1);\n callback();\n };\n\n const resetSettle = () => {\n clearTimeout(settleTimeout);\n settleTimeout = setTimeout(complete, this.config.debounceMs);\n entry.timer = settleTimeout;\n };\n\n unsubscribe = this.changeObserver.subscribe(() => {\n resetSettle();\n });\n entry.unsubscribe = unsubscribe;\n\n this.pendingSettleTimers.push(entry);\n resetSettle();\n } else {\n // Fallback: simple timeout\n const timer = setTimeout(() => {\n const idx = this.pendingSettleTimers.findIndex((e) => e.timer === timer);\n if (idx >= 0) this.pendingSettleTimers.splice(idx, 1);\n callback();\n }, this.config.debounceMs);\n this.pendingSettleTimers.push({ timer });\n }\n }\n\n // ============================================================================\n // Fingerprint Snapshots\n // ============================================================================\n\n private takeCapture(_triggeredBy: string): string {\n if (this.captures.length >= this.config.maxCaptures) {\n // Evict oldest capture that is not referenced by any transition\n const referencedIds = new Set<string>();\n for (const t of this.transitions) {\n referencedIds.add(t.beforeCaptureId);\n referencedIds.add(t.afterCaptureId);\n }\n // Also keep first and most recent captures\n if (this.captures.length > 0) referencedIds.add(this.captures[0].id);\n if (this.captures.length > 1) referencedIds.add(this.captures[this.captures.length - 1].id);\n\n const evictIdx = this.captures.findIndex((c) => !referencedIds.has(c.id));\n if (evictIdx >= 0) {\n this.captures.splice(evictIdx, 1);\n } else if (this.captures.length > 1) {\n // All captures are referenced — evict second-oldest as last resort\n this.captures.splice(1, 1);\n }\n }\n\n const { fingerprints, hashToElementIds, elementIdToHash } = computeFingerprintsWithMapping(\n this.registry\n );\n\n // Merge into global fingerprint map\n for (const [hash, fp] of fingerprints) {\n if (!this.allFingerprints.has(hash)) {\n this.allFingerprints.set(hash, fp);\n }\n }\n\n // Update mappings\n for (const [hash, ids] of hashToElementIds) {\n this.hashToElementIds.set(hash, ids);\n }\n for (const [id, hash] of elementIdToHash) {\n this.elementIdToHash.set(id, hash);\n }\n\n const captureId = generateId('capture');\n const capture: CaptureSnapshot = {\n id: captureId,\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n fingerprintHashes: Array.from(fingerprints.keys()),\n };\n\n this.captures.push(capture);\n this.lastCaptureTime = capture.timestamp;\n this.lastCaptureId = captureId;\n\n return captureId;\n }\n\n // ============================================================================\n // Variable Detection\n // ============================================================================\n\n private detectVariable(event: InteractionEvent, fingerprint: string | null): void {\n if (!fingerprint || !event.value) return;\n\n // Don't add duplicate variables for the same element\n if (this.variables.some((v) => v.fingerprint === fingerprint)) {\n // Update the entered value to the latest\n const existing = this.variables.find((v) => v.fingerprint === fingerprint);\n if (existing) existing.enteredValue = event.value;\n return;\n }\n\n const el = event.targetElement;\n const inputType =\n el instanceof HTMLInputElement\n ? el.type\n : el instanceof HTMLSelectElement\n ? 'select'\n : el instanceof HTMLTextAreaElement\n ? 'textarea'\n : 'text';\n\n // Get label\n const label = this.getElementLabel(el);\n\n this.variables.push({\n fingerprint,\n elementId: event.targetElementId,\n inputType,\n enteredValue: event.value,\n label,\n suggestedParamName: labelToCamelCase(label),\n });\n }\n\n private getElementLabel(el: HTMLElement): string {\n // aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // Associated label element\n if (el.id) {\n const label = document.querySelector(`label[for=\"${CSS.escape(el.id)}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n const wrappingLabel = el.closest('label');\n if (wrappingLabel?.textContent?.trim()) return wrappingLabel.textContent.trim();\n\n // Placeholder\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n if (el.placeholder) return el.placeholder;\n }\n\n // data-testid as fallback\n const testId = el.getAttribute('data-testid');\n if (testId) return testId;\n\n // Name attribute\n const name = el.getAttribute('name');\n if (name) return name;\n\n return 'field';\n }\n\n // ============================================================================\n // Export Building\n // ============================================================================\n\n private buildExport(): CooccurrenceExportData {\n const allFingerprintHashes = Array.from(this.allFingerprints.keys());\n\n // Build fingerprint details\n const fingerprintDetails: Record<string, ElementFingerprintData> = {};\n for (const [hash, fp] of this.allFingerprints) {\n fingerprintDetails[hash] = fp;\n }\n\n // Build presence matrix\n const presenceMatrix: PresenceMatrixEntryData[] = this.captures.map((c) => ({\n captureId: c.id,\n url: c.url,\n fingerprints: c.fingerprintHashes,\n }));\n\n // Build co-occurrence counts\n const cooccurrenceCounts: Record<string, Record<string, number>> = {};\n for (const capture of this.captures) {\n const hashes = capture.fingerprintHashes;\n for (let i = 0; i < hashes.length; i++) {\n for (let j = i + 1; j < hashes.length; j++) {\n const a = hashes[i];\n const b = hashes[j];\n if (!cooccurrenceCounts[a]) cooccurrenceCounts[a] = {};\n if (!cooccurrenceCounts[b]) cooccurrenceCounts[b] = {};\n cooccurrenceCounts[a][b] = (cooccurrenceCounts[a][b] || 0) + 1;\n cooccurrenceCounts[b][a] = (cooccurrenceCounts[b][a] || 0) + 1;\n }\n }\n }\n\n // Build inverted index: fingerprint hash → list of captures containing it\n const hashToCaptureEntries = new Map<string, Array<{ id: string; timestamp: number }>>();\n for (const capture of this.captures) {\n const hashSet = new Set(capture.fingerprintHashes);\n for (const hash of hashSet) {\n let entries = hashToCaptureEntries.get(hash);\n if (!entries) {\n entries = [];\n hashToCaptureEntries.set(hash, entries);\n }\n entries.push({ id: capture.id, timestamp: capture.timestamp });\n }\n }\n\n // Build fingerprint stats using the inverted index (O(F) instead of O(F*C*H))\n const fingerprintStats: Record<string, FingerprintStatsData> = {};\n for (const hash of allFingerprintHashes) {\n const entries = hashToCaptureEntries.get(hash) ?? [];\n let firstSeen = Infinity;\n let lastSeen = 0;\n const captureIds: string[] = [];\n\n for (const entry of entries) {\n captureIds.push(entry.id);\n if (entry.timestamp < firstSeen) firstSeen = entry.timestamp;\n if (entry.timestamp > lastSeen) lastSeen = entry.timestamp;\n }\n\n fingerprintStats[hash] = {\n totalAppearances: captureIds.length,\n captureIds,\n firstSeen: firstSeen === Infinity ? 0 : firstSeen,\n lastSeen,\n };\n }\n\n // Build state candidates: group fingerprints by identical presence signature\n const stateCandidates = this.computeStateCandidates(allFingerprintHashes, hashToCaptureEntries);\n\n return {\n sessionId: this.sessionId!,\n exportedAt: Date.now(),\n allFingerprints: allFingerprintHashes,\n fingerprintDetails,\n presenceMatrix,\n cooccurrenceCounts,\n fingerprintStats,\n transitions: this.transitions,\n stateCandidates,\n };\n }\n\n private computeStateCandidates(\n allHashes: string[],\n hashToCaptureEntries: Map<string, Array<{ id: string; timestamp: number }>>\n ): StateCandidateData[] {\n // Group fingerprints by their presence signature (which captures they appear in)\n const signatureGroups = new Map<string, string[]>();\n\n for (const hash of allHashes) {\n // Build a signature from the inverted index (already computed)\n const entries = hashToCaptureEntries.get(hash) ?? [];\n const captureIds = entries.map((e) => e.id).sort();\n const signature = captureIds.join(',');\n\n const group = signatureGroups.get(signature) || [];\n group.push(hash);\n signatureGroups.set(signature, group);\n }\n\n // Only emit groups with 2+ fingerprints (single elements aren't useful states)\n const candidates: StateCandidateData[] = [];\n for (const [, group] of signatureGroups) {\n if (group.length < 2) continue;\n\n // Determine dominant position zone and landmark\n const zones = group\n .map((h) => this.allFingerprints.get(h)?.positionZone)\n .filter(Boolean) as string[];\n const landmarks = group\n .map((h) => this.allFingerprints.get(h)?.landmarkContext)\n .filter(Boolean) as string[];\n\n candidates.push({\n fingerprints: group.sort(),\n cooccurrenceRate: 1.0, // By definition — identical presence signature\n positionZone: mostFrequent(zones),\n landmarkContext: mostFrequent(landmarks),\n });\n }\n\n return candidates;\n }\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nlet idCounter = 0;\n\nfunction generateId(prefix: string): string {\n idCounter++;\n return `${prefix}-${Date.now()}-${idCounter}`;\n}\n\nfunction labelToCamelCase(label: string): string {\n return (\n label\n .replace(/[^a-zA-Z0-9\\s]/g, '')\n .trim()\n .split(/\\s+/)\n .map((word, i) =>\n i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('') || 'field'\n );\n}\n\nfunction mostFrequent(items: string[]): string | undefined {\n if (items.length === 0) return undefined;\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item, (counts.get(item) || 0) + 1);\n }\n let best = items[0];\n let bestCount = 0;\n for (const [item, count] of counts) {\n if (count > bestCount) {\n best = item;\n bestCount = count;\n }\n }\n return best;\n}\n","/**\n * WebSocket Handler for UI Bridge Server\n *\n * Handles WebSocket connections and message routing.\n */\n\nimport type { UIBridgeServerHandlers } from './types';\nimport type {\n BridgeEvent,\n BridgeEventType,\n WSClientMessage,\n WSServerMessage,\n WSWelcomeMessage,\n WSPongMessage,\n WSSubscribedMessage,\n WSUnsubscribedMessage,\n WSEventMessage,\n WSResponseMessage,\n WSErrorMessage,\n} from '../core';\nimport { RecordingSessionManager } from '../recording/session-manager';\nimport type { CooccurrenceExportData } from '../recording/types';\n\n/**\n * WebSocket-like interface for compatibility\n */\nexport interface WebSocketLike {\n send(data: string): void;\n close(): void;\n readyState: number;\n onmessage?: ((event: { data: string }) => void) | null;\n onclose?: (() => void) | null;\n onerror?: ((error: unknown) => void) | null;\n}\n\n/**\n * Client subscription state\n */\ninterface ClientSubscription {\n events: Set<BridgeEventType>;\n elementIds: Set<string>;\n componentIds: Set<string>;\n}\n\n/**\n * Connected client info\n */\ninterface ConnectedClient {\n id: string;\n ws: WebSocketLike;\n subscription: ClientSubscription;\n connectedAt: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * UI Bridge server version\n */\nconst VERSION = '0.1.0';\n\n/**\n * WebSocket handler for UI Bridge server\n */\nexport class UIBridgeWSHandler {\n private handlers: Partial<UIBridgeServerHandlers>;\n private clients = new Map<string, ConnectedClient>();\n private verbose: boolean;\n private log: (message: string) => void;\n private recordingManager: RecordingSessionManager | null = null;\n private lastAutoSavedExport: CooccurrenceExportData | null = null;\n\n constructor(\n handlers: Partial<UIBridgeServerHandlers>,\n options: {\n verbose?: boolean;\n log?: (message: string) => void;\n /** Registry and change observer for recording session support */\n recording?: {\n registry: import('../core/registry').UIBridgeRegistry;\n changeObserver?: import('../core/change-observer').ChangeObserver;\n };\n } = {}\n ) {\n this.handlers = handlers;\n this.verbose = options.verbose ?? false;\n this.log = options.log ?? console.log;\n\n // Initialize recording support if registry is provided\n if (options.recording) {\n this.recordingManager = new RecordingSessionManager(\n options.recording.registry,\n options.recording.changeObserver ?? null,\n {\n // Wire auto-save to store exports server-side for disconnect recovery\n onAutoSave: (partialExport) => {\n this.lastAutoSavedExport = partialExport;\n },\n }\n );\n }\n }\n\n /**\n * Handle new WebSocket connection.\n *\n * @param preferredId Stable tab/client id supplied by the client (e.g. the\n * persisted `__uiBridge_tabId`, forwarded by the server adapter from the\n * `?tabId=` query param of the upgrade request). When present, the client\n * RESUMES under that id across reconnects instead of being assigned a fresh\n * one — otherwise a tab churns its server-side identity on every reconnect,\n * defeating `?tabId=` command pinning. Falls back to a generated id.\n */\n handleConnection(ws: WebSocketLike, preferredId?: string): string {\n const clientId = preferredId && preferredId.trim() ? preferredId.trim() : generateId();\n\n // Resume: if a prior socket is still registered under this id (stale\n // connection not yet reaped), evict it. The old socket's late `onclose`\n // is neutralised by the ws-identity guard in handleDisconnect below.\n const existing = this.clients.get(clientId);\n if (existing && existing.ws !== ws) {\n try {\n existing.ws.close?.();\n } catch {\n /* best-effort */\n }\n }\n\n const client: ConnectedClient = {\n id: clientId,\n ws,\n subscription: existing?.subscription ?? {\n events: new Set(),\n elementIds: new Set(),\n componentIds: new Set(),\n },\n connectedAt: Date.now(),\n };\n\n this.clients.set(clientId, client);\n\n if (this.verbose) {\n this.log(\n `[WS] Client ${existing ? 'resumed' : 'connected'}: ${clientId}` +\n (preferredId ? ' (client-supplied id)' : '')\n );\n }\n\n // Set up message handler\n ws.onmessage = (event: { data: string }) => {\n this.handleMessage(clientId, event.data);\n };\n\n // Set up close handler. Capture THIS ws so a stale socket's delayed close\n // cannot evict a newer resumed client registered under the same id.\n ws.onclose = () => {\n this.handleDisconnect(clientId, ws);\n };\n\n // Send welcome message\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'welcome',\n timestamp: Date.now(),\n payload: {\n version: VERSION,\n features: {\n renderLog: true,\n control: true,\n debug: true,\n },\n clientId,\n },\n } as WSWelcomeMessage);\n\n return clientId;\n }\n\n /**\n * Handle client disconnect.\n *\n * @param ws When provided, only evict the registered client if it is STILL\n * the same socket. This prevents a stale socket's late close from removing\n * a newer connection that resumed under the same id (see handleConnection).\n */\n handleDisconnect(clientId: string, ws?: WebSocketLike): void {\n if (ws) {\n const current = this.clients.get(clientId);\n if (current && current.ws !== ws) {\n // A newer socket already resumed this id — leave it intact.\n return;\n }\n }\n this.clients.delete(clientId);\n\n if (this.verbose) {\n this.log(`[WS] Client disconnected: ${clientId}`);\n }\n }\n\n /**\n * Handle incoming message\n */\n private async handleMessage(clientId: string, data: string): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n let message: WSClientMessage;\n try {\n message = JSON.parse(data) as WSClientMessage;\n } catch (_error) {\n this.sendError(clientId, undefined, 'PARSE_ERROR', 'Invalid JSON message');\n return;\n }\n\n if (this.verbose) {\n this.log(`[WS] ${clientId} -> ${message.type}`);\n }\n\n try {\n switch (message.type) {\n case 'ping':\n this.handlePing(clientId, message.id);\n break;\n\n case 'subscribe':\n await this.handleSubscribe(clientId, message);\n break;\n\n case 'unsubscribe':\n await this.handleUnsubscribe(clientId, message);\n break;\n\n case 'find':\n await this.handleFind(clientId, message);\n break;\n\n case 'discover':\n // @deprecated Use 'find' instead\n await this.handleFind(clientId, message as unknown as WSClientMessage & { type: 'find' });\n break;\n\n case 'getElement':\n await this.handleGetElement(clientId, message);\n break;\n\n case 'getSnapshot':\n await this.handleGetSnapshot(clientId, message);\n break;\n\n case 'executeAction':\n await this.handleExecuteAction(clientId, message);\n break;\n\n case 'executeComponentAction':\n await this.handleExecuteComponentAction(clientId, message);\n break;\n\n case 'executeWorkflow':\n await this.handleExecuteWorkflow(clientId, message);\n break;\n\n case 'getElementHistory':\n await this.handleGetElementHistory(clientId, message);\n break;\n\n case 'changeEvent': {\n // Push-based change observation: broadcast to all other subscribed clients\n const changePayload = (message as import('../core').WSChangeEventMessage).payload;\n this.broadcastEvent(\n {\n type: 'snapshot:changed',\n timestamp: Date.now(),\n data: changePayload ?? {},\n },\n clientId\n );\n break;\n }\n\n case 'recording:start':\n this.handleRecordingStart(clientId, message);\n break;\n\n case 'recording:stop':\n this.handleRecordingStop(clientId, message);\n break;\n\n case 'recording:status':\n this.handleRecordingStatus(clientId, message);\n break;\n\n case 'recording:autosave':\n this.handleRecordingAutoSave(clientId, message);\n break;\n\n case 'recording:recover':\n this.handleRecordingRecover(clientId, message);\n break;\n\n default:\n this.sendError(\n clientId,\n (message as WSClientMessage).id,\n 'UNKNOWN_MESSAGE',\n `Unknown message type: ${(message as WSClientMessage).type}`\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'HANDLER_ERROR', err.message);\n }\n }\n\n /**\n * Handle ping message\n */\n private handlePing(clientId: string, _requestId: string): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'pong',\n timestamp: Date.now(),\n } as WSPongMessage);\n }\n\n /**\n * Handle subscribe message\n */\n private async handleSubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'subscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events, elementIds, componentIds } = message.payload;\n\n // Add to subscriptions\n if (events?.length) {\n for (const event of events) {\n client.subscription.events.add(event);\n }\n }\n if (elementIds?.length) {\n for (const id of elementIds) {\n client.subscription.elementIds.add(id);\n }\n }\n if (componentIds?.length) {\n for (const id of componentIds) {\n client.subscription.componentIds.add(id);\n }\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'subscribed',\n timestamp: Date.now(),\n payload: {\n events: Array.from(client.subscription.events),\n },\n } as WSSubscribedMessage);\n }\n\n /**\n * Handle unsubscribe message\n */\n private async handleUnsubscribe(\n clientId: string,\n message: WSClientMessage & { type: 'unsubscribe' }\n ): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n const { events } = message.payload;\n\n let removedEvents: BridgeEventType[];\n if (events?.length) {\n removedEvents = events.filter((e: BridgeEventType) => client.subscription.events.has(e));\n for (const event of events) {\n client.subscription.events.delete(event);\n }\n } else {\n removedEvents = Array.from(client.subscription.events);\n client.subscription.events.clear();\n client.subscription.elementIds.clear();\n client.subscription.componentIds.clear();\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'unsubscribed',\n timestamp: Date.now(),\n payload: {\n events: removedEvents,\n },\n } as WSUnsubscribedMessage);\n }\n\n /**\n * Handle find message\n */\n private async handleFind(\n clientId: string,\n message: WSClientMessage & { type: 'find' }\n ): Promise<void> {\n if (!this.handlers.find) {\n this.sendResponse(clientId, message.id, false, undefined, 'find handler not available');\n return;\n }\n const result = await this.handlers.find(message.payload || {});\n\n if (result.success && result.data) {\n this.sendResponse(clientId, message.id, true, { elements: result.data.elements });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getElement message\n */\n private async handleGetElement(\n clientId: string,\n message: WSClientMessage & { type: 'getElement' }\n ): Promise<void> {\n const { elementId } = message.payload;\n if (!this.handlers.getElement) {\n this.sendResponse(clientId, message.id, false, undefined, 'getElement handler not available');\n return;\n }\n const result = await this.handlers.getElement(elementId);\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, { element: result.data });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle getSnapshot message\n */\n private async handleGetSnapshot(\n clientId: string,\n message: WSClientMessage & { type: 'getSnapshot' }\n ): Promise<void> {\n if (!this.handlers.getControlSnapshot) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'getControlSnapshot handler not available'\n );\n return;\n }\n const result = await this.handlers.getControlSnapshot();\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, result.data);\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Handle executeAction message\n */\n private async handleExecuteAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeAction' }\n ): Promise<void> {\n const { elementId, action } = message.payload;\n if (!this.handlers.executeElementAction) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'executeElementAction handler not available'\n );\n return;\n }\n const result = await this.handlers.executeElementAction(elementId, action);\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeComponentAction message\n */\n private async handleExecuteComponentAction(\n clientId: string,\n message: WSClientMessage & { type: 'executeComponentAction' }\n ): Promise<void> {\n const { componentId, action, params } = message.payload;\n if (!this.handlers.executeComponentAction) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'executeComponentAction handler not available'\n );\n return;\n }\n const result = await this.handlers.executeComponentAction(componentId, { action, params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle executeWorkflow message\n */\n private async handleExecuteWorkflow(\n clientId: string,\n message: WSClientMessage & { type: 'executeWorkflow' }\n ): Promise<void> {\n const { workflowId, params } = message.payload;\n\n // Note: Progress streaming would need to be added to the handlers interface\n // For now, we just run the workflow without progress callbacks\n if (!this.handlers.runWorkflow) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'runWorkflow handler not available'\n );\n return;\n }\n const result = await this.handlers.runWorkflow(workflowId, { params });\n\n this.sendResponse(clientId, message.id, result.success, result.data, result.error);\n }\n\n /**\n * Handle getElementHistory message\n */\n private async handleGetElementHistory(\n clientId: string,\n message: WSClientMessage & { type: 'getElementHistory' }\n ): Promise<void> {\n const { elementId, options } = message.payload;\n if (!this.handlers.getElementHistory) {\n this.sendResponse(\n clientId,\n message.id,\n false,\n undefined,\n 'getElementHistory handler not available'\n );\n return;\n }\n const result = await this.handlers.getElementHistory(elementId, options);\n\n if (result.success) {\n this.sendResponse(clientId, message.id, true, { entries: result.data });\n } else {\n this.sendResponse(clientId, message.id, false, undefined, result.error);\n }\n }\n\n /**\n * Broadcast event to all subscribed clients\n * @param excludeClientId - optional client ID to skip (e.g. the sender)\n */\n broadcastEvent(event: BridgeEvent, excludeClientId?: string): void {\n for (const [clientId, client] of this.clients) {\n if (clientId === excludeClientId) continue;\n // Check if client is subscribed to this event type\n if (client.subscription.events.size === 0 || client.subscription.events.has(event.type)) {\n // Check element/component filters if applicable\n const eventData = event.data as { elementId?: string; componentId?: string };\n\n if (\n eventData.elementId &&\n client.subscription.elementIds.size > 0 &&\n !client.subscription.elementIds.has(eventData.elementId)\n ) {\n continue;\n }\n\n if (\n eventData.componentId &&\n client.subscription.componentIds.size > 0 &&\n !client.subscription.componentIds.has(eventData.componentId)\n ) {\n continue;\n }\n\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'event',\n timestamp: Date.now(),\n payload: event,\n } as WSEventMessage);\n }\n }\n }\n\n /**\n * Send message to specific client\n */\n private sendToClient(clientId: string, message: WSServerMessage): void {\n const client = this.clients.get(clientId);\n if (!client || client.ws.readyState !== 1) return;\n\n try {\n client.ws.send(JSON.stringify(message));\n\n if (this.verbose && message.type !== 'pong') {\n this.log(`[WS] ${clientId} <- ${message.type}`);\n }\n } catch (error) {\n console.error(`Failed to send message to ${clientId}:`, error);\n }\n }\n\n /**\n * Send response message\n */\n private sendResponse<T>(\n clientId: string,\n requestId: string,\n success: boolean,\n data?: T,\n error?: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'response',\n timestamp: Date.now(),\n requestId,\n payload: {\n success,\n data,\n error,\n },\n } as WSResponseMessage<T>);\n }\n\n /**\n * Send error message\n */\n private sendError(\n clientId: string,\n requestId: string | undefined,\n code: string,\n message: string\n ): void {\n this.sendToClient(clientId, {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n requestId,\n payload: {\n code,\n message,\n },\n } as WSErrorMessage);\n }\n\n /**\n * Get connected client count\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get all connected client IDs\n */\n get clientIds(): string[] {\n return Array.from(this.clients.keys());\n }\n\n /**\n * Disconnect all clients\n */\n disconnectAll(): void {\n for (const [_clientId, client] of this.clients) {\n try {\n client.ws.close();\n } catch {\n // Ignore close errors\n }\n }\n this.clients.clear();\n }\n\n // ==========================================================================\n // Recording Handlers\n // ==========================================================================\n\n private handleRecordingStart(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendError(\n clientId,\n message.id,\n 'RECORDING_UNAVAILABLE',\n 'Recording not configured — registry not provided'\n );\n return;\n }\n\n try {\n const config = (message as import('../core').WSRecordingStartMessage).payload?.config;\n this.recordingManager.start(config);\n const status = this.recordingManager.getStatus();\n this.sendResponse(clientId, message.id, true, status);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'RECORDING_START_ERROR', err.message);\n }\n }\n\n private handleRecordingStop(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendError(clientId, message.id, 'RECORDING_UNAVAILABLE', 'Recording not configured');\n return;\n }\n\n try {\n const result = this.recordingManager.stop();\n this.sendResponse(clientId, message.id, true, result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'RECORDING_STOP_ERROR', err.message);\n }\n }\n\n private handleRecordingStatus(clientId: string, message: WSClientMessage): void {\n if (!this.recordingManager) {\n this.sendResponse(clientId, message.id, true, {\n active: false,\n duration: 0,\n interactionCount: 0,\n captureCount: 0,\n });\n return;\n }\n\n const status = this.recordingManager.getStatus();\n this.sendResponse(clientId, message.id, true, status);\n }\n\n /**\n * Handle recording:autosave — stores the latest auto-saved export data.\n * Called by the client or internally when the auto-save callback fires.\n */\n private handleRecordingAutoSave(clientId: string, message: WSClientMessage): void {\n try {\n const payload = (\n message as WSClientMessage & { payload?: { exportData?: CooccurrenceExportData } }\n ).payload;\n if (payload?.exportData) {\n this.lastAutoSavedExport = payload.exportData;\n this.sendResponse(clientId, message.id, true, { stored: true });\n } else {\n this.sendError(\n clientId,\n message.id,\n 'AUTOSAVE_INVALID',\n 'Missing exportData in autosave payload'\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.sendError(clientId, message.id, 'AUTOSAVE_ERROR', err.message);\n }\n }\n\n /**\n * Handle recording:recover — returns the last auto-saved export data.\n * Used by clients to recover partial recording data after a disconnect.\n */\n private handleRecordingRecover(clientId: string, message: WSClientMessage): void {\n if (this.lastAutoSavedExport) {\n this.sendResponse(clientId, message.id, true, {\n recovered: true,\n exportData: this.lastAutoSavedExport,\n });\n } else {\n this.sendResponse(clientId, message.id, true, {\n recovered: false,\n exportData: null,\n });\n }\n }\n}\n","/**\n * WebSocket Stream Adapter\n *\n * Thin adapter that connects BrowserEventStream (transport-agnostic event\n * filtering/classification) to UIBridgeWSHandler (WebSocket broadcast).\n *\n * The adapter manages a BrowserEventStream subscription lifecycle that is\n * tied to WebSocket client presence: it subscribes when the first WS client\n * connects and unsubscribes when the last client disconnects.\n *\n * Two usage modes:\n *\n * 1. **Callback mode** (recommended) — returns an `onBrowserEvent` callback\n * to pass to `createHandlers`. The internal BrowserEventStream inside\n * handlers.ts must have a default subscription (added when onBrowserEvent\n * is provided). The adapter forwards classified BridgeEvents to broadcast.\n *\n * 2. **Direct mode** — accepts an external BrowserEventStream and manages\n * subscriptions directly. Useful for custom server setups.\n */\n\nimport type { BridgeEvent } from '../core';\nimport type {\n BrowserEventStream,\n BrowserEventStreamMessage,\n StreamSubscription,\n} from '../debug/ws-streaming';\nimport type { UIBridgeWSHandler } from './websocket-handler';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WSStreamAdapterConfig {\n /** Minimum severity to forward (default: 'warning') */\n minSeverity?: 'crash' | 'error' | 'warning' | 'noise';\n /** Enable fingerprint-based deduplication (default: true) */\n deduplicate?: boolean;\n /** Optional log function for debug output */\n log?: (message: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Callback-mode adapter (works with internal BrowserEventStream in handlers)\n// ---------------------------------------------------------------------------\n\n/**\n * Create an `onBrowserEvent` callback that forwards BridgeEvents to a\n * UIBridgeWSHandler's broadcastEvent method.\n *\n * Pass the returned callback as `config.onBrowserEvent` when calling\n * `createHandlers()`. The internal BrowserEventStream in handlers.ts will\n * auto-create a default subscription when `onBrowserEvent` is provided,\n * so classified events flow through to this callback automatically.\n *\n * @example\n * ```ts\n * const server = new StandaloneServer(handlers, { websocket: true });\n * // After server is created, wire the adapter:\n * const broadcast = createWSStreamBroadcast(server.getWSHandler()!);\n *\n * // Or pass during handler creation:\n * const handlers = createHandlers(registry, executor, {\n * onBrowserEvent: createWSStreamBroadcast(wsHandler),\n * });\n * ```\n */\nexport function createWSStreamBroadcast(\n wsHandler: UIBridgeWSHandler,\n config?: Pick<WSStreamAdapterConfig, 'log'>\n): (event: BridgeEvent) => void {\n const log = config?.log;\n\n return (event: BridgeEvent) => {\n if (wsHandler.clientCount === 0) {\n return; // No clients connected — skip serialization overhead\n }\n\n if (log) {\n log(`[ws-stream] Broadcasting ${event.type} to ${wsHandler.clientCount} client(s)`);\n }\n\n wsHandler.broadcastEvent(event);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Direct-mode adapter (manages subscriptions on an external stream)\n// ---------------------------------------------------------------------------\n\n/**\n * Full adapter that owns a subscription on an external BrowserEventStream\n * and forwards matching events to a broadcast function.\n *\n * Manages subscription lifecycle: subscribes on `attach()`, unsubscribes\n * on `detach()`. Use `notifyClientChange()` to auto-manage based on\n * connected WS client count.\n *\n * @example\n * ```ts\n * const stream = new BrowserEventStream();\n * const adapter = new WSStreamAdapter(stream, {\n * broadcast: (event) => wsHandler.broadcastEvent(event),\n * minSeverity: 'warning',\n * });\n * adapter.attach();\n *\n * // When a WS client connects/disconnects:\n * adapter.notifyClientChange(wsHandler.clientCount);\n * ```\n */\nexport class WSStreamAdapter {\n private stream: BrowserEventStream;\n private broadcast: (event: BridgeEvent) => void;\n private subscription: StreamSubscription | null = null;\n private config: Required<Pick<WSStreamAdapterConfig, 'minSeverity' | 'deduplicate'>>;\n private log?: (message: string) => void;\n\n constructor(\n stream: BrowserEventStream,\n options: {\n broadcast: (event: BridgeEvent) => void;\n } & WSStreamAdapterConfig\n ) {\n this.stream = stream;\n this.broadcast = options.broadcast;\n this.config = {\n minSeverity: options.minSeverity ?? 'warning',\n deduplicate: options.deduplicate ?? true,\n };\n this.log = options.log;\n }\n\n /**\n * Create a subscription on the stream. Safe to call multiple times\n * (no-op if already subscribed).\n */\n attach(): StreamSubscription {\n if (this.subscription) {\n return this.subscription;\n }\n\n this.subscription = this.stream.subscribe({\n minSeverity: this.config.minSeverity,\n deduplicate: this.config.deduplicate,\n });\n\n if (this.log) {\n this.log(\n `[ws-stream] Attached subscription ${this.subscription.id} ` +\n `(minSeverity=${this.config.minSeverity}, deduplicate=${this.config.deduplicate})`\n );\n }\n\n return this.subscription;\n }\n\n /**\n * Remove the subscription from the stream. Safe to call multiple times\n * (no-op if not subscribed).\n */\n detach(): void {\n if (!this.subscription) {\n return;\n }\n\n const id = this.subscription.id;\n this.stream.unsubscribe(id);\n this.subscription = null;\n\n if (this.log) {\n this.log(`[ws-stream] Detached subscription ${id}`);\n }\n }\n\n /**\n * Update subscription based on WS client count.\n * Subscribes when the first client connects, unsubscribes when the last\n * client disconnects.\n */\n notifyClientChange(clientCount: number): void {\n if (clientCount > 0 && !this.subscription) {\n this.attach();\n } else if (clientCount === 0 && this.subscription) {\n this.detach();\n }\n }\n\n /**\n * Process a raw browser event through the stream and broadcast any\n * messages that pass subscription filters.\n *\n * Call this from the capture's onEvent callback when using direct mode.\n */\n processAndBroadcast(event: import('../debug/browser-capture-types').AnyCapturedEvent): void {\n if (!this.subscription) {\n return; // Not subscribed — nothing to do\n }\n\n const messages = this.stream.processEvent(event);\n if (messages.size === 0) {\n return;\n }\n\n // Forward each matching message as a BridgeEvent\n for (const [_subId, message] of messages) {\n this.broadcast(toBridgeEvent(message));\n }\n }\n\n /** Whether the adapter currently has an active subscription */\n get isAttached(): boolean {\n return this.subscription !== null;\n }\n\n /** The current subscription ID, or null */\n get subscriptionId(): string | null {\n return this.subscription?.id ?? null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a BrowserEventStreamMessage to a BridgeEvent for WS broadcast.\n */\nfunction toBridgeEvent(message: BrowserEventStreamMessage): BridgeEvent {\n const eventType =\n message.severity === 'crash'\n ? 'browser:crash'\n : message.severity === 'error'\n ? 'browser:error'\n : 'browser:warning';\n\n return {\n type: eventType,\n timestamp: Date.now(),\n data: {\n event: message.event,\n severity: message.severity,\n reason: message.reason,\n fingerprint: message.fingerprint,\n ...(message.sourceLocation !== undefined ? { sourceLocation: message.sourceLocation } : {}),\n },\n };\n}\n","/**\n * SSE (Server-Sent Events) Handler for UI Bridge\n *\n * Streams real-time bridge events to connected clients via SSE.\n * Each event is a JSON-encoded BridgeEvent with optional type filtering.\n *\n * Usage:\n * GET /control/events/stream?types=element:stateChanged,action:completed\n *\n * Event format:\n * event: <BridgeEventType>\n * data: <JSON BridgeEvent>\n * id: <sequence number>\n *\n * Special events:\n * event: heartbeat (every 15s to keep connection alive)\n * event: connected (sent on initial connection)\n */\n\nimport type { BridgeEvent, BridgeEventType } from '../core';\n\n/**\n * A connected SSE client\n */\ninterface SSEClient {\n id: string;\n /** Write a raw string to the response stream */\n write: (data: string) => boolean;\n /** Close the connection */\n close: () => void;\n /** Event type filter (empty = all events) */\n typeFilter: Set<BridgeEventType>;\n /** Element ID filter (empty = all elements) */\n elementFilter: Set<string>;\n /** Connected timestamp */\n connectedAt: number;\n}\n\n/**\n * SSE Manager — manages SSE client connections and broadcasts events\n */\nexport class SSEManager {\n private clients = new Map<string, SSEClient>();\n private sequence = 0;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n // Start heartbeat to keep connections alive\n this.heartbeatInterval = setInterval(() => {\n this.sendHeartbeat();\n }, 15_000);\n }\n\n /**\n * Register a new SSE client connection.\n *\n * @param write - Function to write raw SSE data to the response\n * @param close - Function to close the connection\n * @param typeFilter - Optional comma-separated event types to filter\n * @param elementFilter - Optional comma-separated element IDs to filter\n * @returns Client ID (for cleanup on disconnect)\n */\n addClient(\n write: (data: string) => boolean,\n close: () => void,\n typeFilter?: string,\n elementFilter?: string\n ): string {\n const id = `sse-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n const types = new Set<BridgeEventType>();\n if (typeFilter) {\n for (const t of typeFilter.split(',')) {\n const trimmed = t.trim();\n if (trimmed) types.add(trimmed as BridgeEventType);\n }\n }\n\n const elements = new Set<string>();\n if (elementFilter) {\n for (const e of elementFilter.split(',')) {\n const trimmed = e.trim();\n if (trimmed) elements.add(trimmed);\n }\n }\n\n const client: SSEClient = {\n id,\n write,\n close,\n typeFilter: types,\n elementFilter: elements,\n connectedAt: Date.now(),\n };\n\n this.clients.set(id, client);\n\n // Send connected event\n this.sendToClient(client, 'connected', {\n clientId: id,\n timestamp: Date.now(),\n filters: {\n types: types.size > 0 ? Array.from(types) : 'all',\n elements: elements.size > 0 ? Array.from(elements) : 'all',\n },\n });\n\n return id;\n }\n\n /**\n * Remove a client (called on disconnect)\n */\n removeClient(id: string): void {\n this.clients.delete(id);\n }\n\n /**\n * Broadcast a BridgeEvent to all matching SSE clients.\n * Call this from the registry's onEvent callback.\n */\n broadcast(event: BridgeEvent): void {\n if (this.clients.size === 0) return;\n\n const eventData = event.data as { elementId?: string; id?: string } | undefined;\n const elementId = eventData?.elementId || eventData?.id;\n\n for (const client of this.clients.values()) {\n // Type filter\n if (client.typeFilter.size > 0 && !client.typeFilter.has(event.type)) {\n continue;\n }\n\n // Element filter\n if (client.elementFilter.size > 0 && elementId && !client.elementFilter.has(elementId)) {\n continue;\n }\n\n this.sendToClient(client, event.type, event);\n }\n }\n\n /**\n * Number of connected clients\n */\n get clientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Dispose — stop heartbeat and close all connections\n */\n dispose(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n for (const client of this.clients.values()) {\n try {\n client.close();\n } catch {\n // Ignore close errors\n }\n }\n this.clients.clear();\n }\n\n // ---- Private ----\n\n private sendToClient(client: SSEClient, eventType: string, data: unknown): void {\n const id = ++this.sequence;\n const payload = `event: ${eventType}\\ndata: ${JSON.stringify(data)}\\nid: ${id}\\n\\n`;\n try {\n client.write(payload);\n } catch {\n // Client disconnected — remove it\n this.clients.delete(client.id);\n }\n }\n\n private sendHeartbeat(): void {\n const payload = `event: heartbeat\\ndata: ${JSON.stringify({ timestamp: Date.now(), clients: this.clients.size })}\\n\\n`;\n const failed: string[] = [];\n for (const client of this.clients.values()) {\n try {\n client.write(payload);\n } catch {\n failed.push(client.id);\n }\n }\n for (const id of failed) {\n this.clients.delete(id);\n }\n }\n}\n","/**\n * Standalone Server\n *\n * Standalone HTTP server for UI Bridge that can run independently.\n * Supports both HTTP and WebSocket connections.\n */\n\nimport type {\n UIBridgeServerConfig,\n UIBridgeServerHandlers,\n APIResponse,\n WebSocketMessage,\n} from './types';\nimport { UI_BRIDGE_ROUTES } from './types';\nimport { mapInternalErrorCode } from '../diagnostics';\nimport { UIBridgeWSHandler, type WebSocketLike } from './websocket-handler';\nimport { createWSStreamBroadcast } from './ws-stream-adapter';\nimport { SSEManager } from './sse-handler';\nimport type { BridgeEvent } from '../core';\n\n/**\n * Standalone server configuration\n */\nexport interface StandaloneServerConfig extends UIBridgeServerConfig {\n /** Host to bind to */\n host?: string;\n /** Port to listen on */\n port?: number;\n /** Enable WebSocket support */\n websocket?: boolean;\n /** WebSocket port (defaults to port) */\n websocketPort?: number;\n /** Logging function */\n log?: (message: string) => void;\n /** Enable recording session support — pass the registry and optional changeObserver */\n recording?: {\n registry: import('../core/registry').UIBridgeRegistry;\n changeObserver?: import('../core/change-observer').ChangeObserver;\n };\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n> = {\n host: 'localhost',\n port: 9876,\n websocket: false,\n websocketPort: 9876,\n log: console.log,\n};\n\n/**\n * Wrap error in API format\n */\nfunction wrapError(error: Error | string, code?: string): APIResponse<never> {\n const message = typeof error === 'string' ? error : error.message;\n return {\n success: false,\n error: message,\n code: mapInternalErrorCode(code, message),\n timestamp: Date.now(),\n };\n}\n\n/**\n * Simple HTTP server implementation using Node.js built-in http module\n * with optional WebSocket support.\n */\nexport class StandaloneServer {\n private server: import('http').Server | null = null;\n private wsServer: unknown = null; // WebSocket.Server from 'ws' package\n private config: Required<\n Pick<StandaloneServerConfig, 'host' | 'port' | 'websocket' | 'websocketPort' | 'log'>\n > &\n StandaloneServerConfig;\n private handlers: Partial<UIBridgeServerHandlers>;\n private wsHandler: UIBridgeWSHandler | null = null;\n private wsConnections: Set<WebSocketLike> = new Set();\n private sseManager: SSEManager;\n\n constructor(handlers: Partial<UIBridgeServerHandlers>, config: StandaloneServerConfig = {}) {\n this.handlers = handlers;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.sseManager = new SSEManager();\n\n // Create WebSocket handler if enabled\n if (this.config.websocket) {\n this.wsHandler = new UIBridgeWSHandler(handlers as UIBridgeServerHandlers, {\n verbose: true,\n log: this.config.log,\n recording: this.config.recording,\n });\n }\n }\n\n /**\n * Get enabled capabilities based on handlers\n */\n private getCapabilities(): string[] {\n return [\n 'elements',\n 'components',\n 'discovery',\n 'navigation',\n 'ai',\n 'change_tracking',\n 'idle_detection',\n 'network',\n 'forms',\n 'design',\n 'debug',\n 'events',\n 'annotations',\n 'state_management',\n 'clipboard',\n 'undo_redo',\n 'recovery',\n 'intents',\n ];\n }\n\n /**\n * Start the server\n */\n async start(): Promise<void> {\n const http = await import('http');\n\n this.server = http.createServer(async (req, res) => {\n await this.handleRequest(req, res);\n });\n\n // Start WebSocket server if enabled\n if (this.config.websocket && this.wsHandler) {\n await this.startWebSocketServer();\n }\n\n return new Promise((resolve, reject) => {\n this.server!.listen(this.config.port, this.config.host, () => {\n this.config.log(\n `UI Bridge server listening on http://${this.config.host}:${this.config.port}`\n );\n if (this.config.websocket) {\n const wsPort = this.config.websocketPort || this.config.port;\n this.config.log(\n `UI Bridge WebSocket server listening on ws://${this.config.host}:${wsPort}`\n );\n }\n resolve();\n });\n\n this.server!.on('error', reject);\n });\n }\n\n /**\n * Start WebSocket server\n */\n private async startWebSocketServer(): Promise<void> {\n try {\n // Dynamically import ws package\n const { WebSocketServer } = await import('ws');\n\n const wsPort = this.config.websocketPort || this.config.port;\n const useSamePort = wsPort === this.config.port;\n\n if (useSamePort && this.server) {\n // Attach to same HTTP server (upgrade handling)\n this.wsServer = new WebSocketServer({ server: this.server });\n } else {\n // Create separate WebSocket server\n this.wsServer = new WebSocketServer({\n host: this.config.host,\n port: wsPort,\n });\n }\n\n const wss = this.wsServer as {\n on(\n event: 'connection',\n callback: (ws: WebSocketLike, request?: { url?: string }) => void\n ): void;\n on(event: 'error', callback: (error: Error) => void): void;\n close(): void;\n };\n\n wss.on('connection', (ws, request) => {\n this.wsConnections.add(ws);\n // Forward the persisted tab id (?tabId=) so the client resumes its\n // server-side identity across reconnects instead of churning ids.\n let preferredId: string | undefined;\n const rawUrl = request?.url;\n if (rawUrl) {\n try {\n // request.url is path-relative (e.g. \"/?tabId=...\"); base is arbitrary.\n preferredId = new URL(rawUrl, 'http://localhost').searchParams.get('tabId') ?? undefined;\n } catch {\n /* malformed url — fall back to generated id */\n }\n }\n this.wsHandler!.handleConnection(ws, preferredId);\n\n ws.onclose = () => {\n this.wsConnections.delete(ws);\n };\n });\n\n wss.on('error', (error) => {\n this.config.log(`WebSocket server error: ${error.message}`);\n });\n } catch (_error) {\n // ws package not installed - WebSocket support disabled\n this.config.log(\n 'Warning: WebSocket support requires the \"ws\" package. Install it with: npm install ws'\n );\n this.wsHandler = null;\n }\n }\n\n /**\n * Stop the server\n */\n async stop(): Promise<void> {\n // Close WebSocket handler\n if (this.wsHandler) {\n this.wsHandler.disconnectAll();\n }\n\n // Close WebSocket server\n if (this.wsServer) {\n const wss = this.wsServer as { close(): void };\n wss.close();\n this.wsServer = null;\n }\n\n // Close WebSocket connections\n for (const ws of this.wsConnections) {\n ws.close();\n }\n this.wsConnections.clear();\n\n // Close SSE manager\n this.sseManager.dispose();\n\n return new Promise((resolve, reject) => {\n if (!this.server) {\n resolve();\n return;\n }\n\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n /**\n * Handle an HTTP request\n */\n private async handleRequest(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse\n ): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const method = req.method || 'GET';\n const basePath = this.config.basePath || '/ui-bridge';\n\n // Add CORS headers\n if (this.config.cors) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n\n // Handle preflight\n if (method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Health check (also served at /status)\n if (url.pathname === '/health' || url.pathname === '/status') {\n const healthResponse: Record<string, unknown> = { status: 'ok', timestamp: Date.now() };\n\n // Include UI Bridge metadata for app discovery\n if (this.config.appInfo) {\n const uiBridge: Record<string, unknown> = {\n version: '0.3.0',\n ...this.config.appInfo,\n capabilities: this.getCapabilities(),\n };\n\n // Try to get element/component counts from handlers\n try {\n const snapshotResult = await this.handlers.getControlSnapshot?.();\n if (snapshotResult?.success && snapshotResult.data) {\n const data = snapshotResult.data as {\n elements?: unknown[];\n components?: unknown[];\n };\n uiBridge.elementCount = data.elements?.length ?? 0;\n uiBridge.componentCount = data.components?.length ?? 0;\n }\n } catch {\n // Ignore - counts are optional\n }\n\n healthResponse.uiBridge = uiBridge;\n }\n\n this.sendJSON(res, healthResponse);\n return;\n }\n\n // Remove base path\n let path = url.pathname;\n if (path.startsWith(basePath)) {\n path = path.slice(basePath.length) || '/';\n }\n\n // SSE streaming endpoint — handled before normal routing\n if (path === '/control/events/stream' && method === 'GET') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const types = url.searchParams.get('types') || undefined;\n const elements = url.searchParams.get('elements') || undefined;\n\n const clientId = this.sseManager.addClient(\n (data: string) => {\n res.write(data);\n return true;\n },\n () => {\n if (!res.writableEnded) res.end();\n },\n types,\n elements\n );\n\n req.on('close', () => {\n this.sseManager.removeClient(clientId);\n });\n return;\n }\n\n // Change observation SSE stream — filters to snapshot:changed events only\n if (path === '/control/changes/stream' && method === 'GET') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n\n const clientId = this.sseManager.addClient(\n (data: string) => {\n res.write(data);\n return true;\n },\n () => {\n if (!res.writableEnded) res.end();\n },\n 'snapshot:changed'\n );\n\n req.on('close', () => {\n this.sseManager.removeClient(clientId);\n });\n return;\n }\n\n // Find matching route\n const route = this.findRoute(path, method);\n if (!route) {\n this.sendJSON(res, wrapError('Not found', 'NOT_FOUND'), 404);\n return;\n }\n\n try {\n // Parse body for POST/PUT/PATCH requests or when body is required\n let body: unknown = {};\n if (method === 'POST' || method === 'PUT' || method === 'PATCH' || route.bodyRequired) {\n body = await this.parseBody(req);\n }\n\n // Extract params\n const params = this.extractParams(path, route.path);\n\n // Get handler\n const handlerName = route.handler as keyof UIBridgeServerHandlers;\n const handler = this.handlers[handlerName];\n\n if (!handler) {\n this.sendJSON(res, wrapError('Not implemented', 'NOT_IMPLEMENTED'), 501);\n return;\n }\n\n // Build arguments\n const args: unknown[] = [];\n\n if (route.params) {\n for (const param of route.params) {\n args.push(params[param]);\n }\n }\n\n // Per-user tab scoping (§4.2): mirror the Next.js / Express\n // adapters' X-Caller-User-Id sniff so the trusted-identity-bound\n // `context` reaches every relay-dispatching handler.\n const headerCallerUserId =\n (typeof req.headers['x-caller-user-id'] === 'string'\n ? (req.headers['x-caller-user-id'] as string)\n : undefined) ?? undefined;\n\n if (route.bodyRequired) {\n if (\n headerCallerUserId &&\n body !== null &&\n typeof body === 'object' &&\n !Array.isArray(body)\n ) {\n body = { ...(body as Record<string, unknown>), __callerUserId: headerCallerUserId };\n }\n args.push(body);\n }\n\n if (method === 'GET') {\n const query = Object.fromEntries(url.searchParams);\n if (Object.keys(query).length > 0) {\n args.push(query);\n }\n }\n\n // Per-user tab scoping (§4.2) — trailing context arg. Adapter\n // always supplies it so zero-arg / id-only handlers still enforce\n // ownership.\n args.push({ callerUserId: headerCallerUserId });\n\n // Call handler\n const result = await (handler as (...args: unknown[]) => Promise<APIResponse<unknown>>)(\n ...args\n );\n this.sendJSON(res, result);\n } catch (error) {\n this.config.log(`Error handling ${method} ${path}: ${error}`);\n this.sendJSON(res, wrapError(error as Error, 'INTERNAL_ERROR'), 500);\n }\n }\n\n /**\n * Find a matching route\n */\n private findRoute(path: string, method: string): (typeof UI_BRIDGE_ROUTES)[0] | null {\n for (const route of UI_BRIDGE_ROUTES) {\n if (route.method !== method) continue;\n\n const routeRegex = route.path.replace(/:[^/]+/g, '([^/]+)').replace(/\\//g, '\\\\/');\n\n const regex = new RegExp(`^${routeRegex}$`);\n if (regex.test(path)) {\n return route;\n }\n }\n return null;\n }\n\n /**\n * Extract params from path\n */\n private extractParams(path: string, routePath: string): Record<string, string> {\n const params: Record<string, string> = {};\n const routeParts = routePath.split('/');\n const pathParts = path.split('/');\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(':')) {\n params[routeParts[i].slice(1)] = pathParts[i];\n }\n }\n\n return params;\n }\n\n /**\n * Parse request body\n */\n private parseBody(\n req: import('http').IncomingMessage,\n maxBytes = 10 * 1024 * 1024\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let data = '';\n let bytes = 0;\n req.on('data', (chunk: string | Buffer) => {\n bytes += typeof chunk === 'string' ? Buffer.byteLength(chunk) : chunk.length;\n if (bytes > maxBytes) {\n req.destroy();\n reject(new Error('Request body too large'));\n return;\n }\n data += chunk;\n });\n req.on('end', () => {\n try {\n resolve(data ? JSON.parse(data) : {});\n } catch {\n resolve({});\n }\n });\n req.on('error', reject);\n });\n }\n\n /**\n * Send JSON response (safe against circular refs from DOM nodes)\n */\n private sendJSON(res: import('http').ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n const seen = new WeakSet();\n res.end(\n JSON.stringify(data, (_key, val) => {\n if (val !== null && typeof val === 'object') {\n if (typeof Node !== 'undefined' && val instanceof Node)\n return `[${val.constructor.name}]`;\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n if (typeof val === 'function') return undefined;\n return val;\n })\n );\n }\n\n /**\n * Broadcast a message to all WebSocket connections (legacy)\n */\n broadcast(message: WebSocketMessage): void {\n const data = JSON.stringify(message);\n for (const ws of this.wsConnections) {\n if (ws.readyState === 1) {\n // OPEN\n ws.send(data);\n }\n }\n }\n\n /**\n * Broadcast an event to all subscribed WebSocket and SSE clients\n */\n broadcastEvent(event: BridgeEvent): void {\n if (this.wsHandler) {\n this.wsHandler.broadcastEvent(event);\n }\n this.sseManager.broadcast(event);\n }\n\n /**\n * Get the SSE manager for direct access (e.g., wiring to registry.onEvent)\n */\n getSSEManager(): SSEManager {\n return this.sseManager;\n }\n\n /**\n * Create an `onBrowserEvent` callback wired to the WS handler's broadcast.\n *\n * Call this **before** `createHandlers()` to get a callback you can pass as\n * `config.onBrowserEvent`. The internal BrowserEventStream in handlers.ts\n * will auto-subscribe and forward classified events through this callback\n * to all connected WebSocket clients.\n *\n * Returns `undefined` if WebSocket is not enabled, so it's safe to spread\n * into the config unconditionally.\n *\n * @example\n * ```ts\n * const server = new StandaloneServer({}, { websocket: true, port: 9876 });\n * const handlers = createHandlers(registry, executor, {\n * onBrowserEvent: server.createBrowserEventCallback(),\n * });\n * ```\n */\n createBrowserEventCallback(): ((event: BridgeEvent) => void) | undefined {\n if (!this.wsHandler) {\n return undefined;\n }\n\n return createWSStreamBroadcast(this.wsHandler, { log: this.config.log });\n }\n\n /**\n * Create an `onChangeEvent` callback wired to SSE + WS broadcast.\n *\n * Call this **before** `createHandlers()` to get a callback you can pass as\n * `config.onChangeEvent`. The ChangeObserver in handlers.ts will forward\n * batched DOM change events through this callback to all connected clients.\n */\n createChangeEventCallback(): (event: BridgeEvent) => void {\n return (event: BridgeEvent) => {\n this.broadcastEvent(event);\n };\n }\n\n /**\n * Get WebSocket handler for direct access\n */\n getWSHandler(): UIBridgeWSHandler | null {\n return this.wsHandler;\n }\n\n /**\n * Get number of connected WebSocket clients\n */\n get wsClientCount(): number {\n return this.wsHandler?.clientCount ?? 0;\n }\n\n /**\n * Get the server address\n */\n getAddress(): { host: string; port: number } | null {\n const address = this.server?.address();\n if (!address || typeof address === 'string') return null;\n return { host: this.config.host, port: address.port };\n }\n}\n\n/**\n * Create and start a standalone server\n */\nexport async function createStandaloneServer(\n handlers: Partial<UIBridgeServerHandlers>,\n config?: StandaloneServerConfig\n): Promise<StandaloneServer> {\n const server = new StandaloneServer(handlers, config);\n await server.start();\n return server;\n}\n\n/**\n * CLI entry point\n */\nexport async function startCLI(\n handlers: Partial<UIBridgeServerHandlers>,\n args: string[] = process.argv.slice(2)\n): Promise<void> {\n const config: StandaloneServerConfig = {};\n\n // Parse CLI args\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n if (arg === '--port' || arg === '-p') {\n config.port = parseInt(nextArg);\n i++;\n } else if (arg === '--host' || arg === '-h') {\n config.host = nextArg;\n i++;\n } else if (arg === '--cors') {\n config.cors = true;\n }\n }\n\n const server = await createStandaloneServer(handlers, config);\n\n // Handle shutdown\n process.on('SIGINT', async () => {\n console.log('\\nShutting down...');\n await server.stop();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await server.stop();\n process.exit(0);\n });\n}\n"]}