@gscdump/sdk 4.4.0 → 4.6.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.
@@ -52,8 +52,8 @@ const issueDetails = {
52
52
  fix: "If the removal was intentional, back it with a real signal: a noindex tag, a 404/410, or authentication. The removal tool alone does not keep a page out of Search permanently."
53
53
  },
54
54
  unknown_to_google: {
55
- description: "These URLs exist on your site but Google hasn't discovered them yet. They may be orphaned pages or missing from your sitemap.",
56
- fix: "Add these URLs to your sitemap. Create internal links to them from well-indexed pages. Submit the sitemap in Google Search Console."
55
+ description: "Google has no record of these URLs. It has not crawled them and has not queued them for a crawl. A URL can stay unknown even when it is in a sitemap that Google already read.",
56
+ fix: "Check that each URL is in a sitemap Google reads. If it already is, the sitemap is not the gap: link to these URLs from pages Google already indexed, and earn links from other sites."
57
57
  },
58
58
  stale_crawl: {
59
59
  description: "Google hasn't re-crawled these pages in over 30 days. They may have low perceived value or your crawl budget may be exhausted.",
@@ -153,7 +153,7 @@ const issueGroups = [
153
153
  description: "Help Google find and value your pages",
154
154
  effort: "involved",
155
155
  controlLevel: "partial",
156
- education: "Google found these pages but either didn't think they were worth indexing, or hasn't discovered them yet. For crawled-but-not-indexed pages, improving content quality and internal linking helps — but Google ultimately decides what to index. For undiscovered pages, adding them to your sitemap and linking to them from indexed pages is the fix.",
156
+ education: "Google found these pages but either didn't think they were worth indexing, or hasn't discovered them yet. For crawled-but-not-indexed pages, improving content quality and internal linking helps — but Google ultimately decides what to index. For pages unknown to Google, check the sitemap first. If they are already in it, link to them from indexed pages.",
157
157
  issueTypes: [
158
158
  "crawled_not_indexed",
159
159
  "discovered_not_indexed",
package/dist/package.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var version = "4.4.0";
1
+ var version = "4.6.0";
2
2
  export { version };
@@ -1,6 +1,6 @@
1
1
  import { SearchConsoleStageIssue } from "./search-console-stage.mjs";
2
2
  export type ReachStage = 'emerging' | 'growing' | 'plateaued' | 'declining' | 'faded' | 'decayed';
3
- export type HealthStage = 'healthy' | 'crawl_faults' | 'quality_rejection';
3
+ export type HealthStage = 'healthy' | 'crawl_faults' | 'quality_rejection' | 'not_indexed';
4
4
  export interface TriageEvidence {
5
5
  label: string;
6
6
  value: string;
@@ -88,6 +88,10 @@ const HEALTH_COPY = {
88
88
  summary: "Real access faults (server errors / broken links) are capping otherwise-indexable pages.",
89
89
  primaryAction: "Fix the 5xx and broken URLs; return 410/404 for pages you retire on purpose."
90
90
  },
91
+ not_indexed: {
92
+ summary: "Google has not indexed most known URLs. It queued many without a crawl, and it crawled others and left them out.",
93
+ primaryAction: "Link to the queued URLs from pages Google already indexed, and consolidate or improve the crawled ones."
94
+ },
91
95
  quality_rejection: {
92
96
  summary: "Google is crawling pages and refusing to index them — a soft quality signal it never reports explicitly.",
93
97
  primaryAction: "Consolidate or improve the rejected pages, or noindex the thin/low-value set."
@@ -107,6 +111,7 @@ function classifyHealthStage(input) {
107
111
  const softFound = countSearchConsoleIssues(issues, "soft_404");
108
112
  const serverError = countSearchConsoleIssues(issues, "server_error", "blocked_robots", "access_denied", "forbidden");
109
113
  const crawledNotIndexed = countSearchConsoleIssues(issues, "crawled_not_indexed");
114
+ const discoveredNotIndexed = countSearchConsoleIssues(issues, "discovered_not_indexed");
110
115
  const intentionalDead = isIntentionalRetirementSite(input, notFound, serverError) ? notFound : 0;
111
116
  const indexableUrls = Math.max(1, totalUrls - noindex - intentionalDead);
112
117
  const hardBlocks = serverError + (input.crawlAuditBlockerCount ?? 0);
@@ -140,6 +145,30 @@ function classifyHealthStage(input) {
140
145
  progression: escapeReduce("healthy", "crawled-rejected share", share, REJECT_SHARE, `${(share * 100).toFixed(0)}% rejected — improve/consolidate ~${formatSearchConsoleCount(toClear)} pages to clear`)
141
146
  };
142
147
  }
148
+ const notIndexedPool = rejectPool + discoveredNotIndexed;
149
+ if (totalUrls > 0 && notIndexedPool > REJECT_MIN && notIndexedPool / totalUrls >= REJECT_SHARE) {
150
+ const share = notIndexedPool / totalUrls;
151
+ const toClear = Math.max(0, Math.ceil(notIndexedPool - REJECT_SHARE * totalUrls));
152
+ return {
153
+ stage: "not_indexed",
154
+ ...HEALTH_COPY.not_indexed,
155
+ evidence: [
156
+ {
157
+ label: "Discovered, currently not indexed",
158
+ value: formatSearchConsoleCount(discoveredNotIndexed)
159
+ },
160
+ {
161
+ label: "Crawled, currently not indexed",
162
+ value: formatSearchConsoleCount(rejectPool)
163
+ },
164
+ {
165
+ label: "Share of known URLs",
166
+ value: `${(share * 100).toFixed(0)}%`
167
+ }
168
+ ],
169
+ progression: escapeReduce("healthy", "not-indexed share", share, REJECT_SHARE, `${(share * 100).toFixed(0)}% not indexed. Get ~${formatSearchConsoleCount(toClear)} URLs indexed to clear the gate`)
170
+ };
171
+ }
143
172
  return {
144
173
  stage: "healthy",
145
174
  ...HEALTH_COPY.healthy,
package/dist/v1/http.mjs CHANGED
@@ -374,6 +374,11 @@ function createGscdumpV1Client(options) {
374
374
  listSiteIndexingUrls: (input, executeOptions) => execute("partner.sites.indexing.urls.list", input, executeOptions),
375
375
  getSiteBingData: (input, executeOptions) => execute("partner.sites.bing.data.get", input, executeOptions),
376
376
  listSiteBingIndexingEvidence: (input, executeOptions) => execute("partner.sites.indexing.bing.evidence.list", input, executeOptions),
377
+ getSiteIndexNowConnection: (input, executeOptions) => execute("partner.sites.indexing.indexnow.connection.get", input, executeOptions),
378
+ configureSiteIndexNowConnection: (input, executeOptions) => execute("partner.sites.indexing.indexnow.connection.configure", input, executeOptions),
379
+ verifySiteIndexNowConnection: (input, executeOptions) => execute("partner.sites.indexing.indexnow.connection.verify", input, executeOptions),
380
+ submitSiteIndexNow: (input, executeOptions) => execute("partner.sites.indexing.indexnow.submissions.create", input, executeOptions),
381
+ listSiteIndexNowSubmissionReceipts: (input, executeOptions) => execute("partner.sites.indexing.indexnow.submissions.list", input, executeOptions),
377
382
  getSiteBingConnection: (input, executeOptions) => execute("partner.sites.indexing.bing.connection.get", input, executeOptions),
378
383
  verifySiteBingConnection: (input, executeOptions) => execute("partner.sites.indexing.bing.connection.verify", input, executeOptions),
379
384
  listSiteIndexingTransitions: (input, executeOptions) => execute("partner.sites.indexing.transitions.list", input, executeOptions),
@@ -387,6 +392,9 @@ function createGscdumpV1Client(options) {
387
392
  deleteSite: (input, executeOptions) => execute("partner.sites.delete", input, executeOptions),
388
393
  getCanonicalMismatches: (input, executeOptions) => execute("partner.sites.canonical.mismatches.get", input, executeOptions),
389
394
  inspectSiteUrls: (input, executeOptions) => execute("partner.sites.indexing.inspect.create", input, executeOptions),
395
+ listSiteWatchedUrls: (input, executeOptions) => execute("partner.sites.indexing.watched.list", input, executeOptions),
396
+ addSiteWatchedUrls: (input, executeOptions) => execute("partner.sites.indexing.watched.add", input, executeOptions),
397
+ removeSiteWatchedUrls: (input, executeOptions) => execute("partner.sites.indexing.watched.remove", input, executeOptions),
390
398
  recoverSitePermission: (input, executeOptions) => execute("partner.sites.permission.recover", input, executeOptions),
391
399
  queryKeywordSparklines: (input, executeOptions) => execute("partner.sites.keyword.sparklines.query", input, executeOptions),
392
400
  getQueryTrend: (input, executeOptions) => execute("partner.sites.query.trend.get", input, executeOptions),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/sdk",
3
3
  "type": "module",
4
- "version": "4.4.0",
4
+ "version": "4.6.0",
5
5
  "description": "Consumer SDK for hosted gscdump.com integrations.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -144,8 +144,8 @@
144
144
  "node": ">=22.13.0"
145
145
  },
146
146
  "dependencies": {
147
- "@gscdump/contracts": "^4.4.0",
148
- "gscdump": "^4.4.0",
147
+ "@gscdump/contracts": "^4.6.0",
148
+ "gscdump": "^4.6.0",
149
149
  "ofetch": "^1.5.1",
150
150
  "zod": "^4.6.5"
151
151
  },