@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EACL,cAAc,EAEd,SAAS,EAGT,iBAAiB,EAEjB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAEL,SAAS,EACT,kBAAkB,EAIlB,cAAc,GAMf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EAEf,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAE/C,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAI,OAAO,IAAiD,CAAC,GAAG,CAAC;IAC1E,OAAO,GAAG,EAAE,iBAAiB,IAAI,EAAE,CAAC;AACtC,CAAC;AAgBD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAI7B,MAAM;IACN,IAAI;IAJG,IAAI,GAAG,iBAAiB,CAAC;IAC3C,YACE,OAAe,EACN,MAAc,EACd,IAAwB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;oBACN,IAAI;IAGf,CAAC;CACF;AA4BD,SAAS,MAAM,CAAC,MAAwB;IACtC,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAC1B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAC/C,MAAM,IAAI,eAAe,CAAC,OAAO,IAAI,wBAAwB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,iBAAiB,GAAoB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAEnE,MAAM,QAAQ,GAAG;IACf,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,WAAW,EAAE,SAAS,CAAC;IACxB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,UAAU,EAAE,QAAQ,CAAC;CACd,CAAC;AAEX,MAAM,OAAO,GAAG;IACd,CAAC,aAAa,EAAE,KAAK,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,UAAU,EAAE,OAAO,CAAC;IACrB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,OAAO,EAAE,OAAO,CAAC;CACV,CAAC;AAEX,SAAS,UAAU;IACjB,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,GAAG,OAAO,OAAO,MAAM,EAAE,CAAC;IACxD,OAAO,OAAO,IAAI,MAAM,IAAI,aAAa,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,OAAO,CACL,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9E,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,SAAoB;IAC3C,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACvC,SAAS,EACT,IAAI,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAC1C,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,IAAI,WAAW,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,6FAA6F;AAC7F,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,IAAI;YAAE,OAAO;QAC5B,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC3D,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACjC,UAAU,CAAC,OAAO,EAAE,YAAY,CAC9B,UAAU,CAAC,OAAO,CAAC,KAAK,EACxB,EAAE,EACF,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,KAAoC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;AAEvF,SAAS,kBAAkB,CAAC,QAAuC,EAAE,IAAY;IAC/E,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU;QACnC,CAAC,CAAC;YACE,MAAM,EAAE,UAAmB;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,IAAI;YACJ,SAAS,EAAE,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE;YACpC,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC;QACH,CAAC,CAAC;YACE,MAAM,EAAE,WAAoB;YAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,SAAS,EAAE,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE;SACrC,CAAC;AACR,CAAC;AAED,SAAS,UAAU,CACjB,QAA+C;IAE/C,IAAI,QAAQ,EAAE,MAAM,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC;IACvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAsB,EAAE;IAC9D,eAAe,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,KAAK,GAAsC,OAAO,CAAC,OAAO;QAC9D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAClC,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAC1C,CAAC;IAEN,MAAM,OAAO,GAAG,KAAK,IAA0B,EAAE;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC,CAAC;IAEF,2FAA2F;IAC3F,IAAI,MAA8C,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,sBAAsB,CAAC;QACrB,OAAO,EAAE,GAAG,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,OAAO;QACnE,OAAO,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAChC,YAAY,EAAE;YACZ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,EAAE,CAAC;oBACzD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACzD,IAAI,KAAK;oBAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;qBACtC,IACH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;oBACvD,CAAC,OAAO,CAAC,IAAI,EACb,CAAC;oBACD,4EAA4E;oBAC5E,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;SACF;KACF,CAAC,CAAC;IACL,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;IAEhD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAgD,CAAC;IACrD,IAAI,UAAU,GAAG,aAAa,CAAC;IAC/B,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,UAAU,GAAG,aAAa,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY;YAAE,OAAO;QACtD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,KAAK,GAAG,SAAS,CAAC;YAClB,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,IAAI,IAAa,CAAC;IAClB,IAAI,QAAQ,GAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,GAAoB,EAAE;QACpC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC5C,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,GAAG,KAAK,CAAC;QACb,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,QAAQ,GAAG,iBAAiB,CAAC;YAC/D,2FAA2F;YAC3F,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;QAC9B,QAAQ,GAAG,IAAI;YACb,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE;YACpF,CAAC,CAAC,KAAK,CAAC,SAAS;gBACf,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;gBACvB,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,CAAiB;QACjD,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,GAAG,QAAQ,OAAO;QAC5B,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,KAAK,IAAoC,EAAE;QACpE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6C,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,EAClB,IAAiB,EACjB,aAAsB,EACa,EAAE;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAC/B;YACE,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,IAAI,CAAC,KAAK;YACpB,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;SACtC,EACD,EAAE,QAAQ,EAAE,aAAa,EAAE,CAC5B,CAAC;QACF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE;YAChD,IAAI;YACJ,QAAQ;YACR,SAAS;YACT,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE;YAC7D,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,OAAO;YACL,EAAE;YACF,IAAI,EAAE;gBACJ,QAAQ,EAAE,EAAE;gBACZ,IAAI;gBACJ,QAAQ;gBACR,UAAU;gBACV,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC;aAClC;YACD,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACnC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,MAAM,EAAE,QAAQ;oBAChC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBAC3C,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;gBACvE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1E,CAAC;YACD,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;gBACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,MAAM;oBACtB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBAC3C,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC3B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;YACzC,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,MAErB,EAAqC,EAAE;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,kGAAkG;QAClG,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,WAAW,EAAE,KAAK,SAAS,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxE,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,SAAS,CAAC;YACjF,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CACZ,CAAC,QAAQ,EAAE,EAAE;YACX,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,EACD,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CACtC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,OAAO;QACP,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;gBAC/C,eAAe,EAAE,CAAC;gBAClB,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,EAAE;gBACV,IAAI,EAAE,CAAC;gBACP,QAAQ,IAAI,CAAC,CAAC;gBACd,IAAI,QAAQ,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1C,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,KAAK,GAAG,SAAS,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,OAAO,GAAG,WAAW,EAAE,KAAK,SAAS,CAAC;YAC5C,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GACV,KAAK,KAAK,SAAS;gBACnB,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC;YACpE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACjE,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,GAAG,EACH,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,IAAI,CAAC,UAAU,EACnB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAChC,CAAC;YACF,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC1D,MAAM,EAAE,GAAG,CAAC,EAAE;gBACd,IAAI;aACL,CAAC,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QAC3D,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,IAAI,EAAwB,EAAE;YAChD,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAC9B,mBAAmB,EACnB,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAG,IAA6B,CAAC,QAAQ,EAAE,CACtE,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,EAC/B,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,WAAW,EAAE,SAAS,CAC7B,CAAC;YACF,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ;gBACtB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI;gBAC/B,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU;gBACV,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC;aAC3B,CAAC;QACJ,CAAC;QACD,WAAW,EAAE,KAAK,IAAI,EAAE;YACtB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAAE,OAAO,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,cAAc,CAAC,uCAAuC,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAC9B,cAAc,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EACpD;gBACE,QAAQ,EAAE,IAAI;aACf,CACF,CAAC;YACF,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE;gBACjC,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,GAAG;gBACH,EAAE;gBACF,SAAS;aACV,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBACjD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACxE,OAAO,CAAC,MAAM,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;QAC1D,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,cAAc,CAAC,uCAAuC,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChF,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE;gBAChC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,GAAG,CAAC,EAAE;gBACf,GAAG;gBACH,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,EAAE;gBACF,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,WAAW,EAAE,KAAK,IAAI,EAAE;YACtB,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;YACnF,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,CAAC;QACD,MAAM;QACN,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAC7C,GAAG,OAAO,GAAG,QAAQ,uBAAuB,EAC5C;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBACrE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,GAAG,OAAO;oBACV,WAAW,EAAE,iBAAiB;oBAC9B,QAAQ,EAAE,SAAS;iBACpB,CAAC;aACH,CACF,CAAC;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAC;YACd,IACE,CAAC,QAAQ,CAAC,EAAE;gBACZ,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;gBAC9B,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAC5B,CAAC;gBACD,MAAM,IAAI,eAAe,CACvB,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,sCAAsC,EAC9D,QAAQ,CAAC,MAAM,EACf,IAAI,EAAE,KAAK,EAAE,IAAI,CAClB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,OAAO;KACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { oauthProviderClient } from \"@better-auth/oauth-provider/client\";\nimport {\n type AuthBrowser,\n authBrowser,\n detectPlatform,\n type DeviceKey,\n deviceKey,\n type PairingPresenceKey,\n type PresencePublicKey,\n resolveCapability,\n type SessionStore,\n sessionStore,\n} from \"@parlor/capabilities\";\nimport { decodeBase64url, encodeBase64url } from \"@parlor/capabilities/encoding\";\nimport {\n type ActionClient,\n appOrigin,\n type ComputerDisconnector,\n createActionClient,\n type DeviceLinker,\n type DeviceSource,\n type HostAuthorizer,\n LinkOnComputer,\n type PendingLink,\n type SessionDevice,\n type SessionSnapshot,\n type SessionSource,\n type SessionUser,\n} from \"@parlor/client\";\nimport { ActionError } from \"@parlor/core\";\nimport type { BetterAuthClientPlugin } from \"better-auth/client\";\nimport { createAuthClient as createBetterAuthClient } from \"better-auth/client\";\nimport { emailOTPClient } from \"better-auth/client/plugins\";\n\nimport type { AccountActions } from \"../account.js\";\nimport type { nativeSignIn } from \"../native-sign-in.js\";\nimport {\n answerStatement,\n deviceCommitment,\n HOST_PAIRING_FRAGMENT,\n HOST_PAIRING_KEY,\n linkCode,\n normalizeLinkCode,\n pairingProof,\n promptStatement,\n removeStatement,\n type Statement,\n statementBytes,\n vouchStatement,\n} from \"../statements.js\";\n\nconst DEFAULT_BASE_PATH = \"/_parlor\";\nconst RETRY_BASE_MS = 1000;\nconst RETRY_MAX_MS = 30_000;\nconst TOKEN_HEADER = \"set-auth-token\";\nconst HOST_IPC_REDIRECT = \"urn:parlor:ipc\";\nconst DEBUG_KEY = \"parlor:debug\";\n\nconst NATIVE_CALLBACK = \"//_parlor/auth/callback\";\n\nfunction injectedServerUrl(): string {\n const env = (import.meta as { env?: { PARLOR_SERVER_URL?: string } }).env;\n return env?.PARLOR_SERVER_URL ?? \"\";\n}\n\nfunction injectedScheme(): string {\n const env = (import.meta as { env?: { PARLOR_APP_SCHEME?: string } }).env;\n return env?.PARLOR_APP_SCHEME ?? \"\";\n}\n\nconst nativeSignInClient = {\n id: \"parlor-native-sign-in\",\n $InferServerPlugin: {} as ReturnType<typeof nativeSignIn>,\n atomListeners: [\n { matcher: (path: string) => path === \"/native/token\", signal: \"$sessionSignal\" },\n ],\n} satisfies BetterAuthClientPlugin;\n\nconst randomText = (bytes: number) =>\n encodeBase64url(crypto.getRandomValues(new Uint8Array(bytes)));\n\nasync function pkceChallenge(verifier: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(verifier),\n );\n return encodeBase64url(new Uint8Array(digest));\n}\n\nexport interface AuthClientOptions {\n /** The backend origin; defaults to the shell's `server.url`, or this page's origin. */\n readonly baseUrl?: string | undefined;\n readonly basePath?: string | undefined;\n /**\n * Where a bearer session is kept. Defaults to the `sessionStore` capability: native\n * shells keep a bearer token, the web keeps a cookie.\n */\n readonly session?: SessionStore | undefined;\n /** Where this device's signing keys live. Defaults to the `deviceKey` capability. */\n readonly deviceKey?: DeviceKey | undefined;\n /** Where social sign-in runs. Defaults to the `authBrowser` capability. */\n readonly browser?: AuthBrowser | undefined;\n /** The app's URL scheme, where social sign-in returns in a native shell. Defaults to `app.scheme`. */\n readonly scheme?: string | undefined;\n readonly fetch?: typeof fetch | undefined;\n}\n\nexport class AuthClientError extends Error {\n override readonly name = \"AuthClientError\";\n constructor(\n message: string,\n readonly status: number,\n readonly code: string | undefined,\n ) {\n super(message);\n }\n}\n\nexport type DeviceHandle = SessionDevice;\n\nexport interface SocialSignInInput {\n /** A provider in Better Auth's `socialProviders`, or a `genericOAuth` provider id. */\n readonly provider: string;\n /** On the web, the page the provider returns to once signed in. Defaults to `/`. */\n readonly callbackURL?: string | undefined;\n /** On the web, the page a failed sign-in returns to with `?error=`. Defaults to this page. */\n readonly errorCallbackURL?: string | undefined;\n}\n\nexport interface AuthClient\n extends\n SessionSource,\n DeviceSource,\n HostAuthorizer,\n DeviceLinker,\n ComputerDisconnector {\n deviceSetup(): Promise<\"needed\" | \"ready\">;\n /** Plug into `createActionClient({ headers })` so every surface carries the session. */\n readonly headers: () => Promise<HeadersInit>;\n signIn(input: { readonly email: string; readonly password: string }): Promise<void>;\n signUp(input: {\n readonly name: string;\n readonly email: string;\n readonly password: string;\n }): Promise<void>;\n signOut(): Promise<void>;\n /** Sign-in with a one-time code sent by email, through Better Auth's `emailOTP` plugin. */\n readonly emailOtp: {\n send(input: { readonly email: string }): Promise<void>;\n /** Signs in, creating the account on first use unless the plugin disables sign-up. */\n signIn(input: {\n readonly email: string;\n readonly otp: string;\n readonly name?: string | undefined;\n }): Promise<void>;\n };\n /** Sign-in with a provider such as Google, through Better Auth's `socialProviders`. */\n readonly social: {\n /** Whether this platform can run it: false in a native shell without the `authBrowser` capability. */\n available(): Promise<boolean>;\n /**\n * On the web the page leaves for the provider and comes back to `callbackURL`, so this\n * never resolves. In a native shell the provider opens in the system's sign-in browser\n * and this resolves once the app is signed in; it throws `AuthClientError` with code\n * `CANCELLED` when the user closes it.\n */\n signIn(input: SocialSignInInput): Promise<void>;\n };\n /** The account actions: `sessions`, `revokeSession`, `agents`, `revokeAgent`. */\n readonly account: ActionClient<AccountActions>;\n}\n\ninterface BetterAuthResult {\n readonly error?: {\n readonly message?: string | undefined;\n readonly status: number;\n readonly code?: string | undefined;\n } | null;\n}\n\nfunction settle(result: BetterAuthResult): void {\n if (!result.error) return;\n const { message, status, code } = result.error;\n throw new AuthClientError(message || \"Authentication failed.\", status, code);\n}\n\nconst ANONYMOUS_SESSION: SessionSnapshot = { status: \"anonymous\" };\n\nconst BROWSERS = [\n [/Edg\\//, \"Edge\"],\n [/OPR\\//, \"Opera\"],\n [/Firefox\\//, \"Firefox\"],\n [/Chrome\\//, \"Chrome\"],\n [/Safari\\//, \"Safari\"],\n] as const;\n\nconst SYSTEMS = [\n [/iPhone|iPad/, \"iOS\"],\n [/Android/, \"Android\"],\n [/Mac OS X/, \"macOS\"],\n [/Windows/, \"Windows\"],\n [/Linux/, \"Linux\"],\n] as const;\n\nfunction deviceName(): string {\n const agent = globalThis.navigator?.userAgent ?? \"\";\n const browser = BROWSERS.find(([pattern]) => pattern.test(agent))?.[1];\n const system = SYSTEMS.find(([pattern]) => pattern.test(agent))?.[1];\n if (browser && system) return `${browser} on ${system}`;\n return browser ?? system ?? \"This device\";\n}\n\nfunction debugStatements(): boolean {\n try {\n return (\n globalThis.localStorage?.getItem(DEBUG_KEY)?.split(\",\").includes(\"statements\") ??\n false\n );\n } catch {\n return false;\n }\n}\n\nasync function logSigned(statement: Statement): Promise<void> {\n if (!debugStatements()) return;\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new Uint8Array(statementBytes(statement)),\n );\n const hex = [...new Uint8Array(digest)]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n console.info(`[parlor] signed ${statement.kind} sha256=${hex}`);\n}\n\n/** Takes the host's pairing secret off this page's URL, where only that redirect puts it. */\nfunction keepHostPairing(): void {\n try {\n const location = globalThis.location;\n if (!location?.hash) return;\n const fragment = new URLSearchParams(location.hash.slice(1));\n const secret = fragment.get(HOST_PAIRING_FRAGMENT);\n if (!secret) return;\n globalThis.localStorage?.setItem(HOST_PAIRING_KEY, secret);\n fragment.delete(HOST_PAIRING_FRAGMENT);\n const rest = fragment.toString();\n globalThis.history?.replaceState(\n globalThis.history.state,\n \"\",\n `${location.pathname}${location.search}${rest ? `#${rest}` : \"\"}`,\n );\n } catch {}\n}\n\nfunction watchHostPairing(listener: () => void): () => void {\n const changed = (event: StorageEvent) => {\n if (event.key === HOST_PAIRING_KEY || event.key === null) listener();\n };\n globalThis.addEventListener?.(\"storage\", changed);\n return () => globalThis.removeEventListener?.(\"storage\", changed);\n}\n\nfunction hostPairing(): string | undefined {\n try {\n return globalThis.localStorage?.getItem(HOST_PAIRING_KEY) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nconst serverHasNoAuth = (error: { readonly status?: unknown }) => error.status === 404;\n\nfunction enrollmentPresence(presence: PresencePublicKey | undefined, rpId: string) {\n if (!presence) return undefined;\n return presence.format === \"webauthn\"\n ? {\n format: \"webauthn\" as const,\n credentialId: presence.credentialId,\n rpId,\n publicKey: { ...presence.publicKey },\n attestation: presence.attestation,\n }\n : {\n format: \"es256-raw\" as const,\n keyId: presence.keyId,\n publicKey: { ...presence.publicKey },\n };\n}\n\nfunction registered(\n presence: ReturnType<typeof enrollmentPresence>,\n): PairingPresenceKey | undefined {\n if (presence?.format !== \"webauthn\") return presence;\n const { attestation: _attestation, ...key } = presence;\n return key;\n}\n\nfunction hostnameOf(origin: string): string {\n try {\n return new URL(origin).hostname;\n } catch {\n return globalThis.location.hostname;\n }\n}\n\nexport function createAuthClient(options: AuthClientOptions = {}): AuthClient {\n keepHostPairing();\n const baseUrl = options.baseUrl ?? injectedServerUrl();\n const basePath = options.basePath ?? DEFAULT_BASE_PATH;\n const store: Promise<SessionStore | undefined> = options.session\n ? Promise.resolve(options.session)\n : resolveCapability(sessionStore).then((handle) =>\n handle.available ? handle.api : undefined,\n );\n\n const headers = async (): Promise<HeadersInit> => {\n const token = await (await store)?.get();\n return token ? { authorization: `Bearer ${token}` } : {};\n };\n\n // Built on first use: importing a module that creates the client must work outside a page.\n let client: ReturnType<typeof connect> | undefined;\n const connect = () =>\n createBetterAuthClient({\n baseURL: `${baseUrl || globalThis.location.origin}${basePath}/auth`,\n plugins: [oauthProviderClient(), emailOTPClient(), nativeSignInClient],\n fetchOptions: {\n ...(options.fetch ? { customFetchImpl: options.fetch } : {}),\n onRequest: async (context) => {\n for (const [name, value] of new Headers(await headers())) {\n context.headers.set(name, value);\n }\n return context;\n },\n onSuccess: async (context) => {\n const token = context.response.headers.get(TOKEN_HEADER);\n if (token) await (await store)?.set(token);\n else if (\n context.request.url.toString().endsWith(\"/get-session\") &&\n !context.data\n ) {\n // A bearer token the server no longer knows would fail every later request.\n await (await store)?.set(undefined);\n }\n },\n },\n });\n const betterAuth = () => (client ??= connect());\n\n let watchers = 0;\n let retry: ReturnType<typeof setTimeout> | undefined;\n let retryDelay = RETRY_BASE_MS;\n const retryAfterError = () => {\n const state = betterAuth().useSession.get();\n if (!state.error || serverHasNoAuth(state.error)) {\n retryDelay = RETRY_BASE_MS;\n return;\n }\n if (retry !== undefined || state.isRefetching) return;\n retry = setTimeout(() => {\n retry = undefined;\n void state.refetch();\n }, retryDelay);\n retryDelay = Math.min(retryDelay * 2, RETRY_MAX_MS);\n };\n\n let last: unknown;\n let snapshot: SessionSnapshot = { status: \"loading\" };\n const current = (): SessionSnapshot => {\n const state = betterAuth().useSession.get();\n if (state === last) return snapshot;\n last = state;\n if (state.error) {\n if (serverHasNoAuth(state.error)) snapshot = ANONYMOUS_SESSION;\n // Only the server saying there is no session signs the user out, never an unreachable one.\n return snapshot;\n }\n const user = state.data?.user;\n snapshot = user\n ? { status: \"signed-in\", user: { id: user.id, name: user.name, email: user.email } }\n : state.isPending\n ? { status: \"loading\" }\n : { status: \"signed-out\" };\n return snapshot;\n };\n\n const account = createActionClient<AccountActions>({\n baseUrl,\n fetch: options.fetch,\n basePath: `${basePath}/auth`,\n headers,\n });\n\n const signInBrowser = async (): Promise<AuthBrowser | undefined> => {\n if (options.browser) return options.browser;\n const handle = await resolveCapability(authBrowser);\n return handle.available ? handle.api : undefined;\n };\n\n const signInOnThePage = async (browser: AuthBrowser, input: SocialSignInInput) => {\n const page = new URL(globalThis.location.href);\n const callbackURL = new URL(input.callbackURL ?? \"/\", page).href;\n const errorPage = new URL(input.errorCallbackURL ?? page, page);\n errorPage.searchParams.delete(\"error\");\n errorPage.searchParams.delete(\"error_description\");\n const result = await betterAuth().signIn.social({\n provider: input.provider,\n callbackURL,\n errorCallbackURL: errorPage.href,\n disableRedirect: true,\n });\n settle(result);\n const url = result.data?.url;\n if (!url)\n throw new AuthClientError(\"The provider gave no sign-in page.\", 500, undefined);\n await browser.open(url, callbackURL);\n };\n\n const signInInTheApp = async (browser: AuthBrowser, provider: string) => {\n const scheme = options.scheme ?? injectedScheme();\n if (!scheme) {\n throw new AuthClientError(\n \"Set app.scheme in parlor.config.ts to sign in with a provider in the app.\",\n 0,\n \"NO_SCHEME\",\n );\n }\n const callback = `${scheme}:${NATIVE_CALLBACK}`;\n const verifier = randomText(32);\n const state = randomText(16);\n const start = new URL(\n `${baseUrl || globalThis.location.origin}${basePath}/auth/native/sign-in/social`,\n );\n start.search = new URLSearchParams({\n provider,\n redirect_uri: callback,\n code_challenge: await pkceChallenge(verifier),\n code_challenge_method: \"S256\",\n state,\n }).toString();\n const returned = await browser.open(start.href, callback);\n if (!returned) throw new AuthClientError(\"Sign-in was cancelled.\", 0, \"CANCELLED\");\n const answer = new URL(returned).searchParams;\n if (answer.get(\"state\") !== state) {\n throw new AuthClientError(\n \"This sign-in was not started here.\",\n 0,\n \"STATE_MISMATCH\",\n );\n }\n const failed = answer.get(\"error\");\n const code = answer.get(\"code\");\n if (failed || !code) {\n throw new AuthClientError(\n answer.get(\"error_description\") || `Sign-in failed (${failed ?? \"no code\"}).`,\n 400,\n failed ?? undefined,\n );\n }\n settle(await betterAuth().native.token({ code, code_verifier: verifier }));\n };\n\n const keysOfThisPlatform = async (): Promise<DeviceKey | undefined> => {\n const handle = await resolveCapability(deviceKey);\n return handle.available ? handle.api : undefined;\n };\n\n const devices = new Map<string, Promise<DeviceHandle | undefined>>();\n const enroll = async (\n user: SessionUser,\n wantsPresence: boolean,\n ): Promise<DeviceHandle | undefined> => {\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!key) return undefined;\n const app = appOrigin(baseUrl || undefined);\n const rpId = hostnameOf(app);\n const { challenge } = await account.call(\"deviceChallenge\", {});\n const keys = await key.publicKeys(\n {\n rpId,\n userId: user.id,\n userName: user.email,\n challenge: decodeBase64url(challenge),\n },\n { presence: wantsPresence },\n );\n const presence = enrollmentPresence(keys.presence, rpId);\n const name = deviceName();\n const platform = detectPlatform();\n const signingKey = { ...keys.signing.publicKey };\n const { id } = await account.call(\"enrollDevice\", {\n name,\n platform,\n challenge,\n signing: { keyId: keys.signing.keyId, publicKey: signingKey },\n ...(presence ? { presence } : {}),\n proof: keys.proof,\n });\n return {\n id,\n keys: {\n deviceId: id,\n name,\n platform,\n signingKey,\n presenceKey: registered(presence),\n },\n signPrompt: async (prompt, wanted) => {\n const at = Date.now();\n const statement = await promptStatement(app, prompt, at);\n const bytes = statementBytes(statement);\n const signature = wanted?.presence\n ? await key.sign(bytes, { presence: true })\n : await key.sign(bytes, { presence: false });\n await logSigned(statement);\n const secret = hostPairing();\n const pairing = secret && (await pairingProof(secret, id, signingKey));\n return { deviceId: id, at, signature, ...(pairing ? { pairing } : {}) };\n },\n signAnswer: async (answer, { presence: wanted }) => {\n const at = Date.now();\n const statement = await answerStatement(app, answer, at);\n const bytes = statementBytes(statement);\n const signature = wanted\n ? await key.sign(bytes, { presence: true })\n : await key.sign(bytes, { presence: false });\n await logSigned(statement);\n return { deviceId: id, at, signature };\n },\n };\n };\n\n const device = async (wanted?: {\n readonly presence?: boolean;\n }): Promise<DeviceHandle | undefined> => {\n const session = current();\n if (session.status !== \"signed-in\") return undefined;\n const known = devices.get(session.user.id);\n if (known) return known;\n // The browser that approved `connect` is on the computer, which answers its permission questions.\n const presence = wanted?.presence ?? hostPairing() === undefined;\n const enrolling = enroll(session.user, presence).catch((error: unknown) => {\n if (error instanceof ActionError && error.code === \"not_found\") return undefined;\n throw error;\n });\n devices.set(session.user.id, enrolling);\n enrolling.then(\n (enrolled) => {\n if (!enrolled) devices.delete(session.user.id);\n },\n () => devices.delete(session.user.id),\n );\n return enrolling;\n };\n\n return {\n headers,\n current,\n subscribe: (listener) => {\n watchers += 1;\n const stop = betterAuth().useSession.listen(() => {\n retryAfterError();\n listener();\n });\n return () => {\n stop();\n watchers -= 1;\n if (watchers === 0 && retry !== undefined) {\n clearTimeout(retry);\n retry = undefined;\n }\n };\n },\n signIn: async (input) => settle(await betterAuth().signIn.email(input)),\n signUp: async (input) => settle(await betterAuth().signUp.email(input)),\n emailOtp: {\n send: async ({ email }) =>\n settle(\n await betterAuth().emailOtp.sendVerificationOtp({ email, type: \"sign-in\" }),\n ),\n signIn: async ({ email, otp, name }) =>\n settle(\n await betterAuth().signIn.emailOtp({ email, otp, ...(name ? { name } : {}) }),\n ),\n },\n social: {\n available: async () => (await signInBrowser()) !== undefined,\n signIn: async (input) => {\n const browser = await signInBrowser();\n if (!browser) {\n throw new AuthClientError(\n `Signing in with ${input.provider} is not available here.`,\n 0,\n \"UNSUPPORTED\",\n );\n }\n if (await store) await signInInTheApp(browser, input.provider);\n else await signInOnThePage(browser, input);\n },\n },\n signOut: async () => {\n try {\n settle(await betterAuth().signOut());\n } finally {\n await (await store)?.set(undefined);\n }\n },\n subscribeLink: watchHostPairing,\n linkState: async () => {\n const pairing = hostPairing() !== undefined;\n const session = current();\n if (session.status !== \"signed-in\") return { vouched: false, pairing };\n const known = devices.get(session.user.id);\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n const silent =\n known !== undefined ||\n (key !== undefined && (await key.presenceSetup?.()) !== \"needed\");\n const own = silent ? await device() : undefined;\n if (!own) return { vouched: false, pairing };\n const listed = await account.call(\"devices\", {});\n const listing = listed.find((entry) => entry.id === own.id);\n if (!listing) {\n devices.delete(session.user.id);\n return { vouched: false, pairing };\n }\n return { deviceId: own.id, vouched: listing.vouched, pairing };\n },\n startLink: async (wanted) => {\n const own = await device(wanted);\n if (!own) throw new Error(\"Sign in on this device first.\");\n const app = appOrigin(baseUrl || undefined);\n const commitment = await deviceCommitment(\n app,\n own.id,\n own.keys.signingKey,\n own.keys.presenceKey?.publicKey,\n );\n const code = linkCode(commitment);\n const { expiresAt } = await account.call(\"startDeviceLink\", {\n device: own.id,\n code,\n });\n return { deviceId: own.id, code, commitment, expiresAt };\n },\n resolveLink: async (from): Promise<PendingLink> => {\n const code = typeof from === \"string\" ? normalizeLinkCode(from) : undefined;\n const found = await account.call(\n \"resolveDeviceLink\",\n code ? { code } : { device: (from as { deviceId: string }).deviceId },\n );\n const commitment = await deviceCommitment(\n appOrigin(baseUrl || undefined),\n found.id,\n found.signingKey,\n found.presenceKey?.publicKey,\n );\n const matches =\n typeof from === \"string\"\n ? linkCode(commitment) === code\n : found.id === from.deviceId && commitment === from.commitment;\n if (!matches) {\n throw new Error(\n \"The app returned a device whose keys do not match this code, so it was not linked.\",\n );\n }\n return {\n id: found.id,\n name: found.name,\n platform: found.platform,\n commitment,\n code: linkCode(commitment),\n };\n },\n disconnectComputer: async (hostId) => {\n await account.call(\"revokeHost\", { hostId });\n },\n listDevices: async () => {\n const session = current();\n if (session.status !== \"signed-in\") return [];\n const own = devices.has(session.user.id) ? await device() : undefined;\n const listed = await account.call(\"devices\", {});\n return listed.map((entry) => ({ ...entry, current: entry.id === own?.id }));\n },\n removeDevice: async (id) => {\n const own = await device();\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!own?.keys.presenceKey || !key) {\n throw new LinkOnComputer(\"This device cannot confirm it is you.\");\n }\n const app = appOrigin(baseUrl || undefined);\n const at = Date.now();\n const signature = await key.sign(\n statementBytes(removeStatement(app, own.id, id, at)),\n {\n presence: true,\n },\n );\n await account.call(\"removeDevice\", {\n device: id,\n actor: own.id,\n app,\n at,\n signature,\n });\n const session = current();\n if (id === own.id && session.status === \"signed-in\")\n devices.delete(session.user.id);\n },\n canVouch: async () => {\n const session = current();\n if (session.status !== \"signed-in\") return false;\n const known = devices.get(session.user.id);\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!known && (await key?.presenceSetup?.()) === \"needed\") return false;\n return (await device())?.keys.presenceKey !== undefined;\n },\n vouch: async (link) => {\n const own = await device();\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!own?.keys.presenceKey || !key) {\n throw new LinkOnComputer(\"This device cannot confirm it is you.\");\n }\n const app = appOrigin(baseUrl || undefined);\n const at = Date.now();\n const statement = vouchStatement(app, own.id, link.id, link.commitment, at);\n const signature = await key.sign(statementBytes(statement), { presence: true });\n await account.call(\"vouchDevice\", {\n device: link.id,\n voucher: own.id,\n app,\n commitment: link.commitment,\n at,\n signature,\n });\n },\n deviceSetup: async () => {\n const session = current();\n if (session.status !== \"signed-in\" || devices.has(session.user.id)) return \"ready\";\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n return (await key?.presenceSetup?.()) === \"needed\" ? \"needed\" : \"ready\";\n },\n device,\n authorizeHost: async (pairing) => {\n const response = await (options.fetch ?? fetch)(\n `${baseUrl}${basePath}/auth/hosts/authorize`,\n {\n method: \"POST\",\n headers: { ...(await headers()), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...pairing,\n redirectUri: HOST_IPC_REDIRECT,\n decision: \"connect\",\n }),\n },\n );\n const body = (await response.json().catch(() => undefined)) as\n | { code?: unknown; state?: unknown; error?: { message?: string; code?: string } }\n | undefined;\n if (\n !response.ok ||\n typeof body?.code !== \"string\" ||\n body.state !== pairing.state\n ) {\n throw new AuthClientError(\n body?.error?.message ?? \"The computer could not be connected.\",\n response.status,\n body?.error?.code,\n );\n }\n return body.code;\n },\n account,\n };\n}\n\nexport type { AuthBrowser, HostPairing, SessionStore } from \"@parlor/capabilities\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,MAAM,UAAU,MAAM,CAAI,MAAe;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAa,CAAC;IAChD,OAAO,CAAE,MAAyB,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;AACxD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,KAAK,CAAC,KAA0B;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,MAAM,UAAU,MAAM,CAAI,MAAe;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAa,CAAC;IAChD,OAAO,CAAE,MAAyB,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;AACxD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,KAAK,CAAC,KAA0B;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,CAAC","sourcesContent":["import type { PgDatabase, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\n\nexport type Database = PgDatabase<PgQueryResultHKT>;\n\n/** node-postgres and PGlite both answer `execute` with `{ rows }`; drizzle's proxy with an array. */\nexport function rowsOf<T>(result: unknown): T[] {\n if (Array.isArray(result)) return result as T[];\n return ((result as { rows?: T[] }).rows ?? []) as T[];\n}\n\n/** A jsonb column arrives parsed from node-postgres and PGlite, as text from other drivers. */\nexport function jwkOf(value: JsonWebKey | string): JsonWebKey {\n return typeof value === \"string\" ? (JSON.parse(value) as JsonWebKey) : value;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EACV,UAAU,EAEV,SAAS,EACT,UAAU,EACV,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CAChF;AAgBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAyB3E;AAED,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,EAAE,SAsB/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,SAQtC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAChD;AA0CD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC;AAsDD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAqBpC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB;;;4BA+BG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA0Bd,QAAQ;;;;;;4BAkEU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA8CxB,MAAM;;;;;;;;;;;;;;;;;;;;;;qBAqEN,MAAM;;;;;qBA0CL,MAAM;;GAgB5D;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EACV,UAAU,EAEV,SAAS,EACT,UAAU,EACV,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CAChF;AAgBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,CAyB3E;AAED,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,EAAE,SAsB/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,SAQtC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAChD;AA0CD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC;AAsDD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAqBpC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB;;;4BA+BG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2Bd,QAAQ;;;;;;4BAmEU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgDxB,MAAM;;;;;;;;;;;;;;;;;;;;;;qBAsEN,MAAM;;;;;qBA0CL,MAAM;;GAgB5D;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC"}
package/dist/devices.js CHANGED
@@ -4,7 +4,7 @@ import { ActionError, asId, defineAction, } from "@parlor/core";
4
4
  import { createRegistry } from "@parlor/core/registry";
