@clipform/mcp-server 1.5.1 → 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 +51 -26
- 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 +3 -1
- package/dist/lib/api-client.js +31 -5
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/auth-context.d.ts +17 -0
- package/dist/lib/auth-context.js +9 -0
- package/dist/lib/auth-context.js.map +1 -0
- 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.d.ts +1 -0
- package/dist/lib/session-context.js +38 -0
- package/dist/lib/session-context.js.map +1 -0
- package/dist/prompts.js +262 -125
- package/dist/prompts.js.map +1 -1
- package/dist/resources.d.ts +2 -0
- package/dist/resources.js +336 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.js +29 -23
- 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-node-audio.js +37 -0
- 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 +90 -19
- package/dist/tools/create-form.js.map +1 -1
- package/dist/tools/delete-form.js +2 -2
- package/dist/tools/delete-form.js.map +1 -1
- package/dist/tools/delete-node-media.d.ts +2 -0
- package/dist/tools/delete-node-media.js +29 -0
- 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 +129 -26
- package/dist/tools/generate-slideshow.js.map +1 -1
- package/dist/tools/generate-tts.js +56 -31
- package/dist/tools/generate-tts.js.map +1 -1
- package/dist/tools/generate-video.d.ts +2 -0
- package/dist/tools/generate-video.js +119 -0
- package/dist/tools/generate-video.js.map +1 -0
- package/dist/tools/get-form.js +5 -26
- 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} +11 -11
- package/dist/tools/get-node-media.js.map +1 -0
- package/dist/tools/list-assets.js +1 -1
- package/dist/tools/list-assets.js.map +1 -1
- package/dist/tools/list-compositions.js +3 -3
- package/dist/tools/list-compositions.js.map +1 -1
- package/dist/tools/log-generation.js +3 -3
- package/dist/tools/log-generation.js.map +1 -1
- package/dist/tools/render-composition.js +22 -15
- package/dist/tools/render-composition.js.map +1 -1
- package/dist/tools/search-media.js +2 -2
- package/dist/tools/search-media.js.map +1 -1
- package/dist/tools/search-music.js +1 -1
- package/dist/tools/search-music.js.map +1 -1
- package/dist/tools/search-news.js +1 -1
- package/dist/tools/search-news.js.map +1 -1
- package/dist/tools/set-node-logic.d.ts +2 -0
- package/dist/tools/set-node-logic.js +56 -0
- package/dist/tools/set-node-logic.js.map +1 -0
- package/dist/tools/update-form.js +43 -4
- 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} +16 -13
- 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 +3 -2
- 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 +0 -37
- 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 +0 -29
- 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 +0 -54
- 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 -69
- package/dist/tools/upload-question-media.js.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
3
4
|
export function registerUpdateFormTool(server) {
|
|
4
5
|
server.registerTool("clipform_update_form", {
|
|
5
6
|
title: "Update Clipform",
|
|
6
7
|
description: `Update a form's title, publish status, or settings. Use clipform_get_form first to see current values.`,
|
|
7
8
|
inputSchema: {
|
|
8
|
-
form_id: z.string().describe("The form
|
|
9
|
-
edit_token: z.string().describe("The edit token"),
|
|
9
|
+
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
10
|
+
edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
|
|
10
11
|
title: z.string().optional().describe("New form title"),
|
|
11
12
|
is_published: z
|
|
12
13
|
.boolean()
|
|
@@ -41,6 +42,26 @@ export function registerUpdateFormTool(server) {
|
|
|
41
42
|
.boolean()
|
|
42
43
|
.optional()
|
|
43
44
|
.describe("Auto-play video when embedded (default: false). When off, embeds show a thumbnail + play button."),
|
|
45
|
+
description: z
|
|
46
|
+
.string()
|
|
47
|
+
.nullable()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("SEO description (meta description, og:description). Set null to clear."),
|
|
50
|
+
author: z
|
|
51
|
+
.string()
|
|
52
|
+
.nullable()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Author/brand name shown to respondents. Set null to clear."),
|
|
55
|
+
brand_name: z
|
|
56
|
+
.string()
|
|
57
|
+
.nullable()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Brand name shown alongside the logo in the viewer. Set null to clear."),
|
|
60
|
+
logo_url: z
|
|
61
|
+
.string()
|
|
62
|
+
.nullable()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe("URL to a logo image shown in the viewer header. Set null to clear."),
|
|
44
65
|
},
|
|
45
66
|
annotations: {
|
|
46
67
|
readOnlyHint: false,
|
|
@@ -48,7 +69,7 @@ export function registerUpdateFormTool(server) {
|
|
|
48
69
|
idempotentHint: true,
|
|
49
70
|
openWorldHint: true,
|
|
50
71
|
},
|
|
51
|
-
}, async ({ form_id, edit_token, title, is_published, show_step_counter, disable_back_navigation, total_steps, primary_color, background_color, font_family, embed_autoplay }) => {
|
|
72
|
+
}, async ({ form_id, edit_token, title, is_published, show_step_counter, disable_back_navigation, total_steps, primary_color, background_color, font_family, embed_autoplay, description, author, brand_name, logo_url }) => {
|
|
52
73
|
const body = {};
|
|
53
74
|
if (title !== undefined)
|
|
54
75
|
body.title = title;
|
|
@@ -68,6 +89,14 @@ export function registerUpdateFormTool(server) {
|
|
|
68
89
|
body.font_family = font_family;
|
|
69
90
|
if (embed_autoplay !== undefined)
|
|
70
91
|
body.embed_autoplay = embed_autoplay;
|
|
92
|
+
if (description !== undefined)
|
|
93
|
+
body.description = description;
|
|
94
|
+
if (author !== undefined)
|
|
95
|
+
body.author = author;
|
|
96
|
+
if (brand_name !== undefined)
|
|
97
|
+
body.brand_name = brand_name;
|
|
98
|
+
if (logo_url !== undefined)
|
|
99
|
+
body.logo_url = logo_url;
|
|
71
100
|
const result = await callApi(`/forms/${form_id}`, {
|
|
72
101
|
method: "PATCH",
|
|
73
102
|
body,
|
|
@@ -95,7 +124,17 @@ export function registerUpdateFormTool(server) {
|
|
|
95
124
|
updates.push(`Font → ${font_family}`);
|
|
96
125
|
if (embed_autoplay !== undefined)
|
|
97
126
|
updates.push(`Embed autoplay → ${embed_autoplay}`);
|
|
98
|
-
|
|
127
|
+
if (description !== undefined)
|
|
128
|
+
updates.push(`Description → ${description === null ? "cleared" : `"${description}"`}`);
|
|
129
|
+
if (author !== undefined)
|
|
130
|
+
updates.push(`Author → ${author === null ? "cleared" : `"${author}"`}`);
|
|
131
|
+
if (brand_name !== undefined)
|
|
132
|
+
updates.push(`Brand name → ${brand_name === null ? "cleared" : `"${brand_name}"`}`);
|
|
133
|
+
if (logo_url !== undefined)
|
|
134
|
+
updates.push(`Logo URL → ${logo_url === null ? "cleared" : logo_url}`);
|
|
135
|
+
const confirmMsg = `Form updated:\n${updates.join("\n")}`;
|
|
136
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
137
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
99
138
|
});
|
|
100
139
|
}
|
|
101
140
|
//# sourceMappingURL=update-form.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-form.js","sourceRoot":"","sources":["../../src/tools/update-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"update-form.js","sourceRoot":"","sources":["../../src/tools/update-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { ACTIVE_NODE_TYPES, CONFIG_DESCRIPTION, OptionSchema } from "../lib/schemas.js";
|
|
3
3
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
5
|
+
export function registerUpdateNodeTool(server) {
|
|
6
|
+
server.registerTool("clipform_update_node", {
|
|
7
|
+
title: "Update Node",
|
|
8
|
+
description: `Update an existing node's text, type, config, or options. Use clipform_get_form first to find the node ID. Does not change the node's position in the flow. All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
|
|
8
9
|
inputSchema: {
|
|
9
|
-
form_id: z.string().describe("The form
|
|
10
|
-
edit_token: z.string().describe("The edit token"),
|
|
11
|
-
|
|
10
|
+
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
11
|
+
edit_token: z.string().optional().describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
|
|
12
|
+
node_id: z.string().describe("The node ID to update"),
|
|
12
13
|
prompt: z.string().optional().describe("New question text"),
|
|
13
14
|
label: z.string().optional().describe("Short label for the question (used in logic builder)"),
|
|
14
15
|
type: z
|
|
15
|
-
.enum(
|
|
16
|
+
.enum(ACTIVE_NODE_TYPES)
|
|
16
17
|
.optional()
|
|
17
18
|
.describe("Change the question type"),
|
|
18
19
|
required: z.boolean().optional().describe("Whether an answer is required"),
|
|
@@ -31,7 +32,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
31
32
|
idempotentHint: true,
|
|
32
33
|
openWorldHint: true,
|
|
33
34
|
},
|
|
34
|
-
}, async ({ form_id, edit_token,
|
|
35
|
+
}, async ({ form_id, edit_token, node_id, prompt, label, type, required, config, options, }) => {
|
|
35
36
|
const body = {};
|
|
36
37
|
if (prompt !== undefined)
|
|
37
38
|
body.prompt = prompt;
|
|
@@ -45,7 +46,7 @@ export function registerUpdateQuestionTool(server) {
|
|
|
45
46
|
body.config = config;
|
|
46
47
|
if (options !== undefined)
|
|
47
48
|
body.options = options;
|
|
48
|
-
const result = await callApi(`/forms/${form_id}/
|
|
49
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}`, { method: "PATCH", body, token: edit_token });
|
|
49
50
|
if (!result.ok) {
|
|
50
51
|
return errorResult(result.error);
|
|
51
52
|
}
|
|
@@ -62,7 +63,9 @@ export function registerUpdateQuestionTool(server) {
|
|
|
62
63
|
updates.push(`Config updated`);
|
|
63
64
|
if (options !== undefined)
|
|
64
65
|
updates.push(`Options → ${options.map((o) => o.content).join(", ")}`);
|
|
65
|
-
|
|
66
|
+
const confirmMsg = `Node ${node_id} updated:\n${updates.join("\n")}`;
|
|
67
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
68
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
66
69
|
});
|
|
67
70
|
}
|
|
68
|
-
//# sourceMappingURL=update-
|
|
71
|
+
//# sourceMappingURL=update-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
const MediaItemSchema = z.object({
|
|
4
|
+
node_id: z.string().describe("The node ID"),
|
|
5
|
+
media_type: z.enum(["video", "still"]).describe("Type of media"),
|
|
6
|
+
media_source: z
|
|
7
|
+
.enum(["uploaded", "recorded"])
|
|
8
|
+
.default("uploaded")
|
|
9
|
+
.describe("How the media was created"),
|
|
10
|
+
url: z
|
|
11
|
+
.string()
|
|
12
|
+
.url()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Public URL of the media file. When provided, the server fetches and stores it directly."),
|
|
15
|
+
captions: z
|
|
16
|
+
.array(z.object({
|
|
17
|
+
start: z.number().describe("Segment start time in seconds"),
|
|
18
|
+
end: z.number().describe("Segment end time in seconds"),
|
|
19
|
+
text: z.string().describe("Full segment text"),
|
|
20
|
+
words: z
|
|
21
|
+
.array(z.object({
|
|
22
|
+
word: z.string(),
|
|
23
|
+
start: z.number(),
|
|
24
|
+
end: z.number(),
|
|
25
|
+
}))
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Per-word timestamps within the segment"),
|
|
28
|
+
}))
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Word-level captions from clipform_generate_tts. Always include when uploading narrated video - pass the full objects including 'words' so per-word highlighting works."),
|
|
31
|
+
show_captions: z
|
|
32
|
+
.boolean()
|
|
33
|
+
.optional()
|
|
34
|
+
.default(true)
|
|
35
|
+
.describe("Display captions/subtitles on the question"),
|
|
36
|
+
});
|
|
37
|
+
export function registerUploadNodeMediaTool(server) {
|
|
38
|
+
server.registerTool("clipform_upload_node_media", {
|
|
39
|
+
title: "Upload Node Media",
|
|
40
|
+
description: `Upload media for one or more nodes. Pass one item or many (max 10). Multiple items upload sequentially.
|
|
41
|
+
|
|
42
|
+
When a public URL is provided, the media is fetched and stored automatically. Only works on node types that support media (choice, open, scale, button). For video: ingested via Mux. For image: stored in Supabase. When attaching TTS narration video, always include captions from clipform_generate_tts.`,
|
|
43
|
+
inputSchema: {
|
|
44
|
+
form_id: z
|
|
45
|
+
.string()
|
|
46
|
+
.uuid()
|
|
47
|
+
.describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
48
|
+
edit_token: z
|
|
49
|
+
.string()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
|
|
52
|
+
items: z
|
|
53
|
+
.array(MediaItemSchema)
|
|
54
|
+
.min(1)
|
|
55
|
+
.max(10)
|
|
56
|
+
.describe("One or more media items to upload"),
|
|
57
|
+
},
|
|
58
|
+
annotations: {
|
|
59
|
+
readOnlyHint: false,
|
|
60
|
+
destructiveHint: false,
|
|
61
|
+
idempotentHint: false,
|
|
62
|
+
openWorldHint: true,
|
|
63
|
+
},
|
|
64
|
+
}, async ({ form_id, edit_token, items }) => {
|
|
65
|
+
const lines = [];
|
|
66
|
+
let successCount = 0;
|
|
67
|
+
for (let i = 0; i < items.length; i++) {
|
|
68
|
+
const item = items[i];
|
|
69
|
+
if (items.length > 1)
|
|
70
|
+
lines.push(`--- Item ${i + 1} (node ${item.node_id}) ---`);
|
|
71
|
+
const body = {
|
|
72
|
+
media_type: item.media_type,
|
|
73
|
+
media_source: item.media_source,
|
|
74
|
+
};
|
|
75
|
+
if (item.url)
|
|
76
|
+
body.url = item.url;
|
|
77
|
+
if (item.captions)
|
|
78
|
+
body.captions = item.captions;
|
|
79
|
+
if (item.show_captions !== undefined)
|
|
80
|
+
body.show_captions = item.show_captions;
|
|
81
|
+
const result = await callApi(`/forms/${form_id}/nodes/${item.node_id}/media`, { method: "POST", token: edit_token, body });
|
|
82
|
+
if (result.ok) {
|
|
83
|
+
successCount++;
|
|
84
|
+
const resultLines = [`Media ID: ${result.data.media_id}`];
|
|
85
|
+
if (result.data.upload_url) {
|
|
86
|
+
resultLines.push(`Upload URL: ${result.data.upload_url}`, `Upload method: ${result.data.upload_method}`, `Upload the file directly to the upload URL using ${result.data.upload_method === "tus" ? "TUS resumable upload" : "HTTP PUT"}.`);
|
|
87
|
+
}
|
|
88
|
+
if (item.captions) {
|
|
89
|
+
resultLines.push(`Captions: ${item.captions.length} segments saved`);
|
|
90
|
+
}
|
|
91
|
+
lines.push(resultLines.join("\n"));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
lines.push(`FAILED: ${result.error}`);
|
|
95
|
+
}
|
|
96
|
+
lines.push("");
|
|
97
|
+
}
|
|
98
|
+
if (items.length > 1) {
|
|
99
|
+
lines.unshift(`Media upload: ${successCount}/${items.length} succeeded\n`);
|
|
100
|
+
}
|
|
101
|
+
else if (successCount > 0) {
|
|
102
|
+
lines.unshift(`Media uploaded successfully.`);
|
|
103
|
+
}
|
|
104
|
+
if (successCount === 0)
|
|
105
|
+
return errorResult(lines.join("\n"));
|
|
106
|
+
return textResult(lines.join("\n"));
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=upload-node-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-node-media.js","sourceRoot":"","sources":["../../src/tools/upload-node-media.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clipform/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "MCP server for building and managing Clipform video forms",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://clipform.io",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": "./dist/index.js",
|
|
11
|
-
"./server": "./dist/server.js"
|
|
11
|
+
"./server": "./dist/server.js",
|
|
12
|
+
"./auth-context": "./dist/lib/auth-context.js"
|
|
12
13
|
},
|
|
13
14
|
"bin": {
|
|
14
15
|
"mcp-server-clipform": "dist/index.js"
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { QuestionSchema, QUESTION_TYPES_DESCRIPTION } from "../lib/schemas.js";
|
|
3
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
4
|
-
export function registerAddQuestionTool(server) {
|
|
5
|
-
server.registerTool("clipform_add_question", {
|
|
6
|
-
title: "Add Question",
|
|
7
|
-
description: `Add a new question to an existing form. By default, the question is inserted before the end screen (appended to the end of the flow). Use after_question_id to insert at a specific position.
|
|
8
|
-
|
|
9
|
-
${QUESTION_TYPES_DESCRIPTION}
|
|
10
|
-
|
|
11
|
-
All type definitions and config schemas are derived from @vid-master/config (answer-types).`,
|
|
12
|
-
inputSchema: {
|
|
13
|
-
form_id: z.string().describe("The form ID"),
|
|
14
|
-
edit_token: z.string().describe("The edit token"),
|
|
15
|
-
question: QuestionSchema.describe("The question to add"),
|
|
16
|
-
after_question_id: z
|
|
17
|
-
.string()
|
|
18
|
-
.optional()
|
|
19
|
-
.describe("Insert after this question ID. Omit to append before the end screen."),
|
|
20
|
-
},
|
|
21
|
-
annotations: {
|
|
22
|
-
readOnlyHint: false,
|
|
23
|
-
destructiveHint: false,
|
|
24
|
-
idempotentHint: false,
|
|
25
|
-
openWorldHint: true,
|
|
26
|
-
},
|
|
27
|
-
}, async ({ form_id, edit_token, question, after_question_id }) => {
|
|
28
|
-
const body = { question };
|
|
29
|
-
if (after_question_id)
|
|
30
|
-
body.after_question_id = after_question_id;
|
|
31
|
-
const result = await callApi(`/forms/${form_id}/questions`, {
|
|
32
|
-
method: "POST",
|
|
33
|
-
body,
|
|
34
|
-
token: edit_token,
|
|
35
|
-
});
|
|
36
|
-
if (!result.ok) {
|
|
37
|
-
return errorResult(result.error);
|
|
38
|
-
}
|
|
39
|
-
return textResult([
|
|
40
|
-
`Question added successfully!`,
|
|
41
|
-
`Question ID: ${result.data.question_id}`,
|
|
42
|
-
`Type: ${question.type}`,
|
|
43
|
-
`Prompt: ${question.prompt}`,
|
|
44
|
-
].join("\n"));
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=add-question.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-question.js","sourceRoot":"","sources":["../../src/tools/add-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE;;EAEjB,0BAA0B;;4FAEgE;QACtF,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACxD,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE,CACvE;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAC7D,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,YAAY,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,IAAI;YACJ,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf;YACE,8BAA8B;YAC9B,gBAAgB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;YACzC,SAAS,QAAQ,CAAC,IAAI,EAAE;YACxB,WAAW,QAAQ,CAAC,MAAM,EAAE;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function registerAttachQuestionAudioTool(server) {
|
|
4
|
-
server.registerTool("clipform_attach_audio", {
|
|
5
|
-
title: "Attach Audio to Question",
|
|
6
|
-
description: `Attach a sound effect or audio file to a question with existing media (stills only). The audio auto-plays once when a respondent reaches this question. Provide a public URL to the audio file (WAV, MP3, or OGG). The question must already have media uploaded (use clipform_upload_question_media first).`,
|
|
7
|
-
inputSchema: {
|
|
8
|
-
form_id: z.string().describe("The form ID"),
|
|
9
|
-
edit_token: z.string().describe("The edit token"),
|
|
10
|
-
question_id: z
|
|
11
|
-
.string()
|
|
12
|
-
.describe("The question ID (must already have media attached)"),
|
|
13
|
-
url: z
|
|
14
|
-
.string()
|
|
15
|
-
.url()
|
|
16
|
-
.describe("Public URL to the audio file (WAV, MP3, or OGG)"),
|
|
17
|
-
},
|
|
18
|
-
annotations: {
|
|
19
|
-
readOnlyHint: false,
|
|
20
|
-
destructiveHint: false,
|
|
21
|
-
idempotentHint: true,
|
|
22
|
-
openWorldHint: true,
|
|
23
|
-
},
|
|
24
|
-
}, async ({ form_id, edit_token, question_id, url }) => {
|
|
25
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}/audio`, {
|
|
26
|
-
method: "PUT",
|
|
27
|
-
token: edit_token,
|
|
28
|
-
body: { url },
|
|
29
|
-
});
|
|
30
|
-
if (!result.ok) {
|
|
31
|
-
return errorResult(result.error);
|
|
32
|
-
}
|
|
33
|
-
return textResult(`Audio attached to question ${question_id}.\n` +
|
|
34
|
-
`Audio path: ${result.data.audio_storage_path}`);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=attach-question-audio.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attach-question-audio.js","sourceRoot":"","sources":["../../src/tools/attach-question-audio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,8SAA8S;QAC3T,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,oDAAoD,CAAC;YACjE,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,CAAC,iDAAiD,CAAC;SAC/D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,GAAG,EAAE;SACd,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,8BAA8B,WAAW,KAAK;YAC5C,eAAe,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAClD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function registerDeleteQuestionMediaTool(server) {
|
|
4
|
-
server.registerTool("clipform_delete_question_media", {
|
|
5
|
-
title: "Delete Question Media",
|
|
6
|
-
description: `Remove media from a question. Deletes the media record and cleans up external resources (Mux video asset, storage file).`,
|
|
7
|
-
inputSchema: {
|
|
8
|
-
form_id: z.string().describe("The form ID"),
|
|
9
|
-
edit_token: z.string().describe("The edit token"),
|
|
10
|
-
question_id: z.string().describe("The question ID"),
|
|
11
|
-
},
|
|
12
|
-
annotations: {
|
|
13
|
-
readOnlyHint: false,
|
|
14
|
-
destructiveHint: true,
|
|
15
|
-
idempotentHint: false,
|
|
16
|
-
openWorldHint: true,
|
|
17
|
-
},
|
|
18
|
-
}, async ({ form_id, edit_token, question_id }) => {
|
|
19
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}/media`, {
|
|
20
|
-
method: "DELETE",
|
|
21
|
-
token: edit_token,
|
|
22
|
-
});
|
|
23
|
-
if (!result.ok) {
|
|
24
|
-
return errorResult(result.error);
|
|
25
|
-
}
|
|
26
|
-
return textResult("Media removed from question.");
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=delete-question-media.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-question-media.js","sourceRoot":"","sources":["../../src/tools/delete-question-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,0HAA0H;QACvI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACpD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function registerDeleteQuestionTool(server) {
|
|
4
|
-
server.registerTool("clipform_delete_question", {
|
|
5
|
-
title: "Delete Question",
|
|
6
|
-
description: `Delete a question from a form. The logic chain is automatically re-linked (the previous question will point to the next one). Cannot delete the start node or the last end screen.`,
|
|
7
|
-
inputSchema: {
|
|
8
|
-
form_id: z.string().describe("The form ID"),
|
|
9
|
-
edit_token: z.string().describe("The edit token"),
|
|
10
|
-
question_id: z.string().describe("The question ID to delete"),
|
|
11
|
-
},
|
|
12
|
-
annotations: {
|
|
13
|
-
readOnlyHint: false,
|
|
14
|
-
destructiveHint: true,
|
|
15
|
-
idempotentHint: false,
|
|
16
|
-
openWorldHint: true,
|
|
17
|
-
},
|
|
18
|
-
}, async ({ form_id, edit_token, question_id }) => {
|
|
19
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}`, {
|
|
20
|
-
method: "DELETE",
|
|
21
|
-
token: edit_token,
|
|
22
|
-
});
|
|
23
|
-
if (!result.ok) {
|
|
24
|
-
return errorResult(result.error);
|
|
25
|
-
}
|
|
26
|
-
return textResult(`Question ${question_id} deleted. The logic chain has been re-linked.`);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=delete-question.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete-question.js","sourceRoot":"","sources":["../../src/tools/delete-question.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oLAAoL;QACjM,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC9D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,EAAE,EAC5C;YACE,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,YAAY,WAAW,+CAA+C,CACvE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-question-media.js","sourceRoot":"","sources":["../../src/tools/get-question-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,mIAAmI;QAChJ,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACpD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;SAClB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAuC,CAAC;QAClE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,UAAU,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,UAAU,CACf,aAAa,KAAK,CAAC,EAAE,IAAI;YACvB,SAAS,KAAK,CAAC,UAAU,IAAI;YAC7B,WAAW,KAAK,CAAC,MAAM,IAAI;YAC3B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,kBAAkB,KAAK,CAAC,oBAAoB,EAAE,CACjD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
const LogicRuleSchema = z.object({
|
|
4
|
-
option_content: z
|
|
5
|
-
.string()
|
|
6
|
-
.optional()
|
|
7
|
-
.describe("The option text to match. Omit for a default rule (applies to all unmatched options)."),
|
|
8
|
-
target_question_id: z
|
|
9
|
-
.string()
|
|
10
|
-
.describe("The question ID to jump to when this rule matches"),
|
|
11
|
-
});
|
|
12
|
-
export function registerSetQuestionLogicTool(server) {
|
|
13
|
-
server.registerTool("clipform_set_logic", {
|
|
14
|
-
title: "Set Question Logic",
|
|
15
|
-
description: `Set branching logic on a question. Routes respondents to different questions based on their answer.
|
|
16
|
-
|
|
17
|
-
Each rule maps an option (by its text content) to a target question. Rules without option_content are "default" rules applied to all unmatched options.
|
|
18
|
-
|
|
19
|
-
Example: Route correct answer to a "Well done" node, everything else to "Wrong":
|
|
20
|
-
rules: [
|
|
21
|
-
{ option_content: "42", target_question_id: "well-done-id" },
|
|
22
|
-
{ target_question_id: "wrong-id" }
|
|
23
|
-
]`,
|
|
24
|
-
inputSchema: {
|
|
25
|
-
form_id: z.string().describe("The form ID"),
|
|
26
|
-
edit_token: z.string().describe("The edit token"),
|
|
27
|
-
question_id: z
|
|
28
|
-
.string()
|
|
29
|
-
.describe("The question ID to set logic on"),
|
|
30
|
-
rules: z
|
|
31
|
-
.array(LogicRuleSchema)
|
|
32
|
-
.min(1)
|
|
33
|
-
.describe("Branching rules. Each maps an option or default to a target question."),
|
|
34
|
-
},
|
|
35
|
-
annotations: {
|
|
36
|
-
readOnlyHint: false,
|
|
37
|
-
destructiveHint: false,
|
|
38
|
-
idempotentHint: true,
|
|
39
|
-
openWorldHint: true,
|
|
40
|
-
},
|
|
41
|
-
}, async ({ form_id, edit_token, question_id, rules }) => {
|
|
42
|
-
const result = await callApi(`/forms/${form_id}/questions/${question_id}/logic`, {
|
|
43
|
-
method: "PUT",
|
|
44
|
-
token: edit_token,
|
|
45
|
-
body: { rules },
|
|
46
|
-
});
|
|
47
|
-
if (!result.ok) {
|
|
48
|
-
return errorResult(result.error);
|
|
49
|
-
}
|
|
50
|
-
return textResult(`Logic set on question ${question_id}.\n` +
|
|
51
|
-
`Rules created: ${result.data.rules_count}`);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=set-question-logic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set-question-logic.js","sourceRoot":"","sources":["../../src/tools/set-question-logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,uFAAuF,CACxF;IACH,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,CAAC,mDAAmD,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE;;;;;;;;IAQf;QACE,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,iCAAiC,CAAC;YAC9C,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,eAAe,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,uEAAuE,CAAC;SACrF;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,cAAc,WAAW,QAAQ,EAClD;YACE,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,KAAK,EAAE;SAChB,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,UAAU,CACf,yBAAyB,WAAW,KAAK;YACvC,kBAAkB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAC9C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-question.js","sourceRoot":"","sources":["../../src/tools/update-question.ts"],"names":[],"mappings":"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"}
|