celavii-mcp 0.1.0 → 0.1.3
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 +3 -3
- package/dist/index.js +114 -63
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Celavii MCP Server
|
|
2
2
|
|
|
3
|
-
Connect your [Celavii](https://celavii.com) account to AI-powered IDEs and assistants — Windsurf, Cursor, Claude Code, Claude.ai, VS Code + Copilot, Cline, Zed, and more.
|
|
3
|
+
Connect your [Celavii](https://www.celavii.com) account to AI-powered IDEs and assistants — Windsurf, Cursor, Claude Code, Claude.ai, VS Code + Copilot, Cline, Zed, and more.
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
7
|
### 1. Get your API key
|
|
8
8
|
|
|
9
|
-
Go to [celavii.com/settings/api-keys](https://celavii.com/settings/api-keys) and create an API key.
|
|
9
|
+
Go to [celavii.com/settings/api-keys](https://www.celavii.com/settings/api-keys) and create an API key.
|
|
10
10
|
|
|
11
11
|
### 2. Add to your IDE
|
|
12
12
|
|
|
@@ -77,7 +77,7 @@ Ask your AI assistant things like:
|
|
|
77
77
|
| Variable | Required | Description |
|
|
78
78
|
|----------|----------|-------------|
|
|
79
79
|
| `CELAVII_API_KEY` | **Yes** | Your Celavii API key (`cvii_live_...`) |
|
|
80
|
-
| `CELAVII_BASE_URL` | No | Override the API base URL (default: `https://celavii.com/api/v1`) |
|
|
80
|
+
| `CELAVII_BASE_URL` | No | Override the API base URL (default: `https://www.celavii.com/api/v1`) |
|
|
81
81
|
|
|
82
82
|
## Credits & Rate Limits
|
|
83
83
|
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
7
7
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
8
|
|
|
9
9
|
// src/client.ts
|
|
10
|
-
var DEFAULT_BASE_URL = "https://celavii.com/api/v1";
|
|
10
|
+
var DEFAULT_BASE_URL = "https://www.celavii.com/api/v1";
|
|
11
11
|
var CelaviiApiError = class extends Error {
|
|
12
12
|
constructor(message, code, status, retryAfter) {
|
|
13
13
|
super(message);
|
|
@@ -162,7 +162,7 @@ function registerProfileTools(server, client) {
|
|
|
162
162
|
},
|
|
163
163
|
async (args) => {
|
|
164
164
|
const params = new URLSearchParams();
|
|
165
|
-
params.set("
|
|
165
|
+
params.set("terms", args.affinities.join(","));
|
|
166
166
|
if (args.match_mode) params.set("match_mode", args.match_mode);
|
|
167
167
|
if (args.min_followers !== void 0) params.set("min_followers", String(args.min_followers));
|
|
168
168
|
if (args.max_followers !== void 0) params.set("max_followers", String(args.max_followers));
|
|
@@ -182,7 +182,7 @@ function registerProfileTools(server, client) {
|
|
|
182
182
|
})
|
|
183
183
|
},
|
|
184
184
|
async (args) => {
|
|
185
|
-
const result = await client.post("/profiles/bulk", {
|
|
185
|
+
const result = await client.post("/profiles/bulk", { profiles: args.identifiers });
|
|
186
186
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
187
187
|
}
|
|
188
188
|
);
|
|
@@ -492,7 +492,7 @@ function registerListTools(server, client) {
|
|
|
492
492
|
async (args) => {
|
|
493
493
|
const params = new URLSearchParams();
|
|
494
494
|
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
495
|
-
if (args.cursor) params.set("
|
|
495
|
+
if (args.cursor) params.set("offset", args.cursor);
|
|
496
496
|
const qs = params.toString();
|
|
497
497
|
const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ""}`);
|
|
498
498
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -511,7 +511,7 @@ function registerListTools(server, client) {
|
|
|
511
511
|
async (args) => {
|
|
512
512
|
const result = await client.post(
|
|
513
513
|
`/lists/${encodeURIComponent(args.list_id)}/members`,
|
|
514
|
-
{
|
|
514
|
+
{ profiles: args.identifiers }
|
|
515
515
|
);
|
|
516
516
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
517
517
|
}
|
|
@@ -529,7 +529,7 @@ function registerListTools(server, client) {
|
|
|
529
529
|
async (args) => {
|
|
530
530
|
const result = await client.delete(
|
|
531
531
|
`/lists/${encodeURIComponent(args.list_id)}/members`,
|
|
532
|
-
{
|
|
532
|
+
{ profiles: args.identifiers }
|
|
533
533
|
);
|
|
534
534
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
535
535
|
}
|
|
@@ -538,28 +538,43 @@ function registerListTools(server, client) {
|
|
|
538
538
|
|
|
539
539
|
// src/tools/analytics.ts
|
|
540
540
|
import { z as z5 } from "zod";
|
|
541
|
+
var demographicsSchema = z5.object({
|
|
542
|
+
profile_ids: z5.array(z5.string()).optional().describe("Array of usernames or profile IDs to analyze"),
|
|
543
|
+
scope: z5.enum(["global", "org"]).optional().describe("'global' (default, all profiles) or 'org' (managed only)")
|
|
544
|
+
});
|
|
545
|
+
var orgLevelSchema = z5.object({
|
|
546
|
+
scope: z5.enum(["global", "org"]).optional().describe("'global' (default, all profiles) or 'org' (managed only)"),
|
|
547
|
+
limit: z5.number().int().min(1).max(100).optional().describe("Max results (default 20, max 100)")
|
|
548
|
+
});
|
|
541
549
|
var profileSourceSchema = z5.object({
|
|
542
550
|
identifiers: z5.array(z5.string()).optional().describe("Array of usernames or profile IDs to analyze"),
|
|
543
551
|
list_id: z5.string().optional().describe("List UUID \u2014 analyze all members of this list"),
|
|
544
552
|
campaign_id: z5.string().optional().describe("Campaign UUID \u2014 analyze all creators in this campaign")
|
|
545
553
|
});
|
|
546
|
-
function
|
|
547
|
-
|
|
548
|
-
if (args.
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
554
|
+
async function resolveIdentifiers(client, args) {
|
|
555
|
+
if (args.identifiers?.length) return args.identifiers;
|
|
556
|
+
if (args.list_id) {
|
|
557
|
+
const resp = await client.get(`/lists/${args.list_id}/members?limit=100`);
|
|
558
|
+
return (resp.data || []).map((m) => m.username || m.profile_id || "").filter(Boolean);
|
|
559
|
+
}
|
|
560
|
+
if (args.campaign_id) {
|
|
561
|
+
const resp = await client.get(`/campaigns/${args.campaign_id}/creators?limit=100`);
|
|
562
|
+
return (resp.data || []).map((m) => m.username || m.profile_id || "").filter(Boolean);
|
|
563
|
+
}
|
|
564
|
+
return [];
|
|
552
565
|
}
|
|
553
566
|
function registerAnalyticsTools(server, client) {
|
|
554
567
|
server.registerTool(
|
|
555
568
|
"get_demographics",
|
|
556
569
|
{
|
|
557
570
|
title: "Get Demographics",
|
|
558
|
-
description: "Get audience demographics breakdown (age, gender distribution)
|
|
559
|
-
inputSchema:
|
|
571
|
+
description: "Get audience demographics breakdown (age, gender distribution). Optionally pass profile_ids to analyze a subset, or scope=org for managed profiles only. Costs 1 credit.",
|
|
572
|
+
inputSchema: demographicsSchema
|
|
560
573
|
},
|
|
561
574
|
async (args) => {
|
|
562
|
-
const params =
|
|
575
|
+
const params = new URLSearchParams();
|
|
576
|
+
if (args.profile_ids?.length) params.set("profile_ids", args.profile_ids.join(","));
|
|
577
|
+
if (args.scope) params.set("scope", args.scope);
|
|
563
578
|
const result = await client.get(`/analytics/demographics?${params}`);
|
|
564
579
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
565
580
|
}
|
|
@@ -568,11 +583,13 @@ function registerAnalyticsTools(server, client) {
|
|
|
568
583
|
"get_locations",
|
|
569
584
|
{
|
|
570
585
|
title: "Get Locations",
|
|
571
|
-
description: "Get location distribution
|
|
572
|
-
inputSchema:
|
|
586
|
+
description: "Get location distribution \u2014 top cities and countries. Use scope=org for managed profiles only. Costs 1 credit.",
|
|
587
|
+
inputSchema: orgLevelSchema
|
|
573
588
|
},
|
|
574
589
|
async (args) => {
|
|
575
|
-
const params =
|
|
590
|
+
const params = new URLSearchParams();
|
|
591
|
+
if (args.scope) params.set("scope", args.scope);
|
|
592
|
+
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
576
593
|
const result = await client.get(`/analytics/locations?${params}`);
|
|
577
594
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
578
595
|
}
|
|
@@ -581,11 +598,13 @@ function registerAnalyticsTools(server, client) {
|
|
|
581
598
|
"get_niches",
|
|
582
599
|
{
|
|
583
600
|
title: "Get Niches",
|
|
584
|
-
description: "Get niche/topic distribution
|
|
585
|
-
inputSchema:
|
|
601
|
+
description: "Get niche/topic distribution across profiles. Use scope=org for managed profiles only. Costs 1 credit.",
|
|
602
|
+
inputSchema: orgLevelSchema
|
|
586
603
|
},
|
|
587
604
|
async (args) => {
|
|
588
|
-
const params =
|
|
605
|
+
const params = new URLSearchParams();
|
|
606
|
+
if (args.scope) params.set("scope", args.scope);
|
|
607
|
+
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
589
608
|
const result = await client.get(`/analytics/niches?${params}`);
|
|
590
609
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
591
610
|
}
|
|
@@ -598,7 +617,9 @@ function registerAnalyticsTools(server, client) {
|
|
|
598
617
|
inputSchema: profileSourceSchema
|
|
599
618
|
},
|
|
600
619
|
async (args) => {
|
|
601
|
-
const
|
|
620
|
+
const ids = await resolveIdentifiers(client, args);
|
|
621
|
+
const params = new URLSearchParams();
|
|
622
|
+
if (ids.length) params.set("profile_ids", ids.join(","));
|
|
602
623
|
const result = await client.get(`/analytics/network-overlap?${params}`);
|
|
603
624
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
604
625
|
}
|
|
@@ -611,7 +632,9 @@ function registerAnalyticsTools(server, client) {
|
|
|
611
632
|
inputSchema: profileSourceSchema
|
|
612
633
|
},
|
|
613
634
|
async (args) => {
|
|
614
|
-
const
|
|
635
|
+
const ids = await resolveIdentifiers(client, args);
|
|
636
|
+
const params = new URLSearchParams();
|
|
637
|
+
if (ids.length) params.set("usernames", ids.join(","));
|
|
615
638
|
const result = await client.get(`/analytics/shared-hashtags?${params}`);
|
|
616
639
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
617
640
|
}
|
|
@@ -640,17 +663,21 @@ function registerAnalyticsTools(server, client) {
|
|
|
640
663
|
"get_affinity_posts",
|
|
641
664
|
{
|
|
642
665
|
title: "Get Affinity Posts",
|
|
643
|
-
description: "Get posts
|
|
666
|
+
description: "Get posts linked to a brand/topic affinity term. Searches globally across all profiles. Costs 1 credit.",
|
|
644
667
|
inputSchema: z5.object({
|
|
645
|
-
|
|
646
|
-
|
|
668
|
+
affinity: z5.string().describe('Affinity term to search for (e.g. "photography", "Nike", "fitness")'),
|
|
669
|
+
affinity_type: z5.enum(["all", "topic", "brand", "location", "category"]).optional().describe("Filter by affinity type (default: 'all')"),
|
|
670
|
+
min_engagement: z5.number().int().optional().describe("Minimum total engagement"),
|
|
671
|
+
sort: z5.enum(["engagement", "date"]).optional().describe("Sort order (default: 'engagement')"),
|
|
647
672
|
limit: z5.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)")
|
|
648
673
|
})
|
|
649
674
|
},
|
|
650
675
|
async (args) => {
|
|
651
676
|
const params = new URLSearchParams();
|
|
652
|
-
params.set("
|
|
653
|
-
if (args.
|
|
677
|
+
params.set("affinity", args.affinity);
|
|
678
|
+
if (args.affinity_type) params.set("affinity_type", args.affinity_type);
|
|
679
|
+
if (args.min_engagement !== void 0) params.set("min_engagement", String(args.min_engagement));
|
|
680
|
+
if (args.sort) params.set("sort", args.sort);
|
|
654
681
|
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
655
682
|
const result = await client.get(`/analytics/affinity-posts?${params}`);
|
|
656
683
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
@@ -683,7 +710,9 @@ function registerAnalyticsTools(server, client) {
|
|
|
683
710
|
inputSchema: profileSourceSchema
|
|
684
711
|
},
|
|
685
712
|
async (args) => {
|
|
686
|
-
const
|
|
713
|
+
const ids = await resolveIdentifiers(client, args);
|
|
714
|
+
const params = new URLSearchParams();
|
|
715
|
+
if (ids.length) params.set("profiles", ids.join(","));
|
|
687
716
|
const result = await client.get(`/analytics/cohort/stats?${params}`);
|
|
688
717
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
689
718
|
}
|
|
@@ -718,24 +747,22 @@ function registerContentTools(server, client) {
|
|
|
718
747
|
title: "Search Content",
|
|
719
748
|
description: "Search posts across the creator database by keywords, hashtags, or mentions. Returns matching posts with engagement metrics and media. Costs 1 credit.",
|
|
720
749
|
inputSchema: z6.object({
|
|
721
|
-
query: z6.string().
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
limit: z6.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)")
|
|
727
|
-
cursor: z6.string().optional().describe("Pagination cursor")
|
|
750
|
+
query: z6.string().describe("Search query \u2014 matches post captions (required)"),
|
|
751
|
+
author: z6.string().optional().describe("Filter by creator username"),
|
|
752
|
+
min_engagement: z6.number().int().optional().describe("Minimum total engagement (likes + comments)"),
|
|
753
|
+
since: z6.string().optional().describe("Only posts after this date (ISO 8601, e.g. 2025-01-01)"),
|
|
754
|
+
sort: z6.enum(["relevance", "engagement", "date"]).optional().describe("Sort order (default: 'relevance')"),
|
|
755
|
+
limit: z6.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)")
|
|
728
756
|
})
|
|
729
757
|
},
|
|
730
758
|
async (args) => {
|
|
731
759
|
const params = new URLSearchParams();
|
|
732
|
-
|
|
733
|
-
if (args.
|
|
734
|
-
if (args.
|
|
735
|
-
if (args.
|
|
736
|
-
if (args.
|
|
760
|
+
params.set("query", args.query);
|
|
761
|
+
if (args.author) params.set("author", args.author);
|
|
762
|
+
if (args.min_engagement !== void 0) params.set("min_engagement", String(args.min_engagement));
|
|
763
|
+
if (args.since) params.set("since", args.since);
|
|
764
|
+
if (args.sort) params.set("sort", args.sort);
|
|
737
765
|
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
738
|
-
if (args.cursor) params.set("cursor", args.cursor);
|
|
739
766
|
const result = await client.get(`/content/search?${params}`);
|
|
740
767
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
741
768
|
}
|
|
@@ -846,7 +873,11 @@ function registerKnowledgeTools(server, client) {
|
|
|
846
873
|
description: "Create a new knowledge base folder. Costs 0 credits.",
|
|
847
874
|
inputSchema: z8.object({
|
|
848
875
|
name: z8.string().describe("Folder name"),
|
|
849
|
-
description: z8.string().optional().describe("Optional description")
|
|
876
|
+
description: z8.string().optional().describe("Optional description"),
|
|
877
|
+
folder_type: z8.enum(["general", "brand", "campaign", "templates", "research"]).optional().describe("Folder type (default: 'general')"),
|
|
878
|
+
parent_folder_id: z8.string().optional().describe("UUID of parent folder for nesting"),
|
|
879
|
+
icon_name: z8.string().optional().describe("Lucide icon name"),
|
|
880
|
+
color: z8.string().optional().describe("Hex color (e.g. #8b5cf6)")
|
|
850
881
|
})
|
|
851
882
|
},
|
|
852
883
|
async (args) => {
|
|
@@ -881,8 +912,10 @@ function registerKnowledgeTools(server, client) {
|
|
|
881
912
|
description: "Create a new knowledge base entry in a folder. Costs 0 credits.",
|
|
882
913
|
inputSchema: z8.object({
|
|
883
914
|
folder_id: z8.string().describe("Folder UUID to add the entry to"),
|
|
884
|
-
|
|
885
|
-
content: z8.string().describe("Entry content (markdown supported)")
|
|
915
|
+
name: z8.string().describe("Entry name"),
|
|
916
|
+
content: z8.string().optional().describe("Entry content (markdown supported)"),
|
|
917
|
+
description: z8.string().optional().describe("Short description"),
|
|
918
|
+
source_url: z8.string().optional().describe("Source URL reference")
|
|
886
919
|
})
|
|
887
920
|
},
|
|
888
921
|
async (args) => {
|
|
@@ -908,11 +941,14 @@ function registerKnowledgeTools(server, client) {
|
|
|
908
941
|
"update_knowledge_entry",
|
|
909
942
|
{
|
|
910
943
|
title: "Update Knowledge Entry",
|
|
911
|
-
description: "Update a knowledge base entry
|
|
944
|
+
description: "Update a knowledge base entry. At least one field required. Costs 0 credits.",
|
|
912
945
|
inputSchema: z8.object({
|
|
913
946
|
entry_id: z8.string().describe("Entry UUID"),
|
|
914
|
-
|
|
915
|
-
content: z8.string().optional().describe("New content")
|
|
947
|
+
name: z8.string().optional().describe("New name"),
|
|
948
|
+
content: z8.string().optional().describe("New content"),
|
|
949
|
+
description: z8.string().optional().describe("New description"),
|
|
950
|
+
summary: z8.string().optional().describe("New summary"),
|
|
951
|
+
folder_id: z8.string().optional().describe("Move to a different folder (UUID)")
|
|
916
952
|
})
|
|
917
953
|
},
|
|
918
954
|
async (args) => {
|
|
@@ -938,19 +974,19 @@ function registerKnowledgeTools(server, client) {
|
|
|
938
974
|
server.registerTool(
|
|
939
975
|
"search_knowledge",
|
|
940
976
|
{
|
|
941
|
-
title: "
|
|
942
|
-
description: "
|
|
977
|
+
title: "Get Knowledge Context",
|
|
978
|
+
description: "Get aggregated brand context from the knowledge base, organized by folder type. Returns entries for AI agent consumption. Filter by folder type to get specific context. Costs 0 credits.",
|
|
943
979
|
inputSchema: z8.object({
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
980
|
+
folder_types: z8.array(z8.string()).optional().describe("Filter by folder types (e.g. ['brand', 'campaign', 'research'])"),
|
|
981
|
+
max_entries: z8.number().int().min(1).max(100).optional().describe("Maximum entries to return (default 20, max 100)"),
|
|
982
|
+
include_summaries: z8.boolean().optional().describe("Include entry summaries (default true)")
|
|
947
983
|
})
|
|
948
984
|
},
|
|
949
985
|
async (args) => {
|
|
950
986
|
const params = new URLSearchParams();
|
|
951
|
-
params.set("
|
|
952
|
-
if (args.
|
|
953
|
-
if (args.
|
|
987
|
+
if (args.folder_types?.length) params.set("folder_types", args.folder_types.join(","));
|
|
988
|
+
if (args.max_entries !== void 0) params.set("max_entries", String(args.max_entries));
|
|
989
|
+
if (args.include_summaries === false) params.set("include_summaries", "false");
|
|
954
990
|
const result = await client.get(`/knowledge/context?${params}`);
|
|
955
991
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
956
992
|
}
|
|
@@ -967,13 +1003,18 @@ function registerEnhanceTools(server, client) {
|
|
|
967
1003
|
description: "Trigger AI enhancement for one or more profiles. Enhancement adds affinities, demographics, niche analysis, and more. Returns a job ID \u2014 poll with get_enhancement_status to check progress. Costs 1+ credits.",
|
|
968
1004
|
inputSchema: z9.object({
|
|
969
1005
|
identifiers: z9.array(z9.string()).describe("Array of usernames or profile IDs to enhance"),
|
|
1006
|
+
mode: z9.enum(["basic", "enhanced"]).optional().describe("Enhancement mode: 'basic' (1 credit/profile) or 'enhanced' (2 credits/profile). Default: basic"),
|
|
1007
|
+
dry_run: z9.boolean().optional().describe("If true, returns cost estimate without triggering enhancement"),
|
|
1008
|
+
auto_confirm: z9.boolean().optional().describe("If true, auto-confirms the job without a separate confirm step"),
|
|
1009
|
+
authorize_overage: z9.boolean().optional().describe("If true, allows proceeding even if credits are insufficient"),
|
|
970
1010
|
options: z9.object({
|
|
971
1011
|
force: z9.boolean().optional().describe("Re-enhance even if already enhanced")
|
|
972
1012
|
}).optional().describe("Enhancement options")
|
|
973
1013
|
})
|
|
974
1014
|
},
|
|
975
1015
|
async (args) => {
|
|
976
|
-
const
|
|
1016
|
+
const { identifiers, options, ...rest } = args;
|
|
1017
|
+
const result = await client.post("/enhance/profiles", { profiles: identifiers, ...rest });
|
|
977
1018
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
978
1019
|
}
|
|
979
1020
|
);
|
|
@@ -1045,7 +1086,8 @@ function registerScrapeTools(server, client) {
|
|
|
1045
1086
|
})
|
|
1046
1087
|
},
|
|
1047
1088
|
async (args) => {
|
|
1048
|
-
const
|
|
1089
|
+
const { limit, ...rest } = args;
|
|
1090
|
+
const result = await client.post("/scrape/followers", { ...rest, ...limit !== void 0 && { max_results: limit } });
|
|
1049
1091
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1050
1092
|
}
|
|
1051
1093
|
);
|
|
@@ -1060,7 +1102,8 @@ function registerScrapeTools(server, client) {
|
|
|
1060
1102
|
})
|
|
1061
1103
|
},
|
|
1062
1104
|
async (args) => {
|
|
1063
|
-
const
|
|
1105
|
+
const { limit, ...rest } = args;
|
|
1106
|
+
const result = await client.post("/scrape/following", { ...rest, ...limit !== void 0 && { max_results: limit } });
|
|
1064
1107
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1065
1108
|
}
|
|
1066
1109
|
);
|
|
@@ -1076,7 +1119,11 @@ function registerScrapeTools(server, client) {
|
|
|
1076
1119
|
})
|
|
1077
1120
|
},
|
|
1078
1121
|
async (args) => {
|
|
1079
|
-
const
|
|
1122
|
+
const body = {};
|
|
1123
|
+
if (args.location_id) body.location_ids = [args.location_id];
|
|
1124
|
+
if (args.location_name) body.start_urls = [`https://www.instagram.com/explore/locations/${args.location_name}/`];
|
|
1125
|
+
if (args.limit !== void 0) body.max_items = args.limit;
|
|
1126
|
+
const result = await client.post("/scrape/locations", body);
|
|
1080
1127
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1081
1128
|
}
|
|
1082
1129
|
);
|
|
@@ -1091,7 +1138,10 @@ function registerScrapeTools(server, client) {
|
|
|
1091
1138
|
})
|
|
1092
1139
|
},
|
|
1093
1140
|
async (args) => {
|
|
1094
|
-
const result = await client.post("/scrape/hashtags",
|
|
1141
|
+
const result = await client.post("/scrape/hashtags", {
|
|
1142
|
+
hashtags: [args.hashtag],
|
|
1143
|
+
...args.limit !== void 0 && { max_items: args.limit }
|
|
1144
|
+
});
|
|
1095
1145
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1096
1146
|
}
|
|
1097
1147
|
);
|
|
@@ -1139,7 +1189,8 @@ function registerRefineTools(server, client) {
|
|
|
1139
1189
|
})
|
|
1140
1190
|
},
|
|
1141
1191
|
async (args) => {
|
|
1142
|
-
const
|
|
1192
|
+
const { identifiers, ...rest } = args;
|
|
1193
|
+
const result = await client.post("/refine/profiles", { profiles: identifiers, ...rest });
|
|
1143
1194
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1144
1195
|
}
|
|
1145
1196
|
);
|
|
@@ -1193,7 +1244,7 @@ async function main() {
|
|
|
1193
1244
|
const apiKey = process.env.CELAVII_API_KEY;
|
|
1194
1245
|
if (!apiKey) {
|
|
1195
1246
|
console.error(
|
|
1196
|
-
"Error: CELAVII_API_KEY environment variable is required.\nGet your API key at https://celavii.com/settings/api-keys\n\nUsage:\n CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp"
|
|
1247
|
+
"Error: CELAVII_API_KEY environment variable is required.\nGet your API key at https://www.celavii.com/settings/api-keys\n\nUsage:\n CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp"
|
|
1197
1248
|
);
|
|
1198
1249
|
process.exit(1);
|
|
1199
1250
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/meta.ts","../src/tools/profiles.ts","../src/tools/campaigns.ts","../src/tools/lists.ts","../src/tools/analytics.ts","../src/tools/content.ts","../src/tools/manage.ts","../src/tools/knowledge.ts","../src/tools/enhance.ts","../src/tools/scrape.ts","../src/tools/refine.ts"],"sourcesContent":["/**\n * Celavii MCP Server — stdio Entry Point\n *\n * Usage:\n * CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp\n *\n * Or in MCP config:\n * {\n * \"mcpServers\": {\n * \"celavii\": {\n * \"command\": \"npx\",\n * \"args\": [\"-y\", \"celavii-mcp@latest\"],\n * \"env\": { \"CELAVII_API_KEY\": \"cvii_live_xxx\" }\n * }\n * }\n * }\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { createServer } from './server.js'\n\nasync function main() {\n const apiKey = process.env.CELAVII_API_KEY\n if (!apiKey) {\n console.error(\n 'Error: CELAVII_API_KEY environment variable is required.\\n' +\n 'Get your API key at https://celavii.com/settings/api-keys\\n' +\n '\\nUsage:\\n' +\n ' CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp',\n )\n process.exit(1)\n }\n\n const baseUrl = process.env.CELAVII_BASE_URL || undefined\n\n const server = createServer({ apiKey, baseUrl })\n const transport = new StdioServerTransport()\n\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n})\n","/**\n * Celavii MCP Server — Server Setup & Tool Registration\n *\n * Creates an McpServer instance and registers all tools organized by category.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { CelaviiClient, CelaviiApiError } from './client.js'\nimport { registerMetaTools } from './tools/meta.js'\nimport { registerProfileTools } from './tools/profiles.js'\nimport { registerCampaignTools } from './tools/campaigns.js'\nimport { registerListTools } from './tools/lists.js'\nimport { registerAnalyticsTools } from './tools/analytics.js'\nimport { registerContentTools } from './tools/content.js'\nimport { registerManageTools } from './tools/manage.js'\nimport { registerKnowledgeTools } from './tools/knowledge.js'\nimport { registerEnhanceTools } from './tools/enhance.js'\nimport { registerScrapeTools } from './tools/scrape.js'\nimport { registerRefineTools } from './tools/refine.js'\n\nexport interface CreateServerOptions {\n apiKey: string\n baseUrl?: string\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const { apiKey, baseUrl } = options\n\n const server = new McpServer(\n {\n name: 'celavii',\n version: '0.1.0',\n },\n {\n capabilities: {\n logging: {},\n },\n },\n )\n\n const client = new CelaviiClient(apiKey, baseUrl)\n\n // Register all tool groups\n registerMetaTools(server, client)\n registerProfileTools(server, client)\n registerCampaignTools(server, client)\n registerListTools(server, client)\n registerAnalyticsTools(server, client)\n registerContentTools(server, client)\n registerManageTools(server, client)\n registerKnowledgeTools(server, client)\n registerEnhanceTools(server, client)\n registerScrapeTools(server, client)\n registerRefineTools(server, client)\n\n return server\n}\n\nexport { CelaviiClient, CelaviiApiError }\n","/**\n * Celavii MCP Server — HTTP Client\n *\n * Thin wrapper around fetch that adds Bearer auth, error handling,\n * and structured error responses for MCP tool handlers.\n */\n\nconst DEFAULT_BASE_URL = 'https://celavii.com/api/v1'\n\nexport class CelaviiApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public retryAfter?: number,\n ) {\n super(message)\n this.name = 'CelaviiApiError'\n }\n}\n\nexport class CelaviiClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(apiKey: string, baseUrl?: string) {\n this.apiKey = apiKey\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '')\n }\n\n private async request(path: string, init?: RequestInit): Promise<unknown> {\n const url = `${this.baseUrl}${path}`\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'celavii-mcp/0.1.0',\n ...init?.headers,\n },\n })\n\n let json: unknown\n try {\n json = await res.json()\n } catch {\n throw new CelaviiApiError(\n `HTTP ${res.status}: Failed to parse response`,\n 'INTERNAL_ERROR',\n res.status,\n )\n }\n\n if (!res.ok) {\n const err = json as { error?: { code?: string; message?: string; retry_after?: number } }\n const msg = err?.error?.message || `HTTP ${res.status}`\n const code = err?.error?.code || 'INTERNAL_ERROR'\n throw new CelaviiApiError(msg, code, res.status, err?.error?.retry_after)\n }\n\n return json\n }\n\n async get(path: string): Promise<unknown> {\n return this.request(path)\n }\n\n async post(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n }\n\n async put(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PUT',\n body: JSON.stringify(body),\n })\n }\n\n async delete(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'DELETE',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n}\n","/**\n * Meta tools — Account info and usage\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerMetaTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_account_info',\n {\n title: 'Get Account Info',\n description:\n 'Get information about the current API key, organization, and usage summary. ' +\n 'Useful to verify API key is working and see available scopes. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/me')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_usage',\n {\n title: 'Get Usage',\n description:\n 'Get credit usage and rate limit status for the current API key. ' +\n 'Shows total requests, credits used, daily breakdown, and rate limit info. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/usage')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Profile tools — Search, details, affinities, posts, network, bulk\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerProfileTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_profiles',\n {\n title: 'Search Profiles',\n description:\n 'Search the Celavii creator database. Filter by query text, niche, location, gender, ' +\n 'follower count. Returns matching Instagram profiles with basic stats. ' +\n 'At least one filter is required. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().optional().describe('Search query — matches username, display name, or bio keywords'),\n niche: z.string().optional().describe(\"Filter by niche/topic (e.g. 'fitness', 'fashion', 'tech')\"),\n location: z.string().optional().describe(\"Filter by location (e.g. 'Miami', 'Los Angeles, California')\"),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n has_contact: z.boolean().optional().describe('Only return profiles with email or phone'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.query) params.set('query', args.query)\n if (args.niche) params.set('niche', args.niche)\n if (args.location) params.set('location', args.location)\n if (args.gender) params.set('gender', args.gender)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.has_contact) params.set('has_contact', 'true')\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_profiles_by_affinities',\n {\n title: 'Search Profiles by Affinities',\n description:\n 'Search creators by their AI-analyzed brand or topic affinities. ' +\n 'Find creators who have affinity for specific brands, interests, or topics. Costs 1 credit.',\n inputSchema: z.object({\n affinities: z.array(z.string()).describe(\"Affinity terms to search for (e.g. ['Nike', 'fitness', 'running'])\"),\n match_mode: z.enum(['any', 'all']).optional().describe(\"'any' = match any affinity, 'all' = must match all (default: 'any')\"),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('affinities', args.affinities.join(','))\n if (args.match_mode) params.set('match_mode', args.match_mode)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search/affinities?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profiles_bulk',\n {\n title: 'Get Profiles Bulk',\n description:\n 'Get detailed information for multiple profiles at once by username or profile ID. ' +\n 'Up to 100 profiles per request. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/bulk', { identifiers: args.identifiers })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile',\n {\n title: 'Get Profile',\n description:\n 'Get detailed information about a single Instagram profile by username or profile ID. ' +\n 'Returns bio, stats, niche, location, and more. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username (without @) or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_affinities',\n {\n title: 'Get Profile Affinities',\n description:\n 'Get AI-analyzed brand and topic affinities for a profile. ' +\n 'Shows what brands, interests, and topics a creator is associated with. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/affinities`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_posts',\n {\n title: 'Get Profile Posts',\n description:\n 'Get recent posts for a profile. Returns post content, engagement metrics, ' +\n 'media URLs, and hashtags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of posts (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/posts${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_network',\n {\n title: 'Get Profile Network',\n description:\n 'Get the social network graph for a profile — mutual connections, ' +\n 'top followers, and following relationships. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/network`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_followers',\n {\n title: 'Get Profile Followers',\n description:\n 'Get the followers list for a profile. Only available if followers have been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of followers (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/followers${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_following',\n {\n title: 'Get Profile Following',\n description:\n 'Get the accounts a profile is following. Only available if following data has been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of following (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/following${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_social_links',\n {\n title: 'Get Profile Social Links',\n description:\n 'Get external social media links found in a profile bio (YouTube, TikTok, Twitter, etc.). Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/social-links`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_contact',\n {\n title: 'Get Profile Contact',\n description:\n 'Get contact information (email, phone) for a profile. ' +\n 'Requires the profiles:contact scope. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/contact`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Campaign tools — List, metrics, creators, content\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerCampaignTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_campaigns',\n {\n title: 'List Campaigns',\n description:\n 'List all campaigns in the organization. Optionally filter by status. Costs 0 credits.',\n inputSchema: z.object({\n status: z.enum(['active', 'draft', 'completed', 'archived']).optional().describe('Filter by campaign status'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of campaigns (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const qs = params.toString()\n const result = await client.get(`/campaigns${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_metrics',\n {\n title: 'Get Campaign Metrics',\n description:\n 'Get performance metrics for a specific campaign — total creators, posts, ' +\n 'engagement, reach, and more. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/metrics`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_creators',\n {\n title: 'Get Campaign Creators',\n description:\n 'Get the list of creators assigned to a campaign with their statuses and metrics. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/creators${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_content',\n {\n title: 'Get Campaign Content',\n description:\n 'Get content (posts) associated with a campaign. Includes engagement data ' +\n 'and media. Costs 1 credit.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/content${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * List tools — CRUD + member management\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerListTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_lists',\n {\n title: 'List Lists',\n description: 'Get all creator lists in the organization. Costs 0 credits.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_list',\n {\n title: 'Create List',\n description: 'Create a new creator list. Costs 1 credit.',\n inputSchema: z.object({\n name: z.string().describe('Name of the list'),\n description: z.string().optional().describe('Optional description'),\n }),\n },\n async (args) => {\n const result = await client.post('/lists', { name: args.name, description: args.description })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list',\n {\n title: 'Get List',\n description: 'Get details for a specific list by ID. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_list',\n {\n title: 'Update List',\n description: 'Update a list name or description. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n name: z.string().optional().describe('New name'),\n description: z.string().optional().describe('New description'),\n }),\n },\n async (args) => {\n const { list_id, ...body } = args\n const result = await client.patch(`/lists/${encodeURIComponent(list_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_list',\n {\n title: 'Delete List',\n description: 'Delete a list. This does not delete the creators in the list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list_members',\n {\n title: 'Get List Members',\n description: 'Get the creator profiles in a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'add_list_members',\n {\n title: 'Add List Members',\n description: 'Add creators to a list by username or profile ID. Costs 1 credit.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to add'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { identifiers: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'remove_list_members',\n {\n title: 'Remove List Members',\n description: 'Remove creators from a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to remove'),\n }),\n },\n async (args) => {\n const result = await client.delete(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { identifiers: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Analytics tools — Demographics, locations, niches, overlap, cohort\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\n/** Shared schema for profile source parameters used across analytics endpoints */\nconst profileSourceSchema = z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n})\n\nfunction buildSourceParams(args: { identifiers?: string[]; list_id?: string; campaign_id?: string }): URLSearchParams {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('identifiers', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n return params\n}\n\nexport function registerAnalyticsTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_demographics',\n {\n title: 'Get Demographics',\n description:\n 'Get audience demographics breakdown (age, gender distribution) for a set of profiles. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/demographics?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_locations',\n {\n title: 'Get Locations',\n description:\n 'Get location distribution for a set of profiles — top cities and countries. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/locations?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_niches',\n {\n title: 'Get Niches',\n description:\n 'Get niche/topic distribution for a set of profiles. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/niches?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_network_overlap',\n {\n title: 'Get Network Overlap',\n description:\n 'Get follower/following overlap between profiles. Shows shared connections. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/network-overlap?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_shared_hashtags',\n {\n title: 'Get Shared Hashtags',\n description:\n 'Get hashtags shared across a set of profiles. Shows common themes and topics. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/shared-hashtags?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_hashtag_creators',\n {\n title: 'Get Hashtag Creators',\n description:\n 'Find creators who use specific hashtags. Useful for discovering creators by topic. Costs 1 credit.',\n inputSchema: z.object({\n hashtags: z.array(z.string()).describe(\"Hashtags to search for (without #, e.g. ['fitness', 'gym'])\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('hashtags', args.hashtags.join(','))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/analytics/hashtag-creators?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_affinity_posts',\n {\n title: 'Get Affinity Posts',\n description:\n 'Get posts that demonstrate brand/topic affinities for specific creators. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs'),\n affinity: z.string().optional().describe('Filter to a specific affinity term'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('identifiers', args.identifiers.join(','))\n if (args.affinity) params.set('affinity', args.affinity)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/affinity-posts?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'analyze_cohort',\n {\n title: 'Analyze Cohort',\n description:\n 'Run a full cohort analysis on a set of profiles. Includes demographics, affinities, ' +\n 'hashtag usage, and aggregate stats. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs'),\n source: z.object({\n type: z.enum(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID (campaign UUID, list UUID, or hashtag)'),\n }).optional().describe('Alternative: analyze from a source (campaign, list, or hashtag)'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'hashtags', 'stats']\"),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_cohort_stats',\n {\n title: 'Get Cohort Stats',\n description:\n 'Get aggregate statistics for a cohort — average followers, engagement rate, etc. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\n const result = await client.get(`/analytics/cohort/stats?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'filter_cohort',\n {\n title: 'Filter Cohort',\n description:\n 'Filter a cohort of profiles by advanced criteria — follower range, engagement rate, ' +\n 'niche, location, affinities, and more. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs to filter'),\n source: z.object({\n type: z.enum(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID'),\n }).optional().describe('Alternative: filter from a source'),\n filters: z.record(z.string(), z.unknown()).optional().describe('Filter criteria (varies by field)'),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort/filter', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Content tools — Post search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerContentTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_content',\n {\n title: 'Search Content',\n description:\n 'Search posts across the creator database by keywords, hashtags, or mentions. ' +\n 'Returns matching posts with engagement metrics and media. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().optional().describe('Search query — matches post captions'),\n hashtag: z.string().optional().describe('Filter by hashtag (without #)'),\n username: z.string().optional().describe('Filter by creator username'),\n min_likes: z.number().int().optional().describe('Minimum likes'),\n min_comments: z.number().int().optional().describe('Minimum comments'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.query) params.set('query', args.query)\n if (args.hashtag) params.set('hashtag', args.hashtag)\n if (args.username) params.set('username', args.username)\n if (args.min_likes !== undefined) params.set('min_likes', String(args.min_likes))\n if (args.min_comments !== undefined) params.set('min_comments', String(args.min_comments))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/content/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Manage tools — CRM operations\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerManageTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_managed_profiles',\n {\n title: 'Get Managed Profiles',\n description:\n 'Get all profiles in the CRM pipeline with their relationship statuses, ' +\n 'notes, and tags. Costs 0 credits.',\n inputSchema: z.object({\n status: z.string().optional().describe(\"Filter by relationship status (e.g. 'outreached', 'negotiating', 'contracted')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/manage/profiles${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_crm_summary',\n {\n title: 'Get CRM Summary',\n description:\n 'Get a summary of the CRM pipeline — counts by status, recent activity, etc. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/summary')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_org_stats',\n {\n title: 'Get Organization Stats',\n description:\n 'Get aggregate statistics for the organization — total profiles, enhanced profiles, ' +\n 'scraped data, and more. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/stats')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationship',\n {\n title: 'Upsert Relationship',\n description:\n 'Create or update a CRM relationship for a creator. Set status, notes, tags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'identified', 'outreached', 'negotiating', 'contracted', 'active', 'paused')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n },\n async (args) => {\n const { identifier, ...body } = args\n const result = await client.patch(`/manage/profiles/${encodeURIComponent(identifier)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_relationship',\n {\n title: 'Delete Relationship',\n description:\n 'Remove a creator from the CRM pipeline. Does not delete the profile itself. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/manage/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Knowledge tools — KB folders, entries, context search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerKnowledgeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_knowledge_folders',\n {\n title: 'List Knowledge Folders',\n description: 'List all knowledge base folders in the organization. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/knowledge/folders')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_folder',\n {\n title: 'Create Knowledge Folder',\n description: 'Create a new knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n name: z.string().describe('Folder name'),\n description: z.string().optional().describe('Optional description'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/folders', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_folder_entries',\n {\n title: 'Get Folder Entries',\n description: 'Get all entries in a knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/knowledge/folders/${encodeURIComponent(args.folder_id)}/entries${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_entry',\n {\n title: 'Create Knowledge Entry',\n description: 'Create a new knowledge base entry in a folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID to add the entry to'),\n title: z.string().describe('Entry title'),\n content: z.string().describe('Entry content (markdown supported)'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/entries', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_knowledge_entry',\n {\n title: 'Get Knowledge Entry',\n description: 'Get a specific knowledge base entry by ID. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_knowledge_entry',\n {\n title: 'Update Knowledge Entry',\n description: 'Update a knowledge base entry title or content. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n title: z.string().optional().describe('New title'),\n content: z.string().optional().describe('New content'),\n }),\n },\n async (args) => {\n const { entry_id, ...body } = args\n const result = await client.put(`/knowledge/entries/${encodeURIComponent(entry_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_knowledge_entry',\n {\n title: 'Delete Knowledge Entry',\n description: 'Delete a knowledge base entry. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_knowledge',\n {\n title: 'Search Knowledge',\n description:\n 'Semantic search across the knowledge base. Returns matching entries ranked by relevance. ' +\n 'Useful for finding brand guidelines, campaign briefs, etc. Costs 0 credits.',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n folder_id: z.string().optional().describe('Limit search to a specific folder'),\n limit: z.number().int().min(1).max(20).optional().describe('Number of results (default 5, max 20)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('query', args.query)\n if (args.folder_id) params.set('folder_id', args.folder_id)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/knowledge/context?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Enhance tools — Profile enhancement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerEnhanceTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'enhance_profiles',\n {\n title: 'Enhance Profiles',\n description:\n 'Trigger AI enhancement for one or more profiles. Enhancement adds affinities, ' +\n 'demographics, niche analysis, and more. Returns a job ID — poll with ' +\n 'get_enhancement_status to check progress. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to enhance'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/profiles', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'enhance_bulk',\n {\n title: 'Enhance Bulk',\n description:\n 'Trigger bulk enhancement for a large set of profiles (from a list or campaign). ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['list', 'campaign']).describe('Source type'),\n id: z.string().describe('List or campaign UUID'),\n }).describe('Source of profiles to enhance'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/bulk', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'confirm_enhancement',\n {\n title: 'Confirm Enhancement',\n description:\n 'Confirm and start a pending enhancement job. Some jobs require confirmation ' +\n 'before processing begins (e.g. large batches). Costs 0 credits (charged at creation).',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n authorize_overage: z.boolean().optional().describe('Authorize credit overage if needed'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/enhance/${encodeURIComponent(args.job_id)}/confirm`,\n { authorize_overage: args.authorize_overage },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_enhancement_status',\n {\n title: 'Get Enhancement Status',\n description:\n 'Check the status of an enhancement job. Returns progress, completed count, ' +\n 'and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/enhance/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Scrape tools — Data collection triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerScrapeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'scrape_followers',\n {\n title: 'Scrape Followers',\n description:\n 'Trigger a follower scrape for a profile. Collects the full follower list. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape followers for'),\n limit: z.number().int().optional().describe('Max followers to scrape (default: all)'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/followers', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_following',\n {\n title: 'Scrape Following',\n description:\n 'Trigger a following scrape for a profile. Collects who they follow. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape following for'),\n limit: z.number().int().optional().describe('Max following to scrape (default: all)'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/following', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_locations',\n {\n title: 'Scrape Locations',\n description:\n 'Scrape posts from a specific Instagram location/place. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n location_id: z.string().optional().describe('Instagram location ID'),\n location_name: z.string().optional().describe('Location name to search for'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/locations', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_hashtags',\n {\n title: 'Scrape Hashtags',\n description:\n 'Scrape posts from a specific hashtag. Collects recent posts using that hashtag. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n hashtag: z.string().describe('Hashtag to scrape (without #)'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/hashtags', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_urls',\n {\n title: 'Scrape URLs',\n description:\n 'Scrape specific Instagram post or reel URLs. Extracts engagement data, ' +\n 'comments, and media. Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n urls: z.array(z.string()).describe('Array of Instagram post/reel URLs'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_scrape_status',\n {\n title: 'Get Scrape Status',\n description:\n 'Check the status of a scrape job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Scrape job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Refine tools — AI refinement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerRefineTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'refine_profiles',\n {\n title: 'Refine Profiles',\n description:\n 'Trigger AI refinement for one or more profiles. Refinement uses AI to ' +\n 'improve and enrich profile data — better niche classification, bio analysis, ' +\n 'content themes, etc. Returns a job ID — poll with get_refinement_status. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to refine'),\n type: z.string().optional().describe('Refinement type (e.g. niche, demographics, full)'),\n }),\n },\n async (args) => {\n const result = await client.post('/refine/profiles', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_refinement_status',\n {\n title: 'Get Refinement Status',\n description:\n 'Check the status of a refinement job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Refinement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/refine/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/meta.ts","../src/tools/profiles.ts","../src/tools/campaigns.ts","../src/tools/lists.ts","../src/tools/analytics.ts","../src/tools/content.ts","../src/tools/manage.ts","../src/tools/knowledge.ts","../src/tools/enhance.ts","../src/tools/scrape.ts","../src/tools/refine.ts"],"sourcesContent":["/**\n * Celavii MCP Server — stdio Entry Point\n *\n * Usage:\n * CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp\n *\n * Or in MCP config:\n * {\n * \"mcpServers\": {\n * \"celavii\": {\n * \"command\": \"npx\",\n * \"args\": [\"-y\", \"celavii-mcp@latest\"],\n * \"env\": { \"CELAVII_API_KEY\": \"cvii_live_xxx\" }\n * }\n * }\n * }\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { createServer } from './server.js'\n\nasync function main() {\n const apiKey = process.env.CELAVII_API_KEY\n if (!apiKey) {\n console.error(\n 'Error: CELAVII_API_KEY environment variable is required.\\n' +\n 'Get your API key at https://www.celavii.com/settings/api-keys\\n' +\n '\\nUsage:\\n' +\n ' CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp',\n )\n process.exit(1)\n }\n\n const baseUrl = process.env.CELAVII_BASE_URL || undefined\n\n const server = createServer({ apiKey, baseUrl })\n const transport = new StdioServerTransport()\n\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n})\n","/**\n * Celavii MCP Server — Server Setup & Tool Registration\n *\n * Creates an McpServer instance and registers all tools organized by category.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { CelaviiClient, CelaviiApiError } from './client.js'\nimport { registerMetaTools } from './tools/meta.js'\nimport { registerProfileTools } from './tools/profiles.js'\nimport { registerCampaignTools } from './tools/campaigns.js'\nimport { registerListTools } from './tools/lists.js'\nimport { registerAnalyticsTools } from './tools/analytics.js'\nimport { registerContentTools } from './tools/content.js'\nimport { registerManageTools } from './tools/manage.js'\nimport { registerKnowledgeTools } from './tools/knowledge.js'\nimport { registerEnhanceTools } from './tools/enhance.js'\nimport { registerScrapeTools } from './tools/scrape.js'\nimport { registerRefineTools } from './tools/refine.js'\n\nexport interface CreateServerOptions {\n apiKey: string\n baseUrl?: string\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const { apiKey, baseUrl } = options\n\n const server = new McpServer(\n {\n name: 'celavii',\n version: '0.1.0',\n },\n {\n capabilities: {\n logging: {},\n },\n },\n )\n\n const client = new CelaviiClient(apiKey, baseUrl)\n\n // Register all tool groups\n registerMetaTools(server, client)\n registerProfileTools(server, client)\n registerCampaignTools(server, client)\n registerListTools(server, client)\n registerAnalyticsTools(server, client)\n registerContentTools(server, client)\n registerManageTools(server, client)\n registerKnowledgeTools(server, client)\n registerEnhanceTools(server, client)\n registerScrapeTools(server, client)\n registerRefineTools(server, client)\n\n return server\n}\n\nexport { CelaviiClient, CelaviiApiError }\n","/**\n * Celavii MCP Server — HTTP Client\n *\n * Thin wrapper around fetch that adds Bearer auth, error handling,\n * and structured error responses for MCP tool handlers.\n */\n\nconst DEFAULT_BASE_URL = 'https://www.celavii.com/api/v1'\n\nexport class CelaviiApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public retryAfter?: number,\n ) {\n super(message)\n this.name = 'CelaviiApiError'\n }\n}\n\nexport class CelaviiClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(apiKey: string, baseUrl?: string) {\n this.apiKey = apiKey\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '')\n }\n\n private async request(path: string, init?: RequestInit): Promise<unknown> {\n const url = `${this.baseUrl}${path}`\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'celavii-mcp/0.1.0',\n ...init?.headers,\n },\n })\n\n let json: unknown\n try {\n json = await res.json()\n } catch {\n throw new CelaviiApiError(\n `HTTP ${res.status}: Failed to parse response`,\n 'INTERNAL_ERROR',\n res.status,\n )\n }\n\n if (!res.ok) {\n const err = json as { error?: { code?: string; message?: string; retry_after?: number } }\n const msg = err?.error?.message || `HTTP ${res.status}`\n const code = err?.error?.code || 'INTERNAL_ERROR'\n throw new CelaviiApiError(msg, code, res.status, err?.error?.retry_after)\n }\n\n return json\n }\n\n async get(path: string): Promise<unknown> {\n return this.request(path)\n }\n\n async post(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n }\n\n async put(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PUT',\n body: JSON.stringify(body),\n })\n }\n\n async delete(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'DELETE',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n}\n","/**\n * Meta tools — Account info and usage\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerMetaTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_account_info',\n {\n title: 'Get Account Info',\n description:\n 'Get information about the current API key, organization, and usage summary. ' +\n 'Useful to verify API key is working and see available scopes. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/me')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_usage',\n {\n title: 'Get Usage',\n description:\n 'Get credit usage and rate limit status for the current API key. ' +\n 'Shows total requests, credits used, daily breakdown, and rate limit info. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/usage')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Profile tools — Search, details, affinities, posts, network, bulk\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerProfileTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_profiles',\n {\n title: 'Search Profiles',\n description:\n 'Search the Celavii creator database. Filter by query text, niche, location, gender, ' +\n 'follower count. Returns matching Instagram profiles with basic stats. ' +\n 'At least one filter is required. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().optional().describe('Search query — matches username, display name, or bio keywords'),\n niche: z.string().optional().describe(\"Filter by niche/topic (e.g. 'fitness', 'fashion', 'tech')\"),\n location: z.string().optional().describe(\"Filter by location (e.g. 'Miami', 'Los Angeles, California')\"),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n has_contact: z.boolean().optional().describe('Only return profiles with email or phone'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.query) params.set('query', args.query)\n if (args.niche) params.set('niche', args.niche)\n if (args.location) params.set('location', args.location)\n if (args.gender) params.set('gender', args.gender)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.has_contact) params.set('has_contact', 'true')\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_profiles_by_affinities',\n {\n title: 'Search Profiles by Affinities',\n description:\n 'Search creators by their AI-analyzed brand or topic affinities. ' +\n 'Find creators who have affinity for specific brands, interests, or topics. Costs 1 credit.',\n inputSchema: z.object({\n affinities: z.array(z.string()).describe(\"Affinity terms to search for (e.g. ['Nike', 'fitness', 'running'])\"),\n match_mode: z.enum(['any', 'all']).optional().describe(\"'any' = match any affinity, 'all' = must match all (default: 'any')\"),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('terms', args.affinities.join(','))\n if (args.match_mode) params.set('match_mode', args.match_mode)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search/affinities?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profiles_bulk',\n {\n title: 'Get Profiles Bulk',\n description:\n 'Get detailed information for multiple profiles at once by username or profile ID. ' +\n 'Up to 100 profiles per request. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/bulk', { profiles: args.identifiers })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile',\n {\n title: 'Get Profile',\n description:\n 'Get detailed information about a single Instagram profile by username or profile ID. ' +\n 'Returns bio, stats, niche, location, and more. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username (without @) or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_affinities',\n {\n title: 'Get Profile Affinities',\n description:\n 'Get AI-analyzed brand and topic affinities for a profile. ' +\n 'Shows what brands, interests, and topics a creator is associated with. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/affinities`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_posts',\n {\n title: 'Get Profile Posts',\n description:\n 'Get recent posts for a profile. Returns post content, engagement metrics, ' +\n 'media URLs, and hashtags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of posts (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/posts${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_network',\n {\n title: 'Get Profile Network',\n description:\n 'Get the social network graph for a profile — mutual connections, ' +\n 'top followers, and following relationships. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/network`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_followers',\n {\n title: 'Get Profile Followers',\n description:\n 'Get the followers list for a profile. Only available if followers have been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of followers (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/followers${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_following',\n {\n title: 'Get Profile Following',\n description:\n 'Get the accounts a profile is following. Only available if following data has been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of following (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/following${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_social_links',\n {\n title: 'Get Profile Social Links',\n description:\n 'Get external social media links found in a profile bio (YouTube, TikTok, Twitter, etc.). Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/social-links`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_contact',\n {\n title: 'Get Profile Contact',\n description:\n 'Get contact information (email, phone) for a profile. ' +\n 'Requires the profiles:contact scope. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/contact`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Campaign tools — List, metrics, creators, content\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerCampaignTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_campaigns',\n {\n title: 'List Campaigns',\n description:\n 'List all campaigns in the organization. Optionally filter by status. Costs 0 credits.',\n inputSchema: z.object({\n status: z.enum(['active', 'draft', 'completed', 'archived']).optional().describe('Filter by campaign status'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of campaigns (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const qs = params.toString()\n const result = await client.get(`/campaigns${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_metrics',\n {\n title: 'Get Campaign Metrics',\n description:\n 'Get performance metrics for a specific campaign — total creators, posts, ' +\n 'engagement, reach, and more. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/metrics`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_creators',\n {\n title: 'Get Campaign Creators',\n description:\n 'Get the list of creators assigned to a campaign with their statuses and metrics. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/creators${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_content',\n {\n title: 'Get Campaign Content',\n description:\n 'Get content (posts) associated with a campaign. Includes engagement data ' +\n 'and media. Costs 1 credit.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/content${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * List tools — CRUD + member management\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerListTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_lists',\n {\n title: 'List Lists',\n description: 'Get all creator lists in the organization. Costs 0 credits.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_list',\n {\n title: 'Create List',\n description: 'Create a new creator list. Costs 1 credit.',\n inputSchema: z.object({\n name: z.string().describe('Name of the list'),\n description: z.string().optional().describe('Optional description'),\n }),\n },\n async (args) => {\n const result = await client.post('/lists', { name: args.name, description: args.description })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list',\n {\n title: 'Get List',\n description: 'Get details for a specific list by ID. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_list',\n {\n title: 'Update List',\n description: 'Update a list name or description. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n name: z.string().optional().describe('New name'),\n description: z.string().optional().describe('New description'),\n }),\n },\n async (args) => {\n const { list_id, ...body } = args\n const result = await client.patch(`/lists/${encodeURIComponent(list_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_list',\n {\n title: 'Delete List',\n description: 'Delete a list. This does not delete the creators in the list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list_members',\n {\n title: 'Get List Members',\n description: 'Get the creator profiles in a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('offset', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'add_list_members',\n {\n title: 'Add List Members',\n description: 'Add creators to a list by username or profile ID. Costs 1 credit.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to add'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'remove_list_members',\n {\n title: 'Remove List Members',\n description: 'Remove creators from a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to remove'),\n }),\n },\n async (args) => {\n const result = await client.delete(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Analytics tools — Demographics, locations, niches, overlap, cohort\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\n/** Schema for endpoints that accept profile_ids + scope (demographics) */\nconst demographicsSchema = z.object({\n profile_ids: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n})\n\n/** Schema for endpoints that accept scope + limit only (locations, niches) */\nconst orgLevelSchema = z.object({\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n limit: z.number().int().min(1).max(100).optional().describe('Max results (default 20, max 100)'),\n})\n\n/** Schema for profile source parameters used by overlap, shared-hashtags, cohort */\nconst profileSourceSchema = z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n})\n\n/**\n * Resolve identifiers/list_id/campaign_id into a flat array of usernames.\n * list_id and campaign_id trigger a prefetch of members from the API.\n */\nasync function resolveIdentifiers(\n client: CelaviiClient,\n args: { identifiers?: string[]; list_id?: string; campaign_id?: string },\n): Promise<string[]> {\n if (args.identifiers?.length) return args.identifiers\n\n if (args.list_id) {\n const resp = await client.get(`/lists/${args.list_id}/members?limit=100`) as { data?: { username?: string; profile_id?: string }[] }\n return (resp.data || []).map(m => m.username || m.profile_id || '').filter(Boolean)\n }\n\n if (args.campaign_id) {\n const resp = await client.get(`/campaigns/${args.campaign_id}/creators?limit=100`) as { data?: { username?: string; profile_id?: string }[] }\n return (resp.data || []).map(m => m.username || m.profile_id || '').filter(Boolean)\n }\n\n return []\n}\n\nexport function registerAnalyticsTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_demographics',\n {\n title: 'Get Demographics',\n description:\n 'Get audience demographics breakdown (age, gender distribution). ' +\n 'Optionally pass profile_ids to analyze a subset, or scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: demographicsSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.profile_ids?.length) params.set('profile_ids', args.profile_ids.join(','))\n if (args.scope) params.set('scope', args.scope)\n const result = await client.get(`/analytics/demographics?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_locations',\n {\n title: 'Get Locations',\n description:\n 'Get location distribution — top cities and countries. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/locations?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_niches',\n {\n title: 'Get Niches',\n description:\n 'Get niche/topic distribution across profiles. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/niches?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_network_overlap',\n {\n title: 'Get Network Overlap',\n description:\n 'Get follower/following overlap between profiles. Shows shared connections. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('profile_ids', ids.join(','))\n const result = await client.get(`/analytics/network-overlap?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_shared_hashtags',\n {\n title: 'Get Shared Hashtags',\n description:\n 'Get hashtags shared across a set of profiles. Shows common themes and topics. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('usernames', ids.join(','))\n const result = await client.get(`/analytics/shared-hashtags?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_hashtag_creators',\n {\n title: 'Get Hashtag Creators',\n description:\n 'Find creators who use specific hashtags. Useful for discovering creators by topic. Costs 1 credit.',\n inputSchema: z.object({\n hashtags: z.array(z.string()).describe(\"Hashtags to search for (without #, e.g. ['fitness', 'gym'])\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('hashtags', args.hashtags.join(','))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/analytics/hashtag-creators?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_affinity_posts',\n {\n title: 'Get Affinity Posts',\n description:\n 'Get posts linked to a brand/topic affinity term. Searches globally across all profiles. Costs 1 credit.',\n inputSchema: z.object({\n affinity: z.string().describe('Affinity term to search for (e.g. \"photography\", \"Nike\", \"fitness\")'),\n affinity_type: z.enum(['all', 'topic', 'brand', 'location', 'category']).optional().describe(\"Filter by affinity type (default: 'all')\"),\n min_engagement: z.number().int().optional().describe('Minimum total engagement'),\n sort: z.enum(['engagement', 'date']).optional().describe(\"Sort order (default: 'engagement')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('affinity', args.affinity)\n if (args.affinity_type) params.set('affinity_type', args.affinity_type)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/affinity-posts?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'analyze_cohort',\n {\n title: 'Analyze Cohort',\n description:\n 'Run a full cohort analysis on a set of profiles. Includes demographics, affinities, ' +\n 'hashtag usage, and aggregate stats. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs'),\n source: z.object({\n type: z.enum(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID (campaign UUID, list UUID, or hashtag)'),\n }).optional().describe('Alternative: analyze from a source (campaign, list, or hashtag)'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'hashtags', 'stats']\"),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_cohort_stats',\n {\n title: 'Get Cohort Stats',\n description:\n 'Get aggregate statistics for a cohort — average followers, engagement rate, etc. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('profiles', ids.join(','))\n const result = await client.get(`/analytics/cohort/stats?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'filter_cohort',\n {\n title: 'Filter Cohort',\n description:\n 'Filter a cohort of profiles by advanced criteria — follower range, engagement rate, ' +\n 'niche, location, affinities, and more. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs to filter'),\n source: z.object({\n type: z.enum(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID'),\n }).optional().describe('Alternative: filter from a source'),\n filters: z.record(z.string(), z.unknown()).optional().describe('Filter criteria (varies by field)'),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort/filter', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Content tools — Post search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerContentTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_content',\n {\n title: 'Search Content',\n description:\n 'Search posts across the creator database by keywords, hashtags, or mentions. ' +\n 'Returns matching posts with engagement metrics and media. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().describe('Search query — matches post captions (required)'),\n author: z.string().optional().describe('Filter by creator username'),\n min_engagement: z.number().int().optional().describe('Minimum total engagement (likes + comments)'),\n since: z.string().optional().describe('Only posts after this date (ISO 8601, e.g. 2025-01-01)'),\n sort: z.enum(['relevance', 'engagement', 'date']).optional().describe(\"Sort order (default: 'relevance')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('query', args.query)\n if (args.author) params.set('author', args.author)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.since) params.set('since', args.since)\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/content/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Manage tools — CRM operations\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerManageTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_managed_profiles',\n {\n title: 'Get Managed Profiles',\n description:\n 'Get all profiles in the CRM pipeline with their relationship statuses, ' +\n 'notes, and tags. Costs 0 credits.',\n inputSchema: z.object({\n status: z.string().optional().describe(\"Filter by relationship status (e.g. 'outreached', 'negotiating', 'contracted')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/manage/profiles${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_crm_summary',\n {\n title: 'Get CRM Summary',\n description:\n 'Get a summary of the CRM pipeline — counts by status, recent activity, etc. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/summary')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_org_stats',\n {\n title: 'Get Organization Stats',\n description:\n 'Get aggregate statistics for the organization — total profiles, enhanced profiles, ' +\n 'scraped data, and more. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/stats')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationship',\n {\n title: 'Upsert Relationship',\n description:\n 'Create or update a CRM relationship for a creator. Set status, notes, tags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'identified', 'outreached', 'negotiating', 'contracted', 'active', 'paused')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n },\n async (args) => {\n const { identifier, ...body } = args\n const result = await client.patch(`/manage/profiles/${encodeURIComponent(identifier)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_relationship',\n {\n title: 'Delete Relationship',\n description:\n 'Remove a creator from the CRM pipeline. Does not delete the profile itself. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/manage/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Knowledge tools — KB folders, entries, context search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerKnowledgeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_knowledge_folders',\n {\n title: 'List Knowledge Folders',\n description: 'List all knowledge base folders in the organization. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/knowledge/folders')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_folder',\n {\n title: 'Create Knowledge Folder',\n description: 'Create a new knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n name: z.string().describe('Folder name'),\n description: z.string().optional().describe('Optional description'),\n folder_type: z.enum(['general', 'brand', 'campaign', 'templates', 'research']).optional().describe(\"Folder type (default: 'general')\"),\n parent_folder_id: z.string().optional().describe('UUID of parent folder for nesting'),\n icon_name: z.string().optional().describe('Lucide icon name'),\n color: z.string().optional().describe('Hex color (e.g. #8b5cf6)'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/folders', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_folder_entries',\n {\n title: 'Get Folder Entries',\n description: 'Get all entries in a knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/knowledge/folders/${encodeURIComponent(args.folder_id)}/entries${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_entry',\n {\n title: 'Create Knowledge Entry',\n description: 'Create a new knowledge base entry in a folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID to add the entry to'),\n name: z.string().describe('Entry name'),\n content: z.string().optional().describe('Entry content (markdown supported)'),\n description: z.string().optional().describe('Short description'),\n source_url: z.string().optional().describe('Source URL reference'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/entries', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_knowledge_entry',\n {\n title: 'Get Knowledge Entry',\n description: 'Get a specific knowledge base entry by ID. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_knowledge_entry',\n {\n title: 'Update Knowledge Entry',\n description: 'Update a knowledge base entry. At least one field required. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n name: z.string().optional().describe('New name'),\n content: z.string().optional().describe('New content'),\n description: z.string().optional().describe('New description'),\n summary: z.string().optional().describe('New summary'),\n folder_id: z.string().optional().describe('Move to a different folder (UUID)'),\n }),\n },\n async (args) => {\n const { entry_id, ...body } = args\n const result = await client.put(`/knowledge/entries/${encodeURIComponent(entry_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_knowledge_entry',\n {\n title: 'Delete Knowledge Entry',\n description: 'Delete a knowledge base entry. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_knowledge',\n {\n title: 'Get Knowledge Context',\n description:\n 'Get aggregated brand context from the knowledge base, organized by folder type. ' +\n 'Returns entries for AI agent consumption. Filter by folder type to get specific context. Costs 0 credits.',\n inputSchema: z.object({\n folder_types: z.array(z.string()).optional().describe(\"Filter by folder types (e.g. ['brand', 'campaign', 'research'])\"),\n max_entries: z.number().int().min(1).max(100).optional().describe('Maximum entries to return (default 20, max 100)'),\n include_summaries: z.boolean().optional().describe('Include entry summaries (default true)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.folder_types?.length) params.set('folder_types', args.folder_types.join(','))\n if (args.max_entries !== undefined) params.set('max_entries', String(args.max_entries))\n if (args.include_summaries === false) params.set('include_summaries', 'false')\n const result = await client.get(`/knowledge/context?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Enhance tools — Profile enhancement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerEnhanceTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'enhance_profiles',\n {\n title: 'Enhance Profiles',\n description:\n 'Trigger AI enhancement for one or more profiles. Enhancement adds affinities, ' +\n 'demographics, niche analysis, and more. Returns a job ID — poll with ' +\n 'get_enhancement_status to check progress. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to enhance'),\n mode: z.enum(['basic', 'enhanced']).optional().describe(\"Enhancement mode: 'basic' (1 credit/profile) or 'enhanced' (2 credits/profile). Default: basic\"),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering enhancement'),\n auto_confirm: z.boolean().optional().describe('If true, auto-confirms the job without a separate confirm step'),\n authorize_overage: z.boolean().optional().describe('If true, allows proceeding even if credits are insufficient'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const { identifiers, options, ...rest } = args\n const result = await client.post('/enhance/profiles', { profiles: identifiers, ...rest })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'enhance_bulk',\n {\n title: 'Enhance Bulk',\n description:\n 'Trigger bulk enhancement for a large set of profiles (from a list or campaign). ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['list', 'campaign']).describe('Source type'),\n id: z.string().describe('List or campaign UUID'),\n }).describe('Source of profiles to enhance'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/bulk', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'confirm_enhancement',\n {\n title: 'Confirm Enhancement',\n description:\n 'Confirm and start a pending enhancement job. Some jobs require confirmation ' +\n 'before processing begins (e.g. large batches). Costs 0 credits (charged at creation).',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n authorize_overage: z.boolean().optional().describe('Authorize credit overage if needed'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/enhance/${encodeURIComponent(args.job_id)}/confirm`,\n { authorize_overage: args.authorize_overage },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_enhancement_status',\n {\n title: 'Get Enhancement Status',\n description:\n 'Check the status of an enhancement job. Returns progress, completed count, ' +\n 'and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/enhance/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Scrape tools — Data collection triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerScrapeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'scrape_followers',\n {\n title: 'Scrape Followers',\n description:\n 'Trigger a follower scrape for a profile. Collects the full follower list. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape followers for'),\n limit: z.number().int().optional().describe('Max followers to scrape (default: all)'),\n }),\n },\n async (args) => {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/followers', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_following',\n {\n title: 'Scrape Following',\n description:\n 'Trigger a following scrape for a profile. Collects who they follow. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape following for'),\n limit: z.number().int().optional().describe('Max following to scrape (default: all)'),\n }),\n },\n async (args) => {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/following', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_locations',\n {\n title: 'Scrape Locations',\n description:\n 'Scrape posts from a specific Instagram location/place. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n location_id: z.string().optional().describe('Instagram location ID'),\n location_name: z.string().optional().describe('Location name to search for'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n const body: Record<string, unknown> = {}\n if (args.location_id) body.location_ids = [args.location_id]\n if (args.location_name) body.start_urls = [`https://www.instagram.com/explore/locations/${args.location_name}/`]\n if (args.limit !== undefined) body.max_items = args.limit\n const result = await client.post('/scrape/locations', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_hashtags',\n {\n title: 'Scrape Hashtags',\n description:\n 'Scrape posts from a specific hashtag. Collects recent posts using that hashtag. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n hashtag: z.string().describe('Hashtag to scrape (without #)'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/hashtags', {\n hashtags: [args.hashtag],\n ...(args.limit !== undefined && { max_items: args.limit }),\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'scrape_urls',\n {\n title: 'Scrape URLs',\n description:\n 'Scrape specific Instagram post or reel URLs. Extracts engagement data, ' +\n 'comments, and media. Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n urls: z.array(z.string()).describe('Array of Instagram post/reel URLs'),\n }),\n },\n async (args) => {\n const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_scrape_status',\n {\n title: 'Get Scrape Status',\n description:\n 'Check the status of a scrape job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Scrape job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Refine tools — AI refinement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerRefineTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'refine_profiles',\n {\n title: 'Refine Profiles',\n description:\n 'Trigger AI refinement for one or more profiles. Refinement uses AI to ' +\n 'improve and enrich profile data — better niche classification, bio analysis, ' +\n 'content themes, etc. Returns a job ID — poll with get_refinement_status. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to refine'),\n type: z.string().optional().describe('Refinement type (e.g. niche, demographics, full)'),\n }),\n },\n async (args) => {\n const { identifiers, ...rest } = args\n const result = await client.post('/refine/profiles', { profiles: identifiers, ...rest })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_refinement_status',\n {\n title: 'Get Refinement Status',\n description:\n 'Check the status of a refinement job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Refinement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/refine/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n"],"mappings":";;;AAkBA,SAAS,4BAA4B;;;ACZrC,SAAS,iBAAiB;;;ACC1B,IAAM,mBAAmB;AAElB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACO,MACA,QACA,YACP;AACA,UAAM,OAAO;AAJN;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,SAAkB;AAC5C,SAAK,SAAS;AACd,SAAK,WAAW,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AAAA,EAChE;AAAA,EAEA,MAAc,QAAQ,MAAc,MAAsC;AACxE,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,GAAG;AAAA,MACH,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,GAAG,MAAM;AAAA,MACX;AAAA,IACF,CAAC;AAED,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,IAAI,KAAK;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,QAAQ,IAAI,MAAM;AAAA,QAClB;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM;AACZ,YAAM,MAAM,KAAK,OAAO,WAAW,QAAQ,IAAI,MAAM;AACrD,YAAM,OAAO,KAAK,OAAO,QAAQ;AACjC,YAAM,IAAI,gBAAgB,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,WAAW;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,MAAgC;AACxC,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B;AAAA,EAEA,MAAM,KAAK,MAAc,MAAkC;AACzD,WAAO,KAAK,QAAQ,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,MAAc,MAAiC;AACzD,WAAO,KAAK,QAAQ,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,MAAc,MAAiC;AACvD,WAAO,KAAK,QAAQ,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,MAAc,MAAkC;AAC3D,WAAO,KAAK,QAAQ,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD,CAAC;AAAA,EACH;AACF;;;AC1FA,SAAS,SAAS;AAIX,SAAS,kBAAkB,QAAmB,QAAuB;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa,EAAE,OAAO,CAAC,CAAC;AAAA,IAC1B;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,OAAO,IAAI,KAAK;AACrC,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa,EAAE,OAAO,CAAC,CAAC;AAAA,IAC1B;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,OAAO,IAAI,QAAQ;AACxC,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;AClCA,SAAS,KAAAA,UAAS;AAIX,SAAS,qBAAqB,QAAmB,QAAuB;AAC7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAaA,GAAE,OAAO;AAAA,QACpB,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAgE;AAAA,QACtG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2DAA2D;AAAA,QACjG,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8DAA8D;AAAA,QACvG,QAAQA,GAAE,KAAK,CAAC,QAAQ,UAAU,cAAc,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,QAChG,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC5E,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC5E,aAAaA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,QACvF,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,MACrF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAI,KAAK,SAAU,QAAO,IAAI,YAAY,KAAK,QAAQ;AACvD,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,UAAI,KAAK,kBAAkB,OAAW,QAAO,IAAI,iBAAiB,OAAO,KAAK,aAAa,CAAC;AAC5F,UAAI,KAAK,kBAAkB,OAAW,QAAO,IAAI,iBAAiB,OAAO,KAAK,aAAa,CAAC;AAC5F,UAAI,KAAK,YAAa,QAAO,IAAI,eAAe,MAAM;AACtD,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,SAAS,MAAM,OAAO,IAAI,oBAAoB,MAAM,EAAE;AAC5D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,oEAAoE;AAAA,QAC7G,YAAYA,GAAE,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,QAC5H,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC5E,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC5E,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,MACrF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,IAAI,SAAS,KAAK,WAAW,KAAK,GAAG,CAAC;AAC7C,UAAI,KAAK,WAAY,QAAO,IAAI,cAAc,KAAK,UAAU;AAC7D,UAAI,KAAK,kBAAkB,OAAW,QAAO,IAAI,iBAAiB,OAAO,KAAK,aAAa,CAAC;AAC5F,UAAI,KAAK,kBAAkB,OAAW,QAAO,IAAI,iBAAiB,OAAO,KAAK,aAAa,CAAC;AAC5F,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,SAAS,MAAM,OAAO,IAAI,+BAA+B,MAAM,EAAE;AACvE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,6CAA6C;AAAA,MACzF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,kBAAkB,EAAE,UAAU,KAAK,YAAY,CAAC;AACjF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,EAAE;AAClF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,aAAa;AAC7F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,QAClE,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QACnG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAC7G,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,UAAU;AAC1F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,QAClE,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,QACvG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACjH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,QAClE,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,QACvG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACjH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,eAAe;AAC/F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,mBAAmB,KAAK,UAAU,CAAC,UAAU;AAC1F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;AC7OA,SAAS,KAAAC,UAAS;AAIX,SAAS,sBAAsB,QAAmB,QAAuB;AAC9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,QAAQA,GAAE,KAAK,CAAC,UAAU,SAAS,aAAa,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,QAC5G,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,MACzG,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACjE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,aAAaA,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,cAAc,mBAAmB,KAAK,WAAW,CAAC,UAAU;AAC5F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,aAAaA,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,QAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,cAAc,mBAAmB,KAAK,WAAW,CAAC,YAAY,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAClH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,aAAaA,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,QAChD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,cAAc,mBAAmB,KAAK,WAAW,CAAC,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACjH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACvFA,SAAS,KAAAC,UAAS;AAIX,SAAS,kBAAkB,QAAmB,QAAuB;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,SAAS,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAC7D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,MAAMA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,QAC5C,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,UAAU,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,YAAY,CAAC;AAC7F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,UAAU,mBAAmB,KAAK,OAAO,CAAC,EAAE;AAC5E,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,QACxC,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,QAC/C,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,YAAM,SAAS,MAAM,OAAO,MAAM,UAAU,mBAAmB,OAAO,CAAC,IAAI,IAAI;AAC/E,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,OAAO,UAAU,mBAAmB,KAAK,OAAO,CAAC,EAAE;AAC/E,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,QACxC,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,UAAU,mBAAmB,KAAK,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACzG,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,QACxC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,0CAA0C;AAAA,MACtF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,UAAU,mBAAmB,KAAK,OAAO,CAAC;AAAA,QAC1C,EAAE,UAAU,KAAK,YAAY;AAAA,MAC/B;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,QACxC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,6CAA6C;AAAA,MACzF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,UAAU,mBAAmB,KAAK,OAAO,CAAC;AAAA,QAC1C,EAAE,UAAU,KAAK,YAAY;AAAA,MAC/B;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACnJA,SAAS,KAAAC,UAAS;AAKlB,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EACnG,OAAOA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,0DAA0D;AACjH,CAAC;AAGD,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,OAAOA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,EAC/G,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,mCAAmC;AACjG,CAAC;AAGD,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EACnG,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mDAA8C;AAAA,EACtF,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4DAAuD;AACrG,CAAC;AAMD,eAAe,mBACb,QACA,MACmB;AACnB,MAAI,KAAK,aAAa,OAAQ,QAAO,KAAK;AAE1C,MAAI,KAAK,SAAS;AAChB,UAAM,OAAO,MAAM,OAAO,IAAI,UAAU,KAAK,OAAO,oBAAoB;AACxE,YAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAK,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,OAAO,OAAO;AAAA,EACpF;AAEA,MAAI,KAAK,aAAa;AACpB,UAAM,OAAO,MAAM,OAAO,IAAI,cAAc,KAAK,WAAW,qBAAqB;AACjF,YAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAK,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,OAAO,OAAO;AAAA,EACpF;AAEA,SAAO,CAAC;AACV;AAEO,SAAS,uBAAuB,QAAmB,QAAuB;AAC/E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,aAAa,OAAQ,QAAO,IAAI,eAAe,KAAK,YAAY,KAAK,GAAG,CAAC;AAClF,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,YAAM,SAAS,MAAM,OAAO,IAAI,2BAA2B,MAAM,EAAE;AACnE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,YAAM,SAAS,MAAM,OAAO,IAAI,wBAAwB,MAAM,EAAE;AAChE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,YAAM,SAAS,MAAM,OAAO,IAAI,qBAAqB,MAAM,EAAE;AAC7D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,MAAM,MAAM,mBAAmB,QAAQ,IAAI;AACjD,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,IAAI,OAAQ,QAAO,IAAI,eAAe,IAAI,KAAK,GAAG,CAAC;AACvD,YAAM,SAAS,MAAM,OAAO,IAAI,8BAA8B,MAAM,EAAE;AACtE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,MAAM,MAAM,mBAAmB,QAAQ,IAAI;AACjD,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,IAAI,OAAQ,QAAO,IAAI,aAAa,IAAI,KAAK,GAAG,CAAC;AACrD,YAAM,SAAS,MAAM,OAAO,IAAI,8BAA8B,MAAM,EAAE;AACtE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,6DAA6D;AAAA,QACpG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,IAAI,YAAY,KAAK,SAAS,KAAK,GAAG,CAAC;AAC9C,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,SAAS,MAAM,OAAO,IAAI,+BAA+B,MAAM,EAAE;AACvE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,OAAO,EAAE,SAAS,qEAAqE;AAAA,QACnG,eAAeA,GAAE,KAAK,CAAC,OAAO,SAAS,SAAS,YAAY,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,QACvI,gBAAgBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QAC/E,MAAMA,GAAE,KAAK,CAAC,cAAc,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,QAC7F,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,MACtG,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,IAAI,YAAY,KAAK,QAAQ;AACpC,UAAI,KAAK,cAAe,QAAO,IAAI,iBAAiB,KAAK,aAAa;AACtE,UAAI,KAAK,mBAAmB,OAAW,QAAO,IAAI,kBAAkB,OAAO,KAAK,cAAc,CAAC;AAC/F,UAAI,KAAK,KAAM,QAAO,IAAI,QAAQ,KAAK,IAAI;AAC3C,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,YAAM,SAAS,MAAM,OAAO,IAAI,6BAA6B,MAAM,EAAE;AACrE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,QACrF,QAAQA,GAAE,OAAO;AAAA,UACf,MAAMA,GAAE,KAAK,CAAC,YAAY,QAAQ,SAAS,CAAC,EAAE,SAAS,aAAa;AAAA,UACpE,IAAIA,GAAE,OAAO,EAAE,SAAS,kDAAkD;AAAA,QAC5E,CAAC,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,QACxF,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,sEAAsE;AAAA,MACzH,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,IAAI;AAC1D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,MAAM,MAAM,mBAAmB,QAAQ,IAAI;AACjD,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,IAAI,OAAQ,QAAO,IAAI,YAAY,IAAI,KAAK,GAAG,CAAC;AACpD,YAAM,SAAS,MAAM,OAAO,IAAI,2BAA2B,MAAM,EAAE;AACnE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,QAC/F,QAAQA,GAAE,OAAO;AAAA,UACf,MAAMA,GAAE,KAAK,CAAC,YAAY,QAAQ,SAAS,CAAC,EAAE,SAAS,aAAa;AAAA,UACpE,IAAIA,GAAE,OAAO,EAAE,SAAS,WAAW;AAAA,QACrC,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,QAC1D,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,MACpG,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,4BAA4B,IAAI;AACjE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACtPA,SAAS,KAAAC,UAAS;AAIX,SAAS,qBAAqB,QAAmB,QAAuB;AAC7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,OAAOA,GAAE,OAAO,EAAE,SAAS,sDAAiD;AAAA,QAC5E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,QACnE,gBAAgBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,QAClG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,QAC9F,MAAMA,GAAE,KAAK,CAAC,aAAa,cAAc,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,QACzG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,MACtG,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,aAAO,IAAI,SAAS,KAAK,KAAK;AAC9B,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,UAAI,KAAK,mBAAmB,OAAW,QAAO,IAAI,kBAAkB,OAAO,KAAK,cAAc,CAAC;AAC/F,UAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAI,KAAK,KAAM,QAAO,IAAI,QAAQ,KAAK,IAAI;AAC3C,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,YAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB,MAAM,EAAE;AAC3D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACjCA,SAAS,KAAAC,UAAS;AAIX,SAAS,oBAAoB,QAAmB,QAAuB;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gFAAgF;AAAA,QACvH,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QACpG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,mBAAmB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACvE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO,CAAC,CAAC;AAAA,IAC1B;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,OAAO,IAAI,iBAAiB;AACjD,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO,CAAC,CAAC;AAAA,IAC1B;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,OAAO,IAAI,eAAe;AAC/C,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,QAClE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wGAAwG;AAAA,QAC/I,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,QAC9E,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,YAAM,SAAS,MAAM,OAAO,MAAM,oBAAoB,mBAAmB,UAAU,CAAC,IAAI,IAAI;AAC5F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,GAAE,OAAO;AAAA,QACpB,YAAYA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,OAAO,oBAAoB,mBAAmB,KAAK,UAAU,CAAC,EAAE;AAC5F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;AC7FA,SAAS,KAAAC,UAAS;AAIX,SAAS,uBAAuB,QAAmB,QAAuB;AAC/E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO,CAAC,CAAC;AAAA,IAC1B;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,OAAO,IAAI,oBAAoB;AACpD,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,MAAMA,GAAE,OAAO,EAAE,SAAS,aAAa;AAAA,QACvC,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,QAClE,aAAaA,GAAE,KAAK,CAAC,WAAW,SAAS,YAAY,aAAa,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,QACrI,kBAAkBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,QACpF,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,QAC5D,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MAClE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,sBAAsB,IAAI;AAC3D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,WAAWA,GAAE,OAAO,EAAE,SAAS,aAAa;AAAA,QAC5C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,QAC9E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACpE,UAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AACjD,YAAM,KAAK,OAAO,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,IAAI,sBAAsB,mBAAmB,KAAK,SAAS,CAAC,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AACvH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,WAAWA,GAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,QAChE,MAAMA,GAAE,OAAO,EAAE,SAAS,YAAY;AAAA,QACtC,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,QAC5E,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,QAC/D,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,sBAAsB,IAAI;AAC3D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,OAAO,EAAE,SAAS,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,sBAAsB,mBAAmB,KAAK,QAAQ,CAAC,EAAE;AACzF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,OAAO,EAAE,SAAS,YAAY;AAAA,QAC1C,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,QAC/C,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,QACrD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,QAC7D,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,QACrD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,UAAU,GAAG,KAAK,IAAI;AAC9B,YAAM,SAAS,MAAM,OAAO,IAAI,sBAAsB,mBAAmB,QAAQ,CAAC,IAAI,IAAI;AAC1F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,OAAO,EAAE,SAAS,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,OAAO,sBAAsB,mBAAmB,KAAK,QAAQ,CAAC,EAAE;AAC5F,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,QACvH,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,QACnH,mBAAmBA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,MAC7F,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,KAAK,cAAc,OAAQ,QAAO,IAAI,gBAAgB,KAAK,aAAa,KAAK,GAAG,CAAC;AACrF,UAAI,KAAK,gBAAgB,OAAW,QAAO,IAAI,eAAe,OAAO,KAAK,WAAW,CAAC;AACtF,UAAI,KAAK,sBAAsB,MAAO,QAAO,IAAI,qBAAqB,OAAO;AAC7E,YAAM,SAAS,MAAM,OAAO,IAAI,sBAAsB,MAAM,EAAE;AAC9D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACvJA,SAAS,KAAAC,UAAS;AAIX,SAAS,qBAAqB,QAAmB,QAAuB;AAC7E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAaA,GAAE,OAAO;AAAA,QACpB,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,8CAA8C;AAAA,QACxF,MAAMA,GAAE,KAAK,CAAC,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,gGAAgG;AAAA,QACxJ,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,QACxG,cAAcA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,gEAAgE;AAAA,QAC9G,mBAAmBA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,QAChH,SAASA,GAAE,OAAO;AAAA,UAChB,OAAOA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,QAC9E,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,aAAa,SAAS,GAAG,KAAK,IAAI;AAC1C,YAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,EAAE,UAAU,aAAa,GAAG,KAAK,CAAC;AACxF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,QAAQA,GAAE,OAAO;AAAA,UACf,MAAMA,GAAE,KAAK,CAAC,QAAQ,UAAU,CAAC,EAAE,SAAS,aAAa;AAAA,UACzD,IAAIA,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,QACjD,CAAC,EAAE,SAAS,+BAA+B;AAAA,QAC3C,SAASA,GAAE,OAAO;AAAA,UAChB,OAAOA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,QAC9E,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,iBAAiB,IAAI;AACtD,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,QAAQA,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,QAChD,mBAAmBA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,MACzF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,YAAY,mBAAmB,KAAK,MAAM,CAAC;AAAA,QAC3C,EAAE,mBAAmB,KAAK,kBAAkB;AAAA,MAC9C;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,GAAE,OAAO;AAAA,QACpB,QAAQA,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,YAAY,mBAAmB,KAAK,MAAM,CAAC,SAAS;AACpF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;AC3FA,SAAS,KAAAC,WAAS;AAIX,SAAS,oBAAoB,QAAmB,QAAuB;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,IAAE,OAAO;AAAA,QACpB,UAAUA,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,QAC1E,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,MACtF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,YAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,EAAE,GAAG,MAAM,GAAI,UAAU,UAAa,EAAE,aAAa,MAAM,EAAG,CAAC;AACrH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,IAAE,OAAO;AAAA,QACpB,UAAUA,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,QAC1E,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,MACtF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,YAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,EAAE,GAAG,MAAM,GAAI,UAAU,UAAa,EAAE,aAAa,MAAM,EAAG,CAAC;AACrH,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,IAAE,OAAO;AAAA,QACpB,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,QACnE,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,QAC3E,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,OAAgC,CAAC;AACvC,UAAI,KAAK,YAAa,MAAK,eAAe,CAAC,KAAK,WAAW;AAC3D,UAAI,KAAK,cAAe,MAAK,aAAa,CAAC,+CAA+C,KAAK,aAAa,GAAG;AAC/G,UAAI,KAAK,UAAU,OAAW,MAAK,YAAY,KAAK;AACpD,YAAM,SAAS,MAAM,OAAO,KAAK,qBAAqB,IAAI;AAC1D,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,IAAE,OAAO;AAAA,QACpB,SAASA,IAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,QAC5D,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,oBAAoB;AAAA,QACnD,UAAU,CAAC,KAAK,OAAO;AAAA,QACvB,GAAI,KAAK,UAAU,UAAa,EAAE,WAAW,KAAK,MAAM;AAAA,MAC1D,CAAC;AACD,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAaA,IAAE,OAAO;AAAA,QACpB,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,mCAAmC;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,KAAK,gBAAgB,IAAI;AACrD,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,IAAE,OAAO;AAAA,QACpB,QAAQA,IAAE,OAAO,EAAE,SAAS,eAAe;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,WAAW,mBAAmB,KAAK,MAAM,CAAC,SAAS;AACnF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;ACvHA,SAAS,KAAAC,WAAS;AAIX,SAAS,oBAAoB,QAAmB,QAAuB;AAC5E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAaA,IAAE,OAAO;AAAA,QACpB,aAAaA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,6CAA6C;AAAA,QACvF,MAAMA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,MACzF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,EAAE,aAAa,GAAG,KAAK,IAAI;AACjC,YAAM,SAAS,MAAM,OAAO,KAAK,oBAAoB,EAAE,UAAU,aAAa,GAAG,KAAK,CAAC;AACvF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAaA,IAAE,OAAO;AAAA,QACpB,QAAQA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,MAAM,OAAO,IAAI,WAAW,mBAAmB,KAAK,MAAM,CAAC,SAAS;AACnF,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AACF;;;AZnBO,SAAS,aAAa,SAAyC;AACpE,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAE5B,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc;AAAA,QACZ,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,cAAc,QAAQ,OAAO;AAGhD,oBAAkB,QAAQ,MAAM;AAChC,uBAAqB,QAAQ,MAAM;AACnC,wBAAsB,QAAQ,MAAM;AACpC,oBAAkB,QAAQ,MAAM;AAChC,yBAAuB,QAAQ,MAAM;AACrC,uBAAqB,QAAQ,MAAM;AACnC,sBAAoB,QAAQ,MAAM;AAClC,yBAAuB,QAAQ,MAAM;AACrC,uBAAqB,QAAQ,MAAM;AACnC,sBAAoB,QAAQ,MAAM;AAClC,sBAAoB,QAAQ,MAAM;AAElC,SAAO;AACT;;;ADnCA,eAAe,OAAO;AACpB,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,QAAQ;AACX,YAAQ;AAAA,MACN;AAAA,IAIF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,QAAQ,IAAI,oBAAoB;AAEhD,QAAM,SAAS,aAAa,EAAE,QAAQ,QAAQ,CAAC;AAC/C,QAAM,YAAY,IAAI,qBAAqB;AAE3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,gBAAgB,GAAG;AACjC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["z","z","z","z","z","z","z","z","z","z"]}
|
package/package.json
CHANGED