@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.
- package/README.md +15 -0
- package/dist/auth/bearer.d.ts +49 -0
- package/dist/auth/bearer.d.ts.map +1 -0
- package/dist/auth/bearer.js +159 -0
- package/dist/auth/bearer.js.map +1 -0
- package/dist/auth/oauth/authorize.d.ts +19 -0
- package/dist/auth/oauth/authorize.d.ts.map +1 -0
- package/dist/auth/oauth/authorize.js +111 -0
- package/dist/auth/oauth/authorize.js.map +1 -0
- package/dist/auth/oauth/config.d.ts +10 -0
- package/dist/auth/oauth/config.d.ts.map +1 -0
- package/dist/auth/oauth/config.js +16 -0
- package/dist/auth/oauth/config.js.map +1 -0
- package/dist/auth/oauth/dcr.d.ts +15 -0
- package/dist/auth/oauth/dcr.d.ts.map +1 -0
- package/dist/auth/oauth/dcr.js +38 -0
- package/dist/auth/oauth/dcr.js.map +1 -0
- package/dist/auth/oauth/jwt.d.ts +13 -0
- package/dist/auth/oauth/jwt.d.ts.map +1 -0
- package/dist/auth/oauth/jwt.js +46 -0
- package/dist/auth/oauth/jwt.js.map +1 -0
- package/dist/auth/oauth/metadata.d.ts +9 -0
- package/dist/auth/oauth/metadata.d.ts.map +1 -0
- package/dist/auth/oauth/metadata.js +19 -0
- package/dist/auth/oauth/metadata.js.map +1 -0
- package/dist/auth/oauth/router.d.ts +32 -0
- package/dist/auth/oauth/router.d.ts.map +1 -0
- package/dist/auth/oauth/router.js +159 -0
- package/dist/auth/oauth/router.js.map +1 -0
- package/dist/auth/oauth/store.d.ts +55 -0
- package/dist/auth/oauth/store.d.ts.map +1 -0
- package/dist/auth/oauth/store.js +63 -0
- package/dist/auth/oauth/store.js.map +1 -0
- package/dist/auth/oauth/token.d.ts +21 -0
- package/dist/auth/oauth/token.d.ts.map +1 -0
- package/dist/auth/oauth/token.js +77 -0
- package/dist/auth/oauth/token.js.map +1 -0
- package/dist/auth/oidc/group-policy.d.ts +43 -0
- package/dist/auth/oidc/group-policy.d.ts.map +1 -0
- package/dist/auth/oidc/group-policy.js +54 -0
- package/dist/auth/oidc/group-policy.js.map +1 -0
- package/dist/auth/oidc/verifier.d.ts +42 -0
- package/dist/auth/oidc/verifier.d.ts.map +1 -0
- package/dist/auth/oidc/verifier.js +145 -0
- package/dist/auth/oidc/verifier.js.map +1 -0
- package/dist/auth/token-cli.d.ts +9 -0
- package/dist/auth/token-cli.d.ts.map +1 -0
- package/dist/auth/token-cli.js +98 -0
- package/dist/auth/token-cli.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +149 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/redact.d.ts +20 -0
- package/dist/config/redact.d.ts.map +1 -0
- package/dist/config/redact.js +77 -0
- package/dist/config/redact.js.map +1 -0
- package/dist/config/secrets.d.ts +100 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +130 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/framework/html.d.ts +103 -0
- package/dist/framework/html.d.ts.map +1 -0
- package/dist/framework/html.js +271 -0
- package/dist/framework/html.js.map +1 -0
- package/dist/framework/interface.d.ts +130 -0
- package/dist/framework/interface.d.ts.map +1 -0
- package/dist/framework/interface.js +112 -0
- package/dist/framework/interface.js.map +1 -0
- package/dist/framework/react.d.ts +133 -0
- package/dist/framework/react.d.ts.map +1 -0
- package/dist/framework/react.js +243 -0
- package/dist/framework/react.js.map +1 -0
- package/dist/framework/vue.d.ts +99 -0
- package/dist/framework/vue.d.ts.map +1 -0
- package/dist/framework/vue.js +375 -0
- package/dist/framework/vue.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/client.d.ts +81 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +141 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/component-response.d.ts +111 -0
- package/dist/llm/component-response.d.ts.map +1 -0
- package/dist/llm/component-response.js +167 -0
- package/dist/llm/component-response.js.map +1 -0
- package/dist/llm/generated-files.d.ts +10 -0
- package/dist/llm/generated-files.d.ts.map +1 -0
- package/dist/llm/generated-files.js +26 -0
- package/dist/llm/generated-files.js.map +1 -0
- package/dist/llm/prompts/CHANGELOG.md +70 -0
- package/dist/llm/prompts/generate-component.system.md +99 -0
- package/dist/llm/prompts/refine-component.system.md +112 -0
- package/dist/llm/prompts.d.ts +66 -0
- package/dist/llm/prompts.d.ts.map +1 -0
- package/dist/llm/prompts.js +78 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/retry.d.ts +183 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +475 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/llm/schema.d.ts +129 -0
- package/dist/llm/schema.d.ts.map +1 -0
- package/dist/llm/schema.js +147 -0
- package/dist/llm/schema.js.map +1 -0
- package/dist/llm/validate.d.ts +107 -0
- package/dist/llm/validate.d.ts.map +1 -0
- package/dist/llm/validate.js +174 -0
- package/dist/llm/validate.js.map +1 -0
- package/dist/manifest/compiler.d.ts +112 -0
- package/dist/manifest/compiler.d.ts.map +1 -0
- package/dist/manifest/compiler.js +306 -0
- package/dist/manifest/compiler.js.map +1 -0
- package/dist/manifest/ensure.d.ts +46 -0
- package/dist/manifest/ensure.d.ts.map +1 -0
- package/dist/manifest/ensure.js +49 -0
- package/dist/manifest/ensure.js.map +1 -0
- package/dist/manifest/index.d.ts +13 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +13 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/middleware/plan-guard.d.ts +167 -0
- package/dist/middleware/plan-guard.d.ts.map +1 -0
- package/dist/middleware/plan-guard.js +190 -0
- package/dist/middleware/plan-guard.js.map +1 -0
- package/dist/plans/index.d.ts +71 -0
- package/dist/plans/index.d.ts.map +1 -0
- package/dist/plans/index.js +252 -0
- package/dist/plans/index.js.map +1 -0
- package/dist/schemas/component.schema.json +114 -0
- package/dist/server.d.ts +96 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +258 -0
- package/dist/server.js.map +1 -0
- package/dist/store/empty-manifest.d.ts +58 -0
- package/dist/store/empty-manifest.d.ts.map +1 -0
- package/dist/store/empty-manifest.js +59 -0
- package/dist/store/empty-manifest.js.map +1 -0
- package/dist/store/git-host.d.ts +120 -0
- package/dist/store/git-host.d.ts.map +1 -0
- package/dist/store/git-host.js +796 -0
- package/dist/store/git-host.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +4 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/interface.d.ts +322 -0
- package/dist/store/interface.d.ts.map +1 -0
- package/dist/store/interface.js +100 -0
- package/dist/store/interface.js.map +1 -0
- package/dist/store/kit-files.d.ts +88 -0
- package/dist/store/kit-files.d.ts.map +1 -0
- package/dist/store/kit-files.js +199 -0
- package/dist/store/kit-files.js.map +1 -0
- package/dist/store/local.d.ts +70 -0
- package/dist/store/local.d.ts.map +1 -0
- package/dist/store/local.js +651 -0
- package/dist/store/local.js.map +1 -0
- package/dist/store/manifest.d.ts +44 -0
- package/dist/store/manifest.d.ts.map +1 -0
- package/dist/store/manifest.js +116 -0
- package/dist/store/manifest.js.map +1 -0
- package/dist/store/viewer-assets.d.ts +20 -0
- package/dist/store/viewer-assets.d.ts.map +1 -0
- package/dist/store/viewer-assets.js +118 -0
- package/dist/store/viewer-assets.js.map +1 -0
- package/dist/sync/anchor.d.ts +125 -0
- package/dist/sync/anchor.d.ts.map +1 -0
- package/dist/sync/anchor.js +210 -0
- package/dist/sync/anchor.js.map +1 -0
- package/dist/sync/index.d.ts +15 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +15 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/orchestrator.d.ts +160 -0
- package/dist/sync/orchestrator.d.ts.map +1 -0
- package/dist/sync/orchestrator.js +288 -0
- package/dist/sync/orchestrator.js.map +1 -0
- package/dist/tools/bind_kit.d.ts +29 -0
- package/dist/tools/bind_kit.d.ts.map +1 -0
- package/dist/tools/bind_kit.js +70 -0
- package/dist/tools/bind_kit.js.map +1 -0
- package/dist/tools/conjure.d.ts +141 -0
- package/dist/tools/conjure.d.ts.map +1 -0
- package/dist/tools/conjure.js +655 -0
- package/dist/tools/conjure.js.map +1 -0
- package/dist/tools/conjure_screen.d.ts +174 -0
- package/dist/tools/conjure_screen.d.ts.map +1 -0
- package/dist/tools/conjure_screen.js +458 -0
- package/dist/tools/conjure_screen.js.map +1 -0
- package/dist/tools/create_kit.d.ts +32 -0
- package/dist/tools/create_kit.d.ts.map +1 -0
- package/dist/tools/create_kit.js +131 -0
- package/dist/tools/create_kit.js.map +1 -0
- package/dist/tools/create_project.d.ts +267 -0
- package/dist/tools/create_project.d.ts.map +1 -0
- package/dist/tools/create_project.js +546 -0
- package/dist/tools/create_project.js.map +1 -0
- package/dist/tools/delete_files.d.ts +93 -0
- package/dist/tools/delete_files.d.ts.map +1 -0
- package/dist/tools/delete_files.js +276 -0
- package/dist/tools/delete_files.js.map +1 -0
- package/dist/tools/delete_project.d.ts +43 -0
- package/dist/tools/delete_project.d.ts.map +1 -0
- package/dist/tools/delete_project.js +118 -0
- package/dist/tools/delete_project.js.map +1 -0
- package/dist/tools/get_kit.d.ts +28 -0
- package/dist/tools/get_kit.d.ts.map +1 -0
- package/dist/tools/get_kit.js +95 -0
- package/dist/tools/get_kit.js.map +1 -0
- package/dist/tools/get_project.d.ts +37 -0
- package/dist/tools/get_project.d.ts.map +1 -0
- package/dist/tools/get_project.js +71 -0
- package/dist/tools/get_project.js.map +1 -0
- package/dist/tools/list_components.d.ts +42 -0
- package/dist/tools/list_components.d.ts.map +1 -0
- package/dist/tools/list_components.js +125 -0
- package/dist/tools/list_components.js.map +1 -0
- package/dist/tools/list_files.d.ts +32 -0
- package/dist/tools/list_files.d.ts.map +1 -0
- package/dist/tools/list_files.js +109 -0
- package/dist/tools/list_files.js.map +1 -0
- package/dist/tools/list_kits.d.ts +14 -0
- package/dist/tools/list_kits.d.ts.map +1 -0
- package/dist/tools/list_kits.js +41 -0
- package/dist/tools/list_kits.js.map +1 -0
- package/dist/tools/list_projects.d.ts +23 -0
- package/dist/tools/list_projects.d.ts.map +1 -0
- package/dist/tools/list_projects.js +66 -0
- package/dist/tools/list_projects.js.map +1 -0
- package/dist/tools/plan.d.ts +16 -0
- package/dist/tools/plan.d.ts.map +1 -0
- package/dist/tools/plan.js +146 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/preview.d.ts +289 -0
- package/dist/tools/preview.d.ts.map +1 -0
- package/dist/tools/preview.js +672 -0
- package/dist/tools/preview.js.map +1 -0
- package/dist/tools/read_file.d.ts +40 -0
- package/dist/tools/read_file.d.ts.map +1 -0
- package/dist/tools/read_file.js +114 -0
- package/dist/tools/read_file.js.map +1 -0
- package/dist/tools/refine.d.ts +220 -0
- package/dist/tools/refine.d.ts.map +1 -0
- package/dist/tools/refine.js +501 -0
- package/dist/tools/refine.js.map +1 -0
- package/dist/tools/validate.d.ts +74 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +224 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/write_files.d.ts +158 -0
- package/dist/tools/write_files.d.ts.map +1 -0
- package/dist/tools/write_files.js +541 -0
- package/dist/tools/write_files.js.map +1 -0
- package/dist/transport.d.ts +77 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +448 -0
- package/dist/transport.js.map +1 -0
- package/dist/ui/card-asset-broker.d.ts +42 -0
- package/dist/ui/card-asset-broker.d.ts.map +1 -0
- package/dist/ui/card-asset-broker.js +479 -0
- package/dist/ui/card-asset-broker.js.map +1 -0
- package/dist/ui/grid-resource.d.ts +252 -0
- package/dist/ui/grid-resource.d.ts.map +1 -0
- package/dist/ui/grid-resource.js +680 -0
- package/dist/ui/grid-resource.js.map +1 -0
- package/dist/ui/viewer-static/index.html +95 -0
- package/dist/ui/viewer-static/viewer.css +451 -0
- package/dist/ui/viewer-static/viewer.js +1405 -0
- package/dist/validate/full-scan.d.ts +87 -0
- package/dist/validate/full-scan.d.ts.map +1 -0
- package/dist/validate/full-scan.js +299 -0
- package/dist/validate/full-scan.js.map +1 -0
- package/dist/validate/index.d.ts +15 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +18 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/marker.d.ts +89 -0
- package/dist/validate/marker.d.ts.map +1 -0
- package/dist/validate/marker.js +87 -0
- package/dist/validate/marker.js.map +1 -0
- package/dist/validate/phash.d.ts +135 -0
- package/dist/validate/phash.d.ts.map +1 -0
- package/dist/validate/phash.js +307 -0
- package/dist/validate/phash.js.map +1 -0
- package/dist/validate/render.d.ts +38 -0
- package/dist/validate/render.d.ts.map +1 -0
- package/dist/validate/render.js +155 -0
- package/dist/validate/render.js.map +1 -0
- package/dist/watch/index.d.ts +12 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/dist/watch/index.js +12 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/watcher.d.ts +65 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +238 -0
- package/dist/watch/watcher.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conjure.js","sourceRoot":"","sources":["../../src/tools/conjure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool: conjure_screen (M1-21).
|
|
3
|
+
*
|
|
4
|
+
* The M1 project-aware generation contract for *screen* artifacts — a screen is
|
|
5
|
+
* a generated / previewed / refined / committed artifact, the same loop as a
|
|
6
|
+
* component but one step up (D-F). This tool owns the M1 slice: resolve which
|
|
7
|
+
* kit the screen is generated against, run the generation client, and record
|
|
8
|
+
* the resulting artifact reference in `.genie/project.json`. The generation
|
|
9
|
+
* *mechanics* (real model call, the validation gauntlet) are deepened by M2
|
|
10
|
+
* behind the same `ScreenGenerator` seam this file introduces (Implementation
|
|
11
|
+
* Notes: "the same generation-client interface later deepened by M2").
|
|
12
|
+
*
|
|
13
|
+
* Input: { projectId, prompt, kitId?, blueprintId?, framework?, model? }
|
|
14
|
+
* Output: { screenId, files: [{ path, content, encoding }], usage }
|
|
15
|
+
*
|
|
16
|
+
* Kit resolution ladder (D-F "Default-kit resolution", PRD DS-026 · AC3):
|
|
17
|
+
* 1. explicit — caller named `kitId` → use it (validated to exist)
|
|
18
|
+
* 2. default — the project's `defaultKitId` → use it
|
|
19
|
+
* 3. sole — exactly one reachable binding → use it
|
|
20
|
+
* 4. none / ambiguous → for a kit-specific prompt, STOP with
|
|
21
|
+
* `ERR_PROJECT_KIT_REQUIRED` (never invent a kit, AC4); for a basic-structure
|
|
22
|
+
* prompt, generate a framework-neutral scaffold that does not pretend it
|
|
23
|
+
* used a kit (AC5).
|
|
24
|
+
*/
|
|
25
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
26
|
+
import { z } from "zod";
|
|
27
|
+
import type { ProjectDetail, ProjectScreen, RecordScreenInput } from "./create_project.js";
|
|
28
|
+
import type { KitStore } from "../store/interface.js";
|
|
29
|
+
export declare const CONJURE_SCREEN_TOOL_NAME = "mcp__genie__conjure_screen";
|
|
30
|
+
/** Target framework for the generated screen artifact (RFC §9.19). */
|
|
31
|
+
export declare const SCREEN_FRAMEWORKS: readonly ["react", "vue", "html"];
|
|
32
|
+
export type ScreenFramework = (typeof SCREEN_FRAMEWORKS)[number];
|
|
33
|
+
/**
|
|
34
|
+
* Input schema (RFC §9.19). `prompt` is bounded (8..8192) so a stray empty
|
|
35
|
+
* string or a megabyte paste can't reach the generator; `framework` defaults to
|
|
36
|
+
* `react`; `model` is an opaque routing hint (default `design-default`) the M1
|
|
37
|
+
* local generator ignores and M2 forwards to the configured endpoint.
|
|
38
|
+
*/
|
|
39
|
+
declare const conjureScreenArgsSchema: z.ZodObject<{
|
|
40
|
+
projectId: z.ZodString;
|
|
41
|
+
prompt: z.ZodString;
|
|
42
|
+
kitId: z.ZodOptional<z.ZodString>;
|
|
43
|
+
blueprintId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
framework: z.ZodDefault<z.ZodEnum<{
|
|
45
|
+
react: "react";
|
|
46
|
+
vue: "vue";
|
|
47
|
+
html: "html";
|
|
48
|
+
}>>;
|
|
49
|
+
model: z.ZodDefault<z.ZodString>;
|
|
50
|
+
}, z.core.$strict>;
|
|
51
|
+
export type ConjureScreenArgs = z.infer<typeof conjureScreenArgsSchema>;
|
|
52
|
+
/** How the effective kit was resolved — surfaced so generation can be *honest*
|
|
53
|
+
* about provenance rather than silently guessing (D-F step 3: "use it, and name
|
|
54
|
+
* which"). */
|
|
55
|
+
export type KitResolutionVia = "explicit" | "default" | "sole";
|
|
56
|
+
/** The kit a screen is generated against, plus how it was chosen. `null` marks a
|
|
57
|
+
* deliberately kitless (framework-neutral) generation. */
|
|
58
|
+
export interface ResolvedKit {
|
|
59
|
+
kitId: string;
|
|
60
|
+
via: KitResolutionVia;
|
|
61
|
+
}
|
|
62
|
+
/** A single generated artifact file. `encoding` is carried explicitly (RFC
|
|
63
|
+
* §9.19) so a future binary artifact (an image, a font) round-trips losslessly
|
|
64
|
+
* rather than being assumed UTF-8. */
|
|
65
|
+
export interface GeneratedFile {
|
|
66
|
+
path: string;
|
|
67
|
+
content: string;
|
|
68
|
+
encoding: "utf-8" | "base64";
|
|
69
|
+
}
|
|
70
|
+
/** Token/cost accounting for one generation (RFC `UsageInfo`). The M1 local
|
|
71
|
+
* generator reports all-zero — it makes no model call, and saying so honestly is
|
|
72
|
+
* the point (AC8: no real model call in CI). */
|
|
73
|
+
export interface UsageInfo {
|
|
74
|
+
promptTokens: number;
|
|
75
|
+
completionTokens: number;
|
|
76
|
+
totalTokens: number;
|
|
77
|
+
costUsd?: number;
|
|
78
|
+
}
|
|
79
|
+
/** What the tool hands the generator: the fully-resolved generation context. The
|
|
80
|
+
* tool owns id + path layout so the recorded manifest entry and the returned
|
|
81
|
+
* files can never disagree; the generator only fills in file *contents* + usage. */
|
|
82
|
+
export interface ScreenGenerationRequest {
|
|
83
|
+
projectId: string;
|
|
84
|
+
screenId: string;
|
|
85
|
+
/** Primary artifact path the tool has reserved (e.g. `screens/<id>/index.tsx`). */
|
|
86
|
+
entryPath: string;
|
|
87
|
+
prompt: string;
|
|
88
|
+
framework: ScreenFramework;
|
|
89
|
+
model: string;
|
|
90
|
+
/** The resolved kit, or `null` for a framework-neutral scaffold (AC5). */
|
|
91
|
+
kit: ResolvedKit | null;
|
|
92
|
+
/** Blueprint this screen was seeded from, if any (AC6). */
|
|
93
|
+
blueprint?: {
|
|
94
|
+
id: string;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export interface ScreenGenerationResult {
|
|
98
|
+
files: GeneratedFile[];
|
|
99
|
+
usage: UsageInfo;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The generation seam. M1 ships `LocalScaffoldScreenGenerator` (deterministic,
|
|
103
|
+
* offline). M2 swaps in a client that calls the configured OpenAI-compatible
|
|
104
|
+
* endpoint and runs the validation gauntlet — same interface, no tool change.
|
|
105
|
+
*/
|
|
106
|
+
export interface ScreenGenerator {
|
|
107
|
+
generate(request: ScreenGenerationRequest): Promise<ScreenGenerationResult>;
|
|
108
|
+
}
|
|
109
|
+
/** Narrow project port `conjure_screen` needs — resolve detail + record the
|
|
110
|
+
* screen. `ProjectStore` (create_project.ts) satisfies this structurally, the
|
|
111
|
+
* same pattern `get_project`/`bind_kit` use. */
|
|
112
|
+
export interface ConjureScreenProjectStore {
|
|
113
|
+
getProject(projectId: string): Promise<ProjectDetail>;
|
|
114
|
+
recordScreen(input: {
|
|
115
|
+
projectId: string;
|
|
116
|
+
screen: RecordScreenInput;
|
|
117
|
+
}): Promise<ProjectScreen>;
|
|
118
|
+
}
|
|
119
|
+
export interface ConjureScreenDeps {
|
|
120
|
+
projectStore: ConjureScreenProjectStore;
|
|
121
|
+
/** Used only to validate an *explicit* `kitId` resolves to a real kit before
|
|
122
|
+
* generating against it — default/sole kits came from bindings already
|
|
123
|
+
* validated at bind time. */
|
|
124
|
+
kitStore: KitStore;
|
|
125
|
+
generator: ScreenGenerator;
|
|
126
|
+
}
|
|
127
|
+
export interface ConjureScreenResult extends Record<string, unknown> {
|
|
128
|
+
screenId: string;
|
|
129
|
+
files: GeneratedFile[];
|
|
130
|
+
usage: UsageInfo;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* True when `prompt` asks for kit-specific components (whole-word component noun
|
|
134
|
+
* or an explicit kit/component-library phrase). Exported for direct testing of
|
|
135
|
+
* the AC4/AC5 boundary.
|
|
136
|
+
*/
|
|
137
|
+
export declare function promptRequiresKit(prompt: string): boolean;
|
|
138
|
+
/** A human title for the screen: first non-empty line of the prompt, whitespace
|
|
139
|
+
* collapsed, capped at 80 chars. Falls back to "Screen". */
|
|
140
|
+
export declare function deriveScreenTitle(prompt: string): string;
|
|
141
|
+
/**
|
|
142
|
+
* Derive a unique screenId from the prompt, disambiguating against a project's
|
|
143
|
+
* existing screens by appending `-2`, `-3`, … (same scheme `create_project`'s
|
|
144
|
+
* `suggestSlug` uses). Deterministic given the project's current screen set — no
|
|
145
|
+
* clock or randomness, so tests are stable.
|
|
146
|
+
*/
|
|
147
|
+
export declare function uniqueScreenId(existing: ProjectScreen[], title: string): string;
|
|
148
|
+
/**
|
|
149
|
+
* Core conjure_screen logic. Exported standalone (bypassing the MCP transport)
|
|
150
|
+
* so programmatic callers get the same validation + resolution as the tool
|
|
151
|
+
* (mirrors `bind_kit`'s `bindKit`).
|
|
152
|
+
*
|
|
153
|
+
* Ordering is deliberate: validate the project (and that it's writable) and the
|
|
154
|
+
* blueprint seed *before* resolving the kit, and resolve the kit *before*
|
|
155
|
+
* generating — so a bad reference fails cheaply, with no artifact written.
|
|
156
|
+
*/
|
|
157
|
+
export declare function conjureScreen(deps: ConjureScreenDeps, args: unknown): Promise<ConjureScreenResult>;
|
|
158
|
+
/**
|
|
159
|
+
* The M1 generation client: a deterministic, **offline** scaffold generator. It
|
|
160
|
+
* makes no model call — CI needs none (AC8) — and reports zero usage, which is
|
|
161
|
+
* the honest accounting for "no tokens were spent". M2 replaces this with a
|
|
162
|
+
* client that calls the configured endpoint behind the same `ScreenGenerator`
|
|
163
|
+
* interface.
|
|
164
|
+
*
|
|
165
|
+
* Honesty is load-bearing (AC5): a kitless scaffold's banner explicitly says no
|
|
166
|
+
* kit was used; a kit-targeted scaffold names the kit it targets but does *not*
|
|
167
|
+
* claim to have pulled that kit's components (M1 can't — that's M2's gauntlet).
|
|
168
|
+
*/
|
|
169
|
+
export declare class LocalScaffoldScreenGenerator implements ScreenGenerator {
|
|
170
|
+
generate(request: ScreenGenerationRequest): Promise<ScreenGenerationResult>;
|
|
171
|
+
}
|
|
172
|
+
export declare function registerConjureScreenTool(server: McpServer, deps: ConjureScreenDeps): void;
|
|
173
|
+
export {};
|
|
174
|
+
//# sourceMappingURL=conjure_screen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conjure_screen.d.ts","sourceRoot":"","sources":["../../src/tools/conjure_screen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { KIT_ID_PATTERN, ProjectNotFoundError, WrongProjectTypeError, getKit } from "./get_kit.js";
|
|
3
|
+
import { PROJECT_ID_PATTERN, ProjectStoreError } from "./create_project.js";
|
|
4
|
+
export const CONJURE_SCREEN_TOOL_NAME = "mcp__genie__conjure_screen";
|
|
5
|
+
/** Target framework for the generated screen artifact (RFC §9.19). */
|
|
6
|
+
export const SCREEN_FRAMEWORKS = ["react", "vue", "html"];
|
|
7
|
+
const projectIdSchema = z
|
|
8
|
+
.string()
|
|
9
|
+
.regex(PROJECT_ID_PATTERN, "projectId must be a 3-64 character slug containing only lowercase letters, numbers, and hyphens.");
|
|
10
|
+
const kitIdSchema = z
|
|
11
|
+
.string()
|
|
12
|
+
.regex(KIT_ID_PATTERN, "kitId must be a 3-64 character slug containing only lowercase letters, numbers, and hyphens.");
|
|
13
|
+
const blueprintIdSchema = z
|
|
14
|
+
.string()
|
|
15
|
+
.regex(PROJECT_ID_PATTERN, "blueprintId must be a 3-64 character slug containing only lowercase letters, numbers, and hyphens.");
|
|
16
|
+
/**
|
|
17
|
+
* Input schema (RFC §9.19). `prompt` is bounded (8..8192) so a stray empty
|
|
18
|
+
* string or a megabyte paste can't reach the generator; `framework` defaults to
|
|
19
|
+
* `react`; `model` is an opaque routing hint (default `design-default`) the M1
|
|
20
|
+
* local generator ignores and M2 forwards to the configured endpoint.
|
|
21
|
+
*/
|
|
22
|
+
const conjureScreenArgsSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
projectId: projectIdSchema,
|
|
25
|
+
prompt: z.string().min(8).max(8192),
|
|
26
|
+
kitId: kitIdSchema.optional(),
|
|
27
|
+
blueprintId: blueprintIdSchema.optional(),
|
|
28
|
+
framework: z.enum(SCREEN_FRAMEWORKS).default("react"),
|
|
29
|
+
model: z.string().min(1).max(128).default("design-default"),
|
|
30
|
+
})
|
|
31
|
+
.strict();
|
|
32
|
+
// ── Kit-specificity heuristic (AC4 vs AC5) ────────────────────────────────────
|
|
33
|
+
//
|
|
34
|
+
// In the *kitless* branch we must decide whether the prompt "asks for
|
|
35
|
+
// kit-specific components" (→ stop, AC4) or merely "basic structure" (→ neutral
|
|
36
|
+
// scaffold, AC5). M1 uses a deterministic keyword heuristic — no model call, so
|
|
37
|
+
// it is testable and CI-stable. It intentionally errs toward *permitting* a
|
|
38
|
+
// neutral scaffold: a prompt only trips the kit requirement when it explicitly
|
|
39
|
+
// names kit-level component nouns or references a kit/component library. M2 can
|
|
40
|
+
// deepen this with the model's own read of the prompt.
|
|
41
|
+
/** Component nouns that only a UI kit can supply — interactive widgets and
|
|
42
|
+
* overlays. Matched as whole words, case-insensitively. Structural and
|
|
43
|
+
* *navigation* landmarks (header, footer, nav, navbar, sidebar, toolbar, hero,
|
|
44
|
+
* section, banner, menu, breadcrumb, page, layout, grid) are deliberately
|
|
45
|
+
* absent — those are framework-neutral and a kitless scaffold can render them
|
|
46
|
+
* honestly (AC5). The heuristic errs toward permitting a neutral scaffold. */
|
|
47
|
+
const KIT_COMPONENT_TERMS = [
|
|
48
|
+
"button",
|
|
49
|
+
"card",
|
|
50
|
+
"input",
|
|
51
|
+
"textarea",
|
|
52
|
+
"form",
|
|
53
|
+
"modal",
|
|
54
|
+
"dialog",
|
|
55
|
+
"dropdown",
|
|
56
|
+
"select",
|
|
57
|
+
"combobox",
|
|
58
|
+
"table",
|
|
59
|
+
"datagrid",
|
|
60
|
+
"badge",
|
|
61
|
+
"avatar",
|
|
62
|
+
"tab",
|
|
63
|
+
"tabs",
|
|
64
|
+
"accordion",
|
|
65
|
+
"toast",
|
|
66
|
+
"snackbar",
|
|
67
|
+
"chip",
|
|
68
|
+
"slider",
|
|
69
|
+
"switch",
|
|
70
|
+
"toggle",
|
|
71
|
+
"checkbox",
|
|
72
|
+
"radio",
|
|
73
|
+
"tooltip",
|
|
74
|
+
"popover",
|
|
75
|
+
"pagination",
|
|
76
|
+
"stepper",
|
|
77
|
+
"alert",
|
|
78
|
+
"datepicker",
|
|
79
|
+
"carousel",
|
|
80
|
+
"spinner",
|
|
81
|
+
"progressbar",
|
|
82
|
+
"drawer",
|
|
83
|
+
];
|
|
84
|
+
/** Phrases that explicitly invoke the kit / component library. */
|
|
85
|
+
const KIT_PHRASES = [
|
|
86
|
+
"use the kit",
|
|
87
|
+
"using the kit",
|
|
88
|
+
"from the kit",
|
|
89
|
+
"kit component",
|
|
90
|
+
"kit's component",
|
|
91
|
+
"component library",
|
|
92
|
+
"design system component",
|
|
93
|
+
];
|
|
94
|
+
/**
|
|
95
|
+
* True when `prompt` asks for kit-specific components (whole-word component noun
|
|
96
|
+
* or an explicit kit/component-library phrase). Exported for direct testing of
|
|
97
|
+
* the AC4/AC5 boundary.
|
|
98
|
+
*/
|
|
99
|
+
export function promptRequiresKit(prompt) {
|
|
100
|
+
const lower = prompt.toLowerCase();
|
|
101
|
+
if (KIT_PHRASES.some((phrase) => lower.includes(phrase)))
|
|
102
|
+
return true;
|
|
103
|
+
// Whole-word match so "input" matches but "throughput" does not, and
|
|
104
|
+
// "form" matches but "information"/"platform" do not.
|
|
105
|
+
return KIT_COMPONENT_TERMS.some((term) => new RegExp(`\\b${term}s?\\b`).test(lower));
|
|
106
|
+
}
|
|
107
|
+
// ── Screen id + title derivation (deterministic; no clock/random) ─────────────
|
|
108
|
+
/** A human title for the screen: first non-empty line of the prompt, whitespace
|
|
109
|
+
* collapsed, capped at 80 chars. Falls back to "Screen". */
|
|
110
|
+
export function deriveScreenTitle(prompt) {
|
|
111
|
+
const firstLine = prompt
|
|
112
|
+
.split("\n")
|
|
113
|
+
.map((line) => line.trim())
|
|
114
|
+
.find((line) => line.length > 0);
|
|
115
|
+
const collapsed = (firstLine ?? "").replace(/\s+/g, " ").trim();
|
|
116
|
+
if (!collapsed)
|
|
117
|
+
return "Screen";
|
|
118
|
+
return collapsed.length > 80 ? `${collapsed.slice(0, 79).trimEnd()}…` : collapsed;
|
|
119
|
+
}
|
|
120
|
+
/** Slugify a title into a screenId base matching `^[a-z0-9-]{3,64}$`. Falls back
|
|
121
|
+
* to "screen" when the title has no slug-able characters or is too short. */
|
|
122
|
+
function slugifyScreen(title) {
|
|
123
|
+
const slug = title
|
|
124
|
+
// Locale-independent: `toLocaleLowerCase()` would fold letters per the host
|
|
125
|
+
// locale (e.g. Turkish `I`→`ı`), making the same title yield different ids
|
|
126
|
+
// on different servers and breaking the `[a-z0-9]` slug. determinism is the
|
|
127
|
+
// contract here, so use the Unicode-default `toLowerCase()`.
|
|
128
|
+
.toLowerCase()
|
|
129
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
130
|
+
.replace(/^-+|-+$/g, "")
|
|
131
|
+
.slice(0, 64)
|
|
132
|
+
.replace(/-+$/g, "");
|
|
133
|
+
return slug.length >= 3 ? slug : "screen";
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Derive a unique screenId from the prompt, disambiguating against a project's
|
|
137
|
+
* existing screens by appending `-2`, `-3`, … (same scheme `create_project`'s
|
|
138
|
+
* `suggestSlug` uses). Deterministic given the project's current screen set — no
|
|
139
|
+
* clock or randomness, so tests are stable.
|
|
140
|
+
*/
|
|
141
|
+
export function uniqueScreenId(existing, title) {
|
|
142
|
+
const base = slugifyScreen(title);
|
|
143
|
+
const taken = new Set(existing.map((screen) => screen.id));
|
|
144
|
+
if (!taken.has(base))
|
|
145
|
+
return base;
|
|
146
|
+
for (let suffix = 2; suffix < 1000; suffix += 1) {
|
|
147
|
+
// Keep the whole id within 64 chars even after the suffix.
|
|
148
|
+
const candidate = `${base.slice(0, 64 - `-${suffix}`.length)}-${suffix}`;
|
|
149
|
+
if (!taken.has(candidate))
|
|
150
|
+
return candidate;
|
|
151
|
+
}
|
|
152
|
+
return base;
|
|
153
|
+
}
|
|
154
|
+
/** Entry filename per framework — the primary artifact the manifest points at. */
|
|
155
|
+
function entryFileName(framework) {
|
|
156
|
+
switch (framework) {
|
|
157
|
+
case "react":
|
|
158
|
+
return "index.tsx";
|
|
159
|
+
case "vue":
|
|
160
|
+
return "index.vue";
|
|
161
|
+
case "html":
|
|
162
|
+
return "index.html";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Validate an explicit `kitId` resolves to a real `GENIE_KIT`, mapping every
|
|
167
|
+
* shape `getKit` can reject with — malformed id (Zod), missing kit
|
|
168
|
+
* (`ProjectNotFoundError`), non-kit project (`WrongProjectTypeError`) — onto the
|
|
169
|
+
* single `ERR_KIT_NOT_FOUND` code (mirrors `bind_kit`'s `assertKitExists`).
|
|
170
|
+
*/
|
|
171
|
+
async function assertExplicitKitExists(kitStore, kitId) {
|
|
172
|
+
try {
|
|
173
|
+
await getKit(kitStore, { kitId });
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error instanceof ProjectNotFoundError ||
|
|
177
|
+
error instanceof WrongProjectTypeError ||
|
|
178
|
+
error instanceof z.ZodError) {
|
|
179
|
+
throw new ProjectStoreError("ERR_KIT_NOT_FOUND", `Kit "${kitId}" was not found.`, { kitId });
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Resolve the effective kit for a screen using the D-F ladder. Returns the
|
|
186
|
+
* resolved kit (with provenance) or `null` when nothing resolves. Does *not*
|
|
187
|
+
* decide the kitless error — that depends on the prompt (see `conjureScreen`).
|
|
188
|
+
*/
|
|
189
|
+
async function resolveKit(deps, project, explicitKitId) {
|
|
190
|
+
if (explicitKitId !== undefined) {
|
|
191
|
+
await assertExplicitKitExists(deps.kitStore, explicitKitId);
|
|
192
|
+
return { kitId: explicitKitId, via: "explicit" };
|
|
193
|
+
}
|
|
194
|
+
if (project.defaultKitId) {
|
|
195
|
+
return { kitId: project.defaultKitId, via: "default" };
|
|
196
|
+
}
|
|
197
|
+
if (project.kitBindings.length === 1) {
|
|
198
|
+
const sole = project.kitBindings[0];
|
|
199
|
+
if (sole)
|
|
200
|
+
return { kitId: sole.kitId, via: "sole" };
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Validate `blueprintId` (AC6) resolves to a project of `kind: "blueprint"`,
|
|
206
|
+
* mapping a missing project or a non-blueprint onto `ERR_BLUEPRINT_NOT_FOUND`.
|
|
207
|
+
*/
|
|
208
|
+
async function assertBlueprint(deps, blueprintId) {
|
|
209
|
+
let detail;
|
|
210
|
+
try {
|
|
211
|
+
detail = await deps.projectStore.getProject(blueprintId);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error instanceof ProjectStoreError && error.code === "ERR_PROJECT_NOT_FOUND") {
|
|
215
|
+
throw new ProjectStoreError("ERR_BLUEPRINT_NOT_FOUND", `Blueprint "${blueprintId}" was not found.`);
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
if (detail.kind !== "blueprint") {
|
|
220
|
+
throw new ProjectStoreError("ERR_BLUEPRINT_NOT_FOUND", `Project "${blueprintId}" is a ${detail.kind}, not a blueprint.`);
|
|
221
|
+
}
|
|
222
|
+
return { id: blueprintId };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Core conjure_screen logic. Exported standalone (bypassing the MCP transport)
|
|
226
|
+
* so programmatic callers get the same validation + resolution as the tool
|
|
227
|
+
* (mirrors `bind_kit`'s `bindKit`).
|
|
228
|
+
*
|
|
229
|
+
* Ordering is deliberate: validate the project (and that it's writable) and the
|
|
230
|
+
* blueprint seed *before* resolving the kit, and resolve the kit *before*
|
|
231
|
+
* generating — so a bad reference fails cheaply, with no artifact written.
|
|
232
|
+
*/
|
|
233
|
+
export async function conjureScreen(deps, args) {
|
|
234
|
+
const parsed = conjureScreenArgsSchema.parse(args);
|
|
235
|
+
// 1. Project must exist and be writable (a screen is a mutation). getProject
|
|
236
|
+
// throws ProjectStoreError("ERR_PROJECT_NOT_FOUND") for a missing project.
|
|
237
|
+
const project = await deps.projectStore.getProject(parsed.projectId);
|
|
238
|
+
if (!project.canEdit) {
|
|
239
|
+
throw new ProjectStoreError("ERR_PROJECT_READONLY", `Project "${parsed.projectId}" is read-only and cannot be modified.`, { projectId: parsed.projectId });
|
|
240
|
+
}
|
|
241
|
+
// 2. Blueprint seed (AC6), validated before we spend any generation effort.
|
|
242
|
+
const blueprint = parsed.blueprintId
|
|
243
|
+
? await assertBlueprint(deps, parsed.blueprintId)
|
|
244
|
+
: undefined;
|
|
245
|
+
// 3. Resolve the kit (AC3).
|
|
246
|
+
const kit = await resolveKit(deps, project, parsed.kitId);
|
|
247
|
+
// 4. Kitless branch: stop for a kit-specific prompt (AC4), scaffold otherwise
|
|
248
|
+
// (AC5). Never invent a kit.
|
|
249
|
+
if (kit === null && promptRequiresKit(parsed.prompt)) {
|
|
250
|
+
throw new ProjectStoreError("ERR_PROJECT_KIT_REQUIRED", kitRequiredMessage(project), {
|
|
251
|
+
projectId: parsed.projectId,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
// 5. Reserve a unique id + entry path so the manifest entry and returned files
|
|
255
|
+
// agree (the tool owns layout; the generator owns contents).
|
|
256
|
+
const title = deriveScreenTitle(parsed.prompt);
|
|
257
|
+
const screenId = uniqueScreenId(project.screens, title);
|
|
258
|
+
const entryPath = `screens/${screenId}/${entryFileName(parsed.framework)}`;
|
|
259
|
+
// 6. Generate (M1: offline local scaffold; M2: real endpoint, same seam).
|
|
260
|
+
const generated = await deps.generator.generate({
|
|
261
|
+
projectId: parsed.projectId,
|
|
262
|
+
screenId,
|
|
263
|
+
entryPath,
|
|
264
|
+
prompt: parsed.prompt,
|
|
265
|
+
framework: parsed.framework,
|
|
266
|
+
model: parsed.model,
|
|
267
|
+
kit,
|
|
268
|
+
blueprint,
|
|
269
|
+
});
|
|
270
|
+
// 7. Record the artifact reference in `.genie/project.json` (AC7).
|
|
271
|
+
await deps.projectStore.recordScreen({
|
|
272
|
+
projectId: parsed.projectId,
|
|
273
|
+
screen: { id: screenId, path: entryPath, title },
|
|
274
|
+
});
|
|
275
|
+
return { screenId, files: generated.files, usage: generated.usage };
|
|
276
|
+
}
|
|
277
|
+
/** Message for `ERR_PROJECT_KIT_REQUIRED`, differentiating the two kitless
|
|
278
|
+
* dead-ends (D-F step 4): nothing bound vs. several bound with no default. */
|
|
279
|
+
function kitRequiredMessage(project) {
|
|
280
|
+
const boundKitIds = project.kitBindings.map((binding) => binding.kitId);
|
|
281
|
+
if (boundKitIds.length === 0) {
|
|
282
|
+
return (`No kit is bound to project "${project.id}". Bind one with bind_kit or pass an ` +
|
|
283
|
+
`explicit kitId before generating kit-specific components.`);
|
|
284
|
+
}
|
|
285
|
+
return (`Project "${project.id}" has multiple bound kits (${boundKitIds.join(", ")}) but no ` +
|
|
286
|
+
`default; pass an explicit kitId or set a default kit before generating kit-specific components.`);
|
|
287
|
+
}
|
|
288
|
+
// ── The default M1 generator: deterministic, offline scaffold ─────────────────
|
|
289
|
+
/**
|
|
290
|
+
* The M1 generation client: a deterministic, **offline** scaffold generator. It
|
|
291
|
+
* makes no model call — CI needs none (AC8) — and reports zero usage, which is
|
|
292
|
+
* the honest accounting for "no tokens were spent". M2 replaces this with a
|
|
293
|
+
* client that calls the configured endpoint behind the same `ScreenGenerator`
|
|
294
|
+
* interface.
|
|
295
|
+
*
|
|
296
|
+
* Honesty is load-bearing (AC5): a kitless scaffold's banner explicitly says no
|
|
297
|
+
* kit was used; a kit-targeted scaffold names the kit it targets but does *not*
|
|
298
|
+
* claim to have pulled that kit's components (M1 can't — that's M2's gauntlet).
|
|
299
|
+
*/
|
|
300
|
+
export class LocalScaffoldScreenGenerator {
|
|
301
|
+
async generate(request) {
|
|
302
|
+
const content = renderScaffold(request);
|
|
303
|
+
return {
|
|
304
|
+
files: [{ path: request.entryPath, content, encoding: "utf-8" }],
|
|
305
|
+
// No model call → no tokens, no cost. Reported honestly (AC8).
|
|
306
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, costUsd: 0 },
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** A one-line, honest provenance note for the scaffold header comment. */
|
|
311
|
+
function provenanceNote(request) {
|
|
312
|
+
const parts = [];
|
|
313
|
+
if (request.kit) {
|
|
314
|
+
parts.push(`targeting kit "${request.kit.kitId}" (resolved via ${request.kit.via})`);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
parts.push("framework-neutral scaffold — no UI kit was used");
|
|
318
|
+
}
|
|
319
|
+
if (request.blueprint)
|
|
320
|
+
parts.push(`seeded from blueprint "${request.blueprint.id}"`);
|
|
321
|
+
return parts.join("; ");
|
|
322
|
+
}
|
|
323
|
+
/** Render the entry artifact for the requested framework. Deterministic — the
|
|
324
|
+
* same request always produces the same bytes. */
|
|
325
|
+
function renderScaffold(request) {
|
|
326
|
+
const title = deriveScreenTitle(request.prompt);
|
|
327
|
+
const note = provenanceNote(request);
|
|
328
|
+
switch (request.framework) {
|
|
329
|
+
case "html":
|
|
330
|
+
return [
|
|
331
|
+
"<!doctype html>",
|
|
332
|
+
`<!-- genie conjure_screen (M1): ${note} -->`,
|
|
333
|
+
'<html lang="en">',
|
|
334
|
+
" <head>",
|
|
335
|
+
' <meta charset="utf-8" />',
|
|
336
|
+
' <meta name="viewport" content="width=device-width, initial-scale=1" />',
|
|
337
|
+
` <title>${escapeHtml(title)}</title>`,
|
|
338
|
+
" </head>",
|
|
339
|
+
" <body>",
|
|
340
|
+
" <header><h1>" + escapeHtml(title) + "</h1></header>",
|
|
341
|
+
" <main><!-- generated screen body --></main>",
|
|
342
|
+
" <footer></footer>",
|
|
343
|
+
" </body>",
|
|
344
|
+
"</html>",
|
|
345
|
+
"",
|
|
346
|
+
].join("\n");
|
|
347
|
+
case "vue":
|
|
348
|
+
return [
|
|
349
|
+
`<!-- genie conjure_screen (M1): ${note} -->`,
|
|
350
|
+
"<template>",
|
|
351
|
+
' <main class="screen">',
|
|
352
|
+
` <h1>${escapeHtml(title)}</h1>`,
|
|
353
|
+
" <!-- generated screen body -->",
|
|
354
|
+
" </main>",
|
|
355
|
+
"</template>",
|
|
356
|
+
"",
|
|
357
|
+
'<script setup lang="ts"></script>',
|
|
358
|
+
"",
|
|
359
|
+
].join("\n");
|
|
360
|
+
case "react":
|
|
361
|
+
return [
|
|
362
|
+
`// genie conjure_screen (M1): ${note}`,
|
|
363
|
+
"export default function Screen() {",
|
|
364
|
+
" return (",
|
|
365
|
+
' <main className="screen">',
|
|
366
|
+
` <h1>${escapeJsx(title)}</h1>`,
|
|
367
|
+
" {/* generated screen body */}",
|
|
368
|
+
" </main>",
|
|
369
|
+
" );",
|
|
370
|
+
"}",
|
|
371
|
+
"",
|
|
372
|
+
].join("\n");
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function escapeHtml(value) {
|
|
376
|
+
return value
|
|
377
|
+
.replace(/&/g, "&")
|
|
378
|
+
.replace(/</g, "<")
|
|
379
|
+
.replace(/>/g, ">")
|
|
380
|
+
.replace(/"/g, """);
|
|
381
|
+
}
|
|
382
|
+
/** JSX text nodes only need `{`, `}`, `<`, `>`, `&` neutralized; the title is
|
|
383
|
+
* plain text so we escape the structural characters that would break parsing. */
|
|
384
|
+
function escapeJsx(value) {
|
|
385
|
+
return value
|
|
386
|
+
.replace(/&/g, "&")
|
|
387
|
+
.replace(/</g, "<")
|
|
388
|
+
.replace(/>/g, ">")
|
|
389
|
+
.replace(/[{}]/g, (char) => (char === "{" ? "{" : "}"));
|
|
390
|
+
}
|
|
391
|
+
/** Output schema mirroring RFC §9.19 (`screenId`, `files[]`, `usage`). */
|
|
392
|
+
const conjureScreenOutputShape = {
|
|
393
|
+
screenId: z.string().regex(/^[a-z0-9-]{3,64}$/),
|
|
394
|
+
files: z.array(z
|
|
395
|
+
.object({
|
|
396
|
+
path: z.string(),
|
|
397
|
+
content: z.string(),
|
|
398
|
+
encoding: z.enum(["utf-8", "base64"]),
|
|
399
|
+
})
|
|
400
|
+
.strict()),
|
|
401
|
+
usage: z
|
|
402
|
+
.object({
|
|
403
|
+
promptTokens: z.number().int().min(0),
|
|
404
|
+
completionTokens: z.number().int().min(0),
|
|
405
|
+
totalTokens: z.number().int().min(0),
|
|
406
|
+
costUsd: z.number().min(0).optional(),
|
|
407
|
+
})
|
|
408
|
+
.strict(),
|
|
409
|
+
};
|
|
410
|
+
export function registerConjureScreenTool(server, deps) {
|
|
411
|
+
server.registerTool(CONJURE_SCREEN_TOOL_NAME, {
|
|
412
|
+
title: "Conjure screen",
|
|
413
|
+
description: "Generate a full-page screen artifact inside a project, constrained by the project's " +
|
|
414
|
+
"bound UI kit. Resolves the kit by explicit kitId, then the project default, then a sole " +
|
|
415
|
+
"reachable binding; a kit-specific prompt with no resolvable kit stops with " +
|
|
416
|
+
"ERR_PROJECT_KIT_REQUIRED rather than inventing one. Records the screen in the project " +
|
|
417
|
+
"manifest and returns its files and token usage. Typically follows create_project + " +
|
|
418
|
+
"bind_kit; `design-default` is the valid gateway routing alias and may be overridden " +
|
|
419
|
+
"with a concrete model id exposed by the configured endpoint.",
|
|
420
|
+
inputSchema: {
|
|
421
|
+
projectId: projectIdSchema,
|
|
422
|
+
prompt: z.string().min(8).max(8192),
|
|
423
|
+
kitId: kitIdSchema.optional(),
|
|
424
|
+
blueprintId: blueprintIdSchema.optional(),
|
|
425
|
+
framework: z.enum(SCREEN_FRAMEWORKS).default("react"),
|
|
426
|
+
model: z.string().min(1).max(128).default("design-default"),
|
|
427
|
+
},
|
|
428
|
+
outputSchema: conjureScreenOutputShape,
|
|
429
|
+
}, async (args) => {
|
|
430
|
+
try {
|
|
431
|
+
const result = await conjureScreen(deps, args);
|
|
432
|
+
return {
|
|
433
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
434
|
+
structuredContent: result,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
if (error instanceof ProjectStoreError) {
|
|
439
|
+
return {
|
|
440
|
+
isError: true,
|
|
441
|
+
content: [
|
|
442
|
+
{
|
|
443
|
+
type: "text",
|
|
444
|
+
text: JSON.stringify({
|
|
445
|
+
code: error.code,
|
|
446
|
+
message: error.message,
|
|
447
|
+
...(error.projectId ? { projectId: error.projectId } : {}),
|
|
448
|
+
...(error.kitId ? { kitId: error.kitId } : {}),
|
|
449
|
+
}),
|
|
450
|
+
},
|
|
451
|
+
],
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
throw error;
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=conjure_screen.js.map
|