@parlor/auth 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/account.d.ts +8 -1
  2. package/dist/account.d.ts.map +1 -1
  3. package/dist/account.js +13 -0
  4. package/dist/account.js.map +1 -1
  5. package/dist/audit.js.map +1 -1
  6. package/dist/better-auth.d.ts +5 -0
  7. package/dist/better-auth.d.ts.map +1 -1
  8. package/dist/better-auth.js +5 -3
  9. package/dist/better-auth.js.map +1 -1
  10. package/dist/client/index.d.ts +40 -4
  11. package/dist/client/index.d.ts.map +1 -1
  12. package/dist/client/index.js +105 -5
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/database.js.map +1 -1
  15. package/dist/devices.d.ts.map +1 -1
  16. package/dist/devices.js +6 -1
  17. package/dist/devices.js.map +1 -1
  18. package/dist/es256.js.map +1 -1
  19. package/dist/grants.js.map +1 -1
  20. package/dist/hosts.d.ts +6 -1
  21. package/dist/hosts.d.ts.map +1 -1
  22. package/dist/hosts.js +53 -5
  23. package/dist/hosts.js.map +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/migrations.js.map +1 -1
  26. package/dist/native-sign-in.d.ts +45 -0
  27. package/dist/native-sign-in.d.ts.map +1 -0
  28. package/dist/native-sign-in.js +183 -0
  29. package/dist/native-sign-in.js.map +1 -0
  30. package/dist/pages.d.ts +1 -1
  31. package/dist/pages.d.ts.map +1 -1
  32. package/dist/pages.js +8 -4
  33. package/dist/pages.js.map +1 -1
  34. package/dist/provider.d.ts +11 -4
  35. package/dist/provider.d.ts.map +1 -1
  36. package/dist/provider.js +36 -2
  37. package/dist/provider.js.map +1 -1
  38. package/dist/revocation.js.map +1 -1
  39. package/dist/routes.js.map +1 -1
  40. package/dist/schema.js.map +1 -1
  41. package/dist/statements.d.ts +2 -0
  42. package/dist/statements.d.ts.map +1 -1
  43. package/dist/statements.js +2 -0
  44. package/dist/statements.js.map +1 -1
  45. package/dist/tokens.d.ts +27 -1
  46. package/dist/tokens.d.ts.map +1 -1
  47. package/dist/tokens.js +82 -3
  48. package/dist/tokens.js.map +1 -1
  49. package/dist/turn-keys.js.map +1 -1
  50. package/package.json +7 -7
