mindwire 0.1.36 → 0.1.40

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 (42) hide show
  1. package/README.md +16 -0
  2. package/dist/{chunk-RTGZDLSG.js → chunk-BJL5K6M7.js} +74 -21
  3. package/dist/chunk-BJL5K6M7.js.map +1 -0
  4. package/dist/chunk-ZP7F7LP7.js +306 -0
  5. package/dist/chunk-ZP7F7LP7.js.map +1 -0
  6. package/dist/cli.js +499 -250
  7. package/dist/cli.js.map +1 -1
  8. package/dist/client.d.ts +6 -8
  9. package/dist/computer/dashboard.d.ts +1 -0
  10. package/dist/computer/desktop.d.ts +17 -0
  11. package/dist/computer/directory-http.d.ts +1 -1
  12. package/dist/computer/discovery.d.ts +22 -0
  13. package/dist/computer/inspection.d.ts +30 -0
  14. package/dist/computer/lifecycle.d.ts +4 -2
  15. package/dist/computer/runtime-version.d.ts +6 -0
  16. package/dist/computer/service-update.d.ts +26 -0
  17. package/dist/computer/setup-prompt.d.ts +2 -0
  18. package/dist/computer/startup.d.ts +7 -0
  19. package/dist/computer/terminal-ui.d.ts +9 -0
  20. package/dist/computer.d.ts +2 -0
  21. package/dist/{connection-change-IBNL42BL.js → connection-change-7ZV6O75Q.js} +3 -3
  22. package/dist/{connection-change-IBNL42BL.js.map → connection-change-7ZV6O75Q.js.map} +1 -1
  23. package/dist/{controller-2SJLZMJZ.js → controller-FBMGMSLM.js} +67 -9
  24. package/dist/controller-FBMGMSLM.js.map +1 -0
  25. package/dist/{controller-handoff-RUUHODNC.js → controller-handoff-CJKXUFQI.js} +3 -3
  26. package/dist/{controller-handoff-RUUHODNC.js.map → controller-handoff-CJKXUFQI.js.map} +1 -1
  27. package/dist/conversations.d.ts +57 -0
  28. package/dist/daemon-binary.d.ts +2 -0
  29. package/dist/index.cjs +66 -12
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.js +66 -13
  33. package/dist/index.js.map +1 -1
  34. package/dist/project-sync.d.ts +29 -0
  35. package/dist/surfaces.d.ts +20 -1
  36. package/dist/types.d.ts +18 -0
  37. package/dist/workspace.d.ts +2 -0
  38. package/package.json +1 -1
  39. package/dist/chunk-67BNDGRK.js +0 -20
  40. package/dist/chunk-67BNDGRK.js.map +0 -1
  41. package/dist/chunk-RTGZDLSG.js.map +0 -1
  42. package/dist/controller-2SJLZMJZ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/computer/relay-health.ts","../src/computer/runtime-version.ts","../src/computer/controller.ts"],"names":["family","address","resolve","process","client","delay","owner","state"],"mappings":";;;;;;;;;;;;;;AASO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CAAqB,IAAA,EAAwF,OAAA,EAAiB,KAAA,EACnH,iBAAiB,KAAA,EAAO;AACjC,IAAA,KAAA,CAAM,OAAA,EAAS,KAAA,GAAQ,EAAE,KAAA,KAAU,MAAS,CAAA;AAFzB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACV,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAET,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EAJqB,IAAA;AAAA,EACV,cAAA;AAIb,CAAA;AAKO,SAAS,iBAAA,CAAkB,KAAA,EAAgB,QAAA,EAAkB,WAAA,EAA8B;AAChG,EAAA,OAAO,YAAY,CAAA,IAAK,WAAA,IAAe,GAAA,IAClC,EAAE,iBAAiB,eAAA,IAAmB,KAAA,CAAM,IAAA,KAAS,sBAAA,CAAA,KACpD,EAAE,KAAA,YAAiB,eAAA,IAAmB,KAAA,CAAM,IAAA,KAAS,UAAU,KAAA,CAAM,cAAA,CAAA;AAC7E;AAGA,IAAM,eAAA,GAAkB,mCAAA;AAKxB,eAAsB,yBAAyB,QAAA,EAAkB,MAAA,GAAS,CAAA,EACxE,OAAA,GAAwD,EAAC,EAA4B;AACrF,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,EAAC,EAAG,OAAA,EAAS,KAAA,EAAM;AAC5E,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,KAAA,CAAM,OAAM,EAAG,OAAA,CAAQ,aAAa,GAAI,CAAA;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,CAAA,GAAI,CAAC,CAAC,CAAA,GAAI,MAAA,KAAW,CAAA,GAAI,CAAC,EAAE,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA;AAC/D,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,OAAM,IAAA,KAAQ;AACxD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,KAAA,IAAS,KAAA;AAAA,UACvC,CAAA,0CAAA,EAA6C,kBAAA,CAAmB,QAAQ,CAAC,SAAS,IAAI,CAAA,CAAA;AAAA,UACtF,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,sBAAA,IAA0B,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA;AAAO,SAAC;AAC1F,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,CAAC,SAAS,IAAA,EAAM;AAAE,UAAA,MAAM,QAAA,CAAS,MAAM,MAAA,EAAO;AAAG,UAAA,OAAO,KAAA,CAAA;AAAA,QAAW;AAClG,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,QAAA,IAAI,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AACtB,QAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,QAAA,IAAI;AACF,UAAA,WAAS;AACP,YAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAK;AAChC,YAAA,IAAI,MAAM,IAAA,EAAM;AAChB,YAAA,IAAA,IAAQ,MAAM,KAAA,CAAM,MAAA;AACpB,YAAA,IAAI,IAAA,GAAO,OAAQ,OAAO,KAAA,CAAA;AAC1B,YAAA,IAAA,IAAQ,QAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,UACtD;AAAA,QACF,CAAA,SAAE;AAAU,UAAA,MAAM,OAAO,MAAA,EAAO;AAAA,QAAG;AACnC,QAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,OAAA,CAAQ,QAAQ,CAAA;AAIjD,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,QAAA,KAC3D,QAAA,CAAS,IAAA,EAAM,QAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,WAAA,EAAY,KAAM,QAAA,CAAS,WAAA,EAAY,IAAK,QAAA,CAAS,IAAA,KAAS,IAAI,CAAA,EAAG,OAAO,KAAA,CAAA;AAChH,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,EAAC,EAAG,OAAA,EAAS,IAAA,EAAK;AAC/D,QAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAA;AAChC,QAAA,MAAM,SAAA,GAAA,CAAa,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,EAAC,EAAG,OAAA,CAAQ,CAAA,MAAA,KAAU;AACtF,UAAA,MAAMA,OAAAA,GAAS,OAAO,IAAA,KAAS,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,KAAS,KAAK,CAAA,GAAI,CAAA;AAChE,UAAA,OAAOA,OAAAA,IAAU,OAAO,IAAA,KAAS,IAAA,IAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,IAAI,MAAMA,OAAAA,GAC9F,CAAC,EAAE,OAAA,EAAS,MAAA,CAAO,MAAM,MAAA,EAAAA,OAAAA,EAAQ,CAAA,GAAI,EAAC;AAAA,QAC5C,CAAC,CAAA;AACD,QAAA,OAAO,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAM;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAE,QAAA,OAAO,KAAA,CAAA;AAAA,MAAW;AAAA,IAC9B,CAAC,CAAC,CAAA;AACF,IAAA,OAAO;AAAA,MAAE,WAAW,OAAA,CAAQ,OAAA,CAAQ,YAAU,MAAA,EAAQ,SAAA,IAAa,EAAE,CAAA;AAAA,MACnE,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,MAAA,KAAU,MAAA,EAAQ,YAAY,IAAI;AAAA,KAAE;AAAA,EAC/D,CAAA,SAAE;AAAU,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EAAG;AACnC;AAIA,IAAM,WAAA,GAA8B,CAAC,QAAA,EAAU,OAAA,EAAS,QAAA,KAAa;AACnE,EAAA,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,CAAC,KAAA,EAAO,SAAS,MAAA,KAAW;AACpD,IAAA,IAAI,CAAC,CAAC,WAAA,EAAa,WAAW,EAAE,QAAA,CAAU,KAAA,EAAwC,IAAA,IAAQ,EAAE,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChI,MAAA,QAAA,CAAS,KAAA,EAAO,SAAS,MAAM,CAAA;AAAG,MAAA;AAAA,IACpC;AACA,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,EAAE,SAAS,GAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,KAAW,MAAA,GAAS,CAAA,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,MAAA,IAAU,CAAA;AAC1G,IAAA,KAAK,QAAQ,GAAA,CAAI;AAAA,MACf,eAAA,KAAoB,IAAI,EAAC,GAAI,SAAS,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,SAAA,KAAa,SAAA,CAAU,IAAI,CAAAC,QAAAA,MAAY,EAAE,OAAA,EAAAA,QAAAA,EAAS,MAAA,EAAQ,GAAE,CAAE,CAAA,EAAG,MAAM,EAAE,CAAA;AAAA,MACvI,eAAA,KAAoB,IAAI,EAAC,GAAI,SAAS,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,SAAA,KAAa,SAAA,CAAU,IAAI,CAAAA,QAAAA,MAAY,EAAE,OAAA,EAAAA,QAAAA,EAAS,MAAA,EAAQ,GAAE,CAAE,CAAA,EAAG,MAAM,EAAE;AAAA,KACxI,CAAA,CAAE,IAAA,CAAK,OAAM,OAAA,KAAW;AACvB,MAAA,IAAI,SAAA,GAAY,QAAQ,IAAA,EAAK;AAC7B,MAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,wBAAA,CAAyB,QAAA,EAAU,eAAe,CAAA;AACzE,QAAA,SAAA,GAAY,QAAA,CAAS,SAAA;AACrB,QAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,UAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAA,EAAQ,EAAE,mBAAA,EAAqB,SAAS,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,MAAM,CAAA;AAAG,UAAA;AAAA,QAC/F;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,GAAA,EAAK,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AAAA,WACpC,QAAA,CAAS,MAAM,SAAA,CAAU,CAAC,EAAG,OAAA,EAAS,SAAA,CAAU,CAAC,CAAA,CAAG,MAAM,CAAA;AAAA,IACjE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH,CAAA;AAIA,eAAsB,UAAA,CAAW,KAAA,EAAsB,OAAA,GAAiF,EAAC,EAAkB;AACzJ,EAAA,OAAA,CAAQ,QAAQ,cAAA,EAAe;AAC/B,EAAA,IAAI,MAAM,IAAA,KAAS,WAAA,EAAa,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACtF,EAAA,MAAM,IAAI,OAAA,CAAc,CAACC,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,SAAS,IAAI,SAAA,CAAU,KAAA,CAAM,GAAA,EAAK,EAAE,UAAA,EAAY,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,iBAAiB,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,aAAa,CAAA;AACrJ,IAAA,IAAI,QAAA,GAAW,OAAO,MAAA,GAAS,EAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAkB;AAChC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AACpD,MAAA,MAAA,CAAO,SAAA,EAAU;AACjB,MAAA,IAAI,KAAA,SAAc,KAAK,CAAA;AAAA,WAAQA,QAAAA,EAAQ;AAAA,IACzC,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAA,IAAU,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAC/F,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,eAAA,CAAgB,SAAA,EAAW,sDAAiD,CAAC,CAAA,EAAG,OAAA,CAAQ,SAAA,IAAa,GAAI,CAAA;AACnJ,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,CAAA,KAAA,KAAS;AAC1B,MAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,sBAAA,EAAwB,yHAAA,EAA2H,KAAK,CAAC,CAAA;AAAA,MACtL,CAAA,MAAA,IAAW,CAAC,WAAA,EAAa,WAAW,EAAE,QAAA,CAAU,KAAA,CAAgC,IAAA,IAAQ,EAAE,CAAA,EAAG;AAC3F,QAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,QAAA,CAAS,QAAA,CAAS,oBAAoB,CAAA,GAAI,cAAA,GAAiB,cAAA;AAC/F,QAAA,MAAA,CAAO,IAAI,eAAA;AAAA,UAAgB,KAAA;AAAA,UAAO,eAAe,QAAQ,CAAA,6BAAA,CAAA;AAAA,UAA4B,KAAA;AAAA,UAClF,MAAoD,mBAAA,KAAwB;AAAA,SAAK,CAAA;AAAA,MACtF,CAAA,MAAA,IAAW,mDAAA,CAAoD,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AAClF,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,OAAA,EAAS,6DAAA,EAA0D,KAAK,CAAC,CAAA;AAAA,MACtG,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,YAAA,EAAc,sDAAA,EAAmD,KAAK,CAAC,CAAA;AAAA,MACpG;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,MAAA,CAAO,IAAI,eAAA,CAAgB,YAAA,EAAc,qEAAgE,CAAC,CAAC,CAAA;AACpI,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,KAAW;AACrC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,UAAA,EAAY,uDAAuD,CAAC,CAAA;AAAG,QAAA;AAAA,MAAQ;AACzH,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AACxB,MAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AAAE,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,UAAA,EAAY,uDAAuD,CAAC,CAAA;AAAG,QAAA;AAAA,MAAQ;AACtI,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,KAAM,kBAAA,GAAqB,MAAA,GAC1D,IAAI,eAAA,CAAgB,UAAA,EAAY,kEAAkE,CAAC,CAAA;AAAA,MACzG;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,QAAQ,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACjE,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AAAA,EACvC,CAAC,CAAA;AACH;AAIA,eAAsB,sBAAA,CAAuB,SAAuB,MAAA,EAAwC;AAC1G,EAAA,IAAI,CAAC,CAAC,YAAA,EAAc,OAAA,EAAS,QAAQ,EAAE,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAA;AACtE,EAAA,MAAA,EAAQ,cAAA,EAAe;AACvB,EAAA,OAAO,IAAI,OAAA,CAAiB,CAAAA,QAAAA,KAAW;AACrC,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,KAAS,YAAA,GAAe,mCACxC,OAAA,CAAQ,IAAA,KAAS,WAAW,yBAAA,GAA4B,wBAAA;AAC5D,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,IAAA,GAAO,CAAC,SAAA,KAAuB;AACnC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,KAAA,CAAM,OAAA,EAAQ;AACd,MAAAA,SAAQ,SAAS,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,EAAK,EAAE,QAAQ,MAAA,EAAQ,MAAA,IAAU,CAAA,QAAA,KAAY;AACjE,MAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,KAAK,GAAG,GAAI,CAAA;AAChD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,MAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,IAAA,KAAA,CAAM,GAAA,EAAI;AAAA,EACZ,CAAC,CAAA;AACH;;;ACzKO,SAAS,qBAAA,CAAsB,MAAA,EAAwB,UAAA,GAAa,WAAA,EAAqB;AAC9F,EAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,OAAA,SAAgB,MAAA,CAAO,OAAA;AAC1D,EAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA,EAAG,OAAO,OAAO,OAAA,IAAW,UAAA;AAClE,EAAA,OAAO,eAAe,MAAA,CAAO,OAAA,EAAS,UAAU,CAAA,GAAI,OAAO,OAAA,GAAW,UAAA;AACxE;AAEO,SAAS,qBAAA,CAAsB,MAAA,EAAwB,SAAA,EAAmB,UAAA,GAAa,WAAA,EAAiC;AAC7H,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,MAAA,EAAQ,UAAU,CAAA;AACvD,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,CAAC,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA,IAAK,cAAA,CAAe,SAAA,EAAW,MAAM,CAAA,EAAG;AAC9F,EAAA,OAAO,MAAA;AACT;;;ACMA,eAAe,SAAA,CAAU,IAAA,EAAc,MAAA,EAAiC,IAAA,EAAc,OAAA,EAAiD;AACrI,EAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAM,UAAU,IAAA,EAAM;AAAA,IAAE,KAAA,EAAO,OAAO,KAAA,CAAM,QAAA;AAAA,IAAU,IAAA;AAAA,IAAM,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,IACtH,OAAO,MAAA,CAAO,KAAA;AAAA,IAAO,YAAY,MAAA,CAAO,UAAA;AAAA,IAAY,YAAY,MAAA,CAAO;AAAA,GAAiC,CAAA;AAAA,aAC5F,EAAA,CAAA,EAAA,CAAG,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AACxC;AACO,SAAS,cAAc,QAAA,EAA0B;AAAE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAQ,GAAA,GAAO,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAAG;AAGvI,eAAsB,kBAAkB,SAAA,EAAkC;AACxE,EAAA,IAAA,CAAK,MAAM,QAAA,CAAoC,IAAA,CAAA,IAAA,CAAK,WAAW,uBAAuB,CAAC,IAAI,OAAA,EAAS;AACpG,EAAA,IAAI,SAAS,MAAM,QAAA,CAA8B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAC,CAAA;AACxF,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACjE,EAAA,MAAM,cAAA,GAAsB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,0BAA0B,CAAA;AACtE,EAAA,MAAM,SAAA,GAAiB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,qBAAqB,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAA0B,cAAc,CAAA;AAC/D,EAAA,IAAI,MAAM,iBAAA,CAAkB,QAAQ,GAAG,MAAM,IAAI,MAAM,gDAAgD,CAAA;AACvG,EAAA,MAAM,KAAA,GAAQ,MAAM,sBAAA,EAAuB;AAC3C,EAAA,MAAM,QAAQ,CAAC,OAAA,KAAoB,UAAU,cAAA,EAAgB,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,mBAAA,EAAqB,UAAA,EAAY,aAAa,KAAA,EAAO,KAAA,EAAO,OAAO,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA;AACjL,EAAA,MAAM,MAAM,0BAAqB,CAAA;AACjC,EAAA,IAAI,KAAA,EAAiC,OAAgC,QAAA,GAAW,KAAA;AAChF,EAAA,IAAI,SAAA,EAAsC,UAAA;AAC1C,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,MAAM,OAAO,MAAM;AAAE,IAAA,QAAA,GAAW,IAAA;AAAM,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EAAG,CAAA;AACrD,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,IAAI,CAAA;AAAG,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AAEtD,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AAAE,IAAA,KAAA,GAAA,CAAS,MAAS,YAAc,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,CAAA,EAAG,MAAM,GAAG,IAAA,EAAK;AAAA,EAAG,SACjF,KAAA,EAAO;AACZ,IAAA,IAAK,KAAA,CAAgC,IAAA,KAAS,QAAA,EAAU,MAAM,KAAA;AAC9D,IAAA,KAAA,GAAQ,WAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACtC,IAAA,MAAS,EAAA,CAAA,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,CAAA,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EAC7F;AACA,EAAA,MAAM,SAAA,GAAY,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AACnC,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,YAAA,CAAa,WAAA,EAAa,CAAC,KAAK,CAAA,EAAG,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAM,aAAa,IAAA,EAAM,EAAE,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AACvH,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,iBAAsB,IAAA,CAAA,OAAA,CAAa,IAAA,CAAA,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,KAAK,CAAA;AAClE,QAAA,MAAS,EAAA,CAAA,MAAA,CAAY,IAAA,CAAA,IAAA,CAAK,cAAA,EAAgB,UAAU,CAAC,CAAA;AACrD,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,WAAA,EAAY,KAAM,MAAM,CAAA,IAAK,MAAA;AACpF,QAAA,SAAA,CAAU,OAAO,CAAA,GAAI,CAAA,EAAG,cAAc,CAAA,EAAQ,cAAS,CAAA,EAAG,SAAA,CAAU,OAAO,CAAA,IAAK,EAAE,CAAA,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAoE;AAAA,EAC9E;AACA,EAAA,MAAM,aAAa,MAAM,QAAA,CAA4B,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAC,CAAA;AAE7F,EAAA,IAAI,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,UAAA,EAAY,OAAA,IAAW,CAAA;AACvD,EAAA,IAAI,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,UAAA,EAAY,aAAA,IAAiB,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAsC;AAC1D,IAAA,MAAS,EAAA,CAAA,EAAA,CAAQ,UAAK,SAAA,EAAW,uBAAuB,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAC1E,IAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,MAAA,EAAQ,CAAC,YAAY,CAAA,EAAG;AAAA,MAC5C,KAAK,MAAA,CAAQ,SAAA;AAAA,MAAW,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA;AAAA,MAAG,WAAA,EAAa,IAAA;AAAA,MAC9E,GAAA,EAAK;AAAA,QAAE,GAAG,SAAA;AAAA,QAAW,YAAA,EAAc,KAAA;AAAA,QAAO,IAAA,EAAM,aAAA;AAAA,QAAe,UAAA,EAAiB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,kBAAkB,CAAA;AAAA,QAChH,iBAAA,EAAwB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAAA,QAAG,WAAW,MAAA,CAAQ,SAAA;AAAA,QAC5E,iBAAA,EAAmB,CAAA,EAAG,MAAA,CAAQ,IAAA,CAAK,SAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,MAAA,CAAQ,IAAI,CAAA,CAAA,CAAA,GAAM,MAAA,CAAQ,IAAI,IAAI,OAAO,CAAA,CAAA;AAAA,QAChG,gBAAA,EAAkB,aAAa,aAAa,CAAA,CAAA;AAAA,QAAI,yBAAA,EAA2B;AAAA;AAAI,KAClF,CAAA;AACD,IAAA,IAAI,OAAA;AACJ,IAAAA,QAAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAA,KAAA,KAAS;AAAE,MAAA,OAAA,GAAU,KAAA;AAAA,IAAO,CAAC,CAAA;AACjD,IAAA,MAAM,IAAI,OAAA,CAAc,CAACD,QAAAA,EAAS,MAAA,KAAW;AAAE,MAAAC,QAAAA,CAAQ,IAAA,CAAK,OAAA,EAASD,QAAO,CAAA;AAAG,MAAAC,QAAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IAAG,CAAC,CAAA;AAC/G,IAAA,KAAA,GAAQ,MAAM,SAASA,QAAO,CAAA;AAC9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,GAAA,EAAK,OAAA,EAAA,EAAW;AAC9C,MAAA,IAAI,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAAA;AACrD,MAAA,IAAI,SAAS,MAAM,OAAA;AACnB,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,MAAM,IAAI,MAAM,+EAA+E,CAAA;AACnH,MAAA,IAAI;AACF,QAAA,MAAMC,OAAAA,GAAS,MAAM,cAAA,CAAe,SAAS,CAAA;AAC7C,QAAA,MAAM,IAAA,GAAO,MAAMA,OAAAA,CAAO,QAAA,CAAS,IAAA,EAAK;AACxC,QAAA,IAAI,KAAK,GAAA,KAAQ,KAAA,CAAM,KAAK,MAAM,IAAI,MAAM,6CAA6C,CAAA;AACzF,QAAA,MAAM,MAAA,GAAS,MAAMA,OAAAA,CAAO,MAAA,EAAO;AACnC,QAAA,IAAK,OAAkD,yBAAA,KAA8B,CAAA,EAAG,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAC1K,QAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AAAS,QAAA,aAAA,GAAgB,IAAA,CAAK,aAAA;AAC7C,QAAA,OAAOA,OAAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAAE,QAAA,IAAI,OAAA,KAAY,IAAI,MAAM,KAAA;AAAA,MAAO;AACnD,MAAA,MAAMC,aAAM,GAAG,CAAA;AAAA,IACjB;AACA,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,IAAI,MAAA,GAA0B,EAAC,EAAG,SAAA,GAAY,EAAA;AAC9C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,eAAe,0CAAA,EAAuC,UAAA;AAC1D,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,WAAA,EAAiC,YAAA,GAAe,CAAA,EAAG,cAAA,GAAiB,CAAA;AACxE,EAAA,IAAI,WAAA,GAAc,CAAA,EAAG,aAAA,GAAgB,CAAA,EAAG,cAAA,GAAiB,KAAA;AACzD,EAAA,IAAI,gBAAgB,IAAA,CAAK,GAAA,EAAI,EAAG,YAAA,GAAe,KAAK,GAAA,EAAI;AACxD,EAAA,IAAI,cAAA,GAAiB,KAAA,EAAO,iBAAA,GAAoB,KAAA,EAAO,mBAAA,GAAsB,CAAA;AAC7E,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,WAAA,GAAc,GAAG,SAAA,GAAY,CAAA;AACjC,EAAA,IAAI,iBAAA,GAAoB,CAAA,EAAG,oBAAA,GAAuB,CAAA,EAAG,mBAAA,GAAsB,CAAA;AAC3E,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,qCAAgC,CAAA;AAE5C,IAAA,IAAI;AAAE,MAAA,MAAA,GAAS,MAAM,eAAe,SAAS,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAoB;AAC5E,IAAA,MAAM,aAAA,GAAgB,sBAAsB,MAAM,CAAA;AAClD,IAAA,MAAM,mBAAmB,MAAA,GAAA,CAAU,MAAM,MAAA,CAAO,MAAA,IAAU,OAAA,GAAU,aAAA;AACpE,IAAA,IAAI,MAAA,GAAS,MAAA,CAAO,SAAA,IAAa,MAAM,kBAAA,CAAmB;AAAA,MAAE,OAAA,EAAS,gBAAA;AAAA,MACnE,QAAA,EAAU,QAAQ,GAAA,CAAI,0BAAA;AAAA,MAA4B,YAAA,EAAc,CAAC,CAAC,MAAA,IAAU,MAAA,CAAO;AAAA,KAAe,CAAA;AACpG,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,EAAK;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA;AAC/C,MAAA,KAAA,GAAQ,QAAA,GAAW,MAAM,YAAA,CAAa,QAAQ,CAAA,GAAI,KAAA,CAAA;AAClD,MAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,4EAA4E,CAAA;AACxG,MAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AAAS,MAAA,aAAA,GAAgB,IAAA,CAAK,aAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAM,MAAM,qCAAgC,CAAA;AAC5C,MAAA,MAAA,GAAS,MAAM,OAAO,MAAM,CAAA;AAC5B,MAAA,MAAM,cAAA,GAAA,CAAkB,MAAM,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,CAAA;AACvE,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,YAAY,cAAA,EAAgB;AAC1D,QAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe;AAC9C,QAAA,MAAM,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,GAAG,MAAM,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAqB,SAAS,CAAA;AAClD,IAAA,MAAM,aAAA,GAAqB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,+BAA+B,CAAA;AAC1E,IAAA,MAAM,kBAAA,GAAqB,MAAM,QAAA,CAAqB,aAAa,CAAA;AACnE,IAAA,IAAI,kBAAA,KAAuB,kBAAA,CAAmB,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO,KAAA,CAAM,GAAA,IAAO,kBAAA,CAAmB,KAAA,CAAM,KAAA,KAAU,KAAA,EAAO,KAAA,CAAM,KAAA,CAAA,EAAQ;AACtI,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,kBAAA,CAAmB,KAAK,CAAA;AAClE,MAAA,IAAI,cAAA,EAAgB,MAAA,CAAO,MAAM,UAAA,CAAW,cAAA,EAAgB,kBAAA,CAAmB,KAAA,EAAO,SAAA,EAAW,kBAAA,CAAmB,UAAA,EAAY,kBAAA,CAAmB,UAAU,GAAG,KAAA,EAAM;AAAA,IACxK;AACA,IAAA,MAAS,EAAA,CAAA,EAAA,CAAG,aAAA,EAAe,EAAE,KAAA,EAAO,MAAM,CAAA;AAC1C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAMC,MAAAA,GAAQ,MAAM,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAC5C,MAAA,IAAIA,MAAAA,EAAO;AACT,QAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA,EAAG;AACrH,UAAA,KAAA,GAAQ,MAAM,WAAWA,MAAAA,EAAO,KAAA,CAAM,OAAO,SAAA,EAAW,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AAC1F,UAAA,iBAAA,GAAoB,CAAC,CAAC,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA,KAAA,KAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAC3G,UAAA,IAAI,QAAA,EAAU,qBAAqB,iBAAA,EAAmB;AACpD,YAAA,aAAA,GAAgB,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,EAAI,EAAG,SAAS,iBAAiB,CAAA;AAC/D,YAAA,mBAAA,GAAsB,SAAS,aAAA,IAAiB,CAAA;AAAA,UAClD;AAAA,QACF,CAAA,MAAO;AAIL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAY,MAAM,MAAM,sDAAiD,CAAA;AACpF,UAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAWA,MAAAA,EAAO,KAAA,CAAM,OAAO,SAAA,EAAW,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AACpG,UAAA,MAAM,UAAU,KAAA,EAAM;AACtB,UAAA,MAAS,EAAA,CAAA,EAAA,CAAG,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,QACxC;AAAA,MACF,CAAA,MAAA,IAAW,MAAM,UAAA,EAAY;AAC3B,QAAA,MAAA,CAAO,MAAM,WAAA,CAAY,KAAA,CAAM,WAAW,KAAA,CAAM,UAAU,IAAI,KAAA,EAAM;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,IAAA,OAAO,CAAC,QAAA,EAAU;AAChB,MAAA,MAAM,UAAA,GAAkB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,iCAAiC,CAAA;AACzE,MAAA,MAAM,SAAS,CAAC,cAAA,IAAkB,CAAC,SAAA,IAAa,CAAC,cAAc,CAAC,eAAA,IAAmB,CAAC,cAAA,IAAkB,UAAU,KAAA,EAAO,KAAA,KACnH,MAAM,QAAA,CAAmC,UAAU,CAAA,GAAI,KAAA,CAAA;AAC3D,MAAA,IAAI,MAAA,IAAU,CAAC,QAAA,EAAU,YAAY,EAAE,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AAC9D,QAAA,cAAA,GAAA,CAAkB,YAAY;AAC5B,UAAA,MAAM,cAAA,GAAiB,MAAA;AACvB,UAAA,MAAM,OAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,OAAO,KAAA,EAAM;AAClD,UAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,UAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,UAAA,IAAI,SAAA;AACJ,UAAA,IAAI,SAAA,GAAY,KAAA;AAChB,UAAA,IAAI,qBAAA;AACJ,UAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,EAAM;AACpC,UAAA,KAAA,CAAM,OAAO,gBAAA,CAAiB,OAAA,EAAS,QAAQ,EAAE,IAAA,EAAM,MAAM,CAAA;AAC7D,UAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,KAAO,CAAA;AAC1C,UAAA,MAAM,MAAA,GAAS,CAAC,OAAA,KAAoB,SAAA,CAAU,UAAA,EAAY,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,CAAA;AACtG,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,wEAAmE,CAAA;AAChF,YAAA,IAAI,KAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,KAAM,IAAA,CAAK,UAAU,cAAA,CAAe,KAAK,CAAA,IAAK,aAAA,KACnE,CAAC,aAAA,CAAc,KAAA,IAAS,cAAc,KAAA,CAAM,KAAA,KAAU,SAAA,GAAY,aAAA;AAAA,iBACrE;AAGH,cAAA,IAAI,aAAA,EAAe,SAAS,CAAC,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IACjE,KAAK,KAAA,CAAM,IAAA,KAAS,eAAe,KAAA,CAAM,IAAA,IAAQ,KAAK,KAAA,CAAM,GAAA,KAAQ,cAAA,CAAe,KAAA,CAAM,GAAA,EAAK;AACnG,gBAAA,MAAM,OAAO,6EAAwE,CAAA;AACrF,gBAAA,gBAAA,GAAmB,IAAA;AAAM,gBAAA,cAAA,GAAiB,KAAA;AAC1C,gBAAA,MAAM,cAAc,KAAA,EAAM;AAAA,cAC5B;AACA,cAAA,SAAA,GAAY,MAAM,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,aAAA,EAAe;AAAA,gBACxD,QAAA,EAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAAA,gBAAG,eAAA,EAAiB,SAAA;AAAA,gBAAW,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,gBAAG,QAAQ,QAAA,CAAS,MAAA;AAAA,gBAChH,UAAA,EAAY,MAAA;AAAA,gBACZ,OAAA,EAAS,OAAOA,MAAAA,EAAO,UAAA,EAAY,UAAA,KAAe;AAChD,kBAAA,IAAIA,MAAAA,CAAM,QAAA,EAAU,MAAM,SAAA,CAAU,aAAA,EAAe;AAAA,oBAAE,OAAOA,MAAAA,CAAM,QAAA;AAAA,oBAAU,IAAA,EAAM,aAAA;AAAA,oBAChF,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,oBAAG,UAAA;AAAA,oBAAY;AAAA,mBAAiC,CAAA;AAAA,gBACtF;AAAA,eACC,CAAA;AAAA,YACH;AACA,YAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC9B,cAAA,IAAI,CAAC,SAAA,EAAW,KAAA,EAAO,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAC/E,cAAA,MAAM,OAAO,2CAAsC,CAAA;AACnD,cAAA,WAAS;AACP,gBAAA,QAAA,CAAS,OAAO,cAAA,EAAe;AAC/B,gBAAA,IAAI;AAAE,kBAAA,MAAM,WAAW,SAAA,CAAU,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AAAG,kBAAA;AAAA,gBAAO,SACtE,KAAA,EAAO;AACZ,kBAAA,IAAI,KAAA,YAAiB,OAAO,qBAAA,GAAwB,KAAA;AACpD,kBAAA,IAAI,iBAAiB,eAAA,IAAmB,mBAAA,CAAoB,KAAA,CAAM,IAAI,GAAG,MAAM,KAAA;AAC/E,kBAAA,MAAMD,aAAM,GAAA,EAAM,KAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,gBAC1D;AAAA,cACF;AAAA,YACF;AACA,YAAA,QAAA,CAAS,OAAO,cAAA,EAAe;AAC/B,YAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,YAAA,IAAI,SAAA,EAAW,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,UAAU,KAAK,CAAA;AACrD,YAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAC9E,YAAA,MAAM,MAAA,CAAQ,SAAS,SAAA,CAAU,UAAA,EAAY,eAAe,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAClF,YAAA,MAAM,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,GAAG,IAAI,CAAA;AAClE,YAAA,MAAM,SAAA,CAAU,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,KAAK,KAAK,CAAA;AAC/D,YAAA,MAAA,GAAS,IAAA;AAAM,YAAA,KAAA,GAAQ,SAAA;AAAW,YAAA,MAAA,GAAS,UAAA;AAAY,YAAA,SAAA,GAAY,EAAA;AACnE,YAAA,cAAA,GAAiB,IAAA;AAAM,YAAA,iBAAA,GAAoB,IAAA;AAAM,YAAA,mBAAA,GAAsB,CAAA;AAAG,YAAA,aAAA,GAAgB,CAAA;AAC1F,YAAA,UAAA,GAAa,KAAA,CAAA;AAAW,YAAA,cAAA,GAAiB,KAAA,CAAA;AAAW,YAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AAAG,YAAA,WAAA,GAAc,SAAA,GAAY,GAAA;AACtG,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,IAAI,aAAA,IAAiB,aAAA,KAAkB,SAAA,EAAW,MAAM,cAAc,KAAA,EAAM;AAC5E,YAAA,MAAM,SAAA,CAAU,YAAY,EAAE,GAAG,QAAQ,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,iCAAA,EAAmC,CAAA;AAAA,UAC3G,SAAS,KAAA,EAAO;AACd,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,IAAI,SAAA,IAAa,SAAA,KAAc,aAAA,EAAe,MAAM,UAAU,KAAA,EAAM;AACpE,cAAA,MAAM,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,GAAG,cAAc,CAAA;AAC5E,cAAA,IAAI,gBAAA,EAAkB;AACpB,gBAAA,aAAA,GAAgB,KAAA,CAAA;AAChB,gBAAA,IAAI,CAAC,QAAA,EAAU;AACb,kBAAA,MAAM,OAAO,kDAA6C,CAAA;AAC1D,kBAAA,IAAI;AACF,oBAAA,aAAA,GAAgB,MAAM,UAAA,CAAW,cAAA,CAAe,KAAA,EAAO,aAAA,EAAe;AAAA,sBACpE,QAAA,EAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAAA,sBAAG,eAAA,EAAiB,SAAA;AAAA,sBAAW,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,sBAAG,QAAQ,KAAA,CAAM;AAAA,qBAC9G,CAAA;AAAA,kBACH,CAAA,CAAA,MAAQ;AAAA,kBAAkE;AAAA,gBAC5E;AACA,gBAAA,cAAA,GAAiB,KAAA;AAAO,gBAAA,WAAA,GAAc,CAAA;AAAG,gBAAA,WAAA,GAAc,CAAA;AAAA,cACzD;AACA,cAAA,KAAA,GAAQ,aAAA;AACR,cAAA,MAAM,SAAA,CAAU,SAAA,EAAW,aAAA,EAAe,aAAA,EAAe,eAAe,KAAK,CAAA;AAC7E,cAAA,SAAA,GAAY,EAAA;AAAA,YACd;AACA,YAAA,MAAM,UAAU,UAAA,EAAY;AAAA,cAAE,GAAG,MAAA;AAAA,cAAQ,MAAA,EAAQ,YAAY,UAAA,GAAa,QAAA;AAAA,cACxE,OAAA,EAAS,SAAA,GAAY,sBAAA,GAAyB,CAAA,gCAAA,EAAmC,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,GAAe,KAAA,CAAM,OAAA,GAAU,qBAAA,EAAuB,WAAW,2DAA2D,CAAA,oCAAA;AAAA,aAAwC,CAAA;AAAA,UAClS,CAAA,SAAE;AACA,YAAA,YAAA,CAAa,OAAO,CAAA;AAAG,YAAA,KAAA,CAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,MAAM,CAAA;AACvE,YAAA,MAAS,EAAA,CAAA,EAAA,CAAG,aAAA,EAAe,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,UAC5C;AAAA,QACF,CAAA,GAAG,CAAE,KAAA,CAAM,MAAM;AACf,UAAA,UAAA,GAAa,sGAAA;AAAA,QACf,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AAAE,UAAA,cAAA,GAAiB,KAAA,CAAA;AAAA,QAAW,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,CAAC,cAAA,IAAkB,KAAA,IAAS,CAAC,KAAA,CAAM,OAAM,EAAG;AAC9C,QAAA,KAAA,GAAQ,KAAA,CAAA;AAAW,QAAA,MAAA,GAAS,KAAA,CAAA;AAC5B,QAAA,WAAA,GAAc,0CAAA;AACd,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,EAAE,cAAc,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,KAAA,EAAO,OAAM,IAAK,IAAA,CAAK,KAAI,GAAI,aAAA,GAAgB,KAAQ,cAAA,GAAiB,CAAA;AAC5E,MAAA,IAAI,cAAA,IAAkB,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM,IAAK,KAAK,GAAA,EAAI,GAAI,YAAA,GAAe,GAAA,EAAQ,aAAA,GAAgB,CAAA;AACnG,MAAA,IAAI,CAAC,kBAAkB,CAAC,KAAA,EAAO,OAAM,IAAK,IAAA,CAAK,GAAA,EAAI,IAAK,YAAA,EAAc;AACpE,QAAA,WAAA,GAAc,0CAAA;AACd,QAAA,MAAM,MAAM,WAAW,CAAA;AACvB,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,MAAM,OAAO,MAAM,CAAA;AAAG,UAAA,SAAA,GAAY,EAAA;AAAI,UAAA,WAAA,GAAc,KAAA,CAAA;AAAW,UAAA,aAAA,GAAgB,KAAK,GAAA,EAAI;AACjG,UAAA,iBAAA,GAAoB,CAAA;AAAA,QACtB,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA,EAAM;AAC7B,UAAA,KAAA,GAAQ,KAAA,CAAA;AAAW,UAAA,MAAA,GAAS,KAAA,CAAA;AAC5B,UAAA,WAAA,GAAc,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,yBAAA;AACvD,UAAA,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,EAAE,cAAc,CAAA;AAAA,QAC5D;AAAA,MACF;AAEA,MAAA,MAAM,iBAAiB,MAAM,QAAA,CAAuC,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,qBAAqB,CAAC,CAAA;AAC1G,MAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,kBAAkB,CAAC,UAAA,IAAc,CAAC,cAAA,IAAkB,MAAA,IAAU,OAAO,KAAA,EAAM,KAC5F,KAAK,GAAA,EAAI,IAAK,sBAAsB,cAAA,EAAgB,WAAA,IAAe,KAAK,oBAAA,CAAA,EAAuB;AACrG,QAAA,MAAM,WAAA,GAAc,MAAA;AACpB,QAAA,oBAAA,GAAuB,KAAK,GAAA,EAAI;AAChC,QAAA,eAAA,GAAA,CAAmB,YAAY;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,UAAU,qBAAA,CAAsB,MAAA,EAAA,CAAU,MAAM,WAAA,CAAY,MAAA,IAAU,OAAO,CAAA;AACnF,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,kBAAA,CAAmB,aAAa,OAAO,CAAA;AAC7C,cAAA,cAAA,GAAiB,qBAAqB,OAAO,CAAA,8DAAA,CAAA;AAI7C,cAAA,iBAAA,GAAoB,IAAA,CAAK,KAAI,GAAI,GAAA;AACjC,cAAA;AAAA,YACF;AACA,YAAA,MAAM,yBAAA,CAA0B,EAAE,SAAA,EAAW,MAAA,EAAiB,UAAU,WAAA,EAAa,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC3G,YAAA,cAAA,GAAiB,KAAA,CAAA;AAAW,YAAA,mBAAA,GAAsB,CAAA;AAClD,YAAA,iBAAA,GAAoB,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,UACnC,SAAS,KAAA,EAAO;AACd,YAAA,IAAI,CAAC,QAAA,EAAU;AACb,cAAA,cAAA,GAAiB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0CAAA;AAC1D,cAAA,iBAAA,GAAoB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,EAAE,mBAAmB,CAAA;AAAA,YACtE;AAAA,UACF;AAAA,QACF,CAAA,GAAG,CAAE,OAAA,CAAQ,MAAM;AAAE,UAAA,eAAA,GAAkB,KAAA,CAAA;AAAA,QAAW,CAAC,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO,KAAA,IAAS,CAAC,KAAA,CAAM,KAAA,CAAM,OAAM,EAAG;AAC3D,QAAA,MAAM,MAAM,KAAA,EAAM;AAClB,QAAA,KAAA,GAAQ,KAAA,CAAA;AACR,QAAA,cAAA,GAAiB,KAAA;AAAO,QAAA,iBAAA,GAAoB,KAAA;AAC5C,QAAA,cAAA,GAAiB,KAAA,CAAA;AACjB,QAAA,UAAA,GAAa,sDAAA;AACb,QAAA,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,EAAE,aAAa,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,MAAA,GAAS,WAAA;AAAa,QAAA,WAAA,GAAc,KAAA,CAAA;AAAW,QAAA,SAAA,GAAY,KAAA,CAAA;AACjE,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,KAAA,GAAQ,MAAA,CAAO,MAAA;AAAQ,UAAA,UAAA,GAAa,KAAA,CAAA;AAAW,UAAA,cAAA,GAAiB,KAAA,CAAA;AAAW,UAAA,YAAA,GAAe,KAAK,GAAA,EAAI;AACnG,UAAA,cAAA,GAAiB,KAAA;AAAO,UAAA,iBAAA,GAAoB,KAAA;AAAO,UAAA,mBAAA,GAAsB,CAAA;AAAG,UAAA,aAAA,GAAgB,CAAA;AAAG,UAAA,WAAA,GAAc,CAAA;AAC7G,UAAA,IAAI,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,MAAM,UAAU,SAAA,EAAW;AAAA,YACpD,KAAA,EAAO,MAAM,KAAA,CAAM,QAAA;AAAA,YAAU,IAAA,EAAM,aAAA;AAAA,YAAe,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,YAAG,OAAO,KAAA,CAAM,KAAA;AAAA,YAAO,YAAY,KAAA,CAAM,UAAA;AAAA,YAAY,YAAY,KAAA,CAAM;AAAA,WACzI,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AACrB,UAAA,UAAA,GAAa,MAAA,CAAO,KAAA,YAAiB,KAAA,GAAQ,MAAA,CAAO,MAAM,OAAA,GAAU,uCAAA;AACpE,UAAA,cAAA,GAAiB,MAAA,CAAO,KAAA,YAAiB,uBAAA,GAA0B,MAAA,CAAO,MAAM,IAAA,GAAO,KAAA,CAAA;AACvF,UAAA,WAAA,GAAc,IAAA,CAAK,KAAI,IAAK,mBAAA,CAAoB,cAAc,CAAA,GAAI,GAAA,GAAS,aAAA,CAAc,EAAE,aAAa,CAAA,CAAA;AAAA,QAC1G;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,SAAA,IAAa,CAAC,cAAA,KAAmB,IAAA,CAAK,GAAA,EAAI,IAAK,WAAA,IAAA,CAAgB,cAAA,EAAgB,WAAA,IAAe,KAAK,SAAA,CAAA,EAAY;AAC5H,QAAA,UAAA,GAAa,KAAA,CAAA;AAAW,QAAA,cAAA,GAAiB,KAAA,CAAA;AACzC,QAAA,YAAA,GAAe,yCAAA;AACf,QAAA,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,aAAA,EAAe;AAAA,UAClD,QAAA,EAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAAA,UAAG,eAAA,EAAiB,SAAA;AAAA,UAAW,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,UAAG,QAAQ,KAAA,CAAM,MAAA;AAAA,UAC7G,YAAY,CAAA,OAAA,KAAW;AAAE,YAAA,YAAA,GAAe,OAAA;AAAA,UAAS,CAAA;AAAA,UACjD,OAAA,EAAS,OAAOC,MAAAA,EAAO,UAAA,EAAY,UAAA,KAAe;AAChD,YAAA,IAAIA,MAAAA,CAAM,QAAA,EAAU,MAAM,SAAA,CAAU,SAAA,EAAW;AAAA,cAC7C,OAAOA,MAAAA,CAAM,QAAA;AAAA,cAAU,IAAA,EAAM,aAAA;AAAA,cAAe,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,KAAK,CAAA;AAAA,cAAG,UAAA;AAAA,cAAY;AAAA,aAC5E,CAAA;AAAA,UACxB;AAAA,SACD,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AAAE,UAAA,WAAA,GAAc,EAAE,MAAA,EAAO;AAAA,QAAG,GAAG,CAAA,KAAA,KAAS;AAAE,UAAA,WAAA,GAAc,EAAE,KAAA,EAAM;AAAA,QAAG,CAAC,CAAA;AAAA,MACxF;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,MAAA,GAAS,WAAA;AAAa,QAAA,WAAA,GAAc,KAAA,CAAA;AAAW,QAAA,SAAA,GAAY,KAAA,CAAA;AAEjE,QAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,UAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AACrB,UAAA,cAAA,GAAiB,CAAC,MAAA,CAAO,KAAA;AACzB,UAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,YAAA,iBAAA,GAAoB,IAAA;AAAM,YAAA,mBAAA,GAAsB,CAAA;AAAG,YAAA,aAAA,GAAgB,CAAA;AAAG,YAAA,UAAA,GAAa,KAAA,CAAA;AAAW,YAAA,cAAA,GAAiB,KAAA,CAAA;AAC/G,YAAA,WAAA,GAAc,SAAA,GAAY,GAAA;AAAA,UAC5B,CAAA,MAAO;AACL,YAAA,UAAA,GAAa,MAAA,CAAO,KAAA,YAAiB,KAAA,GAAQ,MAAA,CAAO,MAAM,OAAA,GAAU,sDAAA;AACpE,YAAA,cAAA,GAAiB,MAAA,CAAO,KAAA,YAAiB,eAAA,GAAkB,MAAA,CAAO,MAAM,IAAA,GAAO,KAAA,CAAA;AAC/E,YAAA,aAAA,KAAkB,SAAA;AAClB,YAAA,mBAAA,EAAA;AACA,YAAA,WAAA,GAAc,YAAY,IAAA,CAAK,GAAA,CAAI,IAAA,EAAQ,aAAA,CAAc,mBAAmB,CAAC,CAAA;AAC7E,YAAA,IAAI,MAAA,CAAO,UAAA,IAAc,CAAC,cAAA,EAAgB;AAGxC,cAAA,MAAM,KAAA,CAAM,OAAO,KAAA,YAAiB,eAAA,IAAmB,OAAO,KAAA,CAAM,cAAA,GAChE,qEACA,4DAAuD,CAAA;AAC3D,cAAA,MAAM,MAAO,KAAA,EAAM;AAAG,cAAA,KAAA,GAAQ,KAAA,CAAA;AAC9B,cAAA,iBAAA,GAAoB,KAAA;AAAO,cAAA,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,EAAE,aAAa,CAAA;AACnF,cAAA,MAAS,EAAA,CAAA,EAAA,CAAG,SAAA,EAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,SAAA,GAAY,KAAK,GAAA,CAAI,SAAA,EAAW,cAAA,EAAgB,WAAA,IAAe,CAAC,CAAA;AAClG,MAAA,IAAI,KAAA,EAAO,KAAA,IAAS,CAAC,SAAA,KAAc,IAAA,CAAK,GAAA,EAAI,IAAK,WAAA,IAAA,CAAgB,cAAA,EAAgB,WAAA,IAAe,CAAA,IAAK,SAAA,CAAA,EAAY;AAC/G,QAAA,MAAM,QAAA,GAAW,KAAA;AACjB,QAAA,SAAA,GAAA,CAAa,YAAY;AACvB,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,QAAA,CAAS,KAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAC1D,YAAA,WAAA,GAAc,EAAE,OAAO,QAAA,EAAS;AAAA,UAClC,SAAS,KAAA,EAAO;AACd,YAAA,MAAM,UAAA,GAAa,CAAC,CAAC,QAAA,CAAS,KAAA,IAAS,aAAA,GAAgB,CAAA,IAClD,iBAAA,CAAkB,KAAA,EAAO,mBAAA,EAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAa,CAAA,KACvE,KAAA,YAAiB,eAAA,IAAmB,KAAA,CAAM,cAAA,IACzC,MAAM,sBAAA,CAAuB,MAAA,CAAQ,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,CAAA,CAAA;AAClF,YAAA,WAAA,GAAc,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW;AAAA,UACrD;AAAA,QACF,CAAA,GAAG;AAAA,MACL;AAEA,MAAA,MAAA,GAAS,YAAA,CAAa,QAAQ,OAAO,CAAA;AACrC,MAAA,IAAI,OAAO,KAAA,IAAS,iBAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AACzD,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAA;AACjE,MAAA,IAAI,CAAC,cAAA,IAAkB,MAAA,IAAU,OAAO,KAAA,EAAM,IAAK,cAAc,SAAA,EAAW;AAC1E,QAAA,IAAI;AAAE,UAAA,MAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AAAG,UAAA,SAAA,GAAY,SAAA;AAAA,QAAW,CAAA,CAAA,MAC1E;AAAA,QAAqE;AAAA,MAC7E;AACA,MAAA,MAAM,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,KAAA,EAAM,IAAK,CAAC,cAAA,IAAkB,MAAA,CAAO,SAAS,CAAA,IAAK,SAAA,KAAc,cAC9F,MAAA,CAAO,KAAA,CAAM,SAAS,MAAA,IAAU,cAAA,CAAA;AACtC,MAAA,MAAM,KAAA,GAAyB;AAAA,QAAE,GAAG,KAAA;AAAA,QAAO,QAAA,EAAU,mBAAA;AAAA,QAAqB,UAAA,EAAY,WAAA;AAAA,QAAa,KAAA;AAAA,QAAO,MAAA;AAAA,QAAQ,SAAA;AAAA,QAChH,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAA,GAAY,WAAA,IAAe,UAAA,IAAc,YAAA;AAAA,QAAc,OAAO,WAAA,IAAe,UAAA;AAAA,QAC5F,SAAA,EAAW,cAAc,KAAA,CAAA,GAAY,cAAA;AAAA,QAAgB,YAAY,CAAC,KAAA;AAAA,QAClE,cAAA;AAAA,QACA,mBAAmB,aAAA,IAAiB,KAAA,CAAA;AAAA,QAAW,eAAe,mBAAA,IAAuB,KAAA;AAAA,OAAU;AACjG,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACvC,MAAA,IAAI,eAAe,cAAA,EAAgB;AAAE,QAAA,MAAM,SAAA,CAAU,gBAAgB,KAAK,CAAA;AAAG,QAAA,cAAA,GAAiB,UAAA;AAAA,MAAY;AAE1G,MAAA,MAAM,UAAA,GAAkB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,CAAC,UAAA,IAAc,CAAC,kBAAkB,CAAC,eAAA,IAAmB,MAAA,IAAU,KAAA,EAAO,KAAA,EAAM,GAAI,MAAM,QAAA,CAAyB,UAAU,CAAA,GAAI,KAAA,CAAA;AAC7I,MAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AAExB,QAAA,UAAA,GAAA,CAAc,YAAY;AACxB,UAAA,MAAM,MAAA,GAAS,OAAOC,MAAAA,EAAiC,KAAA,KAAmB,SAAA;AAAA,YAAU,UAAA;AAAA,YAClF,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQA,MAAAA,EAAO,KAAA,EAAO,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAE,WAAC;AAC1E,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,aAAa,CAAA;AAC1B,YAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmB,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,YAAA,EAAc,MAAM,CAAA;AAC9I,YAAA,MAAM,OAAO,SAAS,CAAA;AACtB,YAAA,IAAI,KAAA;AACJ,YAAA,OAAO,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AAC1B,cAAA,IAAI;AAAE,gBAAA,KAAA,GAAQ,MAAM,MAAA,CAAQ,OAAA,CAAQ,aAAA,EAAc;AAAA,cAAG,SAC9C,KAAA,EAAO;AAAE,gBAAA,IAAK,KAAA,CAA8B,MAAA,KAAW,GAAA,EAAK,MAAM,KAAA;AAAO,gBAAA,MAAMF,aAAM,GAAI,CAAA;AAAA,cAAG;AAAA,YACrG;AACA,YAAA,IAAI,QAAA,IAAY,CAAC,KAAA,EAAO;AACxB,YAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO,GAAA,EAAK;AAAE,cAAA,MAAM,MAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,KAAA,CAAM,EAAE,CAAA;AAAG,cAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,YAAG;AACvI,YAAA,cAAA,GAAiB,IAAA;AACjB,YAAA,MAAM,OAAO,YAAY,CAAA;AACzB,YAAA,MAAM,MAAO,KAAA,EAAM;AACnB,YAAA,IAAI;AACF,cAAA,MAAA,GAAS,MAAM,OAAO,WAAW,CAAA;AACjC,cAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAO;AACnC,cAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,KAAM,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,8DAA8D,CAAA;AAAA,YACzI,SAAS,KAAA,EAAO;AACd,cAAA,IAAI,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA,EAAM;AAC7B,cAAA,IAAI,CAAC,QAAA,EAAU,MAAA,GAAS,MAAM,OAAO,MAAM,CAAA;AAC3C,cAAA,MAAM,KAAA;AAAA,YACR;AACA,YAAA,MAAA,GAAS,WAAA;AACT,YAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAS,WAAW,KAAA,CAAA,EAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AACrE,YAAA,MAAM,SAAA,CAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,sBAAsB,GAAG,MAAM,CAAA;AACpE,YAAA,MAAM,MAAA,CAAO,SAAS,SAAA,CAAU,MAAA,EAAQ,eAAe,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAG,YAAA,SAAA,GAAY,EAAA;AAChG,YAAA,MAAM,OAAO,UAAU,CAAA;AACvB,YAAA,mBAAA,GAAsB,CAAA;AAAA,UACxB,SAAS,KAAA,EAAO;AACd,YAAA,mBAAA,EAAA;AACA,YAAA,MAAM,OAAO,QAAA,EAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,wBAAwB,CAAA;AAAA,UAC1F,CAAA,SACA;AAAU,YAAA,cAAA,GAAiB,KAAA;AAAO,YAAA,SAAA,GAAY,EAAA;AAAI,YAAA,iBAAA,GAAoB,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA,CAAc,mBAAmB,CAAA;AAAA,UAAG;AAAA,QACzH,CAAA,GAAG,CAAE,OAAA,CAAQ,MAAM;AAAE,UAAA,UAAA,GAAa,KAAA,CAAA;AAAA,QAAW,CAAC,CAAA;AAAA,MAChD;AACA,MAAA,MAAMA,aAAM,GAAG,CAAA;AAAA,IACjB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAA,CAAU,cAAA,EAAgB,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,4BAA4B,CAAA;AACtI,IAAA,MAAM,KAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,MAAM,SAAA;AAAW,IAAA,MAAM,SAAA;AAAW,IAAA,MAAM,UAAA;AAAY,IAAA,MAAM,cAAA;AAAgB,IAAA,MAAM,eAAA;AAChF,IAAA,IAAI,WAAA,EAAa,UAAU,WAAA,CAAY,MAAA,KAAW,OAAO,MAAM,WAAA,CAAY,OAAO,KAAA,EAAM;AACxF,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,IAAI,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA,EAAM;AAC7B,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,IAAI,CAAA;AAAG,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAI,CAAA;AACxD,IAAA,IAAI,QAAA,QAAgB,SAAA,CAAU,cAAA,EAAgB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EACxE;AACF","file":"controller-FBMGMSLM.js","sourcesContent":["import { request } from \"node:https\";\nimport { lookup } from \"node:dns\";\nimport { Resolver } from \"node:dns/promises\";\nimport { isIP, type LookupFunction } from \"node:net\";\nimport WebSocket from \"ws\";\nimport type { ComputerRoute } from \"../computer.js\";\nimport type { RelayOptions } from \"./relay.js\";\nimport { hasCertificateError } from \"./provider-errors.js\";\n\nexport class RelayCheckError extends Error {\n constructor(readonly code: \"dns\" | \"timeout\" | \"proxy\" | \"connection\" | \"response\" | \"provider_certificate\", message: string, cause?: Error,\n readonly addressMissing = false) {\n super(message, cause ? { cause } : undefined);\n this.name = \"RelayCheckError\";\n }\n}\n\n/** Local NXDOMAIN can be a stale cache. A missing address confirmed by the\n * provider is different: its helper may stay alive after the quick tunnel expires.\n * Keep a grace period for newly allocated records and ordinary internet outages. */\nexport function relayNeedsRestart(error: unknown, failures: number, failedForMs: number): boolean {\n return failures >= 2 && failedForMs >= 90_000\n && !(error instanceof RelayCheckError && error.code === \"provider_certificate\")\n && (!(error instanceof RelayCheckError && error.code === \"dns\") || error.addressMissing);\n}\n\ntype RelayDNSResult = { addresses: { address: string; family: number }[]; missing: boolean };\nconst quickTunnelHost = /^[a-z0-9-]+\\.trycloudflare\\.com$/i;\n\n/** Use the tunnel provider's HTTPS resolver only after local DNS fails. This\n * bypasses router negative caches without another service or a persisted IP.\n * A DNS answer never replaces TLS hostname validation or the phone's SSH pin. */\nexport async function resolveCloudflareAddress(hostname: string, family = 0,\n options: { fetch?: typeof fetch; timeoutMs?: number } = {}): Promise<RelayDNSResult> {\n if (!quickTunnelHost.test(hostname)) return { addresses: [], missing: false };\n const abort = new AbortController();\n const timer = setTimeout(() => abort.abort(), options.timeoutMs ?? 3000);\n try {\n const types = family === 4 ? [1] : family === 6 ? [28] : [1, 28];\n const results = await Promise.all(types.map(async type => {\n try {\n const response = await (options.fetch ?? fetch)(\n `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(hostname)}&type=${type}`,\n { headers: { accept: \"application/dns-json\" }, redirect: \"error\", signal: abort.signal });\n if (response.status !== 200 || !response.body) { await response.body?.cancel(); return undefined; }\n const reader = response.body.getReader();\n let text = \"\", size = 0;\n const decoder = new TextDecoder();\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n size += chunk.value.length;\n if (size > 16_384) return undefined;\n text += decoder.decode(chunk.value, { stream: true });\n }\n } finally { await reader.cancel(); }\n const result = JSON.parse(text + decoder.decode()) as {\n Status?: number; Question?: { name?: string; type?: number }[];\n Answer?: { type?: number; data?: string }[];\n };\n if (!Array.isArray(result.Question) || !result.Question.some(question =>\n question.name?.replace(/\\.$/, \"\").toLowerCase() === hostname.toLowerCase() && question.type === type)) return undefined;\n if (result.Status === 3) return { addresses: [], missing: true };\n if (result.Status !== 0) return undefined;\n const addresses = (Array.isArray(result.Answer) ? result.Answer : []).flatMap(answer => {\n const family = answer.type === 1 ? 4 : answer.type === 28 ? 6 : 0;\n return family && answer.type === type && typeof answer.data === \"string\" && isIP(answer.data) === family\n ? [{ address: answer.data, family }] : [];\n });\n return { addresses, missing: false };\n } catch { return undefined; }\n }));\n return { addresses: results.flatMap(result => result?.addresses ?? []),\n missing: results.every(result => result?.missing === true) };\n } finally { clearTimeout(timer); }\n}\n\n/** Try OS DNS, then its uncached resolver, then the provider for quick tunnels.\n * TLS SNI/certificate validation still use the original hostname. */\nconst relayLookup: LookupFunction = (hostname, options, callback) => {\n lookup(hostname, options, (error, address, family) => {\n if (![\"ENOTFOUND\", \"EAI_AGAIN\"].includes((error as NodeJS.ErrnoException | null)?.code ?? \"\") || !quickTunnelHost.test(hostname)) {\n callback(error, address, family); return;\n }\n const resolver = new Resolver({ timeout: 3000, tries: 1 });\n const requestedFamily = options.family === \"IPv4\" ? 4 : options.family === \"IPv6\" ? 6 : options.family ?? 0;\n void Promise.all([\n requestedFamily === 6 ? [] : resolver.resolve4(hostname).then(addresses => addresses.map(address => ({ address, family: 4 })), () => []),\n requestedFamily === 4 ? [] : resolver.resolve6(hostname).then(addresses => addresses.map(address => ({ address, family: 6 })), () => []),\n ]).then(async results => {\n let addresses = results.flat();\n if (!addresses.length) {\n const provider = await resolveCloudflareAddress(hostname, requestedFamily);\n addresses = provider.addresses;\n if (!addresses.length) {\n callback(Object.assign(error!, { relayAddressMissing: provider.missing }), address, family); return;\n }\n }\n if (options.all) callback(null, addresses);\n else callback(null, addresses[0]!.address, addresses[0]!.family);\n });\n });\n};\n\n/** Check the actual WebSocket byte path, not just the helper's PID or its logs.\n * The phone still authenticates and pins the SSH host before sending secrets. */\nexport async function checkRelay(route: ComputerRoute, options: { signal?: AbortSignal; timeoutMs?: number; lookup?: LookupFunction } = {}): Promise<void> {\n options.signal?.throwIfAborted();\n if (route.kind !== \"websocket\") throw new Error(\"Expected an internet tunnel address.\");\n await new Promise<void>((resolve, reject) => {\n const socket = new WebSocket(route.url, { maxPayload: 4096, perMessageDeflate: false, followRedirects: false, lookup: options.lookup ?? relayLookup });\n let finished = false, banner = \"\";\n const finish = (error?: Error) => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", aborted);\n socket.terminate();\n if (error) reject(error); else resolve();\n };\n const aborted = () => finish(options.signal?.reason ?? new Error(\"Connection check cancelled.\"));\n const timer = setTimeout(() => finish(new RelayCheckError(\"timeout\", \"The internet tunnel isn't responding. Retrying…\")), options.timeoutMs ?? 8000);\n socket.on(\"error\", error => {\n if (hasCertificateError(error)) {\n finish(new RelayCheckError(\"provider_certificate\", \"The tunnel's TLS certificate could not be verified. Check the provider's certificate and this computer's date and time.\", error));\n } else if ([\"ENOTFOUND\", \"EAI_AGAIN\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) {\n const provider = new URL(route.url).hostname.endsWith(\".trycloudflare.com\") ? \"Cloudflare's\" : \"the tunnel's\";\n finish(new RelayCheckError(\"dns\", `Waiting for ${provider} internet address (DNS)…`, error,\n (error as Error & { relayAddressMissing?: boolean }).relayAddressMissing === true));\n } else if (/(?:[Uu]nexpected server response|[Ee]xpected 101)/.test(error.message)) {\n finish(new RelayCheckError(\"proxy\", \"The internet tunnel isn't reaching Mindwire. Retrying…\", error));\n } else {\n finish(new RelayCheckError(\"connection\", \"The internet tunnel couldn't connect. Retrying…\", error));\n }\n });\n socket.on(\"close\", () => finish(new RelayCheckError(\"connection\", \"The internet tunnel closed before reaching Mindwire. Retrying…\")));\n socket.on(\"message\", (data, binary) => {\n if (!binary) { finish(new RelayCheckError(\"response\", \"The internet tunnel returned an invalid SSH response.\")); return; }\n banner += data.toString();\n if (banner.length > 1024) { finish(new RelayCheckError(\"response\", \"The internet tunnel returned an invalid SSH response.\")); return; }\n if (banner.includes(\"\\n\")) {\n finish(banner.split(\"\\n\")[0]?.trim() === \"SSH-2.0-Mindwire\" ? undefined\n : new RelayCheckError(\"response\", \"The internet tunnel isn't connected to the Mindwire SSH service.\"));\n }\n });\n options.signal?.addEventListener(\"abort\", aborted, { once: true });\n if (options.signal?.aborted) aborted();\n });\n}\n\n/** Don't rotate a quick-tunnel address during an ordinary internet outage.\n * Let the provider reconnect with the same address until it is reachable again. */\nexport async function relayProviderReachable(options: RelayOptions, signal?: AbortSignal): Promise<boolean> {\n if (![\"cloudflare\", \"ngrok\", \"oblien\"].includes(options.kind)) return false;\n signal?.throwIfAborted();\n return new Promise<boolean>(resolve => {\n const url = options.kind === \"cloudflare\" ? \"https://api.trycloudflare.com/\"\n : options.kind === \"oblien\" ? \"https://api.oblien.com/\" : \"https://api.ngrok.com/\";\n let finished = false;\n const done = (reachable: boolean) => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n probe.destroy();\n resolve(reachable);\n };\n const probe = request(url, { method: \"HEAD\", signal }, response => {\n response.destroy();\n done(true);\n });\n const timer = setTimeout(() => done(false), 5000);\n probe.on(\"error\", () => done(false));\n probe.end();\n });\n}\n","import { SDK_VERSION, versionAtLeast } from \"../version.js\";\nimport type { ComputerConfig } from \"./lifecycle.js\";\n\n/** The saved version is the last installed release, not an accidental permanent\n * pin. Upgrading the CLI must also upgrade its managed service. Never downgrade a\n * newer service or replace an explicitly supplied development binary. */\nexport function managedServiceVersion(config: ComputerConfig, cliVersion = SDK_VERSION): string {\n if (config.versionPinned && config.version) return config.version;\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(cliVersion)) return config.version ?? cliVersion;\n return versionAtLeast(config.version, cliVersion) ? config.version! : cliVersion;\n}\n\nexport function serviceUpgradeVersion(config: ComputerConfig, installed: string, cliVersion = SDK_VERSION): string | undefined {\n const wanted = managedServiceVersion(config, cliVersion);\n if (config.daemonBin || !/^\\d+\\.\\d+\\.\\d+$/.test(wanted) || versionAtLeast(installed, wanted)) return;\n return wanted;\n}\n","import { spawn, execFileSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { Mindwire } from \"../client.js\";\nimport { ensureDaemonBinary } from \"../daemon-binary.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport type { ComputerInfo, ComputerRoute, ComputerUpdate } from \"../computer.js\";\nimport { computerClient, directRoutes, readJSON, writeJSON, CONTROLLER_PROTOCOL, type ComputerConfig, type ControllerState } from \"./lifecycle.js\";\nimport { adoptRelay, startRelay, type RelayHandle } from \"./relay.js\";\nimport { checkRelay, relayNeedsRestart, relayProviderReachable, RelayCheckError } from \"./relay-health.js\";\nimport { adoptProcess, ownChild, currentProcessIdentity, processStateAlive, processIdentity, type OwnedProcess, type ProcessIdentity } from \"./process.js\";\nimport { RelayOutput } from \"./relay-output.js\";\nimport { connectionInfo } from \"./provider-info.js\";\nimport type { ComputerConnectionChange } from \"./connection-change.js\";\nimport { ProviderConnectionError, providerNeedsAction } from \"./provider-errors.js\";\nimport { managedServiceVersion, serviceUpgradeVersion } from \"./runtime-version.js\";\nimport { reconcileAddressDiscovery } from \"./discovery.js\";\nimport { activeUpdate, queueServiceUpdate } from \"./service-update.js\";\n\ninterface SavedRelay { owner: ProcessIdentity; port: number; options: string; route?: ComputerRoute; outputFile?: string; configFile?: string }\nasync function saveRelay(file: string, handle: RelayHandle | undefined, port: number, options: ComputerConfig[\"relay\"]): Promise<void> {\n if (handle?.owner?.identity) await writeJSON(file, { owner: handle.owner.identity, port, options: JSON.stringify(options),\n route: handle.route, outputFile: handle.outputFile, configFile: handle.configFile } satisfies SavedRelay);\n else await fs.rm(file, { force: true });\n}\nexport function recoveryDelay(failures: number): number { return Math.min(60_000, 1000 * 2 ** Math.min(6, Math.max(0, failures - 1))); }\n\n/** Own process lifecycle separately from any mobile view or pairing command. */\nexport async function superviseComputer(directory: string): Promise<void> {\n if ((await readJSON<{ stopped: boolean }>(path.join(directory, \"computer-stopped.json\")))?.stopped) return;\n let config = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n if (!config) throw new Error(\"Computer configuration is missing.\");\n const controllerPath = path.join(directory, \"computer-controller.json\");\n const relayPath = path.join(directory, \"computer-relay.json\");\n const previous = await readJSON<ControllerState>(controllerPath);\n if (await processStateAlive(previous)) throw new Error(\"The computer already has a service controller.\");\n const owner = await currentProcessIdentity();\n const phase = (message: string) => writeJSON(controllerPath, { ...owner, protocol: CONTROLLER_PROTOCOL, cliVersion: SDK_VERSION, ready: false, phase: message, recovering: true });\n await phase(\"Preparing Mindwire…\");\n let child: OwnedProcess | undefined, relay: RelayHandle | undefined, stopping = false;\n let relayTask: Promise<void> | undefined, updateTask: Promise<void> | undefined;\n let connectionTask: Promise<void> | undefined;\n let maintenanceTask: Promise<void> | undefined;\n let relayResult: { handle?: RelayHandle; error?: unknown } | undefined;\n let checkTask: Promise<void> | undefined;\n let checkResult: { relay: RelayHandle; error?: unknown; canRestart?: boolean } | undefined;\n const abort = new AbortController();\n const stop = () => { stopping = true; abort.abort(); };\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n\n let token: string;\n try { token = (await fs.readFile(path.join(directory, \"daemon.token\"), \"utf8\")).trim(); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n token = randomBytes(32).toString(\"hex\");\n await fs.writeFile(path.join(directory, \"daemon.token\"), token, { mode: 0o600, flag: \"wx\" });\n }\n const daemonEnv = { ...process.env };\n if (process.platform === \"win32\") {\n try {\n const git = execFileSync(\"where.exe\", [\"git\"], { encoding: \"utf8\", timeout: 3000, windowsHide: true }).split(/\\r?\\n/)[0];\n if (git) {\n const shellDirectory = path.resolve(path.dirname(git), \"..\", \"bin\");\n await fs.access(path.join(shellDirectory, \"bash.exe\"));\n const pathKey = Object.keys(daemonEnv).find(key => key.toLowerCase() === \"path\") ?? \"PATH\";\n daemonEnv[pathKey] = `${shellDirectory}${path.delimiter}${daemonEnv[pathKey] ?? \"\"}`;\n }\n } catch { /* Git/Bash are checked only when their capabilities are used. */ }\n }\n const oldRuntime = await readJSON<ComputerInfo>(path.join(directory, \"computer-runtime.json\"));\n // An automatically selected port remains stable across controller/release restarts.\n let sshPort = config.sshPort || oldRuntime?.sshPort || 0;\n let websocketPort = config.websocketPort || oldRuntime?.websocketPort || 0;\n const launch = async (binary: string): Promise<Mindwire> => {\n await fs.rm(path.join(directory, \"computer-runtime.json\"), { force: true });\n const process = spawn(binary, [\"--computer\"], {\n cwd: config!.directory, stdio: [\"ignore\", \"inherit\", \"inherit\"], windowsHide: true,\n env: { ...daemonEnv, DAEMON_TOKEN: token, ADDR: \"127.0.0.1:0\", STATE_PATH: path.join(directory, \"agent-state.json\"),\n WORKSPACE_DB_PATH: path.join(directory, \"workspace.db\"), AGENT_CWD: config!.directory,\n COMPUTER_SSH_ADDR: `${config!.bind.includes(\":\") ? `[${config!.bind}]` : config!.bind}:${sshPort}`,\n COMPUTER_WS_ADDR: `127.0.0.1:${websocketPort}`, MINDWIRE_COMPUTER_MANAGED: \"1\" },\n });\n let failure: Error | undefined;\n process.on(\"error\", error => { failure = error; });\n await new Promise<void>((resolve, reject) => { process.once(\"spawn\", resolve); process.once(\"error\", reject); });\n child = await ownChild(process);\n for (let attempt = 0; attempt < 100; attempt++) {\n if (stopping) throw new Error(\"Mindwire is stopping.\");\n if (failure) throw failure;\n if (!child.alive()) throw new Error(\"Mindwire exited during startup. Check computer.log and the installed release.\");\n try {\n const client = await computerClient(directory);\n const info = await client.computer.info();\n if (info.pid !== child.pid) throw new Error(\"Another service owns this computer's state.\");\n const health = await client.health();\n if ((health as { computerConnectionVersion?: number }).computerConnectionVersion !== 1) throw new Error(\"Update Mindwire to a release that supports computer connections.\");\n sshPort = info.sshPort; websocketPort = info.websocketPort;\n return client;\n } catch (error) { if (attempt === 99) throw error; }\n await delay(100);\n }\n throw new Error(\"Mindwire startup timed out.\");\n };\n\n let routes: ComputerRoute[] = [], published = \"\";\n let client: Mindwire | undefined;\n let relayMessage = \"Preparing your internet connection…\", relayError: string | undefined;\n let relayErrorCode: string | undefined;\n let daemonError: string | undefined, nextDaemonAt = 0, daemonFailures = 0;\n let nextRelayAt = 0, relayFailures = 0, changingDaemon = false;\n let daemonReadyAt = Date.now(), relayReadyAt = Date.now();\n let relayReachable = false, relayWasReachable = false, relayHealthFailures = 0;\n let relayFailedAt = 0;\n let nextCheckAt = 0, checkedAt = 0;\n let nextMaintenanceAt = 0, maintenanceCheckedAt = 0, maintenanceFailures = 0;\n let discoveryError: string | undefined;\n try {\n await phase(\"Checking the Mindwire service…\");\n // A killed controller must not restart a healthy daemon or lose its PTYs.\n try { client = await computerClient(directory); } catch { /* Cold start. */ }\n const wantedVersion = managedServiceVersion(config);\n const installedVersion = client ? (await client.health()).version : wantedVersion;\n let binary = config.daemonBin ?? await ensureDaemonBinary({ version: installedVersion,\n cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR, exactVersion: !!client || config.versionPinned });\n if (client) {\n const info = await client.computer.info();\n const identity = await processIdentity(info.pid);\n child = identity ? await adoptProcess(identity) : undefined;\n if (!child) throw new Error(\"Couldn't verify the existing Mindwire process. Leave it running and retry.\");\n sshPort = info.sshPort; websocketPort = info.websocketPort;\n } else {\n await phase(\"Starting the Mindwire service…\");\n client = await launch(binary);\n const startedVersion = (await client.health()).version.replace(/^v/, \"\");\n if (!config.daemonBin && config.version !== startedVersion) {\n config = { ...config, version: startedVersion };\n await writeJSON(path.join(directory, \"computer-config.json\"), config);\n }\n }\n\n const saved = await readJSON<SavedRelay>(relayPath);\n const candidatePath = path.join(directory, \"computer-relay-candidate.json\");\n const abandonedCandidate = await readJSON<SavedRelay>(candidatePath);\n if (abandonedCandidate && (abandonedCandidate.owner.pid !== saved?.owner.pid || abandonedCandidate.owner.start !== saved?.owner.start)) {\n const abandonedOwner = await adoptProcess(abandonedCandidate.owner);\n if (abandonedOwner) await (await adoptRelay(abandonedOwner, abandonedCandidate.route, directory, abandonedCandidate.outputFile, abandonedCandidate.configFile)).close();\n }\n await fs.rm(candidatePath, { force: true });\n if (saved) {\n const owner = await adoptProcess(saved.owner);\n if (owner) {\n if (saved.outputFile && saved.route && saved.port === websocketPort && saved.options === JSON.stringify(config.relay)) {\n relay = await adoptRelay(owner, saved.route, directory, saved.outputFile, saved.configFile);\n relayWasReachable = !!previous?.routes?.some(route => JSON.stringify(route) === JSON.stringify(saved.route));\n if (previous?.relayFailureSince && relayWasReachable) {\n relayFailedAt = Math.min(Date.now(), previous.relayFailureSince);\n relayHealthFailures = previous.relayFailures ?? 0;\n }\n } else {\n // An old helper's pipes belonged to the controller we replaced. It\n // can still answer briefly, then die on its next log write. Migrate\n // it once before certifying a QR, keeping the daemon and phone keys.\n if (!saved.outputFile) await phase(\"Refreshing the internet tunnel for this update…\");\n const abandoned = await adoptRelay(owner, saved.route, directory, saved.outputFile, saved.configFile);\n await abandoned.close();\n await fs.rm(relayPath, { force: true });\n }\n } else if (saved.outputFile) {\n await (await RelayOutput.adopt(directory, saved.outputFile))?.close();\n }\n }\n\n let lastController = \"\";\n while (!stopping) {\n const changePath = path.join(directory, \"computer-connection-change.json\");\n const change = !connectionTask && !relayTask && !updateTask && !maintenanceTask && !changingDaemon && client && child?.alive()\n ? await readJSON<ComputerConnectionChange>(changePath) : undefined;\n if (change && [\"queued\", \"connecting\"].includes(change.status)) {\n connectionTask = (async () => {\n const previousConfig = config!;\n const next = { ...previousConfig, ...change.patch };\n let previousRelay = relay;\n let releasedPrevious = false;\n let candidate: RelayHandle | undefined;\n let committed = false;\n let lastVerificationError: Error | undefined;\n const changing = new AbortController();\n const cancel = () => changing.abort();\n abort.signal.addEventListener(\"abort\", cancel, { once: true });\n const timeout = setTimeout(cancel, 115_000);\n const report = (message: string) => writeJSON(changePath, { ...change, status: \"connecting\", message });\n try {\n await report(\"Preparing the new connection; your current service keeps running…\");\n if (JSON.stringify(next.relay) === JSON.stringify(previousConfig.relay) && previousRelay\n && (!previousRelay.owner || previousRelay.owner.alive())) candidate = previousRelay;\n else {\n // A reserved endpoint can have only one owner. Reauthentication\n // briefly replaces that carrier, keeping SSH identity and PTYs.\n if (previousRelay?.owner && [\"ngrok\", \"oblien\"].includes(next.relay.kind)\n && next.relay.kind === previousConfig.relay.kind && next.relay.url === previousConfig.relay.url) {\n await report(\"Refreshing the saved provider connection; your terminals keep running…\");\n releasedPrevious = true; relayReachable = false;\n await previousRelay.close();\n }\n candidate = await startRelay(next.relay, websocketPort, {\n cacheDir: path.join(directory, \"tools\"), outputDirectory: directory, cliPath: process.argv[1], signal: changing.signal,\n onProgress: report,\n onSpawn: async (owner, outputFile, configFile) => {\n if (owner.identity) await writeJSON(candidatePath, { owner: owner.identity, port: websocketPort,\n options: JSON.stringify(next.relay), outputFile, configFile } satisfies SavedRelay);\n },\n });\n }\n if (next.relay.kind !== \"none\") {\n if (!candidate?.route) throw new Error(\"The provider didn't return an address.\");\n await report(\"Verifying the new secure connection…\");\n for (;;) {\n changing.signal.throwIfAborted();\n try { await checkRelay(candidate.route, { signal: changing.signal }); break; }\n catch (error) {\n if (error instanceof Error) lastVerificationError = error;\n if (error instanceof RelayCheckError && providerNeedsAction(error.code)) throw error;\n await delay(2000, undefined, { signal: changing.signal });\n }\n }\n }\n changing.signal.throwIfAborted();\n const nextRoutes = directRoutes(next, sshPort);\n if (candidate?.route) nextRoutes.push(candidate.route);\n if (!nextRoutes.length) throw new Error(\"No reachable address was configured.\");\n await client!.computer.setRoutes(nextRoutes, connectionInfo(next.relay, next.host));\n await writeJSON(path.join(directory, \"computer-config.json\"), next);\n await saveRelay(relayPath, candidate, websocketPort, next.relay);\n config = next; relay = candidate; routes = nextRoutes; published = \"\";\n relayReachable = true; relayWasReachable = true; relayHealthFailures = 0; relayFailedAt = 0;\n relayError = undefined; relayErrorCode = undefined; checkedAt = Date.now(); nextCheckAt = checkedAt + 30_000;\n committed = true;\n if (previousRelay && previousRelay !== candidate) await previousRelay.close();\n await writeJSON(changePath, { ...change, status: \"complete\", message: \"Persistent connection is ready.\" });\n } catch (error) {\n if (!committed) {\n if (candidate && candidate !== previousRelay) await candidate.close();\n await writeJSON(path.join(directory, \"computer-config.json\"), previousConfig);\n if (releasedPrevious) {\n previousRelay = undefined;\n if (!stopping) {\n await report(\"Restoring the previous provider connection…\");\n try {\n previousRelay = await startRelay(previousConfig.relay, websocketPort, {\n cacheDir: path.join(directory, \"tools\"), outputDirectory: directory, cliPath: process.argv[1], signal: abort.signal,\n });\n } catch { /* Normal background recovery retries the original provider. */ }\n }\n relayReachable = false; nextCheckAt = 0; nextRelayAt = 0;\n }\n relay = previousRelay;\n await saveRelay(relayPath, previousRelay, websocketPort, previousConfig.relay);\n published = \"\"; // Re-publish the original routes if a disk write failed during commit.\n }\n await writeJSON(changePath, { ...change, status: committed ? \"complete\" : \"failed\",\n message: committed ? \"Connection is ready.\" : `Connection setup didn't finish. ${error instanceof Error && error.name !== \"AbortError\" ? error.message : lastVerificationError?.message ?? \"Check the provider configuration and internet connection.\"} The previous service keeps running.` });\n } finally {\n clearTimeout(timeout); abort.signal.removeEventListener(\"abort\", cancel);\n await fs.rm(candidatePath, { force: true });\n }\n })().catch(() => {\n relayError = \"The connection change could not be saved. Check free disk space, then run mindwire connection again.\";\n }).finally(() => { connectionTask = undefined; });\n }\n if (!changingDaemon && child && !child.alive()) {\n child = undefined; client = undefined;\n daemonError = \"The service stopped. Restarting it…\";\n nextDaemonAt = Date.now() + recoveryDelay(++daemonFailures);\n }\n if (child?.alive() && Date.now() - daemonReadyAt > 60_000) daemonFailures = 0;\n if (relayReachable && relay?.owner?.alive() && Date.now() - relayReadyAt > 60_000) relayFailures = 0;\n if (!changingDaemon && !child?.alive() && Date.now() >= nextDaemonAt) {\n daemonError = \"The service stopped. Restarting it…\";\n await phase(daemonError);\n try {\n client = await launch(binary); published = \"\"; daemonError = undefined; daemonReadyAt = Date.now();\n nextMaintenanceAt = 0;\n } catch (error) {\n if (child) await child.close();\n child = undefined; client = undefined;\n daemonError = error instanceof Error ? error.message : \"Service restart failed.\";\n nextDaemonAt = Date.now() + recoveryDelay(++daemonFailures);\n }\n }\n\n const requestedCheck = await readJSON<{ requestedAt: number }>(path.join(directory, \"computer-check.json\"));\n if (!maintenanceTask && !changingDaemon && !updateTask && !connectionTask && client && child?.alive()\n && (Date.now() >= nextMaintenanceAt || (requestedCheck?.requestedAt ?? 0) > maintenanceCheckedAt)) {\n const maintaining = client;\n maintenanceCheckedAt = Date.now();\n maintenanceTask = (async () => {\n try {\n const upgrade = serviceUpgradeVersion(config!, (await maintaining.health()).version);\n if (upgrade) {\n await queueServiceUpdate(maintaining, upgrade);\n discoveryError = `Service update to ${upgrade} is pending. Automatic updates wait for active work to finish.`;\n // Completion can race this read before updateTask observes it.\n // Recheck locally so an older completed request cannot strand the\n // desired release forever; waiting updates already gate this task.\n nextMaintenanceAt = Date.now() + 2000;\n return;\n }\n await reconcileAddressDiscovery({ directory, config: config!, computer: maintaining, signal: abort.signal });\n discoveryError = undefined; maintenanceFailures = 0;\n nextMaintenanceAt = Date.now() + 60_000;\n } catch (error) {\n if (!stopping) {\n discoveryError = error instanceof Error ? error.message : \"Automatic reconnection setup will retry.\";\n nextMaintenanceAt = Date.now() + recoveryDelay(++maintenanceFailures);\n }\n }\n })().finally(() => { maintenanceTask = undefined; });\n }\n if (!connectionTask && relay?.owner && !relay.owner.alive()) {\n await relay.close();\n relay = undefined;\n relayReachable = false; relayWasReachable = false;\n relayErrorCode = undefined;\n relayError = \"The internet tunnel disconnected. Reconnecting…\";\n nextRelayAt = Date.now() + recoveryDelay(++relayFailures);\n }\n if (relayResult) {\n const result = relayResult; relayResult = undefined; relayTask = undefined;\n if (result.handle) {\n relay = result.handle; relayError = undefined; relayErrorCode = undefined; relayReadyAt = Date.now();\n relayReachable = false; relayWasReachable = false; relayHealthFailures = 0; relayFailedAt = 0; nextCheckAt = 0;\n if (relay.owner?.identity) await writeJSON(relayPath, {\n owner: relay.owner.identity, port: websocketPort, options: JSON.stringify(config.relay), route: relay.route, outputFile: relay.outputFile, configFile: relay.configFile,\n } satisfies SavedRelay);\n } else {\n checkedAt = Date.now();\n relayError = result.error instanceof Error ? result.error.message : \"The internet tunnel couldn't connect.\";\n relayErrorCode = result.error instanceof ProviderConnectionError ? result.error.code : undefined;\n nextRelayAt = Date.now() + (providerNeedsAction(relayErrorCode) ? 60_000 : recoveryDelay(++relayFailures));\n }\n }\n if (!relay && !relayTask && !connectionTask && (Date.now() >= nextRelayAt || (requestedCheck?.requestedAt ?? 0) > checkedAt)) {\n relayError = undefined; relayErrorCode = undefined;\n relayMessage = \"Reconnecting your internet tunnel…\";\n relayTask = startRelay(config.relay, websocketPort, {\n cacheDir: path.join(directory, \"tools\"), outputDirectory: directory, cliPath: process.argv[1], signal: abort.signal,\n onProgress: message => { relayMessage = message; },\n onSpawn: async (owner, outputFile, configFile) => {\n if (owner.identity) await writeJSON(relayPath, {\n owner: owner.identity, port: websocketPort, options: JSON.stringify(config!.relay), outputFile, configFile,\n } satisfies SavedRelay);\n },\n }).then(handle => { relayResult = { handle }; }, error => { relayResult = { error }; });\n }\n\n if (checkResult) {\n const result = checkResult; checkResult = undefined; checkTask = undefined;\n // A late failure from a replaced helper cannot invalidate its successor.\n if (result.relay === relay) {\n checkedAt = Date.now();\n relayReachable = !result.error;\n if (!result.error) {\n relayWasReachable = true; relayHealthFailures = 0; relayFailedAt = 0; relayError = undefined; relayErrorCode = undefined;\n nextCheckAt = checkedAt + 30_000;\n } else {\n relayError = result.error instanceof Error ? result.error.message : \"The internet tunnel couldn't connect. Retrying…\";\n relayErrorCode = result.error instanceof RelayCheckError ? result.error.code : undefined;\n relayFailedAt ||= checkedAt;\n relayHealthFailures++;\n nextCheckAt = checkedAt + Math.min(15_000, recoveryDelay(relayHealthFailures));\n if (result.canRestart && !connectionTask) {\n // Only replace the tunnel after repeated failures with working\n // internet. The daemon, phone keys, chats and PTYs keep running.\n await phase(result.error instanceof RelayCheckError && result.error.addressMissing\n ? \"Cloudflare's address expired. Creating a new secure tunnel…\"\n : \"The internet tunnel stopped responding. Replacing it…\");\n await relay!.close(); relay = undefined;\n relayWasReachable = false; nextRelayAt = Date.now() + recoveryDelay(++relayFailures);\n await fs.rm(relayPath, { force: true });\n }\n }\n }\n }\n if (config.relay.kind === \"none\") checkedAt = Math.max(checkedAt, requestedCheck?.requestedAt ?? 0);\n if (relay?.route && !checkTask && (Date.now() >= nextCheckAt || (requestedCheck?.requestedAt ?? 0) > checkedAt)) {\n const checking = relay;\n checkTask = (async () => {\n try {\n await checkRelay(checking.route!, { signal: abort.signal });\n checkResult = { relay: checking };\n } catch (error) {\n const canRestart = !!checking.owner && relayFailedAt > 0\n && relayNeedsRestart(error, relayHealthFailures, Date.now() - relayFailedAt)\n && (error instanceof RelayCheckError && error.addressMissing\n || await relayProviderReachable(config!.relay, abort.signal).catch(() => false));\n checkResult = { relay: checking, error, canRestart };\n }\n })();\n }\n\n routes = directRoutes(config, sshPort);\n if (relay?.route && relayWasReachable) routes.push(relay.route);\n const metadata = connectionInfo(config.relay, config.host);\n const routeJSON = JSON.stringify({ routes, connection: metadata });\n if (!changingDaemon && client && child?.alive() && routeJSON !== published) {\n try { await client.computer.setRoutes(routes, metadata); published = routeJSON; }\n catch { /* Retry publication; never claim the new routes are ready yet. */ }\n }\n const ready = !!client && !!child?.alive() && !changingDaemon && routes.length > 0 && published === routeJSON\n && (config.relay.kind === \"none\" || relayReachable);\n const state: ControllerState = { ...owner, protocol: CONTROLLER_PROTOCOL, cliVersion: SDK_VERSION, ready, routes, checkedAt,\n phase: ready ? undefined : daemonError ?? relayError ?? relayMessage, error: daemonError ?? relayError,\n errorCode: daemonError ? undefined : relayErrorCode, recovering: !ready,\n discoveryError,\n relayFailureSince: relayFailedAt || undefined, relayFailures: relayHealthFailures || undefined };\n const serialized = JSON.stringify(state);\n if (serialized !== lastController) { await writeJSON(controllerPath, state); lastController = serialized; }\n\n const updatePath = path.join(directory, \"computer-update.json\");\n const update = !updateTask && !connectionTask && !maintenanceTask && client && child?.alive() ? await readJSON<ComputerUpdate>(updatePath) : undefined;\n if (activeUpdate(update)) {\n // Waiting for idle does not block relay recovery or address publication.\n updateTask = (async () => {\n const status = async (state: ComputerUpdate[\"status\"], error?: string) => writeJSON(updatePath,\n { ...update, status: state, error, updatedAt: new Date().toISOString() });\n try {\n await status(\"downloading\");\n const replacement = await ensureDaemonBinary({ version: update.version, cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR, exactVersion: true });\n await status(\"waiting\");\n let lease: Awaited<ReturnType<Mindwire[\"service\"][\"acquireUpdate\"]>> | undefined;\n while (!stopping && !lease) {\n try { lease = await client!.service.acquireUpdate(); }\n catch (error) { if ((error as { status?: number }).status !== 409) throw error; await delay(2000); }\n }\n if (stopping || !lease) return;\n if (lease.pid !== child?.pid) { await client!.service.releaseUpdate(lease.id); throw new Error(\"The leased service process changed.\"); }\n changingDaemon = true;\n await status(\"restarting\");\n await child!.close();\n try {\n client = await launch(replacement);\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") !== update.version) throw new Error(\"The replacement service reports a different release version.\");\n } catch (error) {\n if (child) await child.close();\n if (!stopping) client = await launch(binary);\n throw error;\n }\n binary = replacement;\n config = { ...config!, daemonBin: undefined, version: update.version };\n await writeJSON(path.join(directory, \"computer-config.json\"), config);\n await client.computer.setRoutes(routes, connectionInfo(config.relay, config.host)); published = \"\";\n await status(\"complete\");\n maintenanceFailures = 0;\n } catch (error) {\n maintenanceFailures++;\n await status(\"failed\", error instanceof Error ? error.message : \"Service update failed.\");\n }\n finally { changingDaemon = false; published = \"\"; nextMaintenanceAt = Date.now() + recoveryDelay(maintenanceFailures); }\n })().finally(() => { updateTask = undefined; });\n }\n await delay(500);\n }\n } catch (error) {\n await writeJSON(controllerPath, { ...owner, ready: false, error: error instanceof Error ? error.message : \"Computer service failed.\" });\n throw error;\n } finally {\n abort.abort();\n await relayTask; await checkTask; await updateTask; await connectionTask; await maintenanceTask;\n if (relayResult?.handle && relayResult.handle !== relay) await relayResult.handle.close();\n await relay?.close();\n if (child) await child.close();\n process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop);\n if (stopping) await writeJSON(controllerPath, { pid: 0, ready: false });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { readJSON, processIdentity, writeJSON, processStateAlive } from './chunk-RTGZDLSG.js';
1
+ import { readJSON, processIdentity, writeJSON, processStateAlive } from './chunk-BJL5K6M7.js';
2
2
  import './chunk-PFYKJ6LX.js';
3
3
  import { execFile } from 'child_process';
4
4
  import * as path from 'path';
@@ -67,5 +67,5 @@ async function handoffController(directory, state, config, info) {
67
67
  }
68
68
 
69
69
  export { handoffController };
70
- //# sourceMappingURL=controller-handoff-RUUHODNC.js.map
71
- //# sourceMappingURL=controller-handoff-RUUHODNC.js.map
70
+ //# sourceMappingURL=controller-handoff-CJKXUFQI.js.map
71
+ //# sourceMappingURL=controller-handoff-CJKXUFQI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/computer/controller-handoff.ts"],"names":["route","delay"],"mappings":"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","file":"controller-handoff-RUUHODNC.js","sourcesContent":["import { execFile } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { ComputerInfo } from \"../computer.js\";\nimport { readJSON, writeJSON, type ComputerConfig, type ControllerState } from \"./lifecycle.js\";\nimport { processIdentity, processStateAlive, type ProcessIdentity } from \"./process.js\";\n\nconst execute = promisify(execFile);\n\nasync function controllerProcess(pid: number, directory: string): Promise<{ identity: ProcessIdentity; children: { pid: number; name: string }[] }> {\n const identity = await processIdentity(pid);\n if (!identity) throw new Error(\"The computer controller changed. Retry the connection.\");\n let command: string, children: { pid: number; name: string }[];\n if (process.platform === \"win32\") {\n const result = await execute(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\",\n `$p=Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; $c=@(Get-CimInstance Win32_Process -Filter 'ParentProcessId = ${pid}'); @{command=$p.CommandLine; children=@($c | ForEach-Object { @{pid=$_.ProcessId; name=$_.Name} })} | ConvertTo-Json -Depth 4 -Compress`],\n { timeout: 5000, windowsHide: true });\n const value = JSON.parse(result.stdout);\n command = String(value.command ?? \"\").replaceAll('\"', \"\");\n children = value.children;\n } else {\n const [args, processes] = await Promise.all([\n execute(\"/bin/ps\", [\"-p\", String(pid), \"-o\", \"args=\"], { timeout: 3000 }),\n execute(\"/bin/ps\", [\"-axo\", \"pid=,ppid=,comm=\"], { timeout: 3000 }),\n ]);\n command = args.stdout.trim();\n children = processes.stdout.split(\"\\n\").flatMap(line => {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)\\s+(.+)$/);\n return match && Number(match[2]) === pid ? [{ pid: Number(match[1]), name: path.basename(match[3]!) }] : [];\n });\n }\n // Old releases recorded only a PID. Verify the actual controller command before\n // signalling it; a reused PID must never affect an unrelated process.\n if (!command.endsWith(`dist${path.sep}cli.js _serve --state-dir ${directory}`)\n || !/(?:^|[\\/\\\\])(?:node|bun)(?:\\.exe)?\\s/.test(command)) {\n throw new Error(\"Couldn't verify the old Mindwire controller. Restart Mindwire on the computer before connecting.\");\n }\n if ((await processIdentity(pid))?.start !== identity.start) throw new Error(\"The computer controller changed. Retry the connection.\");\n return { identity, children };\n}\n\n/** Hand off an old CLI controller without stopping the daemon or its terminals.\n * Its graceful shutdown deliberately closes both children, so only the verified\n * supervisor is terminated; the new controller adopts the existing children. */\nexport async function handoffController(directory: string, state: ControllerState, config: ComputerConfig, info: ComputerInfo): Promise<void> {\n const { identity, children } = await controllerProcess(state.pid, directory);\n if (state.start && state.start !== identity.start) throw new Error(\"The computer controller changed. Retry the connection.\");\n const relayFile = path.join(directory, \"computer-relay.json\");\n if (!await readJSON(relayFile)) {\n // Releases before process adoption didn't record the provider child. Capture\n // just that controller's unique helper before it becomes an orphan.\n const executable = config.relay.kind === \"cloudflare\" ? \"cloudflared\" : config.relay.kind === \"ngrok\" ? \"ngrok\" : undefined;\n const candidates = executable ? children.filter(child => child.name === executable || child.name === executable + \".exe\") : [];\n const route = info.routes.find(route => route.kind === \"websocket\");\n const relayOwner = candidates.length === 1 ? await processIdentity(candidates[0]!.pid) : undefined;\n if (route && relayOwner) await writeJSON(relayFile, {\n owner: relayOwner, port: info.websocketPort, options: JSON.stringify(config.relay), route,\n });\n }\n if (!await processStateAlive(identity)) throw new Error(\"The computer controller changed. Retry the connection.\");\n process.kill(identity.pid, \"SIGKILL\");\n for (let attempt = 0; attempt < 40; attempt++) {\n if (!await processStateAlive(identity)) return;\n await delay(50);\n }\n throw new Error(\"The old Mindwire controller is still exiting. Retry the connection.\");\n}\n"]}
1
+ {"version":3,"sources":["../src/computer/controller-handoff.ts"],"names":["route","delay"],"mappings":"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","file":"controller-handoff-CJKXUFQI.js","sourcesContent":["import { execFile } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { ComputerInfo } from \"../computer.js\";\nimport { readJSON, writeJSON, type ComputerConfig, type ControllerState } from \"./lifecycle.js\";\nimport { processIdentity, processStateAlive, type ProcessIdentity } from \"./process.js\";\n\nconst execute = promisify(execFile);\n\nasync function controllerProcess(pid: number, directory: string): Promise<{ identity: ProcessIdentity; children: { pid: number; name: string }[] }> {\n const identity = await processIdentity(pid);\n if (!identity) throw new Error(\"The computer controller changed. Retry the connection.\");\n let command: string, children: { pid: number; name: string }[];\n if (process.platform === \"win32\") {\n const result = await execute(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\",\n `$p=Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}'; $c=@(Get-CimInstance Win32_Process -Filter 'ParentProcessId = ${pid}'); @{command=$p.CommandLine; children=@($c | ForEach-Object { @{pid=$_.ProcessId; name=$_.Name} })} | ConvertTo-Json -Depth 4 -Compress`],\n { timeout: 5000, windowsHide: true });\n const value = JSON.parse(result.stdout);\n command = String(value.command ?? \"\").replaceAll('\"', \"\");\n children = value.children;\n } else {\n const [args, processes] = await Promise.all([\n execute(\"/bin/ps\", [\"-p\", String(pid), \"-o\", \"args=\"], { timeout: 3000 }),\n execute(\"/bin/ps\", [\"-axo\", \"pid=,ppid=,comm=\"], { timeout: 3000 }),\n ]);\n command = args.stdout.trim();\n children = processes.stdout.split(\"\\n\").flatMap(line => {\n const match = line.trim().match(/^(\\d+)\\s+(\\d+)\\s+(.+)$/);\n return match && Number(match[2]) === pid ? [{ pid: Number(match[1]), name: path.basename(match[3]!) }] : [];\n });\n }\n // Old releases recorded only a PID. Verify the actual controller command before\n // signalling it; a reused PID must never affect an unrelated process.\n if (!command.endsWith(`dist${path.sep}cli.js _serve --state-dir ${directory}`)\n || !/(?:^|[\\/\\\\])(?:node|bun)(?:\\.exe)?\\s/.test(command)) {\n throw new Error(\"Couldn't verify the old Mindwire controller. Restart Mindwire on the computer before connecting.\");\n }\n if ((await processIdentity(pid))?.start !== identity.start) throw new Error(\"The computer controller changed. Retry the connection.\");\n return { identity, children };\n}\n\n/** Hand off an old CLI controller without stopping the daemon or its terminals.\n * Its graceful shutdown deliberately closes both children, so only the verified\n * supervisor is terminated; the new controller adopts the existing children. */\nexport async function handoffController(directory: string, state: ControllerState, config: ComputerConfig, info: ComputerInfo): Promise<void> {\n const { identity, children } = await controllerProcess(state.pid, directory);\n if (state.start && state.start !== identity.start) throw new Error(\"The computer controller changed. Retry the connection.\");\n const relayFile = path.join(directory, \"computer-relay.json\");\n if (!await readJSON(relayFile)) {\n // Releases before process adoption didn't record the provider child. Capture\n // just that controller's unique helper before it becomes an orphan.\n const executable = config.relay.kind === \"cloudflare\" ? \"cloudflared\" : config.relay.kind === \"ngrok\" ? \"ngrok\" : undefined;\n const candidates = executable ? children.filter(child => child.name === executable || child.name === executable + \".exe\") : [];\n const route = info.routes.find(route => route.kind === \"websocket\");\n const relayOwner = candidates.length === 1 ? await processIdentity(candidates[0]!.pid) : undefined;\n if (route && relayOwner) await writeJSON(relayFile, {\n owner: relayOwner, port: info.websocketPort, options: JSON.stringify(config.relay), route,\n });\n }\n if (!await processStateAlive(identity)) throw new Error(\"The computer controller changed. Retry the connection.\");\n process.kill(identity.pid, \"SIGKILL\");\n for (let attempt = 0; attempt < 40; attempt++) {\n if (!await processStateAlive(identity)) return;\n await delay(50);\n }\n throw new Error(\"The old Mindwire controller is still exiting. Retry the connection.\");\n}\n"]}
@@ -0,0 +1,57 @@
1
+ import type { Mindwire } from "./client.js";
2
+ import type { WorkspaceSnapshot } from "./workspace.js";
3
+ /** Metadata from the harness's native resume list, across original folders. */
4
+ export interface Conversation {
5
+ id: string;
6
+ /** Present after association with the ordinary Mindwire chat API. */
7
+ chatId?: string;
8
+ agentId?: string;
9
+ agentType: string;
10
+ agentName: string;
11
+ projectId?: string;
12
+ projectName?: string;
13
+ cwd: string;
14
+ title: string;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ lastStatus?: string;
18
+ lastRunId?: string;
19
+ }
20
+ export interface ConversationQuery {
21
+ /** A workspace agent profile, not the harness type. Omit for all agents. */
22
+ agentId?: string;
23
+ search?: string;
24
+ cursor?: string;
25
+ /** 1–100; defaults to 50. */
26
+ limit?: number;
27
+ refresh?: boolean;
28
+ }
29
+ export interface ConversationPage {
30
+ workspaceId: string;
31
+ items: Conversation[];
32
+ total: number;
33
+ nextCursor?: string;
34
+ issues?: {
35
+ projectId: string;
36
+ agent: string;
37
+ message: string;
38
+ }[];
39
+ }
40
+ export interface ConversationOpenRequest {
41
+ id: string;
42
+ agentId?: string;
43
+ }
44
+ export interface ConversationOpenResult {
45
+ chatId: string;
46
+ snapshot: WorkspaceSnapshot;
47
+ }
48
+ /** Requires conversationBrowserVersion >= 1. No transcript copies or background polling. */
49
+ export declare class ConversationsApi {
50
+ private readonly mw;
51
+ constructor(mw: Mindwire);
52
+ /** Read-only; includes folders not registered as Mindwire projects. */
53
+ list(query?: ConversationQuery): Promise<ConversationPage>;
54
+ /** Idempotently associates the selected native session with its original folder.
55
+ * Use chatId with messages()/turn() and the ordinary chat APIs afterward. */
56
+ open(request: ConversationOpenRequest): Promise<ConversationOpenResult>;
57
+ }
@@ -8,6 +8,8 @@ export interface EnsureDaemonBinaryOptions {
8
8
  /** Override for tests or a private GitHub Releases mirror. */
9
9
  releaseBaseUrl?: string;
10
10
  fetch?: typeof fetch;
11
+ /** Managed updates must not substitute a different release when an asset is missing. */
12
+ exactVersion?: boolean;
11
13
  }
12
14
  /** Ensure the SDK-matched daemon binary is present locally and return its executable path. */
13
15
  export declare function ensureDaemonBinary(opts?: EnsureDaemonBinaryOptions): Promise<string>;
package/dist/index.cjs CHANGED
@@ -567,6 +567,18 @@ var ProjectSyncError = class extends exports.MindwireError {
567
567
  };
568
568
  var active = (o) => ["queued", "exporting", "preparing", "applying"].includes(o.status);
569
569
  var prefix = "/workspace/sync";
570
+ var selectionPaths = (paths = []) => {
571
+ const sorted = [...new Set(paths.map((path) => path.replace(/\/$/, "")))].sort();
572
+ const selected = new Set(sorted);
573
+ return sorted.filter((path) => {
574
+ let parent = path;
575
+ while (parent.includes("/")) {
576
+ parent = parent.slice(0, parent.lastIndexOf("/"));
577
+ if (selected.has(parent)) return false;
578
+ }
579
+ return true;
580
+ });
581
+ };
570
582
  function delay(ms, signal) {
571
583
  signal?.throwIfAborted();
572
584
  return new Promise((resolve, reject) => {
@@ -589,7 +601,16 @@ var ProjectSyncApi = class {
589
601
  }
590
602
  mw;
591
603
  flights = /* @__PURE__ */ new Map();
592
- export(request, options = {}) {
604
+ async requireSelectionSupport() {
605
+ if (((await this.mw.health()).projectSyncVersion ?? 0) < 2)
606
+ throw new exports.MindwireError("Update Mindwire on both workspaces to review and switch selected project files.");
607
+ }
608
+ async preview(request, options = {}) {
609
+ await this.requireSelectionSupport();
610
+ return this.mw.http.request("POST", `${prefix}/preview`, { body: request, ...options });
611
+ }
612
+ async export(request, options = {}) {
613
+ await this.requireSelectionSupport();
593
614
  return this.mw.http.request("POST", `${prefix}/exports`, { body: request, ...options });
594
615
  }
595
616
  import(request, options = {}) {
@@ -674,6 +695,7 @@ var ProjectSyncApi = class {
674
695
  * throws ProjectSyncError carrying the complete conflict/recovery operation.
675
696
  */
676
697
  switchTo(target, request, options = {}) {
698
+ request = { ...request, includeIgnored: selectionPaths(request.includeIgnored) };
677
699
  const intent = JSON.stringify(request);
678
700
  const old = this.flights.get(request.id);
679
701
  if (old) {
@@ -689,7 +711,8 @@ var ProjectSyncApi = class {
689
711
  if (!(error instanceof exports.ApiError) || error.status !== 404) throw error;
690
712
  }
691
713
  if (accepted) {
692
- if ((accepted.path ?? "") !== (request.path ?? "")) throw new exports.MindwireError("This sync ID belongs to a different destination folder.");
714
+ if ((accepted.path ?? "") !== (request.path ?? "") || (accepted.selectionToken ?? "") !== (request.selectionToken ?? "") || JSON.stringify(selectionPaths(accepted.includeIgnored)) !== JSON.stringify(request.includeIgnored))
715
+ throw new exports.MindwireError("This sync ID belongs to a different destination folder or file selection.");
693
716
  const operation = await target.wait(accepted.id, {
694
717
  signal: options.signal,
695
718
  onUpdate: (operation2) => options.onProgress?.({ phase: "apply", transferredBytes: 0, operation: operation2 })
@@ -698,11 +721,11 @@ var ProjectSyncApi = class {
698
721
  return operation;
699
722
  }
700
723
  const health = await Promise.all([this.mw.health(), target.mw.health()]);
701
- if (health.some((h) => (h.projectSyncVersion ?? 0) < 1)) throw new exports.MindwireError("Update Mindwire on both workspaces to switch this project.");
724
+ if (health.some((h) => (h.projectSyncVersion ?? 0) < 2)) throw new exports.MindwireError("Update Mindwire on both workspaces to review and switch selected project files.");
702
725
  let bytes = 0;
703
726
  const emit2 = (phase, operation) => options.onProgress?.({ phase, transferredBytes: bytes, operation });
704
727
  emit2("checkpoint");
705
- let o = await this.export({ id: `${request.id}-export`, projectId: request.projectId }, options);
728
+ let o = await this.export({ id: `${request.id}-export`, projectId: request.projectId, includeIgnored: request.includeIgnored, selectionToken: request.selectionToken }, options);
706
729
  o = await this.wait(o.id, { signal: options.signal, onUpdate: (value) => emit2("checkpoint", value) });
707
730
  if (o.status !== "succeeded" || !o.resultCheckpointId) throw new ProjectSyncError(o);
708
731
  emit2("transfer");
@@ -710,7 +733,7 @@ var ProjectSyncApi = class {
710
733
  bytes += n;
711
734
  emit2("transfer");
712
735
  } });
713
- o = await target.import({ id: `${request.id}-import`, checkpointId: o.resultCheckpointId, path: request.path }, options);
736
+ o = await target.import({ id: `${request.id}-import`, checkpointId: o.resultCheckpointId, path: request.path, includeIgnored: request.includeIgnored, selectionToken: request.selectionToken }, options);
714
737
  o = await target.wait(o.id, { signal: options.signal, onUpdate: (value) => emit2("apply", value) });
715
738
  if (o.status !== "succeeded") throw new ProjectSyncError(o);
716
739
  return o;
@@ -721,6 +744,23 @@ var ProjectSyncApi = class {
721
744
  }
722
745
  };
723
746
 
747
+ // src/conversations.ts
748
+ var ConversationsApi = class {
749
+ constructor(mw) {
750
+ this.mw = mw;
751
+ }
752
+ mw;
753
+ /** Read-only; includes folders not registered as Mindwire projects. */
754
+ list(query = {}) {
755
+ return this.mw.http.request("GET", "/workspace/conversations", { query: { ...query } });
756
+ }
757
+ /** Idempotently associates the selected native session with its original folder.
758
+ * Use chatId with messages()/turn() and the ordinary chat APIs afterward. */
759
+ open(request) {
760
+ return this.mw.http.request("POST", "/workspace/conversations/open", { body: request });
761
+ }
762
+ };
763
+
724
764
  // src/workspace.ts
725
765
  var ProjectOperationsApi = class {
726
766
  constructor(mw) {
@@ -792,6 +832,7 @@ var WorkspaceCollection = class {
792
832
  var WorkspaceApi = class {
793
833
  constructor(mw) {
794
834
  this.mw = mw;
835
+ this.conversations = new ConversationsApi(mw);
795
836
  this.sync = new ProjectSyncApi(mw);
796
837
  this.git = new GitAccessApi(mw);
797
838
  this.operations = new ProjectOperationsApi(mw);
@@ -800,6 +841,7 @@ var WorkspaceApi = class {
800
841
  this.chats = new WorkspaceCollection(mw, "chats");
801
842
  }
802
843
  mw;
844
+ conversations;
803
845
  sync;
804
846
  git;
805
847
  operations;
@@ -928,6 +970,17 @@ var SurfacesApi = class {
928
970
  bind(binding) {
929
971
  return this.mw.http.request("PUT", "/surfaces/desktop/binding", { body: binding });
930
972
  }
973
+ localStatus() {
974
+ return this.mw.http.request("GET", "/surfaces/desktop/local");
975
+ }
976
+ /** Local CLI only. The separate 0600 control credential is not part of phone pairing. */
977
+ configureLocal(settings, localControlToken) {
978
+ if (!localControlToken) throw new Error("Run mindwire desktop on your Mac to manage desktop access.");
979
+ return this.mw.http.request("PUT", "/surfaces/desktop/local", {
980
+ body: settings,
981
+ headers: { "X-Mindwire-Local-Control": localControlToken }
982
+ });
983
+ }
931
984
  open(request) {
932
985
  return this.mw.http.request("POST", "/surfaces/desktop/sessions", { body: request });
933
986
  }
@@ -1148,7 +1201,7 @@ init_errors();
1148
1201
  init_errors();
1149
1202
 
1150
1203
  // src/version.ts
1151
- var SDK_VERSION = "0.1.36" ;
1204
+ var SDK_VERSION = "0.1.40" ;
1152
1205
  function versionAtLeast(actual, desired) {
1153
1206
  if (actual === desired) return true;
1154
1207
  if (!actual || !/^\d+\.\d+\.\d+$/.test(actual) || !/^\d+\.\d+\.\d+$/.test(desired)) return false;
@@ -1199,7 +1252,7 @@ async function ensureDaemonBinary(opts = {}) {
1199
1252
  if (!request) throw new exports.MindwireError("mindwire: fetch is unavailable; set daemonBin or MINDWIRE_DAEMON");
1200
1253
  const [checksums, binary] = await Promise.all([request(`${release}/checksums.txt`), request(`${release}/${asset}`)]);
1201
1254
  if (!checksums.ok || !binary.ok) {
1202
- if (!opts.releaseBaseUrl && !proc.process?.env?.MINDWIRE_RELEASE_BASE_URL) {
1255
+ if (!opts.exactVersion && !opts.releaseBaseUrl && !proc.process?.env?.MINDWIRE_RELEASE_BASE_URL) {
1203
1256
  const latest = await request("https://api.github.com/repos/oblien/mindwire/releases/latest");
1204
1257
  if (latest.ok) {
1205
1258
  const tag = (await latest.json()).tag_name;
@@ -1588,14 +1641,14 @@ var Mindwire = class _Mindwire {
1588
1641
  }
1589
1642
  /**
1590
1643
  * `POST /chats/{id}/fork` — clone a chat into a new id (generated when `newChatId` is omitted).
1591
- * The fork shares the source's native session until its first turn, which branches it (natively
1592
- * on Claude via `--fork-session`; a fresh session on agents without native fork). Rejects with a
1593
- * 409 if the source has a live turn, 404 if the source is unknown, 400 if the target id is in
1594
- * use. Returns the new chat's summary.
1644
+ * Codex and Claude preserve native context. `beforeMessageId` excludes that prompt and every
1645
+ * later message; send the edited prompt to the returned chat with `turn`. Reuse `newChatId`
1646
+ * and the turn's `requestId` on retries. The source chat and filesystem are unchanged.
1647
+ * A source with a live turn returns 409; an unknown source returns 404.
1595
1648
  */
1596
1649
  forkChat(chatId, opts = {}) {
1597
1650
  return this.http.request("POST", `/chats/${encodeURIComponent(chatId)}/fork`, {
1598
- body: opts.newChatId ? { newChatId: opts.newChatId } : {}
1651
+ body: opts
1599
1652
  });
1600
1653
  }
1601
1654
  /**
@@ -3160,6 +3213,7 @@ init_errors();
3160
3213
  exports.AuthApi = AuthApi;
3161
3214
  exports.ComputerApi = ComputerApi;
3162
3215
  exports.ContainerHost = ContainerHost;
3216
+ exports.ConversationsApi = ConversationsApi;
3163
3217
  exports.ExecutionApi = ExecutionApi;
3164
3218
  exports.GitAccessApi = GitAccessApi;
3165
3219
  exports.Http = Http;