@ambitresearch/genie 1.3.1

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 (301) hide show
  1. package/README.md +15 -0
  2. package/dist/auth/bearer.d.ts +49 -0
  3. package/dist/auth/bearer.d.ts.map +1 -0
  4. package/dist/auth/bearer.js +159 -0
  5. package/dist/auth/bearer.js.map +1 -0
  6. package/dist/auth/oauth/authorize.d.ts +19 -0
  7. package/dist/auth/oauth/authorize.d.ts.map +1 -0
  8. package/dist/auth/oauth/authorize.js +111 -0
  9. package/dist/auth/oauth/authorize.js.map +1 -0
  10. package/dist/auth/oauth/config.d.ts +10 -0
  11. package/dist/auth/oauth/config.d.ts.map +1 -0
  12. package/dist/auth/oauth/config.js +16 -0
  13. package/dist/auth/oauth/config.js.map +1 -0
  14. package/dist/auth/oauth/dcr.d.ts +15 -0
  15. package/dist/auth/oauth/dcr.d.ts.map +1 -0
  16. package/dist/auth/oauth/dcr.js +38 -0
  17. package/dist/auth/oauth/dcr.js.map +1 -0
  18. package/dist/auth/oauth/jwt.d.ts +13 -0
  19. package/dist/auth/oauth/jwt.d.ts.map +1 -0
  20. package/dist/auth/oauth/jwt.js +46 -0
  21. package/dist/auth/oauth/jwt.js.map +1 -0
  22. package/dist/auth/oauth/metadata.d.ts +9 -0
  23. package/dist/auth/oauth/metadata.d.ts.map +1 -0
  24. package/dist/auth/oauth/metadata.js +19 -0
  25. package/dist/auth/oauth/metadata.js.map +1 -0
  26. package/dist/auth/oauth/router.d.ts +32 -0
  27. package/dist/auth/oauth/router.d.ts.map +1 -0
  28. package/dist/auth/oauth/router.js +159 -0
  29. package/dist/auth/oauth/router.js.map +1 -0
  30. package/dist/auth/oauth/store.d.ts +55 -0
  31. package/dist/auth/oauth/store.d.ts.map +1 -0
  32. package/dist/auth/oauth/store.js +63 -0
  33. package/dist/auth/oauth/store.js.map +1 -0
  34. package/dist/auth/oauth/token.d.ts +21 -0
  35. package/dist/auth/oauth/token.d.ts.map +1 -0
  36. package/dist/auth/oauth/token.js +77 -0
  37. package/dist/auth/oauth/token.js.map +1 -0
  38. package/dist/auth/oidc/group-policy.d.ts +43 -0
  39. package/dist/auth/oidc/group-policy.d.ts.map +1 -0
  40. package/dist/auth/oidc/group-policy.js +54 -0
  41. package/dist/auth/oidc/group-policy.js.map +1 -0
  42. package/dist/auth/oidc/verifier.d.ts +42 -0
  43. package/dist/auth/oidc/verifier.d.ts.map +1 -0
  44. package/dist/auth/oidc/verifier.js +145 -0
  45. package/dist/auth/oidc/verifier.js.map +1 -0
  46. package/dist/auth/token-cli.d.ts +9 -0
  47. package/dist/auth/token-cli.d.ts.map +1 -0
  48. package/dist/auth/token-cli.js +98 -0
  49. package/dist/auth/token-cli.js.map +1 -0
  50. package/dist/cli.d.ts +3 -0
  51. package/dist/cli.d.ts.map +1 -0
  52. package/dist/cli.js +149 -0
  53. package/dist/cli.js.map +1 -0
  54. package/dist/config/redact.d.ts +20 -0
  55. package/dist/config/redact.d.ts.map +1 -0
  56. package/dist/config/redact.js +77 -0
  57. package/dist/config/redact.js.map +1 -0
  58. package/dist/config/secrets.d.ts +100 -0
  59. package/dist/config/secrets.d.ts.map +1 -0
  60. package/dist/config/secrets.js +130 -0
  61. package/dist/config/secrets.js.map +1 -0
  62. package/dist/framework/html.d.ts +103 -0
  63. package/dist/framework/html.d.ts.map +1 -0
  64. package/dist/framework/html.js +271 -0
  65. package/dist/framework/html.js.map +1 -0
  66. package/dist/framework/interface.d.ts +130 -0
  67. package/dist/framework/interface.d.ts.map +1 -0
  68. package/dist/framework/interface.js +112 -0
  69. package/dist/framework/interface.js.map +1 -0
  70. package/dist/framework/react.d.ts +133 -0
  71. package/dist/framework/react.d.ts.map +1 -0
  72. package/dist/framework/react.js +243 -0
  73. package/dist/framework/react.js.map +1 -0
  74. package/dist/framework/vue.d.ts +99 -0
  75. package/dist/framework/vue.d.ts.map +1 -0
  76. package/dist/framework/vue.js +375 -0
  77. package/dist/framework/vue.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +3 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/llm/client.d.ts +81 -0
  83. package/dist/llm/client.d.ts.map +1 -0
  84. package/dist/llm/client.js +141 -0
  85. package/dist/llm/client.js.map +1 -0
  86. package/dist/llm/component-response.d.ts +111 -0
  87. package/dist/llm/component-response.d.ts.map +1 -0
  88. package/dist/llm/component-response.js +167 -0
  89. package/dist/llm/component-response.js.map +1 -0
  90. package/dist/llm/generated-files.d.ts +10 -0
  91. package/dist/llm/generated-files.d.ts.map +1 -0
  92. package/dist/llm/generated-files.js +26 -0
  93. package/dist/llm/generated-files.js.map +1 -0
  94. package/dist/llm/prompts/CHANGELOG.md +70 -0
  95. package/dist/llm/prompts/generate-component.system.md +99 -0
  96. package/dist/llm/prompts/refine-component.system.md +112 -0
  97. package/dist/llm/prompts.d.ts +66 -0
  98. package/dist/llm/prompts.d.ts.map +1 -0
  99. package/dist/llm/prompts.js +78 -0
  100. package/dist/llm/prompts.js.map +1 -0
  101. package/dist/llm/retry.d.ts +183 -0
  102. package/dist/llm/retry.d.ts.map +1 -0
  103. package/dist/llm/retry.js +475 -0
  104. package/dist/llm/retry.js.map +1 -0
  105. package/dist/llm/schema.d.ts +129 -0
  106. package/dist/llm/schema.d.ts.map +1 -0
  107. package/dist/llm/schema.js +147 -0
  108. package/dist/llm/schema.js.map +1 -0
  109. package/dist/llm/validate.d.ts +107 -0
  110. package/dist/llm/validate.d.ts.map +1 -0
  111. package/dist/llm/validate.js +174 -0
  112. package/dist/llm/validate.js.map +1 -0
  113. package/dist/manifest/compiler.d.ts +112 -0
  114. package/dist/manifest/compiler.d.ts.map +1 -0
  115. package/dist/manifest/compiler.js +306 -0
  116. package/dist/manifest/compiler.js.map +1 -0
  117. package/dist/manifest/ensure.d.ts +46 -0
  118. package/dist/manifest/ensure.d.ts.map +1 -0
  119. package/dist/manifest/ensure.js +49 -0
  120. package/dist/manifest/ensure.js.map +1 -0
  121. package/dist/manifest/index.d.ts +13 -0
  122. package/dist/manifest/index.d.ts.map +1 -0
  123. package/dist/manifest/index.js +13 -0
  124. package/dist/manifest/index.js.map +1 -0
  125. package/dist/middleware/plan-guard.d.ts +167 -0
  126. package/dist/middleware/plan-guard.d.ts.map +1 -0
  127. package/dist/middleware/plan-guard.js +190 -0
  128. package/dist/middleware/plan-guard.js.map +1 -0
  129. package/dist/plans/index.d.ts +71 -0
  130. package/dist/plans/index.d.ts.map +1 -0
  131. package/dist/plans/index.js +252 -0
  132. package/dist/plans/index.js.map +1 -0
  133. package/dist/schemas/component.schema.json +114 -0
  134. package/dist/server.d.ts +96 -0
  135. package/dist/server.d.ts.map +1 -0
  136. package/dist/server.js +258 -0
  137. package/dist/server.js.map +1 -0
  138. package/dist/store/empty-manifest.d.ts +58 -0
  139. package/dist/store/empty-manifest.d.ts.map +1 -0
  140. package/dist/store/empty-manifest.js +59 -0
  141. package/dist/store/empty-manifest.js.map +1 -0
  142. package/dist/store/git-host.d.ts +120 -0
  143. package/dist/store/git-host.d.ts.map +1 -0
  144. package/dist/store/git-host.js +796 -0
  145. package/dist/store/git-host.js.map +1 -0
  146. package/dist/store/index.d.ts +5 -0
  147. package/dist/store/index.d.ts.map +1 -0
  148. package/dist/store/index.js +4 -0
  149. package/dist/store/index.js.map +1 -0
  150. package/dist/store/interface.d.ts +322 -0
  151. package/dist/store/interface.d.ts.map +1 -0
  152. package/dist/store/interface.js +100 -0
  153. package/dist/store/interface.js.map +1 -0
  154. package/dist/store/kit-files.d.ts +88 -0
  155. package/dist/store/kit-files.d.ts.map +1 -0
  156. package/dist/store/kit-files.js +199 -0
  157. package/dist/store/kit-files.js.map +1 -0
  158. package/dist/store/local.d.ts +70 -0
  159. package/dist/store/local.d.ts.map +1 -0
  160. package/dist/store/local.js +651 -0
  161. package/dist/store/local.js.map +1 -0
  162. package/dist/store/manifest.d.ts +44 -0
  163. package/dist/store/manifest.d.ts.map +1 -0
  164. package/dist/store/manifest.js +116 -0
  165. package/dist/store/manifest.js.map +1 -0
  166. package/dist/store/viewer-assets.d.ts +20 -0
  167. package/dist/store/viewer-assets.d.ts.map +1 -0
  168. package/dist/store/viewer-assets.js +118 -0
  169. package/dist/store/viewer-assets.js.map +1 -0
  170. package/dist/sync/anchor.d.ts +125 -0
  171. package/dist/sync/anchor.d.ts.map +1 -0
  172. package/dist/sync/anchor.js +210 -0
  173. package/dist/sync/anchor.js.map +1 -0
  174. package/dist/sync/index.d.ts +15 -0
  175. package/dist/sync/index.d.ts.map +1 -0
  176. package/dist/sync/index.js +15 -0
  177. package/dist/sync/index.js.map +1 -0
  178. package/dist/sync/orchestrator.d.ts +160 -0
  179. package/dist/sync/orchestrator.d.ts.map +1 -0
  180. package/dist/sync/orchestrator.js +288 -0
  181. package/dist/sync/orchestrator.js.map +1 -0
  182. package/dist/tools/bind_kit.d.ts +29 -0
  183. package/dist/tools/bind_kit.d.ts.map +1 -0
  184. package/dist/tools/bind_kit.js +70 -0
  185. package/dist/tools/bind_kit.js.map +1 -0
  186. package/dist/tools/conjure.d.ts +141 -0
  187. package/dist/tools/conjure.d.ts.map +1 -0
  188. package/dist/tools/conjure.js +655 -0
  189. package/dist/tools/conjure.js.map +1 -0
  190. package/dist/tools/conjure_screen.d.ts +174 -0
  191. package/dist/tools/conjure_screen.d.ts.map +1 -0
  192. package/dist/tools/conjure_screen.js +458 -0
  193. package/dist/tools/conjure_screen.js.map +1 -0
  194. package/dist/tools/create_kit.d.ts +32 -0
  195. package/dist/tools/create_kit.d.ts.map +1 -0
  196. package/dist/tools/create_kit.js +131 -0
  197. package/dist/tools/create_kit.js.map +1 -0
  198. package/dist/tools/create_project.d.ts +267 -0
  199. package/dist/tools/create_project.d.ts.map +1 -0
  200. package/dist/tools/create_project.js +546 -0
  201. package/dist/tools/create_project.js.map +1 -0
  202. package/dist/tools/delete_files.d.ts +93 -0
  203. package/dist/tools/delete_files.d.ts.map +1 -0
  204. package/dist/tools/delete_files.js +276 -0
  205. package/dist/tools/delete_files.js.map +1 -0
  206. package/dist/tools/delete_project.d.ts +43 -0
  207. package/dist/tools/delete_project.d.ts.map +1 -0
  208. package/dist/tools/delete_project.js +118 -0
  209. package/dist/tools/delete_project.js.map +1 -0
  210. package/dist/tools/get_kit.d.ts +28 -0
  211. package/dist/tools/get_kit.d.ts.map +1 -0
  212. package/dist/tools/get_kit.js +95 -0
  213. package/dist/tools/get_kit.js.map +1 -0
  214. package/dist/tools/get_project.d.ts +37 -0
  215. package/dist/tools/get_project.d.ts.map +1 -0
  216. package/dist/tools/get_project.js +71 -0
  217. package/dist/tools/get_project.js.map +1 -0
  218. package/dist/tools/list_components.d.ts +42 -0
  219. package/dist/tools/list_components.d.ts.map +1 -0
  220. package/dist/tools/list_components.js +125 -0
  221. package/dist/tools/list_components.js.map +1 -0
  222. package/dist/tools/list_files.d.ts +32 -0
  223. package/dist/tools/list_files.d.ts.map +1 -0
  224. package/dist/tools/list_files.js +109 -0
  225. package/dist/tools/list_files.js.map +1 -0
  226. package/dist/tools/list_kits.d.ts +14 -0
  227. package/dist/tools/list_kits.d.ts.map +1 -0
  228. package/dist/tools/list_kits.js +41 -0
  229. package/dist/tools/list_kits.js.map +1 -0
  230. package/dist/tools/list_projects.d.ts +23 -0
  231. package/dist/tools/list_projects.d.ts.map +1 -0
  232. package/dist/tools/list_projects.js +66 -0
  233. package/dist/tools/list_projects.js.map +1 -0
  234. package/dist/tools/plan.d.ts +16 -0
  235. package/dist/tools/plan.d.ts.map +1 -0
  236. package/dist/tools/plan.js +146 -0
  237. package/dist/tools/plan.js.map +1 -0
  238. package/dist/tools/preview.d.ts +289 -0
  239. package/dist/tools/preview.d.ts.map +1 -0
  240. package/dist/tools/preview.js +672 -0
  241. package/dist/tools/preview.js.map +1 -0
  242. package/dist/tools/read_file.d.ts +40 -0
  243. package/dist/tools/read_file.d.ts.map +1 -0
  244. package/dist/tools/read_file.js +114 -0
  245. package/dist/tools/read_file.js.map +1 -0
  246. package/dist/tools/refine.d.ts +220 -0
  247. package/dist/tools/refine.d.ts.map +1 -0
  248. package/dist/tools/refine.js +501 -0
  249. package/dist/tools/refine.js.map +1 -0
  250. package/dist/tools/validate.d.ts +74 -0
  251. package/dist/tools/validate.d.ts.map +1 -0
  252. package/dist/tools/validate.js +224 -0
  253. package/dist/tools/validate.js.map +1 -0
  254. package/dist/tools/write_files.d.ts +158 -0
  255. package/dist/tools/write_files.d.ts.map +1 -0
  256. package/dist/tools/write_files.js +541 -0
  257. package/dist/tools/write_files.js.map +1 -0
  258. package/dist/transport.d.ts +77 -0
  259. package/dist/transport.d.ts.map +1 -0
  260. package/dist/transport.js +448 -0
  261. package/dist/transport.js.map +1 -0
  262. package/dist/ui/card-asset-broker.d.ts +42 -0
  263. package/dist/ui/card-asset-broker.d.ts.map +1 -0
  264. package/dist/ui/card-asset-broker.js +479 -0
  265. package/dist/ui/card-asset-broker.js.map +1 -0
  266. package/dist/ui/grid-resource.d.ts +252 -0
  267. package/dist/ui/grid-resource.d.ts.map +1 -0
  268. package/dist/ui/grid-resource.js +680 -0
  269. package/dist/ui/grid-resource.js.map +1 -0
  270. package/dist/ui/viewer-static/index.html +95 -0
  271. package/dist/ui/viewer-static/viewer.css +451 -0
  272. package/dist/ui/viewer-static/viewer.js +1405 -0
  273. package/dist/validate/full-scan.d.ts +87 -0
  274. package/dist/validate/full-scan.d.ts.map +1 -0
  275. package/dist/validate/full-scan.js +299 -0
  276. package/dist/validate/full-scan.js.map +1 -0
  277. package/dist/validate/index.d.ts +15 -0
  278. package/dist/validate/index.d.ts.map +1 -0
  279. package/dist/validate/index.js +18 -0
  280. package/dist/validate/index.js.map +1 -0
  281. package/dist/validate/marker.d.ts +89 -0
  282. package/dist/validate/marker.d.ts.map +1 -0
  283. package/dist/validate/marker.js +87 -0
  284. package/dist/validate/marker.js.map +1 -0
  285. package/dist/validate/phash.d.ts +135 -0
  286. package/dist/validate/phash.d.ts.map +1 -0
  287. package/dist/validate/phash.js +307 -0
  288. package/dist/validate/phash.js.map +1 -0
  289. package/dist/validate/render.d.ts +38 -0
  290. package/dist/validate/render.d.ts.map +1 -0
  291. package/dist/validate/render.js +155 -0
  292. package/dist/validate/render.js.map +1 -0
  293. package/dist/watch/index.d.ts +12 -0
  294. package/dist/watch/index.d.ts.map +1 -0
  295. package/dist/watch/index.js +12 -0
  296. package/dist/watch/index.js.map +1 -0
  297. package/dist/watch/watcher.d.ts +65 -0
  298. package/dist/watch/watcher.d.ts.map +1 -0
  299. package/dist/watch/watcher.js +238 -0
  300. package/dist/watch/watcher.js.map +1 -0
  301. package/package.json +70 -0
