@clipform/mcp-server 3.3.2 → 3.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,17 +44,13 @@ claude mcp add clipform -e CLIPFORM_API_KEY=cf_xxx -- npx -y @clipform/mcp-serve
44
44
  }
45
45
  ```
46
46
 
47
- Self-service API key generation is coming soon. For now, your API key is provided during onboarding or via your account settings - contact support if you need one.
48
-
49
- You can also pass the key as a CLI flag: `npx -y @clipform/mcp-server --api-key=cf_xxx`
50
-
51
- **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.
47
+ Generate an API key in your Clipform dashboard under **Developers > API keys**. The local server always needs one - to try Clipform without an account, connect to `https://mcp.clipform.io` instead (see "How it works").
52
48
 
53
49
  ### Environment variables
54
50
 
55
51
  | Variable | Required | Purpose |
56
52
  |----------|----------|---------|
57
- | `CLIPFORM_API_KEY` | For workspace auth | Bearer key - forms land in the key's workspace with its plan limits. Also unlocks the creative tools (search, TTS, video rendering). Omit for anonymous mode. |
53
+ | `CLIPFORM_API_KEY` | For workspace auth | Bearer key - forms land in the key's workspace with its plan limits. Also unlocks the creative tools (search, TTS, video rendering). Required by the local server. |
58
54
  | `API_URL` | Yes | Clipform API base URL (`https://api.clipform.io`, or your local/self-hosted API). |
59
55
 
60
56
  ## Tools
@@ -106,7 +102,9 @@ Your MCP client lists these automatically on connect (via `tools/list`). Full re
106
102
 
107
103
  **Local with API key:** The `CLIPFORM_API_KEY` is sent as a standard `Authorization: Bearer` header. Forms are created directly in the key's workspace with your plan tier limits.
108
104
 
109
- **Local anonymous (no key):** Forms go into a shared unclaimed workspace. No auth is needed to edit them - the form UUID is the only credential. You'll get a claim URL to transfer ownership. Free-tier 3-node limit applies.
105
+ **Remote anonymous (no sign-in):** Connecting to `https://mcp.clipform.io` without signing in builds into a temporary account of the session's own. Forms stay drafts with a private preview link - nothing goes live - and while unclaimed, the form UUID is the credential to edit it. Build results include a one-time claim URL that signs you into that account (on the first form, periodically after, and at the form limit); free-plan limits apply. The local stdio server always needs `CLIPFORM_API_KEY`.
106
+
107
+ These tools need a signed-in Clipform account (OAuth, or an API key): `clipform_list_forms`, `clipform_whoami`, `clipform_get_results`, `clipform_get_responses`, `clipform_delete_form`. An anonymous remote session that calls one is asked to sign in instead. Everything else, including `clipform_get_guide`, `clipform_get_workflow` and `clipform_list_assets`, works without an account.
110
108
 
111
109
  Forms are created with a start node and end screen automatically - you just add the nodes in between.
112
110
 
@@ -50,17 +50,13 @@ claude mcp add clipform -e CLIPFORM_API_KEY=cf_xxx -- npx -y {{PKG}}
50
50
  }
