@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,146 @@
1
+ /**
2
+ * MCP tool: plan (M1-07).
3
+ *
4
+ * The single user-visible permission grant that locks `writes`, `deletes`,
5
+ * and `localDir`. Returns a `planId` that downstream write/delete calls must
6
+ * present. Without a valid `planId`, those verbs are rejected.
7
+ *
8
+ * Input: { kitId: string, writes: string[], deletes?: string[], localDir?: string }
9
+ * Output: { planId: string }
10
+ */
11
+ import { stat } from "node:fs/promises";
12
+ import { resolve } from "node:path";
13
+ import { z } from "zod";
14
+ import { createPlan, TooManyWritesError, TooComplexGlobError, MAX_WRITES, MAX_WILDCARDS, } from "../plans/index.js";
15
+ /** Input schema for plan (Zod v4). */
16
+ const inputSchema = {
17
+ kitId: z.string().min(1).describe("The kit ID to create a plan for."),
18
+ // Intentionally NOT `.max(MAX_WRITES)`: a schema-level cap makes the MCP SDK
19
+ // reject oversized arrays at the protocol layer with a generic, non-JSON
20
+ // "MCP error ..." string — before the handler below runs. That would bypass
21
+ // the structured `TooManyWritesError` JSON payload (AC3) and its audit-log
22
+ // line (AC10). `createPlan()` enforces the same limit at runtime instead, so
23
+ // the handler's own try/catch owns the response shape.
24
+ writes: z
25
+ .array(z.string())
26
+ .describe(`Array of glob patterns for files that will be written (max ${MAX_WRITES} patterns, ≤${MAX_WILDCARDS} wildcards each).`),
27
+ deletes: z
28
+ .array(z.string())
29
+ .optional()
30
+ .describe("Optional array of glob patterns for files that will be deleted."),
31
+ localDir: z
32
+ .string()
33
+ .optional()
34
+ .describe("Optional local directory path that uploads may read from. Defaults to current working directory."),
35
+ };
36
+ /** Output schema for plan (Zod v4 raw shape) — declared alongside the
37
+ * `structuredContent` return so `tools/list` advertises it, matching the
38
+ * repo-wide convention (see list_kits.ts, get_project.ts, bind_kit.ts). */
39
+ const outputSchema = {
40
+ planId: z
41
+ .string()
42
+ .describe("The plan ID that downstream write_files/delete_files calls must present."),
43
+ };
44
+ /**
45
+ * Register the `mcp__genie__plan` tool on the given MCP server.
46
+ */
47
+ export function registerPlan(server) {
48
+ server.registerTool("mcp__genie__plan", {
49
+ title: "Plan",
50
+ description: "Lock write/delete patterns and localDir for a kit. Returns a planId " +
51
+ "that must be presented to write_files/delete_files. " +
52
+ "Plans expire after 1h of inactivity. Reach for this after conjure/refine returns " +
53
+ "files you want to persist — plan first, then write_files (or delete_files) with " +
54
+ "the returned planId.",
55
+ inputSchema,
56
+ outputSchema,
57
+ }, async ({ kitId, writes, deletes = [], localDir, }) => {
58
+ // Default localDir to cwd
59
+ const resolvedLocalDir = localDir ? resolve(localDir) : process.cwd();
60
+ // Validate that localDir exists AND is a directory. AC5 requires "an
61
+ // existing directory" — a plain existence check would also accept a
62
+ // regular file, silently creating a plan whose localDir is unusable.
63
+ let localDirStat;
64
+ try {
65
+ localDirStat = await stat(resolvedLocalDir);
66
+ }
67
+ catch {
68
+ localDirStat = null;
69
+ }
70
+ if (!localDirStat || !localDirStat.isDirectory()) {
71
+ return {
72
+ isError: true,
73
+ content: [
74
+ {
75
+ type: "text",
76
+ text: JSON.stringify({
77
+ error: "InvalidLocalDir",
78
+ message: `Local directory "${resolvedLocalDir}" does not exist or is not a directory.`,
79
+ }),
80
+ },
81
+ ],
82
+ };
83
+ }
84
+ try {
85
+ const state = await createPlan(kitId, writes, deletes, resolvedLocalDir);
86
+ // Emit audit log line. MUST go to stderr, never stdout: on the stdio
87
+ // transport (the default when a harness pipes JSON-RPC — see
88
+ // transport.ts), stdout *is* the protocol stream, and a stray
89
+ // console.log line there corrupts every client's message framing.
90
+ process.stderr.write(JSON.stringify({
91
+ event: "plan.created",
92
+ kitId,
93
+ planId: state.planId,
94
+ writeCount: writes.length,
95
+ deleteCount: deletes.length,
96
+ timestamp: state.createdAt,
97
+ }) + "\n");
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: JSON.stringify({ planId: state.planId }),
103
+ },
104
+ ],
105
+ structuredContent: { planId: state.planId },
106
+ };
107
+ }
108
+ catch (err) {
109
+ if (err instanceof TooManyWritesError) {
110
+ return {
111
+ isError: true,
112
+ content: [
113
+ {
114
+ type: "text",
115
+ text: JSON.stringify({
116
+ error: "TooManyWritesError",
117
+ message: err.message,
118
+ count: err.count,
119
+ max: MAX_WRITES,
120
+ }),
121
+ },
122
+ ],
123
+ };
124
+ }
125
+ if (err instanceof TooComplexGlobError) {
126
+ return {
127
+ isError: true,
128
+ content: [
129
+ {
130
+ type: "text",
131
+ text: JSON.stringify({
132
+ error: "TooComplexGlobError",
133
+ message: err.message,
134
+ pattern: err.pattern,
135
+ wildcardCount: err.wildcardCount,
136
+ max: MAX_WILDCARDS,
137
+ }),
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ throw err; // unexpected errors bubble up as MCP internal errors
143
+ }
144
+ });
145
+ }
146
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,289 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type Manifest } from "../manifest/index.js";
3
+ import { type TransportKind } from "../transport.js";
4
+ import type { CardAssetBroker } from "../ui/card-asset-broker.js";
5
+ import { type EmbeddedManifest, type PreviewReader } from "../ui/grid-resource.js";
6
+ export declare const PREVIEW_TOOL_NAME = "mcp__genie__preview";
7
+ /**
8
+ * Vite dev-server default port. Duplicated as a local literal (rather than
9
+ * imported from `@ambitresearch/genie-viewer`) so this module carries no build-time edge to
10
+ * the viewer package — the whole point of the lazy boot seam below. Kept in
11
+ * sync with `@ambitresearch/genie-viewer`'s `DEFAULT_VIEWER_PORT` (RFC §6.9/§14).
12
+ */
13
+ export declare const DEFAULT_VIEWER_PORT = 5173;
14
+ /**
15
+ * The MCP Apps extension identifier (ext-apps spec 2026-01-26, "Client<>Server
16
+ * Capability Negotiation"): a host that renders `ui://` app resources
17
+ * advertises `capabilities.extensions["io.modelcontextprotocol/ui"]` in its
18
+ * `initialize` request, with `mimeTypes` naming the profiles it can render.
19
+ */
20
+ export declare const UI_EXTENSION_ID = "io.modelcontextprotocol/ui";
21
+ /** The MCP-Apps HTML profile the grid resource serves (spec §Resource Discovery). */
22
+ export declare const MCP_APP_MIME = "text/html;profile=mcp-app";
23
+ /** Widget-only tool-result metadata carrying CSP-authorized card routes. */
24
+ export declare const PREVIEW_EMBEDDED_MANIFEST_META_KEY = "genie/embeddedManifest";
25
+ /**
26
+ * Authoritative `ui://` capability check: true when the client's `initialize`
27
+ * capabilities carry the MCP Apps extension with a `mimeTypes` array that
28
+ * includes {@link MCP_APP_MIME}. This is the spec-defined negotiation. `caps`
29
+ * is typed `unknown` because the SDK's `ClientCapabilities` models
30
+ * `extensions` as a passthrough bag — every level is checked defensively.
31
+ */
32
+ export declare function hasUiExtensionCapability(caps: unknown): boolean;
33
+ /**
34
+ * Resolve MCP Apps negotiation without collapsing "not advertised" and
35
+ * "explicitly not supported." A missing `extensions` mechanism returns
36
+ * `undefined`. This is distinct from an explicit negative because metadata-linked
37
+ * MCP Apps hosts may omit the extension capability even when they advertise
38
+ * unrelated extensions. Only a present UI extension with a malformed or
39
+ * unsupported MIME declaration is a negotiated negative.
40
+ */
41
+ export declare function getUiExtensionCapability(caps: unknown): boolean | undefined;
42
+ export interface ResourceUriParams {
43
+ kitId: string;
44
+ componentName?: string;
45
+ group?: string;
46
+ }
47
+ /**
48
+ * Build the `ui://genie/grid?…` resource URI (AC3/AC4). The query string always
49
+ * carries `kitId` and appends the optional `componentName` / `group` filters in
50
+ * a STABLE order (kitId → componentName → group) so the URI — and thus the
51
+ * resource M4-06 resolves and any cache keyed on it — is deterministic for a
52
+ * given argument set. Values are percent-encoded via `URLSearchParams`.
53
+ */
54
+ export declare function buildResourceUri(params: ResourceUriParams): string;
55
+ /** A `kitId` that fails the shared `KIT_ID_PATTERN` shape (traversal guard). */
56
+ export declare class InvalidKitIdError extends Error {
57
+ readonly kitId: string;
58
+ readonly code = "InvalidKitIdError";
59
+ constructor(kitId: string);
60
+ }
61
+ /** A well-formed kitId that does not identify an existing kit directory. */
62
+ export declare class KitNotFoundError extends Error {
63
+ readonly kitId: string;
64
+ readonly code = "KitNotFoundError";
65
+ constructor(kitId: string);
66
+ }
67
+ /**
68
+ * Resolve a `kitId` to its on-disk kit directory under `kitsRoot`, rejecting
69
+ * any id that isn't a well-formed slug BEFORE the `join` — an unvalidated id
70
+ * like `../../etc` would otherwise escape the kits root (RFC §10 T-13, the same
71
+ * traversal class `write_files`/`read_file` guard). Only shape is checked here;
72
+ * Existence is checked by {@link runPreview} before compilation so a missing
73
+ * slug cannot create a phantom kit through manifest persistence.
74
+ */
75
+ export declare function resolveKitDir(kitsRoot: string, kitId: string): string;
76
+ /** A request to boot (or reuse) a viewer for one kit directory. */
77
+ export interface BootRequest {
78
+ /** Absolute kit directory the viewer serves as its Vite root. */
79
+ kitDir: string;
80
+ /** Requested dev-server port; the booter may fall back to the next free one. */
81
+ port?: number;
82
+ /**
83
+ * Whether the booter should open its unfiltered base URL on first boot.
84
+ * On its local path, {@link runPreview} boots or reuses with `false`, adds the
85
+ * requested component and group filters, then calls
86
+ * {@link ViewerRegistry.open} with that exact target when harness policy
87
+ * allows browser fallback. This option remains available to direct
88
+ * registry/booter callers that explicitly want the base URL opened during
89
+ * boot.
90
+ * Undefined is treated as `false` (a booter that never opens is always safe).
91
+ */
92
+ open?: boolean;
93
+ }
94
+ /** A running viewer the registry hands back to the tool. */
95
+ export interface BootedViewer {
96
+ /** The browsable preview URL (what the text content advertises). */
97
+ url: string;
98
+ /** The port the viewer actually bound. */
99
+ port: number;
100
+ /** Best-effort browser open for this already-running viewer. */
101
+ open: (target?: string) => Promise<void>;
102
+ /** Tear the viewer down (used by {@link ViewerRegistry.closeAll}). */
103
+ close: () => Promise<void>;
104
+ }
105
+ /** Boots a viewer for a kit dir, or rejects if it cannot (→ AC6 fallback). */
106
+ export type ViewerBooter = (req: BootRequest) => Promise<BootedViewer>;
107
+ /**
108
+ * Caches one running viewer per kit directory so repeated `preview` calls reuse
109
+ * it instead of booting a fresh Vite each time (AC5). Keyed on the resolved kit
110
+ * dir; concurrent calls for the same dir share ONE in-flight boot (the promise
111
+ * is cached, not just the resolved value). A boot that REJECTS is evicted so a
112
+ * later call retries rather than replaying the dead promise forever.
113
+ */
114
+ export declare class ViewerRegistry {
115
+ private readonly booter;
116
+ private readonly viewers;
117
+ constructor(booter: ViewerBooter);
118
+ private queueBrowserOpen;
119
+ /**
120
+ * Return the viewer for `kitDir`, booting it on first request. Subsequent
121
+ * calls for the same dir return the cached (in-flight or resolved) promise.
122
+ *
123
+ * Booting and browser opening are tracked separately. Direct callers can use
124
+ * `open:true` for the base URL, while {@link runPreview}'s local path boots or
125
+ * reuses headlessly and calls {@link ViewerRegistry.open} after constructing
126
+ * its filtered target. Repeated requests for the same target share one
127
+ * promise; a changed filter target is opened again so the requested component
128
+ * is not hidden behind an older tab.
129
+ */
130
+ ensure(kitDir: string, port?: number, open?: boolean): Promise<BootedViewer>;
131
+ open(kitDir: string, target: string): Promise<void>;
132
+ /** Tear down every booted viewer (best-effort). For clean shutdown/tests. */
133
+ closeAll(): Promise<void>;
134
+ }
135
+ /**
136
+ * The default `ViewerBooter`. Lazily loads `@ambitresearch/genie-viewer` and boots its Vite
137
+ * dev server against the kit dir and honors {@link BootRequest.open} for direct
138
+ * callers. On its local path, {@link runPreview} deliberately passes `false`,
139
+ * constructs the filter-bearing viewer URL, and invokes
140
+ * {@link ViewerRegistry.open} separately so browser fallback never opens the
141
+ * unfiltered base URL. Absent → `false` (never opens), preserving the safe
142
+ * headless default.
143
+ * ALL of the viewer's own stdout is routed to STDERR — on the stdio transport
144
+ * the tool's stdout is the JSON-RPC stream, so the viewer's `Preview:` banner
145
+ * would corrupt framing if left on stdout.
146
+ */
147
+ export declare const defaultViewerBooter: ViewerBooter;
148
+ /** Injected collaborators for {@link runPreview} (kits location + viewer cache). */
149
+ export interface PreviewDeps {
150
+ kitsRoot: string;
151
+ registry: ViewerRegistry;
152
+ /**
153
+ * Process env consulted for the `GENIE_PREVIEW_NO_OPEN` opt-out (piece B).
154
+ * Injectable so tests can drive the auto-open branch without mutating the real
155
+ * `process.env`. Defaults to `process.env` at registration time.
156
+ */
157
+ env?: NodeJS.ProcessEnv;
158
+ /** Manifest compiler seam; production uses the shared compile-and-persist helper. */
159
+ ensureManifest?: (kitDir: string) => Promise<Manifest>;
160
+ /** Preview reader used to build the self-contained app result. */
161
+ readPreviewBytes?: PreviewReader;
162
+ /** Optional separate-origin previews host for embedded manifest card URLs. */
163
+ previewsBaseUrl?: string;
164
+ /**
165
+ * Lazily resolves the process-scoped local card broker. It is consulted only
166
+ * for a local MCP Apps-capable host, so tools-only clients never start the
167
+ * listener merely because the preview tool was registered.
168
+ */
169
+ getCardAssetBroker?: () => Promise<CardAssetBroker>;
170
+ }
171
+ /** The three-field tool input (AC2). */
172
+ export interface PreviewArgs {
173
+ kitId: string;
174
+ componentName?: string;
175
+ group?: string;
176
+ }
177
+ /** Per-request context sniffed off the wire (AC7). */
178
+ export interface PreviewContext {
179
+ clientName?: string;
180
+ /**
181
+ * Tri-state MCP Apps negotiation from `initialize`: true/false are
182
+ * authoritative, while undefined means the client omitted the extension and
183
+ * should receive the metadata-linked app before any browser fallback.
184
+ */
185
+ uiCapable?: boolean;
186
+ /** Active server transport; HTTP suppresses server-machine browser opening. */
187
+ transportKind?: TransportKind;
188
+ /** Whether the viewer URL is reachable by the MCP client host. */
189
+ locality?: PreviewLocality;
190
+ }
191
+ export type PreviewLocality = "local" | "remote";
192
+ /**
193
+ * The tool's return shape (AC3): text URLs + the ui:// resource pointer.
194
+ *
195
+ * `_meta` carries the resource pointer under TWO keys so both app ecosystems
196
+ * link the result to the same `ui://genie/grid` widget:
197
+ * - `ui.resourceUri` — the portable MCP Apps standard, including current
198
+ * ChatGPT Apps SDK guidance.
199
+ * - `openai/outputTemplate` — the ChatGPT compatibility alias (M4-06 AC6,
200
+ * research report §3.4 cross-vendor note). Both carry the same URI.
201
+ */
202
+ export interface PreviewResult {
203
+ content: {
204
+ type: "text";
205
+ text: string;
206
+ }[];
207
+ /**
208
+ * Model-visible tool state. The host also forwards it to the rendered app via
209
+ * `ui/notifications/tool-result`, but route-bearing card data belongs in
210
+ * result `_meta`, which MCP Apps keeps out of model context.
211
+ */
212
+ structuredContent: {
213
+ kitId: string;
214
+ componentName?: string;
215
+ group?: string;
216
+ /** The live Vite viewer URL when it booted; absent on local file/inline fallbacks. */
217
+ viewerUrl?: string;
218
+ /** Local-only fallback; omitted from remote results to avoid leaking server paths. */
219
+ fileUrl?: string;
220
+ transportKind?: TransportKind;
221
+ locality: PreviewLocality;
222
+ embeddedError?: string;
223
+ };
224
+ _meta: {
225
+ ui: {
226
+ resourceUri: string;
227
+ };
228
+ "openai/outputTemplate": string;
229
+ "genie/embeddedManifest"?: EmbeddedManifest;
230
+ };
231
+ }
232
+ /**
233
+ * True when the operator has opted OUT of preview's server-side browser
234
+ * auto-open by setting `GENIE_PREVIEW_NO_OPEN` to a truthy value (design
235
+ * 2026-07-05, piece B — auto-open is opt-OUT, on by default for non-`ui://`
236
+ * hosts). Any non-empty value other than `0`/`false` (case-insensitive) counts
237
+ * as set, so `GENIE_PREVIEW_NO_OPEN=1`, `=true`, `=yes` all disable it.
238
+ */
239
+ export declare function autoOpenDisabledByEnv(env?: NodeJS.ProcessEnv): boolean;
240
+ /**
241
+ * Decide whether {@link runPreview} should ask the booter to open a browser.
242
+ * Only an explicit negotiated negative authorizes auto-open. An omitted
243
+ * capability is ambiguous (Codex Desktop and tools-only Codex currently look
244
+ * identical to a custom MCP server), so it receives a viewer URL but never a
245
+ * surprise system-browser launch.
246
+ */
247
+ export declare function shouldAutoOpen(uiCapable: boolean | undefined, env?: NodeJS.ProcessEnv, transportKind?: TransportKind): boolean;
248
+ /**
249
+ * Core `preview` logic (exported for direct unit testing without the MCP
250
+ * transport). Compiles + persists the kit's manifest (piece A) so all three
251
+ * vehicles render real cards, resolves the kit dir, tries to boot/reuse the
252
+ * viewer — opening a browser server-side for non-`ui://` hosts (piece B) — and
253
+ * builds the text summary: the live URL when the viewer is up (AC5), else a
254
+ * `file://` fallback (AC6). `_meta.ui.resourceUri` is emitted either way
255
+ * (AC3/AC4), and one `preview.request` line is logged recording the client and
256
+ * its `ui://` support (AC7). Remote results never expose server-local file
257
+ * paths; a failed local viewer can deliver a CSP-safe manifest to an MCP App
258
+ * when a previews origin is configured.
259
+ */
260
+ export declare function runPreview(deps: PreviewDeps, args: PreviewArgs, ctx: PreviewContext): Promise<PreviewResult>;
261
+ /** Options for {@link registerPreviewTool}. `booter` defaults to the lazy one. */
262
+ export interface PreviewToolOptions {
263
+ kitsRoot: string;
264
+ /** Injectable for tests; production uses {@link defaultViewerBooter}. */
265
+ booter?: ViewerBooter;
266
+ /** Injectable env for the `GENIE_PREVIEW_NO_OPEN` opt-out; defaults to `process.env`. */
267
+ env?: NodeJS.ProcessEnv;
268
+ /** Injectable manifest seam for tests. */
269
+ ensureManifest?: (kitDir: string) => Promise<Manifest>;
270
+ /** Injectable preview-byte seam for self-contained app results. */
271
+ readPreviewBytes?: PreviewReader;
272
+ /** Optional separate-origin previews host used in embedded manifests. */
273
+ previewsBaseUrl?: string;
274
+ /** Lazy process-scoped card broker for local MCP Apps-capable hosts. */
275
+ getCardAssetBroker?: () => Promise<CardAssetBroker>;
276
+ /** Explicit transport override for embedded servers and tests. */
277
+ transportKind?: TransportKind;
278
+ /** Explicit deployment locality for embedded servers and tests. */
279
+ locality?: PreviewLocality;
280
+ }
281
+ /**
282
+ * Register `mcp__genie__preview`. One {@link ViewerRegistry} is created per
283
+ * registration and shared across every call so viewers are reused (AC5). The
284
+ * handler resolves the client's identity (per-request `_meta` escape hatch,
285
+ * else the initialize handshake) and its MCP Apps capability, then delegates
286
+ * to {@link runPreview}.
287
+ */
288
+ export declare function registerPreviewTool(server: McpServer, options: PreviewToolOptions): ViewerRegistry;
289
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/tools/preview.ts"],"names":[],"mappings":"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"}