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.
- package/LICENSE +21 -0
- package/README.md +163 -2
- package/THIRD-PARTY-NOTICES.md +19 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +1 -0
- package/dist/auth-B26NjmuZ.js +82 -0
- package/dist/auth-B26NjmuZ.js.map +1 -0
- package/dist/browser-layer-DijkeDly.js +269 -0
- package/dist/browser-layer-DijkeDly.js.map +1 -0
- package/dist/browser-service-BYYE-vSm.js +9 -0
- package/dist/browser-service-BYYE-vSm.js.map +1 -0
- package/dist/browser-service-CL8YPaIT.js +3 -0
- package/dist/cli.js +272 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon/galleton-darwin-arm64 +0 -0
- package/dist/daemon/galleton-darwin-x64 +0 -0
- package/dist/daemon/galleton-linux-arm64 +0 -0
- package/dist/daemon/galleton-linux-x64 +0 -0
- package/dist/daemon/galleton-win32-x64.exe +0 -0
- package/dist/errors-aN5dmXgv.js +2119 -0
- package/dist/errors-aN5dmXgv.js.map +1 -0
- package/dist/mcp-DUyKjMzQ.js +95 -0
- package/dist/mcp-DUyKjMzQ.js.map +1 -0
- package/dist/session-layer-u9NMfM8W.js +239 -0
- package/dist/session-layer-u9NMfM8W.js.map +1 -0
- package/dist/validation-BIbDUKRg.js +30 -0
- package/dist/validation-BIbDUKRg.js.map +1 -0
- package/dist/validation-D4jV0Q8q.js +4 -0
- package/docs/architecture.md +21 -0
- package/package.json +56 -4
- package/src/vendor/GALLETON-LICENSE +21 -0
- package/src/vendor/README.md +11 -0
|
@@ -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
|