@parlor/auth 0.0.0-stage → 0.1.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -2
  3. package/dist/account.d.ts +52 -0
  4. package/dist/account.d.ts.map +1 -0
  5. package/dist/account.js +114 -0
  6. package/dist/account.js.map +1 -0
  7. package/dist/audit.d.ts +10 -0
  8. package/dist/audit.d.ts.map +1 -0
  9. package/dist/audit.js +130 -0
  10. package/dist/audit.js.map +1 -0
  11. package/dist/better-auth.d.ts +41 -0
  12. package/dist/better-auth.d.ts.map +1 -0
  13. package/dist/better-auth.js +118 -0
  14. package/dist/better-auth.js.map +1 -0
  15. package/dist/client/index.d.ts +43 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +465 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/database.d.ts +7 -0
  20. package/dist/database.d.ts.map +1 -0
  21. package/dist/database.js +11 -0
  22. package/dist/database.js.map +1 -0
  23. package/dist/devices.d.ts +157 -0
  24. package/dist/devices.d.ts.map +1 -0
  25. package/dist/devices.js +398 -0
  26. package/dist/devices.js.map +1 -0
  27. package/dist/es256.d.ts +4 -0
  28. package/dist/es256.d.ts.map +1 -0
  29. package/dist/es256.js +44 -0
  30. package/dist/es256.js.map +1 -0
  31. package/dist/grants.d.ts +4 -0
  32. package/dist/grants.d.ts.map +1 -0
  33. package/dist/grants.js +6 -0
  34. package/dist/grants.js.map +1 -0
  35. package/dist/hosts.d.ts +116 -0
  36. package/dist/hosts.d.ts.map +1 -0
  37. package/dist/hosts.js +530 -0
  38. package/dist/hosts.js.map +1 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +9 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/migrations.d.ts +3 -0
  44. package/dist/migrations.d.ts.map +1 -0
  45. package/dist/migrations.js +17 -0
  46. package/dist/migrations.js.map +1 -0
  47. package/dist/pages.d.ts +4 -0
  48. package/dist/pages.d.ts.map +1 -0
  49. package/dist/pages.js +53 -0
  50. package/dist/pages.js.map +1 -0
  51. package/dist/provider.d.ts +74 -0
  52. package/dist/provider.d.ts.map +1 -0
  53. package/dist/provider.js +286 -0
  54. package/dist/provider.js.map +1 -0
  55. package/dist/revocation.d.ts +51 -0
  56. package/dist/revocation.d.ts.map +1 -0
  57. package/dist/revocation.js +233 -0
  58. package/dist/revocation.js.map +1 -0
  59. package/dist/routes.d.ts +15 -0
  60. package/dist/routes.d.ts.map +1 -0
  61. package/dist/routes.js +116 -0
  62. package/dist/routes.js.map +1 -0
  63. package/dist/schema.d.ts +2970 -0
  64. package/dist/schema.d.ts.map +1 -0
  65. package/dist/schema.js +308 -0
  66. package/dist/schema.js.map +1 -0
  67. package/dist/statements.d.ts +92 -0
  68. package/dist/statements.d.ts.map +1 -0
  69. package/dist/statements.js +199 -0
  70. package/dist/statements.js.map +1 -0
  71. package/dist/tokens.d.ts +69 -0
  72. package/dist/tokens.d.ts.map +1 -0
  73. package/dist/tokens.js +134 -0
  74. package/dist/tokens.js.map +1 -0
  75. package/dist/turn-keys.d.ts +16 -0
  76. package/dist/turn-keys.d.ts.map +1 -0
  77. package/dist/turn-keys.js +108 -0
  78. package/dist/turn-keys.js.map +1 -0
  79. package/package.json +57 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statements.js","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0EnD,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAClC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAQ/B,MAAM,MAAM,GAAG,KAAK,EAAE,KAAiB,EAAuB,EAAE,CAC9D,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE/E,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAiB,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,MAAoB,EACpB,EAAU;IAEV,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG;QACH,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;QACvD,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,EAAE;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,MAAoB,EACpB,EAAU;IAEV,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG;QACH,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EACJ,MAAM,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,MAAM,QAAQ,CACZ,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CACjE;QACP,EAAE;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAA0B;IAE1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO;QACL,SAAS,EAAE,MAAM,eAAe,CAC9B,GAAG,EACH,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAC7D,MAAM,CAAC,EAAE,CACV;QACD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB;IACjD,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,QAAgB,EAChB,UAAsB,EACtB,WAAmC;IAEnC,MAAM,KAAK,GAAG,CAAC,GAAe,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACxF,OAAO,QAAQ,CACb,cAAc,CAAC;QACb,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM;QACxB,QAAQ;QACR,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC;QAC1B,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;KAClD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,UAAkB;IACzC,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;QAAE,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;IACvF,IAAI,KAAK,EAAE,CAAC;IACZ,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAE,GAAG,IAAI,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,OAAe,EACf,MAAc,EACd,UAAkB,EAClB,EAAU;IAEV,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM;QACxB,OAAO;QACP,MAAM;QACN,UAAU;QACV,EAAE;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,KAAa,EACb,MAAc,EACd,EAAU;IAEV,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,wGAAwG;AACxG,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE3D,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CACrB,KAAK,EACL,IAAI,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;AAEJ,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,UAAsB,EAAE,EAAE,CAChE,cAAc,CAAC;IACb,CAAC,EAAE,CAAC;IACJ,IAAI,EAAE,SAAS;IACf,QAAQ;IACR,UAAU,EAAE;QACV,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,CAAC,EAAE,UAAU,CAAC,CAAC;KAChB;CACF,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,QAAgB,EAChB,UAAsB;IAEtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAClC,MAAM,EACN,MAAM,UAAU,CAAC,MAAM,CAAC,EACxB,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CACnD,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,UAAsB;IAEtB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAC/B,MAAM,EACN,MAAM,UAAU,CAAC,MAAM,CAAC,EACxB,IAAI,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EACtC,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AASD,KAAK,UAAU,cAAc,CAC3B,SAAoB,EACpB,SAA0B,EAC1B,WAAwC;IAExC,IAAI,WAAW,EAAE,MAAM,KAAK,UAAU,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACtF,IACE,SAAS,CAAC,iBAAiB,KAAK,SAAS;QACzC,SAAS,CAAC,cAAc,KAAK,SAAS,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACvE,MAAM,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAe,CAAC;IACvF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,IACE,UAAU,CAAC,IAAI,KAAK,cAAc;QAClC,UAAU,CAAC,SAAS,KAAK,SAAS;QAClC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG;QACnC,UAAU,CAAC,WAAW,KAAK,IAAI,EAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,mBAAmB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACvF,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,SAAoB,EACpB,SAA0B,EAC1B,MAAoB;IAEpB,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC/B,OAAO,WAAW,EAAE,MAAM,KAAK,WAAW;QACxC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;QAChD,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAyB,EACzB,MAAoB,EACpB,OAAsB;IAEtB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC;IAClE,IAAI,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,cAAc;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,OAAO,CAAC,eAAe,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7D,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { type AgentPrincipal, type HostPrincipal, type TurnBinding } from "@parlor/core";
