@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,479 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { constants as fsConstants } from "node:fs";
3
+ import { lstat, open, realpath, stat } from "node:fs/promises";
4
+ import { createServer } from "node:http";
5
+ import { extname, isAbsolute, relative, resolve, sep } from "node:path";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { parse } from "parse5";
8
+ /** Optional stable port for hosts that must advertise frame origins before a request. */
9
+ export const CARD_ASSET_PORT_ENV = "GENIE_CARD_ASSET_PORT";
10
+ const LOOPBACK_ADDRESS = "127.0.0.1";
11
+ const OPAQUE_TOKEN_BYTES = 16;
12
+ const EMBEDDED_CARD_CSP_DIRECTIVES = [
13
+ "default-src 'none'",
14
+ "img-src 'self' data: blob:",
15
+ "connect-src 'none'",
16
+ "font-src 'none'",
17
+ "object-src 'none'",
18
+ "base-uri 'none'",
19
+ "form-action 'none'",
20
+ ];
21
+ const NO_INLINE_CARD_CSP = [
22
+ EMBEDDED_CARD_CSP_DIRECTIVES[0],
23
+ "script-src 'self'",
24
+ "style-src 'self'",
25
+ ...EMBEDDED_CARD_CSP_DIRECTIVES.slice(1),
26
+ ].join("; ");
27
+ const CARD_RESPONSE_HEADERS = {
28
+ "cache-control": "no-store",
29
+ "referrer-policy": "no-referrer",
30
+ "x-content-type-options": "nosniff",
31
+ };
32
+ const SAFE_CONTENT_TYPES = {
33
+ ".avif": "image/avif",
34
+ ".bmp": "image/bmp",
35
+ ".cjs": "text/javascript; charset=utf-8",
36
+ ".css": "text/css; charset=utf-8",
37
+ ".gif": "image/gif",
38
+ ".htm": "text/html; charset=utf-8",
39
+ ".html": "text/html; charset=utf-8",
40
+ ".ico": "image/x-icon",
41
+ ".jpeg": "image/jpeg",
42
+ ".jpg": "image/jpeg",
43
+ ".js": "text/javascript; charset=utf-8",
44
+ ".json": "application/json; charset=utf-8",
45
+ ".map": "application/json; charset=utf-8",
46
+ ".mjs": "text/javascript; charset=utf-8",
47
+ ".mp3": "audio/mpeg",
48
+ ".mp4": "video/mp4",
49
+ ".ogg": "audio/ogg",
50
+ ".pdf": "application/pdf",
51
+ ".png": "image/png",
52
+ ".svg": "image/svg+xml; charset=utf-8",
53
+ ".txt": "text/plain; charset=utf-8",
54
+ ".wasm": "application/wasm",
55
+ ".wav": "audio/wav",
56
+ ".webm": "video/webm",
57
+ ".webp": "image/webp",
58
+ ".woff": "font/woff",
59
+ ".woff2": "font/woff2",
60
+ ".xml": "application/xml; charset=utf-8",
61
+ };
62
+ function contentTypeFor(path) {
63
+ return SAFE_CONTENT_TYPES[extname(path).toLowerCase()] ?? "application/octet-stream";
64
+ }
65
+ function cspSha256(content) {
66
+ return `'sha256-${createHash("sha256").update(content, "utf8").digest("base64")}'`;
67
+ }
68
+ function rawText(node) {
69
+ if (node.nodeName === "#text")
70
+ return node.value ?? "";
71
+ return (node.childNodes ?? []).map(rawText).join("");
72
+ }
73
+ function inlineCspHashes(html) {
74
+ const scripts = new Set();
75
+ const styles = new Set();
76
+ const styleAttributes = new Set();
77
+ const root = parse(html);
78
+ function visit(node) {
79
+ if (node.tagName === "script") {
80
+ const hasSrc = node.attrs?.some((attr) => attr.name.toLowerCase() === "src") ?? false;
81
+ const content = rawText(node);
82
+ if (!hasSrc && content !== "")
83
+ scripts.add(cspSha256(content));
84
+ }
85
+ else if (node.tagName === "style") {
86
+ const content = rawText(node);
87
+ if (content !== "")
88
+ styles.add(cspSha256(content));
89
+ }
90
+ for (const attribute of node.attrs ?? []) {
91
+ if (attribute.name.toLowerCase() === "style") {
92
+ styleAttributes.add(cspSha256(attribute.value));
93
+ }
94
+ }
95
+ for (const child of node.childNodes ?? [])
96
+ visit(child);
97
+ }
98
+ visit(root);
99
+ return {
100
+ scripts: [...scripts],
101
+ styles: [...styles],
102
+ styleAttributes: [...styleAttributes],
103
+ };
104
+ }
105
+ function cardCsp(html) {
106
+ if (html === undefined)
107
+ return NO_INLINE_CARD_CSP;
108
+ const hashes = inlineCspHashes(html);
109
+ const scriptSrc = ["script-src 'self'", ...hashes.scripts].join(" ");
110
+ const styleSrc = [
111
+ "style-src 'self'",
112
+ ...(hashes.styleAttributes.length === 0 ? [] : ["'unsafe-hashes'"]),
113
+ ...hashes.styles,
114
+ ...hashes.styleAttributes,
115
+ ].join(" ");
116
+ return [
117
+ EMBEDDED_CARD_CSP_DIRECTIVES[0],
118
+ scriptSrc,
119
+ styleSrc,
120
+ ...EMBEDDED_CARD_CSP_DIRECTIVES.slice(1),
121
+ ].join("; ");
122
+ }
123
+ function parsePort(value, source) {
124
+ const port = typeof value === "number" ? value : Number(value);
125
+ if (!Number.isInteger(port) || port < 0 || port > 65_535 || String(value).trim() === "") {
126
+ throw new Error(`${source} must be an integer port between 0 and 65535.`);
127
+ }
128
+ return port;
129
+ }
130
+ function requestedPort(options) {
131
+ if (options.port !== undefined)
132
+ return parsePort(options.port, "Card asset broker port");
133
+ const envValue = (options.env ?? process.env)[CARD_ASSET_PORT_ENV];
134
+ return envValue === undefined ? 0 : parsePort(envValue, CARD_ASSET_PORT_ENV);
135
+ }
136
+ function isContained(root, candidate) {
137
+ const fromRoot = relative(root, candidate);
138
+ return (fromRoot === "" ||
139
+ (fromRoot !== ".." && !fromRoot.startsWith(`..${sep}`) && !isAbsolute(fromRoot)));
140
+ }
141
+ function logicalPathSegments(path) {
142
+ if (typeof path !== "string" || path.length === 0 || path.includes("\\") || path.includes("\0")) {
143
+ throw new Error("Card asset path must be a non-empty, safe POSIX path.");
144
+ }
145
+ const withoutLeadingSlash = path.startsWith("/") ? path.slice(1) : path;
146
+ const segments = withoutLeadingSlash.split("/");
147
+ if (withoutLeadingSlash.length === 0 ||
148
+ segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
149
+ throw new Error("Card asset path must remain inside its registered kit root.");
150
+ }
151
+ return segments;
152
+ }
153
+ function encodeLogicalPath(path) {
154
+ return logicalPathSegments(path)
155
+ .map((segment) => encodeURIComponent(segment))
156
+ .join("/");
157
+ }
158
+ function decodeRequestPath(rawUrl) {
159
+ if (rawUrl === undefined || !rawUrl.startsWith("/") || rawUrl.startsWith("//"))
160
+ return null;
161
+ const queryIndex = rawUrl.indexOf("?");
162
+ const rawPath = queryIndex === -1 ? rawUrl : rawUrl.slice(0, queryIndex);
163
+ if (rawPath.includes("\\") || rawPath.includes("\0"))
164
+ return null;
165
+ let decoded;
166
+ try {
167
+ decoded = decodeURIComponent(rawPath);
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ if (!decoded.startsWith("/") || decoded.includes("\\") || decoded.includes("\0"))
173
+ return null;
174
+ const segments = decoded.slice(1).split("/");
175
+ if (segments.length === 0 ||
176
+ segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
177
+ return null;
178
+ }
179
+ return segments;
180
+ }
181
+ function authorityFor(hostname, port) {
182
+ return port === 80 ? hostname : `${hostname}:${port}`;
183
+ }
184
+ function sendEmpty(res, status, headers = {}) {
185
+ res.writeHead(status, {
186
+ ...CARD_RESPONSE_HEADERS,
187
+ "content-security-policy": NO_INLINE_CARD_CSP,
188
+ "content-type": "text/plain; charset=utf-8",
189
+ ...headers,
190
+ });
191
+ res.end();
192
+ }
193
+ function isExpectedFileError(error) {
194
+ if (!(error instanceof Error) || !("code" in error))
195
+ return false;
196
+ const code = error.code;
197
+ return code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP" || code === "EACCES";
198
+ }
199
+ class LoopbackCardAssetBroker {
200
+ address = LOOPBACK_ADDRESS;
201
+ #port = 0;
202
+ #closed = false;
203
+ #closePromise;
204
+ #server;
205
+ #kitsById = new Map();
206
+ #kitsByToken = new Map();
207
+ #authority = "";
208
+ #origin = "";
209
+ #frameOrigins = Object.freeze([]);
210
+ constructor() {
211
+ this.#server = createServer((req, res) => {
212
+ void this.#serve(req, res).catch(() => {
213
+ if (!res.headersSent)
214
+ sendEmpty(res, 500);
215
+ else
216
+ res.destroy();
217
+ });
218
+ });
219
+ }
220
+ get port() {
221
+ return this.#port;
222
+ }
223
+ async start(port) {
224
+ await new Promise((resolveStart, rejectStart) => {
225
+ const onError = (error) => rejectStart(error);
226
+ this.#server.once("error", onError);
227
+ this.#server.listen(port, this.address, () => {
228
+ this.#server.off("error", onError);
229
+ resolveStart();
230
+ });
231
+ });
232
+ const address = this.#server.address();
233
+ if (address === null || typeof address === "string" || address.address !== this.address) {
234
+ await this.close();
235
+ throw new Error("Card asset broker failed to bind the IPv4 loopback address.");
236
+ }
237
+ this.#port = address.port;
238
+ this.#authority = authorityFor(this.address, this.#port);
239
+ this.#origin = `http://${this.#authority}`;
240
+ this.#frameOrigins = Object.freeze([this.#origin]);
241
+ }
242
+ async registerKit(kitId, root) {
243
+ if (this.#closed)
244
+ throw new Error("Card asset broker is closed.");
245
+ if (typeof kitId !== "string" || kitId.length === 0) {
246
+ throw new Error("Card asset kit id must be non-empty.");
247
+ }
248
+ const lexicalRoot = resolve(root);
249
+ let lexicalRootStats;
250
+ try {
251
+ lexicalRootStats = await lstat(lexicalRoot);
252
+ }
253
+ catch (error) {
254
+ throw new Error(`Card asset kit root does not exist: ${lexicalRoot}`, { cause: error });
255
+ }
256
+ if (lexicalRootStats.isSymbolicLink()) {
257
+ throw new Error(`Card asset kit root must not be a symlink: ${lexicalRoot}`);
258
+ }
259
+ if (!lexicalRootStats.isDirectory()) {
260
+ throw new Error(`Card asset kit root must be a directory: ${lexicalRoot}`);
261
+ }
262
+ let canonicalRoot;
263
+ try {
264
+ canonicalRoot = await realpath(lexicalRoot);
265
+ }
266
+ catch (error) {
267
+ throw new Error(`Card asset kit root does not exist: ${lexicalRoot}`, { cause: error });
268
+ }
269
+ let revalidatedLexicalRootStats;
270
+ try {
271
+ revalidatedLexicalRootStats = await lstat(lexicalRoot);
272
+ }
273
+ catch (error) {
274
+ throw new Error(`Card asset kit root changed during registration: ${lexicalRoot}`, {
275
+ cause: error,
276
+ });
277
+ }
278
+ if (revalidatedLexicalRootStats.isSymbolicLink()) {
279
+ throw new Error(`Card asset kit root must not be a symlink: ${lexicalRoot}`);
280
+ }
281
+ if (!revalidatedLexicalRootStats.isDirectory() ||
282
+ revalidatedLexicalRootStats.dev !== lexicalRootStats.dev ||
283
+ revalidatedLexicalRootStats.ino !== lexicalRootStats.ino) {
284
+ throw new Error(`Card asset kit root changed during registration: ${lexicalRoot}`);
285
+ }
286
+ const rootStats = await stat(canonicalRoot);
287
+ if (!rootStats.isDirectory()) {
288
+ throw new Error(`Card asset kit root must be a directory: ${lexicalRoot}`);
289
+ }
290
+ const existing = this.#kitsById.get(kitId);
291
+ if (existing !== undefined) {
292
+ if (existing.realRoot !== canonicalRoot) {
293
+ throw new Error(`Card asset kit ${JSON.stringify(kitId)} is already registered.`);
294
+ }
295
+ return existing.public;
296
+ }
297
+ let token;
298
+ do {
299
+ token = randomBytes(OPAQUE_TOKEN_BYTES).toString("hex");
300
+ } while (this.#kitsByToken.has(token));
301
+ const routePrefix = `/k/${token}`;
302
+ const publicKit = Object.freeze({
303
+ kitId,
304
+ token,
305
+ routePrefix,
306
+ hostname: this.address,
307
+ authority: this.#authority,
308
+ origin: this.#origin,
309
+ urlFor: (path) => `${this.#origin}${routePrefix}/${encodeLogicalPath(path)}`,
310
+ });
311
+ const registered = {
312
+ public: publicKit,
313
+ lexicalRoot,
314
+ realRoot: canonicalRoot,
315
+ };
316
+ this.#kitsById.set(kitId, registered);
317
+ this.#kitsByToken.set(token, registered);
318
+ return publicKit;
319
+ }
320
+ getKit(kitId) {
321
+ return this.#kitsById.get(kitId)?.public;
322
+ }
323
+ frameOrigins() {
324
+ return this.#frameOrigins;
325
+ }
326
+ close() {
327
+ if (this.#closePromise !== undefined)
328
+ return this.#closePromise;
329
+ this.#closed = true;
330
+ this.#closePromise = new Promise((resolveClose, rejectClose) => {
331
+ if (!this.#server.listening) {
332
+ resolveClose();
333
+ return;
334
+ }
335
+ this.#server.close((error) => {
336
+ if (error !== undefined)
337
+ rejectClose(error);
338
+ else
339
+ resolveClose();
340
+ });
341
+ this.#server.closeAllConnections();
342
+ });
343
+ return this.#closePromise;
344
+ }
345
+ async #serve(req, res) {
346
+ const authority = req.headers.host?.toLowerCase();
347
+ if (authority !== this.#authority) {
348
+ sendEmpty(res, 421);
349
+ return;
350
+ }
351
+ if (req.method !== "GET" && req.method !== "HEAD") {
352
+ sendEmpty(res, 405, { allow: "GET, HEAD" });
353
+ return;
354
+ }
355
+ const segments = decodeRequestPath(req.url);
356
+ if (segments === null) {
357
+ sendEmpty(res, 400);
358
+ return;
359
+ }
360
+ if (segments.length < 3 || segments[0] !== "k") {
361
+ sendEmpty(res, 404);
362
+ return;
363
+ }
364
+ const kit = this.#kitsByToken.get(segments[1]);
365
+ if (kit === undefined) {
366
+ sendEmpty(res, 404);
367
+ return;
368
+ }
369
+ const assetSegments = segments.slice(2);
370
+ const lexicalFile = resolve(kit.lexicalRoot, ...assetSegments);
371
+ if (!isContained(kit.lexicalRoot, lexicalFile)) {
372
+ sendEmpty(res, 400);
373
+ return;
374
+ }
375
+ let canonicalFile;
376
+ try {
377
+ canonicalFile = await realpath(lexicalFile);
378
+ }
379
+ catch (error) {
380
+ if (isExpectedFileError(error)) {
381
+ sendEmpty(res, 404);
382
+ return;
383
+ }
384
+ throw error;
385
+ }
386
+ if (!isContained(kit.realRoot, canonicalFile)) {
387
+ sendEmpty(res, 404);
388
+ return;
389
+ }
390
+ let file;
391
+ try {
392
+ file = await open(canonicalFile, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
393
+ }
394
+ catch (error) {
395
+ if (isExpectedFileError(error)) {
396
+ sendEmpty(res, 404);
397
+ return;
398
+ }
399
+ throw error;
400
+ }
401
+ try {
402
+ const fileStats = await file.stat();
403
+ if (!fileStats.isFile()) {
404
+ sendEmpty(res, 404);
405
+ return;
406
+ }
407
+ // Re-resolve the requested path after opening it and require that the
408
+ // name still identifies the same regular file. This narrows the window
409
+ // in which an intermediate directory or final path can be swapped
410
+ // between the initial realpath check and the open operation.
411
+ let postOpenCanonicalFile;
412
+ let postOpenStats;
413
+ try {
414
+ postOpenCanonicalFile = await realpath(lexicalFile);
415
+ if (!isContained(kit.realRoot, postOpenCanonicalFile)) {
416
+ sendEmpty(res, 404);
417
+ return;
418
+ }
419
+ postOpenStats = await stat(postOpenCanonicalFile);
420
+ }
421
+ catch (error) {
422
+ if (isExpectedFileError(error)) {
423
+ sendEmpty(res, 404);
424
+ return;
425
+ }
426
+ throw error;
427
+ }
428
+ if (!postOpenStats.isFile() ||
429
+ postOpenStats.dev !== fileStats.dev ||
430
+ postOpenStats.ino !== fileStats.ino) {
431
+ sendEmpty(res, 404);
432
+ return;
433
+ }
434
+ const contentType = contentTypeFor(lexicalFile);
435
+ if (contentType.startsWith("text/html")) {
436
+ const bytes = await file.readFile();
437
+ const commonHeaders = {
438
+ ...CARD_RESPONSE_HEADERS,
439
+ "content-security-policy": cardCsp(bytes.toString("utf8")),
440
+ "content-type": contentType,
441
+ "content-length": String(bytes.length),
442
+ };
443
+ res.writeHead(200, commonHeaders);
444
+ if (req.method === "HEAD")
445
+ res.end();
446
+ else
447
+ res.end(bytes);
448
+ return;
449
+ }
450
+ const commonHeaders = {
451
+ ...CARD_RESPONSE_HEADERS,
452
+ "content-security-policy": NO_INLINE_CARD_CSP,
453
+ "content-type": contentType,
454
+ };
455
+ if (req.method === "HEAD") {
456
+ res.writeHead(200, { ...commonHeaders, "content-length": String(fileStats.size) });
457
+ res.end();
458
+ return;
459
+ }
460
+ res.writeHead(200, { ...commonHeaders, "content-length": String(fileStats.size) });
461
+ await pipeline(file.createReadStream({ autoClose: false }), res);
462
+ }
463
+ finally {
464
+ await file.close();
465
+ }
466
+ }
467
+ }
468
+ /**
469
+ * Start a process-scoped, loopback-only card asset broker.
470
+ *
471
+ * The promise resolves only after the concrete port is known, so callers can
472
+ * safely publish each registration's exact `origin` in MCP App CSP metadata.
473
+ */
474
+ export async function startCardAssetBroker(options = {}) {
475
+ const broker = new LoopbackCardAssetBroker();
476
+ await broker.start(requestedPort(options));
477
+ return broker;
478
+ }
479
+ //# sourceMappingURL=card-asset-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-asset-broker.js","sourceRoot":"","sources":["../../src/ui/card-asset-broker.ts"],"names":[],"mappings":"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"}