51
51
  ```
52
52
 
53
- Self-service API key generation is coming soon. For now, your API key is provided during onboarding or via your account settings - contact support if you need one.
54
-
55
- You can also pass the key as a CLI flag: `npx -y {{PKG}} --api-key=cf_xxx`
56
-
57
- **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.
53
+ Generate an API key in your Clipform dashboard under **Developers > API keys**. The local server always needs one - to try Clipform without an account, connect to `{{MCP_URL}}` instead (see "How it works").
58
54
 
59
55
  ### Environment variables
60
56
 
61
57
  | Variable | Required | Purpose |
62
58
  |----------|----------|---------|
63
- | `CLIPFORM_API_KEY` | For workspace auth | Bearer key - forms land in the key's workspace with its plan limits. Also unlocks the creative tools (search, TTS, video rendering). Omit for anonymous mode. |
59
+ | `CLIPFORM_API_KEY` | For workspace auth | Bearer key - forms land in the key's workspace with its plan limits. Also unlocks the creative tools (search, TTS, video rendering). Required by the local server. |
64
60
  | `API_URL` | Yes | Clipform API base URL (`{{API_URL}}`, or your local/self-hosted API). |
65
61
 
66
62
  ## Tools
@@ -79,7 +75,9 @@ Your MCP client lists these automatically on connect (via `tools/list`). Full re
79
75
 
80
76
  **Local with API key:** The `CLIPFORM_API_KEY` is sent as a standard `Authorization: Bearer` header. Forms are created directly in the key's workspace with your plan tier limits.
81
77
 
82
- **Local anonymous (no key):** Forms go into a shared unclaimed workspace. No auth is needed to edit them - the form UUID is the only credential. You'll get a claim URL to transfer ownership. Free-tier 3-node limit applies.
78
+ **Remote anonymous (no sign-in):** Connecting to `{{MCP_URL}}` without signing in builds into a temporary account of the session's own. Forms stay drafts with a private preview link - nothing goes live - and while unclaimed, the form UUID is the credential to edit it. Build results include a one-time claim URL that signs you into that account (on the first form, periodically after, and at the form limit); free-plan limits apply. The local stdio server always needs `CLIPFORM_API_KEY`.
79
+
80
+ These tools need a signed-in Clipform account (OAuth, or an API key): `clipform_list_forms`, `clipform_whoami`, `clipform_get_results`, `clipform_get_responses`, `clipform_delete_form`. An anonymous remote session that calls one is asked to sign in instead. Everything else, including `clipform_get_guide`, `clipform_get_workflow` and `clipform_list_assets`, works without an account.
83
81
 
84
82
  Forms are created with a start node and end screen automatically - you just add the nodes in between.
85
83
 
@@ -0,0 +1,78 @@
1
+ interface ApiOptions {
2
+ method?: string;
3
+ body?: Record<string, unknown>;
4
+ params?: Record<string, string>;
5
+ timeoutMs?: number;
6
+ }
7
+ type ApiResult = {
8
+ ok: true;
9
+ data: Record<string, unknown>;
10
+ } | {
11
+ ok: false;
12
+ status: number;
13
+ error: string;
14
+ apiMessage?: string;
15
+ code?: string;
16
+ reason?: string;
17
+ };
18
+ declare function callApi(path: string, options?: ApiOptions): Promise<ApiResult>;
19
+ /** Next-step hint by status + path so an agent can recover instead of
20
+ * retrying blind (#651). The raw API message stays first, hint second. */
21
+ declare function recoveryHint(status: number, path: string, reason?: string): string | undefined;
22
+ declare function errorResult(message: string, meta?: Record<string, unknown>): {
23
+ _meta?: Record<string, unknown> | undefined;
24
+ content: {
25
+ type: "text";
26
+ text: string;
27
+ }[];
28
+ isError: boolean;
29
+ };
30
+ /**
31
+ * True exactly when a callApi failure is the `assertNotAnonymous` account
32
+ * gate (apps/api/src/lib/anonymous-guard.ts) - triple-keyed on status + code
33
+ * + reason so an ordinary 403 (PLAN_LIMIT, a genuine authorization denial, a
34
+ * 500) never escalates an already-logged-in caller into a pointless OAuth
35
+ * re-auth (#4088 over-escalation guard). The only MCP-reachable trigger
36
+ * today is `clipform_update_form`'s `is_live: true` (publish) - see that
37
+ * tool's own comment for why `clipform_create_form`'s use of this same
38
+ * predicate is currently dead code.
39
+ */
40
+ declare function isAnonymousAccountRequired(result: {
41
+ status: number;
42
+ code?: string;
43
+ reason?: string;
44
+ }): boolean;
45
+ /**
46
+ * Builds the `_meta["mcp/www_authenticate"]` array a tool result carries to
47
+ * trigger the Apps SDK's tool-level OAuth escalation (#4088): an array of
48
+ * RFC 6750 Bearer challenge strings, the runtime half of the two-part
49
+ * contract (the other half is the static MCP_TOOL_SECURITY declaration) -
50
+ * per the Apps SDK auth docs, metadata alone never triggers the flow,
51
+ * only a runtime error carrying this `_meta` key does. Same challenge shape
52
+ * `apps/api/src/mcp/handler.ts` already emits as a real `WWW-Authenticate`
53
+ * HTTP header for a bad/missing Bearer - this is the tool-result equivalent
54
+ * for a caller that reached a tool (anonymously) but hit a feature that
55
+ * requires an account.
56
+ */
57
+ declare function authChallengeMeta(errorCode: string, description: string, resourceMetadata?: string): Record<string, unknown>;
58
+ declare function textResult(text: string): {
59
+ content: {
60
+ type: "text";
61
+ text: string;
62
+ }[];
63
+ };
64
+ /** Like textResult, but also carries a machine-readable `structuredContent`.
65
+ * A tool that declares an `outputSchema` MUST return `structuredContent` on
66
+ * every non-error result (the MCP SDK validates it and throws otherwise) - use
67
+ * this for every success/empty path, and `errorResult` (exempt) for failures.
68
+ * Project to the schema's explicit field set here - never pass raw API rows
69
+ * (response-hygiene invariant, #797). */
70
+ declare function structuredResult(text: string, structuredContent: Record<string, unknown>): {
71
+ content: {
72
+ type: "text";
73
+ text: string;
74
+ }[];
75
+ structuredContent: Record<string, unknown>;
76
+ };
77
+
78
+ export { authChallengeMeta, callApi, errorResult, isAnonymousAccountRequired, recoveryHint, structuredResult, textResult };
@@ -0,0 +1,22 @@
1
+ import {
2
+ authChallengeMeta,
3
+ callApi,
4
+ errorResult,
5
+ isAnonymousAccountRequired,
6
+ recoveryHint,
7
+ structuredResult,
8
+ textResult
9
+ } from "./chunk-SHTP4AJC.js";
10
+ import "./chunk-VPF6MLKM.js";
11
+ import "./chunk-PBQ5BQWD.js";
12
+ import "./chunk-G3PMV62Z.js";
13
+ export {
14
+ authChallengeMeta,
15
+ callApi,
16
+ errorResult,
17
+ isAnonymousAccountRequired,
18
+ recoveryHint,
19
+ structuredResult,
20
+ textResult
21
+ };
22
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -17,6 +17,7 @@ interface McpAuthContext {
17
17
  is_anonymous?: boolean;
18
18
  auth_via?: "oauth";
19
19
  mcp_mint_proof?: string;
20
+ mcp_session_proof?: string;
20
21
  resolveWorkspace?: (target: {
21
22
  workspace_id?: string;
22
23
  form_id?: string;
@@ -30,6 +31,10 @@ interface McpAuthContext {
30
31
  name: string;
31
32
  }[]>;
32
33
  default_workspace_id?: string;
34
+ mcp_session_id?: string;
35
+ loadInternalContent?: (kind: "guides" | "assets", params?: {
36
+ type?: string;
37
+ }) => Promise<Record<string, unknown>>;
33
38
  }
34
39
  /**
35
40
  * Marker header the in-process MCP tool layer sets on its outgoing API
@@ -65,8 +70,12 @@ declare const MCP_AUTH_VIA_HEADER = "x-clipform-auth-via";
65
70
  * victim's uid themselves (#3330 review).
66
71
  */
67
72
  declare const MCP_MINT_PROOF_HEADER = "x-clipform-mcp-mint-proof";
73
+ /** #4090: carries `mcp_session_proof` (same trust model as MCP_MINT_PROOF_HEADER: HMAC-verified server-side, never trusted raw). */
74
+ declare const MCP_SESSION_PROOF_HEADER = "x-clipform-mcp-session-proof";
75
+ /** Carries `mcp_session_id` to the API for funnel analytics only (#4657). */
76
+ declare const MCP_SESSION_ID_HEADER = "x-clipform-mcp-session-id";
68
77
  declare function runWithMcpAuth<T>(ctx: McpAuthContext, fn: () => Promise<T> | T): Promise<T> | T;
69
78
  declare function getMcpAuth(): McpAuthContext | undefined;
70
79
  declare function runWithMcpTool<T>(toolName: string, fn: () => Promise<T> | T): Promise<T> | T;
71
80
 
72
- export { MCP_ANONYMOUS_HEADER, MCP_AUTH_VIA_HEADER, MCP_MINT_PROOF_HEADER, type McpAuthContext, getMcpAuth, runWithMcpAuth, runWithMcpTool };
81
+ export { MCP_ANONYMOUS_HEADER, MCP_AUTH_VIA_HEADER, MCP_MINT_PROOF_HEADER, MCP_SESSION_ID_HEADER, MCP_SESSION_PROOF_HEADER, type McpAuthContext, getMcpAuth, runWithMcpAuth, runWithMcpTool };
@@ -2,15 +2,19 @@ import {
2
2
  MCP_ANONYMOUS_HEADER,
3
3
  MCP_AUTH_VIA_HEADER,
4
4
  MCP_MINT_PROOF_HEADER,
5
+ MCP_SESSION_ID_HEADER,
6
+ MCP_SESSION_PROOF_HEADER,
5
7
  getMcpAuth,
6
8
  runWithMcpAuth,
7
9
  runWithMcpTool
8
- } from "./chunk-A5CFGL27.js";
10
+ } from "./chunk-VPF6MLKM.js";
9
11
  import "./chunk-G3PMV62Z.js";
10
12
  export {
11
13
  MCP_ANONYMOUS_HEADER,
12
14
  MCP_AUTH_VIA_HEADER,
13
15
  MCP_MINT_PROOF_HEADER,
16
+ MCP_SESSION_ID_HEADER,
17
+ MCP_SESSION_PROOF_HEADER,
14
18
  getMcpAuth,
15
19
  runWithMcpAuth,
16
20
  runWithMcpTool
@@ -1,20 +1,32 @@
1
+ import {
2
+ FULL_CAPS,
3
+ getSessionContext
4
+ } from "./chunk-YOVLSXPW.js";
1
5
  import {
2
6
  ALL_VARIANTS,
3
7
  FORM_TYPES,
4
8
  FORM_TYPE_KEYS,
5
- FULL_CAPS,
6
- callApi,
7
- getSessionContext
8
- } from "./chunk-65MTGAFF.js";
9
+ callApi
10
+ } from "./chunk-SHTP4AJC.js";
11
+ import {
12
+ getMcpAuth
13
+ } from "./chunk-VPF6MLKM.js";
9
14
 
10
15
  // src/lib/guides.ts
11
16
  var guidesPromise = null;
12
17
  async function loadGuides() {
13
- const result = await callApi("/internal/mcp/guides", { method: "GET" });
14
- if (!result.ok) {
15
- throw new Error(`Failed to load guides: ${result.error}`);
18
+ const loader = getMcpAuth()?.loadInternalContent;
19
+ let data;
20
+ if (loader) {
21
+ data = await loader("guides");
22
+ } else {
23
+ const result = await callApi("/internal/mcp/guides", { method: "GET" });
24
+ if (!result.ok) {
25
+ throw new Error(`Failed to load guides: ${result.error}`);
26
+ }
27
+ data = result.data;
16
28
  }
17
- const guides = result.data.guides ?? [];
29
+ const guides = data.guides ?? [];
18
30
  return new Map(guides.map((g) => [g.uri, g]));
19
31
  }
20
32
  async function fetchGuideText(uri) {
@@ -143,4 +155,4 @@ export {
143
155
  getGuideUri,
144
156
  registerResources
145
157
  };
146
- //# sourceMappingURL=chunk-KHRY3A3M.js.map
158
+ //# sourceMappingURL=chunk-5SCRFNYJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/guides.ts","../src/resources.ts"],"sourcesContent":["import { callApi } from \"./api-client.js\";\nimport { getMcpAuth } from \"./auth-context.js\";\nimport type { ServerCaps } from \"./caps.js\";\n\n/**\n * Craft guide bodies live server-side (#470) - the npm package is a shim\n * that fetches them at runtime instead of bundling them in the tarball.\n * One fetch per process (all ~30KB of guides in a single response), cached;\n * a failed fetch is NOT cached so the next read retries.\n */\n\nexport interface RemoteGuide {\n type: string;\n variant: string | null;\n uri: string;\n mimeType: string;\n text: string;\n}\n\nlet guidesPromise: Promise<Map<string, RemoteGuide>> | null = null;\n\nasync function loadGuides(): Promise<Map<string, RemoteGuide>> {\n // #4657: the anonymous no-workspace lane serves the static guides in-process.\n const loader = getMcpAuth()?.loadInternalContent;\n let data: Record<string, unknown>;\n if (loader) {\n data = await loader(\"guides\");\n } else {\n const result = await callApi(\"/internal/mcp/guides\", { method: \"GET\" });\n if (!result.ok) {\n throw new Error(`Failed to load guides: ${result.error}`);\n }\n data = result.data;\n }\n const guides = (data as { guides?: RemoteGuide[] }).guides ?? [];\n return new Map(guides.map((g) => [g.uri, g]));\n}\n\n/** Fetch a guide body by its clipform:// URI. Returns null when unavailable. */\nexport async function fetchGuideText(uri: string): Promise<string | null> {\n if (!guidesPromise) {\n guidesPromise = loadGuides();\n }\n try {\n const guides = await guidesPromise;\n return guides.get(uri)?.text ?? null;\n } catch (err) {\n guidesPromise = null; // don't cache failures - retry on the next read\n // Loud, not silent: a misconfigured API_URL/key otherwise degrades every\n // guide to the stub with nothing in the logs.\n console.error(`[guides] Failed to fetch ${uri}: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n}\n\n/** Shown in place of a guide when the API is unreachable or unauthenticated. */\nexport function guideFallbackText(uri: string): string {\n return [\n `# Guide unavailable`,\n ``,\n `The craft guide (${uri}) could not be loaded from the Clipform API.`,\n `Guides are served at runtime and need a reachable API with a valid key -`,\n `check API_URL and CLIPFORM_API_KEY, then try again.`,\n ``,\n `General principles in the meantime: write narration for the ear (short,`,\n `conversational), never reveal answers in narration or media, and keep`,\n `forms tight - every question must earn its place.`,\n ].join(\"\\n\");\n}\n\n/**\n * Craft guide bodies are written for the full tool surface and mention the\n * narration/video tools by name. On a surface that doesn't register them\n * (the Claude Connectors Directory resource, #3681) prefix the guide with a\n * note so the model doesn't chase tools it can't call. The body itself is\n * untouched - the craft (question design, pacing) is the same either way.\n */\nexport function applyCapsToGuide(text: string, caps: ServerCaps): string {\n if (caps.media) return text;\n return [\n \"> **This connection exposes form-building tools only** - no narration, video, image, or music tools. Where this guide mentions narration, media, or rendering, skip that part and carry the same craft into the written question text.\",\n \"\",\n text,\n ].join(\"\\n\");\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { getSessionContext } from \"./lib/session-context.js\";\nimport { FORM_TYPE_KEYS, FORM_TYPES, ALL_VARIANTS } from \"@vid-master/config\";\n\nexport const GUIDE_TYPES = FORM_TYPE_KEYS as readonly string[] as readonly [string, ...string[]];\nexport type GuideType = (typeof FORM_TYPE_KEYS)[number];\n\nexport const QUIZ_VARIANTS = ALL_VARIANTS as readonly string[] as readonly [string, ...string[]];\nexport type QuizVariant = (typeof ALL_VARIANTS)[number];\n// Guide BODIES are not bundled here (#470): the npm tarball ships only this\n// registration metadata. Text is fetched from the API at runtime - see\n// lib/guides.ts (cached per process, stub fallback when unreachable).\nimport { fetchGuideText, guideFallbackText, applyCapsToGuide } from \"./lib/guides.js\";\nimport { FULL_CAPS, type ServerCaps } from \"./lib/caps.js\";\n\nconst GUIDE_DESCRIPTIONS: Record<GuideType, string> = {\n \"quiz\": \"Craft knowledge for writing engaging quizzes - difficulty curves, question psychology, narration style, scoring\",\n \"survey\": \"Craft knowledge for feedback surveys, NPS, and research forms - brevity, rating scales, respondent fatigue\",\n \"interview\": \"Craft knowledge for building interview forms - warm-up pacing, open questions, consent, video responses\",\n \"funnel\": \"Craft knowledge for lead qualification funnels - planned feature, conditional routing coming soon\",\n \"testimonial\": \"Craft knowledge for collecting testimonials and customer stories on video - storytelling prompts, comfort techniques, consent\",\n \"application\": \"Craft knowledge for application and evaluation forms - multi-section structure, video responses for behavioural questions, screening\",\n \"booking\": \"Craft knowledge for event registration and booking forms - minimal friction, video welcome, confirmation flow\",\n};\n\n// Sourced from config (single source of truth) so the agent-facing resource\n// descriptions can't drift from FORM_TYPES.quiz.variant_descriptions (#2534,\n// the exact pair packages/config/CLAUDE.md warns about).\nconst QUIZ_VARIANT_DESCRIPTIONS = FORM_TYPES.quiz.variant_descriptions;\n\nexport function getGuideUri(type: GuideType, variant?: QuizVariant): string {\n if (type === \"quiz\" && variant) {\n return `clipform://guides/quiz/${variant}`;\n }\n return `clipform://guides/${type}`;\n}\n\nasync function readGuide(uri: string, caps: ServerCaps): Promise<string> {\n return applyCapsToGuide((await fetchGuideText(uri)) ?? guideFallbackText(uri), caps);\n}\n\nexport function registerResources(server: McpServer, caps: ServerCaps = FULL_CAPS) {\n for (const type of GUIDE_TYPES) {\n server.registerResource(\n `guide-${type}`,\n getGuideUri(type),\n {\n description: GUIDE_DESCRIPTIONS[type],\n mimeType: \"text/markdown\",\n annotations: { audience: [\"assistant\" as const], priority: 0.8 },\n },\n async () => ({\n contents: [{\n uri: getGuideUri(type),\n mimeType: \"text/markdown\",\n text: await readGuide(getGuideUri(type), caps),\n }],\n }),\n );\n }\n\n for (const variant of QUIZ_VARIANTS) {\n server.registerResource(\n `guide-quiz-${variant}`,\n getGuideUri(\"quiz\", variant),\n {\n description: QUIZ_VARIANT_DESCRIPTIONS[variant],\n mimeType: \"text/markdown\",\n annotations: { audience: [\"assistant\" as const], priority: 0.8 },\n },\n async () => ({\n contents: [{\n uri: getGuideUri(\"quiz\", variant),\n mimeType: \"text/markdown\",\n text: await readGuide(getGuideUri(\"quiz\", variant), caps),\n }],\n }),\n );\n }\n\n server.registerResource(\n \"context-session\",\n \"clipform://context/session\",\n {\n description:\n \"Current session info: auth mode, workspace name, plan name, and node/form limits. Read this before planning content to know your constraints.\",\n mimeType: \"text/markdown\",\n annotations: { audience: [\"assistant\"], priority: 1.0 },\n },\n async () => {\n const text = await getSessionContext();\n return {\n contents: [\n {\n uri: \"clipform://context/session\",\n mimeType: \"text/markdown\",\n text: text || \"Session context unavailable - API may not be reachable.\",\n },\n ],\n };\n }\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,11 @@
1
1
  import {
2
2
  FULL_CAPS,
3
- WORKFLOW_TYPES,
4
- getDiscoveryParams,
5
3
  getSessionContextWithAuth
6
- } from "./chunk-65MTGAFF.js";
4
+ } from "./chunk-YOVLSXPW.js";
5
+ import {
6
+ WORKFLOW_TYPES,
7
+ getDiscoveryParams
8
+ } from "./chunk-SHTP4AJC.js";
7
9
  import {
8
10
  __export
9
11
  } from "./chunk-G3PMV62Z.js";
@@ -4856,4 +4858,4 @@ export {
4856
4858
  getWorkflowText,
4857
4859
  registerPrompts
4858
4860
  };
4859
- //# sourceMappingURL=chunk-5J5N7KTW.js.map
4861
+ //# sourceMappingURL=chunk-GJ3XQSQY.js.map