@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,448 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { createServer as createHttpServer, } from "node:http";
5
+ import { isIP } from "node:net";
6
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
7
+ import { extractBearerToken, verifyToken } from "./auth/bearer.js";
8
+ import { tryCreateOAuthRouter } from "./auth/oauth/router.js";
9
+ import { tryCreateOidcVerifier } from "./auth/oidc/verifier.js";
10
+ import { GroupAccessDeniedError } from "./auth/oidc/group-policy.js";
11
+ export function isLoopbackHost(host) {
12
+ const normalized = host.trim().toLowerCase();
13
+ if (normalized === "localhost" || normalized.endsWith(".localhost"))
14
+ return true;
15
+ const unwrapped = normalized.startsWith("[") && normalized.endsWith("]") ? normalized.slice(1, -1) : normalized;
16
+ const ipVersion = isIP(unwrapped);
17
+ if (ipVersion === 4)
18
+ return unwrapped.split(".")[0] === "127";
19
+ if (ipVersion !== 6)
20
+ return false;
21
+ try {
22
+ return new URL(`http://[${unwrapped}]/`).hostname === "[::1]";
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function normalizeListenHost(host) {
29
+ const trimmed = host.trim();
30
+ return trimmed.startsWith("[") && trimmed.endsWith("]") ? trimmed.slice(1, -1) : trimmed;
31
+ }
32
+ export function formatHttpEndpoint(host, port) {
33
+ const normalized = normalizeListenHost(host);
34
+ const urlHost = isIP(normalized) === 6 ? `[${normalized}]` : normalized;
35
+ return `http://${urlHost}:${port}/mcp`;
36
+ }
37
+ const serverTransportKinds = new WeakMap();
38
+ const serverDisposers = new WeakMap();
39
+ const serverDisposerHooks = new WeakSet();
40
+ /** Register session-scoped resources that must close with their MCP server. */
41
+ export function registerServerDisposer(server, disposer) {
42
+ const disposers = serverDisposers.get(server) ?? new Set();
43
+ disposers.add(disposer);
44
+ serverDisposers.set(server, disposers);
45
+ if (!serverDisposerHooks.has(server)) {
46
+ serverDisposerHooks.add(server);
47
+ const previousOnClose = server.server.onclose;
48
+ server.server.onclose = () => {
49
+ try {
50
+ previousOnClose?.();
51
+ }
52
+ finally {
53
+ void disposeServer(server);
54
+ }
55
+ };
56
+ }
57
+ }
58
+ async function disposeServer(server) {
59
+ const disposers = serverDisposers.get(server);
60
+ if (disposers === undefined)
61
+ return;
62
+ serverDisposers.delete(server);
63
+ await Promise.allSettled([...disposers].map((dispose) => dispose()));
64
+ }
65
+ /** Return the transport selected for a started server, if startup has begun. */
66
+ export function getServerTransportKind(server) {
67
+ return serverTransportKinds.get(server);
68
+ }
69
+ /**
70
+ * Resolve which transport to use (RFC §5.2 transport multiplexer):
71
+ * 1. explicit `kind` argument (from the --transport CLI flag), else
72
+ * 2. MCP_TRANSPORT env var, else
73
+ * 3. auto-detect: a TTY on stdin means a human launched us → HTTP;
74
+ * otherwise a harness is piping JSON-RPC over stdio → stdio.
75
+ */
76
+ export function resolveTransport(kind) {
77
+ const choice = (kind ?? process.env.MCP_TRANSPORT ?? "").toLowerCase();
78
+ if (choice === "stdio" || choice === "http")
79
+ return choice;
80
+ if (choice) {
81
+ throw new Error(`Unknown transport "${choice}". Use "stdio" or "http".`);
82
+ }
83
+ return process.stdin.isTTY ? "http" : "stdio";
84
+ }
85
+ /**
86
+ * Resolve whether preview URLs are reachable from the MCP client. HTTP is
87
+ * conservative by default because a loopback bind can still sit behind a
88
+ * reverse proxy or tunnel; same-machine HTTP deployments must opt into local
89
+ * URLs explicitly.
90
+ */
91
+ export function resolvePreviewLocality(transportKind, locality, env = process.env) {
92
+ const choice = (locality ?? env.GENIE_PREVIEW_LOCALITY ?? "").trim().toLowerCase();
93
+ if (choice === "local" || choice === "remote")
94
+ return choice;
95
+ if (choice) {
96
+ throw new Error(`Unknown preview locality "${choice}". Use "local" or "remote".`);
97
+ }
98
+ return transportKind === "stdio" ? "local" : "remote";
99
+ }
100
+ /** Connect the server over stdio (the default for local harnesses). */
101
+ async function startStdio(server, input = process.stdin, output = process.stdout) {
102
+ const transport = new StdioServerTransport(input, output);
103
+ let closing = false;
104
+ const closeOnEof = () => {
105
+ if (closing)
106
+ return;
107
+ closing = true;
108
+ void transport.close().catch((error) => {
109
+ process.stderr.write(`genie: stdio close failed: ${error instanceof Error ? error.message : String(error)}\n`);
110
+ });
111
+ };
112
+ const removeEofListeners = () => {
113
+ input.off("end", closeOnEof);
114
+ input.off("close", closeOnEof);
115
+ };
116
+ transport.onclose = removeEofListeners;
117
+ input.once("end", closeOnEof);
118
+ input.once("close", closeOnEof);
119
+ try {
120
+ await server.connect(transport);
121
+ }
122
+ catch (error) {
123
+ removeEofListeners();
124
+ throw error;
125
+ }
126
+ // No stdout logging on stdio — it would corrupt the JSON-RPC stream.
127
+ }
128
+ const DEFAULT_HTTP_SESSION_IDLE_TIMEOUT_MS = 30 * 60 * 1000;
129
+ function sessionIdFrom(req) {
130
+ const value = req.headers["mcp-session-id"];
131
+ return Array.isArray(value) ? value[0] : value;
132
+ }
133
+ function writeProtocolError(res, status, message, headers = {}) {
134
+ if (res.headersSent)
135
+ return;
136
+ res.writeHead(status, { "content-type": "application/json", ...headers });
137
+ res.end(JSON.stringify({
138
+ jsonrpc: "2.0",
139
+ error: { code: -32000, message },
140
+ id: null,
141
+ }));
142
+ }
143
+ function reportHttpFailure(res, error) {
144
+ process.stderr.write(JSON.stringify({
145
+ event: "transport.http.error",
146
+ error: error instanceof Error ? (error.stack ?? error.message) : String(error),
147
+ }) + "\n");
148
+ writeProtocolError(res, 500, "Internal server error");
149
+ }
150
+ /**
151
+ * Create the stateful Streamable HTTP request handler. Each initialized client
152
+ * receives its own MCP server + transport, keyed by Mcp-Session-Id, so
153
+ * initialize-scoped capabilities never leak between clients.
154
+ */
155
+ export function createStreamableHttpRequestHandler(serverFactory, options = {}) {
156
+ const sessions = new Map();
157
+ const sessionIdleTimeoutMs = options.sessionIdleTimeoutMs ?? DEFAULT_HTTP_SESSION_IDLE_TIMEOUT_MS;
158
+ if (!Number.isFinite(sessionIdleTimeoutMs) || sessionIdleTimeoutMs <= 0) {
159
+ throw new Error("sessionIdleTimeoutMs must be a positive finite number.");
160
+ }
161
+ const oauthRouter = options.oauthIssuer
162
+ ? tryCreateOAuthRouter({ issuer: options.oauthIssuer })
163
+ : undefined;
164
+ const refreshIdleTimer = (sessionId, session) => {
165
+ if (session.idleTimer !== undefined)
166
+ clearTimeout(session.idleTimer);
167
+ session.idleTimer = setTimeout(() => {
168
+ if (sessions.get(sessionId) !== session)
169
+ return;
170
+ if (session.activeRequests > 0)
171
+ return;
172
+ session.idleTimer = undefined;
173
+ sessions.delete(sessionId);
174
+ void session.transport.close().finally(() => disposeServer(session.server));
175
+ }, sessionIdleTimeoutMs);
176
+ session.idleTimer.unref?.();
177
+ };
178
+ const disposeSession = (session) => {
179
+ if (session.disposed)
180
+ return;
181
+ session.disposed = true;
182
+ if (session.idleTimer !== undefined) {
183
+ clearTimeout(session.idleTimer);
184
+ session.idleTimer = undefined;
185
+ }
186
+ void disposeServer(session.server);
187
+ };
188
+ const acquireSession = (session, sessionId) => {
189
+ if (session.idleTimer !== undefined) {
190
+ clearTimeout(session.idleTimer);
191
+ session.idleTimer = undefined;
192
+ }
193
+ session.activeRequests += 1;
194
+ return { session, sessionId, released: false };
195
+ };
196
+ const releaseSession = (lease) => {
197
+ if (lease.released)
198
+ return;
199
+ lease.released = true;
200
+ lease.session.activeRequests -= 1;
201
+ const activeId = lease.sessionId ?? lease.session.transport.sessionId;
202
+ if (activeId !== undefined &&
203
+ lease.session.activeRequests === 0 &&
204
+ sessions.get(activeId) === lease.session) {
205
+ refreshIdleTimer(activeId, lease.session);
206
+ }
207
+ };
208
+ const handleMcp = async (req, res, body, acquiredLease) => {
209
+ const sessionId = sessionIdFrom(req);
210
+ let session = acquiredLease?.session ?? sessions.get(sessionId ?? "");
211
+ let createdSession = false;
212
+ if (session === undefined) {
213
+ if (sessionId !== undefined) {
214
+ writeProtocolError(res, 404, "Unknown MCP session");
215
+ return;
216
+ }
217
+ if (!isInitializeRequest(body)) {
218
+ writeProtocolError(res, 400, "Missing MCP session ID");
219
+ return;
220
+ }
221
+ const sessionServer = serverFactory();
222
+ const transport = new StreamableHTTPServerTransport({
223
+ sessionIdGenerator: () => randomUUID(),
224
+ onsessioninitialized: (initializedId) => {
225
+ const initializedSession = session;
226
+ sessions.set(initializedId, initializedSession);
227
+ },
228
+ });
229
+ session = { server: sessionServer, transport, activeRequests: 0, disposed: false };
230
+ createdSession = true;
231
+ transport.onclose = () => {
232
+ const closedId = transport.sessionId;
233
+ if (closedId !== undefined)
234
+ sessions.delete(closedId);
235
+ disposeSession(session);
236
+ };
237
+ serverTransportKinds.set(sessionServer, "http");
238
+ try {
239
+ await sessionServer.connect(transport);
240
+ }
241
+ catch (error) {
242
+ await transport.close().catch(() => undefined);
243
+ disposeSession(session);
244
+ throw error;
245
+ }
246
+ }
247
+ const lease = acquiredLease ?? acquireSession(session, sessionId);
248
+ try {
249
+ await session.transport.handleRequest(req, res, body);
250
+ }
251
+ finally {
252
+ releaseSession(lease);
253
+ if (createdSession && session.transport.sessionId === undefined) {
254
+ await session.transport.close().catch(() => undefined);
255
+ disposeSession(session);
256
+ }
257
+ }
258
+ };
259
+ const requireBearerAuth = options.requireBearerAuth ?? false;
260
+ const { oidcVerifier } = options;
261
+ /**
262
+ * Authenticate `/mcp` against every configured credential source. Sources
263
+ * are alternatives: a token accepted by self-issued OAuth, static bearer
264
+ * auth, OR external OIDC may proceed. An OIDC token that verifies but lacks
265
+ * the required group gets 403 only after the other enabled sources also
266
+ * reject it; a token invalid for every source gets 401.
267
+ */
268
+ const authorizeMcp = async (req, res) => {
269
+ const authEnabled = oauthRouter !== undefined || requireBearerAuth || oidcVerifier !== undefined;
270
+ if (!authEnabled)
271
+ return true;
272
+ const authorizationHeader = Array.isArray(req.headers.authorization)
273
+ ? req.headers.authorization[0]
274
+ : req.headers.authorization;
275
+ const token = extractBearerToken(authorizationHeader);
276
+ if (token === undefined) {
277
+ writeUnauthorized(res, "Missing bearer token");
278
+ return false;
279
+ }
280
+ if (oauthRouter !== undefined) {
281
+ try {
282
+ oauthRouter.verifyBearerToken(authorizationHeader);
283
+ return true;
284
+ }
285
+ catch {
286
+ // Try the remaining configured credential sources.
287
+ }
288
+ }
289
+ if (requireBearerAuth && (await verifyToken(token)).ok)
290
+ return true;
291
+ let groupDenied;
292
+ if (oidcVerifier !== undefined) {
293
+ try {
294
+ await oidcVerifier.verify(token);
295
+ return true;
296
+ }
297
+ catch (error) {
298
+ if (error instanceof GroupAccessDeniedError)
299
+ groupDenied = error;
300
+ }
301
+ }
302
+ if (groupDenied !== undefined) {
303
+ res.writeHead(403, {
304
+ "content-type": "application/json",
305
+ "www-authenticate": 'Bearer error="insufficient_scope"',
306
+ });
307
+ res.end(JSON.stringify({
308
+ error: "insufficient_group",
309
+ message: `Caller is not a member of the "${groupDenied.requiredGroup}" group.`,
310
+ }));
311
+ return false;
312
+ }
313
+ writeUnauthorized(res, "Invalid bearer token", "invalid_token");
314
+ return false;
315
+ };
316
+ const writeUnauthorized = (res, message, error) => {
317
+ if (oauthRouter === undefined) {
318
+ const challenge = error === undefined ? "Bearer" : `Bearer error="${error}"`;
319
+ writeProtocolError(res, 401, message, { "www-authenticate": challenge });
320
+ return;
321
+ }
322
+ res.writeHead(401, {
323
+ "content-type": "application/json",
324
+ "www-authenticate": `Bearer resource_metadata="${options.oauthIssuer}/.well-known/oauth-authorization-server"`,
325
+ });
326
+ res.end(JSON.stringify({ error: "invalid_token" }));
327
+ };
328
+ return (req, res) => {
329
+ const pathname = new URL(req.url ?? "/", "http://localhost").pathname;
330
+ if (oauthRouter?.handle(req, res, pathname))
331
+ return;
332
+ if (pathname === "/mcp") {
333
+ void authorizeMcp(req, res).then((authorized) => {
334
+ if (!authorized)
335
+ return;
336
+ dispatchMcp(req, res, pathname);
337
+ });
338
+ return;
339
+ }
340
+ dispatchMcp(req, res, pathname);
341
+ };
342
+ function dispatchMcp(req, res, pathname) {
343
+ if (req.method === "POST" && pathname === "/mcp") {
344
+ const sessionId = sessionIdFrom(req);
345
+ let lease;
346
+ if (sessionId !== undefined) {
347
+ const session = sessions.get(sessionId);
348
+ if (session === undefined) {
349
+ writeProtocolError(res, 404, "Unknown MCP session");
350
+ return;
351
+ }
352
+ lease = acquireSession(session, sessionId);
353
+ }
354
+ let handedOff = false;
355
+ const releaseBufferedRequest = () => {
356
+ if (!handedOff && lease !== undefined)
357
+ releaseSession(lease);
358
+ };
359
+ const chunks = [];
360
+ req.on("data", (c) => chunks.push(c));
361
+ req.once("aborted", releaseBufferedRequest);
362
+ req.once("error", releaseBufferedRequest);
363
+ req.on("end", () => {
364
+ if (req.aborted) {
365
+ releaseBufferedRequest();
366
+ return;
367
+ }
368
+ let body;
369
+ try {
370
+ body = JSON.parse(Buffer.concat(chunks).toString("utf8"));
371
+ }
372
+ catch {
373
+ releaseBufferedRequest();
374
+ res.writeHead(400, { "content-type": "application/json" });
375
+ res.end(JSON.stringify({ error: "invalid JSON" }));
376
+ return;
377
+ }
378
+ handedOff = true;
379
+ void handleMcp(req, res, body, lease).catch((error) => {
380
+ reportHttpFailure(res, error);
381
+ });
382
+ });
383
+ return;
384
+ }
385
+ if ((req.method === "GET" || req.method === "DELETE") && pathname === "/mcp") {
386
+ void handleMcp(req, res).catch((error) => {
387
+ reportHttpFailure(res, error);
388
+ });
389
+ return;
390
+ }
391
+ if (req.method === "GET" && pathname === "/health") {
392
+ res.writeHead(200, { "content-type": "application/json" });
393
+ res.end(JSON.stringify({ status: "ok", server: "genie" }));
394
+ return;
395
+ }
396
+ res.writeHead(404).end();
397
+ }
398
+ }
399
+ /** Connect the server over Streamable HTTP (for remote / multi-client use). */
400
+ async function startHttp(port, host, serverFactory, requireBearerAuth) {
401
+ if (serverFactory === undefined) {
402
+ throw new Error("HTTP transport requires an explicit serverFactory for per-client session isolation.");
403
+ }
404
+ // OAuth is opt-in: only mounted when OAUTH_HS256_KEY is set (AC1-AC5). The
405
+ // issuer is the externally-reachable endpoint clients will hit for DCR +
406
+ // token exchange, so it must match how `claude mcp add` / `codex mcp
407
+ // login` reach this process — override via GENIE_OAUTH_ISSUER for
408
+ // reverse-proxy/tunnel deployments.
409
+ const oauthIssuer = process.env.OAUTH_HS256_KEY !== undefined
410
+ ? (process.env.GENIE_OAUTH_ISSUER ?? `http://${normalizeListenHost(host)}:${port}`)
411
+ : undefined;
412
+ // OIDC relying-party mode is opt-in: only engages when GENIE_OIDC_ISSUER +
413
+ // GENIE_OIDC_AUDIENCE are set (M5-04, DRO-276). Independent of oauthIssuer.
414
+ const oidcVerifier = await tryCreateOidcVerifier(process.env);
415
+ const http = createHttpServer(createStreamableHttpRequestHandler(serverFactory, {
416
+ requireBearerAuth,
417
+ oauthIssuer,
418
+ oidcVerifier,
419
+ }));
420
+ await new Promise((resolve) => http.listen(port, host, resolve));
421
+ process.stderr.write(`genie MCP server listening on ${formatHttpEndpoint(host, port)}\n`);
422
+ if (oauthIssuer) {
423
+ process.stderr.write(`genie MCP server: OAuth 2.0 + DCR enabled (issuer ${oauthIssuer})\n`);
424
+ }
425
+ if (oidcVerifier) {
426
+ process.stderr.write(`genie MCP server: OIDC relying-party mode enabled (issuer ${oidcVerifier.issuer}, ` +
427
+ `required group "${oidcVerifier.requiredGroup}")\n`);
428
+ }
429
+ }
430
+ /** Start the server on the resolved transport. Returns the kind actually used. */
431
+ export async function startTransport(server, opts = {}) {
432
+ const kind = resolveTransport(opts.kind);
433
+ serverTransportKinds.set(server, kind);
434
+ try {
435
+ if (kind === "http") {
436
+ await startHttp(opts.port ?? 3000, normalizeListenHost(opts.host ?? "127.0.0.1"), opts.serverFactory, opts.requireBearerAuth);
437
+ }
438
+ else {
439
+ await startStdio(server, opts.stdioInput, opts.stdioOutput);
440
+ }
441
+ }
442
+ catch (error) {
443
+ serverTransportKinds.delete(server);
444
+ throw error;
445
+ }
446
+ return kind;
447
+ }
448
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /** Optional stable port for hosts that must advertise frame origins before a request. */
2
+ export declare const CARD_ASSET_PORT_ENV = "GENIE_CARD_ASSET_PORT";
3
+ declare const LOOPBACK_ADDRESS: "127.0.0.1";
4
+ export interface CardAssetBrokerOptions {
5
+ /**
6
+ * TCP port for the process-scoped asset listener. `0` asks the OS for an
7
+ * ephemeral port. The explicit option wins over `GENIE_CARD_ASSET_PORT`.
8
+ */
9
+ port?: number;
10
+ /** Injectable environment for deterministic composition and tests. */
11
+ env?: Readonly<Record<string, string | undefined>>;
12
+ }
13
+ /** A kit-specific opaque route on the process-scoped loopback origin. */
14
+ export interface CardAssetKit {
15
+ readonly kitId: string;
16
+ readonly token: string;
17
+ readonly routePrefix: string;
18
+ readonly hostname: string;
19
+ readonly authority: string;
20
+ readonly origin: string;
21
+ /** Build an absolute URL from a logical, kit-relative POSIX path. */
22
+ urlFor(path: string): string;
23
+ }
24
+ /** One loopback listener intended to live for the MCP server process lifetime. */
25
+ export interface CardAssetBroker {
26
+ readonly address: typeof LOOPBACK_ADDRESS;
27
+ readonly port: number;
28
+ registerKit(kitId: string, root: string): Promise<CardAssetKit>;
29
+ getKit(kitId: string): CardAssetKit | undefined;
30
+ /** Immutable snapshot for exact MCP App `frameDomains` composition. */
31
+ frameOrigins(): readonly string[];
32
+ close(): Promise<void>;
33
+ }
34
+ /**
35
+ * Start a process-scoped, loopback-only card asset broker.
36
+ *
37
+ * The promise resolves only after the concrete port is known, so callers can
38
+ * safely publish each registration's exact `origin` in MCP App CSP metadata.
39
+ */
40
+ export declare function startCardAssetBroker(options?: CardAssetBrokerOptions): Promise<CardAssetBroker>;
41
+ export {};
42
+ //# sourceMappingURL=card-asset-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-asset-broker.d.ts","sourceRoot":"","sources":["../../src/ui/card-asset-broker.ts"],"names":[],"mappings":"AASA,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D,QAAA,MAAM,gBAAgB,EAAG,WAAoB,CAAC;AAuB9C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,gBAAgB,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IAChD,uEAAuE;IACvE,YAAY,IAAI,SAAS,MAAM,EAAE,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAweD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,CAAC,CAI1B"}