@portel/photon 1.22.1 → 1.23.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 (211) hide show
  1. package/README.md +19 -8
  2. package/dist/a2ui/mapper.d.ts +40 -0
  3. package/dist/a2ui/mapper.d.ts.map +1 -0
  4. package/dist/a2ui/mapper.js +286 -0
  5. package/dist/a2ui/mapper.js.map +1 -0
  6. package/dist/a2ui/types.d.ts +129 -0
  7. package/dist/a2ui/types.d.ts.map +1 -0
  8. package/dist/a2ui/types.js +20 -0
  9. package/dist/a2ui/types.js.map +1 -0
  10. package/dist/ag-ui/adapter.d.ts +9 -1
  11. package/dist/ag-ui/adapter.d.ts.map +1 -1
  12. package/dist/ag-ui/adapter.js +33 -16
  13. package/dist/ag-ui/adapter.js.map +1 -1
  14. package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
  15. package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
  16. package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
  17. package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
  18. package/dist/auto-ui/beam.d.ts.map +1 -1
  19. package/dist/auto-ui/beam.js +34 -34
  20. package/dist/auto-ui/beam.js.map +1 -1
  21. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  22. package/dist/auto-ui/bridge/renderers.js +371 -0
  23. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  24. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  25. package/dist/auto-ui/streamable-http-transport.js +38 -1
  26. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  27. package/dist/auto-ui/types.d.ts +19 -0
  28. package/dist/auto-ui/types.d.ts.map +1 -1
  29. package/dist/auto-ui/types.js.map +1 -1
  30. package/dist/beam.bundle.js +757 -107
  31. package/dist/beam.bundle.js.map +4 -4
  32. package/dist/cli/commands/beam.d.ts.map +1 -1
  33. package/dist/cli/commands/beam.js +2 -0
  34. package/dist/cli/commands/beam.js.map +1 -1
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +2 -0
  37. package/dist/cli/commands/build.js.map +1 -1
  38. package/dist/cli/commands/doctor.d.ts.map +1 -1
  39. package/dist/cli/commands/doctor.js +92 -3
  40. package/dist/cli/commands/doctor.js.map +1 -1
  41. package/dist/cli/commands/host.d.ts.map +1 -1
  42. package/dist/cli/commands/host.js +9 -1
  43. package/dist/cli/commands/host.js.map +1 -1
  44. package/dist/cli/commands/info.d.ts.map +1 -1
  45. package/dist/cli/commands/info.js +7 -3
  46. package/dist/cli/commands/info.js.map +1 -1
  47. package/dist/cli/commands/init.d.ts.map +1 -1
  48. package/dist/cli/commands/init.js +4 -0
  49. package/dist/cli/commands/init.js.map +1 -1
  50. package/dist/cli/commands/maker.d.ts +8 -0
  51. package/dist/cli/commands/maker.d.ts.map +1 -1
  52. package/dist/cli/commands/maker.js +113 -46
  53. package/dist/cli/commands/maker.js.map +1 -1
  54. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  55. package/dist/cli/commands/marketplace.js +7 -1
  56. package/dist/cli/commands/marketplace.js.map +1 -1
  57. package/dist/cli/commands/mcp.d.ts +10 -0
  58. package/dist/cli/commands/mcp.d.ts.map +1 -1
  59. package/dist/cli/commands/mcp.js +215 -4
  60. package/dist/cli/commands/mcp.js.map +1 -1
  61. package/dist/cli/commands/package.d.ts.map +1 -1
  62. package/dist/cli/commands/package.js +33 -15
  63. package/dist/cli/commands/package.js.map +1 -1
  64. package/dist/cli/commands/ps.d.ts +16 -0
  65. package/dist/cli/commands/ps.d.ts.map +1 -0
  66. package/dist/cli/commands/ps.js +267 -0
  67. package/dist/cli/commands/ps.js.map +1 -0
  68. package/dist/cli/commands/run.d.ts.map +1 -1
  69. package/dist/cli/commands/run.js +7 -0
  70. package/dist/cli/commands/run.js.map +1 -1
  71. package/dist/cli/commands/update.d.ts.map +1 -1
  72. package/dist/cli/commands/update.js +14 -4
  73. package/dist/cli/commands/update.js.map +1 -1
  74. package/dist/cli/index.d.ts.map +1 -1
  75. package/dist/cli/index.js +9 -4
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/context-store.d.ts +4 -4
  78. package/dist/context-store.d.ts.map +1 -1
  79. package/dist/context-store.js +20 -17
  80. package/dist/context-store.js.map +1 -1
  81. package/dist/context.d.ts +5 -4
  82. package/dist/context.d.ts.map +1 -1
  83. package/dist/context.js +68 -14
  84. package/dist/context.js.map +1 -1
  85. package/dist/daemon/client.d.ts +60 -0
  86. package/dist/daemon/client.d.ts.map +1 -1
  87. package/dist/daemon/client.js +76 -0
  88. package/dist/daemon/client.js.map +1 -1
  89. package/dist/daemon/execution-history-sqlite.d.ts +50 -0
  90. package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
  91. package/dist/daemon/execution-history-sqlite.js +165 -0
  92. package/dist/daemon/execution-history-sqlite.js.map +1 -0
  93. package/dist/daemon/execution-history.d.ts +78 -0
  94. package/dist/daemon/execution-history.d.ts.map +1 -0
  95. package/dist/daemon/execution-history.js +246 -0
  96. package/dist/daemon/execution-history.js.map +1 -0
  97. package/dist/daemon/hot-reload-state.d.ts +27 -0
  98. package/dist/daemon/hot-reload-state.d.ts.map +1 -0
  99. package/dist/daemon/hot-reload-state.js +48 -0
  100. package/dist/daemon/hot-reload-state.js.map +1 -0
  101. package/dist/daemon/protocol.d.ts +5 -1
  102. package/dist/daemon/protocol.d.ts.map +1 -1
  103. package/dist/daemon/protocol.js +13 -0
  104. package/dist/daemon/protocol.js.map +1 -1
  105. package/dist/daemon/registry-keys.d.ts +88 -0
  106. package/dist/daemon/registry-keys.d.ts.map +1 -0
  107. package/dist/daemon/registry-keys.js +91 -0
  108. package/dist/daemon/registry-keys.js.map +1 -0
  109. package/dist/daemon/server.js +1521 -186
  110. package/dist/daemon/server.js.map +1 -1
  111. package/dist/daemon/session-resolver.d.ts +28 -0
  112. package/dist/daemon/session-resolver.d.ts.map +1 -0
  113. package/dist/daemon/session-resolver.js +41 -0
  114. package/dist/daemon/session-resolver.js.map +1 -0
  115. package/dist/data-migration.js +20 -9
  116. package/dist/data-migration.js.map +1 -1
  117. package/dist/loader.d.ts +22 -8
  118. package/dist/loader.d.ts.map +1 -1
  119. package/dist/loader.js +214 -94
  120. package/dist/loader.js.map +1 -1
  121. package/dist/marketplace-manager.d.ts.map +1 -1
  122. package/dist/marketplace-manager.js +9 -5
  123. package/dist/marketplace-manager.js.map +1 -1
  124. package/dist/namespace-migration.d.ts.map +1 -1
  125. package/dist/namespace-migration.js +28 -23
  126. package/dist/namespace-migration.js.map +1 -1
  127. package/dist/photon-cli-runner.d.ts.map +1 -1
  128. package/dist/photon-cli-runner.js +57 -8
  129. package/dist/photon-cli-runner.js.map +1 -1
  130. package/dist/serv/auth/auth-store.d.ts +155 -0
  131. package/dist/serv/auth/auth-store.d.ts.map +1 -0
  132. package/dist/serv/auth/auth-store.js +240 -0
  133. package/dist/serv/auth/auth-store.js.map +1 -0
  134. package/dist/serv/auth/endpoints.d.ts +113 -0
  135. package/dist/serv/auth/endpoints.d.ts.map +1 -0
  136. package/dist/serv/auth/endpoints.js +1005 -0
  137. package/dist/serv/auth/endpoints.js.map +1 -0
  138. package/dist/serv/auth/http-adapter.d.ts +60 -0
  139. package/dist/serv/auth/http-adapter.d.ts.map +1 -0
  140. package/dist/serv/auth/http-adapter.js +235 -0
  141. package/dist/serv/auth/http-adapter.js.map +1 -0
  142. package/dist/serv/auth/jwt.d.ts +92 -6
  143. package/dist/serv/auth/jwt.d.ts.map +1 -1
  144. package/dist/serv/auth/jwt.js +226 -24
  145. package/dist/serv/auth/jwt.js.map +1 -1
  146. package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
  147. package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
  148. package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
  149. package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
  150. package/dist/serv/auth/sqlite-stores.d.ts +85 -0
  151. package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
  152. package/dist/serv/auth/sqlite-stores.js +446 -0
  153. package/dist/serv/auth/sqlite-stores.js.map +1 -0
  154. package/dist/serv/auth/well-known.d.ts +54 -1
  155. package/dist/serv/auth/well-known.d.ts.map +1 -1
  156. package/dist/serv/auth/well-known.js +166 -17
  157. package/dist/serv/auth/well-known.js.map +1 -1
  158. package/dist/serv/index.d.ts +45 -2
  159. package/dist/serv/index.d.ts.map +1 -1
  160. package/dist/serv/index.js +65 -1
  161. package/dist/serv/index.js.map +1 -1
  162. package/dist/serv/types/index.d.ts +80 -0
  163. package/dist/serv/types/index.d.ts.map +1 -1
  164. package/dist/serv/types/index.js.map +1 -1
  165. package/dist/server.d.ts.map +1 -1
  166. package/dist/server.js +61 -6
  167. package/dist/server.js.map +1 -1
  168. package/dist/shared/announce-context.d.ts +51 -0
  169. package/dist/shared/announce-context.d.ts.map +1 -0
  170. package/dist/shared/announce-context.js +73 -0
  171. package/dist/shared/announce-context.js.map +1 -0
  172. package/dist/shared/audit-sqlite.d.ts +63 -0
  173. package/dist/shared/audit-sqlite.d.ts.map +1 -0
  174. package/dist/shared/audit-sqlite.js +187 -0
  175. package/dist/shared/audit-sqlite.js.map +1 -0
  176. package/dist/shared/audit.d.ts +25 -3
  177. package/dist/shared/audit.d.ts.map +1 -1
  178. package/dist/shared/audit.js +97 -3
  179. package/dist/shared/audit.js.map +1 -1
  180. package/dist/shared/error-handler.d.ts +10 -1
  181. package/dist/shared/error-handler.d.ts.map +1 -1
  182. package/dist/shared/error-handler.js +17 -2
  183. package/dist/shared/error-handler.js.map +1 -1
  184. package/dist/shared/security.d.ts +12 -0
  185. package/dist/shared/security.d.ts.map +1 -1
  186. package/dist/shared/security.js +80 -0
  187. package/dist/shared/security.js.map +1 -1
  188. package/dist/shared/sqlite-runtime.d.ts +46 -0
  189. package/dist/shared/sqlite-runtime.d.ts.map +1 -0
  190. package/dist/shared/sqlite-runtime.js +110 -0
  191. package/dist/shared/sqlite-runtime.js.map +1 -0
  192. package/dist/tasks/store.d.ts +1 -1
  193. package/dist/tasks/store.d.ts.map +1 -1
  194. package/dist/tasks/store.js +29 -15
  195. package/dist/tasks/store.js.map +1 -1
  196. package/dist/telemetry/metrics.d.ts +26 -0
  197. package/dist/telemetry/metrics.d.ts.map +1 -1
  198. package/dist/telemetry/metrics.js +31 -0
  199. package/dist/telemetry/metrics.js.map +1 -1
  200. package/dist/test-runner.d.ts.map +1 -1
  201. package/dist/test-runner.js +3 -3
  202. package/dist/test-runner.js.map +1 -1
  203. package/dist/version-checker.d.ts.map +1 -1
  204. package/dist/version-checker.js +7 -14
  205. package/dist/version-checker.js.map +1 -1
  206. package/dist/version.d.ts +12 -0
  207. package/dist/version.d.ts.map +1 -1
  208. package/dist/version.js +103 -1
  209. package/dist/version.js.map +1 -1
  210. package/package.json +6 -2
  211. package/templates/photon.template.ts +7 -13
