@disruptorganic/mcp-google-search-console 1.0.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.
Files changed (108) hide show
  1. package/.env.example +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/dist/auth/index.d.ts +3 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +2 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth/oauth2.d.ts +31 -0
  9. package/dist/auth/oauth2.d.ts.map +1 -0
  10. package/dist/auth/oauth2.js +380 -0
  11. package/dist/auth/oauth2.js.map +1 -0
  12. package/dist/config/index.d.ts +36 -0
  13. package/dist/config/index.d.ts.map +1 -0
  14. package/dist/config/index.js +87 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/gsc/client.d.ts +72 -0
  17. package/dist/gsc/client.d.ts.map +1 -0
  18. package/dist/gsc/client.js +243 -0
  19. package/dist/gsc/client.js.map +1 -0
  20. package/dist/gsc/index.d.ts +3 -0
  21. package/dist/gsc/index.d.ts.map +1 -0
  22. package/dist/gsc/index.js +3 -0
  23. package/dist/gsc/index.js.map +1 -0
  24. package/dist/gsc/properties.d.ts +42 -0
  25. package/dist/gsc/properties.d.ts.map +1 -0
  26. package/dist/gsc/properties.js +393 -0
  27. package/dist/gsc/properties.js.map +1 -0
  28. package/dist/gsc/queries.d.ts +73 -0
  29. package/dist/gsc/queries.d.ts.map +1 -0
  30. package/dist/gsc/queries.js +390 -0
  31. package/dist/gsc/queries.js.map +1 -0
  32. package/dist/index.d.ts +3 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +186 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/tools/compare-date-ranges.d.ts +83 -0
  37. package/dist/tools/compare-date-ranges.d.ts.map +1 -0
  38. package/dist/tools/compare-date-ranges.js +462 -0
  39. package/dist/tools/compare-date-ranges.js.map +1 -0
  40. package/dist/tools/get-property-info.d.ts +30 -0
  41. package/dist/tools/get-property-info.d.ts.map +1 -0
  42. package/dist/tools/get-property-info.js +174 -0
  43. package/dist/tools/get-property-info.js.map +1 -0
  44. package/dist/tools/get-top-pages.d.ts +103 -0
  45. package/dist/tools/get-top-pages.d.ts.map +1 -0
  46. package/dist/tools/get-top-pages.js +254 -0
  47. package/dist/tools/get-top-pages.js.map +1 -0
  48. package/dist/tools/get-top-queries.d.ts +103 -0
  49. package/dist/tools/get-top-queries.d.ts.map +1 -0
  50. package/dist/tools/get-top-queries.js +254 -0
  51. package/dist/tools/get-top-queries.js.map +1 -0
  52. package/dist/tools/health-check.d.ts +12 -0
  53. package/dist/tools/health-check.d.ts.map +1 -0
  54. package/dist/tools/health-check.js +107 -0
  55. package/dist/tools/health-check.js.map +1 -0
  56. package/dist/tools/index.d.ts +1124 -0
  57. package/dist/tools/index.d.ts.map +1 -0
  58. package/dist/tools/index.js +70 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/list-properties.d.ts +50 -0
  61. package/dist/tools/list-properties.d.ts.map +1 -0
  62. package/dist/tools/list-properties.js +234 -0
  63. package/dist/tools/list-properties.js.map +1 -0
  64. package/dist/tools/query-advanced.d.ts +109 -0
  65. package/dist/tools/query-advanced.d.ts.map +1 -0
  66. package/dist/tools/query-advanced.js +378 -0
  67. package/dist/tools/query-advanced.js.map +1 -0
  68. package/dist/tools/query-by-keyword.d.ts +115 -0
  69. package/dist/tools/query-by-keyword.d.ts.map +1 -0
  70. package/dist/tools/query-by-keyword.js +339 -0
  71. package/dist/tools/query-by-keyword.js.map +1 -0
  72. package/dist/tools/query-by-url.d.ts +116 -0
  73. package/dist/tools/query-by-url.d.ts.map +1 -0
  74. package/dist/tools/query-by-url.js +366 -0
  75. package/dist/tools/query-by-url.js.map +1 -0
  76. package/dist/utils/cache.d.ts +22 -0
  77. package/dist/utils/cache.d.ts.map +1 -0
  78. package/dist/utils/cache.js +75 -0
  79. package/dist/utils/cache.js.map +1 -0
  80. package/dist/utils/index.d.ts +8 -0
  81. package/dist/utils/index.d.ts.map +1 -0
  82. package/dist/utils/index.js +8 -0
  83. package/dist/utils/index.js.map +1 -0
  84. package/dist/utils/logger.d.ts +4 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +15 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/metrics.d.ts +9 -0
  89. package/dist/utils/metrics.d.ts.map +1 -0
  90. package/dist/utils/metrics.js +54 -0
  91. package/dist/utils/metrics.js.map +1 -0
  92. package/dist/utils/rate-limiter.d.ts +24 -0
  93. package/dist/utils/rate-limiter.d.ts.map +1 -0
  94. package/dist/utils/rate-limiter.js +175 -0
  95. package/dist/utils/rate-limiter.js.map +1 -0
  96. package/dist/utils/token-estimator.d.ts +33 -0
  97. package/dist/utils/token-estimator.d.ts.map +1 -0
  98. package/dist/utils/token-estimator.js +226 -0
  99. package/dist/utils/token-estimator.js.map +1 -0
  100. package/dist/utils/types.d.ts +68 -0
  101. package/dist/utils/types.d.ts.map +1 -0
  102. package/dist/utils/types.js +13 -0
  103. package/dist/utils/types.js.map +1 -0
  104. package/dist/utils/validators.d.ts +579 -0
  105. package/dist/utils/validators.d.ts.map +1 -0
  106. package/dist/utils/validators.js +358 -0
  107. package/dist/utils/validators.js.map +1 -0
  108. package/package.json +73 -0
