@gscdump/analysis 1.4.11 → 1.5.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.mts CHANGED
@@ -21,7 +21,7 @@ import { FormatReportOptions, formatReport } from "./report/format.mjs";
21
21
  import { REPORTS, defaultReportRegistry } from "./report/registry.mjs";
22
22
  import { DryRunReportResult, RunReportOptions, dryRunReport, runReport, runReportResult } from "./report/runtime.mjs";
23
23
  import "./report/index.mjs";
24
- import { SitemapDelta, SitemapHealthDiff, SitemapHealthInput, SitemapHealthRow, SitemapHealthTotals, diffSitemapHealth } from "./sitemap-health.mjs";
24
+ import { CurrentSitemapScope, SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, SitemapCollapsePolicy, SitemapCollapseState, SitemapDelta, SitemapHealthDiff, SitemapHealthInput, SitemapHealthRow, SitemapHealthTotals, classifySitemapCollapse, compareCurrentSitemapScope, diffSitemapHealth, sitemapHistoryHasCollapse } from "./sitemap-health.mjs";
25
25
  import { CompositeSourceOptions, createCompositeSource } from "./source/composite.mjs";
26
26
  import { IN_MEMORY_DEFAULT_CAPABILITIES, InMemoryQuerySourceOptions, createInMemoryQuerySource } from "./source/in-memory.mjs";
27
27
  import "./source/index.mjs";