2
+ import { type Delegation, type TurnDelegation } from "@parlor/server";
3
+ /** A host assertion's audience: signed by the computer's own key, per request. */
4
+ export declare const HOST_AUDIENCE = "parlor:host";
5
+ /** A turn token's audience: signed by the server, carried by the host's MCP proxy. */
6
+ export declare const TURN_AUDIENCE = "parlor:mcp";
7
+ export declare const HOST_ASSERTION_TYP = "parlor-host+jwt";
8
+ export declare const TURN_TOKEN_TYP = "parlor-turn+jwt";
9
+ /**
10
+ * A turn token never outlives the revocation horizon, or a revoked grant's token could
11
+ * verify after `RevocationSet` forgot the revocation.
12
+ */
13
+ export declare const MAX_TURN_TOKEN_TTL_MS: number;
14
+ export type TokenAudience = typeof HOST_AUDIENCE | typeof TURN_AUDIENCE;
15
+ declare const audience: unique symbol;
16
+ /** A compact JWS whose audience is known from the scheme it arrived under; never swapped. */
17
+ export type Jws<A extends TokenAudience> = string & {
18
+ readonly [audience]: A;
19
+ };
20
+ export type HostAssertion = Jws<typeof HOST_AUDIENCE>;
21
+ export type TurnToken = Jws<typeof TURN_AUDIENCE>;
22
+ /** What an `authorization` header carries, sorted by scheme and shape before any verification. */
23
+ export type Credential = {
24
+ readonly kind: "host";
25
+ readonly assertion: HostAssertion;
26
+ } | {
27
+ readonly kind: "turn";
28
+ readonly token: TurnToken;
29
+ } | {
30
+ readonly kind: "access";
31
+ readonly token: string;
32
+ } | {
33
+ readonly kind: "session";
34
+ readonly token: string;
35
+ };
36
+ export interface TurnTokenClaims {
37
+ readonly aud: typeof TURN_AUDIENCE;
38
+ readonly iss: string;
39
+ /** user id */
40
+ readonly sub: string;
41
+ /** grant id: revoking the grant kills the token */
42
+ readonly gid: string;
43
+ readonly hid: string;
44
+ readonly thr: string;
45
+ readonly trn: string;
46
+ /** the client the prompt came from; `ui_*` binds to it */
47
+ readonly cid: string;
48
+ readonly agt: string;
49
+ readonly iat: number;
50
+ /** as long as the turn's lease */
51
+ readonly exp: number;
52
+ }
53
+ export interface TurnTokenKeys {
54
+ readonly issuer: string;
55
+ readonly kid: string;
56
+ readonly privateKey: CryptoKey;
57
+ readonly publicKeys: ReadonlyMap<string, CryptoKey>;
58
+ }
59
+ /** `ParlorHost <jws>` is a host; a `Bearer` JWS whose header says `typ: parlor-turn+jwt` is a turn. */
60
+ export declare function credentialOf(authorization: string | null): Credential | undefined;
61
+ /** Mints a turn token for `host`'s grant; the provider's `delegate`. */
62
+ export declare function delegate(keys: TurnTokenKeys, host: HostPrincipal, turn: TurnDelegation, now: number): Promise<Delegation>;
63
+ /** Signature, `aud`, `iss` and `exp` only; the caller then asks `RevocationSet` about `gid`. */
64
+ export declare function verifyTurnToken(keys: TurnTokenKeys, token: TurnToken, now: number): Promise<TurnTokenClaims>;
65
+ export declare function agentPrincipalOf(claims: TurnTokenClaims): AgentPrincipal & {
66
+ readonly turn: TurnBinding;
67
+ };
68
+ export {};
69
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,UAAU,EAEf,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAIxB,kFAAkF;AAClF,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAC3C,sFAAsF;AACtF,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAIhD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAwC,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,GAAG,OAAO,aAAa,CAAC;AAExE,OAAO,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,CAAC;AAEtC,6FAA6F;AAC7F,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,aAAa,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC;AAElD,kGAAkG;AAClG,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,OAAO,aAAa,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrD;AAgBD,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAkBjF;AAED,wEAAwE;AACxE,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAgBD,gGAAgG;AAChG,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,GACtB,cAAc,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAajD"}
package/dist/tokens.js ADDED
@@ -0,0 +1,134 @@
1
+ import { asId, } from "@parlor/core";
2
+ import { AuthFailure, REVOCATION_HORIZON_MS, } from "@parlor/server";
3
+ import { decodeProtectedHeader, errors, jwtVerify, SignJWT } from "jose";
4
+ import { z } from "zod";
5
+ /** A host assertion's audience: signed by the computer's own key, per request. */
6
+ export const HOST_AUDIENCE = "parlor:host";
7
+ /** A turn token's audience: signed by the server, carried by the host's MCP proxy. */
8
+ export const TURN_AUDIENCE = "parlor:mcp";
9
+ export const HOST_ASSERTION_TYP = "parlor-host+jwt";
10
+ export const TURN_TOKEN_TYP = "parlor-turn+jwt";
11
+ const CLOCK_SKEW_MS = 60_000;
12
+ /**
13
+ * A turn token never outlives the revocation horizon, or a revoked grant's token could
14
+ * verify after `RevocationSet` forgot the revocation.
15
+ */
16
+ export const MAX_TURN_TOKEN_TTL_MS = REVOCATION_HORIZON_MS - CLOCK_SKEW_MS;
17
+ const JWS_SHAPE = /^[\w-]+\.[\w-]+\.[\w-]+$/;
18
+ function brand(compact) {
19
+ return compact;
20
+ }
21
+ function typOf(jws) {
22
+ try {
23
+ return decodeProtectedHeader(jws).typ;
24
+ }
25
+ catch {
26
+ throw new AuthFailure("invalid", "The token is malformed.");
27
+ }
28
+ }
29
+ /** `ParlorHost <jws>` is a host; a `Bearer` JWS whose header says `typ: parlor-turn+jwt` is a turn. */
30
+ export function credentialOf(authorization) {
31
+ if (authorization === null)
32
+ return undefined;
33
+ const match = /^([A-Za-z]+)\s+(\S+)$/.exec(authorization);
34
+ const scheme = match?.[1]?.toLowerCase();
35
+ const value = match?.[2];
36
+ if (value === undefined || (scheme !== "bearer" && scheme !== "parlorhost")) {
37
+ throw new AuthFailure("invalid", "Use a Bearer token.");
38
+ }
39
+ if (scheme === "parlorhost") {
40
+ if (!JWS_SHAPE.test(value)) {
41
+ throw new AuthFailure("invalid", "The host assertion is malformed.");
42
+ }
43
+ return { kind: "host", assertion: brand(value) };
44
+ }
45
+ if (!JWS_SHAPE.test(value))
46
+ return { kind: "session", token: value };
47
+ return typOf(value) === TURN_TOKEN_TYP
48
+ ? { kind: "turn", token: brand(value) }
49
+ : { kind: "access", token: value };
50
+ }
51
+ /** Mints a turn token for `host`'s grant; the provider's `delegate`. */
52
+ export async function delegate(keys, host, turn, now) {
53
+ if (!(turn.ttlMs > 0))
54
+ throw new RangeError("A turn token needs a positive lifetime.");
55
+ const iat = Math.floor(now / 1000);
56
+ const exp = iat + Math.ceil(Math.min(turn.ttlMs, MAX_TURN_TOKEN_TTL_MS) / 1000);
57
+ const claims = {
58
+ aud: TURN_AUDIENCE,
59
+ iss: keys.issuer,
60
+ sub: host.userId,
61
+ gid: host.grantId,
62
+ hid: host.hostId,
63
+ thr: turn.threadId,
64
+ trn: turn.turnId,
65
+ cid: turn.clientId,
66
+ agt: turn.agent,
67
+ iat,
68
+ exp,
69
+ };
70
+ const token = await new SignJWT({ ...claims })
71
+ .setProtectedHeader({ alg: "ES256", typ: TURN_TOKEN_TYP, kid: keys.kid })
72
+ .sign(keys.privateKey);
73
+ return { token, expiresAt: exp * 1000 };
74
+ }
75
+ const claimsSchema = z.object({
76
+ aud: z.literal(TURN_AUDIENCE),
77
+ iss: z.string().min(1),
78
+ sub: z.string().min(1),
79
+ gid: z.string().min(1),
80
+ hid: z.string().min(1),
81
+ thr: z.string().min(1),
82
+ trn: z.string().min(1),
83
+ cid: z.string(),
84
+ agt: z.string().min(1),
85
+ iat: z.number().int(),
86
+ exp: z.number().int(),
87
+ });
88
+ /** Signature, `aud`, `iss` and `exp` only; the caller then asks `RevocationSet` about `gid`. */
89
+ export async function verifyTurnToken(keys, token, now) {
90
+ let payload;
91
+ try {
92
+ ({ payload } = await jwtVerify(token, (header) => {
93
+ const key = header.kid === undefined ? undefined : keys.publicKeys.get(header.kid);
94
+ if (!key)
95
+ throw new errors.JWKSNoMatchingKey();
96
+ return key;
97
+ }, {
98
+ algorithms: ["ES256"],
99
+ typ: TURN_TOKEN_TYP,
100
+ issuer: keys.issuer,
101
+ audience: TURN_AUDIENCE,
102
+ currentDate: new Date(now),
103
+ }));
104
+ }
105
+ catch (error) {
106
+ if (error instanceof errors.JWTExpired) {
107
+ throw new AuthFailure("expired", "The turn token expired.");
108
+ }
109
+ throw new AuthFailure("invalid", "The turn token is invalid.");
110
+ }
111
+ const claims = claimsSchema.safeParse(payload);
112
+ if (!claims.success)
113
+ throw new AuthFailure("invalid", "The turn token is malformed.");
114
+ const { iat, exp } = claims.data;
115
+ if (exp - iat > MAX_TURN_TOKEN_TTL_MS / 1000 || iat * 1000 > now + CLOCK_SKEW_MS) {
116
+ throw new AuthFailure("invalid", "The turn token has an impossible lifetime.");
117
+ }
118
+ return claims.data;
119
+ }
120
+ export function agentPrincipalOf(claims) {
121
+ return {
122
+ kind: "agent",
123
+ userId: asId("user", claims.sub),
124
+ grantId: asId("grant", claims.gid),
125
+ agent: { name: claims.agt, verified: true },
126
+ turn: {
127
+ threadId: asId("thread", claims.thr),
128
+ turnId: asId("turn", claims.trn),
129
+ hostId: asId("host", claims.hid),
130
+ clientId: claims.cid,
131
+ },
132
+ };
133
+ }
134
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DataProvider } from "@parlor/core";
2
+ import type { Migration } from "@parlor/server";
3
+ import type { TurnTokenKeys } from "./tokens.js";
4
+ export declare const TURN_KEYS_MIGRATION: Migration;
5
+ export interface TurnKeyStore {
6
+ keys(): Promise<TurnTokenKeys>;
7
+ refresh(): Promise<TurnTokenKeys>;
8
+ }
9
+ export interface TurnKeyStoreOptions {
10
+ readonly database: DataProvider;
11
+ readonly issuer: string;
12
+ readonly secret: () => Promise<string>;
13
+ readonly now?: (() => number) | undefined;
14
+ }
15
+ export declare function createTurnKeyStore(options: TurnKeyStoreOptions): TurnKeyStore;
16
+ //# sourceMappingURL=turn-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-keys.d.ts","sourceRoot":"","sources":["../src/turn-keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,SAWjC,CAAC;AAiCF,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAiG7E"}
@@ -0,0 +1,108 @@
1
+ import { createCipheriv, createDecipheriv, hkdfSync, randomBytes } from "node:crypto";
2
+ import { sql } from "drizzle-orm";
3
+ import { exportJWK, generateKeyPair } from "jose";
4
+ import { jwkOf, rowsOf } from "./database.js";
5
+ export const TURN_KEYS_MIGRATION = {
6
+ id: "auth/0005_turn_keys",
7
+ sql: `
8
+ create table parlor_auth_turn_keys (
9
+ kid text primary key,
10
+ public_key jsonb not null,
11
+ private_key text not null,
12
+ active boolean not null default true,
13
+ created_at timestamptz not null default now()
14
+ );
15
+ create unique index parlor_auth_turn_keys_active on parlor_auth_turn_keys (active) where active`,
16
+ };
17
+ const KEY_ALGORITHM = { name: "ECDSA", namedCurve: "P-256" };
18
+ const REFRESH_MIN_INTERVAL_MS = 1000;
19
+ function sealingKey(secret) {
20
+ return Buffer.from(hkdfSync("sha256", secret, "", "parlor-auth/turn-keys", 32));
21
+ }
22
+ function seal(secret, plaintext) {
23
+ const iv = randomBytes(12);
24
+ const cipher = createCipheriv("aes-256-gcm", sealingKey(secret), iv);
25
+ const body = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
26
+ return [iv, cipher.getAuthTag(), body]
27
+ .map((part) => part.toString("base64url"))
28
+ .join(".");
29
+ }
30
+ function unseal(secret, sealed) {
31
+ const [iv, tag, body] = sealed.split(".").map((part) => Buffer.from(part, "base64url"));
32
+ if (!iv || !tag || !body)
33
+ throw new Error("The sealed turn key is malformed.");
34
+ const decipher = createDecipheriv("aes-256-gcm", sealingKey(secret), iv);
35
+ decipher.setAuthTag(tag);
36
+ return Buffer.concat([decipher.update(body), decipher.final()]).toString("utf8");
37
+ }
38
+ export function createTurnKeyStore(options) {
39
+ const { database, issuer } = options;
40
+ const now = options.now ?? Date.now;
41
+ let loaded;
42
+ let refreshedAt = 0;
43
+ const read = async () => rowsOf(await database.read().execute(sql `select kid, public_key, private_key, active from parlor_auth_turn_keys`));
44
+ const replace = async (secret, retiring) => {
45
+ const pair = await generateKeyPair("ES256", { extractable: true });
46
+ const publicKey = await exportJWK(pair.publicKey);
47
+ const privateKey = await exportJWK(pair.privateKey);
48
+ const kid = crypto.randomUUID();
49
+ await database.transaction(async (tx) => {
50
+ const db = tx;
51
+ if (retiring !== undefined) {
52
+ await db.execute(sql `update parlor_auth_turn_keys set active = false where kid = ${retiring} and active`);
53
+ }
54
+ await db.execute(sql `
55
+ insert into parlor_auth_turn_keys (kid, public_key, private_key)
56
+ values (${kid}, ${JSON.stringify(publicKey)}::jsonb, ${seal(secret, JSON.stringify(privateKey))})
57
+ on conflict do nothing`);
58
+ });
59
+ };
60
+ const signingKeyOf = async (secret, row) => {
61
+ try {
62
+ return await crypto.subtle.importKey("jwk", JSON.parse(unseal(secret, row.private_key)), KEY_ALGORITHM, false, ["sign"]);
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ };
68
+ const build = async (mayReplace) => {
69
+ const secret = await options.secret();
70
+ let rows = await read();
71
+ let active = rows.find((row) => row.active);
72
+ let privateKey = active && (await signingKeyOf(secret, active));
73
+ if (!privateKey && !mayReplace)
74
+ throw new Error("The turn signing key cannot be opened.");
75
+ if (!privateKey) {
76
+ await replace(secret, active?.kid);
77
+ rows = await read();
78
+ active = rows.find((row) => row.active);
79
+ privateKey = active && (await signingKeyOf(secret, active));
80
+ }
81
+ if (!active || !privateKey)
82
+ throw new Error("The turn signing key could not be created.");
83
+ const verifyKeys = await Promise.all(rows.map(async (row) => {
84
+ const key = await crypto.subtle.importKey("jwk", jwkOf(row.public_key), KEY_ALGORITHM, false, ["verify"]);
85
+ return [row.kid, key];
86
+ }));
87
+ return { issuer, kid: active.kid, privateKey, publicKeys: new Map(verifyKeys) };
88
+ };
89
+ const load = () => {
90
+ loaded ??= build(true).catch((error) => {
91
+ loaded = undefined;
92
+ throw error;
93
+ });
94
+ return loaded;
95
+ };
96
+ return {
97
+ keys: load,
98
+ async refresh() {
99
+ const current = await load();
100
+ if (now() - refreshedAt < REFRESH_MIN_INTERVAL_MS)
101
+ return current;
102
+ refreshedAt = now();
103
+ loaded = build(false).catch(() => current);
104
+ return loaded;
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=turn-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-keys.js","sourceRoot":"","sources":["../src/turn-keys.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@parlor/auth",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "homepage": "https://cychien.github.io/parlor",
5
+ "bugs": "https://github.com/cychien/parlor/issues",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/cychien/parlor.git",
10
+ "directory": "packages/auth"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "type": "module",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./client": {
22
+ "types": "./dist/client/index.d.ts",
23
+ "import": "./dist/client/index.js"
24
+ },
25
+ "./schema": {
26
+ "types": "./dist/schema.d.ts",
27
+ "import": "./dist/schema.js",
28
+ "default": "./dist/schema.js"
29
+ }
30
+ },
31
+ "dependencies": {
32
+ "@better-auth/cimd": "1.7.7",
33
+ "@better-auth/mcp": "1.7.7",
34
+ "@better-auth/oauth-provider": "1.7.7",
35
+ "better-auth": "1.7.7",
36
+ "drizzle-orm": "^0.45.4",
37
+ "jose": "^6.2.12",
38
+ "zod": "^4.6.5",
39
+ "@parlor/capabilities": "0.1.0",
40
+ "@parlor/chat": "0.1.0",
41
+ "@parlor/client": "0.1.0",
42
+ "@parlor/core": "0.1.0",
43
+ "@parlor/server": "0.1.0"
44
+ },
45
+ "devDependencies": {
46
+ "@modelcontextprotocol/client": "^2.3.1",
47
+ "@types/node": "^24.14.0",
48
+ "@types/pg": "^8.23.1",
49
+ "auth": "1.7.7",
50
+ "pg": "^8.23.1",
51
+ "typescript": "^7.0.2",
52
+ "vitest": "^5.0.3",
53
+ "@parlor/data": "0.1.0"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc -p tsconfig.json",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "test": "vitest run"
59
+ }
6
60
  }