opensteer 0.6.13 → 0.7.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 (62) hide show
  1. package/README.md +256 -184
  2. package/dist/chunk-7QTHGTGN.js +32589 -0
  3. package/dist/chunk-7QTHGTGN.js.map +1 -0
  4. package/dist/cli/bin.cjs +38219 -0
  5. package/dist/cli/bin.cjs.map +1 -0
  6. package/dist/cli/bin.d.cts +1 -0
  7. package/dist/cli/bin.d.ts +1 -0
  8. package/dist/cli/bin.js +5612 -0
  9. package/dist/cli/bin.js.map +1 -0
  10. package/dist/index.cjs +31327 -16009
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/index.d.cts +4440 -670
  13. package/dist/index.d.ts +4440 -670
  14. package/dist/index.js +438 -378
  15. package/dist/index.js.map +1 -0
  16. package/package.json +58 -62
  17. package/skills/README.md +21 -20
  18. package/skills/opensteer/SKILL.md +60 -194
  19. package/skills/opensteer/references/cli-reference.md +69 -113
  20. package/skills/opensteer/references/request-workflow.md +81 -0
  21. package/skills/opensteer/references/sdk-reference.md +101 -154
  22. package/CHANGELOG.md +0 -75
  23. package/bin/opensteer.mjs +0 -1423
  24. package/dist/browser-profile-client-CGXc0-P9.d.cts +0 -228
  25. package/dist/browser-profile-client-DHLzMf-K.d.ts +0 -228
  26. package/dist/chunk-2ES46WCO.js +0 -1437
  27. package/dist/chunk-3H5RRIMZ.js +0 -69
  28. package/dist/chunk-AVXUMEDG.js +0 -62
  29. package/dist/chunk-DN3GI5CH.js +0 -57
  30. package/dist/chunk-FAHE5DB2.js +0 -190
  31. package/dist/chunk-HBTSQ2V4.js +0 -15259
  32. package/dist/chunk-K5CL76MG.js +0 -81
  33. package/dist/chunk-U724TBY6.js +0 -1262
  34. package/dist/chunk-ZRCFF546.js +0 -77
  35. package/dist/cli/auth.cjs +0 -2022
  36. package/dist/cli/auth.d.cts +0 -114
  37. package/dist/cli/auth.d.ts +0 -114
  38. package/dist/cli/auth.js +0 -15
  39. package/dist/cli/local-profile.cjs +0 -197
  40. package/dist/cli/local-profile.d.cts +0 -18
  41. package/dist/cli/local-profile.d.ts +0 -18
  42. package/dist/cli/local-profile.js +0 -97
  43. package/dist/cli/profile.cjs +0 -18548
  44. package/dist/cli/profile.d.cts +0 -79
  45. package/dist/cli/profile.d.ts +0 -79
  46. package/dist/cli/profile.js +0 -1328
  47. package/dist/cli/server.cjs +0 -17232
  48. package/dist/cli/server.d.cts +0 -2
  49. package/dist/cli/server.d.ts +0 -2
  50. package/dist/cli/server.js +0 -977
  51. package/dist/cli/skills-installer.cjs +0 -230
  52. package/dist/cli/skills-installer.d.cts +0 -28
  53. package/dist/cli/skills-installer.d.ts +0 -28
  54. package/dist/cli/skills-installer.js +0 -201
  55. package/dist/extractor-4Q3TFZJB.js +0 -8
  56. package/dist/resolver-MGN64KCP.js +0 -7
  57. package/dist/types-Cr10igF3.d.cts +0 -345
  58. package/dist/types-Cr10igF3.d.ts +0 -345
  59. package/skills/electron/SKILL.md +0 -87
  60. package/skills/electron/references/opensteer-electron-recipes.md +0 -88
  61. package/skills/electron/references/opensteer-electron-workflow.md +0 -85
  62. package/skills/opensteer/references/examples.md +0 -118
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/opensteer.ts","../src/behavior/mouse.ts","../src/behavior/typing.ts","../src/behavior/scroll.ts"],"names":[],"mappings":";;;;AA4NO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACb,OAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,UAAU,8BAAA,CAA+B;AAAA,MAC5C,cAAA,EAAgB,OAAA;AAAA,MAChB,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA;AAAM,KAC/D,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,EACnB;AAAA,EAEA,OAAO,MAAA,CAAO,OAAA,GAAkC,EAAC,EAAc;AAC7D,IAAA,OAAO,UAAA,CAAU,WAAA;AAAA,MACf,IAAI,6BAAA,CAA8B;AAAA,QAChC,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,QAC3D,GAAI,QAAQ,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA;AAAQ,OACrE,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,KAAA,GAA4C,EAAC,EAAwC;AAC9F,IAAA,MAAM,aAAa,OAAO,KAAA,KAAU,WAAW,EAAE,GAAA,EAAK,OAAM,GAAI,KAAA;AAChE,IAAA,IAAI,IAAA,CAAK,cAAc,UAAA,EAAY;AACjC,MAAA,8BAAA,CAA+B,UAAU,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgC,EAAC,EAAqC;AACpF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,GAA+B,EAAC,EAAoC;AAChF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAyE;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAiC,EAAC,EAAsC;AACtF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,KAAK,KAAA,EAAwE;AACjF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAA,KAAU,WAAW,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,KAAK,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,SACJ,KAAA,EAC+C;AAC/C,IAAA,MAAM,UAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GACb;AAAA,MACE,MAAA,EAAQ;AAAA,KACV,GACA,KAAA;AACN,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,UAAU,CAAA;AACrD,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,aACJ,KAAA,EAC+C;AAC/C,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,cACJ,KAAA,EACuC;AACvC,IAAA,MAAM,UAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GACb;AAAA,MACE,MAAA,EAAQ;AAAA,KACV,GACA,KAAA;AACN,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAA,CACJ,KAAA,GAA2E,EAAC,EACtC;AACtC,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,IAAA;AACvD,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAA,KAAS,SAAY,EAAC,GAAI,EAAE,IAAA,EAAM,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,MAAM,KAAA,EAA+D;AACzE,IAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,KAAA,EAA+D;AACzE,IAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,KAAA,EAA8D;AACxE,IAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM;AAAA,MACxB,GAAG,UAAA;AAAA,MACH,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,KAC1E,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,KAAA,EAA+D;AAC1E,IAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MACzB,GAAG,UAAA;AAAA,MACH,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA4E;AACxF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC/C,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,YAAA,CACJ,KAAA,GAAsC,EAAC,EACD;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,eACJ,KAAA,EACyD;AACzD,IAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAgB,GAAG,OAAM,GAAI,KAAA;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,IAAK,SAAA,IAAa,GAAA,CAAA;AAC7C,IAAA,MAAM,eAAe,cAAA,IAAkB,GAAA;AAEvC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,QAAQ,YAAA,CAAa;AAAA,QAClD,GAAG,KAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,EAAW;AAC5B,QAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,MAClB;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,SAAA,EAAW;AAC3B,QAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,MAAM,YAAY,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,gBACJ,KAAA,EACyD;AACzD,IAAA,OAAO,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,WAAA,CACJ,KAAA,GAAqC,EAAC,EACa;AACnD,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAA,CAAK,MAAM,KAAK,OAAA,CAAQ,SAAA,EAAU,EAAG,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AAC3F,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,IAAK,MAAM,SAAA,IAAa,GAAA,CAAA;AACnD,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,IAAkB,GAAA;AAE/C,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,QAAQ,SAAA,EAAU;AAC/C,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACjC,QAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AAC9B,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,MAAM,aAAA,KAAkB,MAAA,IAAa,IAAA,CAAK,aAAA,KAAkB,MAAM,aAAA,EAAe;AACnF,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,IAAa,CAAC,KAAK,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA,EAAG;AAC5E,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,SAAA,EAAW;AAC3B,QAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,MACzC;AACA,MAAA,MAAM,MAAM,cAAc,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,KAAA,EAAyE;AACzF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,gBACJ,KAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,KAAA,EAAyE;AACzF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,aAAa,KAAA,EAA2E;AAC5F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,eAAA,CACJ,KAAA,GAAyC,EAAC,EACD;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,aAAa,KAAA,EAA2E;AAC5F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,qBACJ,KAAA,EAC8C;AAC9C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,KAAK,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,kBACJ,KAAA,EAC2C;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,cAAc,KAAA,EAA6E;AAC/F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,cAAc,KAAA,EAA6E;AAC/F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,kBACJ,KAAA,EAC2C;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,mBAAA,CACJ,KAAA,GAA4C,EAAC,EACD;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,oBACJ,KAAA,EAC6C;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,mBACJ,KAAA,EAC4C;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,eACJ,KAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,gBACJ,KAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,kBACJ,KAAA,EAC2C;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,YAAA,CACJ,KAAA,GAAsC,EAAC,EACD;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,cAAA,CACJ,KAAA,GAAwC,EAAC,EACD;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,aAAa,KAAA,EAA2E;AAC5F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,eACJ,KAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,kBACJ,KAAA,EAC2C;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,cAAc,KAAA,EAA6E;AAC/F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,aAAa,KAAA,EAA2E;AAC5F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,GAA+C,EAAC,EACd;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,kBAAA,CACJ,KAAA,GAGI,EAAC,EACqB;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAmE;AACxF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAmE;AACxF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,eAAe,KAAA,EAAiE;AACpF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,gBAAA,CACJ,KAAA,GAAwC,EAAC,EACC;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAiE;AACrF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,KAAA,EAAyD;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,cAAc,KAAA,EAA+D;AACjF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,UAAU,KAAA,EAAuD;AACrE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,eAAA,CACJ,KAAA,GAAuC,EAAC,EACC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,WAAA,CAAY,KAAA,GAAmC,EAAC,EAAwC;AAC5F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,cAAc,KAAA,EAA2E;AAC7F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,UAAU,KAAA,EAAmE;AACjF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,GAAiC,EAAC,EAAoC;AAC/F,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MAC1B,GAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,KAAA,EAAuE;AACtF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,KAAA,EAAmE;AAC7E,IAAA,OAAO,IAAA,CAAK,kCAAA,CAAmC,OAAO,CAAA,CAAE,MAAM,KAAK,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,gBACJ,KAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,kCAAA,CAAmC,iBAAiB,CAAA,CAAE,gBAAgB,KAAK,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,gBACJ,KAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,KAAA,GAA8C;AAClD,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,cAAc,OAAA,EAAS;AAC9B,MAAA,MAAM,KAAK,KAAA,EAAM;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,uBAAA,CAAwB,IAAA,CAAK,OAAO,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,OAAe,WAAA,CACb,OAAA,EACA,SAAA,EACW;AACX,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,UAAA,CAAU,SAAS,CAAA;AAClD,IAAA,QAAA,CAAS,OAAA,GAAU,OAAA;AACnB,IAAA,QAAA,CAAS,SAAA,GAAY,SAAA;AACrB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,mCACN,MAAA,EACyB;AACzB,IAAA,IAAI,IAAA,CAAK,mBAAmB,uBAAA,EAAyB;AACnD,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,iDAAA,CAAmD,CAAA;AAAA,EAC9E;AACF;AAEA,SAAS,+BAA+B,KAAA,EAAwC;AAC9E,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,IAAa,KAAA,CAAM,YAAY,MAAA,IAAa,KAAA,CAAM,SAAS,MAAA,EAAW;AAC1F,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OAAA,EAC2C;AAC3C,EAAA,OAAO,YAAA,IAAgB,OAAA;AACzB;AAEA,SAAS,uBAAuB,KAAA,EAI9B;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,KAAY,MAAA;AACrC,EAAA,MAAM,WAAA,GAAc,MAAM,QAAA,KAAa,MAAA;AACvC,EAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,SAAS,KAAA,CAAM;AAAA,OACjB;AAAA,MACA,GAAI,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAC,GAAI,EAAE,oBAAA,EAAsB,KAAA,CAAM,WAAA,EAAY;AAAA,MACrF,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,KAC3E;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,UAAU,KAAA,CAAM;AAAA,OAClB;AAAA,MACA,GAAI,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAC,GAAI,EAAE,oBAAA,EAAsB,KAAA,CAAM,WAAA,EAAY;AAAA,MACrF,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,KAC3E;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,aAAa,KAAA,CAAM;AAAA,KACrB;AAAA,IACA,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA;AAAW,GAC3E;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACzsBO,SAAS,kBAAkB,KAAA,EAOpB;AACZ,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AAC/E,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,EAAA;AACzB,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,GAAA;AACrC,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAO,UAAA,GAAa,GAAA,GAAQ,GAAG,CAAC,CAAA;AACpE,EAAA,MAAM,SAAS,QAAA,KAAa,CAAA,GAAI,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAE,GAAI,EAAE,GAAG,CAAC,EAAA,GAAK,QAAA,EAAU,CAAA,EAAG,KAAK,QAAA,EAAS;AACvF,EAAA,MAAM,kBAAkB,QAAA,GAAW,SAAA;AACnC,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAG,KAAA,CAAM,KAAA,CAAM,IAAI,EAAA,GAAK,IAAA,GAAO,OAAO,CAAA,GAAI,eAAA;AAAA,IAC1C,GAAG,KAAA,CAAM,KAAA,CAAM,IAAI,EAAA,GAAK,IAAA,GAAO,OAAO,CAAA,GAAI;AAAA,GAC5C;AACA,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,GAAI,KAAK,IAAA,GAAO,MAAA,CAAO,IAAI,eAAA,GAAkB,GAAA;AAAA,IAC5D,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,GAAI,KAAK,IAAA,GAAO,MAAA,CAAO,IAAI,eAAA,GAAkB;AAAA,GAC9D;AAEA,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,UAAA,EAAY,SAAS,CAAA,EAAG;AACnD,IAAA,MAAM,SAAS,KAAA,GAAQ,UAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,YAAY,KAAA,CAAM,KAAA,EAAO,UAAU,QAAA,EAAU,KAAA,CAAM,KAAK,KAAK,CAAA;AAC1E,IAAA,MAAM,QAAQ,KAAA,KAAU,CAAA,IAAK,UAAU,UAAA,GAAa,CAAA,GAAI,gBAAe,GAAI,MAAA;AAC3E,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,KAAA;AAAA,MACvB,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,KAAA;AAAA,MACvB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,UAAU;AAAA,KAClC,CAAA;AAAA,EACH;AACA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,KAAA,EAKpB;AACZ,EAAA,OAAO,iBAAA,CAAkB;AAAA,IACvB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA,EAAW;AAAA,IACzE,GAAI,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAI;AAAA,IACpD,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AAEA,SAAS,WAAA,CACP,KAAA,EACA,QAAA,EACA,QAAA,EACA,KACA,CAAA,EACA;AACA,EAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AACpB,EAAA,OAAO;AAAA,IACL,GACE,OAAA,IAAW,CAAA,GAAI,MAAM,CAAA,GACrB,CAAA,GAAI,WAAW,CAAA,GAAI,CAAA,GAAI,SAAS,CAAA,GAChC,CAAA,GAAI,UAAU,CAAA,IAAK,CAAA,GAAI,SAAS,CAAA,GAChC,CAAA,IAAK,IAAI,GAAA,CAAI,CAAA;AAAA,IACf,GACE,OAAA,IAAW,CAAA,GAAI,MAAM,CAAA,GACrB,CAAA,GAAI,WAAW,CAAA,GAAI,CAAA,GAAI,SAAS,CAAA,GAChC,CAAA,GAAI,UAAU,CAAA,IAAK,CAAA,GAAI,SAAS,CAAA,GAChC,CAAA,IAAK,IAAI,GAAA,CAAI;AAAA,GACjB;AACF;AAEA,SAAS,eAAe,CAAA,EAAmB;AACzC,EAAA,OAAO,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,GAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA;AACxD;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,MAAM,CAAA,EAAG;AACd,IAAA,CAAA,GAAI,KAAK,MAAA,EAAO;AAAA,EAClB;AACA,EAAA,OAAO,MAAM,CAAA,EAAG;AACd,IAAA,CAAA,GAAI,KAAK,MAAA,EAAO;AAAA,EAClB;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/D;;;ACvGO,SAAS,sBAAsB,KAAA,EAKH;AACjC,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,EAAA;AACzC,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,EAAA;AACnC,EAAA,MAAM,qBAAA,GAAwB,MAAM,qBAAA,IAAyB,IAAA;AAE7D,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,IAAI,EAAE,GAAA,CAAI,CAAC,WAAW,KAAA,KAAU;AAC/C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,mBAAmB,UAAA,CAAW,IAAA,CAAK,QAAA,IAAY,EAAE,IAAI,EAAA,GAAK,CAAA;AAChE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,EAAA,GAAK,CAAA;AACpD,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,EAAO,GAAI,wBAAwB,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,CAAA;AACvF,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,EAAO,GAAI,IAAI,CAAA,IAAK,QAAA;AACzC,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,SAAS,IAAA,CAAK,GAAA;AAAA,QACZ,EAAA;AAAA,QACA,KAAK,KAAA,CAAM,WAAA,GAAc,gBAAA,GAAmB,eAAA,GAAkB,aAAa,MAAM;AAAA;AACnF,KACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACnBO,SAAS,sBAAsB,KAAA,EAIpB;AAChB,EAAA,MAAM,UAAA,GACJ,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,GAAI,GAAG,CAAC,CAAA;AAChF,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,EAAA;AACzB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAO,UAAA,GAAa,GAAA,GAAQ,GAAG,CAAC,CAAA;AAChE,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC/C,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,GAAQ,MAAM,CAAA;AAC7C,IAAA,MAAM,eAAA,GAAkB,WAAW,KAAA,CAAM,UAAA;AACzC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,gBAAgB,CAAA;AAAA,MACrD,CAAA,EAAG,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,SAAU,UAAU;AAAA,KAC5C,CAAA;AACD,IAAA,gBAAA,GAAmB,eAAA;AAAA,EACrB;AACA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,OAAO,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA;AACvD","file":"index.js","sourcesContent":["import type {\n OpensteerArtifactReadInput,\n OpensteerArtifactReadOutput,\n CookieRecord,\n OpensteerAddInitScriptInput,\n OpensteerAddInitScriptOutput,\n OpensteerCaptchaSolveInput,\n OpensteerCaptchaSolveOutput,\n OpensteerCaptureScriptsInput,\n OpensteerCaptureScriptsOutput,\n OpensteerGetRecipeInput,\n OpensteerGetAuthRecipeInput,\n OpensteerActionResult,\n OpensteerComputerExecuteInput,\n OpensteerComputerExecuteOutput,\n OpensteerDomExtractOutput,\n OpensteerGetRequestPlanInput,\n OpensteerInferRequestPlanInput,\n OpensteerListRecipesInput,\n OpensteerListRecipesOutput,\n OpensteerListAuthRecipesInput,\n OpensteerListAuthRecipesOutput,\n OpensteerNetworkClearInput,\n OpensteerNetworkClearOutput,\n OpensteerNetworkDiffInput,\n OpensteerNetworkDiffOutput,\n OpensteerNetworkMinimizeInput,\n OpensteerNetworkMinimizeOutput,\n OpensteerNetworkQueryInput,\n OpensteerNetworkQueryOutput,\n OpensteerNetworkSaveInput,\n OpensteerNetworkSaveOutput,\n OpensteerInteractionCaptureInput,\n OpensteerInteractionCaptureOutput,\n OpensteerInteractionDiffInput,\n OpensteerInteractionDiffOutput,\n OpensteerInteractionGetInput,\n OpensteerInteractionGetOutput,\n OpensteerInteractionReplayInput,\n OpensteerInteractionReplayOutput,\n OpensteerPageActivateInput,\n OpensteerPageActivateOutput,\n OpensteerPageCloseInput,\n OpensteerPageCloseOutput,\n OpensteerPageEvaluateInput,\n OpensteerPageEvaluateOutput,\n OpensteerPageGotoInput,\n OpensteerPageGotoOutput,\n OpensteerPageListInput,\n OpensteerPageListOutput,\n OpensteerPageNewInput,\n OpensteerPageNewOutput,\n OpensteerPageSnapshotOutput,\n OpensteerListRequestPlansInput,\n OpensteerListRequestPlansOutput,\n OpensteerRawRequestInput,\n OpensteerRawRequestOutput,\n OpensteerRequestExecuteInput,\n OpensteerRequestExecuteOutput,\n OpensteerRunRecipeInput,\n OpensteerRunRecipeOutput,\n OpensteerRunAuthRecipeInput,\n OpensteerRunAuthRecipeOutput,\n OpensteerScriptBeautifyInput,\n OpensteerScriptBeautifyOutput,\n OpensteerScriptDeobfuscateInput,\n OpensteerScriptDeobfuscateOutput,\n OpensteerScriptSandboxInput,\n OpensteerScriptSandboxOutput,\n OpensteerReverseExportInput,\n OpensteerReverseExportOutput,\n OpensteerReverseDiscoverInput,\n OpensteerReverseDiscoverOutput,\n OpensteerReverseQueryInput,\n OpensteerReverseQueryOutput,\n OpensteerReversePackageCreateInput,\n OpensteerReversePackageCreateOutput,\n OpensteerReversePackageGetInput,\n OpensteerReversePackageGetOutput,\n OpensteerReversePackageListInput,\n OpensteerReversePackageListOutput,\n OpensteerReversePackagePatchInput,\n OpensteerReversePackagePatchOutput,\n OpensteerReversePackageRunInput,\n OpensteerReversePackageRunOutput,\n OpensteerReverseReportInput,\n OpensteerReverseReportOutput,\n OpensteerSessionCloseOutput,\n OpensteerSessionOpenInput,\n OpensteerSessionOpenOutput,\n OpensteerSnapshotMode,\n OpensteerTargetInput,\n OpensteerTransportProbeInput,\n OpensteerTransportProbeOutput,\n OpensteerWriteRecipeInput,\n OpensteerWriteAuthRecipeInput,\n OpensteerWriteRequestPlanInput,\n StorageSnapshot,\n} from \"@opensteer/protocol\";\n\nimport type { AuthRecipeRecord, RecipeRecord, RequestPlanRecord } from \"../registry.js\";\nimport { AttachedOpensteerSessionProxy } from \"../session-service/attached-session-proxy.js\";\nimport type {\n OpensteerDisconnectableRuntime,\n OpensteerSemanticRuntime,\n} from \"./semantic-runtime.js\";\nimport { OpensteerSessionRuntime, type OpensteerRuntimeOptions } from \"./runtime.js\";\nimport type {\n OpensteerInterceptScriptOptions,\n OpensteerRouteOptions,\n OpensteerRouteRegistration,\n} from \"./instrumentation.js\";\nimport {\n createOpensteerSemanticRuntime,\n type OpensteerCloudOptions,\n} from \"./runtime-resolution.js\";\n\nexport interface OpensteerTargetOptions {\n readonly element?: number;\n readonly selector?: string;\n readonly description?: string;\n readonly networkTag?: string;\n}\n\nexport interface OpensteerInputOptions extends OpensteerTargetOptions {\n readonly text: string;\n readonly pressEnter?: boolean;\n}\n\nexport interface OpensteerScrollOptions extends OpensteerTargetOptions {\n readonly direction: \"up\" | \"down\" | \"left\" | \"right\";\n readonly amount: number;\n}\n\nexport interface OpensteerExtractOptions {\n readonly description: string;\n readonly schema?: Record<string, unknown>;\n}\n\nexport interface OpensteerWaitForNetworkOptions extends OpensteerNetworkQueryInput {\n readonly timeoutMs?: number;\n readonly pollIntervalMs?: number;\n}\n\nexport interface OpensteerWaitForPageOptions {\n readonly openerPageRef?: string;\n readonly urlIncludes?: string;\n readonly timeoutMs?: number;\n readonly pollIntervalMs?: number;\n}\n\nexport type OpensteerGotoOptions = OpensteerPageGotoInput;\n\nexport type OpensteerComputerExecuteOptions = OpensteerComputerExecuteInput;\nexport type OpensteerComputerExecuteResult = OpensteerComputerExecuteOutput;\nexport type OpensteerNetworkQueryOptions = OpensteerNetworkQueryInput;\nexport type OpensteerNetworkQueryResult = OpensteerNetworkQueryOutput;\nexport type OpensteerNetworkSaveOptions = OpensteerNetworkSaveInput;\nexport type OpensteerNetworkSaveResult = OpensteerNetworkSaveOutput;\nexport type OpensteerNetworkMinimizeOptions = OpensteerNetworkMinimizeInput;\nexport type OpensteerNetworkMinimizeResult = OpensteerNetworkMinimizeOutput;\nexport type OpensteerNetworkDiffOptions = OpensteerNetworkDiffInput;\nexport type OpensteerNetworkDiffResult = OpensteerNetworkDiffOutput;\nexport type OpensteerNetworkProbeOptions = OpensteerTransportProbeInput;\nexport type OpensteerNetworkProbeResult = OpensteerTransportProbeOutput;\nexport type OpensteerReverseDiscoverOptions = OpensteerReverseDiscoverInput;\nexport type OpensteerReverseDiscoverResult = OpensteerReverseDiscoverOutput;\nexport type OpensteerReverseQueryOptions = OpensteerReverseQueryInput;\nexport type OpensteerReverseQueryResult = OpensteerReverseQueryOutput;\nexport type OpensteerReversePackageCreateOptions = OpensteerReversePackageCreateInput;\nexport type OpensteerReversePackageCreateResult = OpensteerReversePackageCreateOutput;\nexport type OpensteerReversePackageRunOptions = OpensteerReversePackageRunInput;\nexport type OpensteerReversePackageRunResult = OpensteerReversePackageRunOutput;\nexport type OpensteerReverseExportOptions = OpensteerReverseExportInput;\nexport type OpensteerReverseExportResult = OpensteerReverseExportOutput;\nexport type OpensteerReverseReportOptions = OpensteerReverseReportInput;\nexport type OpensteerReverseReportResult = OpensteerReverseReportOutput;\nexport type OpensteerReversePackageGetOptions = OpensteerReversePackageGetInput;\nexport type OpensteerReversePackageGetResult = OpensteerReversePackageGetOutput;\nexport type OpensteerReversePackageListOptions = OpensteerReversePackageListInput;\nexport type OpensteerReversePackageListResult = OpensteerReversePackageListOutput;\nexport type OpensteerReversePackagePatchOptions = OpensteerReversePackagePatchInput;\nexport type OpensteerReversePackagePatchResult = OpensteerReversePackagePatchOutput;\nexport type OpensteerInteractionCaptureOptions = OpensteerInteractionCaptureInput;\nexport type OpensteerInteractionCaptureResult = OpensteerInteractionCaptureOutput;\nexport type OpensteerInteractionGetOptions = OpensteerInteractionGetInput;\nexport type OpensteerInteractionGetResult = OpensteerInteractionGetOutput;\nexport type OpensteerInteractionDiffOptions = OpensteerInteractionDiffInput;\nexport type OpensteerInteractionDiffResult = OpensteerInteractionDiffOutput;\nexport type OpensteerInteractionReplayOptions = OpensteerInteractionReplayInput;\nexport type OpensteerInteractionReplayResult = OpensteerInteractionReplayOutput;\nexport type OpensteerNetworkClearOptions = OpensteerNetworkClearInput;\nexport type OpensteerNetworkClearResult = OpensteerNetworkClearOutput;\nexport type OpensteerRawRequestOptions = OpensteerRawRequestInput;\nexport type OpensteerRawRequestResult = OpensteerRawRequestOutput;\nexport type OpensteerRequestOptions = Omit<OpensteerRequestExecuteInput, \"key\">;\nexport type OpensteerRequestResult = OpensteerRequestExecuteOutput;\nexport type OpensteerCaptureScriptsOptions = OpensteerCaptureScriptsInput;\nexport type OpensteerCaptureScriptsResult = OpensteerCaptureScriptsOutput;\nexport type OpensteerScriptBeautifyOptions = OpensteerScriptBeautifyInput;\nexport type OpensteerScriptBeautifyResult = OpensteerScriptBeautifyOutput;\nexport type OpensteerScriptDeobfuscateOptions = OpensteerScriptDeobfuscateInput;\nexport type OpensteerScriptDeobfuscateResult = OpensteerScriptDeobfuscateOutput;\nexport type OpensteerScriptSandboxOptions = OpensteerScriptSandboxInput;\nexport type OpensteerScriptSandboxResult = OpensteerScriptSandboxOutput;\nexport type OpensteerArtifactReadOptions = OpensteerArtifactReadInput;\nexport type OpensteerArtifactReadResult = OpensteerArtifactReadOutput;\nexport type OpensteerCaptchaSolveOptions = OpensteerCaptchaSolveInput;\nexport type OpensteerCaptchaSolveResult = OpensteerCaptchaSolveOutput;\nexport type OpensteerAddInitScriptOptions = OpensteerAddInitScriptInput;\n\nexport interface OpensteerOptions extends OpensteerRuntimeOptions {\n readonly cloud?: boolean | OpensteerCloudOptions;\n}\n\nexport interface OpensteerAttachOptions {\n readonly name?: string;\n readonly rootDir?: string;\n}\n\nexport class Opensteer {\n private runtime!: OpensteerSemanticRuntime;\n private ownership!: \"owned\" | \"attached\";\n\n constructor(options: OpensteerOptions = {}) {\n this.runtime = createOpensteerSemanticRuntime({\n runtimeOptions: options,\n ...(options.cloud === undefined ? {} : { cloud: options.cloud }),\n });\n this.ownership = \"owned\";\n }\n\n static attach(options: OpensteerAttachOptions = {}): Opensteer {\n return Opensteer.fromRuntime(\n new AttachedOpensteerSessionProxy({\n ...(options.name === undefined ? {} : { name: options.name }),\n ...(options.rootDir === undefined ? {} : { rootDir: options.rootDir }),\n }),\n \"attached\",\n );\n }\n\n async open(input: string | OpensteerSessionOpenInput = {}): Promise<OpensteerSessionOpenOutput> {\n const normalized = typeof input === \"string\" ? { url: input } : input;\n if (this.ownership === \"attached\") {\n assertAttachedOpenInputAllowed(normalized);\n }\n\n return this.runtime.open(normalized);\n }\n\n async listPages(input: OpensteerPageListInput = {}): Promise<OpensteerPageListOutput> {\n return this.runtime.listPages(input);\n }\n\n async newPage(input: OpensteerPageNewInput = {}): Promise<OpensteerPageNewOutput> {\n return this.runtime.newPage(input);\n }\n\n async activatePage(input: OpensteerPageActivateInput): Promise<OpensteerPageActivateOutput> {\n return this.runtime.activatePage(input);\n }\n\n async closePage(input: OpensteerPageCloseInput = {}): Promise<OpensteerPageCloseOutput> {\n return this.runtime.closePage(input);\n }\n\n async goto(input: string | OpensteerGotoOptions): Promise<OpensteerPageGotoOutput> {\n return this.runtime.goto(typeof input === \"string\" ? { url: input } : input);\n }\n\n async evaluate(\n input: string | OpensteerPageEvaluateInput,\n ): Promise<OpensteerPageEvaluateOutput[\"value\"]> {\n const normalized =\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input;\n const result = await this.runtime.evaluate(normalized);\n return result.value;\n }\n\n async evaluateJson(\n input: string | OpensteerPageEvaluateInput,\n ): Promise<OpensteerPageEvaluateOutput[\"value\"]> {\n return this.evaluate(input);\n }\n\n async addInitScript(\n input: string | OpensteerAddInitScriptInput,\n ): Promise<OpensteerAddInitScriptOutput> {\n const normalized =\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input;\n return this.runtime.addInitScript(normalized);\n }\n\n async snapshot(\n input: OpensteerSnapshotMode | { readonly mode?: OpensteerSnapshotMode } = {},\n ): Promise<OpensteerPageSnapshotOutput> {\n const mode = typeof input === \"string\" ? input : input.mode;\n return this.runtime.snapshot(mode === undefined ? {} : { mode });\n }\n\n async click(input: OpensteerTargetOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.click(normalized);\n }\n\n async hover(input: OpensteerTargetOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.hover(normalized);\n }\n\n async input(input: OpensteerInputOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.input({\n ...normalized,\n text: input.text,\n ...(input.pressEnter === undefined ? {} : { pressEnter: input.pressEnter }),\n });\n }\n\n async scroll(input: OpensteerScrollOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.scroll({\n ...normalized,\n direction: input.direction,\n amount: input.amount,\n });\n }\n\n async extract(input: OpensteerExtractOptions): Promise<OpensteerDomExtractOutput[\"data\"]> {\n const result = await this.runtime.extract(input);\n return result.data;\n }\n\n async queryNetwork(\n input: OpensteerNetworkQueryOptions = {},\n ): Promise<OpensteerNetworkQueryResult> {\n return this.runtime.queryNetwork(input);\n }\n\n async waitForNetwork(\n input: OpensteerWaitForNetworkOptions,\n ): Promise<OpensteerNetworkQueryResult[\"records\"][number]> {\n const { timeoutMs, pollIntervalMs, ...query } = input;\n const timeoutAt = Date.now() + (timeoutMs ?? 30_000);\n const pollInterval = pollIntervalMs ?? 100;\n\n while (true) {\n const { records } = await this.runtime.queryNetwork({\n ...query,\n limit: 1,\n });\n if (records[0] !== undefined) {\n return records[0];\n }\n if (Date.now() >= timeoutAt) {\n throw new Error(\"waitForNetwork timed out\");\n }\n await delay(pollInterval);\n }\n }\n\n async waitForResponse(\n input: OpensteerWaitForNetworkOptions,\n ): Promise<OpensteerNetworkQueryResult[\"records\"][number]> {\n return this.waitForNetwork(input);\n }\n\n async waitForPage(\n input: OpensteerWaitForPageOptions = {},\n ): Promise<OpensteerPageListOutput[\"pages\"][number]> {\n const baseline = new Set((await this.runtime.listPages()).pages.map((page) => page.pageRef));\n const timeoutAt = Date.now() + (input.timeoutMs ?? 30_000);\n const pollIntervalMs = input.pollIntervalMs ?? 100;\n\n while (true) {\n const { pages } = await this.runtime.listPages();\n const match = pages.find((page) => {\n if (baseline.has(page.pageRef)) {\n return false;\n }\n if (input.openerPageRef !== undefined && page.openerPageRef !== input.openerPageRef) {\n return false;\n }\n if (input.urlIncludes !== undefined && !page.url.includes(input.urlIncludes)) {\n return false;\n }\n return true;\n });\n if (match !== undefined) {\n return match;\n }\n if (Date.now() >= timeoutAt) {\n throw new Error(\"waitForPage timed out\");\n }\n await delay(pollIntervalMs);\n }\n }\n\n async saveNetwork(input: OpensteerNetworkSaveOptions): Promise<OpensteerNetworkSaveResult> {\n return this.runtime.saveNetwork(input);\n }\n\n async minimizeNetwork(\n input: OpensteerNetworkMinimizeOptions,\n ): Promise<OpensteerNetworkMinimizeResult> {\n return this.runtime.minimizeNetwork(input);\n }\n\n async diffNetwork(input: OpensteerNetworkDiffOptions): Promise<OpensteerNetworkDiffResult> {\n return this.runtime.diffNetwork(input);\n }\n\n async probeNetwork(input: OpensteerNetworkProbeOptions): Promise<OpensteerNetworkProbeResult> {\n return this.runtime.probeNetwork(input);\n }\n\n async reverseDiscover(\n input: OpensteerReverseDiscoverOptions = {},\n ): Promise<OpensteerReverseDiscoverResult> {\n return this.runtime.discoverReverse(input);\n }\n\n async reverseQuery(input: OpensteerReverseQueryOptions): Promise<OpensteerReverseQueryResult> {\n return this.runtime.queryReverse(input);\n }\n\n async createReversePackage(\n input: OpensteerReversePackageCreateOptions,\n ): Promise<OpensteerReversePackageCreateResult> {\n return this.runtime.createReversePackage(input);\n }\n\n async runReversePackage(\n input: OpensteerReversePackageRunOptions,\n ): Promise<OpensteerReversePackageRunResult> {\n return this.runtime.runReversePackage(input);\n }\n\n async reverseExport(input: OpensteerReverseExportOptions): Promise<OpensteerReverseExportResult> {\n return this.runtime.exportReverse(input);\n }\n\n async reverseReport(input: OpensteerReverseReportOptions): Promise<OpensteerReverseReportResult> {\n return this.runtime.getReverseReport(input);\n }\n\n async getReversePackage(\n input: OpensteerReversePackageGetOptions,\n ): Promise<OpensteerReversePackageGetResult> {\n return this.runtime.getReversePackage(input);\n }\n\n async listReversePackages(\n input: OpensteerReversePackageListOptions = {},\n ): Promise<OpensteerReversePackageListResult> {\n return this.runtime.listReversePackages(input);\n }\n\n async patchReversePackage(\n input: OpensteerReversePackagePatchOptions,\n ): Promise<OpensteerReversePackagePatchResult> {\n return this.runtime.patchReversePackage(input);\n }\n\n async interactionCapture(\n input: OpensteerInteractionCaptureOptions,\n ): Promise<OpensteerInteractionCaptureResult> {\n return this.runtime.captureInteraction(input);\n }\n\n async getInteraction(\n input: OpensteerInteractionGetOptions,\n ): Promise<OpensteerInteractionGetResult> {\n return this.runtime.getInteraction(input);\n }\n\n async interactionDiff(\n input: OpensteerInteractionDiffOptions,\n ): Promise<OpensteerInteractionDiffResult> {\n return this.runtime.diffInteraction(input);\n }\n\n async interactionReplay(\n input: OpensteerInteractionReplayOptions,\n ): Promise<OpensteerInteractionReplayResult> {\n return this.runtime.replayInteraction(input);\n }\n\n async clearNetwork(\n input: OpensteerNetworkClearOptions = {},\n ): Promise<OpensteerNetworkClearResult> {\n return this.runtime.clearNetwork(input);\n }\n\n async captureScripts(\n input: OpensteerCaptureScriptsOptions = {},\n ): Promise<OpensteerCaptureScriptsResult> {\n return this.runtime.captureScripts(input);\n }\n\n async readArtifact(input: OpensteerArtifactReadOptions): Promise<OpensteerArtifactReadResult> {\n return this.runtime.readArtifact(input);\n }\n\n async beautifyScript(\n input: OpensteerScriptBeautifyOptions,\n ): Promise<OpensteerScriptBeautifyResult> {\n return this.runtime.beautifyScript(input);\n }\n\n async deobfuscateScript(\n input: OpensteerScriptDeobfuscateOptions,\n ): Promise<OpensteerScriptDeobfuscateResult> {\n return this.runtime.deobfuscateScript(input);\n }\n\n async sandboxScript(input: OpensteerScriptSandboxOptions): Promise<OpensteerScriptSandboxResult> {\n return this.runtime.sandboxScript(input);\n }\n\n async solveCaptcha(input: OpensteerCaptchaSolveOptions): Promise<OpensteerCaptchaSolveResult> {\n return this.runtime.solveCaptcha(input);\n }\n\n async getCookies(\n input: { readonly urls?: readonly string[] } = {},\n ): Promise<readonly CookieRecord[]> {\n return this.runtime.getCookies(input);\n }\n\n async getStorageSnapshot(\n input: {\n readonly includeSessionStorage?: boolean;\n readonly includeIndexedDb?: boolean;\n } = {},\n ): Promise<StorageSnapshot> {\n return this.runtime.getStorageSnapshot(input);\n }\n\n async writeRequestPlan(input: OpensteerWriteRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.writeRequestPlan(input);\n }\n\n async inferRequestPlan(input: OpensteerInferRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.inferRequestPlan(input);\n }\n\n async getRequestPlan(input: OpensteerGetRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.getRequestPlan(input);\n }\n\n async listRequestPlans(\n input: OpensteerListRequestPlansInput = {},\n ): Promise<OpensteerListRequestPlansOutput> {\n return this.runtime.listRequestPlans(input);\n }\n\n async writeAuthRecipe(input: OpensteerWriteAuthRecipeInput): Promise<AuthRecipeRecord> {\n return this.runtime.writeAuthRecipe(input);\n }\n\n async writeRecipe(input: OpensteerWriteRecipeInput): Promise<RecipeRecord> {\n return this.runtime.writeRecipe(input);\n }\n\n async getAuthRecipe(input: OpensteerGetAuthRecipeInput): Promise<AuthRecipeRecord> {\n return this.runtime.getAuthRecipe(input);\n }\n\n async getRecipe(input: OpensteerGetRecipeInput): Promise<RecipeRecord> {\n return this.runtime.getRecipe(input);\n }\n\n async listAuthRecipes(\n input: OpensteerListAuthRecipesInput = {},\n ): Promise<OpensteerListAuthRecipesOutput> {\n return this.runtime.listAuthRecipes(input);\n }\n\n async listRecipes(input: OpensteerListRecipesInput = {}): Promise<OpensteerListRecipesOutput> {\n return this.runtime.listRecipes(input);\n }\n\n async runAuthRecipe(input: OpensteerRunAuthRecipeInput): Promise<OpensteerRunAuthRecipeOutput> {\n return this.runtime.runAuthRecipe(input);\n }\n\n async runRecipe(input: OpensteerRunRecipeInput): Promise<OpensteerRunRecipeOutput> {\n return this.runtime.runRecipe(input);\n }\n\n async request(key: string, input: OpensteerRequestOptions = {}): Promise<OpensteerRequestResult> {\n return this.runtime.request({\n key,\n ...input,\n });\n }\n\n async rawRequest(input: OpensteerRawRequestOptions): Promise<OpensteerRawRequestResult> {\n return this.runtime.rawRequest(input);\n }\n\n async route(input: OpensteerRouteOptions): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"route\").route(input);\n }\n\n async interceptScript(\n input: OpensteerInterceptScriptOptions,\n ): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"interceptScript\").interceptScript(input);\n }\n\n async computerExecute(\n input: OpensteerComputerExecuteOptions,\n ): Promise<OpensteerComputerExecuteResult> {\n return this.runtime.computerExecute(input);\n }\n\n async close(): Promise<OpensteerSessionCloseOutput> {\n return this.runtime.close();\n }\n\n async disconnect(): Promise<void> {\n if (this.ownership === \"owned\") {\n await this.close();\n return;\n }\n\n if (isDisconnectableRuntime(this.runtime)) {\n await this.runtime.disconnect();\n }\n }\n\n private static fromRuntime(\n runtime: OpensteerSemanticRuntime,\n ownership: \"owned\" | \"attached\",\n ): Opensteer {\n const instance = Object.create(Opensteer.prototype) as Opensteer;\n instance.runtime = runtime;\n instance.ownership = ownership;\n return instance;\n }\n\n private requireOwnedInstrumentationRuntime(\n method: \"route\" | \"interceptScript\",\n ): OpensteerSessionRuntime {\n if (this.runtime instanceof OpensteerSessionRuntime) {\n return this.runtime;\n }\n throw new Error(`${method}() is only available on owned local SDK sessions.`);\n }\n}\n\nfunction assertAttachedOpenInputAllowed(input: OpensteerSessionOpenInput): void {\n if (input.browser !== undefined || input.context !== undefined || input.name !== undefined) {\n throw new Error(\n \"Opensteer.attach(...) reuses an existing session. open() may only receive url when attached.\",\n );\n }\n}\n\nfunction isDisconnectableRuntime(\n runtime: OpensteerSemanticRuntime,\n): runtime is OpensteerDisconnectableRuntime {\n return \"disconnect\" in runtime;\n}\n\nfunction normalizeTargetOptions(input: OpensteerTargetOptions): {\n readonly target: OpensteerTargetInput;\n readonly persistAsDescription?: string;\n readonly networkTag?: string;\n} {\n const hasElement = input.element !== undefined;\n const hasSelector = input.selector !== undefined;\n if (hasElement && hasSelector) {\n throw new Error(\"Specify exactly one of element, selector, or description.\");\n }\n\n if (hasElement) {\n return {\n target: {\n kind: \"element\",\n element: input.element!,\n },\n ...(input.description === undefined ? {} : { persistAsDescription: input.description }),\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n }\n\n if (hasSelector) {\n return {\n target: {\n kind: \"selector\",\n selector: input.selector!,\n },\n ...(input.description === undefined ? {} : { persistAsDescription: input.description }),\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n }\n\n if (input.description === undefined) {\n throw new Error(\"Specify exactly one of element, selector, or description.\");\n }\n\n return {\n target: {\n kind: \"description\",\n description: input.description,\n },\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export interface MousePathPoint {\n readonly x: number;\n readonly y: number;\n readonly t: number;\n}\n\nexport interface MousePath {\n readonly points: readonly MousePathPoint[];\n readonly durationMs: number;\n}\n\nexport function generateMousePath(input: {\n readonly start: { readonly x: number; readonly y: number };\n readonly end: { readonly x: number; readonly y: number };\n readonly durationMs?: number;\n readonly fps?: number;\n readonly jitter?: number;\n readonly curvature?: number;\n}): MousePath {\n const dx = input.end.x - input.start.x;\n const dy = input.end.y - input.start.y;\n const distance = Math.hypot(dx, dy);\n const durationMs = input.durationMs ?? Math.max(180, Math.round(distance * 2.2));\n const fps = input.fps ?? 60;\n const jitter = input.jitter ?? 3;\n const curvature = input.curvature ?? 0.3;\n const frameCount = Math.max(2, Math.round((durationMs / 1000) * fps));\n const normal = distance === 0 ? { x: 0, y: 1 } : { x: -dy / distance, y: dx / distance };\n const controlDistance = distance * curvature;\n const control1 = {\n x: input.start.x + dx * 0.33 + normal.x * controlDistance,\n y: input.start.y + dy * 0.33 + normal.y * controlDistance,\n };\n const control2 = {\n x: input.start.x + dx * 0.66 - normal.x * controlDistance * 0.6,\n y: input.start.y + dy * 0.66 - normal.y * controlDistance * 0.6,\n };\n\n const points: MousePathPoint[] = [];\n for (let index = 0; index <= frameCount; index += 1) {\n const linear = index / frameCount;\n const eased = easeInOutCubic(linear);\n const base = cubicBezier(input.start, control1, control2, input.end, eased);\n const noise = index === 0 || index === frameCount ? 0 : gaussianRandom() * jitter;\n points.push({\n x: base.x + normal.x * noise,\n y: base.y + normal.y * noise,\n t: Math.round(linear * durationMs),\n });\n }\n return {\n points,\n durationMs,\n };\n}\n\nexport function generateDragTrail(input: {\n readonly start: { readonly x: number; readonly y: number };\n readonly end: { readonly x: number; readonly y: number };\n readonly durationMs?: number;\n readonly fps?: number;\n}): MousePath {\n return generateMousePath({\n start: input.start,\n end: input.end,\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n ...(input.fps === undefined ? {} : { fps: input.fps }),\n jitter: 1.5,\n curvature: 0.18,\n });\n}\n\nfunction cubicBezier(\n start: { readonly x: number; readonly y: number },\n control1: { readonly x: number; readonly y: number },\n control2: { readonly x: number; readonly y: number },\n end: { readonly x: number; readonly y: number },\n t: number,\n) {\n const inverse = 1 - t;\n return {\n x:\n inverse ** 3 * start.x +\n 3 * inverse ** 2 * t * control1.x +\n 3 * inverse * t ** 2 * control2.x +\n t ** 3 * end.x,\n y:\n inverse ** 3 * start.y +\n 3 * inverse ** 2 * t * control1.y +\n 3 * inverse * t ** 2 * control2.y +\n t ** 3 * end.y,\n };\n}\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2;\n}\n\nfunction gaussianRandom(): number {\n let u = 0;\n let v = 0;\n while (u === 0) {\n u = Math.random();\n }\n while (v === 0) {\n v = Math.random();\n }\n return Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n}\n","export interface TypingCadenceSample {\n readonly character: string;\n readonly delayMs: number;\n}\n\nexport function generateTypingCadence(input: {\n readonly text: string;\n readonly baseDelayMs?: number;\n readonly jitterMs?: number;\n readonly hesitationProbability?: number;\n}): readonly TypingCadenceSample[] {\n const baseDelayMs = input.baseDelayMs ?? 75;\n const jitterMs = input.jitterMs ?? 35;\n const hesitationProbability = input.hesitationProbability ?? 0.08;\n\n return [...input.text].map((character, index) => {\n const previous = input.text[index - 1];\n const punctuationPause = /[.,!?;:]/.test(previous ?? \"\") ? 90 : 0;\n const whitespacePause = /\\s/.test(character) ? 30 : 0;\n const hesitation = Math.random() < hesitationProbability ? 120 + Math.random() * 180 : 0;\n const jitter = (Math.random() * 2 - 1) * jitterMs;\n return {\n character,\n delayMs: Math.max(\n 10,\n Math.round(baseDelayMs + punctuationPause + whitespacePause + hesitation + jitter),\n ),\n };\n });\n}\n","export interface ScrollPatternPoint {\n readonly deltaY: number;\n readonly t: number;\n}\n\nexport interface ScrollPattern {\n readonly points: readonly ScrollPatternPoint[];\n readonly durationMs: number;\n}\n\nexport function generateScrollPattern(input: {\n readonly distancePx: number;\n readonly durationMs?: number;\n readonly fps?: number;\n}): ScrollPattern {\n const durationMs =\n input.durationMs ?? Math.max(220, Math.round(Math.abs(input.distancePx) * 0.9));\n const fps = input.fps ?? 60;\n const frames = Math.max(2, Math.round((durationMs / 1000) * fps));\n let previousDistance = 0;\n const points: ScrollPatternPoint[] = [];\n for (let index = 0; index <= frames; index += 1) {\n const progress = easeInOutQuad(index / frames);\n const currentDistance = progress * input.distancePx;\n points.push({\n deltaY: Math.round(currentDistance - previousDistance),\n t: Math.round((index / frames) * durationMs),\n });\n previousDistance = currentDistance;\n }\n return {\n points,\n durationMs,\n };\n}\n\nfunction easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;\n}\n"]}
package/package.json CHANGED
@@ -1,86 +1,82 @@
1
1
  {
2
2
  "name": "opensteer",
3
- "version": "0.6.13",
4
- "description": "Open-source browser automation SDK and CLI that lets AI agents build complex scrapers directly in your codebase.",
3
+ "version": "0.7.1",
4
+ "description": "Opensteer browser automation, replay, and reverse-engineering toolkit.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
- "bin": {
8
- "opensteer": "./bin/opensteer.mjs"
7
+ "sideEffects": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/steerlabs/opensteer.git",
11
+ "directory": "packages/opensteer"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/steerlabs/opensteer/issues"
15
+ },
16
+ "homepage": "https://github.com/steerlabs/opensteer/tree/main/packages/opensteer#readme",
17
+ "keywords": [
18
+ "browser-automation",
19
+ "playwright",
20
+ "web-automation",
21
+ "agents",
22
+ "scraping",
23
+ "reverse-engineering"
24
+ ],
25
+ "engines": {
26
+ "node": ">=22"
9
27
  },
10
28
  "main": "./dist/index.cjs",
11
29
  "module": "./dist/index.js",
12
30
  "types": "./dist/index.d.ts",
31
+ "bin": {
32
+ "opensteer": "./dist/cli/bin.js"
33
+ },
13
34
  "exports": {
14
35
  ".": {
15
- "types": "./dist/index.d.ts",
16
- "import": "./dist/index.js",
17
- "require": "./dist/index.cjs"
36
+ "import": {
37
+ "types": "./dist/index.d.ts",
38
+ "default": "./dist/index.js"
39
+ },
40
+ "require": {
41
+ "types": "./dist/index.d.cts",
42
+ "default": "./dist/index.cjs"
43
+ }
18
44
  }
19
45
  },
20
46
  "files": [
21
47
  "dist",
22
- "bin",
23
- "skills",
24
- "README.md",
25
- "LICENSE",
26
- "CHANGELOG.md"
48
+ "skills"
27
49
  ],
28
50
  "dependencies": {
29
- "@ai-sdk/anthropic": "^3.0.46",
30
- "@ai-sdk/google": "^3.0.30",
31
- "@ai-sdk/groq": "^3.0.24",
32
- "@ai-sdk/openai": "^3.0.26",
33
- "@ai-sdk/xai": "^3.0.57",
34
- "@anthropic-ai/sdk": "^0.57.0",
35
- "@google/genai": "^1.10.0",
36
- "ai": "^6.0.77",
37
- "cheerio": "^1.0.0-rc.12",
38
- "dotenv": "^17.2.4",
39
- "open": "^11.0.0",
40
- "openai": "^6.25.0",
41
- "playwright": "^1.50.0",
42
- "skills": "1.4.3",
43
- "ws": "^8.18.0",
44
- "zod": "^4.3.6"
45
- },
46
- "devDependencies": {
47
- "@types/node": "^22.10.0",
48
- "@types/ws": "^8.5.13",
51
+ "@modelcontextprotocol/sdk": "^1.27.1",
52
+ "cheerio": "^1.1.2",
53
+ "css-select": "^6.0.0",
49
54
  "domhandler": "^5.0.3",
50
- "tsup": "^8.0.1",
51
- "typescript": "^5.6.3",
52
- "vite": "^7.3.1",
53
- "vitest": "^2.1.8"
55
+ "prettier": "^3.8.1",
56
+ "sharp": "^0.34.5",
57
+ "skills": "^1.4.6",
58
+ "@opensteer/engine-playwright": "0.7.0"
54
59
  },
55
- "engines": {
56
- "node": ">=20"
60
+ "optionalDependencies": {
61
+ "webcrack": "^2.15.1"
57
62
  },
58
- "keywords": [
59
- "browser-automation",
60
- "selectors",
61
- "playwright",
62
- "llm",
63
- "agents"
64
- ],
65
- "repository": {
66
- "type": "git",
67
- "url": "https://github.com/steerlabs/opensteer"
63
+ "peerDependencies": {
64
+ "@opensteer/engine-abp": "0.7.0"
68
65
  },
69
- "homepage": "https://opensteer.com",
70
- "bugs": {
71
- "url": "https://github.com/steerlabs/opensteer/issues"
66
+ "peerDependenciesMeta": {
67
+ "@opensteer/engine-abp": {
68
+ "optional": true
69
+ }
70
+ },
71
+ "devDependencies": {
72
+ "@opensteer/cloud-contracts": "0.7.0",
73
+ "@opensteer/engine-abp": "0.7.0",
74
+ "@opensteer/protocol": "0.7.0",
75
+ "@opensteer/browser-core": "0.7.0"
72
76
  },
73
77
  "scripts": {
74
- "build": "tsup src/index.ts src/cli/server.ts src/cli/skills-installer.ts src/cli/profile.ts src/cli/auth.ts src/cli/local-profile.ts --dts --format esm,cjs --clean --external ai --external zod --external @ai-sdk/openai --external @ai-sdk/anthropic --external @ai-sdk/google --external @ai-sdk/xai --external @ai-sdk/groq --external openai --external @anthropic-ai/sdk --external @google/genai",
75
- "test": "vitest run",
76
- "test:live-web": "vitest run --config vitest.live-web.config.ts",
77
- "test:unit": "vitest run tests/html tests/element-path tests/config.test.ts tests/storage",
78
- "test:actions": "vitest run tests/actions",
79
- "test:integration": "vitest run tests/integration",
80
- "test:ai": "vitest run tests/ai tests/e2e/ai-resolve.test.ts tests/e2e/ai-extract-products.test.ts",
81
- "test:e2e": "vitest run tests/e2e",
82
- "test:e2e:cua": "vitest run tests/e2e/cua-agent.test.ts",
83
- "test:app:dev": "npm --prefix tests/test-app run dev",
84
- "typecheck": "tsc -p tsconfig.json --noEmit"
78
+ "build": "tsup && node ../../scripts/sync-package-skills.mjs",
79
+ "clean": "rimraf dist skills",
80
+ "typecheck": "tsc --noEmit -p tsconfig.json"
85
81
  }
86
82
  }
package/skills/README.md CHANGED
@@ -1,29 +1,30 @@
1
1
  # Opensteer Skills
2
2
 
3
- This directory contains Opensteer-maintained skill packs.
3
+ First-party Opensteer skills published from this repository for agents that use the upstream [`skills`](https://skills.sh) ecosystem.
4
4
 
5
- ## Layout
5
+ ## Install
6
6
 
7
- Use this structure for each skill:
8
-
9
- ```text
10
- skills/<skill-name>/
11
- SKILL.md
12
- references/
13
- *.md
14
- templates/
15
- *
7
+ ```bash
8
+ opensteer skills install
16
9
  ```
17
10
 
18
- ## Conventions
11
+ ## Available Skills
12
+
13
+ - `opensteer`: browser automation, structured extraction, and browser-backed API reverse engineering with the Opensteer CLI and SDK
19
14
 
20
- - Keep one canonical skill per folder (`<skill-name>`).
21
- - Use `SKILL.md` frontmatter with at least `name` and `description`.
22
- - Put detailed instructions in `references/` and link them from `SKILL.md`.
23
- - Put reusable snippets in `templates/` when needed.
24
- - Use relative Markdown links.
15
+ ## Repository Layout
16
+
17
+ ```text
18
+ skills/
19
+ opensteer/
20
+ SKILL.md
21
+ references/
22
+ cli-reference.md
23
+ sdk-reference.md
24
+ request-workflow.md
25
+ ```
25
26
 
26
- ## Built-in Skills
27
+ ## Maintainers
27
28
 
28
- - `opensteer`: [skills/opensteer/SKILL.md](./opensteer/SKILL.md)
29
- - `electron`: [skills/electron/SKILL.md](./electron/SKILL.md)
29
+ - Run `pnpm run skills:check` to verify that the upstream `skills` CLI can discover this repository.
30
+ - Keep each skill self-contained under `skills/<name>/` and keep links relative.
@@ -1,224 +1,90 @@
1
1
  ---
2
2
  name: opensteer
3
- description: "Browser automation, web scraping, and structured data extraction using Opensteer CLI and SDK. Use when the agent needs to: navigate web pages, interact with elements (click, type, select, hover), extract structured data from pages, take snapshots or screenshots, manage browser tabs and cookies, or generate scraper/automation scripts. Also use when the user asks to create a scraper, automation script, or replay a browsing session as code."
3
+ description: "Browser automation, scraping, structured extraction, and browser-backed API reverse engineering with the Opensteer CLI and SDK. Use when a task needs to open pages, interact with elements, capture network traffic, write request plans, or turn a browser workflow into reusable code."
4
4
  ---
5
5
 
6
- # Opensteer Browser Automation
6
+ # Opensteer
7
7
 
8
- **Exploring interactively?** Follow Phase 1.
9
- **Writing a scraper script?** Follow Phase 2.
8
+ Use this skill when a task needs a real browser workflow, structured extraction, or browser-backed replay.
10
9
 
11
- > **SDK Rule**: Every browser action in a script MUST use an `opensteer.*` method. The SDK covers navigation, clicks, hover, input, select, scroll, extraction, text retrieval, HTML retrieval, screenshots, and waits. The correct navigation method is `opensteer.goto()` (not `navigate`).
10
+ Choose the reference that matches the job:
12
11
 
13
- ---
14
-
15
- ## Phase 1 CLI Exploration
16
-
17
- **Step 1 — Set session and open the page.**
18
-
19
- ```bash
20
- export OPENSTEER_SESSION=my-session
21
- opensteer open https://example.com --name "my-scraper"
22
- ```
23
-
24
- The `--name` value is the cache namespace. It must match `name:` in the SDK constructor (Phase 2). Pick a stable name now and do not change it.
25
-
26
- **Step 2 — Snapshot and interact using counters.**
27
-
28
- Use `snapshot action` for interactions. Use `snapshot extraction` for data. Each element in the output has a counter (`c="N"`). Use that number directly.
29
-
30
- ```bash
31
- opensteer snapshot action
32
- opensteer click 3
33
- opensteer input 5 "laptop" --pressEnter
34
- ```
35
-
36
- **Step 3 — Navigate and re-snapshot after every page change.**
37
-
38
- ```bash
39
- opensteer navigate https://example.com/results
40
- opensteer snapshot action
41
- ```
42
-
43
- > Use `opensteer open` once at the start only. Use `opensteer navigate` for all subsequent pages — it includes a visual stability wait that `open` does not.
44
-
45
- **Step 4 — Cache every action and extraction with `--description`.**
46
-
47
- Re-run each action with `--description` added. This writes the resolved selector to the cache so scripts replay without counters.
48
-
49
- ```bash
50
- opensteer click 3 --description "the products link"
51
- opensteer input 5 "laptop" --pressEnter --description "the search input"
52
- ```
53
-
54
- For data, the agent must define the extraction object from the snapshot.
12
+ - CLI exploration: [references/cli-reference.md](references/cli-reference.md)
13
+ - SDK automation: [references/sdk-reference.md](references/sdk-reference.md)
14
+ - Request capture and replay: [references/request-workflow.md](references/request-workflow.md)
55
15
 
56
- - First run `opensteer snapshot extraction` and inspect the counters.
57
- - Decide the exact JSON object the task needs.
58
- - Treat the extraction snapshot as a planning aid only. It is trimmed/filtered, so do not read final values from the snapshot HTML itself.
59
- - Build the full `extract` schema yourself so every leaf field is explicitly bound with `{ element: N }`, `{ element: N, attribute: "..." }`, or `{ source: "current_url" }`.
60
- - Always call `extract` to read the actual field values from the live page/runtime DOM.
61
- - Use `--description` only to cache that extraction for replay. Do not rely on `--description` to tell Opensteer what data to collect.
62
- - For arrays, include at least 2 representative items so Opensteer infers the repeating pattern.
63
- - Do not replace `extract` with custom DOM parsing when the desired output can be expressed as a structured object.
16
+ ## Default Workflow
64
17
 
65
- ```bash
66
- opensteer snapshot extraction
67
- # Decide the full output object first, then bind every leaf field explicitly
68
- opensteer extract '{"images":[{"imageUrl":{"element":11,"attribute":"src"},"alt":{"element":11,"attribute":"alt"},"caption":{"element":14},"credit":{"element":15}},{"imageUrl":{"element":24,"attribute":"src"},"alt":{"element":24,"attribute":"alt"},"caption":{"element":27},"credit":{"element":28}}]}' \
69
- --description "article images with captions and credits"
70
- ```
18
+ 1. Start with the CLI when you need to explore a site, inspect state, or prove the workflow on a real page.
19
+ 2. Re-snapshot after each meaningful page or DOM change before reusing counters.
20
+ 3. Add `--description` when you want selector persistence and later replay.
21
+ 4. Move to the SDK when the workflow should become reusable code in the repository.
22
+ 5. Move to request capture and request plans when the real target is a browser-backed API.
71
23
 
72
- Repeat Step 3 → Step 4 for every distinct page type the scraper will visit.
73
-
74
- **Step 5 — Close when done.**
24
+ ## CLI Exploration
75
25
 
76
26
  ```bash
77
- opensteer close
27
+ opensteer open https://example.com --name my-workflow
28
+ opensteer snapshot action --name my-workflow
29
+ opensteer click 3 --name my-workflow --description "primary button"
30
+ opensteer snapshot extraction --name my-workflow
31
+ opensteer extract --name my-workflow \
32
+ --description "page summary" \
33
+ --schema '{"title":{"selector":"title"},"url":{"source":"current_url"}}'
34
+ opensteer close --name my-workflow
78
35
  ```
79
36
 
80
- > **SDK Rule**: Every browser action in a script MUST use an `opensteer.*` method.
81
-
82
- ---
37
+ Rules:
83
38
 
84
- ## Phase 2 SDK Scraper Script
39
+ - Use `opensteer open` once to create the session, then use `goto`, actions, snapshots, and extraction against the same `--name`.
40
+ - Treat counter targets as snapshot-local. Always take a fresh `snapshot action` before reusing counters after the page changes.
41
+ - Use `snapshot extraction` plus `extract` for structured data. Do not treat snapshot HTML as the final data source.
42
+ - Use `--description` whenever the action or extraction should be replayable later.
85
43
 
86
- Use cached `description` strings (exact match to CLI `--description` values) only after Phase 1 has already established the exact extraction schema from `snapshot extraction`. `name` must match `--name` from Phase 1.
44
+ ## SDK Automation
87
45
 
88
- ```typescript
46
+ ```ts
89
47
  import { Opensteer } from "opensteer";
90
48
 
91
- async function run() {
92
- const opensteer = new Opensteer({
93
- name: "my-scraper", // MUST match --name from Phase 1
94
- storage: { rootDir: process.cwd() },
95
- });
96
-
97
- await opensteer.launch({ headless: false }); // headless: false — many sites block headless
98
-
99
- try {
100
- await opensteer.goto("https://example.com");
49
+ const opensteer = new Opensteer({
50
+ name: "my-workflow",
51
+ rootDir: process.cwd(),
52
+ browser: { headless: true },
53
+ });
101
54
 
102
- await opensteer.input({ description: "the search input", text: "laptop", pressEnter: true });
103
- await opensteer.click({ description: "the products link" });
55
+ try {
56
+ await opensteer.open("https://example.com");
57
+ await opensteer.snapshot("action");
104
58
 
105
- await opensteer.waitForText("Showing results"); // only for page transitions / SPA content
59
+ const data = await opensteer.extract({
60
+ description: "page summary",
61
+ schema: {
62
+ title: { selector: "title" },
63
+ url: { source: "current_url" },
64
+ },
65
+ });
106
66
 
107
- const data = await opensteer.extract({ description: "product listing" });
108
- console.log(JSON.stringify(data, null, 2));
109
- } finally {
110
- await opensteer.close();
111
- }
67
+ console.log(data);
68
+ } finally {
69
+ await opensteer.close();
112
70
  }
113
-
114
- run().catch((err) => { console.error(err); process.exit(1); });
115
- ```
116
-
117
- > **SDK Rule**: Every browser action in a script MUST use an `opensteer.*` method.
118
-
119
- **Before writing a script, verify:**
120
- 1. Every interaction uses `opensteer.click()`, `opensteer.input()`, `opensteer.hover()`, `opensteer.extract()` — not `page.*` equivalents
121
- 2. Every extraction uses `opensteer.extract({ description: "..." })` — not `page.evaluate()` for DOM data
122
- 3. Waits use `opensteer.waitForText()` — not `page.waitForSelector()` (unless no stable text exists)
123
-
124
- **Critical method signatures:**
125
-
126
- ```typescript
127
- await opensteer.goto(url);
128
- await opensteer.goto(url, { timeout: 60000 });
129
-
130
- await opensteer.click({ description: "..." });
131
- await opensteer.input({ description: "...", text: "...", pressEnter: true });
132
- await opensteer.hover({ description: "..." });
133
- await opensteer.select({ description: "...", label: "Option A" });
134
- await opensteer.scroll({ direction: "down", amount: 500 });
135
-
136
- await opensteer.extract({ description: "..." }); // replay from cache
137
- await opensteer.extract({ schema: { title: { element: 3 } }, description: "..." }); // explicit first cache
138
- await opensteer.extract({
139
- description: "article images with captions and credits",
140
- schema: {
141
- images: [
142
- {
143
- imageUrl: { element: 11, attribute: "src" },
144
- alt: { element: 11, attribute: "alt" },
145
- caption: { element: 14 },
146
- credit: { element: 15 },
147
- },
148
- {
149
- imageUrl: { element: 24, attribute: "src" },
150
- alt: { element: 24, attribute: "alt" },
151
- caption: { element: 27 },
152
- credit: { element: 28 },
153
- },
154
- ],
155
- },
156
- }); // first extraction run: agent defines the full object from the snapshot
157
-
158
- await opensteer.waitForText("literal text"); // page-transition wait
159
-
160
- // Do NOT add waits before opensteer actions — they handle waiting internally.
161
71
  ```
162
72
 
163
- Run with: `npx tsx scraper.ts`
164
-
165
- ---
166
-
167
- ## Edge Cases
73
+ Rules:
168
74
 
169
- **Connect to a running browser (CDP):**
170
- ```bash
171
- # Verify CDP is reachable first:
172
- curl -s http://127.0.0.1:9222/json/version
173
-
174
- # Connect (works even if Chrome has zero open tabs):
175
- opensteer open --cdp-url http://localhost:9222 --name "my-scraper"
176
- ```
75
+ - Wrap owned sessions in `try/finally` and call `close()`.
76
+ - Use `Opensteer.attach(...)` plus `disconnect()` when you are attaching to an existing CLI-owned session.
77
+ - Prefer Opensteer methods over raw Playwright calls so actions, extraction, and replay semantics stay inside the product surface.
78
+ - Use `networkTag` on actions when you intend to inspect or promote the network traffic they trigger.
177
79
 
178
- **Real browser mode (your actual Chrome profile):**
179
- ```bash
180
- opensteer open https://example.com --browser real --name "my-scraper" # headless
181
- opensteer open https://example.com --browser real --headed --name "my-scraper" # visible window
182
- opensteer open https://example.com --browser real --profile "Profile 1" --headed # specific profile
183
- ```
184
- `--browser real` clones your local Chrome profile. Defaults to headless — add `--headed` to see the window. Profile cloning takes several seconds; do not assume the command hung.
185
-
186
- **Tab management:**
187
- ```bash
188
- opensteer tabs
189
- opensteer tab-new https://example.com
190
- opensteer tab-switch 0
191
- opensteer tab-close 1
192
- ```
193
-
194
- **Debugging failures (diagnose in this order):**
195
- 1. SPA content not loaded — add `opensteer.waitForText()` before extraction.
196
- 2. Missing cache — re-run Phase 1 caching step for the page type that failed.
197
- 3. Obstacle blocking target — cookie banner, modal, or login wall. Dismiss it first.
198
- 4. Timeout on navigation — increase timeout: `opensteer navigate <url> --timeout 60000`.
199
- 5. CDP connection refused — verify `curl -s http://127.0.0.1:<port>/json/version` returns JSON.
200
- 6. Stale counters — take a fresh `snapshot action` and re-identify elements.
201
-
202
- ### Advanced: Direct Page Access (rare)
203
-
204
- Use `opensteer.page` ONLY for these two patterns. There are no other valid uses.
205
-
206
- **SPA selector guard** — when `waitForText` cannot work (no stable visible text):
207
- ```typescript
208
- await opensteer.page.waitForSelector("css-selector");
209
- ```
210
-
211
- **Internal API call** — site has REST/GraphQL endpoints and you need session cookies:
212
- ```typescript
213
- await opensteer.goto("https://example.com");
214
- const data = await opensteer.page.evaluate(async () => {
215
- const res = await fetch("https://api.example.com/items?limit=100");
216
- return res.json();
217
- });
218
- ```
80
+ ## Request Capture And Replay
219
81
 
220
- These two patterns are the complete list.
82
+ Use Opensteer's reverse-engineering flow when the deliverable is a custom API or a replayable request plan:
221
83
 
222
- > **SDK Rule**: Every browser action in a script MUST use an `opensteer.*` method.
84
+ 1. Perform the browser action that triggers the request.
85
+ 2. Inspect traffic with `queryNetwork()` or `opensteer network query`.
86
+ 3. Retry the request with `rawRequest()` or `opensteer request raw`.
87
+ 4. Promote the captured request with `inferRequestPlan()` or `opensteer plan infer`.
88
+ 5. Replay it with `request()` or `opensteer request execute`.
223
89
 
224
- **Full references:** [cli-reference.md](references/cli-reference.md) | [sdk-reference.md](references/sdk-reference.md)
90
+ Read [references/request-workflow.md](references/request-workflow.md) before implementing request-plan work.