package/dist/hosts.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EACL,WAAW,EACX,IAAI,EAEJ,YAAY,GAKb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAEL,WAAW,EAEX,eAAe,EAGf,WAAW,EACX,eAAe,EACf,aAAa,EACb,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAC;AACpF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAA2B,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAiB,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AA4CzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AA6B5C,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC;AACpC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,aAAa,GAAG,KAAK,CAAC;AAgB5B,MAAM,UAAU,GAAG,IAAI,OAAO,EAAgC,CAAC;AAC/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAkC,CAAC;AAE9D,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAW,CAAC;AAEhE,SAAS,WAAW,CAAC,KAAe;IAClC,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAsB,EACtB,OAAO,GAAqB,EAAE;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiE,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEjE,MAAM,IAAI,GAAG,KAAK,EAAE,OAAgB,EAAiC,EAAE;QACrE,MAAM,IAAI,GAAG,MAAM,CACjB,MAAO,QAAQ,CAAC,IAAI,EAAe,CAAC,OAAO,CAAC,GAAG,CAAA;;2BAE1B,OAAO,EAAE,CAAC,CAChC,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3B,OAAO,MAAM,CAAC,IAAI,GAAG,qBAAqB,EAAE,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,GAAa;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;YACjC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;YAChC,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC;QACF,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,OAAO;YACf,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC;YACxD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,GAAG,EAAE,GAAG,QAAQ,GAAG,iBAAiB;oBAAE,OAAO,SAAS,CAAC;gBAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAChC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC,CAAC;AAEF,SAAS,QAAQ,CACf,IAAe,EACf,OAAe,EACf,GAAW,EACX,GAAW,EACX,aAAqB;IAErB,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,IAAI,SAAS,GAAG,GAAG;YAAE,MAAM;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,IAAI,CAAC,IAAI,IAAI,iBAAiB;QAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,SAAwB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACpD,CAAC;QACvB,IAAI,MAAM,CAAC,GAAG,KAAK,kBAAkB,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAwB,EACxB,OAA0D,EAC1D,IAAe,EACf,GAAW;IAEX,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE;YACxE,UAAU,EAAE,CAAC,OAAO,CAAC;SACtB,CAAC,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CACnB,SAAS,EACT,oDAAoD,CACrD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO;QACV,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;IACnC,IACE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,qBAAqB,GAAG,IAAI;QACtD,QAAQ,GAAG,GAAG,GAAG,aAAa,EAC9B,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,gDAAgD,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,GAAG,GAAG,QAAQ,GAAG,qBAAqB,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QACvE,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,QAAQ,GAAG,qBAAqB,CAAC,CAAC;IACtF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,WAAW,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAc;IACxC,EAAE,EAAE,iBAAiB;IACrB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;MAwBD;CACL,CAAC;AAeF,SAAS,UAAU,CAAC,IAAgB;IAClC,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAOD;;;GAGG;AACH,KAAK,UAAU,WAAW,CACxB,IAAmB,EACnB,KAAiE,EACjE,MAAc;IAEd,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACxD,MAAM,EAAE,GAAG,MAAkB,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CACpB,MAAM,EAAE,CAAC,OAAO,CACd,QAAQ,IAAI,KAAK;YACf,CAAC,CAAC,GAAG,CAAA,iDAAiD,KAAK,CAAC,MAAM,kBAAkB,MAAM,8BAA8B;YACxH,CAAC,CAAC,GAAG,CAAA,kDAAkD,KAAK,CAAC,OAAO,kBAAkB,MAAM,8BAA8B,CAC7H,CACF,CAAC,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAUD,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAE9E,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,IAAmB;IACpD,OAAO,cAAc,CAAC;QACpB,KAAK,EAAE,YAAY,CAAC;YAClB,WAAW,EAAE,+CAA+C;YAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAA4B,EAAE;gBACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,IAAI,GAAG,MAAM,CACjB,MAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAe,CAAC,OAAO,CAAC,GAAG,CAAA;;8BAExC,IAAI,CAAC,MAAM,+BAA+B,CAAC,CAChE,CAAC;gBACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;oBACjC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;oBAClC,UAAU,EAAE,GAAG,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;iBACvE,CAAC,CAAC,CAAC;YACN,CAAC;SACF,CAAC;QACF,UAAU,EAAE,YAAY,CAAC;YACvB,WAAW,EACT,uEAAuE;YACzE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAoC,EAAE;gBAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjE,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,eAAe,MAAM,EAAE,CAAC,CAAC;gBAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YACxB,CAAC;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACzC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CACnC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;IAClC,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AACvC,CAAC,CAAC,CAAC;AACL,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAC/D,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,CAAC;AAEhC,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AAC3E,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAe,cAAc,EAAE,0BAA0B,CAAC;IAC/E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;IACnD,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;IACnD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC;IAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;CAChC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACzC,SAAS,EAAE,eAAe;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,QAA6B,EAAE,EAAE,CAC7D,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAErD,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtD,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,OAAgB;IAEhB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,QAAQ,CAAC,IAAI,CAClB;QACE,KAAK,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,uDAAuD;SACjE;KACF,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;AACJ,CAAC;AAWD,KAAK,UAAU,WAAW,CACxB,SAAqB,EACrB,IAAY,EACZ,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1E,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAClC,GAAG,EACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAC/B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAC/B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD,MAAM,YAAY,GAAG,+DAA+D,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,4DAA4D,CAAC;AAErP;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,QAAQ,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IACnF,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,kBAAkB,CAAC;IACvE,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,kBAAkB,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IAEzE,OAAO;QACL,WAAW,CAAC;YACV,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAAE,OAAO,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CACvC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CACtD,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,OAAO,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBACnC,GAAG,CACF,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAChB,8BAA8B,IAAI,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAC1E;qBACA,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,IAAI,GAAG;cACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC;0BAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,IAAI,IAAI,cAAc,CAAC;kCACjD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC;8BAC9G,MAAM,CAAC,YAAY,CAAC;EAChD,MAAM;EAEN,OAAO,CAAC,UAAU,KAAK,SAAS;oBAC9B,CAAC,CAAC,kJAAkJ,MAAM,CAAC,GAAG,CAAC,4FAA4F;oBAC3P,CAAC,CAAC,EACN;;;QAGQ,CAAC;gBACD,MAAM,MAAM,GACV,OAAO,CAAC,WAAW,KAAK,YAAY;oBAClC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC5C,OAAO,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;YACjE,CAAC;SACF,CAAC;QACF,WAAW,CAAC;YACV,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,OAAe,EAAE,EAAE,CAC/D,IAAI;oBACF,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;oBACzD,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IACE,MAAM,KAAK,QAAQ,CAAC,MAAM;oBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,aAAa,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EACjE,CAAC;oBACD,OAAO,MAAM,CACX,GAAG,EACH,WAAW,EACX,iDAAiD,CAClD,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;oBACtC,OAAO,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,wCAAwC,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC5D,MAAM,MAAM,GACV,OAAO,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAClF,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM;wBACT,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;oBACzE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;oBAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAChD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnD,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAClD,MAAM,EAAE,GAAG,MAAkB,CAAC;oBAC9B,MAAM,EAAE,CAAC,OAAO,CACd,GAAG,CAAA,yDAAyD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CACvF,CAAC;oBACF,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA;;;sBAGR,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,aAAa;gBAC/E,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;gBACvF,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAC7D,CAAC,CAAC,CAAC;gBACH,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,QAAQ,CAAC,IAAI,CAAC;wBACnB,IAAI;wBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;qBACpD,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,UAAU,KAAK,SAAS;oBAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjF,CAAC;SACF,CAAC;QACF;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS;oBAAE,OAAO,YAAY,EAAE,CAAC;gBAC/E,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACpD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnD,MAAM,SAAS,GAAe,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CACvC,KAAK,EAAE,MAAM,EAAE,EAAE,CACf,MAAM,CACJ,MAAO,MAAmB,CAAC,OAAO,CAAC,GAAG,CAAA;qEACiB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;iGACS,CAAC,CACrF,CAAC,CAAC,CAAC,CACP,CAAC;gBACF,IACE,CAAC,MAAM;oBACP,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;oBACnD,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;oBACnE,CAAC,QAAQ,CACP,MAAM,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,EACjD,MAAM,CAAC,cAAc,CACtB;oBACD,CAAC,CAAC,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAC5C,CAAC;oBACD,OAAO,YAAY,EAAE,CAAC;gBACxB,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC1C,MAAO,MAAmB,CAAC,OAAO,CAAC,GAAG,CAAA;;sBAE1B,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,QAAQ;gBAC5E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,QAAQ,GAAsB;oBAClC,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;oBAC9B,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;oBACrE,OAAO,EAAE,YAAY;iBACtB,CAAC;gBACF,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAClE,MAAM,IAAI,GACR,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;oBACnC,CAAC,CAAC,oBAAoB,GAAG;;;8BAGP,GAAG;uEACsC,MAAM,CAAC,KAAK,CAAC;;+BAErD;oBACnB,CAAC,CAAC,oBAAoB,GAAG;0EACqC,GAAG,+BAA+B,CAAC;gBACrG,OAAO,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;YACpE,CAAC;SACF;QACD,WAAW,CAAC;YACV,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;oBACtC,OAAO,QAAQ,CAAC,IAAI,CAClB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EACvD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,IAAI,GACR,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC5E,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;oBAC/E,IAAI;iBACL,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,QAAQ,CAAC,IAAI,CAClB;wBACE,KAAK,EAAE;4BACL,IAAI,EAAE,WAAW;4BACjB,OAAO,EACL,wFAAwF;yBAC3F;qBACF,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;gBACJ,CAAC;gBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;QACF,WAAW,CAAC;YACV,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACjC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,OAAO;oBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC/E,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["import { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\n\nimport {\n ActionError,\n asId,\n type DataProvider,\n defineAction,\n type GrantId,\n type HostId,\n type HostPrincipal,\n type UserId,\n} from \"@parlor/core\";\nimport { type ActionsOf, createRegistry } from \"@parlor/core/registry\";\nimport {\n type AnyPluginRoute,\n AuthFailure,\n type DeviceKeys,\n HOST_GRANTS_TAG,\n type Migration,\n type PluginHost,\n pluginRoute,\n readBoundedText,\n SHELL_ORIGINS,\n REVOCATION_HORIZON_MS,\n} from \"@parlor/server\";\nimport { sql } from \"drizzle-orm\";\nimport { calculateJwkThumbprint, compactVerify, decodeProtectedHeader } from \"jose\";\nimport { z } from \"zod\";\n\nimport { CHAT_REFUSED, chatAllows, signedIn } from \"./account.js\";\nimport { AUTH_PLUGIN, devOrigins, type ParlorAuthSettings } from \"./better-auth.js\";\nimport { type Database, jwkOf, rowsOf } from \"./database.js\";\nimport { findPendingDevice } from \"./devices.js\";\nimport { escape, failure, page } from \"./pages.js\";\nimport { RevocationSet } from \"./revocation.js\";\nimport { HOST_PAIRING_FRAGMENT, HOST_PAIRING_KEY } from \"./statements.js\";\nimport { HOST_ASSERTION_TYP, HOST_AUDIENCE, type HostAssertion } from \"./tokens.js\";\n\nexport const HOST_CLIENT_ID = \"parlor-host\";\n\nexport const MATCHING_CODE = /^[A-Z2-9]{3}-[A-Z2-9]{3}$/;\n\nexport type HostRedirect = `http://127.0.0.1:${number}/callback` | \"urn:parlor:ipc\";\n\nexport interface HostAuthorizeRequest {\n readonly redirectUri: HostRedirect;\n readonly codeChallenge: string;\n readonly state: string;\n readonly hostName: string;\n readonly platform: string;\n readonly matchingCode: string;\n /** RFC 7638 thumbprint of the key the code exchange must be signed with. */\n readonly keyThumbprint: string;\n /** The host can also hand the app to the coding agents on the computer, outside the sidebar. */\n readonly agentTools?: \"offered\" | undefined;\n}\n\n/** `POST /hosts/token` */\nexport interface HostKeyExchange {\n readonly code: string;\n readonly codeVerifier: string;\n readonly publicKey: JsonWebKey;\n /** ES256 over the code with the key the authorize request named. */\n readonly proof: string;\n}\n\nexport interface AccountSummary {\n readonly userId: UserId;\n readonly name: string;\n readonly email?: string | undefined;\n}\n\n/** The device that approved the pairing; the host pins it as trusted once confirmed locally. */\nexport type ApprovingDevice = DeviceKeys;\n\nexport interface HostGrantResponse {\n readonly grant: { readonly id: GrantId; readonly hostId: HostId };\n /** The host shows it locally before it keeps the grant. */\n readonly account: AccountSummary;\n readonly approvedBy?: ApprovingDevice | undefined;\n /** The app's page, on its origin, that the host sends the approving browser to with the pairing secret. */\n readonly landing?: string | undefined;\n}\n\nexport const HOST_ASSERTION_TTL_MS = 60_000;\n\n/** `authorization: ParlorHost <jws>`, DPoP style: bound to one method and URL, dead in a minute. */\nexport interface HostAssertionClaims {\n readonly aud: typeof HOST_AUDIENCE;\n readonly gid: string;\n readonly htm: \"GET\" | \"POST\";\n /** without the query */\n readonly htu: string;\n readonly iat: number;\n readonly exp: number;\n /** replay-checked in a bounded per-instance LRU over the TTL window */\n readonly jti: string;\n}\n\n/** A grant as the server stores it: only the computer's public key. */\nexport interface GrantKey {\n readonly grantId: GrantId;\n readonly userId: UserId;\n readonly hostId: HostId;\n readonly publicKey: JsonWebKey;\n readonly kid: string;\n}\n\n/** In memory after one primary-key lookup; dropped when `RevocationSet` reports the grant. */\nexport interface GrantKeys {\n get(grantId: GrantId): Promise<GrantKey | undefined>;\n}\n\nconst GRANT_KEY_TTL_MS = 5 * 60_000;\nconst GRANT_KEY_CACHE_SIZE = 10_000;\n/** A missing grant is remembered briefly; grant ids are never reused, so a miss stays one. */\nexport const GRANT_MISS_TTL_MS = 5_000;\nconst GRANT_MISS_CACHE_SIZE = 1_000;\nconst REPLAY_CACHE_SIZE = 100_000;\nconst CLOCK_SKEW_MS = 5_000;\n\nexport interface GrantKeysOptions {\n /** How long a loaded key is trusted; clamped to the revocation horizon. */\n readonly ttlMs?: number | undefined;\n readonly now?: (() => number) | undefined;\n}\n\ninterface GrantRow {\n readonly grant_id: string;\n readonly user_id: string;\n readonly host_id: string;\n readonly public_key: JsonWebKey | string;\n readonly kid: string;\n}\n\nconst verifyKeys = new WeakMap<GrantKey, Promise<CryptoKey>>();\nconst replays = new WeakMap<GrantKeys, Map<string, number>>();\n\nconst EC_P256 = { name: \"ECDSA\", namedCurve: \"P-256\" } as const;\n\nfunction verifyKeyOf(grant: GrantKey): Promise<CryptoKey> {\n let key = verifyKeys.get(grant);\n if (!key) {\n key = crypto.subtle.importKey(\"jwk\", grant.publicKey, EC_P256, false, [\"verify\"]);\n verifyKeys.set(grant, key);\n }\n return key;\n}\n\n/**\n * A grant's key after one primary-key lookup, kept for a few minutes. A grant revoked\n * meanwhile has no row, and `RevocationSet` (which outlasts the cache) refuses it until the\n * cache lets go.\n */\nexport function createGrantKeys(\n database: DataProvider,\n options: GrantKeysOptions = {},\n): GrantKeys {\n const ttlMs = Math.min(options.ttlMs ?? GRANT_KEY_TTL_MS, REVOCATION_HORIZON_MS);\n const now = options.now ?? Date.now;\n const cache = new Map<string, { readonly key: GrantKey; readonly loadedAt: number }>();\n const misses = new Map<string, number>();\n const loading = new Map<string, Promise<GrantKey | undefined>>();\n\n const load = async (grantId: GrantId): Promise<GrantKey | undefined> => {\n const rows = rowsOf<GrantRow>(\n await (database.read() as Database).execute(sql`\n select grant_id, user_id, host_id, public_key, kid from parlor_auth_hosts\n where grant_id = ${grantId}`),\n );\n const row = rows[0];\n if (!row) {\n misses.set(grantId, now());\n while (misses.size > GRANT_MISS_CACHE_SIZE) {\n misses.delete(misses.keys().next().value as string);\n }\n return undefined;\n }\n const key: GrantKey = {\n grantId: asId(\"grant\", row.grant_id),\n userId: asId(\"user\", row.user_id),\n hostId: asId(\"host\", row.host_id),\n publicKey: jwkOf(row.public_key),\n kid: row.kid,\n };\n cache.set(grantId, { key, loadedAt: now() });\n while (cache.size > GRANT_KEY_CACHE_SIZE) {\n cache.delete(cache.keys().next().value as string);\n }\n return key;\n };\n\n return {\n async get(grantId) {\n const hit = cache.get(grantId);\n if (hit && now() - hit.loadedAt < ttlMs) return hit.key;\n cache.delete(grantId);\n const missedAt = misses.get(grantId);\n if (missedAt !== undefined) {\n if (now() - missedAt < GRANT_MISS_TTL_MS) return undefined;\n misses.delete(grantId);\n }\n let pending = loading.get(grantId);\n if (!pending) {\n pending = load(grantId).finally(() => loading.delete(grantId));\n loading.set(grantId, pending);\n }\n return pending;\n },\n };\n}\n\nconst assertionClaims = z.object({\n aud: z.literal(HOST_AUDIENCE),\n gid: z.string().min(1),\n htm: z.enum([\"GET\", \"POST\"]),\n htu: z.string().min(1),\n iat: z.number().int(),\n exp: z.number().int(),\n jti: z.string().min(8).max(128),\n});\n\nconst withoutQuery = (url: string): string => {\n const parsed = new URL(url);\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.href;\n};\n\nfunction claimJti(\n keys: GrantKeys,\n grantId: string,\n jti: string,\n now: number,\n rememberUntil: number,\n): boolean {\n let seen = replays.get(keys);\n if (!seen) replays.set(keys, (seen = new Map()));\n for (const [id, expiresAt] of seen) {\n if (expiresAt > now) break;\n seen.delete(id);\n }\n const id = `${grantId}:${jti}`;\n if (seen.has(id)) return false;\n while (seen.size >= REPLAY_CACHE_SIZE) seen.delete(seen.keys().next().value as string);\n seen.set(id, rememberUntil);\n return true;\n}\n\nfunction claimsOf(assertion: HostAssertion): { gid: string; kid: string | undefined } {\n try {\n const header = decodeProtectedHeader(assertion);\n const payload = JSON.parse(\n Buffer.from(assertion.split(\".\")[1] ?? \"\", \"base64url\").toString(\"utf8\"),\n ) as { gid?: unknown };\n if (header.typ !== HOST_ASSERTION_TYP || typeof payload.gid !== \"string\") {\n throw new Error(\"not a host assertion\");\n }\n return { gid: payload.gid, kid: header.kid };\n } catch {\n throw new AuthFailure(\"invalid\", \"The host assertion is malformed.\");\n }\n}\n\nexport async function verifyHostAssertion(\n assertion: HostAssertion,\n request: { readonly method: string; readonly url: string },\n keys: GrantKeys,\n now: number,\n): Promise<GrantKey> {\n const { gid, kid } = claimsOf(assertion);\n const grant = await keys.get(asId(\"grant\", gid));\n if (!grant || kid !== grant.kid) {\n throw new AuthFailure(\"invalid\", \"This computer is not connected.\");\n }\n let payload: unknown;\n try {\n const verified = await compactVerify(assertion, await verifyKeyOf(grant), {\n algorithms: [\"ES256\"],\n });\n payload = JSON.parse(new TextDecoder().decode(verified.payload));\n } catch {\n throw new AuthFailure(\n \"invalid\",\n \"The host assertion is not signed by this computer.\",\n );\n }\n const parsed = assertionClaims.safeParse(payload);\n if (!parsed.success)\n throw new AuthFailure(\"invalid\", \"The host assertion is malformed.\");\n const claims = parsed.data;\n if (claims.htm !== request.method) {\n throw new AuthFailure(\"invalid\", \"The host assertion is for another method.\");\n }\n let sameUrl: boolean;\n try {\n sameUrl = withoutQuery(claims.htu) === withoutQuery(request.url);\n } catch {\n sameUrl = false;\n }\n if (!sameUrl)\n throw new AuthFailure(\"invalid\", \"The host assertion is for another URL.\");\n const issuedAt = claims.iat * 1000;\n if (\n claims.exp - claims.iat > HOST_ASSERTION_TTL_MS / 1000 ||\n issuedAt - now > CLOCK_SKEW_MS\n ) {\n throw new AuthFailure(\"invalid\", \"The host assertion has an impossible lifetime.\");\n }\n if (now - issuedAt > HOST_ASSERTION_TTL_MS || claims.exp * 1000 <= now) {\n throw new AuthFailure(\"expired\", \"The host assertion expired.\");\n }\n const acceptableUntil = Math.min(claims.exp * 1000, issuedAt + HOST_ASSERTION_TTL_MS);\n if (!claimJti(keys, grant.grantId, claims.jti, now, acceptableUntil)) {\n throw new AuthFailure(\"invalid\", \"The host assertion was already used.\");\n }\n return grant;\n}\n\nexport function hostPrincipalOf(grant: GrantKey): HostPrincipal {\n return {\n kind: \"host\",\n userId: grant.userId,\n grantId: grant.grantId,\n hostId: grant.hostId,\n };\n}\n\nexport const HOSTS_TAG = HOST_GRANTS_TAG;\n\nexport const HOSTS_MIGRATION: Migration = {\n id: \"auth/0003_hosts\",\n sql: `\n create table parlor_auth_hosts (\n grant_id text primary key,\n host_id text not null unique,\n user_id text not null,\n name text not null,\n platform text not null,\n public_key jsonb not null,\n kid text not null,\n created_at timestamptz not null default now(),\n last_used_at timestamptz\n );\n create index parlor_auth_hosts_user on parlor_auth_hosts (user_id);\n\n create table parlor_auth_host_codes (\n code_hash text primary key,\n user_id text not null,\n code_challenge text not null,\n key_thumbprint text not null,\n redirect_uri text not null,\n host_name text not null,\n platform text not null,\n device_id text,\n expires_at timestamptz not null\n )`,\n};\n\nexport interface ConnectedHost {\n readonly hostId: HostId;\n readonly name: string;\n readonly platform: string;\n readonly connectedAt: string;\n readonly lastUsedAt: string | null;\n}\n\nexport interface HostGrantDeps {\n readonly host: PluginHost;\n readonly settings: ParlorAuthSettings;\n}\n\nfunction databaseOf(host: PluginHost): DataProvider {\n if (!host.database) throw new Error(\"Host grants need a database.\");\n return host.database;\n}\n\ninterface RemovedGrant {\n readonly grant_id: string;\n readonly host_id: string;\n}\n\n/**\n * Deletes the grant's key row and revokes the grant in one transaction. The row must go:\n * `RevocationSet` forgets after its horizon, and a host assertion's `iat` is always fresh.\n */\nasync function removeGrant(\n deps: HostGrantDeps,\n match: { readonly hostId: string } | { readonly grantId: string },\n userId: string,\n): Promise<RemovedGrant | undefined> {\n return databaseOf(deps.host).transaction(async (handle) => {\n const tx = handle as Database;\n const removed = rowsOf<RemovedGrant>(\n await tx.execute(\n \"hostId\" in match\n ? sql`delete from parlor_auth_hosts where host_id = ${match.hostId} and user_id = ${userId} returning grant_id, host_id`\n : sql`delete from parlor_auth_hosts where grant_id = ${match.grantId} and user_id = ${userId} returning grant_id, host_id`,\n ),\n )[0];\n if (!removed) return undefined;\n await RevocationSet.revoke(tx, { kind: \"grant\", id: removed.grant_id });\n return removed;\n });\n}\n\ninterface HostListRow {\n readonly host_id: string;\n readonly name: string;\n readonly platform: string;\n readonly created_at: string | Date;\n readonly last_used_at: string | Date | null;\n}\n\nconst isoOf = (value: string | Date): string => new Date(value).toISOString();\n\n/** `hosts` and `revokeHost`, merged into the account actions once host grants land. */\nexport function hostAccountActions(deps: HostGrantDeps) {\n return createRegistry({\n hosts: defineAction({\n description: \"List the computers connected to this account.\",\n input: z.object({}),\n reads: [HOSTS_TAG],\n run: async (_input, ctx): Promise<ConnectedHost[]> => {\n const user = signedIn(ctx);\n const rows = rowsOf<HostListRow>(\n await (databaseOf(deps.host).read() as Database).execute(sql`\n select host_id, name, platform, created_at, last_used_at from parlor_auth_hosts\n where user_id = ${user.userId} order by created_at, host_id`),\n );\n return rows.map((row) => ({\n hostId: asId(\"host\", row.host_id),\n name: row.name,\n platform: row.platform,\n connectedAt: isoOf(row.created_at),\n lastUsedAt: row.last_used_at === null ? null : isoOf(row.last_used_at),\n }));\n },\n }),\n revokeHost: defineAction({\n description:\n \"Disconnect a computer; its grant, turn tokens and stream end at once.\",\n input: z.object({ hostId: z.string().min(1) }),\n run: async ({ hostId }, ctx): Promise<{ readonly id: string }> => {\n const user = signedIn(ctx);\n const removed = await removeGrant(deps, { hostId }, user.userId);\n if (!removed) throw new ActionError(\"not_found\", `No computer ${hostId}`);\n await deps.host.announce(ctx.scope, [[HOSTS_TAG, hostId]]);\n return { id: hostId };\n },\n }),\n });\n}\n\nexport type HostAccountActions = ActionsOf<ReturnType<typeof hostAccountActions>>;\n\nconst THUMBPRINT = /^[A-Za-z0-9_-]{43}$/;\nconst isPrintable = (text: string) =>\n [...text].every((char) => {\n const code = char.codePointAt(0)!;\n return code >= 0x20 && code !== 0x7f;\n });\nconst LOOPBACK = /^http:\\/\\/127\\.0\\.0\\.1:(\\d{1,5})\\/callback$/;\nconst IPC_REDIRECT = \"urn:parlor:ipc\";\nconst CODE_TTL_MS = 10 * 60_000;\n\nfunction isHostRedirect(value: unknown): value is HostRedirect {\n if (value === IPC_REDIRECT) return true;\n if (typeof value !== \"string\") return false;\n const port = LOOPBACK.exec(value)?.[1];\n return port !== undefined && Number(port) >= 1 && Number(port) <= 65_535;\n}\n\nconst authorizeRequest = z.object({\n redirectUri: z.custom<HostRedirect>(isHostRedirect, \"Use a loopback redirect.\"),\n codeChallenge: z.string().regex(THUMBPRINT),\n state: z.string().min(1).max(256),\n hostName: z\n .string()\n .trim()\n .min(1)\n .max(64)\n .refine(isPrintable, \"Use printable characters.\"),\n platform: z\n .string()\n .trim()\n .min(1)\n .max(32)\n .refine(isPrintable, \"Use printable characters.\"),\n matchingCode: z.string().regex(MATCHING_CODE),\n keyThumbprint: z.string().regex(THUMBPRINT),\n agentTools: z.literal(\"offered\").optional(),\n});\n\nconst authorizeAnswer = authorizeRequest.extend({\n decision: z.enum([\"connect\", \"cancel\"]),\n useAgentTools: z.literal(\"on\").optional(),\n});\n\nconst publicKeySchema = z.looseObject({\n kty: z.literal(\"EC\"),\n crv: z.literal(\"P-256\"),\n x: z.string().regex(THUMBPRINT),\n y: z.string().regex(THUMBPRINT),\n});\n\nconst keyExchange = z.object({\n code: z.string().min(16).max(256),\n codeVerifier: z.string().min(43).max(128),\n publicKey: publicKeySchema,\n proof: z.string().min(1).max(256),\n});\n\nconst MAX_BODY_BYTES = 16 * 1024;\n\nconst sha256 = (text: string, encoding: \"hex\" | \"base64url\") =>\n createHash(\"sha256\").update(text).digest(encoding);\n\nfunction sameText(a: string, b: string): boolean {\n const left = createHash(\"sha256\").update(a).digest();\n const right = createHash(\"sha256\").update(b).digest();\n return timingSafeEqual(left, right);\n}\n\nasync function bodyOf(\n request: Request,\n): Promise<{ readonly json: boolean; readonly fields: unknown }> {\n const text = await readBoundedText(request, MAX_BODY_BYTES);\n if (text === undefined) return { json: false, fields: undefined };\n if ((request.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) {\n try {\n return { json: true, fields: JSON.parse(text) as unknown };\n } catch {\n return { json: true, fields: undefined };\n }\n }\n return { json: false, fields: Object.fromEntries(new URLSearchParams(text)) };\n}\n\nfunction invalidGrant(): Response {\n return Response.json(\n {\n error: {\n code: \"invalid_grant\",\n message: \"The pairing code is invalid, expired or already used.\",\n },\n },\n { status: 400 },\n );\n}\n\ninterface PairingCode {\n readonly user_id: string;\n readonly code_challenge: string;\n readonly key_thumbprint: string;\n readonly host_name: string;\n readonly platform: string;\n readonly expires_at: string | Date;\n}\n\nasync function verifyProof(\n publicKey: JsonWebKey,\n code: string,\n proof: string,\n): Promise<boolean> {\n try {\n const key = await crypto.subtle.importKey(\"jwk\", publicKey, EC_P256, false, [\n \"verify\",\n ]);\n return await crypto.subtle.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n key,\n Buffer.from(proof, \"base64url\"),\n new TextEncoder().encode(code),\n );\n } catch {\n return false;\n }\n}\n\n/** The MCP server name the host registered the app under, as the connected page shows it. */\nconst AGENT_TOOLS_NAME = /^[a-z0-9][a-z0-9_-]{0,79}$/;\n\nconst KEEP_PAIRING = `try{const s=new URLSearchParams(location.hash.slice(1)).get(${JSON.stringify(HOST_PAIRING_FRAGMENT)});if(s)localStorage.setItem(${JSON.stringify(HOST_PAIRING_KEY)},s)}catch{}history.replaceState(null,\"\",location.pathname)`;\n\n/**\n * `GET|POST /hosts/authorize` is the framework-owned consent page and its answer, `POST\n * /hosts/token` the PKCE exchange binding the host's key, `GET /hosts/connected` where the\n * approving browser lands and keeps the pairing secret, `POST /hosts/revoke` the host\n * disconnecting itself.\n */\nexport function hostRoutes(deps: HostGrantDeps): readonly AnyPluginRoute[] {\n const { host, settings } = deps;\n const appName = () =>\n process.env.PARLOR_APP_NAME ?? settings.appName ?? new URL(settings.origin).host;\n const authorizeUrl = `${host.basePath}/${AUTH_PLUGIN}/hosts/authorize`;\n const connectedUrl = `${host.basePath}/${AUTH_PLUGIN}/hosts/connected`;\n const accountOf = async (userId: UserId) => host.auth?.account?.(userId);\n\n return [\n pluginRoute({\n method: \"GET\",\n path: \"/hosts/authorize\",\n access: [\"user\"],\n handle: async (request, caller) => {\n if (!(await chatAllows(host, caller))) return failure(CHAT_REFUSED, 403);\n const parsed = authorizeRequest.safeParse(\n Object.fromEntries(new URL(request.url).searchParams),\n );\n if (!parsed.success) {\n return failure(\"This connection request is incomplete.\", 400);\n }\n const pairing = parsed.data;\n const profile = await accountOf(caller.principal.userId);\n const app = appName();\n const hidden = Object.entries(pairing)\n .map(\n ([name, value]) =>\n `<input type=\"hidden\" name=\"${name}\" value=\"${escape(String(value))}\">`,\n )\n .join(\"\\n\");\n const body = `\n<h1>Connect ${escape(pairing.hostName)} to ${escape(app)}?</h1>\n<p>Signed in as <strong>${escape(profile?.email ?? profile?.name ?? \"your account\")}</strong>.</p>\n<p>The coding agents on <strong>${escape(pairing.hostName)}</strong> (${escape(pairing.platform)}) will take your prompts from ${escape(app)} and run on that computer. Continue only if you just ran <code>connect</code> there.</p>\n<form method=\"post\" action=\"${escape(authorizeUrl)}\">\n${hidden}\n${\n pairing.agentTools === \"offered\"\n ? `<label class=\"choice\"><input type=\"checkbox\" name=\"useAgentTools\" value=\"on\" checked><span>Also let Claude Code and Codex on this computer use ${escape(app)} when you name it. They ask before their first change in each conversation.</span></label>`\n : \"\"\n}\n<button type=\"submit\" name=\"decision\" value=\"cancel\">Cancel</button>\n<button type=\"submit\" name=\"decision\" value=\"connect\">Connect</button>\n</form>`;\n const target =\n pairing.redirectUri === IPC_REDIRECT\n ? []\n : [new URL(pairing.redirectUri).origin];\n return page(\"Connect a computer\", body, [\"'self'\", ...target]);\n },\n }),\n pluginRoute({\n method: \"POST\",\n path: \"/hosts/authorize\",\n access: [\"user\"],\n handle: async (request, caller) => {\n const { json, fields } = await bodyOf(request);\n const refuse = (status: number, code: string, message: string) =>\n json\n ? Response.json({ error: { code, message } }, { status })\n : failure(message, status);\n const origin = request.headers.get(\"origin\");\n if (\n origin !== settings.origin &&\n !(origin && [...SHELL_ORIGINS, ...devOrigins()].includes(origin))\n ) {\n return refuse(\n 403,\n \"forbidden\",\n \"This answer did not come from the consent page.\",\n );\n }\n if (!(await chatAllows(host, caller))) {\n return refuse(403, \"forbidden\", CHAT_REFUSED);\n }\n const parsed = authorizeAnswer.safeParse(fields);\n if (!parsed.success) {\n return refuse(400, \"invalid_input\", \"This connection request is incomplete.\");\n }\n const { decision, useAgentTools, ...pairing } = parsed.data;\n const target =\n pairing.redirectUri === IPC_REDIRECT ? undefined : new URL(pairing.redirectUri);\n if (decision === \"cancel\") {\n if (!target)\n return Response.json({ error: \"access_denied\", state: pairing.state });\n target.searchParams.set(\"error\", \"access_denied\");\n target.searchParams.set(\"state\", pairing.state);\n return new Response(null, { status: 303, headers: { location: target.href } });\n }\n const code = randomBytes(32).toString(\"base64url\");\n await databaseOf(host).transaction(async (handle) => {\n const tx = handle as Database;\n await tx.execute(\n sql`delete from parlor_auth_host_codes where expires_at < ${new Date().toISOString()}`,\n );\n await tx.execute(sql`\n insert into parlor_auth_host_codes\n (code_hash, user_id, code_challenge, key_thumbprint, redirect_uri, host_name, platform, expires_at)\n values (${sha256(code, \"hex\")}, ${caller.principal.userId}, ${pairing.codeChallenge},\n ${pairing.keyThumbprint}, ${pairing.redirectUri}, ${pairing.hostName}, ${pairing.platform},\n ${new Date(Date.now() + CODE_TTL_MS).toISOString()})`);\n });\n const agentTools =\n pairing.agentTools === \"offered\" ? useAgentTools === \"on\" : undefined;\n if (!target) {\n return Response.json({\n code,\n state: pairing.state,\n ...(agentTools === undefined ? {} : { agentTools }),\n });\n }\n target.searchParams.set(\"code\", code);\n target.searchParams.set(\"state\", pairing.state);\n if (agentTools !== undefined)\n target.searchParams.set(\"agentTools\", agentTools ? \"on\" : \"off\");\n return new Response(null, { status: 303, headers: { location: target.href } });\n },\n }),\n {\n method: \"POST\",\n path: \"/hosts/token\",\n access: \"public\",\n handle: async (request) => {\n const { fields } = await bodyOf(request);\n const exchange = keyExchange.safeParse(fields);\n if (!exchange.success || \"d\" in exchange.data.publicKey) return invalidGrant();\n const { code, codeVerifier, proof } = exchange.data;\n const { kty, crv, x, y } = exchange.data.publicKey;\n const publicKey: JsonWebKey = { kty, crv, x, y };\n const database = databaseOf(host);\n const stored = await database.transaction(\n async (handle) =>\n rowsOf<PairingCode>(\n await (handle as Database).execute(sql`\n delete from parlor_auth_host_codes where code_hash = ${sha256(code, \"hex\")}\n returning user_id, code_challenge, key_thumbprint, host_name, platform, expires_at`),\n )[0],\n );\n if (\n !stored ||\n new Date(stored.expires_at).getTime() <= Date.now() ||\n !sameText(sha256(codeVerifier, \"base64url\"), stored.code_challenge) ||\n !sameText(\n await calculateJwkThumbprint(publicKey, \"sha256\"),\n stored.key_thumbprint,\n ) ||\n !(await verifyProof(publicKey, code, proof))\n ) {\n return invalidGrant();\n }\n const grantId = asId(\"grant\", `host:${crypto.randomUUID()}`);\n const hostId = asId(\"host\", crypto.randomUUID());\n const userId = asId(\"user\", stored.user_id);\n await database.transaction(async (handle) => {\n await (handle as Database).execute(sql`\n insert into parlor_auth_hosts (grant_id, host_id, user_id, name, platform, public_key, kid)\n values (${grantId}, ${hostId}, ${userId}, ${stored.host_name}, ${stored.platform},\n ${JSON.stringify(publicKey)}::jsonb, ${stored.key_thumbprint})`);\n });\n await host.announce(userId, [[HOSTS_TAG, hostId]]);\n const profile = await accountOf(userId);\n const response: HostGrantResponse = {\n grant: { id: grantId, hostId },\n account: { userId, name: profile?.name ?? \"\", email: profile?.email },\n landing: connectedUrl,\n };\n return Response.json(response);\n },\n },\n {\n method: \"GET\",\n path: \"/hosts/connected\",\n access: \"public\",\n handle: async (request) => {\n const app = escape(appName());\n const tools = new URL(request.url).searchParams.get(\"agentTools\");\n const body =\n tools && AGENT_TOOLS_NAME.test(tools)\n ? `<h1>Connected to ${app}</h1>\n<p>Use it two ways:</p>\n<ul>\n<li>In the agent sidebar of ${app}.</li>\n<li>In Claude Code or Codex on this computer: ask them to “use <code>${escape(tools)}</code> to …”. They ask you before their first change in each conversation.</li>\n</ul>\n<p>You can close this tab.</p>`\n : `<h1>Connected to ${app}</h1>\n<p>The coding agents on your computer are ready in the agent sidebar of ${app}. You can close this tab.</p>`;\n return page(\"Computer connected\", body, [\"'none'\"], KEEP_PAIRING);\n },\n },\n pluginRoute({\n method: \"POST\",\n path: \"/hosts/devices/link\",\n access: [\"host\"],\n handle: async (request, caller) => {\n if (!(await chatAllows(host, caller))) {\n return Response.json(\n { error: { code: \"forbidden\", message: CHAT_REFUSED } },\n { status: 403 },\n );\n }\n const { fields } = await bodyOf(request);\n const code =\n z.object({ code: z.string().max(32) }).safeParse(fields).data?.code ?? \"\";\n const found = await findPendingDevice(databaseOf(host), caller.principal.userId, {\n code,\n });\n if (!found) {\n return Response.json(\n {\n error: {\n code: \"not_found\",\n message:\n \"No device of this account shows that code. Check it, or show a new code on the device.\",\n },\n },\n { status: 404 },\n );\n }\n return Response.json(found);\n },\n }),\n pluginRoute({\n method: \"POST\",\n path: \"/hosts/revoke\",\n access: [\"host\"],\n handle: async (_request, caller) => {\n const { userId, grantId } = caller.principal;\n const removed = await removeGrant(deps, { grantId }, userId);\n if (removed) await host.announce(caller.scope, [[HOSTS_TAG, removed.host_id]]);\n return Response.json({ id: grantId });\n },\n }),\n ];\n}\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,eAAe,EAIf,qBAAqB,EACrB,cAAc,EAEd,kBAAkB,EAMlB,eAAe,EAEf,UAAU,EACV,eAAe,EACf,SAAS,EACT,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,oBAAoB,EAEpB,oBAAoB,EAGpB,wBAAwB,EAExB,iBAAiB,EACjB,WAAW,GAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAGlB,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAEhB,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,aAAa,EAGb,qBAAqB,EAErB,aAAa,EACb,cAAc,EAId,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EAGf,eAAe,EAEf,eAAe,EAGf,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,YAAY,EAEZ,cAAc,EAGd,eAAe,EACf,cAAc,GAEf,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,eAAe,EAIf,qBAAqB,EACrB,cAAc,EAEd,kBAAkB,EAMlB,eAAe,EAEf,UAAU,EACV,eAAe,EACf,SAAS,EACT,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,oBAAoB,EAEpB,oBAAoB,EAGpB,wBAAwB,EAExB,iBAAiB,EACjB,WAAW,GAGZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,GAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAGlB,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAEhB,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,aAAa,EAGb,qBAAqB,EAErB,aAAa,EACb,cAAc,EAId,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EAGf,eAAe,EAEf,eAAe,EAGf,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,YAAY,EAEZ,cAAc,EAGd,eAAe,EACf,cAAc,GAEf,MAAM,iBAAiB,CAAC","sourcesContent":["export {\n AGENTS_TAG,\n type ConnectedAgent,\n SESSIONS_TAG,\n type SignedInSession,\n} from \"./account.js\";\nexport {\n type AccountSummary,\n type ApprovingDevice,\n type ConnectedHost,\n createGrantKeys,\n type GrantKey,\n type GrantKeysOptions,\n type GrantKeys,\n HOST_ASSERTION_TTL_MS,\n HOST_CLIENT_ID,\n type HostAccountActions,\n hostAccountActions,\n type HostAssertionClaims,\n type HostAuthorizeRequest,\n type HostGrantDeps,\n type HostGrantResponse,\n type HostKeyExchange,\n hostPrincipalOf,\n type HostRedirect,\n hostRoutes,\n HOSTS_MIGRATION,\n HOSTS_TAG,\n MATCHING_CODE,\n verifyHostAssertion,\n} from \"./hosts.js\";\nexport {\n type ConnectedDevice,\n createDeviceRegistry,\n type DeviceAccountActions,\n deviceAccountActions,\n type DeviceActionDeps,\n type DeviceRegistry,\n DEVICE_LINKING_MIGRATION,\n type PendingDevice,\n DEVICES_MIGRATION,\n DEVICES_TAG,\n type PresenceKey,\n type RegisteredDevice,\n} from \"./devices.js\";\nexport {\n AUTH_BASE_PATH,\n MCP_SCOPE,\n parlorAuth,\n type ParlorAuthOptions,\n} from \"./better-auth.js\";\nexport {\n type BetterAuthInstance,\n betterAuthProvider,\n type BetterAuthProviderOptions,\n} from \"./provider.js\";\nexport {\n REVOCATION_CHANNEL,\n type RevocationMode,\n type RevocationNotice,\n RevocationSet,\n type RevocationSetOptions,\n} from \"./revocation.js\";\nexport {\n agentPrincipalOf,\n type Credential,\n credentialOf,\n delegate,\n HOST_ASSERTION_TYP,\n HOST_AUDIENCE,\n type HostAssertion,\n type Jws,\n MAX_TURN_TOKEN_TTL_MS,\n type TokenAudience,\n TURN_AUDIENCE,\n TURN_TOKEN_TYP,\n type TurnToken,\n type TurnTokenClaims,\n type TurnTokenKeys,\n verifyTurnToken,\n} from \"./tokens.js\";\nexport {\n answerStatement,\n type AnswerStatement,\n type PinnedDevice,\n promptStatement,\n type PromptStatement,\n removeStatement,\n type RemoveStatement,\n type Signed,\n checkPairingProof,\n deviceCommitment,\n formatLinkCode,\n HOST_PAIRING_FRAGMENT,\n LINK_CODE_LENGTH,\n linkCode,\n normalizeLinkCode,\n pairingProof,\n signedPrompt,\n type Statement,\n statementBytes,\n type VerifyOptions,\n type VerifyOutcome,\n verifyStatement,\n vouchStatement,\n type VouchStatement,\n} from \"./statements.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD;QACE,EAAE,EAAE,uBAAuB;QAC3B,GAAG,EAAE;;;;;;QAMD;KACL;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,GAAG,EAAE,yFAAyF;KAC/F;CACF,CAAC"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD;QACE,EAAE,EAAE,uBAAuB;QAC3B,GAAG,EAAE;;;;;;QAMD;KACL;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,GAAG,EAAE,yFAAyF;KAC/F;CACF,CAAC","sourcesContent":["import type { Migration } from \"@parlor/server\";\n\nexport const AUTH_MIGRATIONS: readonly Migration[] = [\n {\n id: \"auth/0001_revocations\",\n sql: `\n create table parlor_auth_revocations (\n kind text not null,\n id text not null,\n revoked_at timestamptz not null,\n primary key (kind, id)\n )`,\n },\n {\n id: \"auth/0002_revocations_revoked_at\",\n sql: \"create index parlor_auth_revocations_revoked_at on parlor_auth_revocations (revoked_at)\",\n },\n];\n"]}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ export declare const NATIVE_SIGN_IN_PATH = "/native/sign-in/social";
3
+ export declare const NATIVE_TOKEN_PATH = "/native/token";
4
+ /** How long the app has to redeem the code its URL scheme received. */
5
+ export declare const NATIVE_CODE_TTL_MS = 60000;
6
+ /**
7
+ * Social sign-in for native shells, whose webview a provider such as Google refuses. The
8
+ * app opens `/native/sign-in/social` in the system's sign-in browser with a PKCE challenge;
9
+ * after Better Auth's callback the browser keeps no session and is sent to the app's URL
10
+ * scheme with a single-use code, which only the app holding the verifier can redeem at
11
+ * `/native/token` for a bearer token.
12
+ */
13
+ export declare function nativeSignIn(options: {
14
+ readonly scheme: string | undefined;
15
+ }): {
16
+ id: "parlor-native-sign-in";
17
+ endpoints: {
18
+ nativeSignInSocial: import("better-auth").StrictEndpoint<"/native/sign-in/social", {
19
+ method: "GET";
20
+ query: z.ZodObject<{
21
+ provider: z.ZodString;
22
+ redirect_uri: z.ZodString;
23
+ code_challenge: z.ZodString;
24
+ code_challenge_method: z.ZodLiteral<"S256">;
25
+ state: z.ZodString;
26
+ }, z.core.$strip>;
27
+ }, Response>;
28
+ nativeToken: import("better-auth").StrictEndpoint<"/native/token", {
29
+ method: "POST";
30
+ body: z.ZodObject<{
31
+ code: z.ZodString;
32
+ code_verifier: z.ZodString;
33
+ }, z.core.$strip>;
34
+ }, {
35
+ token: string;
36
+ }>;
37
+ };
38
+ hooks: {
39
+ after: {
40
+ matcher: (ctx: import("better-auth").HookEndpointContext) => boolean;
41
+ handler: import("better-auth").Middleware<import("better-auth").MiddlewareOptions, (inputContext: import("better-auth").MiddlewareInputContext<import("better-auth").MiddlewareOptions>) => Promise<void>>;
42
+ }[];
43
+ };
44
+ };
45
+ //# sourceMappingURL=native-sign-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-sign-in.d.ts","sourceRoot":"","sources":["../src/native-sign-in.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAmFzC;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;QAKvE,kBAAkB;;;;;;;;;;QA8ClB,WAAW;;;;;;;;;;;;;;;;EA0FhB"}
@@ -0,0 +1,183 @@
1
+ import { createHash } from "node:crypto";
2
+ import { addOAuthServerContext, APIError, createAuthEndpoint, createAuthMiddleware, getIP, getOAuthState, } from "better-auth/api";
3
+ import { constantTimeEqual, generateRandomString } from "better-auth/crypto";
4
+ import { generateIdTokenNonce, generateState, getOAuthCallbackPath, } from "better-auth/oauth2";
5
+ import { z } from "zod";
6
+ import { failure } from "./pages.js";
7
+ export const NATIVE_SIGN_IN_PATH = "/native/sign-in/social";
8
+ export const NATIVE_TOKEN_PATH = "/native/token";
9
+ /** How long the app has to redeem the code its URL scheme received. */
10
+ export const NATIVE_CODE_TTL_MS = 60_000;
11
+ const NATIVE_REQUEST = "parlorNativeSignIn";
12
+ const CODE_IDENTIFIER = "parlor-native-sign-in:";
13
+ const TOKEN_HEADER = "set-auth-token";
14
+ const sha256 = (text) => createHash("sha256").update(text).digest("base64url");
15
+ const codeIdentifier = (code) => `${CODE_IDENTIFIER}${sha256(code)}`;
16
+ function returnsToApp(redirectUri, scheme) {
17
+ if (!scheme)
18
+ return false;
19
+ try {
20
+ return new URL(redirectUri).protocol === `${scheme}:`;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ function withParams(url, params) {
27
+ const target = new URL(url);
28
+ for (const [name, value] of Object.entries(params)) {
29
+ if (value)
30
+ target.searchParams.set(name, value);
31
+ }
32
+ return target.href;
33
+ }
34
+ async function providerOf(providers, id) {
35
+ for (const entry of providers ?? []) {
36
+ const provider = typeof entry === "function" ? await entry() : entry;
37
+ if (provider.id === id)
38
+ return provider;
39
+ }
40
+ return undefined;
41
+ }
42
+ /** Leaves the browser that ran the sign-in without the session: only the app gets it. */
43
+ function withoutSession(headers, cookies) {
44
+ const kept = headers
45
+ .getSetCookie()
46
+ .filter((cookie) => !cookies.some((name) => cookie.startsWith(`${name}=`) || cookie.startsWith(`${name}.`)));
47
+ headers.delete("set-cookie");
48
+ for (const cookie of kept)
49
+ headers.append("set-cookie", cookie);
50
+ headers.delete(TOKEN_HEADER);
51
+ }
52
+ const invalidGrant = () => new APIError("BAD_REQUEST", {
53
+ message: "This sign-in has expired or was already used. Sign in again.",
54
+ code: "INVALID_GRANT",
55
+ });
56
+ /**
57
+ * Social sign-in for native shells, whose webview a provider such as Google refuses. The
58
+ * app opens `/native/sign-in/social` in the system's sign-in browser with a PKCE challenge;
59
+ * after Better Auth's callback the browser keeps no session and is sent to the app's URL
60
+ * scheme with a single-use code, which only the app holding the verifier can redeem at
61
+ * `/native/token` for a bearer token.
62
+ */
63
+ export function nativeSignIn(options) {
64
+ const { scheme } = options;
65
+ return {
66
+ id: "parlor-native-sign-in",
67
+ endpoints: {
68
+ nativeSignInSocial: createAuthEndpoint(NATIVE_SIGN_IN_PATH, {
69
+ method: "GET",
70
+ query: z.object({
71
+ provider: z.string().min(1),
72
+ redirect_uri: z.string(),
73
+ code_challenge: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
74
+ code_challenge_method: z.literal("S256"),
75
+ state: z.string().min(1).max(512),
76
+ }),
77
+ }, async (ctx) => {
78
+ const { provider: id, redirect_uri: redirectUri, state } = ctx.query;
79
+ if (!returnsToApp(redirectUri, scheme)) {
80
+ return failure(scheme
81
+ ? `Sign-in can only return to this app's ${scheme}: links.`
82
+ : "Set app.scheme in parlor.config.ts to sign in from the app.", 400);
83
+ }
84
+ const providers = ctx.context
85
+ .socialProviders;
86
+ const provider = await providerOf(providers, id);
87
+ if (!provider) {
88
+ throw ctx.redirect(withParams(redirectUri, { error: "provider_not_found", state }));
89
+ }
90
+ const request = {
91
+ redirectUri,
92
+ codeChallenge: ctx.query.code_challenge,
93
+ state,
94
+ };
95
+ await addOAuthServerContext({ [NATIVE_REQUEST]: request });
96
+ const idTokenNonce = generateIdTokenNonce(provider);
97
+ const flow = await generateState(ctx, { idTokenNonce });
98
+ const url = await provider.createAuthorizationURL({
99
+ ...flow,
100
+ idTokenNonce,
101
+ redirectURI: `${ctx.context.baseURL}${getOAuthCallbackPath(provider)}`,
102
+ });
103
+ throw ctx.redirect(url.toString());
104
+ }),
105
+ nativeToken: createAuthEndpoint(NATIVE_TOKEN_PATH, {
106
+ method: "POST",
107
+ body: z.object({
108
+ code: z.string().min(1),
109
+ code_verifier: z.string().regex(/^[A-Za-z0-9._~-]{43,128}$/),
110
+ }),
111
+ }, async (ctx) => {
112
+ const { internalAdapter, sessionConfig } = ctx.context;
113
+ const stored = await internalAdapter.consumeVerificationValue(codeIdentifier(ctx.body.code));
114
+ if (!stored)
115
+ throw invalidGrant();
116
+ const pending = JSON.parse(stored.value);
117
+ if (!constantTimeEqual(sha256(ctx.body.code_verifier), pending.codeChallenge)) {
118
+ await internalAdapter.deleteSession(pending.sessionToken);
119
+ throw invalidGrant();
120
+ }
121
+ const headers = ctx.request?.headers;
122
+ const session = await internalAdapter.updateSession(pending.sessionToken, {
123
+ expiresAt: new Date(Date.now() + sessionConfig.expiresIn * 1000),
124
+ ...(headers
125
+ ? {
126
+ userAgent: headers.get("user-agent") ?? "",
127
+ ipAddress: getIP(headers, ctx.context.options) ?? "",
128
+ }
129
+ : {}),
130
+ });
131
+ if (!session)
132
+ throw invalidGrant();
133
+ ctx.setHeader(TOKEN_HEADER, pending.sessionToken);
134
+ ctx.setHeader("access-control-expose-headers", TOKEN_HEADER);
135
+ return ctx.json({ token: pending.sessionToken });
136
+ }),
137
+ },
138
+ hooks: {
139
+ after: [
140
+ {
141
+ matcher: (ctx) => Boolean(ctx.path?.startsWith("/callback/")),
142
+ handler: createAuthMiddleware(async (ctx) => {
143
+ const request = (await getOAuthState())?.serverContext?.[NATIVE_REQUEST];
144
+ const headers = ctx.context.responseHeaders;
145
+ const location = headers?.get("location");
146
+ if (!request || !headers || !location)
147
+ return;
148
+ const session = ctx.context.newSession;
149
+ let outcome;
150
+ if (session) {
151
+ const code = generateRandomString(32);
152
+ const expiresAt = new Date(Date.now() + NATIVE_CODE_TTL_MS);
153
+ const pending = {
154
+ sessionToken: session.session.token,
155
+ codeChallenge: request.codeChallenge,
156
+ };
157
+ await ctx.context.internalAdapter.updateSession(pending.sessionToken, {
158
+ expiresAt,
159
+ });
160
+ await ctx.context.internalAdapter.createVerificationValue({
161
+ identifier: codeIdentifier(code),
162
+ value: JSON.stringify(pending),
163
+ expiresAt,
164
+ });
165
+ outcome = { code };
166
+ }
167
+ else {
168
+ const failed = new URL(location, ctx.context.baseURL).searchParams;
169
+ outcome = {
170
+ error: failed.get("error") ?? "sign_in_failed",
171
+ error_description: failed.get("error_description"),
172
+ };
173
+ }
174
+ const { sessionToken, sessionData, dontRememberToken, accountData } = ctx.context.authCookies;
175
+ withoutSession(headers, [sessionToken, sessionData, dontRememberToken, accountData].map((cookie) => cookie.name));
176
+ headers.set("location", withParams(request.redirectUri, { ...outcome, state: request.state }));
177
+ }),
178
+ },
179
+ ],
180
+ },
181
+ };
182
+ }
183
+ //# sourceMappingURL=native-sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-sign-in.js","sourceRoot":"","sources":["../src/native-sign-in.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport type { BetterAuthPlugin } from \"better-auth\";\nimport {\n addOAuthServerContext,\n APIError,\n createAuthEndpoint,\n createAuthMiddleware,\n getIP,\n getOAuthState,\n} from \"better-auth/api\";\nimport { constantTimeEqual, generateRandomString } from \"better-auth/crypto\";\nimport {\n generateIdTokenNonce,\n generateState,\n getOAuthCallbackPath,\n} from \"better-auth/oauth2\";\nimport { z } from \"zod\";\n\nimport { failure } from \"./pages.js\";\n\nexport const NATIVE_SIGN_IN_PATH = \"/native/sign-in/social\";\nexport const NATIVE_TOKEN_PATH = \"/native/token\";\n/** How long the app has to redeem the code its URL scheme received. */\nexport const NATIVE_CODE_TTL_MS = 60_000;\n\nconst NATIVE_REQUEST = \"parlorNativeSignIn\";\nconst CODE_IDENTIFIER = \"parlor-native-sign-in:\";\nconst TOKEN_HEADER = \"set-auth-token\";\n\ninterface NativeRequest {\n readonly redirectUri: string;\n readonly codeChallenge: string;\n readonly state: string;\n}\n\ninterface PendingCode {\n readonly sessionToken: string;\n readonly codeChallenge: string;\n}\n\ninterface OAuthProvider {\n readonly id: string;\n readonly requiresIdTokenNonce?: boolean | undefined;\n readonly callbackPath?: string | undefined;\n createAuthorizationURL(input: {\n state: string;\n codeVerifier: string;\n idTokenNonce?: string | undefined;\n redirectURI: string;\n }): Promise<URL> | URL;\n}\n\ntype Lazy<T> = T | (() => T | Promise<T>);\n\nconst sha256 = (text: string) => createHash(\"sha256\").update(text).digest(\"base64url\");\nconst codeIdentifier = (code: string) => `${CODE_IDENTIFIER}${sha256(code)}`;\n\nfunction returnsToApp(redirectUri: string, scheme: string | undefined): boolean {\n if (!scheme) return false;\n try {\n return new URL(redirectUri).protocol === `${scheme}:`;\n } catch {\n return false;\n }\n}\n\nfunction withParams(url: string, params: Record<string, string | null | undefined>) {\n const target = new URL(url);\n for (const [name, value] of Object.entries(params)) {\n if (value) target.searchParams.set(name, value);\n }\n return target.href;\n}\n\nasync function providerOf(\n providers: readonly Lazy<OAuthProvider>[] | undefined,\n id: string,\n): Promise<OAuthProvider | undefined> {\n for (const entry of providers ?? []) {\n const provider = typeof entry === \"function\" ? await entry() : entry;\n if (provider.id === id) return provider;\n }\n return undefined;\n}\n\n/** Leaves the browser that ran the sign-in without the session: only the app gets it. */\nfunction withoutSession(headers: Headers, cookies: readonly string[]): void {\n const kept = headers\n .getSetCookie()\n .filter(\n (cookie) =>\n !cookies.some(\n (name) => cookie.startsWith(`${name}=`) || cookie.startsWith(`${name}.`),\n ),\n );\n headers.delete(\"set-cookie\");\n for (const cookie of kept) headers.append(\"set-cookie\", cookie);\n headers.delete(TOKEN_HEADER);\n}\n\nconst invalidGrant = () =>\n new APIError(\"BAD_REQUEST\", {\n message: \"This sign-in has expired or was already used. Sign in again.\",\n code: \"INVALID_GRANT\",\n });\n\n/**\n * Social sign-in for native shells, whose webview a provider such as Google refuses. The\n * app opens `/native/sign-in/social` in the system's sign-in browser with a PKCE challenge;\n * after Better Auth's callback the browser keeps no session and is sent to the app's URL\n * scheme with a single-use code, which only the app holding the verifier can redeem at\n * `/native/token` for a bearer token.\n */\nexport function nativeSignIn(options: { readonly scheme: string | undefined }) {\n const { scheme } = options;\n return {\n id: \"parlor-native-sign-in\",\n endpoints: {\n nativeSignInSocial: createAuthEndpoint(\n NATIVE_SIGN_IN_PATH,\n {\n method: \"GET\",\n query: z.object({\n provider: z.string().min(1),\n redirect_uri: z.string(),\n code_challenge: z.string().regex(/^[A-Za-z0-9_-]{43}$/),\n code_challenge_method: z.literal(\"S256\"),\n state: z.string().min(1).max(512),\n }),\n },\n async (ctx) => {\n const { provider: id, redirect_uri: redirectUri, state } = ctx.query;\n if (!returnsToApp(redirectUri, scheme)) {\n return failure(\n scheme\n ? `Sign-in can only return to this app's ${scheme}: links.`\n : \"Set app.scheme in parlor.config.ts to sign in from the app.\",\n 400,\n );\n }\n const providers = ctx.context\n .socialProviders as unknown as Lazy<OAuthProvider>[];\n const provider = await providerOf(providers, id);\n if (!provider) {\n throw ctx.redirect(\n withParams(redirectUri, { error: \"provider_not_found\", state }),\n );\n }\n const request: NativeRequest = {\n redirectUri,\n codeChallenge: ctx.query.code_challenge,\n state,\n };\n await addOAuthServerContext({ [NATIVE_REQUEST]: request });\n const idTokenNonce = generateIdTokenNonce(provider);\n const flow = await generateState(ctx, { idTokenNonce });\n const url = await provider.createAuthorizationURL({\n ...flow,\n idTokenNonce,\n redirectURI: `${ctx.context.baseURL}${getOAuthCallbackPath(provider)}`,\n });\n throw ctx.redirect(url.toString());\n },\n ),\n nativeToken: createAuthEndpoint(\n NATIVE_TOKEN_PATH,\n {\n method: \"POST\",\n body: z.object({\n code: z.string().min(1),\n code_verifier: z.string().regex(/^[A-Za-z0-9._~-]{43,128}$/),\n }),\n },\n async (ctx) => {\n const { internalAdapter, sessionConfig } = ctx.context;\n const stored = await internalAdapter.consumeVerificationValue(\n codeIdentifier(ctx.body.code),\n );\n if (!stored) throw invalidGrant();\n const pending = JSON.parse(stored.value) as PendingCode;\n if (!constantTimeEqual(sha256(ctx.body.code_verifier), pending.codeChallenge)) {\n await internalAdapter.deleteSession(pending.sessionToken);\n throw invalidGrant();\n }\n const headers = ctx.request?.headers;\n const session = await internalAdapter.updateSession(pending.sessionToken, {\n expiresAt: new Date(Date.now() + sessionConfig.expiresIn * 1000),\n ...(headers\n ? {\n userAgent: headers.get(\"user-agent\") ?? \"\",\n ipAddress: getIP(headers, ctx.context.options) ?? \"\",\n }\n : {}),\n });\n if (!session) throw invalidGrant();\n ctx.setHeader(TOKEN_HEADER, pending.sessionToken);\n ctx.setHeader(\"access-control-expose-headers\", TOKEN_HEADER);\n return ctx.json({ token: pending.sessionToken });\n },\n ),\n },\n hooks: {\n after: [\n {\n matcher: (ctx) => Boolean(ctx.path?.startsWith(\"/callback/\")),\n handler: createAuthMiddleware(async (ctx) => {\n const request = (await getOAuthState())?.serverContext?.[NATIVE_REQUEST] as\n | NativeRequest\n | undefined;\n const headers = ctx.context.responseHeaders;\n const location = headers?.get(\"location\");\n if (!request || !headers || !location) return;\n const session = ctx.context.newSession;\n let outcome: Record<string, string | null>;\n if (session) {\n const code = generateRandomString(32);\n const expiresAt = new Date(Date.now() + NATIVE_CODE_TTL_MS);\n const pending: PendingCode = {\n sessionToken: session.session.token,\n codeChallenge: request.codeChallenge,\n };\n await ctx.context.internalAdapter.updateSession(pending.sessionToken, {\n expiresAt,\n });\n await ctx.context.internalAdapter.createVerificationValue({\n identifier: codeIdentifier(code),\n value: JSON.stringify(pending),\n expiresAt,\n });\n outcome = { code };\n } else {\n const failed = new URL(location, ctx.context.baseURL).searchParams;\n outcome = {\n error: failed.get(\"error\") ?? \"sign_in_failed\",\n error_description: failed.get(\"error_description\"),\n };\n }\n const { sessionToken, sessionData, dontRememberToken, accountData } =\n ctx.context.authCookies;\n withoutSession(\n headers,\n [sessionToken, sessionData, dontRememberToken, accountData].map(\n (cookie) => cookie.name,\n ),\n );\n headers.set(\n \"location\",\n withParams(request.redirectUri, { ...outcome, state: request.state }),\n );\n }),\n },\n ],\n },\n } satisfies BetterAuthPlugin;\n}\n"]}
package/dist/pages.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export declare const escape: (text: string) => string;
2
- export declare function page(title: string, body: string, formAction: readonly string[]): Response;
2
+ export declare function page(title: string, body: string, formAction: readonly string[], script?: string): Response;
3
3
  export declare function failure(message: string, status: number): Response;
4
4
  //# sourceMappingURL=pages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,SAAU,MAAM,WAKhC,CAAC;AAsBJ,wBAAgB,IAAI,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,QAAQ,CA2BV;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAOjE"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,SAAU,MAAM,WAKhC,CAAC;AA0BJ,wBAAgB,IAAI,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,QAAQ,CA4BV;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAOjE"}
package/dist/pages.js CHANGED
@@ -12,13 +12,16 @@ ul { margin: 0 0 20px; padding-left: 20px; }
12
12
  li { margin-bottom: 6px; }
13
13
  strong { color: var(--text); font-weight: 600; }
14
14
  code { font: 0.9em ui-monospace, "SF Mono", Menlo, monospace; color: var(--text); }
15
- form { display: flex; gap: 8px; justify-content: flex-end; margin: 0; }
15
+ form { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; margin: 0; }
16
+ label.choice { flex-basis: 100%; display: flex; gap: 10px; align-items: flex-start; margin: 4px 0 12px; color: var(--muted); font-size: 14px; cursor: pointer; }
17
+ label.choice input { margin: 3px 0 0; accent-color: var(--accent); }
16
18
  button { font: inherit; font-weight: 600; padding: 9px 18px; border-radius: 8px; border: 1px solid var(--line); background: transparent; color: var(--text); cursor: pointer; }
17
19
  button[value="true"], button[value="connect"] { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
18
20
  button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
19
21
  `;
20
- const STYLE_HASH = createHash("sha256").update(STYLE).digest("base64");
21
- export function page(title, body, formAction) {
22
+ const sha256 = (text) => createHash("sha256").update(text).digest("base64");
23
+ const STYLE_HASH = sha256(STYLE);
24
+ export function page(title, body, formAction, script) {
22
25
  const html = `<!doctype html>
23
26
  <html lang="en">
24
27
  <head>
@@ -27,7 +30,7 @@ export function page(title, body, formAction) {
27
30
  <title>${escape(title)}</title>
28
31
  <style>${STYLE}</style>
29
32
  </head>
30
- <body><main>${body}</main></body>
33
+ <body><main>${body}</main>${script ? `<script>${script}</script>` : ""}</body>
31
34
  </html>`;
32
35
  return new Response(html, {
33
36
  headers: {
@@ -36,6 +39,7 @@ export function page(title, body, formAction) {
36
39
  "content-security-policy": [
37
40
  "default-src 'none'",
38
41
  `style-src 'sha256-${STYLE_HASH}'`,
42
+ ...(script ? [`script-src 'sha256-${sha256(script)}'`] : []),
39
43
  `form-action ${formAction.join(" ")}`,
40
44
  "frame-ancestors 'none'",
41
45
  "base-uri 'none'",
package/dist/pages.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACrC,IAAI,CAAC,OAAO,CACV,UAAU,EACV,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAE,CACnF,CAAC;AAEJ,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;CAgBb,CAAC;AAEF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEvE,MAAM,UAAU,IAAI,CAClB,KAAa,EACb,IAAY,EACZ,UAA6B;IAE7B,MAAM,IAAI,GAAG;;;;;SAKN,MAAM,CAAC,KAAK,CAAC;SACb,KAAK;;cAEA,IAAI;QACV,CAAC;IACP,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE;YACP,cAAc,EAAE,0BAA0B;YAC1C,eAAe,EAAE,UAAU;YAC3B,yBAAyB,EAAE;gBACzB,oBAAoB;gBACpB,qBAAqB,UAAU,GAAG;gBAClC,eAAe,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACrC,wBAAwB;gBACxB,iBAAiB;aAClB,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,wBAAwB,EAAE,SAAS;YACnC,6DAA6D;YAC7D,iBAAiB,EAAE,aAAa;SACjC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAG,IAAI,CACnB,sBAAsB,EACtB,mCAAmC,MAAM,CAAC,OAAO,CAAC,MAAM,EACxD,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACrC,IAAI,CAAC,OAAO,CACV,UAAU,EACV,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAE,CACnF,CAAC;AAEJ,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjC,MAAM,UAAU,IAAI,CAClB,KAAa,EACb,IAAY,EACZ,UAA6B,EAC7B,MAAe;IAEf,MAAM,IAAI,GAAG;;;;;SAKN,MAAM,CAAC,KAAK,CAAC;SACb,KAAK;;cAEA,IAAI,UAAU,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE;QAC9D,CAAC;IACP,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE;YACP,cAAc,EAAE,0BAA0B;YAC1C,eAAe,EAAE,UAAU;YAC3B,yBAAyB,EAAE;gBACzB,oBAAoB;gBACpB,qBAAqB,UAAU,GAAG;gBAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,eAAe,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACrC,wBAAwB;gBACxB,iBAAiB;aAClB,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,wBAAwB,EAAE,SAAS;YACnC,6DAA6D;YAC7D,iBAAiB,EAAE,aAAa;SACjC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAG,IAAI,CACnB,sBAAsB,EACtB,mCAAmC,MAAM,CAAC,OAAO,CAAC,MAAM,EACxD,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const escape = (text: string) =>\n text.replace(\n /[&<>\"']/g,\n (char) =>\n ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[char]!,\n );\n\nconst STYLE = `\n:root { color-scheme: light dark; --bg: #f6f6f4; --card: #fff; --text: #1d1d1b; --muted: #5f5f5a; --line: #e2e2dc; --accent: #1d1d1b; --on-accent: #fff; }\n@media (prefers-color-scheme: dark) { :root { --bg: #151514; --card: #1f1f1d; --text: #ededea; --muted: #a3a39d; --line: #34342f; --accent: #ededea; --on-accent: #151514; } }\n* { box-sizing: border-box; }\nbody { margin: 0; min-height: 100vh; display: grid; place-items: center; padding: 16px; background: var(--bg); color: var(--text); font: 15px/1.5 system-ui, -apple-system, \"Segoe UI\", sans-serif; }\nmain { width: 100%; max-width: 420px; background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 28px; }\nh1 { font-size: 20px; line-height: 1.3; margin: 0 0 8px; }\np { margin: 0 0 12px; color: var(--muted); }\nul { margin: 0 0 20px; padding-left: 20px; }\nli { margin-bottom: 6px; }\nstrong { color: var(--text); font-weight: 600; }\ncode { font: 0.9em ui-monospace, \"SF Mono\", Menlo, monospace; color: var(--text); }\nform { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; margin: 0; }\nlabel.choice { flex-basis: 100%; display: flex; gap: 10px; align-items: flex-start; margin: 4px 0 12px; color: var(--muted); font-size: 14px; cursor: pointer; }\nlabel.choice input { margin: 3px 0 0; accent-color: var(--accent); }\nbutton { font: inherit; font-weight: 600; padding: 9px 18px; border-radius: 8px; border: 1px solid var(--line); background: transparent; color: var(--text); cursor: pointer; }\nbutton[value=\"true\"], button[value=\"connect\"] { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }\nbutton:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }\n`;\n\nconst sha256 = (text: string) => createHash(\"sha256\").update(text).digest(\"base64\");\n\nconst STYLE_HASH = sha256(STYLE);\n\nexport function page(\n title: string,\n body: string,\n formAction: readonly string[],\n script?: string,\n): Response {\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escape(title)}</title>\n<style>${STYLE}</style>\n</head>\n<body><main>${body}</main>${script ? `<script>${script}</script>` : \"\"}</body>\n</html>`;\n return new Response(html, {\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n \"content-security-policy\": [\n \"default-src 'none'\",\n `style-src 'sha256-${STYLE_HASH}'`,\n ...(script ? [`script-src 'sha256-${sha256(script)}'`] : []),\n `form-action ${formAction.join(\" \")}`,\n \"frame-ancestors 'none'\",\n \"base-uri 'none'\",\n ].join(\"; \"),\n \"x-content-type-options\": \"nosniff\",\n // no-referrer would make the form POST carry `Origin: null`.\n \"referrer-policy\": \"same-origin\",\n },\n });\n}\n\nexport function failure(message: string, status: number): Response {\n const response = page(\n \"Authorization failed\",\n `<h1>Authorization failed</h1><p>${escape(message)}</p>`,\n [\"'none'\"],\n );\n return new Response(response.body, { status, headers: response.headers });\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { type AuthProvider } from "@parlor/server";
2
- import type { BetterAuthOptions } from "better-auth";
2
+ import { type BetterAuthOptions } from "better-auth";
3
3
  /** The slice of a Better Auth instance Parlor relies on. */
4
4
  export interface BetterAuthInstance {
5
5
  readonly options: BetterAuthOptions;
@@ -61,14 +61,21 @@ export interface StoredSession {
61
61
  readonly ipAddress?: string | null | undefined;
62
62
  readonly userAgent?: string | null | undefined;
63
63
  }
64
- export interface BetterAuthProviderOptions {
64
+ export type BetterAuthProviderOptions = {
65
65
  readonly instance: BetterAuthInstance;
66
- }
66
+ } | {
67
+ /**
68
+ * The options for `betterAuth()`, which the provider calls on the first request.
69
+ * Better Auth starts querying the database as soon as it is created, and some
70
+ * runtimes, such as Cloudflare's, allow no I/O while the app loads.
71
+ */
72
+ readonly options: BetterAuthOptions;
73
+ };
67
74
  /**
68
75
  * Sessions become user principals: a cookie on the same-origin web, a bearer token in
69
76
  * native shells. Access tokens Better Auth issued to MCP clients become agent principals
70
77
  * without a turn.
71
78
  */
72
- export declare function betterAuthProvider({ instance, }: BetterAuthProviderOptions): AuthProvider;
79
+ export declare function betterAuthProvider(provided: BetterAuthProviderOptions): AuthProvider;
73
80
  export {};
74
81
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}