@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
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function
|
|
4
|
-
server.registerTool("
|
|
5
|
-
title: "Delete
|
|
6
|
-
description: `Remove media from a
|
|
3
|
+
export function registerDeleteNodeMediaTool(server) {
|
|
4
|
+
server.registerTool("clipform_delete_node_media", {
|
|
5
|
+
title: "Delete Node Media",
|
|
6
|
+
description: `Remove media from a node. Deletes the media record and cleans up external resources (Mux video asset, storage file).`,
|
|
7
7
|
inputSchema: {
|
|
8
8
|
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
9
9
|
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
|
-
|
|
10
|
+
node_id: z.string().describe("The node ID"),
|
|
11
11
|
},
|
|
12
12
|
annotations: {
|
|
13
13
|
readOnlyHint: false,
|
|
@@ -15,15 +15,15 @@ export function registerDeleteQuestionMediaTool(server) {
|
|
|
15
15
|
idempotentHint: false,
|
|
16
16
|
openWorldHint: true,
|
|
17
17
|
},
|
|
18
|
-
}, async ({ form_id, edit_token,
|
|
19
|
-
const result = await callApi(`/forms/${form_id}/
|
|
18
|
+
}, async ({ form_id, edit_token, node_id }) => {
|
|
19
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}/media`, {
|
|
20
20
|
method: "DELETE",
|
|
21
21
|
token: edit_token,
|
|
22
22
|
});
|
|
23
23
|
if (!result.ok) {
|
|
24
24
|
return errorResult(result.error);
|
|
25
25
|
}
|
|
26
|
-
return textResult("Media removed from
|
|
26
|
+
return textResult("Media removed from node.");
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
//# sourceMappingURL=delete-
|
|
29
|
+
//# sourceMappingURL=delete-node-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-node-media.js","sourceRoot":"","sources":["../../src/tools/delete-node-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,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,sHAAsH;QACnI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;SAC5C;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,OAAO,EAAE,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,UAAU,OAAO,QAAQ,EAC1C;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,0BAA0B,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { fetchAndFormatFormState } from "../lib/format-form.js";
|
|
4
|
+
export function registerDeleteNodeTool(server) {
|
|
5
|
+
server.registerTool("clipform_delete_node", {
|
|
6
|
+
title: "Delete Node",
|
|
7
|
+
description: `Delete a node from a form. The logic chain is automatically re-linked (the previous node will point to the next one). Cannot delete the start node or the last end screen.`,
|
|
8
|
+
inputSchema: {
|
|
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."),
|
|
11
|
+
node_id: z.string().describe("The node ID to delete"),
|
|
12
|
+
},
|
|
13
|
+
annotations: {
|
|
14
|
+
readOnlyHint: false,
|
|
15
|
+
destructiveHint: true,
|
|
16
|
+
idempotentHint: false,
|
|
17
|
+
openWorldHint: true,
|
|
18
|
+
},
|
|
19
|
+
}, async ({ form_id, edit_token, node_id }) => {
|
|
20
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}`, {
|
|
21
|
+
method: "DELETE",
|
|
22
|
+
token: edit_token,
|
|
23
|
+
});
|
|
24
|
+
if (!result.ok) {
|
|
25
|
+
return errorResult(result.error);
|
|
26
|
+
}
|
|
27
|
+
const confirmMsg = `Node ${node_id} deleted. The logic chain has been re-linked.`;
|
|
28
|
+
const formState = await fetchAndFormatFormState(form_id, edit_token);
|
|
29
|
+
return textResult(formState ? `${confirmMsg}\n\n---\n\n${formState}` : confirmMsg);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=delete-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-node.js","sourceRoot":"","sources":["../../src/tools/delete-node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,4KAA4K;QACzL,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACtD;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,OAAO,EAAE,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,UAAU,OAAO,EAAE,EACpC;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,MAAM,UAAU,GAAG,QAAQ,OAAO,+CAA+C,CAAC;QAClF,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrE,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { callInternalApi,
|
|
2
|
+
import { callInternalApi, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { createJob, completeJob, failJob } from "../lib/render-jobs.js";
|
|
3
4
|
// Style knobs - mirror packages/remotion/src/compositions/slideshow/KenBurnsImage.tsx.
|
|
4
5
|
// Every field optional; unset fields fall back to library defaults (which shift
|
|
5
6
|
// automatically between 'cover' and 'blur-pad' fit modes).
|
|
@@ -121,7 +122,8 @@ Per-image preset wins over default_style preset. Per-field overrides (zoom, pan,
|
|
|
121
122
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
122
123
|
}, async ({ images, audio_url, random_effects, transition, default_style, background_color }) => {
|
|
123
124
|
const workspace_id = process.env.MCP_WORKSPACE_ID;
|
|
124
|
-
const
|
|
125
|
+
const job = createJob("clipform_generate_slideshow");
|
|
126
|
+
callInternalApi("/internal/slideshow", {
|
|
125
127
|
body: {
|
|
126
128
|
images,
|
|
127
129
|
audio_url,
|
|
@@ -131,18 +133,22 @@ Per-image preset wins over default_style preset. Per-field overrides (zoom, pan,
|
|
|
131
133
|
background_color,
|
|
132
134
|
workspace_id,
|
|
133
135
|
},
|
|
136
|
+
}).then((result) => {
|
|
137
|
+
if (!result.ok) {
|
|
138
|
+
failJob(job.id, result.error);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
completeJob(job.id, result.data);
|
|
142
|
+
}
|
|
143
|
+
}).catch((err) => {
|
|
144
|
+
failJob(job.id, err instanceof Error ? err.message : String(err));
|
|
134
145
|
});
|
|
135
|
-
if (!result.ok)
|
|
136
|
-
return errorResult(result.error);
|
|
137
|
-
const data = result.data;
|
|
138
146
|
return textResult([
|
|
139
|
-
`Slideshow
|
|
147
|
+
`Slideshow render started (${images.length} image${images.length > 1 ? "s" : ""}).`,
|
|
140
148
|
``,
|
|
141
|
-
`
|
|
142
|
-
`Public URL: ${data.public_url}`,
|
|
143
|
-
`Duration: ${data.duration_seconds}s`,
|
|
149
|
+
`Job ID: ${job.id}`,
|
|
144
150
|
``,
|
|
145
|
-
`
|
|
151
|
+
`Renders typically take 1-3 minutes. Use clipform_check_render with this job ID to check status.`,
|
|
146
152
|
].join("\n"));
|
|
147
153
|
});
|
|
148
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-slideshow.js","sourceRoot":"","sources":["../../src/tools/generate-slideshow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"generate-slideshow.js","sourceRoot":"","sources":["../../src/tools/generate-slideshow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +1,73 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
const TtsItemSchema = z.object({
|
|
4
|
+
text: z.string().min(1).max(5000).describe("Narration text"),
|
|
5
|
+
voice: z
|
|
6
|
+
.enum(["ryan", "sonia", "andrew", "ava", "guy"])
|
|
7
|
+
.optional()
|
|
8
|
+
.default("ryan")
|
|
9
|
+
.describe("TTS voice (default: ryan)"),
|
|
10
|
+
});
|
|
3
11
|
export function registerGenerateTtsTool(server) {
|
|
4
12
|
server.registerTool("clipform_generate_tts", {
|
|
5
13
|
title: "Generate Text-to-Speech",
|
|
6
|
-
description: `Generate narration audio from text using Edge TTS (free) with ElevenLabs fallback.
|
|
14
|
+
description: `Generate narration audio from text using Edge TTS (free) with ElevenLabs fallback. Pass one item or many (max 10) - multiple items run in parallel.
|
|
7
15
|
|
|
8
|
-
|
|
16
|
+
Workflow:
|
|
9
17
|
1. Generate TTS audio with this tool
|
|
10
18
|
2. Search for images with clipform_search_media (kind: "image")
|
|
11
19
|
3. Create a slideshow with clipform_generate_slideshow (pass the audio URL + image URLs)
|
|
12
|
-
4. Attach the video to a
|
|
20
|
+
4. Attach the video to a node with clipform_upload_node_media
|
|
13
21
|
|
|
14
|
-
Available voices:
|
|
15
|
-
- ryan: British male (default)
|
|
16
|
-
- sonia: British female
|
|
17
|
-
- andrew: American male
|
|
18
|
-
- ava: American female
|
|
19
|
-
- guy: American male (casual)
|
|
22
|
+
Available voices: ryan (British male, default), sonia (British female), andrew (American male), ava (American female), guy (American male casual).
|
|
20
23
|
|
|
21
|
-
Returns
|
|
24
|
+
Returns audio URL and word-level captions per item.`,
|
|
22
25
|
inputSchema: {
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
items: z
|
|
27
|
+
.array(TtsItemSchema)
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(10)
|
|
30
|
+
.describe("One or more TTS items to generate"),
|
|
25
31
|
},
|
|
26
32
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
27
|
-
}, async ({
|
|
33
|
+
}, async ({ items }) => {
|
|
28
34
|
const workspace_id = process.env.MCP_WORKSPACE_ID;
|
|
29
|
-
const
|
|
30
|
-
body: { text, voice, workspace_id },
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
const results = await Promise.allSettled(items.map((item) => callInternalApi("/internal/tts", {
|
|
36
|
+
body: { text: item.text, voice: item.voice, workspace_id },
|
|
37
|
+
})));
|
|
38
|
+
const lines = [];
|
|
39
|
+
let successCount = 0;
|
|
40
|
+
for (let i = 0; i < results.length; i++) {
|
|
41
|
+
const r = results[i];
|
|
42
|
+
if (items.length > 1)
|
|
43
|
+
lines.push(`--- Item ${i + 1} ---`);
|
|
44
|
+
if (r.status === "fulfilled" && r.value.ok) {
|
|
45
|
+
successCount++;
|
|
46
|
+
const data = r.value.data;
|
|
47
|
+
lines.push(`Voice: ${data.voice}`);
|
|
48
|
+
lines.push(`Audio URL: ${data.audioUrl}`);
|
|
49
|
+
lines.push(`Storage path: ${data.storagePath}`);
|
|
50
|
+
lines.push(`Captions: ${JSON.stringify(data.captions)}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const error = r.status === "rejected"
|
|
54
|
+
? r.reason?.message || String(r.reason)
|
|
55
|
+
: r.value.error;
|
|
56
|
+
const status = r.status === "fulfilled" ? r.value.status : 0;
|
|
57
|
+
const hint = status === 500 || status === 0
|
|
58
|
+
? " (transient - retrying may help)"
|
|
59
|
+
: "";
|
|
60
|
+
lines.push(`FAILED: ${error}${hint}`);
|
|
61
|
+
}
|
|
62
|
+
lines.push("");
|
|
63
|
+
}
|
|
64
|
+
if (items.length > 1) {
|
|
65
|
+
lines.unshift(`TTS: ${successCount}/${items.length} succeeded\n`);
|
|
66
|
+
}
|
|
67
|
+
lines.push(`IMPORTANT: When uploading the final video with clipform_upload_node_media, pass the COMPLETE Captions JSON above as the "captions" parameter — including the "words" arrays inside each segment. Do NOT strip or simplify the JSON. The viewer needs word-level timing data to display captions.`);
|
|
68
|
+
if (successCount === 0)
|
|
69
|
+
return errorResult(lines.join("\n"));
|
|
70
|
+
return textResult(lines.join("\n"));
|
|
47
71
|
});
|
|
48
72
|
}
|
|
49
73
|
//# sourceMappingURL=generate-tts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-tts.js","sourceRoot":"","sources":["../../src/tools/generate-tts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,
|
|
1
|
+
{"version":3,"file":"generate-tts.js","sourceRoot":"","sources":["../../src/tools/generate-tts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { callInternalApi,
|
|
2
|
+
import { callInternalApi, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { createJob, completeJob, failJob } from "../lib/render-jobs.js";
|
|
3
4
|
const slideshowStyleSchema = z.object({
|
|
4
5
|
preset: z.enum(["cinematic", "dramatic", "calm", "documentary", "dreamy", "moody"]).optional(),
|
|
5
6
|
zoom: z.object({ from: z.number().optional(), to: z.number().optional() }).optional(),
|
|
@@ -30,7 +31,7 @@ export function registerGenerateVideoTool(server) {
|
|
|
30
31
|
1. Source media with clipform_search_media (kind: "image" or "video")
|
|
31
32
|
2. Source audio with clipform_generate_tts (narration) or clipform_search_music (background)
|
|
32
33
|
3. Call this tool with items + audio_url
|
|
33
|
-
4. Attach the returned URL to a
|
|
34
|
+
4. Attach the returned URL to a node via clipform_upload_node_media with media_type "video"
|
|
34
35
|
|
|
35
36
|
## Items
|
|
36
37
|
|
|
@@ -84,7 +85,8 @@ Matches audio when audio_url is provided. Use duration_seconds for videos withou
|
|
|
84
85
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
85
86
|
}, async ({ items, audio_url, duration_seconds, random_effects, transition, default_style, background_color }) => {
|
|
86
87
|
const workspace_id = process.env.MCP_WORKSPACE_ID;
|
|
87
|
-
const
|
|
88
|
+
const job = createJob("clipform_generate_video");
|
|
89
|
+
callInternalApi("/internal/generate-video", {
|
|
88
90
|
body: {
|
|
89
91
|
items,
|
|
90
92
|
audio_url,
|
|
@@ -95,18 +97,22 @@ Matches audio when audio_url is provided. Use duration_seconds for videos withou
|
|
|
95
97
|
background_color,
|
|
96
98
|
workspace_id,
|
|
97
99
|
},
|
|
100
|
+
}).then((result) => {
|
|
101
|
+
if (!result.ok) {
|
|
102
|
+
failJob(job.id, result.error);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
completeJob(job.id, result.data);
|
|
106
|
+
}
|
|
107
|
+
}).catch((err) => {
|
|
108
|
+
failJob(job.id, err instanceof Error ? err.message : String(err));
|
|
98
109
|
});
|
|
99
|
-
if (!result.ok)
|
|
100
|
-
return errorResult(result.error);
|
|
101
|
-
const data = result.data;
|
|
102
110
|
return textResult([
|
|
103
|
-
`
|
|
111
|
+
`Render started (${items.length} item${items.length > 1 ? "s" : ""}).`,
|
|
104
112
|
``,
|
|
105
|
-
`
|
|
106
|
-
`Public URL: ${data.public_url}`,
|
|
107
|
-
`Duration: ${data.duration_seconds}s`,
|
|
113
|
+
`Job ID: ${job.id}`,
|
|
108
114
|
``,
|
|
109
|
-
`
|
|
115
|
+
`Renders typically take 1-3 minutes. Use clipform_check_render with this job ID to check status.`,
|
|
110
116
|
].join("\n"));
|
|
111
117
|
});
|
|
112
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../../src/tools/generate-video.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../../src/tools/generate-video.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/get-form.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { formatFormState } from "../lib/format-form.js";
|
|
3
4
|
export function registerGetFormTool(server) {
|
|
4
5
|
server.registerTool("clipform_get_form", {
|
|
5
6
|
title: "Get Clipform",
|
|
@@ -8,7 +9,8 @@ export function registerGetFormTool(server) {
|
|
|
8
9
|
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
9
10
|
edit_token: z
|
|
10
11
|
.string()
|
|
11
|
-
.
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("The edit token. Required for anonymous (non-OAuth) sessions; omit when connected via an authenticated MCP client like claude.ai."),
|
|
12
14
|
},
|
|
13
15
|
annotations: {
|
|
14
16
|
readOnlyHint: true,
|
|
@@ -23,30 +25,7 @@ export function registerGetFormTool(server) {
|
|
|
23
25
|
if (!result.ok) {
|
|
24
26
|
return errorResult(result.error);
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
const questions = data.questions;
|
|
28
|
-
const lines = [
|
|
29
|
-
`Form: ${data.title}`,
|
|
30
|
-
`Form ID: ${data.form_id}`,
|
|
31
|
-
`Published: ${data.is_published}`,
|
|
32
|
-
``,
|
|
33
|
-
`Questions (in order):`,
|
|
34
|
-
];
|
|
35
|
-
for (let i = 0; i < questions.length; i++) {
|
|
36
|
-
const q = questions[i];
|
|
37
|
-
lines.push(` ${i + 1}. [${q.type}] ${q.prompt || "(no prompt)"}`);
|
|
38
|
-
lines.push(` ID: ${q.id}`);
|
|
39
|
-
if (q.required)
|
|
40
|
-
lines.push(` Required: yes`);
|
|
41
|
-
if (q.config &&
|
|
42
|
-
Object.keys(q.config).length > 0) {
|
|
43
|
-
lines.push(` Config: ${JSON.stringify(q.config)}`);
|
|
44
|
-
}
|
|
45
|
-
if (q.options && q.options.length > 0) {
|
|
46
|
-
lines.push(` Options: ${q.options.map((o) => o.content).join(", ")}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return textResult(lines.join("\n"));
|
|
28
|
+
return textResult(formatFormState(result.data));
|
|
50
29
|
});
|
|
51
30
|
}
|
|
52
31
|
//# sourceMappingURL=get-form.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-form.js","sourceRoot":"","sources":["../../src/tools/get-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":"get-form.js","sourceRoot":"","sources":["../../src/tools/get-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,2IAA2I;QACxJ,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kIAAkI,CAAC;SAChJ;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,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,OAAO,EAAE,EAAE;YAChD,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,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { callApi, errorResult, textResult } from "../lib/api-client.js";
|
|
3
|
-
export function
|
|
4
|
-
server.registerTool("
|
|
5
|
-
title: "Get
|
|
6
|
-
description: `Get the media attached to a
|
|
3
|
+
export function registerGetNodeMediaTool(server) {
|
|
4
|
+
server.registerTool("clipform_get_node_media", {
|
|
5
|
+
title: "Get Node Media",
|
|
6
|
+
description: `Get the media attached to a node, including processing status. Useful for checking if a video upload has finished processing.`,
|
|
7
7
|
inputSchema: {
|
|
8
8
|
form_id: z.string().uuid().describe("The form UUID (returned by clipform_create_form, not the short share_id from the URL)"),
|
|
9
9
|
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
|
-
|
|
10
|
+
node_id: z.string().describe("The node ID"),
|
|
11
11
|
},
|
|
12
12
|
annotations: {
|
|
13
13
|
readOnlyHint: true,
|
|
@@ -15,8 +15,8 @@ export function registerGetQuestionMediaTool(server) {
|
|
|
15
15
|
idempotentHint: true,
|
|
16
16
|
openWorldHint: true,
|
|
17
17
|
},
|
|
18
|
-
}, async ({ form_id, edit_token,
|
|
19
|
-
const result = await callApi(`/forms/${form_id}/
|
|
18
|
+
}, async ({ form_id, edit_token, node_id }) => {
|
|
19
|
+
const result = await callApi(`/forms/${form_id}/nodes/${node_id}/media`, {
|
|
20
20
|
method: "GET",
|
|
21
21
|
token: edit_token,
|
|
22
22
|
});
|
|
@@ -25,7 +25,7 @@ export function registerGetQuestionMediaTool(server) {
|
|
|
25
25
|
}
|
|
26
26
|
const media = result.data.media;
|
|
27
27
|
if (!media) {
|
|
28
|
-
return textResult("No media attached to this
|
|
28
|
+
return textResult("No media attached to this node.");
|
|
29
29
|
}
|
|
30
30
|
return textResult(`Media ID: ${media.id}\n` +
|
|
31
31
|
`Type: ${media.media_type}\n` +
|
|
@@ -36,4 +36,4 @@ export function registerGetQuestionMediaTool(server) {
|
|
|
36
36
|
`Transcription: ${media.transcription_status}`);
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
-
//# sourceMappingURL=get-
|
|
39
|
+
//# sourceMappingURL=get-node-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-node-media.js","sourceRoot":"","sources":["../../src/tools/get-node-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,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,+HAA+H;QAC5I,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;YAC5H,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kIAAkI,CAAC;YAC9K,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;SAC5C;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,OAAO,EAAE,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,UAAU,OAAO,UAAU,OAAO,QAAQ,EAC1C;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,iCAAiC,CAAC,CAAC;QACvD,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,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { callInternalApi,
|
|
2
|
+
import { callInternalApi, textResult } from "../lib/api-client.js";
|
|
3
|
+
import { createJob, completeJob, failJob } from "../lib/render-jobs.js";
|
|
3
4
|
export function registerRenderCompositionTool(server) {
|
|
4
5
|
server.registerTool("clipform_render_composition", {
|
|
5
6
|
title: "Render Composition",
|
|
@@ -18,27 +19,31 @@ For narrated quiz slideshows, prefer clipform_generate_slideshow which handles t
|
|
|
18
19
|
},
|
|
19
20
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
20
21
|
}, async ({ compositionId, outputFormat, inputProps }) => {
|
|
21
|
-
const
|
|
22
|
+
const job = createJob("clipform_render_composition");
|
|
23
|
+
callInternalApi("/internal/render", {
|
|
22
24
|
body: {
|
|
23
25
|
compositionId,
|
|
24
26
|
outputFormat,
|
|
25
27
|
inputProps: inputProps ?? {},
|
|
26
28
|
},
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
}).then((result) => {
|
|
30
|
+
if (!result.ok) {
|
|
31
|
+
failJob(job.id, result.error);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
completeJob(job.id, result.data);
|
|
31
35
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
}).catch((err) => {
|
|
37
|
+
failJob(job.id, err instanceof Error ? err.message : String(err));
|
|
38
|
+
});
|
|
35
39
|
return textResult([
|
|
36
|
-
`Render
|
|
40
|
+
`Render started.`,
|
|
37
41
|
``,
|
|
38
42
|
`Composition: ${compositionId}`,
|
|
39
|
-
`Format: ${
|
|
40
|
-
`
|
|
41
|
-
|
|
43
|
+
`Format: ${outputFormat}`,
|
|
44
|
+
`Job ID: ${job.id}`,
|
|
45
|
+
``,
|
|
46
|
+
`Renders typically take 1-3 minutes. Use clipform_check_render with this job ID to check status.`,
|
|
42
47
|
].join("\n"));
|
|
43
48
|
});
|
|
44
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-composition.js","sourceRoot":"","sources":["../../src/tools/render-composition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"render-composition.js","sourceRoot":"","sources":["../../src/tools/render-composition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAe,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE;;;;;;;qPAOkO;QAC/O,WAAW,EAAE;YACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;YACrH,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YACnG,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;SACjH;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1G,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAErD,eAAe,CAAC,kBAAkB,EAAE;YAClC,IAAI,EAAE;gBACJ,aAAa;gBACb,YAAY;gBACZ,UAAU,EAAE,UAAU,IAAI,EAAE;aAC7B;SACF,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CACf;YACE,iBAAiB;YACjB,EAAE;YACF,gBAAgB,aAAa,EAAE;YAC/B,WAAW,YAAY,EAAE;YACzB,WAAW,GAAG,CAAC,EAAE,EAAE;YACnB,EAAE;YACF,iGAAiG;SAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { callInternalApi, errorResult, textResult } from "../lib/api-client.js";
|
|
|
3
3
|
export function registerSearchMediaTool(server) {
|
|
4
4
|
server.registerTool("clipform_search_media", {
|
|
5
5
|
title: "Search Media",
|
|
6
|
-
description: `Search royalty-free images or stock video clips to attach to a
|
|
6
|
+
description: `Search royalty-free images or stock video clips to attach to a node. Routes across Pexels, Unsplash, Pixabay, Wikimedia, NASA, and iNaturalist for images; Pexels and Pixabay for video. The router picks relevant providers based on the topic (space → NASA, nature → iNaturalist, general → stock libraries). Returns URLs you can pass to clipform_upload_node_media or clipform_generate_slideshow.`,
|
|
7
7
|
inputSchema: {
|
|
8
8
|
query: z.string().describe("What to search for (e.g. 'african lion', 'saturn rings', 'city timelapse')"),
|
|
9
9
|
kind: z.enum(["image", "video"]).describe("image = stock photos, video = stock clips"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-media.js","sourceRoot":"","sources":["../../src/tools/search-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"search-media.js","sourceRoot":"","sources":["../../src/tools/search-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,0YAA0Y;QACvZ,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4EAA4E,CAAC;YACxG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBACnD,QAAQ,CAAC,6DAA6D,CAAC;SAC3E;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,wBAAwB,EAAE;YAC7D,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,OAAgB,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC,MAAM,IAAI,gBAAgB,KAAK,IAAI,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnF,IAAI,IAAI,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
|