@clipform/mcp-server 1.7.0 → 1.8.0
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 +42 -29
- package/dist/__tests__/api-parity.test.js +31 -22
- package/dist/__tests__/api-parity.test.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +2 -0
- package/dist/lib/api-client.js +10 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/format-form.d.ts +2 -0
- package/dist/lib/format-form.js +32 -0
- package/dist/lib/format-form.js.map +1 -0
- package/dist/lib/render-jobs.d.ts +13 -0
- package/dist/lib/render-jobs.js +38 -0
- package/dist/lib/render-jobs.js.map +1 -0
- package/dist/lib/schemas.d.ts +4 -4
- package/dist/lib/schemas.js +11 -11
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/session-context.js +9 -3
- package/dist/lib/session-context.js.map +1 -1
- package/dist/prompts.js +31 -10
- package/dist/prompts.js.map +1 -1
- package/dist/resources.js +3 -3
- package/dist/resources.js.map +1 -1
- package/dist/server.js +23 -21
- package/dist/server.js.map +1 -1
- package/dist/tools/add-node.d.ts +2 -0
- package/dist/tools/add-node.js +50 -0
- package/dist/tools/add-node.js.map +1 -0
- package/dist/tools/attach-node-audio.d.ts +2 -0
- package/dist/tools/{attach-question-audio.js → attach-node-audio.js} +9 -9
- package/dist/tools/attach-node-audio.js.map +1 -0
- package/dist/tools/{add-question.d.ts → check-render.d.ts} +1 -1
- package/dist/tools/check-render.js +47 -0
- package/dist/tools/check-render.js.map +1 -0
- package/dist/tools/create-form.js +43 -25
- package/dist/tools/create-form.js.map +1 -1
- package/dist/tools/delete-node-media.d.ts +2 -0
- package/dist/tools/{delete-question-media.js → delete-node-media.js} +9 -9
- package/dist/tools/delete-node-media.js.map +1 -0
- package/dist/tools/delete-node.d.ts +2 -0
- package/dist/tools/delete-node.js +32 -0
- package/dist/tools/delete-node.js.map +1 -0
- package/dist/tools/generate-slideshow.js +16 -10
- package/dist/tools/generate-slideshow.js.map +1 -1
- package/dist/tools/generate-tts.js +55 -31
- package/dist/tools/generate-tts.js.map +1 -1
- package/dist/tools/generate-video.js +17 -11
- package/dist/tools/generate-video.js.map +1 -1
- package/dist/tools/get-form.js +4 -25
- package/dist/tools/get-form.js.map +1 -1
- package/dist/tools/get-node-media.d.ts +2 -0
- package/dist/tools/{get-question-media.js → get-node-media.js} +9 -9
- package/dist/tools/get-node-media.js.map +1 -0
- package/dist/tools/render-composition.js +18 -13
- package/dist/tools/render-composition.js.map +1 -1
- package/dist/tools/search-media.js +1 -1
- package/dist/tools/search-media.js.map +1 -1
- package/dist/tools/set-node-logic.d.ts +2 -0
- package/dist/tools/{set-question-logic.js → set-node-logic.js} +18 -16
- package/dist/tools/set-node-logic.js.map +1 -0
- package/dist/tools/update-form.js +4 -1
- package/dist/tools/update-form.js.map +1 -1
- package/dist/tools/update-node.d.ts +2 -0
- package/dist/tools/{update-question.js → update-node.js} +14 -11
- package/dist/tools/update-node.js.map +1 -0
- package/dist/tools/upload-node-media.d.ts +2 -0
- package/dist/tools/upload-node-media.js +109 -0
- package/dist/tools/upload-node-media.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/add-question.js +0 -47
- package/dist/tools/add-question.js.map +0 -1
- package/dist/tools/attach-question-audio.d.ts +0 -2
- package/dist/tools/attach-question-audio.js.map +0 -1
- package/dist/tools/delete-question-media.d.ts +0 -2
- package/dist/tools/delete-question-media.js.map +0 -1
- package/dist/tools/delete-question.d.ts +0 -2
- package/dist/tools/delete-question.js +0 -29
- package/dist/tools/delete-question.js.map +0 -1
- package/dist/tools/get-question-media.d.ts +0 -2
- package/dist/tools/get-question-media.js.map +0 -1
- package/dist/tools/set-question-logic.d.ts +0 -2
- package/dist/tools/set-question-logic.js.map +0 -1
- package/dist/tools/update-question.d.ts +0 -2
- package/dist/tools/update-question.js.map +0 -1
- package/dist/tools/upload-question-media.d.ts +0 -2
- package/dist/tools/upload-question-media.js +0 -77
- package/dist/tools/upload-question-media.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,75 +1,86 @@
|
|
|
1
1
|
# @clipform/mcp-server
|
|
2
2
|
|
|
3
|
-
MCP server for [Clipform](https://clipform.io) - build and manage video-style forms from
|
|
3
|
+
MCP server for [Clipform](https://clipform.io) - build and manage video-style forms from any MCP client (Claude, ChatGPT, Cursor, Windsurf, etc.).
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
7
|
There are two ways to connect: **remote** (recommended, uses your Clipform account) and **local** (anonymous, free-tier limits).
|
|
8
8
|
|
|
9
|
-
### Remote
|
|
9
|
+
### Remote (recommended)
|
|
10
10
|
|
|
11
|
-
Use this if you have a Clipform account. Forms are created directly in your workspace and your plan tier applies (no 3-
|
|
11
|
+
Use this if you have a Clipform account. Forms are created directly in your workspace and your plan tier applies (no 3-node cap on Pro).
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
2. Enter the MCP URL: `https://mcp.clipform.io`
|
|
15
|
-
3. Follow the OAuth prompts. You'll be redirected to Clipform to sign in and pick a workspace.
|
|
13
|
+
**Claude (claude.ai):** Settings → Connectors → Add custom connector → enter `https://mcp.clipform.io`
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
**ChatGPT:** Settings → Connectors → Advanced → enable Developer Mode → Create connector → enter `https://mcp.clipform.io` (requires Pro/Team/Enterprise)
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
**Any MCP client with OAuth:** Point it at `https://mcp.clipform.io` - discovery, registration, and auth are handled automatically via OAuth 2.1 + Dynamic Client Registration (RFC 7591).
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
### Local - Claude Code / Claude Desktop / Cursor / etc.
|
|
20
|
+
|
|
21
|
+
Use this for stdio-based MCP clients. Pass your API key to authenticate with your workspace and plan tier.
|
|
22
22
|
|
|
23
23
|
**Claude Code:**
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
claude mcp add clipform -- npx -y @clipform/mcp-server
|
|
26
|
+
claude mcp add clipform -e CLIPFORM_API_KEY=cf_live_xxx -- npx -y @clipform/mcp-server
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
**Claude Desktop** - add to
|
|
29
|
+
**Claude Desktop / Cursor / Windsurf / OpenClaw** - add to your MCP config:
|
|
30
30
|
|
|
31
31
|
```json
|
|
32
32
|
{
|
|
33
33
|
"mcpServers": {
|
|
34
34
|
"clipform": {
|
|
35
35
|
"command": "npx",
|
|
36
|
-
"args": ["-y", "@clipform/mcp-server"]
|
|
36
|
+
"args": ["-y", "@clipform/mcp-server"],
|
|
37
|
+
"env": {
|
|
38
|
+
"CLIPFORM_API_KEY": "cf_live_xxx"
|
|
39
|
+
}
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
```
|
|
41
44
|
|
|
45
|
+
Generate an API key in your Clipform dashboard under **Settings > API Keys**.
|
|
46
|
+
|
|
47
|
+
You can also pass the key as a CLI flag: `npx -y @clipform/mcp-server --api-key=cf_live_xxx`
|
|
48
|
+
|
|
49
|
+
**Anonymous mode** (no API key): Forms go into a shared workspace with the free-tier 3-node limit. You'll get a claim URL to move forms into your account.
|
|
50
|
+
|
|
42
51
|
## Tools
|
|
43
52
|
|
|
44
|
-
### Form &
|
|
53
|
+
### Form & node management
|
|
45
54
|
|
|
46
55
|
| Tool | Description |
|
|
47
56
|
|------|-------------|
|
|
48
|
-
| `clipform_create_form` | Create a new form with
|
|
49
|
-
| `clipform_get_form` | View a form and all its
|
|
57
|
+
| `clipform_create_form` | Create a new form with nodes, theming, and tags in one call |
|
|
58
|
+
| `clipform_get_form` | View a form and all its nodes |
|
|
50
59
|
| `clipform_update_form` | Change title, publish status, or settings |
|
|
51
60
|
| `clipform_delete_form` | Delete an unclaimed form |
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
61
|
+
| `clipform_add_node` | Add a node to an existing form |
|
|
62
|
+
| `clipform_update_node` | Update node text, type, config, or options |
|
|
63
|
+
| `clipform_delete_node` | Remove a node (logic chain auto-relinks) |
|
|
55
64
|
|
|
56
65
|
### Media & logic
|
|
57
66
|
|
|
58
67
|
| Tool | Description |
|
|
59
68
|
|------|-------------|
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
69
|
+
| `clipform_upload_node_media` | Attach video or image to one or more nodes (batch, max 10) |
|
|
70
|
+
| `clipform_get_node_media` | View a node's media details |
|
|
71
|
+
| `clipform_delete_node_media` | Remove media from a node |
|
|
72
|
+
| `clipform_attach_audio` | Attach audio to a still-image node |
|
|
73
|
+
| `clipform_set_logic` | Set branching logic on a node |
|
|
65
74
|
|
|
66
75
|
### Creative
|
|
67
76
|
|
|
68
77
|
| Tool | Description |
|
|
69
78
|
|------|-------------|
|
|
70
|
-
| `clipform_render_composition` | Render a Remotion composition to MP4, PNG, or GIF |
|
|
79
|
+
| `clipform_render_composition` | Render a Remotion composition to MP4, PNG, or GIF (async - returns job ID) |
|
|
71
80
|
| `clipform_generate_tts` | Generate narration audio with word-level captions |
|
|
72
|
-
| `clipform_generate_slideshow` | Create slideshow videos from images + audio (
|
|
81
|
+
| `clipform_generate_slideshow` | Create slideshow videos from images + audio (async - returns job ID) |
|
|
82
|
+
| `clipform_generate_video` | Generate video from images, clips, or both synced to audio (async - returns job ID) |
|
|
83
|
+
| `clipform_check_render` | Check status of an async render job |
|
|
73
84
|
| `clipform_search_media` | Search royalty-free images and videos |
|
|
74
85
|
| `clipform_search_music` | Search royalty-free music and ambient sounds |
|
|
75
86
|
| `clipform_list_compositions` | List available Remotion compositions and prop schemas |
|
|
@@ -81,13 +92,15 @@ claude mcp add clipform -- npx -y @clipform/mcp-server
|
|
|
81
92
|
|
|
82
93
|
## How it works
|
|
83
94
|
|
|
84
|
-
**Remote (
|
|
95
|
+
**Remote (OAuth):** Bearer tokens are audience-bound to `https://mcp.clipform.io` (RFC 8707) and scoped to `mcp` only. Forms land directly in the workspace you approved during consent.
|
|
96
|
+
|
|
97
|
+
**Local with API key:** The `CLIPFORM_API_KEY` is sent as an `X-API-Key` header. Forms are created directly in the key's workspace with your plan tier limits.
|
|
85
98
|
|
|
86
|
-
**Local (
|
|
99
|
+
**Local anonymous (no key):** When you create a form, you get back an `edit_token` that authorizes all subsequent changes. The token works until the form is claimed by a user via the claim URL. Free-tier 3-node limit applies.
|
|
87
100
|
|
|
88
|
-
Forms are created with a start node and end screen automatically - you just add the
|
|
101
|
+
Forms are created with a start node and end screen automatically - you just add the nodes in between.
|
|
89
102
|
|
|
90
103
|
## Links
|
|
91
104
|
|
|
92
105
|
- [Clipform](https://clipform.io) - Create interactive video forms
|
|
93
|
-
- [Documentation](https://
|
|
106
|
+
- [Documentation](https://clipform.io/docs/guides/mcp) - Full guide with node types, scoring, and more
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { describe, it, expect } from "vitest";
|
|
10
10
|
import { registerUpdateFormTool } from "../tools/update-form.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
11
|
+
import { registerAddNodeTool } from "../tools/add-node.js";
|
|
12
|
+
import { registerUpdateNodeTool } from "../tools/update-node.js";
|
|
13
|
+
import { registerUploadNodeMediaTool } from "../tools/upload-node-media.js";
|
|
14
14
|
import { registerCreateFormTool } from "../tools/create-form.js";
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// Helpers
|
|
@@ -67,7 +67,7 @@ function arrayElementFields(zodSchema) {
|
|
|
67
67
|
* Fields that are MCP-internal (auth/routing, not API body fields).
|
|
68
68
|
* These are excluded from parity checks.
|
|
69
69
|
*/
|
|
70
|
-
const MCP_ONLY_FIELDS = ["form_id", "edit_token", "
|
|
70
|
+
const MCP_ONLY_FIELDS = ["form_id", "edit_token", "node_id", "workspace_id"];
|
|
71
71
|
const API_PARITY = {
|
|
72
72
|
"update-form": {
|
|
73
73
|
register: registerUpdateFormTool,
|
|
@@ -79,23 +79,24 @@ const API_PARITY = {
|
|
|
79
79
|
/** Fields the create tool should expose (beyond title/questions which are core) */
|
|
80
80
|
apiBodyFields: ["title", "questions", "show_step_counter", "disable_back_navigation", "primary_color", "background_color", "font_family"],
|
|
81
81
|
},
|
|
82
|
-
"add-
|
|
83
|
-
register:
|
|
84
|
-
apiBodyFields: ["question", "
|
|
85
|
-
/** Nested: fields inside the
|
|
86
|
-
|
|
82
|
+
"add-node": {
|
|
83
|
+
register: registerAddNodeTool,
|
|
84
|
+
apiBodyFields: ["question", "after_node_id"],
|
|
85
|
+
/** Nested: fields inside the node object */
|
|
86
|
+
nodeFields: ["type", "prompt", "label", "required", "config", "options"],
|
|
87
87
|
/** Nested: fields inside each option */
|
|
88
88
|
optionFields: ["content", "score", "scores"],
|
|
89
89
|
},
|
|
90
|
-
"update-
|
|
91
|
-
register:
|
|
90
|
+
"update-node": {
|
|
91
|
+
register: registerUpdateNodeTool,
|
|
92
92
|
apiBodyFields: ["prompt", "label", "type", "required", "config", "options"],
|
|
93
93
|
optionFields: ["content", "score", "scores"],
|
|
94
94
|
},
|
|
95
|
-
"upload-
|
|
96
|
-
register:
|
|
97
|
-
/** Body fields accepted by POST /forms/:formId/
|
|
98
|
-
apiBodyFields: ["
|
|
95
|
+
"upload-node-media": {
|
|
96
|
+
register: registerUploadNodeMediaTool,
|
|
97
|
+
/** Body fields accepted by POST /forms/:formId/nodes/:nodeId/media (nested inside items[]) */
|
|
98
|
+
apiBodyFields: ["items"],
|
|
99
|
+
mediaItemFields: ["node_id", "media_type", "media_source", "url", "captions", "show_captions"],
|
|
99
100
|
},
|
|
100
101
|
};
|
|
101
102
|
// ---------------------------------------------------------------------------
|
|
@@ -113,12 +114,20 @@ describe("api-parity", () => {
|
|
|
113
114
|
expect(mcpFields, `MCP tool "${toolName}" is missing API field "${field}"`).toContain(field);
|
|
114
115
|
}
|
|
115
116
|
});
|
|
116
|
-
if ("
|
|
117
|
-
it("
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
for (const field of spec.
|
|
121
|
-
expect(
|
|
117
|
+
if ("nodeFields" in spec) {
|
|
118
|
+
it("node schema exposes all API node fields", () => {
|
|
119
|
+
const nodeSchema = schema.question;
|
|
120
|
+
const nFields = shapeFields(nodeSchema);
|
|
121
|
+
for (const field of spec.nodeFields) {
|
|
122
|
+
expect(nFields, `NodeSchema is missing field "${field}"`).toContain(field);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if ("mediaItemFields" in spec) {
|
|
127
|
+
it("media item schema exposes all API media fields", () => {
|
|
128
|
+
const itemFields = arrayElementFields(schema.items);
|
|
129
|
+
for (const field of spec.mediaItemFields) {
|
|
130
|
+
expect(itemFields, `MediaItemSchema is missing field "${field}"`).toContain(field);
|
|
122
131
|
}
|
|
123
132
|
});
|
|
124
133
|
}
|
|
@@ -128,7 +137,7 @@ describe("api-parity", () => {
|
|
|
128
137
|
// For update-question: schema.options is directly on the inputSchema
|
|
129
138
|
let optionsSchema;
|
|
130
139
|
if (schema.question) {
|
|
131
|
-
// Nested inside
|
|
140
|
+
// Nested inside NodeSchema
|
|
132
141
|
const qShape = schema.question._def?.shape;
|
|
133
142
|
const shape = typeof qShape === "function" ? qShape() : qShape;
|
|
134
143
|
optionsSchema = shape?.options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-parity.test.js","sourceRoot":"","sources":["../../src/__tests__/api-parity.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api-parity.test.js","sourceRoot":"","sources":["../../src/__tests__/api-parity.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { createServer } from "./server.js";
|
|
4
|
+
import { setApiKey } from "./lib/api-client.js";
|
|
5
|
+
const apiKeyArg = process.argv.find((a) => a.startsWith("--api-key="));
|
|
6
|
+
const apiKey = apiKeyArg?.split("=")[1] || process.env.CLIPFORM_API_KEY;
|
|
7
|
+
if (apiKey) {
|
|
8
|
+
setApiKey(apiKey);
|
|
9
|
+
}
|
|
4
10
|
const server = createServer();
|
|
5
11
|
const transport = new StdioServerTransport();
|
|
6
12
|
await server.connect(transport);
|
|
7
|
-
console.error(
|
|
13
|
+
console.error(apiKey
|
|
14
|
+
? "Clipform MCP Server running on stdio (API key authenticated)"
|
|
15
|
+
: "Clipform MCP Server running on stdio (anonymous mode)");
|
|
8
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACvE,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAExE,IAAI,MAAM,EAAE,CAAC;IACX,SAAS,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CACX,MAAM;IACJ,CAAC,CAAC,8DAA8D;IAChE,CAAC,CAAC,uDAAuD,CAC5D,CAAC"}
|
package/dist/lib/api-client.d.ts
CHANGED
package/dist/lib/api-client.js
CHANGED
|
@@ -3,6 +3,13 @@ const DASHBOARD_URL = process.env.SERVER_URL || process.env.DASHBOARD_URL || "ht
|
|
|
3
3
|
const API_VERSION = "v1";
|
|
4
4
|
const INTERNAL_API_URL = process.env.INTERNAL_API_URL || DASHBOARD_URL;
|
|
5
5
|
const INTERNAL_SECRET = process.env.INTERNAL_SERVICE_SECRET || "";
|
|
6
|
+
let _apiKey;
|
|
7
|
+
export function setApiKey(key) {
|
|
8
|
+
_apiKey = key;
|
|
9
|
+
}
|
|
10
|
+
export function getApiKey() {
|
|
11
|
+
return _apiKey;
|
|
12
|
+
}
|
|
6
13
|
export async function callApi(path, options = {}) {
|
|
7
14
|
const { method = "GET", body, params, token } = options;
|
|
8
15
|
let url = `${DASHBOARD_URL}/${API_VERSION}${path}`;
|
|
@@ -28,6 +35,9 @@ export async function callApi(path, options = {}) {
|
|
|
28
35
|
headers["X-Mcp-User"] = mcpAuth.user_id;
|
|
29
36
|
headers["X-Mcp-Workspace"] = mcpAuth.workspace_id;
|
|
30
37
|
}
|
|
38
|
+
else if (_apiKey) {
|
|
39
|
+
headers["X-API-Key"] = _apiKey;
|
|
40
|
+
}
|
|
31
41
|
else if (token) {
|
|
32
42
|
headers["Authorization"] = `Bearer ${token}`;
|
|
33
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,yBAAyB,CAAC;AACnF,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,aAAa,CAAC;AAChD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { callApi } from "./api-client.js";
|
|
2
|
+
export function formatFormState(data) {
|
|
3
|
+
const questions = data.questions;
|
|
4
|
+
const lines = [
|
|
5
|
+
`Form: ${data.title}`,
|
|
6
|
+
`Form ID: ${data.form_id}`,
|
|
7
|
+
`Published: ${data.is_published}`,
|
|
8
|
+
``,
|
|
9
|
+
`Nodes (in order):`,
|
|
10
|
+
];
|
|
11
|
+
for (let i = 0; i < questions.length; i++) {
|
|
12
|
+
const q = questions[i];
|
|
13
|
+
lines.push(` ${i + 1}. [${q.type}] ${q.prompt || "(no prompt)"}`);
|
|
14
|
+
lines.push(` Node ID: ${q.id}`);
|
|
15
|
+
if (q.required)
|
|
16
|
+
lines.push(` Required: yes`);
|
|
17
|
+
if (q.config && Object.keys(q.config).length > 0) {
|
|
18
|
+
lines.push(` Config: ${JSON.stringify(q.config)}`);
|
|
19
|
+
}
|
|
20
|
+
if (q.options && q.options.length > 0) {
|
|
21
|
+
lines.push(` Options: ${q.options.map((o) => o.content).join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return lines.join("\n");
|
|
25
|
+
}
|
|
26
|
+
export async function fetchAndFormatFormState(formId, editToken) {
|
|
27
|
+
const result = await callApi(`/forms/${formId}`, { token: editToken });
|
|
28
|
+
if (!result.ok)
|
|
29
|
+
return null;
|
|
30
|
+
return formatFormState(result.data);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=format-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-form.js","sourceRoot":"","sources":["../../src/lib/format-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,eAAe,CAAC,IAA6B;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAQrB,CAAC;IAEH,MAAM,KAAK,GAAa;QACtB,SAAS,IAAI,CAAC,KAAK,EAAE;QACrB,YAAY,IAAI,CAAC,OAAO,EAAE;QAC1B,cAAc,IAAI,CAAC,YAAY,EAAE;QACjC,EAAE;QACF,mBAAmB;KACpB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CACR,iBAAiB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,SAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RenderJob {
|
|
2
|
+
id: string;
|
|
3
|
+
status: "rendering" | "complete" | "failed";
|
|
4
|
+
tool: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
result?: Record<string, unknown>;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createJob(tool: string): RenderJob;
|
|
10
|
+
export declare function completeJob(id: string, result: Record<string, unknown>): void;
|
|
11
|
+
export declare function failJob(id: string, error: string): void;
|
|
12
|
+
export declare function getJob(id: string): RenderJob | undefined;
|
|
13
|
+
export declare function pruneJobs(): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
const jobs = new Map();
|
|
3
|
+
const MAX_AGE_MS = 30 * 60 * 1000; // 30 minutes
|
|
4
|
+
export function createJob(tool) {
|
|
5
|
+
const job = {
|
|
6
|
+
id: uuidv4(),
|
|
7
|
+
status: "rendering",
|
|
8
|
+
tool,
|
|
9
|
+
createdAt: Date.now(),
|
|
10
|
+
};
|
|
11
|
+
jobs.set(job.id, job);
|
|
12
|
+
return job;
|
|
13
|
+
}
|
|
14
|
+
export function completeJob(id, result) {
|
|
15
|
+
const job = jobs.get(id);
|
|
16
|
+
if (job) {
|
|
17
|
+
job.status = "complete";
|
|
18
|
+
job.result = result;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function failJob(id, error) {
|
|
22
|
+
const job = jobs.get(id);
|
|
23
|
+
if (job) {
|
|
24
|
+
job.status = "failed";
|
|
25
|
+
job.error = error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function getJob(id) {
|
|
29
|
+
return jobs.get(id);
|
|
30
|
+
}
|
|
31
|
+
export function pruneJobs() {
|
|
32
|
+
const cutoff = Date.now() - MAX_AGE_MS;
|
|
33
|
+
for (const [id, job] of jobs) {
|
|
34
|
+
if (job.createdAt < cutoff)
|
|
35
|
+
jobs.delete(id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=render-jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-jobs.js","sourceRoot":"","sources":["../../src/lib/render-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAWpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE1C,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAEhD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,GAAG,GAAc;QACrB,EAAE,EAAE,MAAM,EAAE;QACZ,MAAM,EAAE,WAAW;QACnB,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,MAA+B;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QACxB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,KAAa;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QACtB,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAU;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IACvC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,SAAS,GAAG,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
package/dist/lib/schemas.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
/** Active, non-system
|
|
3
|
-
export declare const
|
|
2
|
+
/** Active, non-system node types — the only types the MCP server exposes */
|
|
3
|
+
export declare const ACTIVE_NODE_TYPES: [string, ...string[]];
|
|
4
4
|
/** Contact field IDs derived from the config package */
|
|
5
5
|
export declare const CONTACT_FIELD_IDS: string[];
|
|
6
6
|
/** Per-type description including config hints, auto-generated from NODE_TYPES */
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const NODE_TYPES_DESCRIPTION: string;
|
|
8
8
|
/** Aggregate config description for Zod .describe() on the config field */
|
|
9
9
|
export declare const CONFIG_DESCRIPTION: string;
|
|
10
10
|
export declare const OptionSchema: z.ZodObject<{
|
|
@@ -20,7 +20,7 @@ export declare const OptionSchema: z.ZodObject<{
|
|
|
20
20
|
score?: number | undefined;
|
|
21
21
|
scores?: Record<string, number> | undefined;
|
|
22
22
|
}>;
|
|
23
|
-
export declare const
|
|
23
|
+
export declare const NodeSchema: z.ZodObject<{
|
|
24
24
|
type: z.ZodEnum<[string, ...string[]]>;
|
|
25
25
|
prompt: z.ZodString;
|
|
26
26
|
label: z.ZodOptional<z.ZodString>;
|
package/dist/lib/schemas.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { NODE_TYPES, CONTACT_FIELDS } from "./config.js";
|
|
3
3
|
// --- Derived constants (zero hardcoded type lists) ---
|
|
4
|
-
/** Active, non-system
|
|
5
|
-
export const
|
|
4
|
+
/** Active, non-system node types — the only types the MCP server exposes */
|
|
5
|
+
export const ACTIVE_NODE_TYPES = Object.entries(NODE_TYPES)
|
|
6
6
|
.filter(([, def]) => def.is_active && !def.is_system)
|
|
7
7
|
.map(([type]) => type); // tuple for z.enum
|
|
8
8
|
/** Contact field IDs derived from the config package */
|
|
@@ -71,9 +71,9 @@ function generateConfigSummary(configSchema, typeKey) {
|
|
|
71
71
|
return parts.length > 0 ? `Config: ${parts.join(", ")}` : "";
|
|
72
72
|
}
|
|
73
73
|
/** Per-type description including config hints, auto-generated from NODE_TYPES */
|
|
74
|
-
export const
|
|
75
|
-
const lines = ["
|
|
76
|
-
for (const type of
|
|
74
|
+
export const NODE_TYPES_DESCRIPTION = (() => {
|
|
75
|
+
const lines = ["Node types:"];
|
|
76
|
+
for (const type of ACTIVE_NODE_TYPES) {
|
|
77
77
|
const def = NODE_TYPES[type];
|
|
78
78
|
let line = `- ${type}: ${def.description || def.label}`;
|
|
79
79
|
if (def.has_options) {
|
|
@@ -90,7 +90,7 @@ export const QUESTION_TYPES_DESCRIPTION = (() => {
|
|
|
90
90
|
/** Aggregate config description for Zod .describe() on the config field */
|
|
91
91
|
export const CONFIG_DESCRIPTION = (() => {
|
|
92
92
|
const lines = ["Type-specific configuration. Per-type keys:"];
|
|
93
|
-
for (const type of
|
|
93
|
+
for (const type of ACTIVE_NODE_TYPES) {
|
|
94
94
|
const def = NODE_TYPES[type];
|
|
95
95
|
const summary = generateConfigSummary(def.config_schema, type);
|
|
96
96
|
if (summary) {
|
|
@@ -108,7 +108,7 @@ export const OptionSchema = z.object({
|
|
|
108
108
|
/** Build options description from config - which types need options, min counts, max lengths */
|
|
109
109
|
const OPTIONS_DESCRIPTION = (() => {
|
|
110
110
|
const hints = ["Answer options."];
|
|
111
|
-
for (const type of
|
|
111
|
+
for (const type of ACTIVE_NODE_TYPES) {
|
|
112
112
|
const def = NODE_TYPES[type];
|
|
113
113
|
if (!def.has_options)
|
|
114
114
|
continue;
|
|
@@ -123,10 +123,10 @@ const OPTIONS_DESCRIPTION = (() => {
|
|
|
123
123
|
}
|
|
124
124
|
return hints.join(" ");
|
|
125
125
|
})();
|
|
126
|
-
export const
|
|
127
|
-
type: z.enum(
|
|
128
|
-
prompt: z.string().describe("The
|
|
129
|
-
label: z.string().optional().describe("Short label for the
|
|
126
|
+
export const NodeSchema = z.object({
|
|
127
|
+
type: z.enum(ACTIVE_NODE_TYPES),
|
|
128
|
+
prompt: z.string().describe("The text shown to the respondent"),
|
|
129
|
+
label: z.string().optional().describe("Short label for the node (used in logic builder). Defaults to the prompt text."),
|
|
130
130
|
required: z.boolean().optional().default(true),
|
|
131
131
|
config: z
|
|
132
132
|
.record(z.unknown())
|
package/dist/lib/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzD,wDAAwD;AAExD,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,18 @@ export async function getSessionContext() {
|
|
|
9
9
|
const lines = [];
|
|
10
10
|
lines.push("## Your Session");
|
|
11
11
|
if (me.auth_mode === "oauth") {
|
|
12
|
-
lines.push(`
|
|
12
|
+
lines.push(`Auth: OAuth (connected)`);
|
|
13
|
+
lines.push(`Workspace: ${me.workspace?.name ?? "Unknown"} (${me.workspace?.id ?? "?"})`);
|
|
14
|
+
lines.push(`User: ${me.user_id ?? "?"}`);
|
|
15
|
+
lines.push(`Company: ${me.company_id ?? "none"}`);
|
|
13
16
|
}
|
|
14
17
|
else {
|
|
15
|
-
lines.push("
|
|
18
|
+
lines.push("Auth: anonymous (not connected to a Clipform account)");
|
|
19
|
+
if (me.workspace) {
|
|
20
|
+
lines.push(`Workspace: ${me.workspace.name} (${me.workspace.id})`);
|
|
21
|
+
}
|
|
16
22
|
}
|
|
17
|
-
lines.push(`Plan: ${plan.name}`);
|
|
23
|
+
lines.push(`Plan: ${plan.name} (tier ${plan.tier})`);
|
|
18
24
|
if (plan.node_limit !== null) {
|
|
19
25
|
lines.push(`Question limit: ${plan.node_limit} per form`);
|
|
20
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.js","sourceRoot":"","sources":["../../src/lib/session-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAW,CAAC;IAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-context.js","sourceRoot":"","sources":["../../src/lib/session-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAW,CAAC;IAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IACrB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,UAAU,IAAI,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,UAAU,WAAW,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,wFAAwF,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1H,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|