semrush-cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors-aN5dmXgv.js","names":["catalog","filters: Query","params: Query"],"sources":["../src/report-catalog.json","../src/report-parameters.ts","../src/errors.ts"],"sourcesContent":["{\n \"account_status\": {\n \"method\": \"user.GetInfo\",\n \"description\": \"Signed-in account and report limits.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_overview\": {\n \"method\": \"keywords.GetInfo\",\n \"description\": \"Volume, difficulty, CPC, intent and trends.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"KeywordQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_ideas\": {\n \"method\": \"ideas.GetKeywords\",\n \"description\": \"Overview sample of related keywords or questions.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"questions_only\": {\n \"default\": false,\n \"title\": \"Questions Only\",\n \"type\": \"boolean\"\n },\n \"limit\": {\n \"default\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"IdeasQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_ideas_summary\": {\n \"method\": \"ideas.GetKeywordsSummary\",\n \"description\": \"Total related keyword count and volume.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"questions_only\": {\n \"default\": false,\n \"title\": \"Questions Only\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"IdeasSummaryQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_serp\": {\n \"method\": \"serp.GetURLs\",\n \"description\": \"Ranked URLs and SERP features.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"limit\": {\n \"default\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"KeywordListQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_ads\": {\n \"method\": \"adwords.GetCopies\",\n \"description\": \"Search ad copies for a keyword.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"limit\": {\n \"default\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"KeywordListQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_clusters\": {\n \"method\": \"clusters.Get\",\n \"description\": \"Keyword topics and search intents.\",\n \"transport\": \"keyword\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"KeywordQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_magic\": {\n \"method\": \"ideas.GetKeywords\",\n \"description\": \"Paginated Keyword Magic research with filters and sorting.\",\n \"transport\": \"magic\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"questions_only\": {\n \"default\": false,\n \"title\": \"Questions Only\",\n \"type\": \"boolean\"\n },\n \"mode\": {\n \"default\": 4,\n \"description\": \"Web Keyword Magic matching mode\",\n \"maximum\": 4,\n \"minimum\": 0,\n \"title\": \"Mode\",\n \"type\": \"integer\"\n },\n \"currency\": {\n \"default\": \"USD\",\n \"pattern\": \"^[A-Z]{3}$\",\n \"title\": \"Currency\",\n \"type\": \"string\"\n },\n \"sort_field\": {\n \"default\": \"similarity_score\",\n \"pattern\": \"^[a-z_]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Keyword Magic web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n },\n \"groups\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Groups\",\n \"type\": \"array\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"MagicQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_magic_summary\": {\n \"method\": \"ideas.GetKeywordsSummary\",\n \"description\": \"Keyword Magic totals for matching filters.\",\n \"transport\": \"magic\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"questions_only\": {\n \"default\": false,\n \"title\": \"Questions Only\",\n \"type\": \"boolean\"\n },\n \"mode\": {\n \"default\": 4,\n \"description\": \"Web Keyword Magic matching mode\",\n \"maximum\": 4,\n \"minimum\": 0,\n \"title\": \"Mode\",\n \"type\": \"integer\"\n },\n \"currency\": {\n \"default\": \"USD\",\n \"pattern\": \"^[A-Z]{3}$\",\n \"title\": \"Currency\",\n \"type\": \"string\"\n },\n \"sort_field\": {\n \"default\": \"similarity_score\",\n \"pattern\": \"^[a-z_]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Keyword Magic web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n },\n \"groups\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Groups\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"MagicSummaryQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_magic_groups\": {\n \"method\": \"ideas.GetGroups\",\n \"description\": \"Keyword Magic topic groups.\",\n \"transport\": \"magic\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"keyword\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"title\": \"Keyword\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"questions_only\": {\n \"default\": false,\n \"title\": \"Questions Only\",\n \"type\": \"boolean\"\n },\n \"mode\": {\n \"default\": 4,\n \"description\": \"Web Keyword Magic matching mode\",\n \"maximum\": 4,\n \"minimum\": 0,\n \"title\": \"Mode\",\n \"type\": \"integer\"\n },\n \"currency\": {\n \"default\": \"USD\",\n \"pattern\": \"^[A-Z]{3}$\",\n \"title\": \"Currency\",\n \"type\": \"string\"\n },\n \"sort_field\": {\n \"default\": \"similarity_score\",\n \"pattern\": \"^[a-z_]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Keyword Magic web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n },\n \"groups\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Groups\",\n \"type\": \"array\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"keyword\"\n ],\n \"title\": \"MagicQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_overview\": {\n \"method\": \"organic.Summary\",\n \"description\": \"Search metrics and backlink summary.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_keywords\": {\n \"method\": \"organic.Positions\",\n \"description\": \"Paginated organic rankings with filters, sorting and totals.\",\n \"transport\": \"domain\",\n \"total_method\": \"organic.PositionsTotal\",\n \"web_report\": \"organic.positions\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date\": {\n \"anyOf\": [\n {\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Unix snapshot timestamp from snapshot_dates; omit for latest\",\n \"title\": \"Date\"\n },\n \"search_type\": {\n \"default\": \"domain\",\n \"pattern\": \"^(domain|subdomain|subfolder|url)$\",\n \"title\": \"Search Type\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"daily\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"trafficPercent\",\n \"pattern\": \"^[a-zA-Z]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Organic report web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainReportQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_pages\": {\n \"method\": \"organic.PagesV3\",\n \"description\": \"Paginated top organic pages with totals.\",\n \"transport\": \"domain\",\n \"total_method\": \"organic.PagesTotalV3\",\n \"web_report\": \"organic.pages\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date\": {\n \"anyOf\": [\n {\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Unix snapshot timestamp from snapshot_dates; omit for latest\",\n \"title\": \"Date\"\n },\n \"search_type\": {\n \"default\": \"domain\",\n \"pattern\": \"^(domain|subdomain|subfolder|url)$\",\n \"title\": \"Search Type\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"daily\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"traffic\",\n \"pattern\": \"^[a-zA-Z]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Organic report web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainPagesQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_subdomains\": {\n \"method\": \"organic.Subdomains\",\n \"description\": \"Paginated organic subdomain traffic and keyword totals.\",\n \"transport\": \"domain\",\n \"total_method\": \"organic.SubdomainsTotal\",\n \"web_report\": \"organic.subdomains\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date\": {\n \"anyOf\": [\n {\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Unix snapshot timestamp from snapshot_dates; omit for latest\",\n \"title\": \"Date\"\n },\n \"search_type\": {\n \"default\": \"domain\",\n \"pattern\": \"^(domain|subdomain|subfolder|url)$\",\n \"title\": \"Search Type\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"daily\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"traffic\",\n \"pattern\": \"^[a-zA-Z]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Organic report web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainPagesQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_position_changes\": {\n \"method\": \"organic.PositionChangesV2\",\n \"description\": \"Paginated ranking changes with totals.\",\n \"transport\": \"domain\",\n \"total_method\": \"organic.PositionChangesTotalV2\",\n \"web_report\": \"organic.changes\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date\": {\n \"anyOf\": [\n {\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Unix snapshot timestamp from snapshot_dates; omit for latest\",\n \"title\": \"Date\"\n },\n \"search_type\": {\n \"default\": \"domain\",\n \"pattern\": \"^(domain|subdomain|subfolder|url)$\",\n \"title\": \"Search Type\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"daily\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"changeOfTraffic\",\n \"pattern\": \"^[a-zA-Z]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Organic report web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainChangesQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_competitors\": {\n \"method\": \"organic.Competitors\",\n \"description\": \"Paginated organic search competitors and totals.\",\n \"transport\": \"domain\",\n \"total_method\": \"organic.CompetitorsTotal\",\n \"web_report\": \"organic.competitors\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date\": {\n \"anyOf\": [\n {\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Unix snapshot timestamp from snapshot_dates; omit for latest\",\n \"title\": \"Date\"\n },\n \"search_type\": {\n \"default\": \"domain\",\n \"pattern\": \"^(domain|subdomain|subfolder|url)$\",\n \"title\": \"Search Type\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"daily\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 1,\n \"minimum\": 1,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"page_size\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Page Size\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"competitionLvl\",\n \"pattern\": \"^[a-zA-Z]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainCompetitorsQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_backlinks\": {\n \"method\": \"backlinks.Overview\",\n \"description\": \"Backlink summary, sample links and anchors.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainIdentityQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_ai_visibility\": {\n \"method\": \"organic.AiSeoSummary\",\n \"description\": \"AI visibility, mentions and citations.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainIdentityQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_ai_countries\": {\n \"method\": \"organic.AiDistributionByCountry\",\n \"description\": \"AI visibility and mentions by country.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainIdentityQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_ai_sources\": {\n \"method\": \"organic.AiTopSources\",\n \"description\": \"Top AI citation sources with offset and limit.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"limit\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n },\n \"offset\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"AiSourcesQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_trends\": {\n \"method\": \"organic.OverviewTrend\",\n \"description\": \"Daily or monthly organic and paid search trends.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"date_type\": {\n \"default\": \"monthly\",\n \"pattern\": \"^(daily|monthly)$\",\n \"title\": \"Date Type\",\n \"type\": \"string\"\n },\n \"global_data\": {\n \"default\": false,\n \"title\": \"Global Data\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainTrendQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_paid_keywords\": {\n \"method\": \"adwords.PositionsOverview\",\n \"description\": \"Paid keyword overview sample; account permissions apply.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"limit\": {\n \"default\": 5,\n \"maximum\": 10,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainListQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_paid_competitors\": {\n \"method\": \"adwords.CompetitorsOverview\",\n \"description\": \"Paid search competitors; account permissions apply.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"limit\": {\n \"default\": 5,\n \"maximum\": 10,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainListQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_topics\": {\n \"method\": \"organic.TopicsResult\",\n \"description\": \"Organic search topics already available for a domain.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainQuery\",\n \"type\": \"object\"\n }\n },\n \"domain_topics_status\": {\n \"method\": \"organic.TopicsStatus\",\n \"description\": \"Availability of domain organic topics.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"description\": \"Bare domain, e.g. openai.com\",\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"DomainQuery\",\n \"type\": \"object\"\n }\n },\n \"databases\": {\n \"method\": \"user.Databases\",\n \"description\": \"Search databases and account access.\",\n \"transport\": \"direct\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n },\n \"snapshot_dates\": {\n \"method\": \"organic.SnapshotDates\",\n \"description\": \"Available historical domain snapshots.\",\n \"transport\": \"direct\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"global_data\": {\n \"default\": false,\n \"title\": \"Global Data\",\n \"type\": \"boolean\"\n }\n },\n \"title\": \"HistoryQuery\",\n \"type\": \"object\"\n }\n },\n \"report_permissions\": {\n \"method\": \"dpa.UserPermissions\",\n \"description\": \"Account history, export and research permissions.\",\n \"transport\": \"domain\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n }\n },\n \"title\": \"DatabaseQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_links\": {\n \"method\": \"backlinks\",\n \"description\": \"Paginated backlinks with provider caps and totals.\",\n \"transport\": \"backlink\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Web backlink filter, e.g. +|type||nofollow\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 0,\n \"description\": \"Zero-based provider page\",\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"\",\n \"pattern\": \"^[a-z_]*$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkListQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_referring_domains\": {\n \"method\": \"backlinks_refdomains\",\n \"description\": \"Paginated referring domains.\",\n \"transport\": \"backlink\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Web backlink filter, e.g. +|type||nofollow\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 0,\n \"description\": \"Zero-based provider page\",\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"\",\n \"pattern\": \"^[a-z_]*$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkListQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_history\": {\n \"method\": \"historical\",\n \"description\": \"Historical backlink and referring-domain trends.\",\n \"transport\": \"backlink_overview\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_competitors\": {\n \"method\": \"competitors\",\n \"description\": \"Competitors sharing a backlink profile.\",\n \"transport\": \"backlink_overview\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_top_pages\": {\n \"method\": \"backlinks_pages\",\n \"description\": \"Paginated indexed pages ranked by referring domains.\",\n \"transport\": \"backlink\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Web backlink filter, e.g. +|type||nofollow\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 0,\n \"description\": \"Zero-based provider page\",\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"\",\n \"pattern\": \"^[a-z_]*$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkListQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_anchors\": {\n \"method\": \"backlinks_anchors\",\n \"description\": \"Paginated anchor texts and backlink counts.\",\n \"transport\": \"backlink\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Web backlink filter, e.g. +|type||nofollow\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 0,\n \"description\": \"Zero-based provider page\",\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"\",\n \"pattern\": \"^[a-z_]*$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkListQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_outgoing_domains\": {\n \"method\": \"backlinks_outgoing_domains\",\n \"description\": \"Paginated outbound domains and outgoing link counts.\",\n \"transport\": \"backlink\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Web backlink filter, e.g. +|type||nofollow\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"page\": {\n \"default\": 0,\n \"description\": \"Zero-based provider page\",\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"sort_field\": {\n \"default\": \"\",\n \"pattern\": \"^[a-z_]*$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkListQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_countries\": {\n \"method\": \"geodomains\",\n \"description\": \"Referring-domain country distribution.\",\n \"transport\": \"backlink_overview\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_authority\": {\n \"method\": \"ascore\",\n \"description\": \"Authority score and supporting metrics.\",\n \"transport\": \"backlink_overview\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_categories\": {\n \"method\": \"category-profile\",\n \"description\": \"Referring-domain category profile.\",\n \"transport\": \"backlink_overview\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domain\": {\n \"maxLength\": 253,\n \"minLength\": 1,\n \"title\": \"Domain\",\n \"type\": \"string\"\n },\n \"target_type\": {\n \"default\": \"root_domain\",\n \"pattern\": \"^(root_domain|domain|url)$\",\n \"title\": \"Target Type\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domain\"\n ],\n \"title\": \"BacklinkQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_gap\": {\n \"method\": \"/spectrum/v1/Gap/KeywordsList\",\n \"description\": \"Paginated organic keyword gap between two to five sites.\",\n \"transport\": \"gap\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"domains\": {\n \"description\": \"Two to five root domains, first is your site\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 5,\n \"minItems\": 2,\n \"title\": \"Domains\",\n \"type\": \"array\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Semrush spectrum filter expression\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"gap_type\": {\n \"default\": 2,\n \"description\": \"Semrush web gap type, default 2\",\n \"maximum\": 7,\n \"minimum\": 1,\n \"title\": \"Gap Type\",\n \"type\": \"integer\"\n },\n \"limit\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n },\n \"offset\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"domains\"\n ],\n \"title\": \"GapQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_gap_totals\": {\n \"method\": \"/spectrum/v1/Gap/KeywordsTotals\",\n \"description\": \"Counts for keyword overlap and opportunity types.\",\n \"transport\": \"gap\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"domains\": {\n \"description\": \"Two to five root domains, first is your site\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 5,\n \"minItems\": 2,\n \"title\": \"Domains\",\n \"type\": \"array\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Semrush spectrum filter expression\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domains\"\n ],\n \"title\": \"GapSummaryQuery\",\n \"type\": \"object\"\n }\n },\n \"keyword_gap_overlap\": {\n \"method\": \"/spectrum/v1/Gap/Overlaps\",\n \"description\": \"Organic keyword profile overlaps.\",\n \"transport\": \"gap\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"database\": {\n \"default\": \"us\",\n \"pattern\": \"^(mobile-)?[a-z]{2}$\",\n \"title\": \"Database\",\n \"type\": \"string\"\n },\n \"domains\": {\n \"description\": \"Two to five root domains, first is your site\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 5,\n \"minItems\": 2,\n \"title\": \"Domains\",\n \"type\": \"array\"\n },\n \"filters\": {\n \"default\": \"\",\n \"description\": \"Semrush spectrum filter expression\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"domains\"\n ],\n \"title\": \"GapSummaryQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_gap\": {\n \"method\": \"backlinks_matrix\",\n \"description\": \"Paginated link-building prospects shared by competitors but missing from your site.\",\n \"transport\": \"backlink_gap\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domains\": {\n \"description\": \"Two to five root domains, first is your site\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 5,\n \"minItems\": 2,\n \"title\": \"Domains\",\n \"type\": \"array\"\n },\n \"page\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Page\",\n \"type\": \"integer\"\n },\n \"limit\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n },\n \"filters\": {\n \"default\": \"+|backlinksnum_0|Eq|0\",\n \"description\": \"Web filter; default finds referring domains missing from your site\",\n \"title\": \"Filters\",\n \"type\": \"string\"\n },\n \"sort_field\": {\n \"default\": \"matchesnum\",\n \"pattern\": \"^[a-z_]+$\",\n \"title\": \"Sort Field\",\n \"type\": \"string\"\n },\n \"descending\": {\n \"default\": true,\n \"title\": \"Descending\",\n \"type\": \"boolean\"\n },\n \"sort_target\": {\n \"default\": 0,\n \"maximum\": 4,\n \"minimum\": 0,\n \"title\": \"Sort Target\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"domains\"\n ],\n \"title\": \"BacklinkGapQuery\",\n \"type\": \"object\"\n }\n },\n \"backlink_comparison\": {\n \"method\": \"backlinks_comparison\",\n \"description\": \"Compare backlink history, country distribution and domain zones.\",\n \"transport\": \"backlink_gap\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"domains\": {\n \"description\": \"Two to five root domains, first is your site\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 5,\n \"minItems\": 2,\n \"title\": \"Domains\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"domains\"\n ],\n \"title\": \"BacklinkComparisonQuery\",\n \"type\": \"object\"\n }\n },\n \"projects\": {\n \"method\": \"/apis/v4-raw/crossroad/api/v0/crossroad/list\",\n \"description\": \"Existing projects and folder access, with pagination.\",\n \"transport\": \"projects\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"limit\": {\n \"default\": 15,\n \"maximum\": 100,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n },\n \"offset\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n },\n \"filters\": {\n \"additionalProperties\": true,\n \"description\": \"Project list web filter object\",\n \"title\": \"Filters\",\n \"type\": \"object\"\n }\n },\n \"title\": \"ProjectListQuery\",\n \"type\": \"object\"\n }\n },\n \"ai_capabilities\": {\n \"method\": \"/ai-seo/api/v2/user/user_capabilities\",\n \"description\": \"Account AI Visibility Toolkit access and limits.\",\n \"transport\": \"post\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n },\n \"audit_campaigns\": {\n \"method\": \"/siteaudit/api/campaigns/seolist\",\n \"description\": \"Existing Site Audit campaigns; does not start a crawl.\",\n \"transport\": \"get\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n },\n \"folders\": {\n \"method\": \"/apis/v4-raw/folders/api/v0/folders/selector-list\",\n \"description\": \"Accessible project folders.\",\n \"transport\": \"get\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n },\n \"saved_keyword_lists\": {\n \"method\": \"/apis/v4-raw/saved-keywords/api/v0/list/all\",\n \"description\": \"Existing saved keyword lists.\",\n \"transport\": \"post\",\n \"total_method\": \"\",\n \"web_report\": \"domain.overview\",\n \"schema\": {\n \"additionalProperties\": false,\n \"properties\": {},\n \"title\": \"EmptyQuery\",\n \"type\": \"object\"\n }\n }\n}\n","import type { Schema } from 'effect';\nimport catalog from './report-catalog.json' with { type: 'json' };\n\nconst backlinkSorts = new Map([['backlinks', 'page_ascore'], ['backlinks_refdomains', 'backlinksnum'], ['backlinks_anchors', 'backlinksnum'], ['backlinks_pages', 'domainsnum'], ['backlinks_outgoing_domains', 'links_num']]);\n\nexport const reports = catalog;\nexport type ReportName = keyof typeof reports;\nexport type Report = (typeof reports)[ReportName];\n/** Validated catalog queries and fixed JSON request payloads; optional keys are omitted on wire. */\nexport interface Query { [key: string]: Schema.Json; }\n\n/** Fixed request shapes observed in semrush-web-mcp. No arbitrary RPC or URL input. */\nexport function reportParameters(definition: Report, q: Query): Query {\n const family = definition.transport;\n if (family === 'magic') return magicParameters(definition, q);\n if (family === 'keyword') return keywordParameters(definition, q);\n if (family === 'direct') return 'database' in q ? { database: (q.database ?? null), global: (q.global_data ?? null), dateFormat: 'date' } : {};\n if (family === 'domain') return domainParameters(definition, q);\n if (family === 'backlink_gap') return backlinkComparisonParameters(definition, q);\n if (family.startsWith('backlink')) return backlinkParameters(definition, q);\n if (family === 'gap') return gapParameters(definition, q);\n if (family === 'projects') return { filter: (q.filters ?? null), range: { limit: (q.limit ?? null), offset: (q.offset ?? null) } };\n if (family === 'post' && definition.method.endsWith('/list/all')) return { ownership: 1, order: { field: 3, direction: 2 }, range: { limit: 1000, offset: 0 } };\n if (definition.method.endsWith('selector-list')) return { limit: 10000, offset: 0 };\n return {};\n}\n\nfunction magicParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n const filters: Query = Object.fromEntries(['phrase', 'competition_level', 'cpc', 'difficulty', 'results', 'volume', 'words_count'].map(key => [key, []]));\n Object.assign(filters, { serp_features: [{ inverted: false, value: [] }], phrase_include_logic: 0 }, (q.filters ?? null));\n const params: Query = { phrase: (q.keyword ?? null), database: (q.database ?? null), currency: (q.currency ?? null), mode: (q.mode ?? null), questions_only: (q.questions_only ?? null), topics_enabled: true, filter: filters, groups: (q.groups ?? null), order: { direction: q.descending ? 1 : 0, field: (q.sort_field ?? null) }, groups_order: { direction: 1, field: 'relevance' } };\n if (method === 'ideas.GetKeywords') params.page = { number: (q.page ?? null), size: (q.page_size ?? null) };\n if (method === 'ideas.GetGroups') params.groups_page = { number: (q.page ?? null), size: (q.page_size ?? null) };\n return params;\n}\n\n\nfunction keywordParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n if (!('keyword' in q)) return {};\n const params: Query = { phrase: (q.keyword ?? null), database: (q.database ?? null), device: 0, currency: 'USD', location: 0, date: '' };\n if (method.startsWith('ideas.')) Object.assign(params, { mode: 0, questions_only: (q.questions_only ?? null) });\n return params;\n}\n\n\nfunction domainParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n if (!('domain' in q)) return { database: (q.database ?? null) };\n const params: Query = { searchItem: (q.domain ?? null), searchType: 'domain', dateFormat: 'date', dateType: q.date_type ?? 'daily' };\n if ('database' in q) params.database = (q.database ?? null);\n if ('search_type' in q) {\n delete params.dateFormat;\n if ((q.date ?? null) !== null) params.date = (q.date ?? null);\n Object.assign(params, { searchType: (q.search_type ?? null), display: { page: (q.page ?? null), pageSize: (q.page_size ?? null), order: { field: (q.sort_field ?? null), direction: q.descending ? 'desc' : 'asc' } } });\n if (method === 'organic.Positions' || method === 'organic.PositionChangesV2') params.positionsType = 'all';\n if ('filters' in q) params.filter = (q.filters ?? null);\n if (method === 'organic.PositionChangesV2') Object.assign(params, { changesTypes: null, dateRange: null });\n }\n if (method.endsWith('CompetitorsOverview')) Object.assign(params, { display: { page: 1, pageSize: (q.limit ?? null) }, youDomain: true });\n if (method === 'organic.OverviewTrend') {\n delete params.dateFormat;\n Object.assign(params, { dateRange: null, global: (q.global_data ?? null) });\n }\n if (method === 'organic.TopicsStatus' || method === 'organic.TopicsResult') {\n delete params.dateFormat;\n delete params.dateType;\n }\n if (method === 'organic.AiTopSources') params.range = { limit: (q.limit ?? null), offset: (q.offset ?? null) };\n return params;\n}\n\n\nfunction backlinkComparisonParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n const params: Query = { action: 'report', type: method, 'targets[]': (q.domains ?? null), 'target_types[]': Array.isArray(q.domains) ? q.domains.map(() => 'root_domain') : [] };\n if (method === 'backlinks_matrix') Object.assign(params, { display_limit: (q.limit ?? null), export_columns: 'domain,domain_ascore,matches_num,backlinks_num,traffic', display_filter: (q.filters ?? null), sort_field: (q.sort_field ?? null), sort_type: q.descending ? 'desc' : 'asc', sort_target: (q.sort_target ?? null), display_page: (q.page ?? null) });\n else params.export_columns = 'zones,backlinks_historical,geodomains';\n return params;\n}\n\n\nfunction backlinkParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n const family = definition.transport;\n const params: Query = { target: (q.domain ?? null), target_type: (q.target_type ?? null) };\n if (family === 'backlink') {\n Object.assign(params, { action: 'report', type: method, display_page: (q.page ?? null), sort_field: (q.sort_field ?? null) || backlinkSorts.get(method), sort_type: q.descending ? 'desc' : 'asc' });\n if ((q.filters ?? null)) params.display_filter = (q.filters ?? null);\n }\n return params;\n}\n\n\nfunction gapParameters(definition: Report, q: Query): Query {\n const method = definition.method;\n const params: Query = { targets: Array.isArray(q.domains) ? q.domains.map(value => ({ product_type: 2, type: 1, value, filters: '' })) : [], date: null, database: (q.database ?? null), filters: (q.filters ?? null) };\n if (method.endsWith('KeywordsList')) Object.assign(params, { type: (q.gap_type ?? null), range: { limit: (q.limit ?? null), offset: (q.offset ?? null) }, columns: ['KEYWORD', 'INTENTS', 'VOLUME', 'KEYWORD_DIFFICULTY', 'CPC', 'COMPETITION_DENSITY', 'TARGETS_POSITION', 'TARGETS_URL', 'RESULTS'], order: { column: 6, direction: 2 } });\n return params;\n}\n","import { Schema } from 'effect';\n\n/** Safe errors are the only error details exposed by CLI and MCP boundaries. */\nexport class SessionError extends Schema.TaggedError<SessionError>()('SessionError', { message: Schema.String, code: Schema.optional(Schema.String) }) {}\nexport class ReportError extends Schema.TaggedError<ReportError>()('ReportError', { message: Schema.String }) {}\nexport class UsageError extends Schema.TaggedError<UsageError>()('UsageError', { message: Schema.String }) {}\n"],"mappings":";;;6BAAA;iBACoB;EAChB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc,EAAE;GAChB,SAAS;GACT,QAAQ;GACT;EACF;mBACmB;EAClB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;gBACgB;EACf,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,kBAAkB;KAChB,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;wBACwB;EACvB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,kBAAkB;KAChB,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;eACe;EACd,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;cACc;EACb,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;mBACmB;EAClB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;gBACgB;EACf,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,WAAW;KACT,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,kBAAkB;KAChB,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,QAAQ;KACN,WAAW;KACX,eAAe;KACf,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,cAAc;KACZ,WAAW;KACX,WAAW;KACX,SAAS;KA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CV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;uBACuB;EACtB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc,EACZ,UAAU;IACR,eAAe;IACf,aAAa;IACb,aAAa;IACb,SAAS;IACT,QAAQ;IACT,EACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;sBACsB;EACrB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc,EACZ,UAAU;IACR,eAAe;IACf,aAAa;IACb,aAAa;IACb,SAAS;IACT,QAAQ;IACT,EACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;oBACoB;EACnB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,UAAU;KACR,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;gBACgB;EACf,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,aAAa;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,eAAe;KACb,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;uBACuB;EACtB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;0BAC0B;EACzB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;gBACgB;EACf,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;uBACuB;EACtB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,eAAe;KACf,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GA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aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,eAAe;KACb,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;qBACqB;EACpB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,eAAe;KACb,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;sBACsB;EACrB,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,UAAU;KACR,aAAa;KACb,aAAa;KACb,SAAS;KACT,QAAQ;KACT;IACD,eAAe;KACb,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,SACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;cACc;EACb,UAAU;EACV,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,cAAc;EACd,UAAU;GACR,wBAAwB;GACxB,cAAc;IACZ,YAAY;KACV,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,WAAW;KACT,eAAe;KACf,SAAS,EACP,QAAQ,UACT;KACD,YAAY;KACZ,YAAY;KACZ,SAAS;KACT,QAAQ;KACT;IACD,WAAW;KACT,WAAW;KACX,eAAe;KACf,SAAS;KACT,QAAQ;KACT;IACD,YAAY;KACV,WAAW;KACX,eAAe;KACf,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,SAAS;KACP,WAAW;KACX,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACD,UAAU;KACR,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACT;IACF;GACD,YAAY,CACV,UACD;GACD,SAAS;GACT,QAAQ;GACT;EACF;q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"}
@@ -0,0 +1,95 @@
1
+ import { a as reports, r as UsageError } from "./errors-aN5dmXgv.js";
2
+ import { r as sessionsLive } from "./session-layer-u9NMfM8W.js";
3
+ import { t as Semrush } from "./browser-service-BYYE-vSm.js";
4
+ import { n as semrushLive } from "./browser-layer-DijkeDly.js";
5
+ import { n as parseReport } from "./validation-BIbDUKRg.js";
6
+ import { Effect, Layer, ManagedRuntime, Schema } from "effect";
7
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
8
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
+ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
10
+
11
+ //#region src/mcp.ts
12
+ const appLayer = semrushLive.pipe(Layer.provide(sessionsLive));
13
+ /** Protocol-only stdout; validation and auth failures become ordinary MCP tool errors. */
14
+ async function serveMcp() {
15
+ const runtime = ManagedRuntime.make(appLayer);
16
+ const server = new Server({
17
+ name: "semrush-cli",
18
+ version: "0.1.0"
19
+ }, { capabilities: { tools: {} } });
20
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: Object.entries(reports).map(([name, report]) => ({
21
+ name,
22
+ description: report.description,
23
+ inputSchema: report.schema,
24
+ annotations: {
25
+ readOnlyHint: true,
26
+ destructiveHint: false,
27
+ openWorldHint: true
28
+ }
29
+ })) }));
30
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
31
+ const program = Effect.gen(function* () {
32
+ return yield* parseReport(request.params.name, yield* Schema.decodeUnknownEffect(Schema.JsonObject)(request.params.arguments ?? {}).pipe(Effect.mapError(() => new UsageError({ message: "Tool arguments must be a JSON object." }))));
33
+ });
34
+ const validated = await Effect.runPromise(program.pipe(Effect.match({
35
+ onSuccess: (value) => ({
36
+ ok: true,
37
+ value
38
+ }),
39
+ onFailure: (error) => ({
40
+ ok: false,
41
+ message: error.message
42
+ })
43
+ })));
44
+ if (!validated.ok) return {
45
+ isError: true,
46
+ content: [{
47
+ type: "text",
48
+ text: validated.message
49
+ }]
50
+ };
51
+ const outcome = await runtime.runPromise(Effect.gen(function* () {
52
+ return yield* (yield* Semrush).report(validated.value);
53
+ }).pipe(Effect.match({
54
+ onSuccess: (value) => ({
55
+ ok: true,
56
+ text: JSON.stringify(value)
57
+ }),
58
+ onFailure: (error) => ({
59
+ ok: false,
60
+ text: error.message
61
+ })
62
+ }))).catch(() => ({
63
+ ok: false,
64
+ text: "Semrush session or browser unavailable. Run semrush doctor, then reconnect this MCP server."
65
+ }));
66
+ return {
67
+ isError: !outcome.ok,
68
+ content: [{
69
+ type: "text",
70
+ text: outcome.text
71
+ }]
72
+ };
73
+ });
74
+ let closing = false;
75
+ const close = async () => {
76
+ if (closing) return;
77
+ closing = true;
78
+ await runtime.dispose();
79
+ await server.close();
80
+ };
81
+ server.onclose = () => {
82
+ close();
83
+ };
84
+ process.once("SIGINT", () => {
85
+ close();
86
+ });
87
+ process.once("SIGTERM", () => {
88
+ close();
89
+ });
90
+ await server.connect(new StdioServerTransport());
91
+ }
92
+
93
+ //#endregion
94
+ export { appLayer, serveMcp };
95
+ //# sourceMappingURL=mcp-DUyKjMzQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-DUyKjMzQ.js","names":[],"sources":["../src/mcp.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { Effect, ManagedRuntime, Schema } from 'effect';\nimport { reports } from './report-parameters.js';\nimport { Semrush } from './browser-service.js';\nimport { semrushLive } from './browser-layer.js';\nimport { sessionsLive } from './session-layer.js';\nimport { Layer } from 'effect';\nimport { parseReport } from './validation.js';\nimport { UsageError } from './errors.js';\n\nexport const appLayer = semrushLive.pipe(Layer.provide(sessionsLive));\n\n/** Protocol-only stdout; validation and auth failures become ordinary MCP tool errors. */\nexport async function serveMcp(): Promise<void> {\n const runtime = ManagedRuntime.make(appLayer);\n const server = new Server({ name: 'semrush-cli', version: '0.1.0' }, { capabilities: { tools: {} } });\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: Object.entries(reports).map(([name, report]) => ({ name, description: report.description, inputSchema: report.schema, annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true } })) }));\n server.setRequestHandler(CallToolRequestSchema, async request => {\n const program = Effect.gen(function* () {\n const parsed = yield* parseReport(request.params.name, yield* Schema.decodeUnknownEffect(Schema.JsonObject)(request.params.arguments ?? {}).pipe(Effect.mapError(() => new UsageError({ message: 'Tool arguments must be a JSON object.' }))));\n return parsed;\n });\n const validated = await Effect.runPromise(program.pipe(Effect.match({ onSuccess: value => ({ ok: true as const, value }), onFailure: error => ({ ok: false as const, message: error.message }) })));\n if (!validated.ok) return { isError: true, content: [{ type: 'text', text: validated.message }] };\n const outcome = await runtime.runPromise(Effect.gen(function* () {\n return yield* (yield* Semrush).report(validated.value);\n }).pipe(Effect.match({ onSuccess: value => ({ ok: true as const, text: JSON.stringify(value) }), onFailure: error => ({ ok: false as const, text: error.message }) }))).catch(() => ({ ok: false as const, text: 'Semrush session or browser unavailable. Run semrush doctor, then reconnect this MCP server.' }));\n return { isError: !outcome.ok, content: [{ type: 'text', text: outcome.text }] };\n });\n let closing = false;\n const close = async () => { if (closing) return; closing = true; await runtime.dispose(); await server.close(); };\n server.onclose = () => { void close(); };\n process.once('SIGINT', () => { void close(); });\n process.once('SIGTERM', () => { void close(); });\n await server.connect(new StdioServerTransport());\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAa,WAAW,YAAY,KAAK,MAAM,QAAQ,aAAa,CAAC;;AAGrE,eAAsB,WAA0B;CAC9C,MAAM,UAAU,eAAe,KAAK,SAAS;CAC7C,MAAM,SAAS,IAAI,OAAO;EAAE,MAAM;EAAe,SAAS;EAAS,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACrG,QAAO,kBAAkB,wBAAwB,aAAa,EAAE,OAAO,OAAO,QAAQ,QAAQ,CAAC,KAAK,CAAC,MAAM,aAAa;EAAE;EAAM,aAAa,OAAO;EAAa,aAAa,OAAO;EAAQ,aAAa;GAAE,cAAc;GAAM,iBAAiB;GAAO,eAAe;GAAM;EAAE,EAAE,EAAE,EAAE;AACrR,QAAO,kBAAkB,uBAAuB,OAAM,YAAW;EAC/D,MAAM,UAAU,OAAO,IAAI,aAAa;AAEtC,UADe,OAAO,YAAY,QAAQ,OAAO,MAAM,OAAO,OAAO,oBAAoB,OAAO,WAAW,CAAC,QAAQ,OAAO,aAAa,EAAE,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,WAAW,EAAE,SAAS,yCAAyC,CAAC,CAAC,CAAC,CAAC;IAE9O;EACF,MAAM,YAAY,MAAM,OAAO,WAAW,QAAQ,KAAK,OAAO,MAAM;GAAE,YAAW,WAAU;IAAE,IAAI;IAAe;IAAO;GAAG,YAAW,WAAU;IAAE,IAAI;IAAgB,SAAS,MAAM;IAAS;GAAG,CAAC,CAAC,CAAC;AACnM,MAAI,CAAC,UAAU,GAAI,QAAO;GAAE,SAAS;GAAM,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM,UAAU;IAAS,CAAC;GAAE;EACjG,MAAM,UAAU,MAAM,QAAQ,WAAW,OAAO,IAAI,aAAa;AAC/D,UAAO,QAAQ,OAAO,SAAS,OAAO,UAAU,MAAM;IACtD,CAAC,KAAK,OAAO,MAAM;GAAE,YAAW,WAAU;IAAE,IAAI;IAAe,MAAM,KAAK,UAAU,MAAM;IAAE;GAAG,YAAW,WAAU;IAAE,IAAI;IAAgB,MAAM,MAAM;IAAS;GAAG,CAAC,CAAC,CAAC,CAAC,aAAa;GAAE,IAAI;GAAgB,MAAM;GAA+F,EAAE;AAClT,SAAO;GAAE,SAAS,CAAC,QAAQ;GAAI,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM,QAAQ;IAAM,CAAC;GAAE;GAChF;CACF,IAAI,UAAU;CACd,MAAM,QAAQ,YAAY;AAAE,MAAI,QAAS;AAAQ,YAAU;AAAM,QAAM,QAAQ,SAAS;AAAE,QAAM,OAAO,OAAO;;AAC9G,QAAO,gBAAgB;AAAE,EAAK,OAAO;;AACrC,SAAQ,KAAK,gBAAgB;AAAE,EAAK,OAAO;GAAI;AAC/C,SAAQ,KAAK,iBAAiB;AAAE,EAAK,OAAO;GAAI;AAChD,OAAM,OAAO,QAAQ,IAAI,sBAAsB,CAAC"}
@@ -0,0 +1,239 @@
1
+ import { n as SessionError } from "./errors-aN5dmXgv.js";
2
+ import { Config, Context, Effect, Layer } from "effect";
3
+ import { readFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+
7
+ //#region src/session-service.ts
8
+ /** Galleton owns all durable credentials. Consumers only receive scoped headers. */
9
+ var Sessions = class extends Context.Service()("semrush/Sessions") {};
10
+
11
+ //#endregion
12
+ //#region src/vendor/galleton.ts
13
+ var GalletonError = class extends Error {
14
+ constructor(code, message, status = 0, retryAt) {
15
+ super(message);
16
+ this.code = code;
17
+ this.status = status;
18
+ this.retryAt = retryAt;
19
+ this.name = "GalletonError";
20
+ }
21
+ };
22
+ var ManagedResponse = class {
23
+ constructor(status, headers, body, revision) {
24
+ this.status = status;
25
+ this.headers = headers;
26
+ this.body = body;
27
+ this.revision = revision;
28
+ }
29
+ get ok() {
30
+ return this.status >= 200 && this.status < 300;
31
+ }
32
+ text() {
33
+ return new TextDecoder().decode(this.body);
34
+ }
35
+ json() {
36
+ return JSON.parse(this.text());
37
+ }
38
+ };
39
+ function encode64(bytes) {
40
+ let binary = "";
41
+ for (let start = 0; start < bytes.length; start += 8192) binary += String.fromCharCode(...bytes.subarray(start, start + 8192));
42
+ return btoa(binary);
43
+ }
44
+ function decode64(value) {
45
+ return Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
46
+ }
47
+ function sessionPath(id) {
48
+ if (!/^[A-Za-z0-9_-]{1,64}$/.test(id)) throw new TypeError("Invalid session ID");
49
+ return `/v1/sessions/${id}`;
50
+ }
51
+ async function responseText(response) {
52
+ const reader = response.body?.getReader();
53
+ if (!reader) return "";
54
+ const decoder = new TextDecoder();
55
+ let size = 0;
56
+ let text = "";
57
+ try {
58
+ while (true) {
59
+ const { done, value } = await reader.read();
60
+ if (done) break;
61
+ size += value.byteLength;
62
+ if (size > 8 * 1024 * 1024) {
63
+ await reader.cancel().catch(() => {});
64
+ throw new GalletonError("invalid_response", "Oversized daemon response.", response.status);
65
+ }
66
+ text += decoder.decode(value, { stream: true });
67
+ }
68
+ return text + decoder.decode();
69
+ } finally {
70
+ reader.releaseLock();
71
+ }
72
+ }
73
+ var Galleton = class {
74
+ base;
75
+ token;
76
+ timeoutMs;
77
+ constructor(options) {
78
+ const url = new URL(options.baseURL ?? "http://127.0.0.1:8766");
79
+ const host = url.hostname;
80
+ if (!(host === "[::1]" || /^127(?:\.[0-9]{1,3}){3}$/.test(host) && host.split(".").every((n) => +n <= 255)) || url.protocol !== "http:" || url.username || url.password || url.search || url.hash || url.pathname !== "/") throw new TypeError("Galleton requires a literal loopback HTTP origin");
81
+ this.base = url.origin;
82
+ this.token = options.token.trim();
83
+ if (!this.token || /[\r\n]/.test(this.token)) throw new TypeError("Invalid local API token");
84
+ this.timeoutMs = options.timeoutMs ?? 3e5;
85
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) throw new TypeError("Invalid timeout");
86
+ }
87
+ async call(method, path, body) {
88
+ let response;
89
+ try {
90
+ response = await fetch(this.base + path, {
91
+ method,
92
+ headers: {
93
+ Authorization: `Bearer ${this.token}`,
94
+ "Content-Type": "application/json"
95
+ },
96
+ body: body === void 0 ? void 0 : JSON.stringify(body),
97
+ redirect: "manual",
98
+ signal: AbortSignal.timeout(this.timeoutMs)
99
+ });
100
+ } catch {
101
+ throw new GalletonError("daemon_unavailable", "Galleton is unavailable or the local request timed out.");
102
+ }
103
+ let text;
104
+ try {
105
+ text = await responseText(response);
106
+ } catch (error) {
107
+ if (error instanceof GalletonError) throw error;
108
+ throw new GalletonError("daemon_unavailable", "Galleton response was interrupted; the request may already have completed.", response.status);
109
+ }
110
+ let decoded;
111
+ try {
112
+ decoded = JSON.parse(text);
113
+ } catch {
114
+ if (!response.ok) throw new GalletonError("daemon_error", "Galleton request failed.", response.status);
115
+ throw new GalletonError("invalid_response", "Expected a JSON daemon response.", response.status);
116
+ }
117
+ if (!response.ok) {
118
+ const error = decoded.error;
119
+ throw new GalletonError(error?.code ?? "daemon_error", error?.message ?? "Galleton request failed.", response.status, error?.retry_at);
120
+ }
121
+ return decoded;
122
+ }
123
+ connect(id, credentials) {
124
+ return this.call("PUT", sessionPath(id), credentials);
125
+ }
126
+ status(id) {
127
+ return this.call("GET", sessionPath(id));
128
+ }
129
+ async list() {
130
+ return (await this.call("GET", "/v1/sessions")).sessions;
131
+ }
132
+ refresh(id) {
133
+ return this.call("POST", sessionPath(id) + "/refresh", {});
134
+ }
135
+ async headers(id, url) {
136
+ return (await this.call("POST", sessionPath(id) + "/headers", { url })).headers;
137
+ }
138
+ capture(id, url, setCookie) {
139
+ return this.call("POST", sessionPath(id) + "/cookies", {
140
+ url,
141
+ set_cookie: setCookie
142
+ });
143
+ }
144
+ async forget(id) {
145
+ await this.call("DELETE", sessionPath(id));
146
+ }
147
+ /** Buffered request with automatic Cookie/Authorization injection and Set-Cookie capture.
148
+ * Resource calls are never automatically retried. Non-2xx upstream statuses are returned. */
149
+ async request(id, url, options = {}) {
150
+ if (options.body !== void 0 && options.json !== void 0) throw new TypeError("Use body or json, not both");
151
+ const headers = { ...options.headers };
152
+ let body = options.body;
153
+ if (options.json !== void 0) {
154
+ body = JSON.stringify(options.json);
155
+ for (const name of Object.keys(headers)) if (name.toLowerCase() === "content-type") delete headers[name];
156
+ headers["Content-Type"] = "application/json";
157
+ }
158
+ const bytes = typeof body === "string" ? new TextEncoder().encode(body) : body ?? new Uint8Array();
159
+ if (bytes.length > 1024 * 1024) throw new TypeError("Request body exceeds 1 MiB");
160
+ const wire = await this.call("POST", sessionPath(id) + "/request", {
161
+ url,
162
+ method: options.method ?? "GET",
163
+ headers,
164
+ body_base64: encode64(bytes)
165
+ });
166
+ return new ManagedResponse(wire.status, wire.headers, decode64(wire.body_base64), wire.revision);
167
+ }
168
+ };
169
+
170
+ //#endregion
171
+ //#region src/session-layer.ts
172
+ const origin = "https://www.semrush.com";
173
+ const defaultStateDirectory = join(homedir(), ".local", "share", "semrush-cli", "galleton");
174
+ /** Raw SDK errors stop here; daemon and upstream payloads never reach diagnostics. */
175
+ const sdkError = (cause) => {
176
+ if (cause instanceof GalletonError) {
177
+ const recovery = cause.code === "not_found" ? "Run semrush auth login or semrush auth import --cdp-url URL." : "Run semrush daemon start and semrush auth status. Reimport if renewal or authentication failed.";
178
+ return new SessionError({
179
+ message: `Galleton ${cause.code}. ${recovery}`,
180
+ code: cause.code
181
+ });
182
+ }
183
+ return new SessionError({ message: "Galleton operation failed. Run semrush doctor and check local configuration." });
184
+ };
185
+ const makeSessionsLayer = (credentialOrigin) => Layer.effect(Sessions, Effect.gen(function* () {
186
+ const baseURL = yield* Config.String("SEMRUSH_GALLETON_URL").pipe(Config.withDefault("http://127.0.0.1:8768"));
187
+ const tokenFile = yield* Config.String("SEMRUSH_GALLETON_TOKEN_FILE").pipe(Config.withDefault(join(defaultStateDirectory, "api.token")));
188
+ const id = yield* Config.String("SEMRUSH_SESSION").pipe(Config.withDefault("semrush-cli"));
189
+ const token = yield* Effect.tryPromise({
190
+ try: () => readFile(tokenFile, "utf8"),
191
+ catch: () => new SessionError({ message: "Galleton token unavailable. Run semrush setup, or set SEMRUSH_GALLETON_TOKEN_FILE." })
192
+ });
193
+ const sdk = yield* Effect.try({
194
+ try: () => new Galleton({
195
+ baseURL,
196
+ token,
197
+ timeoutMs: 6e4
198
+ }),
199
+ catch: sdkError
200
+ });
201
+ const status = Effect.fn("Sessions.status")(() => Effect.tryPromise({
202
+ try: () => sdk.status(id),
203
+ catch: sdkError
204
+ }));
205
+ return Sessions.of({
206
+ status,
207
+ headers: Effect.fn("Sessions.headers")(() => Effect.tryPromise({
208
+ try: () => sdk.headers(id, credentialOrigin + "/"),
209
+ catch: sdkError
210
+ })),
211
+ save: Effect.fn("Sessions.save")(function* (credentials) {
212
+ const previous = yield* status().pipe(Effect.map((value) => value.revision), Effect.catchTag("SessionError", (error) => error.code === "not_found" ? Effect.succeed(void 0) : Effect.fail(error)));
213
+ const input = { ...credentials };
214
+ if (previous !== void 0) {
215
+ input.replace = true;
216
+ input.expected_revision = previous;
217
+ }
218
+ return yield* Effect.tryPromise({
219
+ try: () => sdk.connect(id, input),
220
+ catch: sdkError
221
+ });
222
+ }),
223
+ capture: Effect.fn("Sessions.capture")((cookies) => Effect.tryPromise({
224
+ try: async () => {
225
+ await sdk.capture(id, credentialOrigin + "/", cookies);
226
+ },
227
+ catch: sdkError
228
+ })),
229
+ forget: Effect.fn("Sessions.forget")(() => Effect.tryPromise({
230
+ try: () => sdk.forget(id),
231
+ catch: sdkError
232
+ }))
233
+ });
234
+ }));
235
+ const sessionsLive = makeSessionsLayer(origin);
236
+
237
+ //#endregion
238
+ export { Sessions as i, origin as n, sessionsLive as r, defaultStateDirectory as t };
239
+ //# sourceMappingURL=session-layer-u9NMfM8W.js.map