5
5
  import { sql } from "drizzle-orm";
6
6
  import { z } from "zod";
7
- import { signedIn } from "./account.js";
7
+ import { requireChat, signedIn } from "./account.js";
8
8
  import { jwkOf, rowsOf } from "./database.js";
9
9
  import { verifyEs256 } from "./es256.js";
10
10
  import { LINK_CODE_LENGTH, normalizeLinkCode, removeStatement, verifyStatement, vouchStatement, } from "./statements.js";
@@ -188,6 +188,7 @@ export function deviceAccountActions(deps) {
188
188
  input: z.object({}),
189
189
  run: async (_input, ctx) => {
190
190
  const user = signedIn(ctx);
191
+ await requireChat(deps.host, ctx);
191
192
  const challenge = randomBytes(32).toString("base64url");
192
193
  await databaseOf(deps.host).transaction(async (handle) => {
193
194
  const tx = handle;
@@ -212,6 +213,7 @@ export function deviceAccountActions(deps) {
212
213
  }),
213
214
  run: async (input, ctx) => {
214
215
  const user = signedIn(ctx);
216
+ await requireChat(deps.host, ctx);
215
217
  const signing = await pointOf(input.signing.publicKey);
216
218
  const presence = await presenceOf(input.presence);
217
219
  const { proof } = input;
@@ -269,6 +271,7 @@ export function deviceAccountActions(deps) {
269
271
  input: z.object({ device: z.string().min(1), code: linkCodeInput }),
270
272
  run: async ({ device, code }, ctx) => {
271
273
  const user = signedIn(ctx);
274
+ await requireChat(deps.host, ctx);
272
275
  const expiresAt = new Date(Date.now() + LINK_TTL_MS).toISOString();
273
276
  const started = rowsOf(await databaseOf(deps.host).transaction((handle) => handle.execute(sql `
274
277
  update parlor_auth_devices set link_code = ${code}, link_expires_at = ${expiresAt}
@@ -287,6 +290,7 @@ export function deviceAccountActions(deps) {
287
290
  ]),
288
291
  run: async (input, ctx) => {
289
292
  const user = signedIn(ctx);
293
+ await requireChat(deps.host, ctx);
290
294
  const found = await findPendingDevice(databaseOf(deps.host), user.userId, input);
291
295
  if (!found) {
292
296
  throw new ActionError("not_found", "No device of yours shows this code. Check it, or show a new code on the device.");
@@ -306,6 +310,7 @@ export function deviceAccountActions(deps) {
306
310
  }),
307
311
  run: async (input, ctx) => {
308
312
  const user = signedIn(ctx);
313
+ await requireChat(deps.host, ctx);
309
314
  const voucher = await deps.registry.get(user.userId, asId("device", input.voucher));
310
315
  if (!voucher?.presenceKey) {
311
316
  throw new ActionError("forbidden", "Only a linked device that can confirm it is you can link another device.");
@@ -1 +1 @@
1
- {"version":3,"file":"devices.js","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nimport type { PresencePublicKey } from \"@parlor/capabilities\";\nimport { decodeBase64url, enrollmentBytes } from \"@parlor/capabilities/encoding\";\nimport {\n ActionError,\n asId,\n type DataProvider,\n defineAction,\n type DeviceId,\n type UserId,\n} from \"@parlor/core\";\nimport { type ActionsOf, createRegistry } from \"@parlor/core/registry\";\nimport type {\n DeviceKeys,\n DeviceVouch,\n Migration,\n PluginHost,\n PresenceKey,\n} from \"@parlor/server\";\nimport { sql } from \"drizzle-orm\";\nimport { z } from \"zod\";\n\nimport { requireChat, signedIn } from \"./account.js\";\nimport { type Database, jwkOf, rowsOf } from \"./database.js\";\nimport { verifyEs256 } from \"./es256.js\";\nimport {\n LINK_CODE_LENGTH,\n normalizeLinkCode,\n removeStatement,\n verifyStatement,\n vouchStatement,\n} from \"./statements.js\";\n\nexport type { PresenceKey } from \"@parlor/server\";\n\nexport interface RegisteredDevice extends DeviceKeys {\n readonly userId: UserId;\n readonly createdAt: number;\n readonly revokedAt?: number | undefined;\n}\n\nexport interface DeviceRegistry {\n /** A revoked device reads as undefined, so no host accepts its signatures again. */\n get(userId: UserId, deviceId: DeviceId): Promise<RegisteredDevice | undefined>;\n}\n\ninterface DeviceRow {\n readonly id: string;\n readonly user_id: string;\n readonly name: string;\n readonly platform: string;\n readonly signing_key: JsonWebKey | string;\n readonly presence_key: PresenceKey | string | null;\n readonly created_ms: string | number;\n readonly vouches: DeviceVouch[] | string | null;\n}\n\nconst parsed = <T>(value: T | string | null): T | null =>\n typeof value === \"string\" ? (JSON.parse(value) as T) : value;\n\nexport function createDeviceRegistry(database: DataProvider): DeviceRegistry {\n return {\n async get(userId, deviceId) {\n const [row] = rowsOf<DeviceRow>(\n await (database.read() as Database).execute(sql`\n select id, user_id, name, platform, signing_key, presence_key, vouches,\n (extract(epoch from created_at) * 1000)::bigint as created_ms\n from parlor_auth_devices\n where id = ${deviceId} and user_id = ${userId} and revoked_at is null`),\n );\n if (!row) return undefined;\n const presence = parsed(row.presence_key);\n const vouches = parsed(row.vouches) ?? [];\n return {\n id: asId(\"device\", row.id),\n userId: asId(\"user\", row.user_id),\n name: row.name,\n platform: row.platform,\n signingKey: jwkOf(row.signing_key),\n presenceKey: presence ?? undefined,\n ...(vouches.length > 0 ? { vouches } : {}),\n createdAt: Number(row.created_ms),\n };\n },\n };\n}\n\nexport const DEVICES_TAG = \"parlor_auth_devices\";\n\nexport const DEVICES_MIGRATION: Migration = {\n id: \"auth/0004_devices\",\n sql: `\n create table parlor_auth_devices (\n id text primary key,\n user_id text not null,\n name text not null,\n platform text not null,\n signing_key jsonb not null,\n presence_key jsonb,\n created_at timestamptz not null default now(),\n revoked_at timestamptz\n );\n create index parlor_auth_devices_user on parlor_auth_devices (user_id);\n create unique index parlor_auth_devices_signing_key on parlor_auth_devices\n (user_id, (signing_key->>'x'), (signing_key->>'y')) where revoked_at is null;\n\n create table parlor_auth_device_challenges (\n challenge text primary key,\n user_id text not null,\n expires_at timestamptz not null\n )`,\n};\n\nexport const DEVICE_LINKING_MIGRATION: Migration = {\n id: \"auth/0007_device_linking\",\n sql: `\n alter table parlor_auth_devices add column vouches jsonb not null default '[]'::jsonb;\n alter table parlor_auth_devices add column link_code text;\n alter table parlor_auth_devices add column link_expires_at timestamptz;\n create index parlor_auth_devices_link_code on parlor_auth_devices (user_id, link_code)\n where link_code is not null`,\n};\n\nexport interface ConnectedDevice {\n readonly id: DeviceId;\n readonly name: string;\n readonly platform: string;\n readonly current: boolean;\n readonly createdAt: string;\n /** A linked device vouched for it; the computer pins it on its first prompt. */\n readonly vouched: boolean;\n /** It is showing a link code now. */\n readonly linking: boolean;\n /** The device whose vouch linked it last. */\n readonly linkedBy?: string | undefined;\n}\n\n/** A device waiting to be linked, as the one linking it checks it against the code. */\nexport interface PendingDevice {\n readonly id: DeviceId;\n readonly name: string;\n readonly platform: string;\n readonly signingKey: JsonWebKey;\n readonly presenceKey?: PresenceKey | undefined;\n}\n\nconst CHALLENGE_TTL_MS = 5 * 60_000;\nconst LINK_TTL_MS = 15 * 60_000;\nconst VOUCH_MAX_AGE_MS = 5 * 60_000;\nconst linkCodeInput = z\n .string()\n .min(LINK_CODE_LENGTH)\n .max(32)\n .transform(normalizeLinkCode)\n .refine(\n (code) => /^[0-9A-HJKMNP-TV-Z]{10}$/.test(code),\n \"Enter the 10-character code.\",\n );\nconst P256 = { name: \"ECDSA\", namedCurve: \"P-256\" } as const;\n\nconst jwk = z.record(z.string(), z.unknown());\n\nconst deviceSignature = z.object({\n keyId: z.string(),\n presence: z.enum([\"none\", \"user\"]),\n format: z.enum([\"es256-raw\", \"webauthn\"]),\n signature: z.string(),\n authenticatorData: z.string().optional(),\n clientDataJSON: z.string().optional(),\n});\n\nconst presenceInput = z.discriminatedUnion(\"format\", [\n z.object({\n format: z.literal(\"webauthn\"),\n credentialId: z.string().min(1).max(1024),\n rpId: z.string().min(1).max(255),\n publicKey: jwk,\n attestation: z.string().min(1),\n }),\n z.object({\n format: z.literal(\"es256-raw\"),\n keyId: z.string().min(1),\n publicKey: jwk,\n }),\n]);\n\nexport interface DeviceActionDeps {\n readonly host: PluginHost;\n readonly registry: DeviceRegistry;\n}\n\ninterface DeviceListRow {\n readonly id: string;\n readonly name: string;\n readonly platform: string;\n readonly created_at: string | Date;\n readonly vouched: boolean;\n readonly linking: boolean;\n readonly linked_by: string | null;\n}\n\nfunction databaseOf(host: PluginHost): DataProvider {\n if (!host.database) throw new Error(\"Devices need a database.\");\n return host.database;\n}\n\nconst invalid = (message: string) => new ActionError(\"invalid_input\", message);\n\nasync function pointOf(key: Record<string, unknown>): Promise<JsonWebKey> {\n try {\n const imported = await crypto.subtle.importKey(\"jwk\", key as JsonWebKey, P256, true, [\n \"verify\",\n ]);\n const { kty, crv, x, y } = await crypto.subtle.exportKey(\"jwk\", imported);\n return { kty: kty!, crv: crv!, x: x!, y: y! };\n } catch {\n throw invalid(\"A device key must be an ECDSA P-256 public key.\");\n }\n}\n\ninterface EnrolledPresence {\n readonly stored: PresenceKey;\n readonly proven: PresencePublicKey;\n}\n\nasync function presenceOf(\n input: z.output<typeof presenceInput> | undefined,\n): Promise<EnrolledPresence | undefined> {\n if (!input) return undefined;\n const publicKey = await pointOf(input.publicKey);\n if (input.format === \"webauthn\") {\n const { credentialId, rpId, attestation } = input;\n return {\n stored: { format: \"webauthn\", credentialId, rpId, publicKey },\n proven: { format: \"webauthn\", credentialId, publicKey, attestation },\n };\n }\n const key: PresencePublicKey = { format: \"es256-raw\", keyId: input.keyId, publicKey };\n return { stored: key, proven: key };\n}\n\nconst isoOf = (value: string | Date): string => new Date(value).toISOString();\n\n/**\n * A device showing a link code, found by the code (normalized) or, from its QR, by its id;\n * only `userId`'s own device, still within its 15 minutes.\n */\nexport async function findPendingDevice(\n database: DataProvider,\n userId: UserId,\n by: { readonly code: string } | { readonly device: string },\n): Promise<PendingDevice | undefined> {\n const match =\n \"code\" in by\n ? sql`link_code = ${normalizeLinkCode(by.code)}`\n : sql`id = ${by.device} and link_code is not null`;\n const [row] = rowsOf<DeviceRow>(\n await (database.read() as Database).execute(sql`\n select id, user_id, name, platform, signing_key, presence_key, vouches, 0 as created_ms\n from parlor_auth_devices\n where user_id = ${userId} and ${match}\n and link_expires_at > ${new Date().toISOString()} and revoked_at is null`),\n );\n if (!row) return undefined;\n const presence = parsed(row.presence_key);\n return {\n id: asId(\"device\", row.id),\n name: row.name,\n platform: row.platform,\n signingKey: jwkOf(row.signing_key),\n ...(presence ? { presenceKey: presence } : {}),\n };\n}\n\nexport function deviceAccountActions(deps: DeviceActionDeps) {\n return createRegistry({\n devices: defineAction({\n description: \"List the devices that sign this account's chat messages.\",\n input: z.object({}),\n reads: [DEVICES_TAG],\n run: async (_input, ctx): Promise<ConnectedDevice[]> => {\n const user = signedIn(ctx);\n const rows = rowsOf<DeviceListRow>(\n await (databaseOf(deps.host).read() as Database).execute(sql`\n select id, name, platform, created_at, jsonb_array_length(vouches) > 0 as vouched,\n coalesce(link_expires_at > ${new Date().toISOString()}, false) as linking,\n vouches -> -1 ->> 'voucher' as linked_by\n from parlor_auth_devices\n where user_id = ${user.userId} and revoked_at is null order by created_at, id`),\n );\n return rows.map((row) => ({\n id: asId(\"device\", row.id),\n name: row.name,\n platform: row.platform,\n current: row.id === user.deviceId,\n createdAt: isoOf(row.created_at),\n vouched: row.vouched,\n linking: row.linking,\n ...(row.linked_by ? { linkedBy: row.linked_by } : {}),\n }));\n },\n }),\n deviceChallenge: defineAction({\n description: \"A single-use challenge for enrolling this device.\",\n input: z.object({}),\n run: async (_input, ctx): Promise<{ readonly challenge: string }> => {\n const user = signedIn(ctx);\n await requireChat(deps.host, ctx);\n const challenge = randomBytes(32).toString(\"base64url\");\n await databaseOf(deps.host).transaction(async (handle) => {\n const tx = handle as Database;\n await tx.execute(\n sql`delete from parlor_auth_device_challenges where expires_at < ${new Date().toISOString()}`,\n );\n await tx.execute(sql`\n insert into parlor_auth_device_challenges (challenge, user_id, expires_at)\n values (${challenge}, ${user.userId},\n ${new Date(Date.now() + CHALLENGE_TTL_MS).toISOString()})`);\n });\n return { challenge };\n },\n }),\n enrollDevice: defineAction({\n description: \"Register this device's public keys, proven by signing a challenge.\",\n input: z.object({\n name: z.string().min(1).max(80),\n platform: z.string().min(1).max(32),\n challenge: z.string().min(1).max(256),\n signing: z.object({ keyId: z.string().min(1), publicKey: jwk }),\n presence: presenceInput.optional(),\n proof: deviceSignature,\n }),\n run: async (input, ctx): Promise<{ readonly id: DeviceId }> => {\n const user = signedIn(ctx);\n await requireChat(deps.host, ctx);\n const signing = await pointOf(input.signing.publicKey);\n const presence = await presenceOf(input.presence);\n const { proof } = input;\n let proven = false;\n try {\n proven =\n proof.format === \"es256-raw\" &&\n proof.presence === \"none\" &&\n (await verifyEs256(\n signing,\n decodeBase64url(proof.signature),\n enrollmentBytes({\n challenge: decodeBase64url(input.challenge),\n signing,\n presence: presence?.proven,\n }),\n ));\n } catch {\n proven = false;\n }\n if (!proven) throw invalid(\"The device could not prove it holds its keys.\");\n const enrolled = await databaseOf(deps.host).transaction(async (handle) => {\n const tx = handle as Database;\n const consumed = rowsOf<{ readonly challenge: string }>(\n await tx.execute(sql`\n delete from parlor_auth_device_challenges\n where challenge = ${input.challenge} and user_id = ${user.userId}\n and expires_at >= ${new Date().toISOString()}\n returning challenge`),\n );\n if (consumed.length === 0)\n throw invalid(\"This challenge is unknown or expired.\");\n const id = asId(\"device\", randomBytes(16).toString(\"base64url\"));\n const [inserted] = rowsOf<{ readonly id: string }>(\n await tx.execute(sql`\n insert into parlor_auth_devices (id, user_id, name, platform, signing_key, presence_key)\n values (${id}, ${user.userId}, ${input.name}, ${input.platform},\n ${JSON.stringify(signing)}::jsonb,\n ${presence ? JSON.stringify(presence.stored) : null}::jsonb)\n on conflict (user_id, (signing_key->>'x'), (signing_key->>'y'))\n where revoked_at is null do nothing\n returning id`),\n );\n if (!inserted) {\n const [existing] = rowsOf<{ readonly id: string }>(\n await tx.execute(sql`\n select id from parlor_auth_devices\n where user_id = ${user.userId} and revoked_at is null\n and signing_key->>'x' = ${signing.x!} and signing_key->>'y' = ${signing.y!}`),\n );\n return { id: asId(\"device\", existing!.id), added: false };\n }\n return { id, added: true };\n });\n if (enrolled.added) {\n await deps.host.announce(ctx.scope, [[DEVICES_TAG, enrolled.id]]);\n }\n return { id: enrolled.id };\n },\n }),\n startDeviceLink: defineAction({\n description:\n \"Show this device's link code for 15 minutes, so a linked device can find it.\",\n input: z.object({ device: z.string().min(1), code: linkCodeInput }),\n run: async ({ device, code }, ctx): Promise<{ readonly expiresAt: string }> => {\n const user = signedIn(ctx);\n await requireChat(deps.host, ctx);\n const expiresAt = new Date(Date.now() + LINK_TTL_MS).toISOString();\n const started = rowsOf<{ readonly id: string }>(\n await databaseOf(deps.host).transaction((handle) =>\n (handle as Database).execute(sql`\n update parlor_auth_devices set link_code = ${code}, link_expires_at = ${expiresAt}\n where id = ${device} and user_id = ${user.userId} and revoked_at is null\n returning id`),\n ),\n );\n if (started.length === 0)\n throw new ActionError(\"not_found\", `No device ${device}`);\n return { expiresAt };\n },\n }),\n resolveDeviceLink: defineAction({\n description:\n \"Find this account's device showing a link code, to check it and vouch for it.\",\n input: z.union([\n z.object({ code: linkCodeInput }),\n z.object({ device: z.string().min(1).max(64) }),\n ]),\n run: async (input, ctx): Promise<PendingDevice> => {\n const user = signedIn(ctx);\n await requireChat(deps.host, ctx);\n const found = await findPendingDevice(databaseOf(deps.host), user.userId, input);\n if (!found) {\n throw new ActionError(\n \"not_found\",\n \"No device of yours shows this code. Check it, or show a new code on the device.\",\n );\n }\n return found;\n },\n }),\n vouchDevice: defineAction({\n description:\n \"Vouch, with this device's presence key, that a device showing a link code is the user's.\",\n input: z.object({\n device: z.string().min(1),\n voucher: z.string().min(1),\n app: z.string().url(),\n commitment: z.string().regex(/^[A-Za-z0-9_-]{43}$/),\n at: z.number(),\n signature: deviceSignature,\n }),\n run: async (input, ctx): Promise<{ readonly id: string }> => {\n const user = signedIn(ctx);\n await requireChat(deps.host, ctx);\n const voucher = await deps.registry.get(\n user.userId,\n asId(\"device\", input.voucher),\n );\n if (!voucher?.presenceKey) {\n throw new ActionError(\n \"forbidden\",\n \"Only a linked device that can confirm it is you can link another device.\",\n );\n }\n const outcome = await verifyStatement(\n {\n statement: vouchStatement(\n input.app,\n input.voucher,\n input.device,\n input.commitment,\n input.at,\n ),\n deviceId: voucher.id,\n signature: input.signature as never,\n },\n {\n deviceId: voucher.id,\n signingKey: voucher.signingKey,\n presenceKey: voucher.presenceKey,\n },\n { requirePresence: true, now: Date.now(), maxAgeMs: VOUCH_MAX_AGE_MS },\n );\n if (outcome !== \"valid\") throw invalid(\"This confirmation did not check out.\");\n const vouch: DeviceVouch = {\n voucher: voucher.id,\n commitment: input.commitment,\n at: input.at,\n signature: input.signature,\n };\n const vouched = rowsOf<{ readonly id: string }>(\n await databaseOf(deps.host).transaction((handle) =>\n (handle as Database).execute(sql`\n update parlor_auth_devices\n set vouches = vouches || ${JSON.stringify([vouch])}::jsonb,\n link_code = null, link_expires_at = null\n where id = ${input.device} and user_id = ${user.userId} and revoked_at is null\n and link_code is not null and link_expires_at > ${new Date().toISOString()}\n returning id`),\n ),\n );\n if (vouched.length === 0) {\n throw new ActionError(\n \"not_found\",\n \"That device's code expired. Show a new code on it and try again.\",\n );\n }\n await deps.host.announce(ctx.scope, [[DEVICES_TAG, input.device]]);\n return { id: input.device };\n },\n }),\n removeDevice: defineAction({\n description:\n \"Remove a device, confirmed with this device's presence key; no computer accepts its signatures afterwards.\",\n input: z.object({\n device: z.string().min(1),\n actor: z.string().min(1),\n app: z.string().url(),\n at: z.number(),\n signature: deviceSignature,\n }),\n run: async (input, ctx): Promise<{ readonly id: string }> => {\n const user = signedIn(ctx);\n const actor = await deps.registry.get(user.userId, asId(\"device\", input.actor));\n if (!actor?.presenceKey) {\n throw new ActionError(\n \"forbidden\",\n \"Only a linked device that can confirm it is you can remove a device.\",\n );\n }\n const outcome = await verifyStatement(\n {\n statement: removeStatement(input.app, input.actor, input.device, input.at),\n deviceId: actor.id,\n signature: input.signature as never,\n },\n {\n deviceId: actor.id,\n signingKey: actor.signingKey,\n presenceKey: actor.presenceKey,\n },\n { requirePresence: true, now: Date.now(), maxAgeMs: VOUCH_MAX_AGE_MS },\n );\n if (outcome !== \"valid\") throw invalid(\"This confirmation did not check out.\");\n const removed = rowsOf<{ readonly id: string }>(\n await databaseOf(deps.host).transaction((handle) =>\n (handle as Database).execute(sql`\n update parlor_auth_devices set revoked_at = now(), link_code = null\n where id = ${input.device} and user_id = ${user.userId} and revoked_at is null\n returning id`),\n ),\n );\n if (removed.length === 0) {\n throw new ActionError(\"not_found\", `No device ${input.device}`);\n }\n await deps.host.announce(ctx.scope, [[DEVICES_TAG, input.device]]);\n return { id: input.device };\n },\n }),\n revokeDevice: defineAction({\n description:\n \"Deprecated: use removeDevice, which a linked device confirms. Remove a device; no computer accepts its signatures afterwards.\",\n input: z.object({ id: z.string().min(1) }),\n run: async ({ id }, ctx): Promise<{ readonly id: string }> => {\n const user = signedIn(ctx);\n const revoked = rowsOf<{ readonly id: string }>(\n await databaseOf(deps.host).transaction((handle) =>\n (handle as Database).execute(sql`\n update parlor_auth_devices set revoked_at = now()\n where id = ${id} and user_id = ${user.userId} and revoked_at is null\n returning id`),\n ),\n );\n if (revoked.length === 0) throw new ActionError(\"not_found\", `No device ${id}`);\n await deps.host.announce(ctx.scope, [[DEVICES_TAG, id]]);\n return { id };\n },\n }),\n });\n}\n\nexport type DeviceAccountActions = ActionsOf<ReturnType<typeof deviceAccountActions>>;\n"]}
package/dist/es256.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"es256.js","sourceRoot":"","sources":["../src/es256.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAW,CAAC;AAC7D,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAC1D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,GAAe;IACtC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACrC,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QACtB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,EAAE,IAAI,IAAI,CAAC;QACX,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;YAAE,OAAO,SAAS,CAAC;QAClF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAClD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAqB,EACrB,SAAqB,EACrB,IAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CACzB,KAAK,EACL,GAAG,EACH,IAAI,UAAU,CAAC,SAAS,CAAC,EACzB,IAAI,UAAU,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"es256.js","sourceRoot":"","sources":["../src/es256.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAW,CAAC;AAC7D,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAC1D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,GAAe;IACtC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACrC,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QACtB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,EAAE,IAAI,IAAI,CAAC;QACX,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,iBAAiB;YAAE,OAAO,SAAS,CAAC;QAClF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAClD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAqB,EACrB,SAAqB,EACrB,IAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CACzB,KAAK,EACL,GAAG,EACH,IAAI,UAAU,CAAC,SAAS,CAAC,EACzB,IAAI,UAAU,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC","sourcesContent":["const P256 = { name: \"ECDSA\", namedCurve: \"P-256\" } as const;\nconst ES256 = { name: \"ECDSA\", hash: \"SHA-256\" } as const;\nconst P256_SCALAR_BYTES = 32;\n\n/** WebAuthn signs in ASN.1 DER; WebCrypto verifies the raw `r || s`. */\nexport function derToRaw(der: Uint8Array): Uint8Array | undefined {\n let at = 0;\n const expect = (tag: number) => der[at++] === tag;\n const length = () => {\n const first = der[at++];\n if (first === undefined || first < 0x80) return first;\n if (first !== 0x81) return undefined;\n return der[at++];\n };\n const integer = () => {\n if (!expect(0x02)) return undefined;\n const size = length();\n if (size === undefined) return undefined;\n const bytes = der.slice(at, at + size);\n at += size;\n const trimmed = bytes.slice(bytes.findIndex((byte) => byte !== 0));\n if (bytes.length !== size || trimmed.length > P256_SCALAR_BYTES) return undefined;\n return trimmed;\n };\n if (!expect(0x30) || length() !== der.length - at) return undefined;\n const r = integer();\n const s = integer();\n if (!r || !s || at !== der.length) return undefined;\n const raw = new Uint8Array(2 * P256_SCALAR_BYTES);\n raw.set(r, P256_SCALAR_BYTES - r.length);\n raw.set(s, 2 * P256_SCALAR_BYTES - s.length);\n return raw;\n}\n\nexport async function verifyEs256(\n publicKey: JsonWebKey,\n signature: Uint8Array,\n data: Uint8Array,\n): Promise<boolean> {\n const key = await crypto.subtle.importKey(\"jwk\", publicKey, P256, false, [\"verify\"]);\n return crypto.subtle.verify(\n ES256,\n key,\n new Uint8Array(signature),\n new Uint8Array(data),\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"grants.js","sourceRoot":"","sources":["../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,cAAc,CAAC;AAElD,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAAgB;IACxD,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"grants.js","sourceRoot":"","sources":["../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,cAAc,CAAC;AAElD,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAAgB;IACxD,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import { asId, type GrantId } from \"@parlor/core\";\n\n/** One grant per user and OAuth client; re-authorizing after a revocation mints newer tokens. */\nexport function grantIdOf(userId: string, clientId: string): GrantId {\n return asId(\"grant\", `oauth:${userId}:${clientId}`);\n}\n"]}
package/dist/hosts.d.ts CHANGED
@@ -16,6 +16,8 @@ export interface HostAuthorizeRequest {
16
16
  readonly matchingCode: string;
17
17
  /** RFC 7638 thumbprint of the key the code exchange must be signed with. */
18
18
  readonly keyThumbprint: string;
19
+ /** The host can also hand the app to the coding agents on the computer, outside the sidebar. */
20
+ readonly agentTools?: "offered" | undefined;
19
21
  }
20
22
  /** `POST /hosts/token` */
21
23
  export interface HostKeyExchange {
@@ -40,6 +42,8 @@ export interface HostGrantResponse {
40
42
  /** The host shows it locally before it keeps the grant. */
41
43
  readonly account: AccountSummary;
42
44
  readonly approvedBy?: ApprovingDevice | undefined;
45
+ /** The app's page, on its origin, that the host sends the approving browser to with the pairing secret. */
46
+ readonly landing?: string | undefined;
43
47
  }
44
48
  export declare const HOST_ASSERTION_TTL_MS = 60000;
45
49
  /** `authorization: ParlorHost <jws>`, DPoP style: bound to one method and URL, dead in a minute. */
@@ -109,7 +113,8 @@ export declare function hostAccountActions(deps: HostGrantDeps): import("@parlor
109
113
  export type HostAccountActions = ActionsOf<ReturnType<typeof hostAccountActions>>;
110
114
  /**
111
115
  * `GET|POST /hosts/authorize` is the framework-owned consent page and its answer, `POST
112
- * /hosts/token` the PKCE exchange binding the host's key, `POST /hosts/revoke` the host
116
+ * /hosts/token` the PKCE exchange binding the host's key, `GET /hosts/connected` where the
117
+ * approving browser lands and keeps the pairing secret, `POST /hosts/revoke` the host
113
118
  * disconnecting itself.
114
119
  */
115
120
  export declare function hostRoutes(deps: HostGrantDeps): readonly AnyPluginRoute[];
@@ -1 +1 @@
1
- {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
package/dist/hosts.js CHANGED
@@ -5,12 +5,13 @@ import { AuthFailure, HOST_GRANTS_TAG, pluginRoute, readBoundedText, SHELL_ORIGI
5
5
  import { sql } from "drizzle-orm";
6
6
  import { calculateJwkThumbprint, compactVerify, decodeProtectedHeader } from "jose";
7
7
  import { z } from "zod";
8
- import { signedIn } from "./account.js";
8
+ import { CHAT_REFUSED, chatAllows, signedIn } from "./account.js";
9
9
  import { AUTH_PLUGIN, devOrigins } from "./better-auth.js";
10
10
  import { jwkOf, rowsOf } from "./database.js";
11
11
  import { findPendingDevice } from "./devices.js";
12
12
  import { escape, failure, page } from "./pages.js";
13
13
  import { RevocationSet } from "./revocation.js";
14
+ import { HOST_PAIRING_FRAGMENT, HOST_PAIRING_KEY } from "./statements.js";
14
15
  import { HOST_ASSERTION_TYP, HOST_AUDIENCE } from "./tokens.js";
15
16
  export const HOST_CLIENT_ID = "parlor-host";
16
17
  export const MATCHING_CODE = /^[A-Z2-9]{3}-[A-Z2-9]{3}$/;
@@ -309,9 +310,11 @@ const authorizeRequest = z.object({
309
310
  .refine(isPrintable, "Use printable characters."),
310
311
  matchingCode: z.string().regex(MATCHING_CODE),
311
312
  keyThumbprint: z.string().regex(THUMBPRINT),
313
+ agentTools: z.literal("offered").optional(),
312
314
  });
313
315
  const authorizeAnswer = authorizeRequest.extend({
314
316
  decision: z.enum(["connect", "cancel"]),
317
+ useAgentTools: z.literal("on").optional(),
315
318
  });
316
319
  const publicKeySchema = z.looseObject({
317
320
  kty: z.literal("EC"),
@@ -365,15 +368,20 @@ async function verifyProof(publicKey, code, proof) {
365
368
  return false;
366
369
  }
367
370
  }
371
+ /** The MCP server name the host registered the app under, as the connected page shows it. */
372
+ const AGENT_TOOLS_NAME = /^[a-z0-9][a-z0-9_-]{0,79}$/;
373
+ const 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)`;
368
374
  /**
369
375
  * `GET|POST /hosts/authorize` is the framework-owned consent page and its answer, `POST
370
- * /hosts/token` the PKCE exchange binding the host's key, `POST /hosts/revoke` the host
376
+ * /hosts/token` the PKCE exchange binding the host's key, `GET /hosts/connected` where the
377
+ * approving browser lands and keeps the pairing secret, `POST /hosts/revoke` the host
371
378
  * disconnecting itself.
372
379
  */
373
380
  export function hostRoutes(deps) {
374
381
  const { host, settings } = deps;
375
382
  const appName = () => process.env.PARLOR_APP_NAME ?? settings.appName ?? new URL(settings.origin).host;
376
383
  const authorizeUrl = `${host.basePath}/${AUTH_PLUGIN}/hosts/authorize`;
384
+ const connectedUrl = `${host.basePath}/${AUTH_PLUGIN}/hosts/connected`;
377
385
  const accountOf = async (userId) => host.auth?.account?.(userId);
378
386
  return [
379
387
  pluginRoute({
@@ -381,6 +389,8 @@ export function hostRoutes(deps) {
381
389
  path: "/hosts/authorize",
382
390
  access: ["user"],
383
391
  handle: async (request, caller) => {
392
+ if (!(await chatAllows(host, caller)))
393
+ return failure(CHAT_REFUSED, 403);
384
394
  const parsed = authorizeRequest.safeParse(Object.fromEntries(new URL(request.url).searchParams));
385
395
  if (!parsed.success) {
386
396
  return failure("This connection request is incomplete.", 400);
@@ -397,6 +407,9 @@ export function hostRoutes(deps) {
397
407
  <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>
398
408
  <form method="post" action="${escape(authorizeUrl)}">
399
409
  ${hidden}
410
+ ${pairing.agentTools === "offered"
411
+ ? `<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>`
412
+ : ""}
400
413
  <button type="submit" name="decision" value="cancel">Cancel</button>
401
414
  <button type="submit" name="decision" value="connect">Connect</button>
402
415
  </form>`;
@@ -420,11 +433,14 @@ ${hidden}
420
433
  !(origin && [...SHELL_ORIGINS, ...devOrigins()].includes(origin))) {
421
434
  return refuse(403, "forbidden", "This answer did not come from the consent page.");
422
435
  }
436
+ if (!(await chatAllows(host, caller))) {
437
+ return refuse(403, "forbidden", CHAT_REFUSED);
438
+ }
423
439
  const parsed = authorizeAnswer.safeParse(fields);
424
440
  if (!parsed.success) {
425
441
  return refuse(400, "invalid_input", "This connection request is incomplete.");
426
442
  }
427
- const { decision, ...pairing } = parsed.data;
443
+ const { decision, useAgentTools, ...pairing } = parsed.data;
428
444
  const target = pairing.redirectUri === IPC_REDIRECT ? undefined : new URL(pairing.redirectUri);
429
445
  if (decision === "cancel") {
430
446
  if (!target)
@@ -444,10 +460,18 @@ ${hidden}
444
460
  ${pairing.keyThumbprint}, ${pairing.redirectUri}, ${pairing.hostName}, ${pairing.platform},
445
461
  ${new Date(Date.now() + CODE_TTL_MS).toISOString()})`);
446
462
  });
447
- if (!target)
448
- return Response.json({ code, state: pairing.state });
463
+ const agentTools = pairing.agentTools === "offered" ? useAgentTools === "on" : undefined;
464
+ if (!target) {
465
+ return Response.json({
466
+ code,
467
+ state: pairing.state,
468
+ ...(agentTools === undefined ? {} : { agentTools }),
469
+ });
470
+ }
449
471
  target.searchParams.set("code", code);
450
472
  target.searchParams.set("state", pairing.state);
473
+ if (agentTools !== undefined)
474
+ target.searchParams.set("agentTools", agentTools ? "on" : "off");
451
475
  return new Response(null, { status: 303, headers: { location: target.href } });
452
476
  },
453
477
  }),
@@ -488,15 +512,39 @@ ${hidden}
488
512
  const response = {
489
513
  grant: { id: grantId, hostId },
490
514
  account: { userId, name: profile?.name ?? "", email: profile?.email },
515
+ landing: connectedUrl,
491
516
  };
492
517
  return Response.json(response);
493
518
  },
494
519
  },
520
+ {
521
+ method: "GET",
522
+ path: "/hosts/connected",
523
+ access: "public",
524
+ handle: async (request) => {
525
+ const app = escape(appName());
526
+ const tools = new URL(request.url).searchParams.get("agentTools");
527
+ const body = tools && AGENT_TOOLS_NAME.test(tools)
528
+ ? `<h1>Connected to ${app}</h1>
529
+ <p>Use it two ways:</p>
530
+ <ul>
531
+ <li>In the agent sidebar of ${app}.</li>
532
+ <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>
533
+ </ul>
534
+ <p>You can close this tab.</p>`
535
+ : `<h1>Connected to ${app}</h1>
536
+ <p>The coding agents on your computer are ready in the agent sidebar of ${app}. You can close this tab.</p>`;
537
+ return page("Computer connected", body, ["'none'"], KEEP_PAIRING);
538
+ },
539
+ },
495
540
  pluginRoute({
496
541
  method: "POST",
497
542
  path: "/hosts/devices/link",
498
543
  access: ["host"],
499
544
  handle: async (request, caller) => {
545
+ if (!(await chatAllows(host, caller))) {
546
+ return Response.json({ error: { code: "forbidden", message: CHAT_REFUSED } }, { status: 403 });
547
+ }
500
548
  const { fields } = await bodyOf(request);
501
549
  const code = z.object({ code: z.string().max(32) }).safeParse(fields).data?.code ?? "";
502
550
  const found = await findPendingDevice(databaseOf(host), caller.principal.userId, {