@@ -0,0 +1,24 @@
1
+ export declare class TokenBucketRateLimiter {
2
+ private tokens;
3
+ private readonly maxTokens;
4
+ private readonly refillRate;
5
+ private lastRefillTime;
6
+ private pendingAcquisitions;
7
+ constructor(maxTokens: number, refillRate: number);
8
+ private refill;
9
+ acquire(tokens?: number): Promise<void>;
10
+ getAvailableTokens(): number;
11
+ getPendingAcquisitions(): number;
12
+ reset(): void;
13
+ }
14
+ export interface BackoffOptions {
15
+ maxRetries?: number;
16
+ initialDelay?: number;
17
+ maxDelay?: number;
18
+ factor?: number;
19
+ jitter?: boolean;
20
+ isRetryable?: (error: any) => boolean;
21
+ }
22
+ export declare function withExponentialBackoff<T>(fn: () => Promise<T>, options?: BackoffOptions): Promise<T>;
23
+ export declare function createRateLimitedFunction<T extends (...args: any[]) => Promise<any>>(fn: T, rateLimiter: TokenBucketRateLimiter, tokens?: number): T;
24
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAmEA,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,mBAAmB,CAAa;gBAc5B,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IA0BjD,OAAO,CAAC,MAAM;IAqCR,OAAO,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwEhD,kBAAkB,IAAI,MAAM;IAY5B,sBAAsB,IAAI,MAAM;IAehC,KAAK,IAAI,IAAI;CAUd;AASD,MAAM,WAAW,cAAc;IAE7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;CACvC;AAsFD,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CA0FZ;AA0BD,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAClF,EAAE,EAAE,CAAC,EACL,WAAW,EAAE,sBAAsB,EACnC,MAAM,GAAE,MAAU,GACjB,CAAC,CAKH"}
@@ -0,0 +1,175 @@
1
+ import { logger } from './logger.js';
2
+ export class TokenBucketRateLimiter {
3
+ constructor(maxTokens, refillRate) {
4
+ this.pendingAcquisitions = 0;
5
+ if (maxTokens <= 0 || refillRate <= 0) {
6
+ throw new Error('maxTokens and refillRate must be positive numbers');
7
+ }
8
+ this.maxTokens = maxTokens;
9
+ this.refillRate = refillRate;
10
+ this.tokens = maxTokens;
11
+ this.lastRefillTime = Date.now();
12
+ logger.info('Token bucket rate limiter initialized', {
13
+ maxTokens,
14
+ refillRate,
15
+ queriesPerMinute: refillRate * 60,
16
+ });
17
+ }
18
+ refill() {
19
+ const now = Date.now();
20
+ const elapsedSeconds = (now - this.lastRefillTime) / 1000;
21
+ if (elapsedSeconds > 0) {
22
+ const tokensToAdd = elapsedSeconds * this.refillRate;
23
+ this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);
24
+ this.lastRefillTime = now;
25
+ logger.debug('Token bucket refilled', {
26
+ tokensAdded: tokensToAdd.toFixed(2),
27
+ currentTokens: this.tokens.toFixed(2),
28
+ elapsedSeconds: elapsedSeconds.toFixed(3),
29
+ });
30
+ }
31
+ }
32
+ async acquire(tokens = 1) {
33
+ if (tokens <= 0) {
34
+ throw new Error('tokens must be a positive number');
35
+ }
36
+ if (tokens > this.maxTokens) {
37
+ throw new Error(`Requested ${tokens} tokens exceeds bucket capacity of ${this.maxTokens}`);
38
+ }
39
+ this.pendingAcquisitions++;
40
+ const acquisitionId = this.pendingAcquisitions;
41
+ try {
42
+ this.refill();
43
+ if (this.tokens >= tokens) {
44
+ this.tokens -= tokens;
45
+ logger.debug('Tokens acquired immediately', {
46
+ tokensAcquired: tokens,
47
+ remainingTokens: this.tokens.toFixed(2),
48
+ acquisitionId,
49
+ });
50
+ return;
51
+ }
52
+ const tokensNeeded = tokens - this.tokens;
53
+ const waitTimeMs = (tokensNeeded / this.refillRate) * 1000;
54
+ logger.info('Rate limit: waiting for tokens to refill', {
55
+ tokensNeeded: tokensNeeded.toFixed(2),
56
+ waitTimeMs: Math.ceil(waitTimeMs),
57
+ currentTokens: this.tokens.toFixed(2),
58
+ requestedTokens: tokens,
59
+ acquisitionId,
60
+ });
61
+ await new Promise(resolve => setTimeout(resolve, waitTimeMs));
62
+ this.refill();
63
+ this.tokens -= tokens;
64
+ logger.debug('Tokens acquired after waiting', {
65
+ tokensAcquired: tokens,
66
+ remainingTokens: this.tokens.toFixed(2),
67
+ waitedMs: Math.ceil(waitTimeMs),
68
+ acquisitionId,
69
+ });
70
+ }
71
+ finally {
72
+ this.pendingAcquisitions--;
73
+ }
74
+ }
75
+ getAvailableTokens() {
76
+ this.refill();
77
+ return this.tokens;
78
+ }
79
+ getPendingAcquisitions() {
80
+ return this.pendingAcquisitions;
81
+ }
82
+ reset() {
83
+ this.tokens = this.maxTokens;
84
+ this.lastRefillTime = Date.now();
85
+ this.pendingAcquisitions = 0;
86
+ logger.debug('Token bucket rate limiter reset', {
87
+ tokens: this.tokens,
88
+ maxTokens: this.maxTokens,
89
+ });
90
+ }
91
+ }
92
+ function defaultIsRetryable(error) {
93
+ if (error && typeof error === 'object' && 'retriable' in error) {
94
+ return error.retriable === true;
95
+ }
96
+ const statusCode = (error && typeof error === 'object')
97
+ ? (error.response?.status || error.statusCode || error.code)
98
+ : undefined;
99
+ const retryableStatusCodes = [429, 500, 502, 503, 504];
100
+ if (typeof statusCode === 'number' && retryableStatusCodes.includes(statusCode)) {
101
+ return true;
102
+ }
103
+ const retryableErrorCodes = ['ETIMEDOUT', 'ECONNRESET', 'ENOTFOUND', 'ECONNREFUSED'];
104
+ if (typeof statusCode === 'string' && retryableErrorCodes.includes(statusCode)) {
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ export async function withExponentialBackoff(fn, options) {
110
+ const { maxRetries = 3, initialDelay = 1000, maxDelay = 30000, factor = 2, jitter = true, isRetryable = defaultIsRetryable, } = options || {};
111
+ let lastError;
112
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
113
+ try {
114
+ const result = await fn();
115
+ if (attempt > 0) {
116
+ logger.info('Operation succeeded after retry', {
117
+ attempt,
118
+ totalAttempts: attempt + 1,
119
+ });
120
+ }
121
+ return result;
122
+ }
123
+ catch (error) {
124
+ lastError = error;
125
+ const shouldRetry = isRetryable(error);
126
+ const errorMessage = error instanceof Error ? error.message : String(error);
127
+ const statusCode = (error && typeof error === 'object')
128
+ ? (error.response?.status || error.statusCode || error.code)
129
+ : undefined;
130
+ logger.warn('Operation failed', {
131
+ attempt: attempt + 1,
132
+ totalAttempts: maxRetries + 1,
133
+ error: errorMessage,
134
+ statusCode,
135
+ retryable: shouldRetry,
136
+ });
137
+ if (!shouldRetry) {
138
+ logger.error('Non-retryable error encountered, aborting', {
139
+ error: errorMessage,
140
+ statusCode,
141
+ attempt: attempt + 1,
142
+ });
143
+ throw error;
144
+ }
145
+ if (attempt === maxRetries) {
146
+ logger.error('All retry attempts exhausted', {
147
+ maxRetries,
148
+ error: errorMessage,
149
+ statusCode,
150
+ });
151
+ break;
152
+ }
153
+ let delay = Math.min(initialDelay * Math.pow(factor, attempt), maxDelay);
154
+ if (jitter) {
155
+ const jitterMultiplier = 0.5 + Math.random();
156
+ delay = Math.floor(delay * jitterMultiplier);
157
+ }
158
+ logger.info('Retrying with exponential backoff', {
159
+ attempt: attempt + 1,
160
+ nextAttempt: attempt + 2,
161
+ delayMs: delay,
162
+ error: errorMessage,
163
+ });
164
+ await new Promise(resolve => setTimeout(resolve, delay));
165
+ }
166
+ }
167
+ throw lastError;
168
+ }
169
+ export function createRateLimitedFunction(fn, rateLimiter, tokens = 1) {
170
+ return (async (...args) => {
171
+ await rateLimiter.acquire(tokens);
172
+ return await fn(...args);
173
+ });
174
+ }
175
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const MAX_SAFE_TOKENS = 20000;
2
+ export declare const CHARS_PER_TOKEN = 4;
3
+ export declare const JSON_OVERHEAD_MULTIPLIER = 1.3;
4
+ export declare const SAMPLE_SIZE = 100;
5
+ export declare const MIN_CHUNK_SIZE = 10;
6
+ export declare const MAX_CHUNK_SIZE = 25000;
7
+ export declare const DEFAULT_CHUNK_SIZE = 1000;
8
+ export interface PaginationMetadata {
9
+ offset: number;
10
+ limit: number;
11
+ total_rows: number;
12
+ current_chunk: number;
13
+ total_chunks: number;
14
+ has_more: boolean;
15
+ }
16
+ export interface ChunkedResponse<T> {
17
+ results: T[];
18
+ pagination: PaginationMetadata;
19
+ }
20
+ export declare function estimateTokens(text: string): number;
21
+ export declare function estimateTokensForJson(data: unknown): number;
22
+ export declare function calculateChunkSize(sampleRows: unknown[], totalRows: number): number;
23
+ export declare function generatePaginationMetadata(offset: number, limit: number, totalRows: number): PaginationMetadata;
24
+ export declare function chunkResults<T>(results: T[], offset: number, limit?: number): ChunkedResponse<T>;
25
+ export declare function estimateTotalTokens<T>(results: T[]): number;
26
+ export declare function needsChunking<T>(results: T[]): boolean;
27
+ export declare function validatePaginationParams(offset: number, limit: number | undefined, totalRows: number): {
28
+ valid: boolean;
29
+ offset: number;
30
+ limit?: number;
31
+ error?: string;
32
+ };
33
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/utils/token-estimator.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,eAAe,QAAQ,CAAC;AAMrC,eAAO,MAAM,eAAe,IAAI,CAAC;AAMjC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAM5C,eAAO,MAAM,WAAW,MAAM,CAAC;AAM/B,eAAO,MAAM,cAAc,KAAK,CAAC;AAMjC,eAAO,MAAM,cAAc,QAAQ,CAAC;AAMpC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAgBvC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AASD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,UAAU,EAAE,kBAAkB,CAAC;CAChC;AA4BD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBnD;AAkBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CA4B3D;AAsCD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAmEnF;AAuCD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAkDpB;AA8DD,wBAAgB,YAAY,CAAC,CAAC,EAC5B,OAAO,EAAE,CAAC,EAAE,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,eAAe,CAAC,CAAC,CAAC,CAwDpB;AAqBD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,CA4B3D;AAiBD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,CAYtD;AAmBD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAChB;IACD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAoCA"}
@@ -0,0 +1,226 @@
1
+ import { logger } from './logger.js';
2
+ export const MAX_SAFE_TOKENS = 20000;
3
+ export const CHARS_PER_TOKEN = 4;
4
+ export const JSON_OVERHEAD_MULTIPLIER = 1.3;
5
+ export const SAMPLE_SIZE = 100;
6
+ export const MIN_CHUNK_SIZE = 10;
7
+ export const MAX_CHUNK_SIZE = 25000;
8
+ export const DEFAULT_CHUNK_SIZE = 1000;
9
+ export function estimateTokens(text) {
10
+ if (!text || text.length === 0) {
11
+ return 0;
12
+ }
13
+ const estimatedTokens = Math.ceil(text.length / CHARS_PER_TOKEN);
14
+ logger.debug('Token estimation', {
15
+ textLength: text.length,
16
+ estimatedTokens,
17
+ charsPerToken: CHARS_PER_TOKEN,
18
+ });
19
+ return estimatedTokens;
20
+ }
21
+ export function estimateTokensForJson(data) {
22
+ try {
23
+ const jsonString = JSON.stringify(data);
24
+ if (jsonString === undefined) {
25
+ logger.warn('JSON.stringify returned undefined', { data });
26
+ return Math.ceil(4 * JSON_OVERHEAD_MULTIPLIER);
27
+ }
28
+ const baseTokens = estimateTokens(jsonString);
29
+ const tokensWithOverhead = Math.ceil(baseTokens * JSON_OVERHEAD_MULTIPLIER);
30
+ logger.debug('JSON token estimation', {
31
+ jsonLength: jsonString.length,
32
+ baseTokens,
33
+ tokensWithOverhead,
34
+ overhead: JSON_OVERHEAD_MULTIPLIER,
35
+ });
36
+ return tokensWithOverhead;
37
+ }
38
+ catch (error) {
39
+ logger.warn('Failed to serialize data for token estimation', { error });
40
+ throw error;
41
+ }
42
+ }
43
+ export function calculateChunkSize(sampleRows, totalRows) {
44
+ if (!sampleRows || totalRows === 0 || sampleRows.length === 0) {
45
+ logger.debug('Empty dataset, using default chunk size', {
46
+ totalRows,
47
+ sampleSize: sampleRows?.length || 0,
48
+ chunkSize: DEFAULT_CHUNK_SIZE,
49
+ });
50
+ return DEFAULT_CHUNK_SIZE;
51
+ }
52
+ const actualSampleSize = Math.min(sampleRows.length, SAMPLE_SIZE);
53
+ const rowsToAnalyze = sampleRows.slice(0, actualSampleSize);
54
+ let totalSampleTokens = 0;
55
+ for (const row of rowsToAnalyze) {
56
+ const rowTokens = estimateTokensForJson(row);
57
+ totalSampleTokens += rowTokens;
58
+ }
59
+ const avgTokensPerRow = totalSampleTokens / actualSampleSize;
60
+ const avgTokensPerRowWithMargin = avgTokensPerRow;
61
+ let chunkSize = Math.floor(MAX_SAFE_TOKENS / avgTokensPerRowWithMargin);
62
+ if (chunkSize < MIN_CHUNK_SIZE) {
63
+ logger.warn('Calculated chunk size below minimum, using MIN_CHUNK_SIZE', {
64
+ calculatedSize: chunkSize,
65
+ minSize: MIN_CHUNK_SIZE,
66
+ avgTokensPerRow: avgTokensPerRowWithMargin,
67
+ sampleSize: actualSampleSize,
68
+ });
69
+ chunkSize = MIN_CHUNK_SIZE;
70
+ }
71
+ if (chunkSize > MAX_CHUNK_SIZE) {
72
+ logger.debug('Calculated chunk size exceeds maximum, using MAX_CHUNK_SIZE', {
73
+ calculatedSize: chunkSize,
74
+ maxSize: MAX_CHUNK_SIZE,
75
+ avgTokensPerRow: avgTokensPerRowWithMargin,
76
+ });
77
+ chunkSize = MAX_CHUNK_SIZE;
78
+ }
79
+ logger.info('Calculated chunk size', {
80
+ totalRows,
81
+ sampleSize: actualSampleSize,
82
+ avgTokensPerRow: Math.round(avgTokensPerRow),
83
+ avgTokensPerRowWithMargin: Math.round(avgTokensPerRowWithMargin),
84
+ chunkSize,
85
+ estimatedChunks: Math.ceil(totalRows / chunkSize),
86
+ });
87
+ return chunkSize;
88
+ }
89
+ export function generatePaginationMetadata(offset, limit, totalRows) {
90
+ const originalLimit = limit;
91
+ if (offset < 0) {
92
+ logger.warn('Negative offset provided, using 0', { offset });
93
+ offset = 0;
94
+ }
95
+ const normalizedLimit = limit <= 0 ? 1 : limit;
96
+ if (totalRows < 0) {
97
+ logger.warn('Negative totalRows provided, using 0', { totalRows });
98
+ totalRows = 0;
99
+ }
100
+ let current_chunk = Math.floor(offset / normalizedLimit) + 1;
101
+ if (offset > totalRows && totalRows > 0) {
102
+ logger.debug('Offset exceeds total rows, clamping to total_rows', {
103
+ originalOffset: offset,
104
+ totalRows,
105
+ });
106
+ offset = totalRows;
107
+ current_chunk = Math.floor(offset / normalizedLimit) + 1;
108
+ }
109
+ const total_chunks = totalRows === 0 || originalLimit <= 0 ? 0 : Math.ceil(totalRows / originalLimit);
110
+ const has_more = originalLimit > 0 && (offset + originalLimit) < totalRows;
111
+ const metadata = {
112
+ offset,
113
+ limit: originalLimit,
114
+ total_rows: totalRows,
115
+ current_chunk,
116
+ total_chunks,
117
+ has_more,
118
+ };
119
+ logger.debug('Generated pagination metadata', metadata);
120
+ return metadata;
121
+ }
122
+ export function chunkResults(results, offset, limit) {
123
+ const totalRows = results.length;
124
+ if (offset < 0) {
125
+ logger.warn('Negative offset provided to chunkResults, using 0', { offset });
126
+ offset = 0;
127
+ }
128
+ let actualLimit;
129
+ if (limit === undefined || limit <= 0) {
130
+ actualLimit = calculateChunkSize(results, totalRows);
131
+ logger.debug('Auto-calculated chunk limit', { limit: actualLimit });
132
+ }
133
+ else {
134
+ actualLimit = limit;
135
+ logger.debug('Using provided chunk limit', { limit: actualLimit });
136
+ }
137
+ if (offset >= totalRows && totalRows > 0) {
138
+ logger.warn('Offset exceeds total rows, returning empty chunk', {
139
+ offset,
140
+ totalRows,
141
+ });
142
+ return {
143
+ results: [],
144
+ pagination: generatePaginationMetadata(offset, actualLimit, totalRows),
145
+ };
146
+ }
147
+ const endIndex = Math.min(offset + actualLimit, totalRows);
148
+ const chunkResults = results.slice(offset, endIndex);
149
+ const pagination = generatePaginationMetadata(offset, actualLimit, totalRows);
150
+ logger.info('Created result chunk', {
151
+ offset,
152
+ limit: actualLimit,
153
+ totalRows,
154
+ chunkSize: chunkResults.length,
155
+ currentChunk: pagination.current_chunk,
156
+ totalChunks: pagination.total_chunks,
157
+ hasMore: pagination.has_more,
158
+ });
159
+ return {
160
+ results: chunkResults,
161
+ pagination,
162
+ };
163
+ }
164
+ export function estimateTotalTokens(results) {
165
+ if (results.length === 0) {
166
+ return 0;
167
+ }
168
+ const sampleSize = Math.min(results.length, SAMPLE_SIZE);
169
+ const sample = results.slice(0, sampleSize);
170
+ let totalSampleTokens = 0;
171
+ for (const row of sample) {
172
+ totalSampleTokens += estimateTokensForJson(row);
173
+ }
174
+ const avgTokensPerRow = totalSampleTokens / sampleSize;
175
+ const estimatedTotal = Math.ceil(avgTokensPerRow * results.length * JSON_OVERHEAD_MULTIPLIER);
176
+ logger.debug('Estimated total tokens for dataset', {
177
+ totalRows: results.length,
178
+ sampleSize,
179
+ avgTokensPerRow: Math.round(avgTokensPerRow),
180
+ estimatedTotal,
181
+ });
182
+ return estimatedTotal;
183
+ }
184
+ export function needsChunking(results) {
185
+ const estimatedTokens = estimateTotalTokens(results);
186
+ const needsChunking = estimatedTokens > MAX_SAFE_TOKENS;
187
+ logger.debug('Checking if chunking needed', {
188
+ totalRows: results.length,
189
+ estimatedTokens,
190
+ maxSafeTokens: MAX_SAFE_TOKENS,
191
+ needsChunking,
192
+ });
193
+ return needsChunking;
194
+ }
195
+ export function validatePaginationParams(offset, limit, totalRows) {
196
+ if (!Number.isInteger(offset) || offset < 0) {
197
+ return {
198
+ valid: false,
199
+ offset: 0,
200
+ error: 'Offset must be a non-negative integer',
201
+ };
202
+ }
203
+ if (limit !== undefined) {
204
+ if (!Number.isInteger(limit) || limit <= 0) {
205
+ return {
206
+ valid: false,
207
+ offset,
208
+ error: 'Limit must be a positive integer',
209
+ };
210
+ }
211
+ }
212
+ if (!Number.isInteger(totalRows) || totalRows < 0) {
213
+ return {
214
+ valid: false,
215
+ offset,
216
+ limit,
217
+ error: 'Total rows must be a non-negative integer',
218
+ };
219
+ }
220
+ return {
221
+ valid: true,
222
+ offset,
223
+ limit,
224
+ };
225
+ }
226
+ //# sourceMappingURL=token-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../src/utils/token-estimator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export type GSCDimension = 'query' | 'page' | 'country' | 'device' | 'searchAppearance' | 'date';
2
+ export type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'includingRegex' | 'excludingRegex';
3
+ export interface DimensionFilter {
4
+ dimension: GSCDimension;
5
+ operator: FilterOperator;
6
+ expression: string;
7
+ }
8
+ export type SortMetric = 'clicks' | 'impressions' | 'ctr' | 'position';
9
+ export type SortOrder = 'asc' | 'desc';
10
+ export interface PositionRange {
11
+ min: number;
12
+ max: number;
13
+ }
14
+ export interface TopQueryResult {
15
+ query: string;
16
+ clicks: number;
17
+ impressions: number;
18
+ ctr: number;
19
+ position: number;
20
+ }
21
+ export interface TopPageResult {
22
+ page: string;
23
+ clicks: number;
24
+ impressions: number;
25
+ ctr: number;
26
+ position: number;
27
+ }
28
+ export interface PeriodMetrics {
29
+ clicks: number;
30
+ impressions: number;
31
+ ctr: number;
32
+ position: number;
33
+ }
34
+ export interface MetricChanges {
35
+ clicks: number;
36
+ clicksPercent: number | null;
37
+ impressions: number;
38
+ impressionsPercent: number | null;
39
+ position: number;
40
+ }
41
+ export interface MetricComparison {
42
+ current: PeriodMetrics;
43
+ previous: PeriodMetrics;
44
+ changes: MetricChanges;
45
+ }
46
+ export interface QueryComparison extends MetricComparison {
47
+ query: string;
48
+ }
49
+ export interface PageComparison extends MetricComparison {
50
+ page: string;
51
+ }
52
+ export interface PropertyInfo {
53
+ propertyUrl: string;
54
+ permissionLevel: string;
55
+ verified: boolean;
56
+ }
57
+ export interface AdvancedQueryResult {
58
+ [dimension: string]: string | number;
59
+ clicks: number;
60
+ impressions: number;
61
+ ctr: number;
62
+ position: number;
63
+ }
64
+ export declare function isGSCDimension(value: string): value is GSCDimension;
65
+ export declare function isFilterOperator(value: string): value is FilterOperator;
66
+ export declare function isSortMetric(value: string): value is SortMetric;
67
+ export declare function isSortOrder(value: string): value is SortOrder;
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAKjG,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,aAAa,GACb,gBAAgB,GAChB,gBAAgB,CAAC;AA+BrB,MAAM,WAAW,eAAe;IAE9B,SAAS,EAAE,YAAY,CAAC;IAExB,QAAQ,EAAE,cAAc,CAAC;IAEzB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAKvE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAqBvC,MAAM,WAAW,aAAa;IAE5B,GAAG,EAAE,MAAM,CAAC;IAEZ,GAAG,EAAE,MAAM,CAAC;CACb;AAWD,MAAM,WAAW,cAAc;IAE7B,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,MAAM,WAAW,aAAa;IAE5B,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,MAAM,CAAC;IAEf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,WAAW,EAAE,MAAM,CAAC;IAEpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAUD,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,aAAa,CAAC;IAEvB,QAAQ,EAAE,aAAa,CAAC;IAExB,OAAO,EAAE,aAAa,CAAC;CACxB;AAuBD,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IAEvD,KAAK,EAAE,MAAM,CAAC;CACf;AAuBD,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IAEtD,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,MAAM,WAAW,YAAY;IAE3B,WAAW,EAAE,MAAM,CAAC;IAEpB,eAAe,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE,OAAO,CAAC;CACnB;AA0BD,MAAM,WAAW,mBAAmB;IAElC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAErC,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AASD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAKD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAKD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D"}
@@ -0,0 +1,13 @@
1
+ export function isGSCDimension(value) {
2
+ return ['query', 'page', 'country', 'device', 'searchAppearance', 'date'].includes(value);
3
+ }
4
+ export function isFilterOperator(value) {
5
+ return ['equals', 'notEquals', 'contains', 'notContains', 'includingRegex', 'excludingRegex'].includes(value);
6
+ }
7
+ export function isSortMetric(value) {
8
+ return ['clicks', 'impressions', 'ctr', 'position'].includes(value);
9
+ }
10
+ export function isSortOrder(value) {
11
+ return value === 'asc' || value === 'desc';
12
+ }
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAyUA,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC;AAKD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChH,CAAC;AAKD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC;AAC7C,CAAC"}