@qontinui/ui-bridge 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/ai/index.d.mts +312 -155
  2. package/dist/ai/index.d.ts +312 -155
  3. package/dist/ai/index.js +2363 -67
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/ai/index.mjs +2328 -68
  6. package/dist/ai/index.mjs.map +1 -1
  7. package/dist/annotations/index.d.mts +218 -0
  8. package/dist/annotations/index.d.ts +218 -0
  9. package/dist/annotations/index.js +246 -0
  10. package/dist/annotations/index.js.map +1 -0
  11. package/dist/annotations/index.mjs +241 -0
  12. package/dist/annotations/index.mjs.map +1 -0
  13. package/dist/assertions-BSR3afVr.d.ts +161 -0
  14. package/dist/assertions-CTw1hfOx.d.mts +161 -0
  15. package/dist/babel-plugin/index.js +23 -34
  16. package/dist/babel-plugin/index.js.map +1 -1
  17. package/dist/babel-plugin/index.mjs +23 -34
  18. package/dist/babel-plugin/index.mjs.map +1 -1
  19. package/dist/browser-capture-Bms60T6f.d.mts +47 -0
  20. package/dist/browser-capture-CsTU29mb.d.ts +47 -0
  21. package/dist/control/index.d.mts +26 -7
  22. package/dist/control/index.d.ts +26 -7
  23. package/dist/control/index.js +276 -48
  24. package/dist/control/index.js.map +1 -1
  25. package/dist/control/index.mjs +276 -48
  26. package/dist/control/index.mjs.map +1 -1
  27. package/dist/core/index.d.mts +2 -2
  28. package/dist/core/index.d.ts +2 -2
  29. package/dist/core/index.js.map +1 -1
  30. package/dist/core/index.mjs.map +1 -1
  31. package/dist/debug/index.d.mts +5 -3
  32. package/dist/debug/index.d.ts +5 -3
  33. package/dist/debug/index.js +925 -1
  34. package/dist/debug/index.js.map +1 -1
  35. package/dist/debug/index.mjs +924 -2
  36. package/dist/debug/index.mjs.map +1 -1
  37. package/dist/index.d.mts +12 -7
  38. package/dist/index.d.ts +12 -7
  39. package/dist/index.js +4720 -173
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +4656 -174
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/{metrics-DTA2bwG7.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
  44. package/dist/{metrics-BfiT_rhZ.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
  45. package/dist/native/control/index.js +2 -7
  46. package/dist/native/control/index.js.map +1 -1
  47. package/dist/native/control/index.mjs +2 -7
  48. package/dist/native/control/index.mjs.map +1 -1
  49. package/dist/native/core/index.js.map +1 -1
  50. package/dist/native/core/index.mjs.map +1 -1
  51. package/dist/native/debug/index.js +23 -66
  52. package/dist/native/debug/index.js.map +1 -1
  53. package/dist/native/debug/index.mjs +23 -66
  54. package/dist/native/debug/index.mjs.map +1 -1
  55. package/dist/native/index.js +89 -131
  56. package/dist/native/index.js.map +1 -1
  57. package/dist/native/index.mjs +89 -131
  58. package/dist/native/index.mjs.map +1 -1
  59. package/dist/native/react/index.js +28 -52
  60. package/dist/native/react/index.js.map +1 -1
  61. package/dist/native/react/index.mjs +28 -52
  62. package/dist/native/react/index.mjs.map +1 -1
  63. package/dist/native/server/index.js +38 -13
  64. package/dist/native/server/index.js.map +1 -1
  65. package/dist/native/server/index.mjs +38 -13
  66. package/dist/native/server/index.mjs.map +1 -1
  67. package/dist/react/index.d.mts +107 -8
  68. package/dist/react/index.d.ts +107 -8
  69. package/dist/react/index.js +2194 -84
  70. package/dist/react/index.js.map +1 -1
  71. package/dist/react/index.mjs +2194 -85
  72. package/dist/react/index.mjs.map +1 -1
  73. package/dist/{registry-BKLEm-yk.d.ts → registry-C6dDtn1v.d.ts} +27 -2
  74. package/dist/{registry-BmZgyCz8.d.mts → registry-POtcxnal.d.mts} +27 -2
  75. package/dist/render-log/index.d.mts +1 -1
  76. package/dist/render-log/index.d.ts +1 -1
  77. package/dist/server/express.d.mts +5 -4
  78. package/dist/server/express.d.ts +5 -4
  79. package/dist/server/express.js +104 -2
  80. package/dist/server/express.js.map +1 -1
  81. package/dist/server/express.mjs +104 -2
  82. package/dist/server/express.mjs.map +1 -1
  83. package/dist/server/handlers.d.mts +36 -5
  84. package/dist/server/handlers.d.ts +36 -5
  85. package/dist/server/handlers.js +3129 -224
  86. package/dist/server/handlers.js.map +1 -1
  87. package/dist/server/handlers.mjs +3129 -224
  88. package/dist/server/handlers.mjs.map +1 -1
  89. package/dist/server/index.d.mts +7 -5
  90. package/dist/server/index.d.ts +7 -5
  91. package/dist/server/index.js +3215 -183
  92. package/dist/server/index.js.map +1 -1
  93. package/dist/server/index.mjs +3215 -183
  94. package/dist/server/index.mjs.map +1 -1
  95. package/dist/server/nextjs.d.mts +6 -4
  96. package/dist/server/nextjs.d.ts +6 -4
  97. package/dist/server/nextjs.js +106 -3
  98. package/dist/server/nextjs.js.map +1 -1
  99. package/dist/server/nextjs.mjs +106 -3
  100. package/dist/server/nextjs.mjs.map +1 -1
  101. package/dist/server/standalone.d.mts +6 -5
  102. package/dist/server/standalone.d.ts +6 -5
  103. package/dist/server/standalone.js +131 -5
  104. package/dist/server/standalone.js.map +1 -1
  105. package/dist/server/standalone.mjs +131 -5
  106. package/dist/server/standalone.mjs.map +1 -1
  107. package/dist/specs/index.d.mts +365 -0
  108. package/dist/specs/index.d.ts +365 -0
  109. package/dist/specs/index.js +2809 -0
  110. package/dist/specs/index.js.map +1 -0
  111. package/dist/specs/index.mjs +2786 -0
  112. package/dist/specs/index.mjs.map +1 -0
  113. package/dist/{standalone-BURj8J3G.d.ts → standalone-B6GLIEmR.d.ts} +6 -2
  114. package/dist/{standalone-Dwmel29d.d.mts → standalone-CjdYqj3P.d.mts} +6 -2
  115. package/dist/{types-CHnlwiTK.d.ts → types-B2EfvEaq.d.ts} +83 -3
  116. package/dist/{types-B7J7noLK.d.mts → types-C7gVYRnF.d.ts} +72 -2
  117. package/dist/{types-BkNRILUa.d.ts → types-CJGrBEhC.d.mts} +72 -2
  118. package/dist/types-CebMQj76.d.ts +1275 -0
  119. package/dist/types-D_ypYl3T.d.mts +1275 -0
  120. package/dist/types-UBtp7R0u.d.mts +132 -0
  121. package/dist/types-UBtp7R0u.d.ts +132 -0
  122. package/dist/{types-CEQLnFMv.d.mts → types-gO696T_t.d.mts} +83 -3
  123. package/dist/{types-jKVgTI6_.d.mts → types-suaYwWWg.d.mts} +173 -2
  124. package/dist/{types-jKVgTI6_.d.ts → types-suaYwWWg.d.ts} +173 -2
  125. package/package.json +18 -2
  126. package/dist/types-B5Q0GVo0.d.mts +0 -646
  127. package/dist/types-DfPqwU-i.d.ts +0 -646
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/element-identifier.ts","../../src/control/action-executor.ts","../../src/control/workflow-engine.ts"],"names":[],"mappings":";AAwLO,SAAS,uBAAA,CACd,UAAA,EACA,IAAA,GAAmB,QAAA,EACC;AAEpB,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAElC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAA2B,CAAA,aAAA,EAAgB,UAAU,CAAA,EAAA,CAAI,CAAA;AAC7E,IAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,cAAA,EAAiB,UAAU,CAAA,EAAA,CAAI,CAAA;AAChF,IAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,UAAU,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,CAA2B,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAA2B,UAAU,CAAA;AAC7D,MAAA,IAAI,YAAY,OAAO,UAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,QAAA,CAAS,QAAA;AAAA,QACtB,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,CAAY,uBAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,IAAI,MAAA,CAAO,2BAA2B,WAAA,EAAa;AACjD,QAAA,OAAO,MAAA,CAAO,eAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,aAAA,EAAgB,UAAA,CAAW,IAAI,CAAA,EAAA,CAAI,CAAA;AAC9E,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,cAAA,EAAiB,UAAA,CAAW,MAAM,CAAA,EAAA,CAAI,CAAA;AACjF,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,UAAA,CAAW,MAAM,CAAA,EAAA,CAAI,CAAA;AACvF,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,aAAA,CAA2B,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAGA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,CAA2B,UAAA,CAAW,QAAQ,CAAA;AAC9D,MAAA,IAAI,IAAI,OAAO,EAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,QAAA,CAAS,QAAA;AAAA,QACtB,UAAA,CAAW,KAAA;AAAA,QACX,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,CAAY,uBAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,IAAI,MAAA,CAAO,2BAA2B,WAAA,EAAa;AACjD,QAAA,OAAO,MAAA,CAAO,eAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC9PA,IAAM,oBAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,OAAO,EAAC;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAKA,SAAS,gBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAE7C,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,OAAA,EAAS,CAAC,UAAA,CAAW,OAAO,CAAA;AAAA,IAC5B,OAAA,EAAS,SAAS,aAAA,KAAkB,OAAA;AAAA,IACpC,IAAA,EAAM;AAAA,MACJ,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,eAAe,KAAA,CAAM;AAAA;AACvB,GACF;AAEA,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC3D,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,mBAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACxB,CAAA,MAAA,IAAW,mBAAmB,iBAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,OAAA,EAAsB,IAAA,EAAe,KAAA,EAAqC;AAC3F,EAAA,IAAI,KAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,OAAO,KAAA;AACrC,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,KAAM,GAAG,OAAO,KAAA;AAC5C,EAAA,OACE,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,WAAA,IAClB,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,UAAA,IACnB,IAAA,CAAK,KAAA,GAAQ,CAAA;AAEjB;AAEA,SAAS,WAAW,OAAA,EAA+B;AACjD,EAAA,IAAI,UAAA,IAAc,OAAA,IAAY,OAAA,CAA6B,QAAA,EAAU,OAAO,IAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA,KAAM,QAAQ,OAAO,IAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,SAAS,gBAAA,CAAiB,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAmC;AAC/F,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,OAAA,EAAS,QAAA,EAAU,CAAA,IAAK,KAAK,KAAA,GAAQ,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAA,EAAS,QAAA,EAAU,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA;AAEhD,EAAA,OAAO,IAAI,WAAW,IAAA,EAAM;AAAA,IAC1B,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,SAAS,MAAA,KAAW,OAAA,GAAU,IAAI,OAAA,EAAS,MAAA,KAAW,WAAW,CAAA,GAAI,CAAA;AAAA,IAC7E,OAAA,EAAS,KAAK,IAAA,GAAO,CAAA;AAAA,IACrB,OAAA,EAAS,KAAK,GAAA,GAAM;AAAA,GACrB,CAAA;AACH;AAKO,IAAM,wBAAN,MAAsD;AAAA,EAC3D,YAAoB,QAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA,EAKjD,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AACrD,MAAA,IAAI,OAAA,GAA8B,YAAY,OAAA,IAAW,IAAA;AAGzD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,wBAAwB,SAAS,CAAA;AAAA,MAC7C;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,sBAAsB,SAAS,CAAA,CAAA;AAAA,UACtC,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAGA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,QAAQ,WAAW,CAAA;AACzE,QAAA,cAAA,GAAiB,UAAA,CAAW,QAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,GAAA,EAAK;AACnB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,WAAW,KAAA,IAAS,wBAAA;AAAA,YAC3B,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,YAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,YACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,OAAA,CAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAE/E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,gBAAgB,OAAO,CAAA;AAAA,QACrC,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,QAC9C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,CACJ,WAAA,EACA,OAAA,EACkC;AAClC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,WAAW,CAAA;AACxD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,wBAAwB,WAAW,CAAA,CAAA;AAAA,UAC1C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,MAAM,CAAA;AACpE,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,UAC1C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAElD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,QAC9C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,SAAA,EAAmB,OAAA,EAA2C;AAC1E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AACrD,IAAA,IAAI,OAAA,GAA8B,YAAY,OAAA,IAAW,IAAA;AAEzD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,wBAAwB,SAAS,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACxC;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA8C;AACvD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,WAAgC,EAAC;AAGvC,IAAA,IAAI,OAAoB,QAAA,CAAS,IAAA;AACjC,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAA2B,OAAA,CAAQ,IAAI,CAAA;AAC/D,MAAA,IAAI,QAAQ,IAAA,GAAO,MAAA;AAAA,IACrB;AAGA,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,iCAAA;AAAA,MACA,0BAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,oBAAA,CAAqB,KAAK,IAAI,CAAA;AACpE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAA8B,QAAQ,CAAA;AAEjE,IAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,MAAA,IAAI,OAAA,EAAS,KAAA,IAAS,QAAA,CAAS,MAAA,IAAU,QAAQ,KAAA,EAAO;AAExD,MAAA,MAAM,KAAA,GAAQ,gBAAgB,EAAE,CAAA;AAGhC,MAAA,IAAI,CAAC,OAAA,EAAS,aAAA,IAAiB,CAAC,MAAM,OAAA,EAAS;AAG/C,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAAA,MACrC;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,EAAE,CAAA;AAEpD,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,EAAA,EAAI,UAAA,EAAY,EAAA,IAAM,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,QAC1C,IAAA,EAAM,UAAA,EAAY,IAAA,IAAQ,IAAA,CAAK,iBAAiB,EAAE,CAAA;AAAA,QAClD,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAAA,QACnD,OAAA,EAAS,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAAA,QAChC,IAAA,EAAM,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,QACjC,cAAA,EAAgB,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAA;AAAA,QACzC,OAAA,EAAS,UAAA,EAAY,OAAA,IAAW,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,QACpD,KAAA;AAAA,QACA,UAAA,EAAY,CAAC,CAAC;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAA8C;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAwC;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,cAAA,EAAe;AAC9C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB;AAEhD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC9B,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,OAAA,EAAS,CAAC,GAAG,EAAA,CAAG,SAAS,GAAI,EAAA,CAAG,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,aAAa,CAAA,GAAI,EAAG,CAAA;AAAA,QACnF,KAAA,EAAO,GAAG,QAAA;AAAS,OACrB,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACpC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,OACvC,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAChC,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,SAAA,EAAW,GAAG,KAAA,CAAM;AAAA,OACtB,CAAE,CAAA;AAAA,MACF,YAAY;AAAC;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,CAAe,OAAA,EAAsB,OAAA,EAA2C;AAC5F,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,oBAAA,EAAsB,GAAG,OAAA,EAAQ;AACnD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,QAAA,GAAW,YAAY,IAAA,CAAK,OAAA;AAElC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AAGrC,MAAA,IAAI,MAAA,GAAS,IAAA;AAEb,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAG7C,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,UAAA,IAAI,KAAA,CAAM,GAAyB,CAAA,KAAM,KAAA,EAAO;AAC9C,YAAA,MAAA,GAAS,KAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,IAAA;AAAA,UACL,QAAA,EAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAC9B;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,QAAA,EAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAC9B,KAAA,EAAO,gBAAgB,OAAO,CAAA;AAAA,MAC9B,KAAA,EAAO,CAAA,qCAAA,EAAwC,IAAA,CAAK,OAAO,CAAA,EAAA;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,OAAA,EACA,MAAA,EACA,MAAA,EACkB;AAClB,IAAA,QAAQ,MAAA;AAA0B,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,MAAqB,CAAA;AAAA,MACzD,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,MAAqB,CAAA;AAAA,MAC/D,KAAK,YAAA;AACH,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,MAAqB,CAAA;AAAA,MAC9D,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,MAA+B,CAAA;AAAA,MAClE,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAiC,CAAA;AAAA,MACtE,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MACjC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAsB,CAAA;AAAA,MAC3D,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAAA,MACxC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAK,CAAA;AAAA,MACzC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,OAAO,CAAA;AAAA,MACnC,SAAS;AAEP,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA;AACzD,QAAA,IAAI,UAAA,EAAY,aAAA,GAAgB,MAAM,CAAA,EAAG;AACvC,UAAA,OAAO,UAAA,CAAW,aAAA,CAAc,MAAM,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA;AACF,EACF;AAAA,EAEQ,YAAA,CAAa,SAAsB,OAAA,EAA6B;AACtE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACrE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AACnE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACnE;AAAA,EAEQ,kBAAA,CAAmB,SAAsB,OAAA,EAA6B;AAC5E,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,UAAA,EAAY,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA,EAEQ,iBAAA,CAAkB,SAAsB,OAAA,EAA6B;AAC3E,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,QAAQ,OAAA,EAAiB;AACpD,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,aAAA,EAAe,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EACtE;AAAA,EAEA,MAAc,WAAA,CAAY,OAAA,EAAsB,OAAA,EAAqC;AACnF,IAAA,IAAI,EAAE,OAAA,YAAmB,gBAAA,IAAoB,OAAA,YAAmB,mBAAA,CAAA,EAAsB;AACpF,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAChB,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,CAAA;AAEhC,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,OAAA,CAAQ,KAAA,IAAS,IAAA;AACjB,MAAA,IAAI,OAAA,EAAS,kBAAkB,KAAA,EAAO;AACpC,QAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS,kBAAkB,KAAA,EAAO;AACpC,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,IAAI,OAAA,YAAmB,gBAAA,IAAoB,OAAA,YAAmB,mBAAA,EAAqB;AACjF,MAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAChB,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,SAAsB,OAAA,EAA8B;AACxE,IAAA,IAAI,EAAE,mBAAmB,iBAAA,CAAA,EAAoB;AAC3C,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,KAAK,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,OAAA,EAAS,KAAK,CAAA;AAE9E,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AAEtB,MAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,OAAO,MAAA,CAAO,KAAA;AAC3D,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,UAAA,CAAW,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAClE;AAAA,EAEQ,YAAY,OAAA,EAA4B;AAC9C,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,UAAA,CAAW,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EACjE;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,YAAA,EAAc,OAAO,CAAC,CAAA;AAC7D,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEQ,aAAA,CAAc,SAAsB,OAAA,EAA8B;AACxE,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAA2B,OAAA,CAAQ,SAAS,CAAA;AACpE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,eAAe,EAAE,QAAA,EAAU,QAAQ,MAAA,GAAS,QAAA,GAAW,QAAQ,CAAA;AACtE,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,QACf,IAAA,EAAM,QAAQ,QAAA,CAAS,CAAA;AAAA,QACvB,GAAA,EAAK,QAAQ,QAAA,CAAS,CAAA;AAAA,QACtB,QAAA,EAAU,OAAA,CAAQ,MAAA,GAAS,QAAA,GAAW;AAAA,OACvC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,GAAA;AAClC,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,MAAA;AAExC,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,IAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,EAAK,CAAC,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAChF,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAC/E,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AACjF,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAChF,QAAA;AAAA;AACJ,EACF;AAAA,EAEQ,YAAA,CAAa,SAAsB,OAAA,EAAwB;AACjE,IAAA,IACE,mBAAmB,gBAAA,KAClB,OAAA,CAAQ,SAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,CAAA,EACjD;AACA,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,QAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAA,EAA4B;AAChD,IAAA,IAAI,OAAA,YAAmB,gBAAA,IAAoB,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACtE,MAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA;AAC3B,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAA8B;AACjD,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IACjC,OAAA,CAAQ,aAAa,aAAa,CAAA,IAClC,OAAA,CAAQ,EAAA,IACR,CAAA,EAAG,OAAA,CAAQ,QAAQ,WAAA,EAAa,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAE/E;AAAA,EAEQ,gBAAgB,OAAA,EAA0C;AAChE,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IACjC,QAAQ,YAAA,CAAa,OAAO,CAAA,IAC5B,OAAA,CAAQ,aAAa,IAAA,EAAK,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,IAC3C,MAAA;AAAA,EAEJ;AAAA,EAEQ,kBAAkB,OAAA,EAA0C;AAClE,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACnD,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,SAAS,UAAA,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,EAAA,KAAO,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,WAAA,EAAa,MAAM,CAAA,CAC5D,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IAC/C;AAEA,IAAA,IACE,OAAA,YAAmB,gBAAA,IACnB,OAAA,YAAmB,iBAAA,IACnB,mBAAmB,mBAAA,EACnB;AACA,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAgC,CAAA,WAAA,EAAc,OAAA,CAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AACnF,QAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,IAAK,MAAA;AAAA,EAErF;AAAA,EAEQ,iBAAiB,OAAA,EAA8B;AACrD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAC5C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAExC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,SAAA;AACH,UAAA,OAAO,OAAA;AAAA,QACT,KAAK,UAAA;AACH,UAAA,OAAO,UAAA;AAAA,QACT,KAAK,OAAA;AACH,UAAA,OAAO,OAAA;AAAA,QACT,KAAK,MAAA;AACH,UAAA,OAAO,MAAA;AAAA,QACT,KAAK,SAAA;AAAA,QACL,KAAK,UAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,MAAA;AACH,UAAA,OAAO,MAAA;AAAA,QACT,KAAK,UAAA;AACH,UAAA,OAAO,UAAA;AAAA,QACT,KAAK,KAAA;AACH,UAAA,OAAO,KAAA;AAAA,QACT,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA;AACX,IACF;AAEA,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,OAAQ,OAAA,CAA6B,IAAA;AAC3C,QAAA,IAAI,IAAA,KAAS,YAAY,OAAO,UAAA;AAChC,QAAA,IAAI,IAAA,KAAS,SAAS,OAAO,OAAA;AAC7B,QAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU,OAAO,QAAA;AACnD,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,UAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,GAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAAA,EAEQ,aAAa,OAAA,EAAgC;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAE7C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,eAAe,YAAY,CAAA;AAAA,MAC9D,KAAK,OAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MAClD,KAAK,UAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MAClD,KAAK,QAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,MAC3C,KAAK,UAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,MAC/D,KAAK,OAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAO,CAAA;AAAA,MAC1C,KAAK,MAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,MACjC;AACE,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA;AACnC,EACF;AACF;AAKO,SAAS,qBAAqB,QAAA,EAA4C;AAC/E,EAAA,OAAO,IAAI,sBAAsB,QAAQ,CAAA;AAC3C;;;AC5uBA,SAAS,aAAA,GAAwB;AAC/B,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrE;AAKO,IAAM,wBAAN,MAAsD;AAAA,EAG3D,WAAA,CACU,UACA,QAAA,EACR;AAFQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAJV,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAA8B;AAAA,EAKpD;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,GAAA,CAAI,UAAA,EAAoB,OAAA,EAA4D;AACxF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AACrD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO;AAAA,QACL,UAAA;AAAA,QACA,OAAO,aAAA,EAAc;AAAA,QACrB,MAAA,EAAQ,QAAA;AAAA,QACR,OAAO,EAAC;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,uBAAuB,UAAU,CAAA,CAAA;AAAA,QACxC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,QACtB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,UAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,EAAC;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,MAAA,KAAA,CAAM,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,IACrE;AAEA,IAAA,KAAA,CAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,SAAA;AAG7C,IAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,KAAA,CAAM,MAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAGlF,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,IAC9B,GAAG,GAAK,CAAA;AAER,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAoD;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAAiC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,WAAW,OAAO,KAAA;AAEjD,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,IAAA,KAAA,CAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,SAAA;AAC7C,IAAA,KAAA,CAAM,KAAA,GAAQ,4BAAA;AAEd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAiD;AACrD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CACvC,OAAO,CAAC,KAAA,KAAU,MAAM,MAAA,KAAW,SAAS,EAC5C,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,KAAA,EAAwC;AACpE,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AAC9B,IAAA,MAAM,SAAS,EAAE,GAAG,SAAS,aAAA,EAAe,GAAG,SAAS,MAAA,EAAO;AAG/D,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,SAAS,CAAA;AACtE,MAAA,IAAI,GAAA,IAAO,GAAG,UAAA,GAAa,GAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAA,GAAY,SAAS,KAAA,CAAM,MAAA;AAC/B,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,QAAQ,CAAA;AACrE,MAAA,IAAI,GAAA,IAAO,CAAA,EAAG,SAAA,GAAY,GAAA,GAAM,CAAA;AAAA,IAClC;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAE3C,MAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAElC,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AACpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAE7B,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAY,IAAA,EAAM,MAAA,EAAQ,SAAS,WAAW,CAAA;AAC5E,MAAA,KAAA,CAAM,KAAA,CAAM,KAAK,UAAU,CAAA;AAG3B,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,QAAA,KAAA,CAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,IAAA,EACA,MAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,UACnB,IAAI,OAAA;AAAA,QAAe,CAAC,CAAA,EAAG,MAAA,KACrB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA,EAAG,OAAO;AAAA,OAC7D,GACA,IAAA;AAEJ,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AAE5D,MAAA,MAAM,MAAA,GAAS,cAAA,GACX,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,cAAA,EAAgB,cAAc,CAAC,CAAA,GACnD,MAAM,cAAA;AAEV,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,CACZ,IAAA,EACA,MAAA,EACkB;AAElB,IAAA,MAAM,iBAAiB,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAA,IAAU,IAAI,MAAM,CAAA;AAEvE,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,gBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AACA,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ;AAAA,UAC9C,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,MAAA,EAAQ,cAAA;AAAA,UACR,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AAAA,MAEH,KAAK,kBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,QAC/D;AACA,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,IAAA,CAAK,MAAA,EAAQ;AAAA,UACvD,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MAEH,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAClF,QAAA,IAAI,CAAC,WAAW,GAAA,EAAK;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,UAAA,CAAW,KAAA,IAAS,wBAAwB,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MAEA,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,aAAA,EAAe;AACvC,UAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,QACjE;AACA,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,KAAK,aAAa,CAAA;AAAA,MAE9D,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AACA,QAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,MAEtB;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA;AACrD,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,MAAA,EACA,aAAA,EACqD;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AACjD,IAAA,MAAM,OAAA,GAAU,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAE7D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC3D,MAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,KAAA,CAA6C,GAAG,CAAA;AACxE,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,WAAA,CAAY,KAAK,CAAA,EAAG,GAAG,cAAc,QAAQ,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAAsB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,YACA,cAAA,EACyB;AACzB,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,gBAAA,EAAkB,CAAC,GAAG,IAAA,KAAS;AACzD,UAAA,OAAO,MAAA,CAAO,cAAA,CAAe,IAAI,CAAA,IAAK,EAAE,CAAA;AAAA,QAC1C,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAA8C;AAClE,IAAA,OAAO;AAAA,MACL,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAAA,MACtB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,UAAA,EAAY,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AACF;AAuBO,SAAS,oBAAA,CACd,UACA,QAAA,EACgB;AAChB,EAAA,OAAO,IAAI,qBAAA,CAAsB,QAAA,EAAU,QAAQ,CAAA;AACrD","file":"index.mjs","sourcesContent":["/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(private registry: UIBridgeRegistry) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(element, request.action, request.params);\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n });\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n element.focus();\n\n if (options?.clear) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n element.value += char;\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(registry: UIBridgeRegistry): ActionExecutor {\n return new DefaultActionExecutor(registry);\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/element-identifier.ts","../../src/control/action-executor.ts","../../src/control/workflow-engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport type { CapturedError } from '../debug/browser-capture-types';\nimport type { BrowserEventCapture } from '../debug/browser-capture';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n DragAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n // Populate textContent from the element's visible text\n const rawText = element.textContent?.trim();\n if (rawText) {\n // Collapse whitespace and truncate to avoid storing huge text\n state.textContent = rawText.replace(/\\s+/g, ' ').slice(0, 500);\n }\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event relative to an element's bounding rect\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Safe wrapper around document.elementFromPoint that returns null if unavailable.\n * (elementFromPoint is not implemented in some test environments like jsdom.)\n */\nfunction elementFromPointSafe(x: number, y: number): HTMLElement | null {\n if (typeof document.elementFromPoint === 'function') {\n return document.elementFromPoint(x, y) as HTMLElement | null;\n }\n return null;\n}\n\n/**\n * Create a mouse event at absolute client coordinates\n */\nfunction createMouseEventAt(type: string, clientX: number, clientY: number): MouseEvent {\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n button: 0,\n clientX,\n clientY,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(\n private registry: UIBridgeRegistry,\n private consoleCapture?: BrowserEventCapture\n ) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const actionStartTime = Date.now();\n const result = await this.performAction(element, request.action, request.params);\n\n // Brief wait to catch immediate async errors (promise rejections from click handlers)\n let consoleErrors: CapturedError[] | undefined;\n if (this.consoleCapture) {\n await sleep(50);\n const errors = this.consoleCapture.getConsoleSince(actionStartTime);\n if (errors.length > 0) consoleErrors = errors;\n }\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n consoleErrors,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements (unless contentOnly is set)\n if (!options?.contentOnly) {\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n category: registered?.category || 'interactive',\n contentMetadata: registered?.contentMetadata,\n });\n }\n }\n\n // Include content elements from registry when requested\n if (options?.includeContent || options?.contentOnly) {\n const contentElements = this.registry.getAllContentElements();\n for (const el of contentElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = el.getState();\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by content role\n if (options?.contentRole && el.contentMetadata?.contentRole !== options.contentRole) {\n continue;\n }\n\n elements.push({\n id: el.id,\n type: el.type,\n label: el.label,\n tagName: el.element.tagName.toLowerCase(),\n role: el.element.getAttribute('role') || undefined,\n accessibleName: el.label || state.textContent?.trim(),\n actions: [],\n state,\n registered: true,\n category: 'content',\n contentMetadata: el.contentMetadata,\n });\n }\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n category: el.category,\n contentMetadata: el.contentMetadata,\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n case 'drag':\n return this.performDrag(element, params as unknown as DragAction);\n case 'setValue':\n return this.performSetValue(element, params);\n case 'submit':\n return this.performSubmit(element);\n case 'reset':\n return this.performReset(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n // Use the native value setter to bypass React's synthetic event system.\n // React overrides the value property; setting .value directly doesn't\n // trigger onChange. The native setter + dispatched 'input' event does.\n const proto =\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype;\n const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;\n\n element.focus();\n\n if (options?.clear) {\n if (nativeSetter) {\n nativeSetter.call(element, '');\n } else {\n element.value = '';\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n const current = element.value;\n if (nativeSetter) {\n nativeSetter.call(element, current + char);\n } else {\n element.value = current + char;\n }\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const proto =\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype;\n const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;\n if (nativeSetter) {\n nativeSetter.call(element, '');\n } else {\n element.value = '';\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSetValue(element: HTMLElement, params?: Record<string, unknown>): void {\n const value = params?.value as string | undefined;\n if (value === undefined) {\n throw new Error('setValue requires a \"value\" parameter');\n }\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n // Use native setter to work with React controlled inputs\n const nativeSetter = Object.getOwnPropertyDescriptor(\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype,\n 'value'\n )?.set;\n if (nativeSetter) {\n nativeSetter.call(element, value);\n } else {\n element.value = value;\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (element instanceof HTMLSelectElement) {\n element.value = value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSubmit(element: HTMLElement): void {\n const form = element instanceof HTMLFormElement ? element : element.closest('form');\n if (form) {\n // Dispatch submit event first (allows preventDefault)\n const submitEvent = new Event('submit', { bubbles: true, cancelable: true });\n if (form.dispatchEvent(submitEvent)) {\n form.requestSubmit();\n }\n } else {\n throw new Error('No form found for submit action');\n }\n }\n\n private performReset(element: HTMLElement): void {\n const form = element instanceof HTMLFormElement ? element : element.closest('form');\n if (form) {\n form.reset();\n form.dispatchEvent(new Event('reset', { bubbles: true }));\n } else {\n throw new Error('No form found for reset action');\n }\n }\n\n /**\n * Perform a drag operation by dispatching a sequence of mouse events.\n *\n * Follows the same composite pattern as the qontinui core library:\n * mousedown on source → wait → mousemove × N along path → mouseup on target.\n *\n * Optionally dispatches HTML5 drag events (dragstart/dragover/drop/dragend)\n * for apps that use the HTML5 Drag and Drop API instead of mouse events.\n */\n private async performDrag(sourceElement: HTMLElement, options?: DragAction): Promise<void> {\n const sourceRect = sourceElement.getBoundingClientRect();\n const sourceX = sourceRect.left + (options?.sourceOffset?.x ?? sourceRect.width / 2);\n const sourceY = sourceRect.top + (options?.sourceOffset?.y ?? sourceRect.height / 2);\n\n // Resolve target position\n let targetX: number;\n let targetY: number;\n\n if (options?.targetPosition) {\n targetX = options.targetPosition.x;\n targetY = options.targetPosition.y;\n } else if (options?.target) {\n const targetElement = this.resolveTargetElement(options.target);\n if (!targetElement) {\n throw new Error(`Drag target element not found: ${JSON.stringify(options.target)}`);\n }\n const targetRect = targetElement.getBoundingClientRect();\n targetX = targetRect.left + (options?.targetOffset?.x ?? targetRect.width / 2);\n targetY = targetRect.top + (options?.targetOffset?.y ?? targetRect.height / 2);\n } else {\n throw new Error('Drag requires either target or targetPosition');\n }\n\n const steps = options?.steps ?? 10;\n const holdDelay = options?.holdDelay ?? 100;\n const releaseDelay = options?.releaseDelay ?? 50;\n\n // 1. Dispatch mousedown on source\n sourceElement.dispatchEvent(createMouseEventAt('mousedown', sourceX, sourceY));\n\n // 2. Optionally dispatch dragstart (HTML5 mode, requires DragEvent support)\n const canHTML5 = options?.html5 && typeof DragEvent !== 'undefined';\n if (canHTML5) {\n sourceElement.dispatchEvent(\n new DragEvent('dragstart', {\n bubbles: true,\n cancelable: true,\n clientX: sourceX,\n clientY: sourceY,\n })\n );\n }\n\n // 3. Wait hold delay (matches qontinui core's delay_between_mouse_down_and_move)\n if (holdDelay > 0) {\n await sleep(holdDelay);\n }\n\n // 4. Dispatch intermediate mousemove events along the path\n for (let i = 1; i <= steps; i++) {\n const progress = i / steps;\n const currentX = sourceX + (targetX - sourceX) * progress;\n const currentY = sourceY + (targetY - sourceY) * progress;\n\n // Find the element under the cursor (falls back to source if unavailable)\n const dispatchTarget = elementFromPointSafe(currentX, currentY) || sourceElement;\n\n dispatchTarget.dispatchEvent(createMouseEventAt('mousemove', currentX, currentY));\n\n if (canHTML5) {\n dispatchTarget.dispatchEvent(\n new DragEvent('dragover', {\n bubbles: true,\n cancelable: true,\n clientX: currentX,\n clientY: currentY,\n })\n );\n }\n }\n\n // 5. Dispatch mouseup on the element under the final position\n const dropTarget = elementFromPointSafe(targetX, targetY) || sourceElement;\n\n dropTarget.dispatchEvent(createMouseEventAt('mouseup', targetX, targetY));\n\n // 6. Optionally dispatch drop + dragend (HTML5 mode)\n if (canHTML5) {\n dropTarget.dispatchEvent(\n new DragEvent('drop', {\n bubbles: true,\n cancelable: true,\n clientX: targetX,\n clientY: targetY,\n })\n );\n sourceElement.dispatchEvent(\n new DragEvent('dragend', {\n bubbles: true,\n cancelable: true,\n clientX: targetX,\n clientY: targetY,\n })\n );\n }\n\n // 7. Wait release delay (matches qontinui core's delay_after_drag)\n if (releaseDelay > 0) {\n await sleep(releaseDelay);\n }\n }\n\n /**\n * Resolve a drag target element from a target descriptor.\n */\n private resolveTargetElement(target: NonNullable<DragAction['target']>): HTMLElement | null {\n if (target.elementId) {\n const registered = this.registry.getElement(target.elementId);\n if (registered?.element) return registered.element;\n // Fall back to DOM lookup by identifier\n return findElementByIdentifier(target.elementId);\n }\n if (target.selector) {\n return document.querySelector<HTMLElement>(target.selector);\n }\n return null;\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(\n registry: UIBridgeRegistry,\n consoleCapture?: BrowserEventCapture\n): ActionExecutor {\n return new DefaultActionExecutor(registry, consoleCapture);\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { I as WSClientConfig, M as WSConnectionState, a9 as WSSubscriptionOptions, k as BridgeEventType, l as BridgeSnapshot, f as ActionRequest, g as ActionResponse, i as BridgeEvent } from '../types-jKVgTI6_.mjs';
2
- export { A as AccessibilityIssue, a as AccessibilityReport, b as AccessibilitySeverity, c as ActionErrorCode, d as ActionFailureDetails, e as ActionHandler, h as AriaCheckedState, B as BranchCondition, j as BridgeEventListener, C as ComponentAction, m as ComponentStateResponse, n as ComputedProperty, o as CustomAction, E as ElementAccessibility, p as ElementIdentifier, q as ElementState, r as ElementType, s as ExtendedWorkflowStep, t as ExtractConfig, L as LogConfig, u as LoopConfig, N as NavigationResult, P as PartialMatch, v as PathResult, R as RecoveryAction, w as RegisteredComponent, x as RegisteredElement, S as StandardAction, y as StateGetter, z as StateSnapshot, T as TransitionResult, U as UIBridgeConfig, D as UIBridgeFeatures, F as UIState, G as UIStateGroup, H as UITransition, W as WCAGLevel, J as WSClientMessage, K as WSClientMessageType, O as WSDiscoverMessage, Q as WSErrorMessage, V as WSEventMessage, X as WSExecuteActionMessage, Y as WSExecuteComponentActionMessage, Z as WSExecuteWorkflowMessage, _ as WSFindMessage, $ as WSGetElementMessage, a0 as WSGetSnapshotMessage, a1 as WSMessageBase, a2 as WSPingMessage, a3 as WSPongMessage, a4 as WSResponseMessage, a5 as WSServerMessage, a6 as WSServerMessageType, a7 as WSSubscribeMessage, a8 as WSSubscribedMessage, aa as WSUnsubscribeMessage, ab as WSUnsubscribedMessage, ac as WSWelcomeMessage, ad as WSWorkflowProgressMessage, ae as WaitOptions, af as Workflow, ag as WorkflowStep, ah as WorkflowStepType } from '../types-jKVgTI6_.mjs';
1
+ import { a7 as WSClientConfig, aa as WSConnectionState, as as WSSubscriptionOptions, l as BridgeEventType, m as BridgeSnapshot, f as ActionRequest, g as ActionResponse, j as BridgeEvent } from '../types-suaYwWWg.mjs';
2
+ export { A as AccessibilityIssue, a as AccessibilityReport, b as AccessibilitySeverity, c as ActionErrorCode, d as ActionFailureDetails, e as ActionHandler, i as AriaCheckedState, B as BranchCondition, k as BridgeEventListener, C as CapturedError, q as ComponentAction, r as ComponentStateResponse, s as ComputedProperty, u as ContentMetadata, v as ContentRole, w as ContentType, x as CustomAction, E as ElementAccessibility, y as ElementIdentifier, z as ElementState, F as ElementType, G as ExtendedWorkflowStep, H as ExtractConfig, L as LogConfig, K as LoopConfig, O as NavigationResult, S as PartialMatch, T as PathResult, V as RecoveryAction, W as RegisteredComponent, X as RegisteredElement, Z as StandardAction, _ as StateGetter, $ as StateSnapshot, a0 as TransitionResult, a1 as UIBridgeConfig, a2 as UIBridgeFeatures, a3 as UIState, a4 as UIStateGroup, a5 as UITransition, a6 as WCAGLevel, a8 as WSClientMessage, a9 as WSClientMessageType, ab as WSDiscoverMessage, ac as WSErrorMessage, ad as WSEventMessage, ae as WSExecuteActionMessage, af as WSExecuteComponentActionMessage, ag as WSExecuteWorkflowMessage, ah as WSFindMessage, ai as WSGetElementMessage, aj as WSGetSnapshotMessage, ak as WSMessageBase, al as WSPingMessage, am as WSPongMessage, an as WSResponseMessage, ao as WSServerMessage, ap as WSServerMessageType, aq as WSSubscribeMessage, ar as WSSubscribedMessage, at as WSUnsubscribeMessage, au as WSUnsubscribedMessage, av as WSWelcomeMessage, aw as WSWorkflowProgressMessage, ax as WaitOptions, az as Workflow, aA as WorkflowStep, aB as WorkflowStepType } from '../types-suaYwWWg.mjs';
3
3
 
4
4
  /**
5
5
  * WebSocket Client for UI Bridge
@@ -1,5 +1,5 @@
1
- import { I as WSClientConfig, M as WSConnectionState, a9 as WSSubscriptionOptions, k as BridgeEventType, l as BridgeSnapshot, f as ActionRequest, g as ActionResponse, i as BridgeEvent } from '../types-jKVgTI6_.js';
2
- export { A as AccessibilityIssue, a as AccessibilityReport, b as AccessibilitySeverity, c as ActionErrorCode, d as ActionFailureDetails, e as ActionHandler, h as AriaCheckedState, B as BranchCondition, j as BridgeEventListener, C as ComponentAction, m as ComponentStateResponse, n as ComputedProperty, o as CustomAction, E as ElementAccessibility, p as ElementIdentifier, q as ElementState, r as ElementType, s as ExtendedWorkflowStep, t as ExtractConfig, L as LogConfig, u as LoopConfig, N as NavigationResult, P as PartialMatch, v as PathResult, R as RecoveryAction, w as RegisteredComponent, x as RegisteredElement, S as StandardAction, y as StateGetter, z as StateSnapshot, T as TransitionResult, U as UIBridgeConfig, D as UIBridgeFeatures, F as UIState, G as UIStateGroup, H as UITransition, W as WCAGLevel, J as WSClientMessage, K as WSClientMessageType, O as WSDiscoverMessage, Q as WSErrorMessage, V as WSEventMessage, X as WSExecuteActionMessage, Y as WSExecuteComponentActionMessage, Z as WSExecuteWorkflowMessage, _ as WSFindMessage, $ as WSGetElementMessage, a0 as WSGetSnapshotMessage, a1 as WSMessageBase, a2 as WSPingMessage, a3 as WSPongMessage, a4 as WSResponseMessage, a5 as WSServerMessage, a6 as WSServerMessageType, a7 as WSSubscribeMessage, a8 as WSSubscribedMessage, aa as WSUnsubscribeMessage, ab as WSUnsubscribedMessage, ac as WSWelcomeMessage, ad as WSWorkflowProgressMessage, ae as WaitOptions, af as Workflow, ag as WorkflowStep, ah as WorkflowStepType } from '../types-jKVgTI6_.js';
1
+ import { a7 as WSClientConfig, aa as WSConnectionState, as as WSSubscriptionOptions, l as BridgeEventType, m as BridgeSnapshot, f as ActionRequest, g as ActionResponse, j as BridgeEvent } from '../types-suaYwWWg.js';
2
+ export { A as AccessibilityIssue, a as AccessibilityReport, b as AccessibilitySeverity, c as ActionErrorCode, d as ActionFailureDetails, e as ActionHandler, i as AriaCheckedState, B as BranchCondition, k as BridgeEventListener, C as CapturedError, q as ComponentAction, r as ComponentStateResponse, s as ComputedProperty, u as ContentMetadata, v as ContentRole, w as ContentType, x as CustomAction, E as ElementAccessibility, y as ElementIdentifier, z as ElementState, F as ElementType, G as ExtendedWorkflowStep, H as ExtractConfig, L as LogConfig, K as LoopConfig, O as NavigationResult, S as PartialMatch, T as PathResult, V as RecoveryAction, W as RegisteredComponent, X as RegisteredElement, Z as StandardAction, _ as StateGetter, $ as StateSnapshot, a0 as TransitionResult, a1 as UIBridgeConfig, a2 as UIBridgeFeatures, a3 as UIState, a4 as UIStateGroup, a5 as UITransition, a6 as WCAGLevel, a8 as WSClientMessage, a9 as WSClientMessageType, ab as WSDiscoverMessage, ac as WSErrorMessage, ad as WSEventMessage, ae as WSExecuteActionMessage, af as WSExecuteComponentActionMessage, ag as WSExecuteWorkflowMessage, ah as WSFindMessage, ai as WSGetElementMessage, aj as WSGetSnapshotMessage, ak as WSMessageBase, al as WSPingMessage, am as WSPongMessage, an as WSResponseMessage, ao as WSServerMessage, ap as WSServerMessageType, aq as WSSubscribeMessage, ar as WSSubscribedMessage, at as WSUnsubscribeMessage, au as WSUnsubscribedMessage, av as WSWelcomeMessage, aw as WSWorkflowProgressMessage, ax as WaitOptions, az as Workflow, aA as WorkflowStep, aB as WorkflowStepType } from '../types-suaYwWWg.js';
3
3
 
4
4
  /**
5
5
  * WebSocket Client for UI Bridge
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/websocket-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/websocket-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n"]}