@@ -0,0 +1,85 @@
1
+ /**
2
+ * SQLite-backed authorization-server stores.
3
+ *
4
+ * Implements the same five interfaces as `auth-store.ts` (AuthCodeStore,
5
+ * RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore)
6
+ * with persistent storage across process restarts.
7
+ *
8
+ * Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
9
+ * - Under Bun: uses built-in `bun:sqlite` (zero install).
10
+ * - Under Node: falls back to `better-sqlite3` (optional peer dep).
11
+ *
12
+ * All five stores share a single database handle. Schema is created on first
13
+ * use. TTL enforcement happens at read time (stale rows are ignored and
14
+ * sweep() deletes them).
15
+ */
16
+ import type { AuthorizationCode, RefreshToken, RegisteredClient, ConsentRecord } from '../types/index.js';
17
+ import type { AuthCodeStore, RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore, PendingAuthorization } from './auth-store.js';
18
+ import { type SqliteDatabase } from '../../shared/sqlite-runtime.js';
19
+ /**
20
+ * Open the AS SQLite database at `path` with all schema created.
21
+ */
22
+ export declare function openAuthDatabase(path: string): Promise<SqliteDatabase>;
23
+ export declare class SqliteAuthCodeStore implements AuthCodeStore {
24
+ private db;
25
+ private insert;
26
+ private select;
27
+ private remove;
28
+ private sweepStmt;
29
+ constructor(db: SqliteDatabase);
30
+ save(code: AuthorizationCode): Promise<void>;
31
+ peek(code: string): Promise<AuthorizationCode | null>;
32
+ consume(code: string): Promise<AuthorizationCode | null>;
33
+ sweep(now?: Date): Promise<number>;
34
+ }
35
+ export declare class SqliteRefreshTokenStore implements RefreshTokenStore {
36
+ private db;
37
+ private insert;
38
+ private select;
39
+ private remove;
40
+ private sweepStmt;
41
+ constructor(db: SqliteDatabase);
42
+ save(token: RefreshToken): Promise<void>;
43
+ private insertRow;
44
+ find(token: string): Promise<RefreshToken | null>;
45
+ rotate(oldToken: string, newToken: RefreshToken): Promise<RefreshToken | null>;
46
+ revoke(token: string): Promise<boolean>;
47
+ sweep(now?: Date): Promise<number>;
48
+ }
49
+ export declare class SqliteClientRegistry implements ClientRegistry {
50
+ private upsert;
51
+ private select;
52
+ private touchStmt;
53
+ private remove;
54
+ private sweepStmt;
55
+ constructor(db: SqliteDatabase);
56
+ save(client: RegisteredClient): Promise<void>;
57
+ find(clientId: string): Promise<RegisteredClient | null>;
58
+ touch(clientId: string, now?: Date): Promise<void>;
59
+ delete(clientId: string): Promise<boolean>;
60
+ sweep(maxIdleMs: number, now?: Date): Promise<number>;
61
+ }
62
+ export declare class SqliteConsentStore implements ConsentStore {
63
+ private upsert;
64
+ private select;
65
+ private remove;
66
+ private sweepStmt;
67
+ constructor(db: SqliteDatabase);
68
+ save(record: ConsentRecord): Promise<void>;
69
+ covers(userId: string, tenantId: string, clientId: string, scopes: string[]): Promise<boolean>;
70
+ revoke(userId: string, tenantId: string, clientId: string): Promise<boolean>;
71
+ sweep(now?: Date): Promise<number>;
72
+ }
73
+ export declare class SqlitePendingAuthorizationStore implements PendingAuthorizationStore {
74
+ private db;
75
+ private insert;
76
+ private select;
77
+ private remove;
78
+ private sweepStmt;
79
+ constructor(db: SqliteDatabase);
80
+ save(req: PendingAuthorization): Promise<void>;
81
+ peek(id: string): Promise<PendingAuthorization | null>;
82
+ consume(id: string): Promise<PendingAuthorization | null>;
83
+ sweep(now?: Date): Promise<number>;
84
+ }
85
+ //# sourceMappingURL=sqlite-stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-stores.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/sqlite-stores.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,gCAAgC,CAAC;AAExC;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E;AA6GD,qBAAa,mBAAoB,YAAW,aAAa;IAM3C,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEf,EAAE,EAAE,cAAc;IAWhC,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAQrD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAcxD,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIrD;AAsBD,qBAAa,uBAAwB,YAAW,iBAAiB;IAMnD,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEf,EAAE,EAAE,cAAc;IAWhC,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,OAAO,CAAC,SAAS;IAaX,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAOjD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAe9E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvC,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIrD;AAmBD,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,EAAE,EAAE,cAAc;IAgBxB,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAMxD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAKxE;AA6BD,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,EAAE,EAAE,cAAc;IAexB,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C,MAAM,CACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,OAAO,CAAC;IAWb,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5E,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIrD;AAMD,qBAAa,+BAAgC,YAAW,yBAAyB;IAMnE,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;gBAEf,EAAE,EAAE,cAAc;IAahC,IAAI,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAOtD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAazD,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIrD"}
@@ -0,0 +1,446 @@
1
+ /**
2
+ * SQLite-backed authorization-server stores.
3
+ *
4
+ * Implements the same five interfaces as `auth-store.ts` (AuthCodeStore,
5
+ * RefreshTokenStore, ClientRegistry, ConsentStore, PendingAuthorizationStore)
6
+ * with persistent storage across process restarts.
7
+ *
8
+ * Runtime-agnostic via `src/shared/sqlite-runtime.ts`:
9
+ * - Under Bun: uses built-in `bun:sqlite` (zero install).
10
+ * - Under Node: falls back to `better-sqlite3` (optional peer dep).
11
+ *
12
+ * All five stores share a single database handle. Schema is created on first
13
+ * use. TTL enforcement happens at read time (stale rows are ignored and
14
+ * sweep() deletes them).
15
+ */
16
+ import { openSqlite, } from '../../shared/sqlite-runtime.js';
17
+ /**
18
+ * Open the AS SQLite database at `path` with all schema created.
19
+ */
20
+ export async function openAuthDatabase(path) {
21
+ return openSqlite(path, initSchema);
22
+ }
23
+ // ============================================================================
24
+ // Schema
25
+ // ============================================================================
26
+ function initSchema(db) {
27
+ db.exec(`
28
+ CREATE TABLE IF NOT EXISTS auth_codes (
29
+ code TEXT PRIMARY KEY,
30
+ client_id TEXT NOT NULL,
31
+ redirect_uri TEXT NOT NULL,
32
+ scope TEXT NOT NULL,
33
+ user_id TEXT NOT NULL,
34
+ tenant_id TEXT NOT NULL,
35
+ code_challenge TEXT NOT NULL,
36
+ code_challenge_method TEXT NOT NULL,
37
+ nonce TEXT,
38
+ expires_at INTEGER NOT NULL,
39
+ created_at INTEGER NOT NULL
40
+ );
41
+ CREATE INDEX IF NOT EXISTS idx_auth_codes_expires ON auth_codes(expires_at);
42
+
43
+ CREATE TABLE IF NOT EXISTS refresh_tokens (
44
+ token TEXT PRIMARY KEY,
45
+ client_id TEXT NOT NULL,
46
+ user_id TEXT NOT NULL,
47
+ tenant_id TEXT NOT NULL,
48
+ scope TEXT NOT NULL,
49
+ expires_at INTEGER NOT NULL,
50
+ created_at INTEGER NOT NULL,
51
+ supersedes TEXT
52
+ );
53
+ CREATE INDEX IF NOT EXISTS idx_refresh_expires ON refresh_tokens(expires_at);
54
+ CREATE INDEX IF NOT EXISTS idx_refresh_user ON refresh_tokens(tenant_id, user_id);
55
+
56
+ CREATE TABLE IF NOT EXISTS registered_clients (
57
+ client_id TEXT PRIMARY KEY,
58
+ client_secret_hash TEXT,
59
+ client_name TEXT NOT NULL,
60
+ redirect_uris TEXT NOT NULL,
61
+ grant_types TEXT NOT NULL,
62
+ response_types TEXT NOT NULL,
63
+ scope TEXT NOT NULL,
64
+ contacts TEXT,
65
+ logo_uri TEXT,
66
+ tos_uri TEXT,
67
+ policy_uri TEXT,
68
+ is_public INTEGER NOT NULL,
69
+ created_at INTEGER NOT NULL,
70
+ last_used_at INTEGER NOT NULL,
71
+ user_agent TEXT,
72
+ ip_address TEXT
73
+ );
74
+ CREATE INDEX IF NOT EXISTS idx_clients_last_used ON registered_clients(last_used_at);
75
+
76
+ CREATE TABLE IF NOT EXISTS consent_records (
77
+ user_id TEXT NOT NULL,
78
+ tenant_id TEXT NOT NULL,
79
+ client_id TEXT NOT NULL,
80
+ scopes TEXT NOT NULL,
81
+ expires_at INTEGER NOT NULL,
82
+ created_at INTEGER NOT NULL,
83
+ PRIMARY KEY (tenant_id, user_id, client_id)
84
+ );
85
+ CREATE INDEX IF NOT EXISTS idx_consent_expires ON consent_records(expires_at);
86
+
87
+ CREATE TABLE IF NOT EXISTS pending_auth (
88
+ id TEXT PRIMARY KEY,
89
+ client_id TEXT NOT NULL,
90
+ redirect_uri TEXT NOT NULL,
91
+ scope TEXT NOT NULL,
92
+ state TEXT,
93
+ nonce TEXT,
94
+ code_challenge TEXT NOT NULL,
95
+ code_challenge_method TEXT NOT NULL,
96
+ user_id TEXT NOT NULL,
97
+ tenant_id TEXT NOT NULL,
98
+ response_type TEXT NOT NULL,
99
+ expires_at INTEGER NOT NULL,
100
+ created_at INTEGER NOT NULL
101
+ );
102
+ CREATE INDEX IF NOT EXISTS idx_pending_expires ON pending_auth(expires_at);
103
+ `);
104
+ // Backfill columns added after the original schema. CREATE TABLE IF NOT EXISTS
105
+ // is a no-op against an existing table, so explicit ALTERs are required.
106
+ // ALTER COLUMN ADD on SQLite is idempotent only via PRAGMA inspection — the
107
+ // raw statement throws "duplicate column" on a re-run, which we swallow.
108
+ addColumnIfMissing(db, 'auth_codes', 'nonce', 'TEXT');
109
+ addColumnIfMissing(db, 'pending_auth', 'nonce', 'TEXT');
110
+ }
111
+ /** Idempotent ALTER TABLE ADD COLUMN. SQLite's table_info is the safest probe. */
112
+ function addColumnIfMissing(db, table, column, type) {
113
+ try {
114
+ const cols = db.prepare(`PRAGMA table_info(${table})`).all();
115
+ if (cols.some((c) => c.name === column))
116
+ return;
117
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${type}`);
118
+ }
119
+ catch {
120
+ // Table missing or PRAGMA unavailable — initial CREATE above will have
121
+ // produced the column; this is purely an upgrade-from-pre-nonce path.
122
+ }
123
+ }
124
+ // ============================================================================
125
+ // Auth Code Store
126
+ // ============================================================================
127
+ export class SqliteAuthCodeStore {
128
+ db;
129
+ insert;
130
+ select;
131
+ remove;
132
+ sweepStmt;
133
+ constructor(db) {
134
+ this.db = db;
135
+ this.insert = db.prepare(`
136
+ INSERT INTO auth_codes (code, client_id, redirect_uri, scope, user_id, tenant_id,
137
+ code_challenge, code_challenge_method, nonce, expires_at, created_at)
138
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
139
+ `);
140
+ this.select = db.prepare('SELECT * FROM auth_codes WHERE code = ?');
141
+ this.remove = db.prepare('DELETE FROM auth_codes WHERE code = ?');
142
+ this.sweepStmt = db.prepare('DELETE FROM auth_codes WHERE expires_at < ?');
143
+ }
144
+ async save(code) {
145
+ try {
146
+ this.insert.run(code.code, code.clientId, code.redirectUri, code.scope, code.userId, code.tenantId, code.codeChallenge, code.codeChallengeMethod, code.nonce ?? null, code.expiresAt.getTime(), code.createdAt.getTime());
147
+ }
148
+ catch (err) {
149
+ if (err instanceof Error && /UNIQUE/i.test(err.message)) {
150
+ throw new Error('authorization code collision');
151
+ }
152
+ throw err;
153
+ }
154
+ }
155
+ async peek(code) {
156
+ const row = this.select.get(code);
157
+ if (!row)
158
+ return null;
159
+ const expiresAt = new Date(row.expires_at);
160
+ if (expiresAt.getTime() < Date.now())
161
+ return null;
162
+ return rowToAuthCode(row);
163
+ }
164
+ async consume(code) {
165
+ const tx = this.db.transaction((c) => {
166
+ const row = this.select.get(c);
167
+ if (!row)
168
+ return null;
169
+ this.remove.run(c);
170
+ return row;
171
+ });
172
+ const row = tx(code);
173
+ if (!row)
174
+ return null;
175
+ const expiresAt = new Date(row.expires_at);
176
+ if (expiresAt.getTime() < Date.now())
177
+ return null;
178
+ return rowToAuthCode(row);
179
+ }
180
+ async sweep(now = new Date()) {
181
+ const result = this.sweepStmt.run(now.getTime());
182
+ return result.changes ?? 0;
183
+ }
184
+ }
185
+ function rowToAuthCode(row) {
186
+ return {
187
+ code: row.code,
188
+ clientId: row.client_id,
189
+ redirectUri: row.redirect_uri,
190
+ scope: row.scope,
191
+ userId: row.user_id,
192
+ tenantId: row.tenant_id,
193
+ codeChallenge: row.code_challenge,
194
+ codeChallengeMethod: row.code_challenge_method,
195
+ nonce: row.nonce ?? undefined,
196
+ expiresAt: new Date(row.expires_at),
197
+ createdAt: new Date(row.created_at),
198
+ };
199
+ }
200
+ // ============================================================================
201
+ // Refresh Token Store
202
+ // ============================================================================
203
+ export class SqliteRefreshTokenStore {
204
+ db;
205
+ insert;
206
+ select;
207
+ remove;
208
+ sweepStmt;
209
+ constructor(db) {
210
+ this.db = db;
211
+ this.insert = db.prepare(`
212
+ INSERT OR REPLACE INTO refresh_tokens
213
+ (token, client_id, user_id, tenant_id, scope, expires_at, created_at, supersedes)
214
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
215
+ `);
216
+ this.select = db.prepare('SELECT * FROM refresh_tokens WHERE token = ?');
217
+ this.remove = db.prepare('DELETE FROM refresh_tokens WHERE token = ?');
218
+ this.sweepStmt = db.prepare('DELETE FROM refresh_tokens WHERE expires_at < ?');
219
+ }
220
+ async save(token) {
221
+ this.insertRow(token);
222
+ }
223
+ insertRow(token) {
224
+ this.insert.run(token.token, token.clientId, token.userId, token.tenantId, token.scope, token.expiresAt.getTime(), token.createdAt.getTime(), token.supersedes ?? null);
225
+ }
226
+ async find(token) {
227
+ const row = this.select.get(token);
228
+ if (!row)
229
+ return null;
230
+ if (row.expires_at < Date.now())
231
+ return null;
232
+ return rowToRefreshToken(row);
233
+ }
234
+ async rotate(oldToken, newToken) {
235
+ const tx = this.db.transaction((o, n) => {
236
+ const existing = this.select.get(o);
237
+ if (!existing)
238
+ return null;
239
+ if (existing.expires_at < Date.now()) {
240
+ this.remove.run(o);
241
+ return null;
242
+ }
243
+ this.remove.run(o);
244
+ this.insertRow(n);
245
+ return n;
246
+ });
247
+ return tx(oldToken, newToken);
248
+ }
249
+ async revoke(token) {
250
+ const result = this.remove.run(token);
251
+ return (result.changes ?? 0) > 0;
252
+ }
253
+ async sweep(now = new Date()) {
254
+ const result = this.sweepStmt.run(now.getTime());
255
+ return result.changes ?? 0;
256
+ }
257
+ }
258
+ function rowToRefreshToken(row) {
259
+ return {
260
+ token: row.token,
261
+ clientId: row.client_id,
262
+ userId: row.user_id,
263
+ tenantId: row.tenant_id,
264
+ scope: row.scope,
265
+ expiresAt: new Date(row.expires_at),
266
+ createdAt: new Date(row.created_at),
267
+ supersedes: row.supersedes ?? undefined,
268
+ };
269
+ }
270
+ // ============================================================================
271
+ // Client Registry
272
+ // ============================================================================
273
+ export class SqliteClientRegistry {
274
+ upsert;
275
+ select;
276
+ touchStmt;
277
+ remove;
278
+ sweepStmt;
279
+ constructor(db) {
280
+ this.upsert = db.prepare(`
281
+ INSERT OR REPLACE INTO registered_clients
282
+ (client_id, client_secret_hash, client_name, redirect_uris, grant_types,
283
+ response_types, scope, contacts, logo_uri, tos_uri, policy_uri,
284
+ is_public, created_at, last_used_at, user_agent, ip_address)
285
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
286
+ `);
287
+ this.select = db.prepare('SELECT * FROM registered_clients WHERE client_id = ?');
288
+ this.touchStmt = db.prepare('UPDATE registered_clients SET last_used_at = ? WHERE client_id = ?');
289
+ this.remove = db.prepare('DELETE FROM registered_clients WHERE client_id = ?');
290
+ this.sweepStmt = db.prepare('DELETE FROM registered_clients WHERE last_used_at < ?');
291
+ }
292
+ async save(client) {
293
+ this.upsert.run(client.clientId, client.clientSecretHash ?? null, client.clientName, JSON.stringify(client.redirectUris), JSON.stringify(client.grantTypes), JSON.stringify(client.responseTypes), client.scope, client.contacts ? JSON.stringify(client.contacts) : null, client.logoUri ?? null, client.tosUri ?? null, client.policyUri ?? null, client.isPublic ? 1 : 0, client.createdAt.getTime(), client.lastUsedAt.getTime(), client.registrationContext?.userAgent ?? null, client.registrationContext?.ipAddress ?? null);
294
+ }
295
+ async find(clientId) {
296
+ const row = this.select.get(clientId);
297
+ if (!row)
298
+ return null;
299
+ return rowToRegisteredClient(row);
300
+ }
301
+ async touch(clientId, now = new Date()) {
302
+ this.touchStmt.run(now.getTime(), clientId);
303
+ }
304
+ async delete(clientId) {
305
+ const result = this.remove.run(clientId);
306
+ return (result.changes ?? 0) > 0;
307
+ }
308
+ async sweep(maxIdleMs, now = new Date()) {
309
+ const threshold = now.getTime() - maxIdleMs;
310
+ const result = this.sweepStmt.run(threshold);
311
+ return result.changes ?? 0;
312
+ }
313
+ }
314
+ function rowToRegisteredClient(row) {
315
+ return {
316
+ clientId: row.client_id,
317
+ clientSecretHash: row.client_secret_hash ?? undefined,
318
+ clientName: row.client_name,
319
+ redirectUris: JSON.parse(row.redirect_uris),
320
+ grantTypes: JSON.parse(row.grant_types),
321
+ responseTypes: JSON.parse(row.response_types),
322
+ scope: row.scope,
323
+ contacts: row.contacts ? JSON.parse(row.contacts) : undefined,
324
+ logoUri: row.logo_uri ?? undefined,
325
+ tosUri: row.tos_uri ?? undefined,
326
+ policyUri: row.policy_uri ?? undefined,
327
+ isPublic: row.is_public === 1,
328
+ createdAt: new Date(row.created_at),
329
+ lastUsedAt: new Date(row.last_used_at),
330
+ registrationContext: row.user_agent || row.ip_address
331
+ ? { userAgent: row.user_agent ?? undefined, ipAddress: row.ip_address ?? undefined }
332
+ : undefined,
333
+ };
334
+ }
335
+ // ============================================================================
336
+ // Consent Store
337
+ // ============================================================================
338
+ export class SqliteConsentStore {
339
+ upsert;
340
+ select;
341
+ remove;
342
+ sweepStmt;
343
+ constructor(db) {
344
+ this.upsert = db.prepare(`
345
+ INSERT OR REPLACE INTO consent_records
346
+ (user_id, tenant_id, client_id, scopes, expires_at, created_at)
347
+ VALUES (?, ?, ?, ?, ?, ?)
348
+ `);
349
+ this.select = db.prepare('SELECT * FROM consent_records WHERE tenant_id = ? AND user_id = ? AND client_id = ?');
350
+ this.remove = db.prepare('DELETE FROM consent_records WHERE tenant_id = ? AND user_id = ? AND client_id = ?');
351
+ this.sweepStmt = db.prepare('DELETE FROM consent_records WHERE expires_at < ?');
352
+ }
353
+ async save(record) {
354
+ this.upsert.run(record.userId, record.tenantId, record.clientId, record.scopes, record.expiresAt.getTime(), record.createdAt.getTime());
355
+ }
356
+ async covers(userId, tenantId, clientId, scopes) {
357
+ const row = this.select.get(tenantId, userId, clientId);
358
+ if (!row)
359
+ return false;
360
+ if (row.expires_at < Date.now()) {
361
+ this.remove.run(tenantId, userId, clientId);
362
+ return false;
363
+ }
364
+ const stored = new Set(row.scopes.split(' ').filter(Boolean));
365
+ return scopes.every((s) => stored.has(s));
366
+ }
367
+ async revoke(userId, tenantId, clientId) {
368
+ const result = this.remove.run(tenantId, userId, clientId);
369
+ return (result.changes ?? 0) > 0;
370
+ }
371
+ async sweep(now = new Date()) {
372
+ const result = this.sweepStmt.run(now.getTime());
373
+ return result.changes ?? 0;
374
+ }
375
+ }
376
+ // ============================================================================
377
+ // Pending Authorization Store
378
+ // ============================================================================
379
+ export class SqlitePendingAuthorizationStore {
380
+ db;
381
+ insert;
382
+ select;
383
+ remove;
384
+ sweepStmt;
385
+ constructor(db) {
386
+ this.db = db;
387
+ this.insert = db.prepare(`
388
+ INSERT INTO pending_auth
389
+ (id, client_id, redirect_uri, scope, state, nonce, code_challenge,
390
+ code_challenge_method, user_id, tenant_id, response_type,
391
+ expires_at, created_at)
392
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
393
+ `);
394
+ this.select = db.prepare('SELECT * FROM pending_auth WHERE id = ?');
395
+ this.remove = db.prepare('DELETE FROM pending_auth WHERE id = ?');
396
+ this.sweepStmt = db.prepare('DELETE FROM pending_auth WHERE expires_at < ?');
397
+ }
398
+ async save(req) {
399
+ this.insert.run(req.id, req.clientId, req.redirectUri, req.scope, req.state ?? null, req.nonce ?? null, req.codeChallenge, req.codeChallengeMethod, req.userId, req.tenantId, req.responseType, req.expiresAt.getTime(), req.createdAt.getTime());
400
+ }
401
+ async peek(id) {
402
+ const row = this.select.get(id);
403
+ if (!row)
404
+ return null;
405
+ if (row.expires_at < Date.now())
406
+ return null;
407
+ return rowToPending(row);
408
+ }
409
+ async consume(id) {
410
+ const tx = this.db.transaction((i) => {
411
+ const row = this.select.get(i);
412
+ if (!row)
413
+ return null;
414
+ this.remove.run(i);
415
+ return row;
416
+ });
417
+ const row = tx(id);
418
+ if (!row)
419
+ return null;
420
+ if (row.expires_at < Date.now())
421
+ return null;
422
+ return rowToPending(row);
423
+ }
424
+ async sweep(now = new Date()) {
425
+ const result = this.sweepStmt.run(now.getTime());
426
+ return result.changes ?? 0;
427
+ }
428
+ }
429
+ function rowToPending(row) {
430
+ return {
431
+ id: row.id,
432
+ clientId: row.client_id,
433
+ redirectUri: row.redirect_uri,
434
+ scope: row.scope,
435
+ state: row.state ?? undefined,
436
+ nonce: row.nonce ?? undefined,
437
+ codeChallenge: row.code_challenge,
438
+ codeChallengeMethod: row.code_challenge_method,
439
+ userId: row.user_id,
440
+ tenantId: row.tenant_id,
441
+ responseType: row.response_type,
442
+ expiresAt: new Date(row.expires_at),
443
+ createdAt: new Date(row.created_at),
444
+ };
445
+ }
446
+ //# sourceMappingURL=sqlite-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-stores.js","sourceRoot":"","sources":["../../../src/serv/auth/sqlite-stores.ts"],"names":[],"mappings":"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"}
@@ -34,9 +34,61 @@ export interface ClientMetadataDocument {
34
34
  policy_uri?: string;
35
35
  }
36
36
  /**
37
- * Fetch and validate a Client ID Metadata Document
37
+ * Error taxonomy for CIMD resolution failures. Maps to OAuth `invalid_client`
38
+ * with distinct `error_description` so callers can diagnose misconfiguration.
39
+ */
40
+ export type CimdError = 'not_https' | 'fetch_failed' | 'http_error' | 'invalid_json' | 'client_id_mismatch' | 'missing_redirect_uris' | 'domain_not_allowed' | 'timeout';
41
+ export interface CimdResult {
42
+ ok: boolean;
43
+ metadata?: ClientMetadataDocument;
44
+ error?: CimdError;
45
+ errorDescription?: string;
46
+ fromCache?: boolean;
47
+ }
48
+ export interface CimdFetchOptions {
49
+ /** Allowlist of hostnames; supports exact match or leading wildcard (*.claude.ai). Empty = allow all. */
50
+ allowedDomains?: string[];
51
+ /** Cache to consult/update. If omitted, fetch is uncached. */
52
+ cache?: CimdCache;
53
+ /** Override fetch for testing. */
54
+ fetchImpl?: typeof fetch;
55
+ }
56
+ /**
57
+ * Resolve a CIMD client_id to its metadata document with full validation,
58
+ * caching, and domain-allowlist enforcement.
59
+ */
60
+ export declare function resolveClientMetadata(clientId: string, opts?: CimdFetchOptions): Promise<CimdResult>;
61
+ /**
62
+ * @deprecated Use resolveClientMetadata for structured errors + caching.
63
+ * Retained for callers that only need the happy-path document.
38
64
  */
39
65
  export declare function fetchClientMetadata(clientId: string): Promise<ClientMetadataDocument | null>;
66
+ interface CimdCacheEntry {
67
+ metadata: ClientMetadataDocument;
68
+ etag?: string;
69
+ expiresAt: number;
70
+ }
71
+ /**
72
+ * LRU cache for CIMD metadata. Eviction on insert past capacity.
73
+ */
74
+ export declare class CimdCache {
75
+ private capacity;
76
+ private entries;
77
+ constructor(capacity?: number);
78
+ get(clientId: string): CimdCacheEntry | undefined;
79
+ set(clientId: string, entry: CimdCacheEntry): void;
80
+ clear(): void;
81
+ size(): number;
82
+ }
83
+ declare function isDomainAllowed(hostname: string, allowlist?: string[]): boolean;
84
+ declare function resolveTtlMs(response: Response): number;
85
+ /**
86
+ * Internal exports for tests only.
87
+ */
88
+ export declare const __test__: {
89
+ isDomainAllowed: typeof isDomainAllowed;
90
+ resolveTtlMs: typeof resolveTtlMs;
91
+ };
40
92
  /**
41
93
  * Handle /.well-known/oauth-protected-resource request
42
94
  */
@@ -57,4 +109,5 @@ export declare function handleAuthServerRequest(config: WellKnownConfig, tenant:
57
109
  * Generate WWW-Authenticate header for 401 responses
58
110
  */
59
111
  export declare function generateWwwAuthenticate(baseUrl: string, tenant: Tenant, error?: string, errorDescription?: string): string;
112
+ export {};
60
113
  //# sourceMappingURL=well-known.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/well-known.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,MAAM,EACP,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,yBAAyB,CAU3B;AAMD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb,2BAA2B,CA0B7B;AAMD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA6BxC;AA+BD;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,CAeR"}
1
+ {"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../../../src/serv/auth/well-known.ts"],"names":[],"mappings":"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"}