@@ -0,0 +1,159 @@
1
+ import { OAuthStore } from "./store.js";
2
+ import { buildAuthorizationServerMetadata } from "./metadata.js";
3
+ import { registerDynamicClient, DcrValidationError } from "./dcr.js";
4
+ import { renderConsentScreen, handleConsentDecision, AuthorizeError } from "./authorize.js";
5
+ import { handleTokenRequest, TokenError } from "./token.js";
6
+ import { verifyJwtHS256, JwtVerificationError } from "./jwt.js";
7
+ import { resolveOAuthSigningKey, MissingOAuthKeyError } from "./config.js";
8
+ export { MissingOAuthKeyError };
9
+ /**
10
+ * Wires the OAuth 2.0 + DCR endpoints (RFC 7591 / RFC 8414) onto genie's
11
+ * Streamable HTTP server (DRO-273 / M5-01):
12
+ * GET /.well-known/oauth-authorization-server
13
+ * POST /register
14
+ * GET /authorize (consent screen)
15
+ * POST /authorize (consent decision)
16
+ * POST /token
17
+ *
18
+ * Returns `undefined` (feature disabled) if `OAUTH_HS256_KEY` is unset or too
19
+ * short — callers should refuse to start OAuth-protected routes in that case
20
+ * per the issue's Implementation Notes, while still allowing unauthenticated
21
+ * MCP transport to run (OAuth is opt-in).
22
+ */
23
+ export function createOAuthRouter(opts) {
24
+ const signingKey = resolveOAuthSigningKey(opts.env ?? process.env);
25
+ const store = new OAuthStore();
26
+ function json(res, status, body) {
27
+ res.writeHead(status, { "content-type": "application/json" });
28
+ res.end(JSON.stringify(body));
29
+ }
30
+ function readBody(req) {
31
+ return new Promise((resolve, reject) => {
32
+ const chunks = [];
33
+ req.on("data", (c) => chunks.push(c));
34
+ req.on("end", () => resolve(Buffer.concat(chunks)));
35
+ req.on("error", reject);
36
+ });
37
+ }
38
+ function handleBodyReadError(res) {
39
+ if (!res.headersSent)
40
+ json(res, 500, { error: "server_error" });
41
+ }
42
+ function parseBody(raw, contentType) {
43
+ const text = raw.toString("utf8");
44
+ if (!text)
45
+ return {};
46
+ if (contentType?.includes("application/x-www-form-urlencoded")) {
47
+ return Object.fromEntries(new URLSearchParams(text));
48
+ }
49
+ try {
50
+ return JSON.parse(text);
51
+ }
52
+ catch {
53
+ return {};
54
+ }
55
+ }
56
+ function verifyBearerToken(authorizationHeader) {
57
+ if (!authorizationHeader?.startsWith("Bearer ")) {
58
+ throw new JwtVerificationError("Missing Bearer token.");
59
+ }
60
+ return verifyJwtHS256(authorizationHeader.slice("Bearer ".length), signingKey);
61
+ }
62
+ function handle(req, res, pathname) {
63
+ const url = new URL(req.url ?? "/", opts.issuer);
64
+ if (req.method === "GET" && pathname === "/.well-known/oauth-authorization-server") {
65
+ json(res, 200, buildAuthorizationServerMetadata({ issuer: opts.issuer }));
66
+ return true;
67
+ }
68
+ if (req.method === "POST" && pathname === "/register") {
69
+ void readBody(req)
70
+ .then((raw) => {
71
+ try {
72
+ const body = JSON.parse(raw.toString("utf8") || "{}");
73
+ const result = registerDynamicClient(store, body);
74
+ json(res, 201, result);
75
+ }
76
+ catch (error) {
77
+ if (error instanceof DcrValidationError) {
78
+ json(res, 400, {
79
+ error: "invalid_client_metadata",
80
+ error_description: error.message,
81
+ });
82
+ }
83
+ else {
84
+ json(res, 500, { error: "server_error" });
85
+ }
86
+ }
87
+ })
88
+ .catch(() => handleBodyReadError(res));
89
+ return true;
90
+ }
91
+ if (req.method === "GET" && pathname === "/authorize") {
92
+ try {
93
+ const query = Object.fromEntries(url.searchParams);
94
+ const html = renderConsentScreen(store, query);
95
+ res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
96
+ res.end(html);
97
+ }
98
+ catch (error) {
99
+ const status = error instanceof AuthorizeError ? error.status : 500;
100
+ res.writeHead(status, { "content-type": "text/plain" });
101
+ res.end(error instanceof Error ? error.message : "Internal error");
102
+ }
103
+ return true;
104
+ }
105
+ if (req.method === "POST" && pathname === "/authorize") {
106
+ void readBody(req)
107
+ .then((raw) => {
108
+ try {
109
+ const form = new URLSearchParams(raw.toString("utf8"));
110
+ const params = new URLSearchParams(form.get("params") ?? "");
111
+ const decision = form.get("decision") ?? "deny";
112
+ const redirectUrl = handleConsentDecision(store, params, decision);
113
+ res.writeHead(302, { location: redirectUrl });
114
+ res.end();
115
+ }
116
+ catch (error) {
117
+ const status = error instanceof AuthorizeError ? error.status : 500;
118
+ res.writeHead(status, { "content-type": "text/plain" });
119
+ res.end(error instanceof Error ? error.message : "Internal error");
120
+ }
121
+ })
122
+ .catch(() => handleBodyReadError(res));
123
+ return true;
124
+ }
125
+ if (req.method === "POST" && pathname === "/token") {
126
+ void readBody(req)
127
+ .then((raw) => {
128
+ try {
129
+ const body = parseBody(raw, req.headers["content-type"]);
130
+ const result = handleTokenRequest(store, signingKey, body);
131
+ json(res, 200, result);
132
+ }
133
+ catch (error) {
134
+ if (error instanceof TokenError) {
135
+ json(res, 400, { error: error.error, error_description: error.message });
136
+ }
137
+ else {
138
+ json(res, 500, { error: "server_error" });
139
+ }
140
+ }
141
+ })
142
+ .catch(() => handleBodyReadError(res));
143
+ return true;
144
+ }
145
+ return false;
146
+ }
147
+ return { signingKey, store, handle, verifyBearerToken };
148
+ }
149
+ export function tryCreateOAuthRouter(opts) {
150
+ try {
151
+ return createOAuthRouter(opts);
152
+ }
153
+ catch (error) {
154
+ if (error instanceof MissingOAuthKeyError)
155
+ return undefined;
156
+ throw error;
157
+ }
158
+ }
159
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/auth/oauth/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * In-memory OAuth state store (DRO-273 / M5-01).
3
+ *
4
+ * Scope: a single running genie process. Clients, auth codes, and refresh
5
+ * tokens do not survive a restart — acceptable for the MCP-server-per-launch
6
+ * model (each `claude mcp add` / `codex mcp login` re-runs DCR against a
7
+ * freshly started server). Not shared across processes; do not point two
8
+ * server instances at the same client_id.
9
+ */
10
+ export interface RegisteredClient {
11
+ client_id: string;
12
+ client_secret: string;
13
+ client_secret_expires_at: 0;
14
+ redirect_uris: string[];
15
+ client_name?: string;
16
+ }
17
+ export interface AuthorizationCode {
18
+ code: string;
19
+ client_id: string;
20
+ redirect_uri: string;
21
+ scope: string;
22
+ code_challenge: string;
23
+ code_challenge_method: "S256";
24
+ expiresAt: number;
25
+ consumed: boolean;
26
+ }
27
+ export interface RefreshTokenRecord {
28
+ token: string;
29
+ client_id: string;
30
+ scope: string;
31
+ }
32
+ export declare class OAuthStore {
33
+ private readonly clients;
34
+ private readonly codes;
35
+ private readonly refreshTokens;
36
+ registerClient(redirectUris: string[], clientName?: string): RegisteredClient;
37
+ getClient(clientId: string): RegisteredClient | undefined;
38
+ issueAuthorizationCode(input: {
39
+ client_id: string;
40
+ redirect_uri: string;
41
+ scope: string;
42
+ code_challenge: string;
43
+ code_challenge_method: "S256";
44
+ }): string;
45
+ /** Consume (single-use) an authorization code, verifying PKCE. Returns undefined if invalid. */
46
+ consumeAuthorizationCode(input: {
47
+ code: string;
48
+ client_id: string;
49
+ redirect_uri: string;
50
+ code_verifier: string;
51
+ }): AuthorizationCode | undefined;
52
+ issueRefreshToken(clientId: string, scope: string): string;
53
+ consumeRefreshToken(token: string, clientId: string): RefreshTokenRecord | undefined;
54
+ }
55
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/store.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB,EAAE,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IAEvE,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAY7E,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD,sBAAsB,CAAC,KAAK,EAAE;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,qBAAqB,EAAE,MAAM,CAAC;KAC/B,GAAG,MAAM;IAWV,gGAAgG;IAChG,wBAAwB,CAAC,KAAK,EAAE;QAC9B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,GAAG,iBAAiB,GAAG,SAAS;IAejC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAM1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;CAMrF"}
@@ -0,0 +1,63 @@
1
+ import { randomBytes, createHash, randomUUID } from "node:crypto";
2
+ const AUTH_CODE_TTL_MS = 60_000;
3
+ export class OAuthStore {
4
+ clients = new Map();
5
+ codes = new Map();
6
+ refreshTokens = new Map();
7
+ registerClient(redirectUris, clientName) {
8
+ const client = {
9
+ client_id: randomUUID(),
10
+ client_secret: randomBytes(32).toString("base64url"),
11
+ client_secret_expires_at: 0,
12
+ redirect_uris: redirectUris,
13
+ client_name: clientName,
14
+ };
15
+ this.clients.set(client.client_id, client);
16
+ return client;
17
+ }
18
+ getClient(clientId) {
19
+ return this.clients.get(clientId);
20
+ }
21
+ issueAuthorizationCode(input) {
22
+ const code = randomBytes(32).toString("base64url");
23
+ this.codes.set(code, {
24
+ code,
25
+ ...input,
26
+ expiresAt: Date.now() + AUTH_CODE_TTL_MS,
27
+ consumed: false,
28
+ });
29
+ return code;
30
+ }
31
+ /** Consume (single-use) an authorization code, verifying PKCE. Returns undefined if invalid. */
32
+ consumeAuthorizationCode(input) {
33
+ const record = this.codes.get(input.code);
34
+ if (record === undefined)
35
+ return undefined;
36
+ this.codes.delete(input.code);
37
+ if (record.consumed)
38
+ return undefined;
39
+ if (record.expiresAt < Date.now())
40
+ return undefined;
41
+ if (record.client_id !== input.client_id)
42
+ return undefined;
43
+ if (record.redirect_uri !== input.redirect_uri)
44
+ return undefined;
45
+ const expectedChallenge = createHash("sha256").update(input.code_verifier).digest("base64url");
46
+ if (expectedChallenge !== record.code_challenge)
47
+ return undefined;
48
+ return record;
49
+ }
50
+ issueRefreshToken(clientId, scope) {
51
+ const token = randomBytes(32).toString("base64url");
52
+ this.refreshTokens.set(token, { token, client_id: clientId, scope });
53
+ return token;
54
+ }
55
+ consumeRefreshToken(token, clientId) {
56
+ const record = this.refreshTokens.get(token);
57
+ if (record === undefined || record.client_id !== clientId)
58
+ return undefined;
59
+ this.refreshTokens.delete(token);
60
+ return record;
61
+ }
62
+ }
63
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/auth/oauth/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { OAuthStore } from "./store.js";
2
+ export interface TokenRequestBody {
3
+ grant_type?: string;
4
+ code?: string;
5
+ redirect_uri?: string;
6
+ client_id?: string;
7
+ client_secret?: string;
8
+ code_verifier?: string;
9
+ refresh_token?: string;
10
+ [key: string]: unknown;
11
+ }
12
+ export declare class TokenError extends Error {
13
+ readonly error: string;
14
+ constructor(message: string, error?: string);
15
+ }
16
+ /**
17
+ * AC4/AC5 — `/token`. Supports `authorization_code` (with PKCE verifier) and
18
+ * `refresh_token` grants. Returns a signed HS256 JWT access token.
19
+ */
20
+ export declare function handleTokenRequest(store: OAuthStore, signingKey: string, body: TokenRequestBody): Record<string, unknown>;
21
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,UAAW,SAAQ,KAAK;IAGjC,QAAQ,CAAC,KAAK,EAAE,MAAM;gBADtB,OAAO,EAAE,MAAM,EACN,KAAK,GAAE,MAA0B;CAI7C;AA4CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,gBAAgB,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkCzB"}
@@ -0,0 +1,77 @@
1
+ import { signJwtHS256 } from "./jwt.js";
2
+ export class TokenError extends Error {
3
+ error;
4
+ constructor(message, error = "invalid_request") {
5
+ super(message);
6
+ this.error = error;
7
+ }
8
+ }
9
+ const ACCESS_TOKEN_TTL_SECONDS = 3600;
10
+ function authenticateClient(store, body) {
11
+ if (!body.client_id)
12
+ throw new TokenError("client_id is required.", "invalid_client");
13
+ const client = store.getClient(body.client_id);
14
+ if (client === undefined)
15
+ throw new TokenError("Unknown client_id.", "invalid_client");
16
+ // Public clients (PKCE, no secret registered at DCR-issue time under `none` auth) may omit
17
+ // client_secret; confidential clients must present the one issued at registration.
18
+ if (body.client_secret !== undefined && body.client_secret !== client.client_secret) {
19
+ throw new TokenError("Invalid client_secret.", "invalid_client");
20
+ }
21
+ return client.client_id;
22
+ }
23
+ function issueTokenResponse(store, signingKey, clientId, scope) {
24
+ const now = Math.floor(Date.now() / 1000);
25
+ const accessToken = signJwtHS256({
26
+ sub: clientId,
27
+ client_id: clientId,
28
+ scope,
29
+ iat: now,
30
+ exp: now + ACCESS_TOKEN_TTL_SECONDS,
31
+ }, signingKey);
32
+ const refreshToken = store.issueRefreshToken(clientId, scope);
33
+ return {
34
+ access_token: accessToken,
35
+ token_type: "Bearer",
36
+ expires_in: ACCESS_TOKEN_TTL_SECONDS,
37
+ refresh_token: refreshToken,
38
+ scope,
39
+ };
40
+ }
41
+ /**
42
+ * AC4/AC5 — `/token`. Supports `authorization_code` (with PKCE verifier) and
43
+ * `refresh_token` grants. Returns a signed HS256 JWT access token.
44
+ */
45
+ export function handleTokenRequest(store, signingKey, body) {
46
+ if (body.grant_type === "authorization_code") {
47
+ const clientId = authenticateClient(store, body);
48
+ if (!body.code)
49
+ throw new TokenError("code is required.");
50
+ if (!body.redirect_uri)
51
+ throw new TokenError("redirect_uri is required.");
52
+ if (!body.code_verifier)
53
+ throw new TokenError("code_verifier is required.");
54
+ const record = store.consumeAuthorizationCode({
55
+ code: body.code,
56
+ client_id: clientId,
57
+ redirect_uri: body.redirect_uri,
58
+ code_verifier: body.code_verifier,
59
+ });
60
+ if (record === undefined) {
61
+ throw new TokenError("Invalid or expired authorization code.", "invalid_grant");
62
+ }
63
+ return issueTokenResponse(store, signingKey, clientId, record.scope);
64
+ }
65
+ if (body.grant_type === "refresh_token") {
66
+ const clientId = authenticateClient(store, body);
67
+ if (!body.refresh_token)
68
+ throw new TokenError("refresh_token is required.");
69
+ const record = store.consumeRefreshToken(body.refresh_token, clientId);
70
+ if (record === undefined) {
71
+ throw new TokenError("Invalid refresh token.", "invalid_grant");
72
+ }
73
+ return issueTokenResponse(store, signingKey, clientId, record.scope);
74
+ }
75
+ throw new TokenError(`Unsupported grant_type '${String(body.grant_type)}'.`, "unsupported_grant_type");
76
+ }
77
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/auth/oauth/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Group-based access policy for external-OIDC-issued tokens (DRO-276 / M5-04).
3
+ *
4
+ * genie's existing OAuth server (M5-01, `packages/server/src/auth/oauth/*`)
5
+ * self-issues HS256 bearer JWTs — it has no concept of an external Identity
6
+ * Provider or group membership. This module adds the missing seam: given the
7
+ * claims of a token that was actually issued by (or validated against) an
8
+ * external OIDC provider, decide whether the caller is authorized to reach
9
+ * genie's tool surface.
10
+ *
11
+ * The concrete rule (AC6 of DRO-276): callers whose token does not carry the
12
+ * `genie-users` group in its `groups` claim are rejected with HTTP 403. This
13
+ * policy is provider-independent once an IdP has mapped membership into the
14
+ * supported `groups` claim; token-format and discovery prerequisites remain
15
+ * enforced by `verifier.ts`.
16
+ */
17
+ /** Claims shape this policy cares about. Extra claims are ignored. */
18
+ export interface OidcClaims {
19
+ sub?: string;
20
+ /** Group membership, as delivered by the IdP (custom claim, e.g. Keycloak's
21
+ * default groups mapper, Okta's Groups claim, etc.). Absent/empty means no
22
+ * group membership was asserted at all. */
23
+ groups?: unknown;
24
+ [key: string]: unknown;
25
+ }
26
+ /** The single group genie's OIDC integration test enforces (AC6). Exported so
27
+ * fixtures/tests can reference the same literal rather than duplicating it. */
28
+ export declare const REQUIRED_GROUP = "genie-users";
29
+ export declare class GroupAccessDeniedError extends Error {
30
+ readonly requiredGroup: string;
31
+ constructor(requiredGroup: string);
32
+ }
33
+ /**
34
+ * Returns true if `claims` asserts membership in `requiredGroup` (defaults to
35
+ * {@link REQUIRED_GROUP}).
36
+ */
37
+ export declare function hasRequiredGroup(claims: OidcClaims, requiredGroup?: string): boolean;
38
+ /**
39
+ * Enforce group membership. Throws {@link GroupAccessDeniedError} (callers map
40
+ * this to HTTP 403) when `claims` does not carry `requiredGroup`.
41
+ */
42
+ export declare function enforceGroupAccess(claims: OidcClaims, requiredGroup?: string): void;
43
+ //# sourceMappingURL=group-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-policy.d.ts","sourceRoot":"","sources":["../../../src/auth/oidc/group-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;gDAE4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;gFACgF;AAChF,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM;CAG3C;AAYD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,aAAa,GAAE,MAAuB,GACrC,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,aAAa,GAAE,MAAuB,GACrC,IAAI,CAIN"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Group-based access policy for external-OIDC-issued tokens (DRO-276 / M5-04).
3
+ *
4
+ * genie's existing OAuth server (M5-01, `packages/server/src/auth/oauth/*`)
5
+ * self-issues HS256 bearer JWTs — it has no concept of an external Identity
6
+ * Provider or group membership. This module adds the missing seam: given the
7
+ * claims of a token that was actually issued by (or validated against) an
8
+ * external OIDC provider, decide whether the caller is authorized to reach
9
+ * genie's tool surface.
10
+ *
11
+ * The concrete rule (AC6 of DRO-276): callers whose token does not carry the
12
+ * `genie-users` group in its `groups` claim are rejected with HTTP 403. This
13
+ * policy is provider-independent once an IdP has mapped membership into the
14
+ * supported `groups` claim; token-format and discovery prerequisites remain
15
+ * enforced by `verifier.ts`.
16
+ */
17
+ /** The single group genie's OIDC integration test enforces (AC6). Exported so
18
+ * fixtures/tests can reference the same literal rather than duplicating it. */
19
+ export const REQUIRED_GROUP = "genie-users";
20
+ export class GroupAccessDeniedError extends Error {
21
+ requiredGroup;
22
+ constructor(requiredGroup) {
23
+ super(`Access denied: caller is not a member of the "${requiredGroup}" group.`);
24
+ this.requiredGroup = requiredGroup;
25
+ }
26
+ }
27
+ /** Normalize a claims `groups` value into a string array. OIDC group claims
28
+ * are conventionally a JSON array of strings, but tolerate a single string
29
+ * (some IdPs emit a scalar when the caller has exactly one group) and treat
30
+ * anything else as "no groups". */
31
+ function normalizeGroups(value) {
32
+ if (Array.isArray(value))
33
+ return value.filter((v) => typeof v === "string");
34
+ if (typeof value === "string")
35
+ return [value];
36
+ return [];
37
+ }
38
+ /**
39
+ * Returns true if `claims` asserts membership in `requiredGroup` (defaults to
40
+ * {@link REQUIRED_GROUP}).
41
+ */
42
+ export function hasRequiredGroup(claims, requiredGroup = REQUIRED_GROUP) {
43
+ return normalizeGroups(claims.groups).includes(requiredGroup);
44
+ }
45
+ /**
46
+ * Enforce group membership. Throws {@link GroupAccessDeniedError} (callers map
47
+ * this to HTTP 403) when `claims` does not carry `requiredGroup`.
48
+ */
49
+ export function enforceGroupAccess(claims, requiredGroup = REQUIRED_GROUP) {
50
+ if (!hasRequiredGroup(claims, requiredGroup)) {
51
+ throw new GroupAccessDeniedError(requiredGroup);
52
+ }
53
+ }
54
+ //# sourceMappingURL=group-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-policy.js","sourceRoot":"","sources":["../../../src/auth/oidc/group-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH;gFACgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,aAAqB;QACxC,KAAK,CAAC,iDAAiD,aAAa,UAAU,CAAC,CAAC;QAD7D,kBAAa,GAAb,aAAa,CAAQ;IAE1C,CAAC;CACF;AAED;;;oCAGoC;AACpC,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACzF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAkB,EAClB,gBAAwB,cAAc;IAEtC,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAkB,EAClB,gBAAwB,cAAc;IAEtC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { OidcClaims } from "./group-policy.js";
2
+ export declare class MissingOidcConfigError extends Error {
3
+ }
4
+ export interface OidcVerifierConfig {
5
+ /** Provider issuer URL, e.g. `http://localhost:9944`. */
6
+ issuer: string;
7
+ /** Expected access-token `aud` claim for the genie resource/API. */
8
+ audience: string;
9
+ /** Group required for access (AC6). Defaults to `genie-users`. */
10
+ requiredGroup?: string;
11
+ /** OIDC discovery request timeout. Defaults to 10 seconds. */
12
+ discoveryTimeoutMs?: number;
13
+ }
14
+ export interface OidcVerifier {
15
+ readonly issuer: string;
16
+ readonly audience: string;
17
+ readonly requiredGroup: string;
18
+ /**
19
+ * Verify `token`'s signature (against the provider's live JWKS), `typ:
20
+ * at+jwt`, `iss`, `aud`, and mandatory RFC 9068 claims, THEN enforce group
21
+ * membership (AC6). Returns the decoded claims on success. Throws on any
22
+ * failure — signature failure, token-type/`iss`/`aud` mismatch, expiry, or
23
+ * {@link GroupAccessDeniedError} (403) for a valid-but-ungrouped token.
24
+ */
25
+ verify(token: string): Promise<OidcClaims>;
26
+ }
27
+ /** Read {@link OidcVerifierConfig} from env. A missing or empty issuer or
28
+ * audience is invalid once either OIDC variable is present. */
29
+ export declare function resolveOidcConfig(env?: NodeJS.ProcessEnv): OidcVerifierConfig;
30
+ /**
31
+ * Build a verifier bound to a live provider's JWKS. The provider's `jwks_uri`
32
+ * is resolved once via OIDC discovery; the returned JWK set is fetched lazily
33
+ * and cached across calls by `jose`'s `createRemoteJWKSet` (in-flight
34
+ * de-duplication + background re-fetch on unknown `kid` — no manual caching
35
+ * needed here).
36
+ */
37
+ export declare function createOidcVerifier(config: OidcVerifierConfig): Promise<OidcVerifier>;
38
+ /** Same as {@link createOidcVerifier}, but returns `undefined` only when both
39
+ * OIDC variables are absent. Partial or explicitly empty configuration is a
40
+ * startup error. */
41
+ export declare function tryCreateOidcVerifier(env?: NodeJS.ProcessEnv): Promise<OidcVerifier | undefined>;
42
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../src/auth/oidc/verifier.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5C;AAED;gEACgE;AAChE,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAS1F;AAqFD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAmC1F;AAED;;qBAEqB;AACrB,wBAAsB,qBAAqB,CACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAKnC"}