@@ -30,4 +30,4 @@ import { AnalysisPeriod, ComparisonMode, ComparisonPeriod, PadTimeseriesOptions,
30
30
  import { AnalysisParams, AnalysisResult, AnalysisTool, num } from "@gscdump/engine/analysis-types";
31
31
  import { AnalysisQuerySource, AnalysisSourceKind, ENGINE_QUERY_CAPABILITIES, EngineQuerySourceOptions, ExecuteSqlOptions, FileSet, QueryRow, SourceCapabilities, createEngineQuerySource, queryRows, runAnalyzerWithEngine } from "@gscdump/engine/source";
32
32
  import { DefineReportOptions, DefinedReport, ReportAction, ReportContext, ReportFinding, ReportPlanStep, ReportResult, ReportSection } from "@gscdump/engine/report";
33
- export { type ActionPriorityResult, type ActionPrioritySourceState, type ActionPrioritySourceStatus, type ActionSource, type AnalysisError, type AnalysisErrorKind, type AnalysisParams, type AnalysisPeriod, type AnalysisQuerySource, type AnalysisResult, type AnalysisSourceKind, type AnalysisTool, type Analyzer, AnalyzerCapabilityError, type AnalyzerRegistry, type AnalyzerRegistryInit, type AnalyzerRunner, type AnalyzerVariants, type BaseMetrics, type BrandSegmentationOptions, type BrandSegmentationResult, type BrandSegmentationRow, type BrandSummary, type BrowserAnalyzeOptions, type CannibalizationCompetitor, type CannibalizationEvent, type CannibalizationOptions, type CannibalizationPage, type CannibalizationResult, type CannibalizationSortMetric, type ClusterType, type ClusteringOptions, type ClusteringResult, type ComparisonMode, type ComparisonPeriod, type CompositeSourceOptions, type ConcentrationInput, type ConcentrationItem, type ConcentrationOptions, type ConcentrationResult, type ConcentrationRiskLevel, DEFAULT_PRIORITY_SOURCES, type DateRow, type DecayInput, type DecayOptions, type DecayResult, type DecaySeriesPoint, type DecaySortMetric, type DefineAnalyzerOptions, type DefineReportOptions, type DefinedAnalyzer, type DefinedReport, type DryRunReportResult, ENGINE_QUERY_CAPABILITIES, type Effort, type EngineQuerySourceOptions, type ExecuteSqlOptions, type FileSet, type FormatReportOptions, INTENT_CLASSIFIER_VERSION, IN_MEMORY_DEFAULT_CAPABILITIES, type InMemoryQuerySourceOptions, type IntentClassification, type KeywordCluster, type MonthlyData, type MoverData, type MoversInput, type MoversOptions, type MoversResult, type MoversSortMetric, NORMALIZER_VERSION, type OpportunityFactors, type OpportunityOptions, type OpportunityResult, type OpportunitySortMetric, type OpportunityWeights, type PadTimeseriesOptions, type PageRow, type Plan, type PriorityAction, type QueriesRow, type QueryPageRow, type QueryRow, REPORTS, ROW_ANALYZERS, type ReduceContext, type ReduceCtx, type Reducer, type ReportAction, type ReportContext, type ReportFinding, type ReportPlanStep, type ReportResult, type ReportSection, type RequiredCapability, type ResolveWindowOptions, type ResolvedWindow, type RowQueriesPlan, type RunReportOptions, SEARCH_INTENT_CODE, SQL_ANALYZERS, type SearchIntent, type SeasonalityMetric, type SeasonalityOptions, type SeasonalityResult, type SitemapDelta, type SitemapHealthDiff, type SitemapHealthInput, type SitemapHealthRow, type SitemapHealthTotals, type SortOrder, type SourceCapabilities, type SqlExtraQuery, type SqlPlan, type SqlPlanSpec, type StrikingDistanceInputRow, type StrikingDistanceOptions, type StrikingDistanceResult, type TypedRowQuery, type WindowPreset, type ZeroClickOptions, type ZeroClickResult, analysisErrorToException, analysisErrors, analyzeBrandSegmentation, analyzeCannibalization, analyzeClustering, analyzeConcentration, analyzeDecay, analyzeInBrowser, analyzeKeywordConcentration, analyzeMovers, analyzeOpportunity, analyzePageConcentration, analyzeSeasonality, analyzeStrikingDistance, analyzeZeroClick, classifyQueryIntent, comparisonOf, createAnalyzerRegistry, createCompositeSource, createEngineQuerySource, createInMemoryQuerySource, createSorter, defaultAnalyzerRegistry, defaultReportRegistry, defineAnalyzer, diffSitemapHealth, dryRunReport, encodeIntent, formatAnalysisError, formatReport, isAnalysisError, mergePriorityActions, normalizePriorityActions, normalizeQuery, num, padTimeseries, periodOf, queryRows, resolveWindow, runAnalyzerFromSource, runAnalyzerWithEngine, runReport, runReportResult, scorePriorityActions };
33
+ export { type ActionPriorityResult, type ActionPrioritySourceState, type ActionPrioritySourceStatus, type ActionSource, type AnalysisError, type AnalysisErrorKind, type AnalysisParams, type AnalysisPeriod, type AnalysisQuerySource, type AnalysisResult, type AnalysisSourceKind, type AnalysisTool, type Analyzer, AnalyzerCapabilityError, type AnalyzerRegistry, type AnalyzerRegistryInit, type AnalyzerRunner, type AnalyzerVariants, type BaseMetrics, type BrandSegmentationOptions, type BrandSegmentationResult, type BrandSegmentationRow, type BrandSummary, type BrowserAnalyzeOptions, type CannibalizationCompetitor, type CannibalizationEvent, type CannibalizationOptions, type CannibalizationPage, type CannibalizationResult, type CannibalizationSortMetric, type ClusterType, type ClusteringOptions, type ClusteringResult, type ComparisonMode, type ComparisonPeriod, type CompositeSourceOptions, type ConcentrationInput, type ConcentrationItem, type ConcentrationOptions, type ConcentrationResult, type ConcentrationRiskLevel, type CurrentSitemapScope, DEFAULT_PRIORITY_SOURCES, type DateRow, type DecayInput, type DecayOptions, type DecayResult, type DecaySeriesPoint, type DecaySortMetric, type DefineAnalyzerOptions, type DefineReportOptions, type DefinedAnalyzer, type DefinedReport, type DryRunReportResult, ENGINE_QUERY_CAPABILITIES, type Effort, type EngineQuerySourceOptions, type ExecuteSqlOptions, type FileSet, type FormatReportOptions, INTENT_CLASSIFIER_VERSION, IN_MEMORY_DEFAULT_CAPABILITIES, type InMemoryQuerySourceOptions, type IntentClassification, type KeywordCluster, type MonthlyData, type MoverData, type MoversInput, type MoversOptions, type MoversResult, type MoversSortMetric, NORMALIZER_VERSION, type OpportunityFactors, type OpportunityOptions, type OpportunityResult, type OpportunitySortMetric, type OpportunityWeights, type PadTimeseriesOptions, type PageRow, type Plan, type PriorityAction, type QueriesRow, type QueryPageRow, type QueryRow, REPORTS, ROW_ANALYZERS, type ReduceContext, type ReduceCtx, type Reducer, type ReportAction, type ReportContext, type ReportFinding, type ReportPlanStep, type ReportResult, type ReportSection, type RequiredCapability, type ResolveWindowOptions, type ResolvedWindow, type RowQueriesPlan, type RunReportOptions, SEARCH_INTENT_CODE, SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, SQL_ANALYZERS, type SearchIntent, type SeasonalityMetric, type SeasonalityOptions, type SeasonalityResult, type SitemapCollapsePolicy, type SitemapCollapseState, type SitemapDelta, type SitemapHealthDiff, type SitemapHealthInput, type SitemapHealthRow, type SitemapHealthTotals, type SortOrder, type SourceCapabilities, type SqlExtraQuery, type SqlPlan, type SqlPlanSpec, type StrikingDistanceInputRow, type StrikingDistanceOptions, type StrikingDistanceResult, type TypedRowQuery, type WindowPreset, type ZeroClickOptions, type ZeroClickResult, analysisErrorToException, analysisErrors, analyzeBrandSegmentation, analyzeCannibalization, analyzeClustering, analyzeConcentration, analyzeDecay, analyzeInBrowser, analyzeKeywordConcentration, analyzeMovers, analyzeOpportunity, analyzePageConcentration, analyzeSeasonality, analyzeStrikingDistance, analyzeZeroClick, classifyQueryIntent, classifySitemapCollapse, compareCurrentSitemapScope, comparisonOf, createAnalyzerRegistry, createCompositeSource, createEngineQuerySource, createInMemoryQuerySource, createSorter, defaultAnalyzerRegistry, defaultReportRegistry, defineAnalyzer, diffSitemapHealth, dryRunReport, encodeIntent, formatAnalysisError, formatReport, isAnalysisError, mergePriorityActions, normalizePriorityActions, normalizeQuery, num, padTimeseries, periodOf, queryRows, resolveWindow, runAnalyzerFromSource, runAnalyzerWithEngine, runReport, runReportResult, scorePriorityActions, sitemapHistoryHasCollapse };
package/dist/index.mjs CHANGED
@@ -21,7 +21,7 @@ import { formatReport } from "./report/format.mjs";
21
21
  import { REPORTS, defaultReportRegistry } from "./report/registry.mjs";
22
22
  import { dryRunReport, runReport, runReportResult } from "./report/runtime.mjs";
23
23
  import "./report/index.mjs";
24
- import { diffSitemapHealth } from "./sitemap-health.mjs";
24
+ import { SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, classifySitemapCollapse, compareCurrentSitemapScope, diffSitemapHealth, sitemapHistoryHasCollapse } from "./sitemap-health.mjs";
25
25
  import { createCompositeSource } from "./source/composite.mjs";
26
26
  import { IN_MEMORY_DEFAULT_CAPABILITIES, createInMemoryQuerySource } from "./source/in-memory.mjs";
27
27
  import "./source/index.mjs";
@@ -29,4 +29,4 @@ import { AnalyzerCapabilityError, createAnalyzerRegistry, defineAnalyzer, runAna
29
29
  import { comparisonOf, padTimeseries, periodOf, resolveWindow } from "@gscdump/engine/period";
30
30
  import { num } from "@gscdump/engine/analysis-types";
31
31
  import { ENGINE_QUERY_CAPABILITIES, createEngineQuerySource, queryRows, runAnalyzerWithEngine } from "@gscdump/engine/source";
32
- export { AnalyzerCapabilityError, DEFAULT_PRIORITY_SOURCES, ENGINE_QUERY_CAPABILITIES, INTENT_CLASSIFIER_VERSION, IN_MEMORY_DEFAULT_CAPABILITIES, NORMALIZER_VERSION, REPORTS, ROW_ANALYZERS, SEARCH_INTENT_CODE, SQL_ANALYZERS, analysisErrorToException, analysisErrors, analyzeBrandSegmentation, analyzeCannibalization, analyzeClustering, analyzeConcentration, analyzeDecay, analyzeInBrowser, analyzeKeywordConcentration, analyzeMovers, analyzeOpportunity, analyzePageConcentration, analyzeSeasonality, analyzeStrikingDistance, analyzeZeroClick, classifyQueryIntent, comparisonOf, createAnalyzerRegistry, createCompositeSource, createEngineQuerySource, createInMemoryQuerySource, createSorter, defaultAnalyzerRegistry, defaultReportRegistry, defineAnalyzer, diffSitemapHealth, dryRunReport, encodeIntent, formatAnalysisError, formatReport, isAnalysisError, mergePriorityActions, normalizePriorityActions, normalizeQuery, num, padTimeseries, periodOf, queryRows, resolveWindow, runAnalyzerFromSource, runAnalyzerWithEngine, runReport, runReportResult, scorePriorityActions };
32
+ export { AnalyzerCapabilityError, DEFAULT_PRIORITY_SOURCES, ENGINE_QUERY_CAPABILITIES, INTENT_CLASSIFIER_VERSION, IN_MEMORY_DEFAULT_CAPABILITIES, NORMALIZER_VERSION, REPORTS, ROW_ANALYZERS, SEARCH_INTENT_CODE, SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, SQL_ANALYZERS, analysisErrorToException, analysisErrors, analyzeBrandSegmentation, analyzeCannibalization, analyzeClustering, analyzeConcentration, analyzeDecay, analyzeInBrowser, analyzeKeywordConcentration, analyzeMovers, analyzeOpportunity, analyzePageConcentration, analyzeSeasonality, analyzeStrikingDistance, analyzeZeroClick, classifyQueryIntent, classifySitemapCollapse, compareCurrentSitemapScope, comparisonOf, createAnalyzerRegistry, createCompositeSource, createEngineQuerySource, createInMemoryQuerySource, createSorter, defaultAnalyzerRegistry, defaultReportRegistry, defineAnalyzer, diffSitemapHealth, dryRunReport, encodeIntent, formatAnalysisError, formatReport, isAnalysisError, mergePriorityActions, normalizePriorityActions, normalizeQuery, num, padTimeseries, periodOf, queryRows, resolveWindow, runAnalyzerFromSource, runAnalyzerWithEngine, runReport, runReportResult, scorePriorityActions, sitemapHistoryHasCollapse };
@@ -30,5 +30,28 @@ interface SitemapHealthDiff {
30
30
  deltas: SitemapDelta[];
31
31
  totals: SitemapHealthTotals;
32
32
  }
33
+ interface SitemapCollapsePolicy {
34
+ ratio: number;
35
+ minHighWater: number;
36
+ minDrop: number;
37
+ baselineOffset: 1 | 2;
38
+ }
39
+ declare const SITEMAP_SYNC_COLLAPSE_POLICY: SitemapCollapsePolicy;
40
+ declare const SITEMAP_TRUST_COLLAPSE_POLICY: SitemapCollapsePolicy;
41
+ type SitemapCollapseState = {
42
+ _tag: 'none';
43
+ } | {
44
+ _tag: 'awaiting_confirmation' | 'persisted' | 'recovered_blip';
45
+ current: number;
46
+ highWater: number;
47
+ };
48
+ interface CurrentSitemapScope {
49
+ current: number;
50
+ highWater: number;
51
+ collapsed: boolean;
52
+ }
53
+ declare function classifySitemapCollapse(newestFirstCounts: ReadonlyArray<number | null | undefined>, policy: SitemapCollapsePolicy): SitemapCollapseState;
54
+ declare function compareCurrentSitemapScope(newestFirstCounts: ReadonlyArray<number | null | undefined>, policy: SitemapCollapsePolicy): CurrentSitemapScope | null;
55
+ declare function sitemapHistoryHasCollapse(newestFirstCounts: ReadonlyArray<number | null | undefined>, policy: SitemapCollapsePolicy): boolean;
33
56
  declare function diffSitemapHealth(prev: readonly SitemapHealthRow[], curr: readonly SitemapHealthInput[]): SitemapHealthDiff;
34
- export { SitemapDelta, SitemapHealthDiff, SitemapHealthInput, SitemapHealthRow, SitemapHealthTotals, diffSitemapHealth };
57
+ export { CurrentSitemapScope, SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, SitemapCollapsePolicy, SitemapCollapseState, SitemapDelta, SitemapHealthDiff, SitemapHealthInput, SitemapHealthRow, SitemapHealthTotals, classifySitemapCollapse, compareCurrentSitemapScope, diffSitemapHealth, sitemapHistoryHasCollapse };
@@ -1,3 +1,54 @@
1
+ const SITEMAP_SYNC_COLLAPSE_POLICY = {
2
+ ratio: .5,
3
+ minHighWater: 10,
4
+ minDrop: 10,
5
+ baselineOffset: 1
6
+ };
7
+ const SITEMAP_TRUST_COLLAPSE_POLICY = {
8
+ ratio: .2,
9
+ minHighWater: 20,
10
+ minDrop: 0,
11
+ baselineOffset: 2
12
+ };
13
+ function isCollapsed(count, highWater, policy) {
14
+ return highWater >= policy.minHighWater && count < highWater * policy.ratio && highWater - count >= policy.minDrop;
15
+ }
16
+ function classifySitemapCollapse(newestFirstCounts, policy) {
17
+ if (newestFirstCounts.length <= policy.baselineOffset) return { _tag: "none" };
18
+ const current = Math.max(0, newestFirstCounts[0] ?? 0);
19
+ const previous = Math.max(0, newestFirstCounts[1] ?? 0);
20
+ const highWater = Math.max(0, ...newestFirstCounts.slice(policy.baselineOffset).map((value) => Math.max(0, value ?? 0)));
21
+ if (isCollapsed(current, highWater, policy)) return {
22
+ _tag: isCollapsed(previous, highWater, policy) ? "persisted" : "awaiting_confirmation",
23
+ current,
24
+ highWater
25
+ };
26
+ if (isCollapsed(previous, highWater, policy)) return {
27
+ _tag: "recovered_blip",
28
+ current,
29
+ highWater
30
+ };
31
+ return { _tag: "none" };
32
+ }
33
+ function compareCurrentSitemapScope(newestFirstCounts, policy) {
34
+ if (newestFirstCounts.length < 2) return null;
35
+ const current = Math.max(0, newestFirstCounts[0] ?? 0);
36
+ const highWater = Math.max(0, ...newestFirstCounts.slice(1).map((value) => Math.max(0, value ?? 0)));
37
+ return {
38
+ current,
39
+ highWater,
40
+ collapsed: isCollapsed(current, highWater, policy)
41
+ };
42
+ }
43
+ function sitemapHistoryHasCollapse(newestFirstCounts, policy) {
44
+ let highWater = 0;
45
+ for (const raw of newestFirstCounts.toReversed()) {
46
+ const count = Math.max(0, raw ?? 0);
47
+ if (isCollapsed(count, highWater, policy)) return true;
48
+ highWater = Math.max(highWater, count);
49
+ }
50
+ return false;
51
+ }
1
52
  function urlCountOf(sitemap) {
2
53
  return sitemap.contents?.reduce((sum, c) => sum + (Number(c.submitted) || 0), 0) || 0;
3
54
  }
@@ -34,4 +85,4 @@ function diffSitemapHealth(prev, curr) {
34
85
  totals
35
86
  };
36
87
  }
37
- export { diffSitemapHealth };
88
+ export { SITEMAP_SYNC_COLLAPSE_POLICY, SITEMAP_TRUST_COLLAPSE_POLICY, classifySitemapCollapse, compareCurrentSitemapScope, diffSitemapHealth, sitemapHistoryHasCollapse };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/analysis",
3
3
  "type": "module",
4
- "version": "1.4.11",
4
+ "version": "1.5.1",
5
5
  "description": "GSC analyzers — striking-distance, opportunity, movers, decay, brand, clustering, concentration, seasonality. Pure row-based + DuckDB-native.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -57,9 +57,9 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "pluralize": "^8.0.0",
60
- "@gscdump/engine": "^1.4.11",
61
- "@gscdump/engine-gsc-api": "^1.4.11",
62
- "gscdump": "^1.4.11"
60
+ "@gscdump/engine": "^1.5.1",
61
+ "@gscdump/engine-gsc-api": "^1.5.1",
62
+ "gscdump": "^1.5.1"
63
63
  },
64
64
  "devDependencies": {
65
65
  "vitest": "^4.1.10"