seo 0.15.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3668,10 +3668,10 @@ export declare const crawlPageSnapshotSchema: z.ZodObject<{
3668
3668
  raw: z.ZodString;
3669
3669
  resolved: z.ZodOptional<z.ZodString>;
3670
3670
  ignoredReason: z.ZodOptional<z.ZodEnum<{
3671
- "invalid-url": "invalid-url";
3672
3671
  "outside-head": "outside-head";
3673
3672
  "alternate-qualifier": "alternate-qualifier";
3674
3673
  fragment: "fragment";
3674
+ "invalid-url": "invalid-url";
3675
3675
  "non-http-url": "non-http-url";
3676
3676
  }>>;
3677
3677
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -4305,15 +4305,15 @@ export declare const crawlReportSummarySchema: z.ZodObject<{
4305
4305
  skippedUrls: z.ZodNumber;
4306
4306
  skipReasons: z.ZodArray<z.ZodObject<{
4307
4307
  reason: z.ZodEnum<{
4308
+ "invalid-url": "invalid-url";
4309
+ "robots-disallowed": "robots-disallowed";
4310
+ "origin-backpressure": "origin-backpressure";
4308
4311
  "asset-url": "asset-url";
4309
4312
  "configured-exclusion": "configured-exclusion";
4310
4313
  "duplicate-normalization": "duplicate-normalization";
4311
- "invalid-url": "invalid-url";
4312
4314
  "memory-pressure": "memory-pressure";
4313
4315
  "off-origin": "off-origin";
4314
- "origin-backpressure": "origin-backpressure";
4315
4316
  "queue-safety-limit": "queue-safety-limit";
4316
- "robots-disallowed": "robots-disallowed";
4317
4317
  "robots-uncertain": "robots-uncertain";
4318
4318
  "legacy-unclassified": "legacy-unclassified";
4319
4319
  }>;
@@ -4471,15 +4471,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4471
4471
  skippedUrls: z.ZodNumber;
4472
4472
  skipReasons: z.ZodArray<z.ZodObject<{
4473
4473
  reason: z.ZodEnum<{
4474
+ "invalid-url": "invalid-url";
4475
+ "robots-disallowed": "robots-disallowed";
4476
+ "origin-backpressure": "origin-backpressure";
4474
4477
  "asset-url": "asset-url";
4475
4478
  "configured-exclusion": "configured-exclusion";
4476
4479
  "duplicate-normalization": "duplicate-normalization";
4477
- "invalid-url": "invalid-url";
4478
4480
  "memory-pressure": "memory-pressure";
4479
4481
  "off-origin": "off-origin";
4480
- "origin-backpressure": "origin-backpressure";
4481
4482
  "queue-safety-limit": "queue-safety-limit";
4482
- "robots-disallowed": "robots-disallowed";
4483
4483
  "robots-uncertain": "robots-uncertain";
4484
4484
  "legacy-unclassified": "legacy-unclassified";
4485
4485
  }>;
@@ -4851,10 +4851,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4851
4851
  raw: z.ZodString;
4852
4852
  resolved: z.ZodOptional<z.ZodString>;
4853
4853
  ignoredReason: z.ZodOptional<z.ZodEnum<{
4854
- "invalid-url": "invalid-url";
4855
4854
  "outside-head": "outside-head";
4856
4855
  "alternate-qualifier": "alternate-qualifier";
4857
4856
  fragment: "fragment";
4857
+ "invalid-url": "invalid-url";
4858
4858
  "non-http-url": "non-http-url";
4859
4859
  }>>;
4860
4860
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -5786,15 +5786,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5786
5786
  skippedUrls: z.ZodNumber;
5787
5787
  skipReasons: z.ZodArray<z.ZodObject<{
5788
5788
  reason: z.ZodEnum<{
5789
+ "invalid-url": "invalid-url";
5790
+ "robots-disallowed": "robots-disallowed";
5791
+ "origin-backpressure": "origin-backpressure";
5789
5792
  "asset-url": "asset-url";
5790
5793
  "configured-exclusion": "configured-exclusion";
5791
5794
  "duplicate-normalization": "duplicate-normalization";
5792
- "invalid-url": "invalid-url";
5793
5795
  "memory-pressure": "memory-pressure";
5794
5796
  "off-origin": "off-origin";
5795
- "origin-backpressure": "origin-backpressure";
5796
5797
  "queue-safety-limit": "queue-safety-limit";
5797
- "robots-disallowed": "robots-disallowed";
5798
5798
  "robots-uncertain": "robots-uncertain";
5799
5799
  "legacy-unclassified": "legacy-unclassified";
5800
5800
  }>;
@@ -6166,10 +6166,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6166
6166
  raw: z.ZodString;
6167
6167
  resolved: z.ZodOptional<z.ZodString>;
6168
6168
  ignoredReason: z.ZodOptional<z.ZodEnum<{
6169
- "invalid-url": "invalid-url";
6170
6169
  "outside-head": "outside-head";
6171
6170
  "alternate-qualifier": "alternate-qualifier";
6172
6171
  fragment: "fragment";
6172
+ "invalid-url": "invalid-url";
6173
6173
  "non-http-url": "non-http-url";
6174
6174
  }>>;
6175
6175
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -7101,15 +7101,15 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7101
7101
  skippedUrls: z.ZodNumber;
7102
7102
  skipReasons: z.ZodArray<z.ZodObject<{
7103
7103
  reason: z.ZodEnum<{
7104
+ "invalid-url": "invalid-url";
7105
+ "robots-disallowed": "robots-disallowed";
7106
+ "origin-backpressure": "origin-backpressure";
7104
7107
  "asset-url": "asset-url";
7105
7108
  "configured-exclusion": "configured-exclusion";
7106
7109
  "duplicate-normalization": "duplicate-normalization";
7107
- "invalid-url": "invalid-url";
7108
7110
  "memory-pressure": "memory-pressure";
7109
7111
  "off-origin": "off-origin";
7110
- "origin-backpressure": "origin-backpressure";
7111
7112
  "queue-safety-limit": "queue-safety-limit";
7112
- "robots-disallowed": "robots-disallowed";
7113
7113
  "robots-uncertain": "robots-uncertain";
7114
7114
  "legacy-unclassified": "legacy-unclassified";
7115
7115
  }>;
@@ -7481,10 +7481,10 @@ export declare const crawlReportSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
7481
7481
  raw: z.ZodString;
7482
7482
  resolved: z.ZodOptional<z.ZodString>;
7483
7483
  ignoredReason: z.ZodOptional<z.ZodEnum<{
7484
- "invalid-url": "invalid-url";
7485
7484
  "outside-head": "outside-head";
7486
7485
  "alternate-qualifier": "alternate-qualifier";
7487
7486
  fragment: "fragment";
7487
+ "invalid-url": "invalid-url";
7488
7488
  "non-http-url": "non-http-url";
7489
7489
  }>>;
7490
7490
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -8418,15 +8418,15 @@ export declare const crawlerSchemas: {
8418
8418
  skippedUrls: z.ZodNumber;
8419
8419
  skipReasons: z.ZodArray<z.ZodObject<{
8420
8420
  reason: z.ZodEnum<{
8421
+ "invalid-url": "invalid-url";
8422
+ "robots-disallowed": "robots-disallowed";
8423
+ "origin-backpressure": "origin-backpressure";
8421
8424
  "asset-url": "asset-url";
8422
8425
  "configured-exclusion": "configured-exclusion";
8423
8426
  "duplicate-normalization": "duplicate-normalization";
8424
- "invalid-url": "invalid-url";
8425
8427
  "memory-pressure": "memory-pressure";
8426
8428
  "off-origin": "off-origin";
8427
- "origin-backpressure": "origin-backpressure";
8428
8429
  "queue-safety-limit": "queue-safety-limit";
8429
- "robots-disallowed": "robots-disallowed";
8430
8430
  "robots-uncertain": "robots-uncertain";
8431
8431
  "legacy-unclassified": "legacy-unclassified";
8432
8432
  }>;
@@ -8798,10 +8798,10 @@ export declare const crawlerSchemas: {
8798
8798
  raw: z.ZodString;
8799
8799
  resolved: z.ZodOptional<z.ZodString>;
8800
8800
  ignoredReason: z.ZodOptional<z.ZodEnum<{
8801
- "invalid-url": "invalid-url";
8802
8801
  "outside-head": "outside-head";
8803
8802
  "alternate-qualifier": "alternate-qualifier";
8804
8803
  fragment: "fragment";
8804
+ "invalid-url": "invalid-url";
8805
8805
  "non-http-url": "non-http-url";
8806
8806
  }>>;
8807
8807
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -9733,15 +9733,15 @@ export declare const crawlerSchemas: {
9733
9733
  skippedUrls: z.ZodNumber;
9734
9734
  skipReasons: z.ZodArray<z.ZodObject<{
9735
9735
  reason: z.ZodEnum<{
9736
+ "invalid-url": "invalid-url";
9737
+ "robots-disallowed": "robots-disallowed";
9738
+ "origin-backpressure": "origin-backpressure";
9736
9739
  "asset-url": "asset-url";
9737
9740
  "configured-exclusion": "configured-exclusion";
9738
9741
  "duplicate-normalization": "duplicate-normalization";
9739
- "invalid-url": "invalid-url";
9740
9742
  "memory-pressure": "memory-pressure";
9741
9743
  "off-origin": "off-origin";
9742
- "origin-backpressure": "origin-backpressure";
9743
9744
  "queue-safety-limit": "queue-safety-limit";
9744
- "robots-disallowed": "robots-disallowed";
9745
9745
  "robots-uncertain": "robots-uncertain";
9746
9746
  "legacy-unclassified": "legacy-unclassified";
9747
9747
  }>;
@@ -10113,10 +10113,10 @@ export declare const crawlerSchemas: {
10113
10113
  raw: z.ZodString;
10114
10114
  resolved: z.ZodOptional<z.ZodString>;
10115
10115
  ignoredReason: z.ZodOptional<z.ZodEnum<{
10116
- "invalid-url": "invalid-url";
10117
10116
  "outside-head": "outside-head";
10118
10117
  "alternate-qualifier": "alternate-qualifier";
10119
10118
  fragment: "fragment";
10119
+ "invalid-url": "invalid-url";
10120
10120
  "non-http-url": "non-http-url";
10121
10121
  }>>;
10122
10122
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -11048,15 +11048,15 @@ export declare const crawlerSchemas: {
11048
11048
  skippedUrls: z.ZodNumber;
11049
11049
  skipReasons: z.ZodArray<z.ZodObject<{
11050
11050
  reason: z.ZodEnum<{
11051
+ "invalid-url": "invalid-url";
11052
+ "robots-disallowed": "robots-disallowed";
11053
+ "origin-backpressure": "origin-backpressure";
11051
11054
  "asset-url": "asset-url";
11052
11055
  "configured-exclusion": "configured-exclusion";
11053
11056
  "duplicate-normalization": "duplicate-normalization";
11054
- "invalid-url": "invalid-url";
11055
11057
  "memory-pressure": "memory-pressure";
11056
11058
  "off-origin": "off-origin";
11057
- "origin-backpressure": "origin-backpressure";
11058
11059
  "queue-safety-limit": "queue-safety-limit";
11059
- "robots-disallowed": "robots-disallowed";
11060
11060
  "robots-uncertain": "robots-uncertain";
11061
11061
  "legacy-unclassified": "legacy-unclassified";
11062
11062
  }>;
@@ -11428,10 +11428,10 @@ export declare const crawlerSchemas: {
11428
11428
  raw: z.ZodString;
11429
11429
  resolved: z.ZodOptional<z.ZodString>;
11430
11430
  ignoredReason: z.ZodOptional<z.ZodEnum<{
11431
- "invalid-url": "invalid-url";
11432
11431
  "outside-head": "outside-head";
11433
11432
  "alternate-qualifier": "alternate-qualifier";
11434
11433
  fragment: "fragment";
11434
+ "invalid-url": "invalid-url";
11435
11435
  "non-http-url": "non-http-url";
11436
11436
  }>>;
11437
11437
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -12867,10 +12867,10 @@ export declare const crawlerSchemas: {
12867
12867
  raw: z.ZodString;
12868
12868
  resolved: z.ZodOptional<z.ZodString>;
12869
12869
  ignoredReason: z.ZodOptional<z.ZodEnum<{
12870
- "invalid-url": "invalid-url";
12871
12870
  "outside-head": "outside-head";
12872
12871
  "alternate-qualifier": "alternate-qualifier";
12873
12872
  fragment: "fragment";
12873
+ "invalid-url": "invalid-url";
12874
12874
  "non-http-url": "non-http-url";
12875
12875
  }>>;
12876
12876
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -13291,15 +13291,15 @@ export declare const crawlerJsonSchemas: {
13291
13291
  skippedUrls: z.ZodNumber;
13292
13292
  skipReasons: z.ZodArray<z.ZodObject<{
13293
13293
  reason: z.ZodEnum<{
13294
+ "invalid-url": "invalid-url";
13295
+ "robots-disallowed": "robots-disallowed";
13296
+ "origin-backpressure": "origin-backpressure";
13294
13297
  "asset-url": "asset-url";
13295
13298
  "configured-exclusion": "configured-exclusion";
13296
13299
  "duplicate-normalization": "duplicate-normalization";
13297
- "invalid-url": "invalid-url";
13298
13300
  "memory-pressure": "memory-pressure";
13299
13301
  "off-origin": "off-origin";
13300
- "origin-backpressure": "origin-backpressure";
13301
13302
  "queue-safety-limit": "queue-safety-limit";
13302
- "robots-disallowed": "robots-disallowed";
13303
13303
  "robots-uncertain": "robots-uncertain";
13304
13304
  "legacy-unclassified": "legacy-unclassified";
13305
13305
  }>;
@@ -13671,10 +13671,10 @@ export declare const crawlerJsonSchemas: {
13671
13671
  raw: z.ZodString;
13672
13672
  resolved: z.ZodOptional<z.ZodString>;
13673
13673
  ignoredReason: z.ZodOptional<z.ZodEnum<{
13674
- "invalid-url": "invalid-url";
13675
13674
  "outside-head": "outside-head";
13676
13675
  "alternate-qualifier": "alternate-qualifier";
13677
13676
  fragment: "fragment";
13677
+ "invalid-url": "invalid-url";
13678
13678
  "non-http-url": "non-http-url";
13679
13679
  }>>;
13680
13680
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -14606,15 +14606,15 @@ export declare const crawlerJsonSchemas: {
14606
14606
  skippedUrls: z.ZodNumber;
14607
14607
  skipReasons: z.ZodArray<z.ZodObject<{
14608
14608
  reason: z.ZodEnum<{
14609
+ "invalid-url": "invalid-url";
14610
+ "robots-disallowed": "robots-disallowed";
14611
+ "origin-backpressure": "origin-backpressure";
14609
14612
  "asset-url": "asset-url";
14610
14613
  "configured-exclusion": "configured-exclusion";
14611
14614
  "duplicate-normalization": "duplicate-normalization";
14612
- "invalid-url": "invalid-url";
14613
14615
  "memory-pressure": "memory-pressure";
14614
14616
  "off-origin": "off-origin";
14615
- "origin-backpressure": "origin-backpressure";
14616
14617
  "queue-safety-limit": "queue-safety-limit";
14617
- "robots-disallowed": "robots-disallowed";
14618
14618
  "robots-uncertain": "robots-uncertain";
14619
14619
  "legacy-unclassified": "legacy-unclassified";
14620
14620
  }>;
@@ -14986,10 +14986,10 @@ export declare const crawlerJsonSchemas: {
14986
14986
  raw: z.ZodString;
14987
14987
  resolved: z.ZodOptional<z.ZodString>;
14988
14988
  ignoredReason: z.ZodOptional<z.ZodEnum<{
14989
- "invalid-url": "invalid-url";
14990
14989
  "outside-head": "outside-head";
14991
14990
  "alternate-qualifier": "alternate-qualifier";
14992
14991
  fragment: "fragment";
14992
+ "invalid-url": "invalid-url";
14993
14993
  "non-http-url": "non-http-url";
14994
14994
  }>>;
14995
14995
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -15921,15 +15921,15 @@ export declare const crawlerJsonSchemas: {
15921
15921
  skippedUrls: z.ZodNumber;
15922
15922
  skipReasons: z.ZodArray<z.ZodObject<{
15923
15923
  reason: z.ZodEnum<{
15924
+ "invalid-url": "invalid-url";
15925
+ "robots-disallowed": "robots-disallowed";
15926
+ "origin-backpressure": "origin-backpressure";
15924
15927
  "asset-url": "asset-url";
15925
15928
  "configured-exclusion": "configured-exclusion";
15926
15929
  "duplicate-normalization": "duplicate-normalization";
15927
- "invalid-url": "invalid-url";
15928
15930
  "memory-pressure": "memory-pressure";
15929
15931
  "off-origin": "off-origin";
15930
- "origin-backpressure": "origin-backpressure";
15931
15932
  "queue-safety-limit": "queue-safety-limit";
15932
- "robots-disallowed": "robots-disallowed";
15933
15933
  "robots-uncertain": "robots-uncertain";
15934
15934
  "legacy-unclassified": "legacy-unclassified";
15935
15935
  }>;
@@ -16301,10 +16301,10 @@ export declare const crawlerJsonSchemas: {
16301
16301
  raw: z.ZodString;
16302
16302
  resolved: z.ZodOptional<z.ZodString>;
16303
16303
  ignoredReason: z.ZodOptional<z.ZodEnum<{
16304
- "invalid-url": "invalid-url";
16305
16304
  "outside-head": "outside-head";
16306
16305
  "alternate-qualifier": "alternate-qualifier";
16307
16306
  fragment: "fragment";
16307
+ "invalid-url": "invalid-url";
16308
16308
  "non-http-url": "non-http-url";
16309
16309
  }>>;
16310
16310
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
@@ -17740,10 +17740,10 @@ export declare const crawlerJsonSchemas: {
17740
17740
  raw: z.ZodString;
17741
17741
  resolved: z.ZodOptional<z.ZodString>;
17742
17742
  ignoredReason: z.ZodOptional<z.ZodEnum<{
17743
- "invalid-url": "invalid-url";
17744
17743
  "outside-head": "outside-head";
17745
17744
  "alternate-qualifier": "alternate-qualifier";
17746
17745
  fragment: "fragment";
17746
+ "invalid-url": "invalid-url";
17747
17747
  "non-http-url": "non-http-url";
17748
17748
  }>>;
17749
17749
  streamedMetadata: z.ZodOptional<z.ZodLiteral<true>>;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __seoCreateRequire } from 'node:module'; const require = __seoCreateRequire(import.meta.url);
2
- import { n as version, t as load } from "./esm-DieyhVZ-.js";
2
+ import { n as version, t as load } from "./esm-D12ZCG_1.js";
3
3
  import { SEO_PROVIDER_API_VERSION } from "./provider-sdk.js";
4
4
  import crypto, { createHash, randomUUID, sign } from "node:crypto";
5
5
  import { z } from "zod";
@@ -32299,8 +32299,15 @@ async function runAiAnswers(input, headers, deps, more) {
32299
32299
  const keys = dataForSeoKeys(headers);
32300
32300
  const domain = registrableDomain(input.site)?.domain;
32301
32301
  if (!domain) throw new CommandError("INVALID_INPUT", `ai_answers needs a site with a domain, not "${input.site}".`);
32302
+ const given = [...new Set((input.questions ?? []).map((q) => q.trim()).filter(Boolean))];
32303
+ if (given.length > 10) throw new CommandError("INVALID_INPUT", `ai_answers takes up to 10 questions, not ${given.length}.`);
32302
32304
  const range = dateWindow({}, QUESTION_DAYS);
32303
- const questions = ((await aiQueriesReport({
32305
+ let questions;
32306
+ if (given.length) questions = given.map((query) => ({
32307
+ query,
32308
+ impressions: null
32309
+ }));
32310
+ else questions = ((await aiQueriesReport({
32304
32311
  site: input.site,
32305
32312
  ...range
32306
32313
  }, deps.searchAnalytics)).items ?? []).filter((item) => item.askable).slice(0, 10);
@@ -32317,7 +32324,7 @@ async function runAiAnswers(input, headers, deps, more) {
32317
32324
  }))));
32318
32325
  const cost = usd(answers.reduce((sum, row) => sum + row.cost_usd, 0));
32319
32326
  const count = (result) => answers.filter((row) => row.result === result).length;
32320
- const notes = [questions.length ? `The top ${questions.length} askable questions in Search Console’s AI-shaped queries for ${range.startDate} to ${range.endDate}, by impressions. No calls were made for other questions.` : `No askable questions in Search Console’s AI-shaped queries for ${range.startDate} to ${range.endDate}, so no answers were checked and nothing was spent.`, ...questions.length ? [
32327
+ const notes = [given.length ? `The ${given.length} questions you gave, asked as written. Impressions are blank because they don't come from Search Console.` : questions.length ? `The top ${questions.length} askable questions in Search Console’s AI-shaped queries for ${range.startDate} to ${range.endDate}, by impressions. No calls were made for other questions.` : `No askable questions in Search Console’s AI-shaped queries for ${range.startDate} to ${range.endDate}, so no answers were checked and nothing was spent.`, ...questions.length ? [
32321
32328
  `Cited ${count("cited")}, mentioned ${count("mentioned")}, neither ${count("neither")}, no answer shown ${count("no_answer")}, unavailable ${count("unavailable")}. DataForSEO cost: $${cost}.`,
32322
32329
  "Each row is one sample of an answer that changes from run to run, not a ranking.",
32323
32330
  `cited: the answer lists or links a page on ${domain} or a subdomain. mentioned: no such source, but the answer text names ${[domain, ...site.terms].join(" or ")}, a text match. no_answer: the engine showed no AI answer for the question. model: the model DataForSEO reports for the answer, when it reports one.`,
@@ -32338,7 +32345,7 @@ async function runAiAnswers(input, headers, deps, more) {
32338
32345
  action: "ai_answers",
32339
32346
  site: input.site,
32340
32347
  country: input.country,
32341
- questionsFrom: {
32348
+ questionsFrom: given.length ? { section: "given" } : {
32342
32349
  section: "ai-queries",
32343
32350
  ...range
32344
32351
  },
@@ -35432,7 +35439,7 @@ const RESEARCH_ACTIONS = [
35432
35439
  "ai_answers"
35433
35440
  ];
35434
35441
  const RESEARCH_PROVIDERS = ["dataforseo", "ahrefs"];
35435
- const RESEARCH_HELP = `keyword_metrics (keywords: volume, difficulty, CPC), ranked_keywords (target: keywords a domain or URL ranks for), serp (keywords, up to 5: the ranking pages), competitors (target: domains that share keywords), backlinks (target: referring domains), ai_answers (DataForSEO only; target: the site. It takes the site’s top 10 chat-style and long questions from Search Console’s AI-shaped queries itself, then asks ChatGPT search, Google AI Mode and Google AI Overviews each one and says whether the answer cites or mentions the site. DataForSEO’s live prices are $0.012 a question, so up to about $0.12 a run: tell the person before running it). Rows with a domain, and the target, get a free Ahrefs domain_rating column. Numbers are provider estimates, not Search Console data.`;
35442
+ const RESEARCH_HELP = `keyword_metrics (keywords: volume, difficulty, CPC), ranked_keywords (target: keywords a domain or URL ranks for), serp (keywords, up to 5: the ranking pages), competitors (target: domains that share keywords), backlinks (target: referring domains), ai_answers (DataForSEO only; target: the site. Without keywords it takes the site’s top 10 chat-style and long questions from Search Console’s AI-shaped queries itself. With up to 10 questions in keywords it asks those instead, and the target can be any domain, such as a competitor's. It asks ChatGPT search, Google AI Mode and Google AI Overviews each one and says whether the answer cites or mentions the site. DataForSEO’s live prices are $0.012 a question, so up to about $0.12 a run: tell the person before running it). Rows with a domain, and the target, get a free Ahrefs domain_rating column. Numbers are provider estimates, not Search Console data.`;
35436
35443
  const GENERIC_PLATFORMS = [
35437
35444
  "youtube.com",
35438
35445
  "facebook.com",
@@ -36359,10 +36366,11 @@ const SHARED_TOOLS = [
36359
36366
  if (input.action === "ai_answers") {
36360
36367
  if (input.provider !== "dataforseo") throw new CommandError("INVALID_INPUT", "ai_answers uses dataforseo.");
36361
36368
  return runAiAnswers({
36362
- site: await surface.resolveSite(input.target),
36369
+ site: input.keywords.length ? input.target : await surface.resolveSite(input.target),
36363
36370
  country: input.country,
36364
36371
  detail: input.detail,
36365
- offset: input.offset
36372
+ offset: input.offset,
36373
+ questions: input.keywords
36366
36374
  }, await surface.keys(), surface.deps, more);
36367
36375
  }
36368
36376
  return runResearch(input, await surface.keys(), {