@graphext/cuery 0.7.0 → 0.9.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 (43) hide show
  1. package/esm/mod.d.ts +1 -1
  2. package/esm/mod.d.ts.map +1 -1
  3. package/esm/mod.js +1 -1
  4. package/esm/src/schemas/brand.schema.d.ts +7 -1
  5. package/esm/src/schemas/brand.schema.d.ts.map +1 -1
  6. package/esm/src/schemas/brand.schema.js +2 -0
  7. package/esm/src/tools/brands.d.ts +1 -1
  8. package/esm/src/tools/brands.d.ts.map +1 -1
  9. package/esm/src/tools/brands.js +47 -16
  10. package/package.json +1 -1
  11. package/script/mod.d.ts +1 -1
  12. package/script/mod.d.ts.map +1 -1
  13. package/script/mod.js +1 -1
  14. package/script/src/schemas/brand.schema.d.ts +7 -1
  15. package/script/src/schemas/brand.schema.d.ts.map +1 -1
  16. package/script/src/schemas/brand.schema.js +2 -0
  17. package/script/src/tools/brands.d.ts +1 -1
  18. package/script/src/tools/brands.d.ts.map +1 -1
  19. package/script/src/tools/brands.js +47 -16
  20. package/esm/src/api.d.ts +0 -73
  21. package/esm/src/api.d.ts.map +0 -1
  22. package/esm/src/api.js +0 -208
  23. package/esm/src/apis/hasdata/aim.d.ts +0 -4
  24. package/esm/src/apis/hasdata/aim.d.ts.map +0 -1
  25. package/esm/src/apis/hasdata/aim.js +0 -32
  26. package/esm/src/apis/hasdata/aio.d.ts +0 -4
  27. package/esm/src/apis/hasdata/aio.d.ts.map +0 -1
  28. package/esm/src/apis/hasdata/aio.js +0 -42
  29. package/esm/src/apis/hasdata/helpers.d.ts +0 -55
  30. package/esm/src/apis/hasdata/helpers.d.ts.map +0 -1
  31. package/esm/src/apis/hasdata/helpers.js +0 -182
  32. package/script/src/api.d.ts +0 -73
  33. package/script/src/api.d.ts.map +0 -1
  34. package/script/src/api.js +0 -221
  35. package/script/src/apis/hasdata/aim.d.ts +0 -4
  36. package/script/src/apis/hasdata/aim.d.ts.map +0 -1
  37. package/script/src/apis/hasdata/aim.js +0 -36
  38. package/script/src/apis/hasdata/aio.d.ts +0 -4
  39. package/script/src/apis/hasdata/aio.d.ts.map +0 -1
  40. package/script/src/apis/hasdata/aio.js +0 -46
  41. package/script/src/apis/hasdata/helpers.d.ts +0 -55
  42. package/script/src/apis/hasdata/helpers.d.ts.map +0 -1
  43. package/script/src/apis/hasdata/helpers.js +0 -222
package/esm/mod.d.ts CHANGED
@@ -20,9 +20,9 @@ export * from './src/tools/summarize.js';
20
20
  export * from './src/tools/sources.js';
21
21
  export * from './src/tools/entities.js';
22
22
  export * from './src/tools/prompts.js';
23
+ export * from './src/tools/scorer.js';
23
24
  export * from './src/helpers/seedKeywords.js';
24
25
  export * from './src/tools/generic.js';
25
- export * from './src/api.js';
26
26
  export * from './src/apis/chatgptScraper/index.js';
27
27
  export * from './src/apis/googleAds/keywordPlanner.js';
28
28
  export * from './src/schemas/index.js';
package/esm/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
package/esm/mod.js CHANGED
@@ -22,9 +22,9 @@ export * from './src/tools/summarize.js';
22
22
  export * from './src/tools/sources.js';
23
23
  export * from './src/tools/entities.js';
24
24
  export * from './src/tools/prompts.js';
25
+ export * from './src/tools/scorer.js';
25
26
  export * from './src/helpers/seedKeywords.js';
26
27
  export * from './src/tools/generic.js';
27
- export * from './src/api.js';
28
28
  export * from './src/apis/chatgptScraper/index.js';
29
29
  export * from './src/apis/googleAds/keywordPlanner.js';
30
30
  export * from './src/schemas/index.js';
@@ -20,6 +20,7 @@ declare const ProductSchema: z.ZodObject<{
20
20
  export declare const BrandSchema: z.ZodObject<{
21
21
  name: z.ZodString;
22
22
  shortName: z.ZodString;
23
+ aliases: z.ZodArray<z.ZodString>;
23
24
  description: z.ZodString;
24
25
  domain: z.ZodString;
25
26
  sectors: z.ZodArray<z.ZodString>;
@@ -46,10 +47,13 @@ export type Product = z.infer<typeof ProductSchema> & {
46
47
  /**
47
48
  * TypeScript type inferred from BrandSchema.
48
49
  * Extended to use the enriched Product type for portfolio.
50
+ * Keeps aliases optional at type-level for backward compatibility with
51
+ * legacy persisted Brand payloads that may not include this field.
49
52
  * Safe to import in frontend with `import type`.
50
53
  */
51
- export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio'> & {
54
+ export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio' | 'aliases'> & {
52
55
  portfolio: Array<Product>;
56
+ aliases?: Array<string>;
53
57
  };
54
58
  /**
55
59
  * Brand with additional context fields for pipeline processing.
@@ -73,6 +77,7 @@ declare const BrandListBaseSchema: z.ZodObject<{
73
77
  brands: z.ZodArray<z.ZodObject<{
74
78
  name: z.ZodString;
75
79
  shortName: z.ZodString;
80
+ aliases: z.ZodArray<z.ZodString>;
76
81
  description: z.ZodString;
77
82
  domain: z.ZodString;
78
83
  sectors: z.ZodArray<z.ZodString>;
@@ -98,6 +103,7 @@ export declare const BrandListSchema: z.ZodObject<{
98
103
  brands: z.ZodArray<z.ZodObject<{
99
104
  name: z.ZodString;
100
105
  shortName: z.ZodString;
106
+ aliases: z.ZodArray<z.ZodString>;
101
107
  description: z.ZodString;
102
108
  domain: z.ZodString;
103
109
  sectors: z.ZodArray<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ export const BrandSchema = z.object({
20
20
  name: z.string().describe('Full name of the brand. E.g. "Tesla, Inc." or "Automobiles Peugeot".'),
21
21
  shortName: z.string().describe('Short, common/canonical name of the brand, if different from the official name. ' +
22
22
  'E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot".'),
23
+ aliases: z.array(z.string()).describe('Alternative names for the same brand (e.g., local variants, abbreviations, or common misspellings). ' +
24
+ 'Always include this field; use [] when no reliable aliases are known.'),
23
25
  description: z.string().describe('Description of the brand.'),
24
26
  domain: z.string().min(1).describe('Official website of the brand.'),
25
27
  sectors: z.array(z.string()).describe('List of main industrial sectors the brand operates in.'),
@@ -18,7 +18,7 @@ export declare function generatePortfolioKeywords(product: Product, sector: stri
18
18
  * Generate seed keywords for all portfolio items in a brand concurrently,
19
19
  * updating the keywordSeeds field in-place for each product.
20
20
  */
21
- export declare function enrichBrandPortfolioWithKeywords(brand: Brand, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<Brand>;
21
+ export declare function enrichBrandPortfolioWithKeywords<T extends Brand>(brand: T, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<T>;
22
22
  export declare function generateCompetitorsInfo({ brand, brandDomain, sector, market, briefing, strict, instructions, brands, language, userLanguage, model, useSearch, countryISOCode, contextSize, reasoningEffort }: CompetitorSearchOptions): Promise<BrandListResponse>;
23
23
  export declare function generateBrandInfo({ brand, brandDomain, language, userLanguage, sector, market, briefing, model, useSearch, countryISOCode, contextSize, reasoningEffort }: BrandSearchOptions): Promise<Brand>;
24
24
  export declare function concatBrands(ownBrands: Array<Brand>, competitors: Array<Brand>): Array<FlaggedBrand>;
@@ -1 +1 @@
1
- {"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"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"}
@@ -77,6 +77,8 @@ should have the following fields:
77
77
  - shortName: A short, common/canonical name of the competitor brand, if different from the official name.
78
78
  E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
79
79
  set same as name.
80
+ - aliases: Array of alternative names for the competitor brand (e.g., local variants, abbreviations,
81
+ common misspellings, legacy names). Always include this field; if no reliable aliases are known, use [].
80
82
  - description: A brief description of the competitor brand's main activity.
81
83
  - domain: The official website of the competitor brand, if available.
82
84
  - sectors: A list of main industrial sectors the competitor brand operates in.
@@ -91,6 +93,7 @@ It's more important to be comprehensive than selective, so include more competit
91
93
  Try to order them by relevance, with the most direct and bigger competitors first.
92
94
 
93
95
  Return the answer (field values) in the language "{language}".
96
+ Always include "aliases" for every brand object, even if it is an empty array.
94
97
 
95
98
  Also provide an "explanation" field with a brief summary (2-3 sentences) explaining the reasoning behind
96
99
  the competitors you identified: what makes them relevant competitors, how they relate to the original brand,
@@ -126,6 +129,8 @@ Find out the following information about this brand:
126
129
  - shortName: A short, common/canonical name of the brand, if different from the official name.
127
130
  E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
128
131
  set same as name.
132
+ - aliases: Array of alternative names for the same brand (local variants, abbreviations, common misspellings,
133
+ or legacy names). Always include this field; if no reliable aliases are known, use [].
129
134
  - description: A brief description of the brand's main activity.
130
135
  - domain: The official website of the brand, if available.
131
136
  - sectors: A list of specific industrial sectors the brand operates in, ordered by relevance. Be precise and concrete rather than generic - for example, instead of "education", use "professional training for unemployed", "corporate learning and development", or "online coding bootcamps". Adapt the specificity level to match the brand's actual focus and niche.
@@ -137,7 +142,16 @@ Find out the following information about this brand:
137
142
  - favicon: URL of the brand's favicon, if available.
138
143
 
139
144
  Return the answer as a JSON object with field values in the language "{language}".
145
+ Always include "aliases", even when empty.
140
146
  `);
147
+ function ensureBrandAliases(brand) {
148
+ return {
149
+ ...brand,
150
+ aliases: Array.isArray(brand.aliases)
151
+ ? brand.aliases
152
+ : []
153
+ };
154
+ }
141
155
  /**
142
156
  * Generate seed keywords for a single portfolio item using an LLM.
143
157
  */
@@ -199,10 +213,12 @@ export async function generateCompetitorsInfo({ brand, brandDomain, sector = nul
199
213
  reasoningEffort
200
214
  });
201
215
  // Make sure these are clean domains
202
- response.brands.map(brand => {
216
+ response.brands = response.brands.map((brand) => {
217
+ const normalizedBrand = ensureBrandAliases(brand);
203
218
  if (brand.domain) {
204
- brand.domain = extractDomain(brand.domain);
219
+ normalizedBrand.domain = extractDomain(brand.domain);
205
220
  }
221
+ return normalizedBrand;
206
222
  });
207
223
  const enrichedBrands = await mapParallel(response.brands, 100, async (brand) => enrichBrandPortfolioWithKeywords(brand, language, model, undefined, sector, market));
208
224
  return {
@@ -233,18 +249,19 @@ export async function generateBrandInfo({ brand, brandDomain, language = 'en', u
233
249
  reasoningEffort: reasoningEffort,
234
250
  useSearch
235
251
  });
252
+ const normalizedBrandInfo = ensureBrandAliases(brandInfo);
236
253
  // Make sure this is a clean domain
237
- brandInfo.domain = extractDomain(brandInfo.domain);
238
- const enrichedBrand = await enrichBrandPortfolioWithKeywords(brandInfo, language, model, undefined, sector, market);
254
+ normalizedBrandInfo.domain = extractDomain(normalizedBrandInfo.domain);
255
+ const enrichedBrand = await enrichBrandPortfolioWithKeywords(normalizedBrandInfo, language, model, undefined, sector, market);
239
256
  return enrichedBrand;
240
257
  }
241
258
  export function concatBrands(ownBrands, competitors) {
242
259
  const ownBrandsWithFlag = ownBrands.map((brand) => ({
243
- ...brand,
260
+ ...ensureBrandAliases(brand),
244
261
  isCompetitor: false
245
262
  }));
246
263
  const competitorsWithFlag = competitors.map((brand) => ({
247
- ...brand,
264
+ ...ensureBrandAliases(brand),
248
265
  isCompetitor: true
249
266
  }));
250
267
  return [...ownBrandsWithFlag, ...competitorsWithFlag];
@@ -377,11 +394,16 @@ export function rankBrandsInText(text, brands, entities) {
377
394
  // Create a normalized version of text for pattern matching (expands CamelCase, etc.)
378
395
  const normalizedText = normalizeTextForMatching(text);
379
396
  const brandEntities = entities?.filter(entity => entity.type.toLowerCase() === 'brand') ?? [];
380
- // Build a map from ultra-normalized FlaggedBrand name to the entity text variation (if any)
381
- // Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co"
397
+ // Build a map from ultra-normalized brand token to the entity text variation (if any)
398
+ // Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co".
399
+ // This map is used for shortName and aliases alike.
382
400
  const entityTextByNormalizedBrand = new Map();
383
401
  for (const entity of brandEntities) {
384
- entityTextByNormalizedBrand.set(createBrandMatchKey(entity.name), entity.name);
402
+ const key = createBrandMatchKey(entity.name);
403
+ if (!key || entityTextByNormalizedBrand.has(key)) {
404
+ continue;
405
+ }
406
+ entityTextByNormalizedBrand.set(key, entity.name);
385
407
  }
386
408
  // Set of ultra-normalized entity names that match a FlaggedBrand (to exclude from separate processing)
387
409
  const matchedEntityNames = new Set();
@@ -400,10 +422,19 @@ export function rankBrandsInText(text, brands, entities) {
400
422
  // Process FlaggedBrands, using entity text as an additional search variant when available
401
423
  for (const brand of brands) {
402
424
  let earliestPosition = Infinity;
403
- const normalizedShortName = createBrandMatchKey(brand.shortName);
404
- // Check if there's a matching entity for this brand (using ultra-normalized comparison)
405
- const entityText = entityTextByNormalizedBrand.get(normalizedShortName);
406
- if (entityText != null) {
425
+ const brandNameVariants = [
426
+ brand.shortName,
427
+ ...(Array.isArray(brand.aliases) ? brand.aliases : [])
428
+ ].filter((value) => value != null && value.trim() !== '');
429
+ const normalizedBrandVariants = new Set(brandNameVariants
430
+ .map((value) => createBrandMatchKey(value))
431
+ .filter((value) => value.length > 0));
432
+ // Check if there's a matching entity for this brand (shortName or alias key match)
433
+ for (const normalizedVariant of normalizedBrandVariants) {
434
+ const entityText = entityTextByNormalizedBrand.get(normalizedVariant);
435
+ if (entityText == null) {
436
+ continue;
437
+ }
407
438
  matchedEntityNames.add(createBrandMatchKey(entityText));
408
439
  // Use flexible pattern matching to find the entity in text (handles CamelCase, &/and, etc.)
409
440
  const entityPattern = createBrandMatchPattern(entityText);
@@ -412,9 +443,9 @@ export function rankBrandsInText(text, brands, entities) {
412
443
  earliestPosition = Math.min(earliestPosition, position);
413
444
  }
414
445
  }
415
- // Check for shortName using flexible pattern matching
416
- if (brand.shortName != null && brand.shortName.trim() !== '') {
417
- const brandPattern = createBrandMatchPattern(brand.shortName);
446
+ // Check shortName + aliases using flexible pattern matching
447
+ for (const brandNameVariant of brandNameVariants) {
448
+ const brandPattern = createBrandMatchPattern(brandNameVariant);
418
449
  const position = findPatternPosition(brandPattern);
419
450
  if (position !== -1) {
420
451
  earliestPosition = Math.min(earliestPosition, position);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphext/cuery",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Cuery tools for AI-powered keyword research and brand analysis",
5
5
  "repository": {
6
6
  "type": "git",
package/script/mod.d.ts CHANGED
@@ -20,9 +20,9 @@ export * from './src/tools/summarize.js';
20
20
  export * from './src/tools/sources.js';
21
21
  export * from './src/tools/entities.js';
22
22
  export * from './src/tools/prompts.js';
23
+ export * from './src/tools/scorer.js';
23
24
  export * from './src/helpers/seedKeywords.js';
24
25
  export * from './src/tools/generic.js';
25
- export * from './src/api.js';
26
26
  export * from './src/apis/chatgptScraper/index.js';
27
27
  export * from './src/apis/googleAds/keywordPlanner.js';
28
28
  export * from './src/schemas/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
package/script/mod.js CHANGED
@@ -45,9 +45,9 @@ __exportStar(require("./src/tools/summarize.js"), exports);
45
45
  __exportStar(require("./src/tools/sources.js"), exports);
46
46
  __exportStar(require("./src/tools/entities.js"), exports);
47
47
  __exportStar(require("./src/tools/prompts.js"), exports);
48
+ __exportStar(require("./src/tools/scorer.js"), exports);
48
49
  __exportStar(require("./src/helpers/seedKeywords.js"), exports);
49
50
  __exportStar(require("./src/tools/generic.js"), exports);
50
- __exportStar(require("./src/api.js"), exports);
51
51
  __exportStar(require("./src/apis/chatgptScraper/index.js"), exports);
52
52
  __exportStar(require("./src/apis/googleAds/keywordPlanner.js"), exports);
53
53
  __exportStar(require("./src/schemas/index.js"), exports);
@@ -20,6 +20,7 @@ declare const ProductSchema: z.ZodObject<{
20
20
  export declare const BrandSchema: z.ZodObject<{
21
21
  name: z.ZodString;
22
22
  shortName: z.ZodString;
23
+ aliases: z.ZodArray<z.ZodString>;
23
24
  description: z.ZodString;
24
25
  domain: z.ZodString;
25
26
  sectors: z.ZodArray<z.ZodString>;
@@ -46,10 +47,13 @@ export type Product = z.infer<typeof ProductSchema> & {
46
47
  /**
47
48
  * TypeScript type inferred from BrandSchema.
48
49
  * Extended to use the enriched Product type for portfolio.
50
+ * Keeps aliases optional at type-level for backward compatibility with
51
+ * legacy persisted Brand payloads that may not include this field.
49
52
  * Safe to import in frontend with `import type`.
50
53
  */
51
- export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio'> & {
54
+ export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio' | 'aliases'> & {
52
55
  portfolio: Array<Product>;
56
+ aliases?: Array<string>;
53
57
  };
54
58
  /**
55
59
  * Brand with additional context fields for pipeline processing.
@@ -73,6 +77,7 @@ declare const BrandListBaseSchema: z.ZodObject<{
73
77
  brands: z.ZodArray<z.ZodObject<{
74
78
  name: z.ZodString;
75
79
  shortName: z.ZodString;
80
+ aliases: z.ZodArray<z.ZodString>;
76
81
  description: z.ZodString;
77
82
  domain: z.ZodString;
78
83
  sectors: z.ZodArray<z.ZodString>;
@@ -98,6 +103,7 @@ export declare const BrandListSchema: z.ZodObject<{
98
103
  brands: z.ZodArray<z.ZodObject<{
99
104
  name: z.ZodString;
100
105
  shortName: z.ZodString;
106
+ aliases: z.ZodArray<z.ZodString>;
101
107
  description: z.ZodString;
102
108
  domain: z.ZodString;
103
109
  sectors: z.ZodArray<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@ exports.BrandSchema = index_js_1.z.object({
23
23
  name: index_js_1.z.string().describe('Full name of the brand. E.g. "Tesla, Inc." or "Automobiles Peugeot".'),
24
24
  shortName: index_js_1.z.string().describe('Short, common/canonical name of the brand, if different from the official name. ' +
25
25
  'E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot".'),
26
+ aliases: index_js_1.z.array(index_js_1.z.string()).describe('Alternative names for the same brand (e.g., local variants, abbreviations, or common misspellings). ' +
27
+ 'Always include this field; use [] when no reliable aliases are known.'),
26
28
  description: index_js_1.z.string().describe('Description of the brand.'),
27
29
  domain: index_js_1.z.string().min(1).describe('Official website of the brand.'),
28
30
  sectors: index_js_1.z.array(index_js_1.z.string()).describe('List of main industrial sectors the brand operates in.'),
@@ -18,7 +18,7 @@ export declare function generatePortfolioKeywords(product: Product, sector: stri
18
18
  * Generate seed keywords for all portfolio items in a brand concurrently,
19
19
  * updating the keywordSeeds field in-place for each product.
20
20
  */
21
- export declare function enrichBrandPortfolioWithKeywords(brand: Brand, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<Brand>;
21
+ export declare function enrichBrandPortfolioWithKeywords<T extends Brand>(brand: T, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<T>;
22
22
  export declare function generateCompetitorsInfo({ brand, brandDomain, sector, market, briefing, strict, instructions, brands, language, userLanguage, model, useSearch, countryISOCode, contextSize, reasoningEffort }: CompetitorSearchOptions): Promise<BrandListResponse>;
23
23
  export declare function generateBrandInfo({ brand, brandDomain, language, userLanguage, sector, market, briefing, model, useSearch, countryISOCode, contextSize, reasoningEffort }: BrandSearchOptions): Promise<Brand>;
24
24
  export declare function concatBrands(ownBrands: Array<Brand>, competitors: Array<Brand>): Array<FlaggedBrand>;
@@ -1 +1 @@
1
- {"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EAAgC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,mBAAmB,GAAG,MAAM,CAuB9B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAoIpC;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,GACvB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAaxB;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,KAAK,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,EACzB,cAAc,GAAE,MAAY,EAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAGD,wBAAsB,uBAAuB,CAAC,EAC7C,KAAK,EACL,WAAW,EACX,MAAa,EACb,MAAa,EACb,QAAQ,EACR,MAAa,EACb,YAAiB,EACjB,MAAa,EACb,QAAe,EACf,YAAmB,EACnB,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDtD;AAED,wBAAsB,iBAAiB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,QAAe,EACf,YAAmB,EACnB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CA2CrC;AAED,wBAAgB,YAAY,CAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EACvB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GACvB,KAAK,CAAC,YAAY,CAAC,CAYrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBvD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI7D;AAuED;;;GAGG;AAQH;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GACtB,KAAK,CAAC,MAAM,CAAC,CA6Gf;AAED,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EACpB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/B;AAED,mBAAmB,4BAA4B,CAAC"}
@@ -89,6 +89,8 @@ should have the following fields:
89
89
  - shortName: A short, common/canonical name of the competitor brand, if different from the official name.
90
90
  E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
91
91
  set same as name.
92
+ - aliases: Array of alternative names for the competitor brand (e.g., local variants, abbreviations,
93
+ common misspellings, legacy names). Always include this field; if no reliable aliases are known, use [].
92
94
  - description: A brief description of the competitor brand's main activity.
93
95
  - domain: The official website of the competitor brand, if available.
94
96
  - sectors: A list of main industrial sectors the competitor brand operates in.
@@ -103,6 +105,7 @@ It's more important to be comprehensive than selective, so include more competit
103
105
  Try to order them by relevance, with the most direct and bigger competitors first.
104
106
 
105
107
  Return the answer (field values) in the language "{language}".
108
+ Always include "aliases" for every brand object, even if it is an empty array.
106
109
 
107
110
  Also provide an "explanation" field with a brief summary (2-3 sentences) explaining the reasoning behind
108
111
  the competitors you identified: what makes them relevant competitors, how they relate to the original brand,
@@ -138,6 +141,8 @@ Find out the following information about this brand:
138
141
  - shortName: A short, common/canonical name of the brand, if different from the official name.
139
142
  E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
140
143
  set same as name.
144
+ - aliases: Array of alternative names for the same brand (local variants, abbreviations, common misspellings,
145
+ or legacy names). Always include this field; if no reliable aliases are known, use [].
141
146
  - description: A brief description of the brand's main activity.
142
147
  - domain: The official website of the brand, if available.
143
148
  - sectors: A list of specific industrial sectors the brand operates in, ordered by relevance. Be precise and concrete rather than generic - for example, instead of "education", use "professional training for unemployed", "corporate learning and development", or "online coding bootcamps". Adapt the specificity level to match the brand's actual focus and niche.
@@ -149,7 +154,16 @@ Find out the following information about this brand:
149
154
  - favicon: URL of the brand's favicon, if available.
150
155
 
151
156
  Return the answer as a JSON object with field values in the language "{language}".
157
+ Always include "aliases", even when empty.
152
158
  `);
159
+ function ensureBrandAliases(brand) {
160
+ return {
161
+ ...brand,
162
+ aliases: Array.isArray(brand.aliases)
163
+ ? brand.aliases
164
+ : []
165
+ };
166
+ }
153
167
  /**
154
168
  * Generate seed keywords for a single portfolio item using an LLM.
155
169
  */
@@ -211,10 +225,12 @@ async function generateCompetitorsInfo({ brand, brandDomain, sector = null, mark
211
225
  reasoningEffort
212
226
  });
213
227
  // Make sure these are clean domains
214
- response.brands.map(brand => {
228
+ response.brands = response.brands.map((brand) => {
229
+ const normalizedBrand = ensureBrandAliases(brand);
215
230
  if (brand.domain) {
216
- brand.domain = (0, urls_js_1.extractDomain)(brand.domain);
231
+ normalizedBrand.domain = (0, urls_js_1.extractDomain)(brand.domain);
217
232
  }
233
+ return normalizedBrand;
218
234
  });
219
235
  const enrichedBrands = await (0, async_js_1.mapParallel)(response.brands, 100, async (brand) => enrichBrandPortfolioWithKeywords(brand, language, model, undefined, sector, market));
220
236
  return {
@@ -245,18 +261,19 @@ async function generateBrandInfo({ brand, brandDomain, language = 'en', userLang
245
261
  reasoningEffort: reasoningEffort,
246
262
  useSearch
247
263
  });
264
+ const normalizedBrandInfo = ensureBrandAliases(brandInfo);
248
265
  // Make sure this is a clean domain
249
- brandInfo.domain = (0, urls_js_1.extractDomain)(brandInfo.domain);
250
- const enrichedBrand = await enrichBrandPortfolioWithKeywords(brandInfo, language, model, undefined, sector, market);
266
+ normalizedBrandInfo.domain = (0, urls_js_1.extractDomain)(normalizedBrandInfo.domain);
267
+ const enrichedBrand = await enrichBrandPortfolioWithKeywords(normalizedBrandInfo, language, model, undefined, sector, market);
251
268
  return enrichedBrand;
252
269
  }
253
270
  function concatBrands(ownBrands, competitors) {
254
271
  const ownBrandsWithFlag = ownBrands.map((brand) => ({
255
- ...brand,
272
+ ...ensureBrandAliases(brand),
256
273
  isCompetitor: false
257
274
  }));
258
275
  const competitorsWithFlag = competitors.map((brand) => ({
259
- ...brand,
276
+ ...ensureBrandAliases(brand),
260
277
  isCompetitor: true
261
278
  }));
262
279
  return [...ownBrandsWithFlag, ...competitorsWithFlag];
@@ -389,11 +406,16 @@ function rankBrandsInText(text, brands, entities) {
389
406
  // Create a normalized version of text for pattern matching (expands CamelCase, etc.)
390
407
  const normalizedText = normalizeTextForMatching(text);
391
408
  const brandEntities = entities?.filter(entity => entity.type.toLowerCase() === 'brand') ?? [];
392
- // Build a map from ultra-normalized FlaggedBrand name to the entity text variation (if any)
393
- // Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co"
409
+ // Build a map from ultra-normalized brand token to the entity text variation (if any)
410
+ // Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co".
411
+ // This map is used for shortName and aliases alike.
394
412
  const entityTextByNormalizedBrand = new Map();
395
413
  for (const entity of brandEntities) {
396
- entityTextByNormalizedBrand.set(createBrandMatchKey(entity.name), entity.name);
414
+ const key = createBrandMatchKey(entity.name);
415
+ if (!key || entityTextByNormalizedBrand.has(key)) {
416
+ continue;
417
+ }
418
+ entityTextByNormalizedBrand.set(key, entity.name);
397
419
  }
398
420
  // Set of ultra-normalized entity names that match a FlaggedBrand (to exclude from separate processing)
399
421
  const matchedEntityNames = new Set();
@@ -412,10 +434,19 @@ function rankBrandsInText(text, brands, entities) {
412
434
  // Process FlaggedBrands, using entity text as an additional search variant when available
413
435
  for (const brand of brands) {
414
436
  let earliestPosition = Infinity;
415
- const normalizedShortName = createBrandMatchKey(brand.shortName);
416
- // Check if there's a matching entity for this brand (using ultra-normalized comparison)
417
- const entityText = entityTextByNormalizedBrand.get(normalizedShortName);
418
- if (entityText != null) {
437
+ const brandNameVariants = [
438
+ brand.shortName,
439
+ ...(Array.isArray(brand.aliases) ? brand.aliases : [])
440
+ ].filter((value) => value != null && value.trim() !== '');
441
+ const normalizedBrandVariants = new Set(brandNameVariants
442
+ .map((value) => createBrandMatchKey(value))
443
+ .filter((value) => value.length > 0));
444
+ // Check if there's a matching entity for this brand (shortName or alias key match)
445
+ for (const normalizedVariant of normalizedBrandVariants) {
446
+ const entityText = entityTextByNormalizedBrand.get(normalizedVariant);
447
+ if (entityText == null) {
448
+ continue;
449
+ }
419
450
  matchedEntityNames.add(createBrandMatchKey(entityText));
420
451
  // Use flexible pattern matching to find the entity in text (handles CamelCase, &/and, etc.)
421
452
  const entityPattern = createBrandMatchPattern(entityText);
@@ -424,9 +455,9 @@ function rankBrandsInText(text, brands, entities) {
424
455
  earliestPosition = Math.min(earliestPosition, position);
425
456
  }
426
457
  }
427
- // Check for shortName using flexible pattern matching
428
- if (brand.shortName != null && brand.shortName.trim() !== '') {
429
- const brandPattern = createBrandMatchPattern(brand.shortName);
458
+ // Check shortName + aliases using flexible pattern matching
459
+ for (const brandNameVariant of brandNameVariants) {
460
+ const brandPattern = createBrandMatchPattern(brandNameVariant);
430
461
  const position = findPatternPosition(brandPattern);
431
462
  if (position !== -1) {
432
463
  earliestPosition = Math.min(earliestPosition, position);
package/esm/src/api.d.ts DELETED
@@ -1,73 +0,0 @@
1
- import { type JobId } from './apis/chatgptScraper/index.js';
2
- import { type Entity } from './schemas/entity.schema.js';
3
- import { type Funnel } from './schemas/funnel.schema.js';
4
- import type { ModelIdentifier } from './schemas/models.schema.js';
5
- import { type Persona } from './schemas/persona.schema.js';
6
- import { type BrandContext } from './schemas/brand.schema.js';
7
- import { type Source, type EnrichedSource, type SearchSource } from './schemas/sources.schema.js';
8
- export type ModelResponse = {
9
- prompt: string;
10
- model: string;
11
- answer: string;
12
- sources: Array<Source>;
13
- searchQueries: Array<string>;
14
- searchSources: Array<SearchSource>;
15
- };
16
- export type EnrichedModelResponse = {
17
- prompt: string;
18
- model: string;
19
- answer: string;
20
- sources: Array<EnrichedSource>;
21
- fanout?: Array<string>;
22
- rankedBrandsInAnswer: Array<string>;
23
- rankedBrandsInSourceTitles: Array<string>;
24
- rankedBrandsInSourceDomains: Array<string>;
25
- };
26
- export declare function queryModel(prompts: Array<string | JobId>, model: ModelIdentifier, searchCountry?: string | null): Promise<Array<ModelResponse>>;
27
- export declare function classifyIntent(texts: Array<string>): Promise<Array<string | null>>;
28
- export declare function extractTopics(params: {
29
- records: Array<Record<string, unknown>>;
30
- maxSamples?: number;
31
- instructions?: string;
32
- language?: string;
33
- model?: string;
34
- }): Promise<{
35
- topics: {
36
- topic: string;
37
- subtopics: string[];
38
- }[];
39
- } | null>;
40
- export declare function generatePersonas(params: {
41
- sector: string;
42
- market: string;
43
- language: string;
44
- brand?: string;
45
- brandDomain?: string;
46
- count?: number;
47
- briefing?: string;
48
- instructions?: string;
49
- userLanguage?: string;
50
- personas?: Array<Persona>;
51
- model?: string;
52
- }): Promise<{
53
- personas: {
54
- name: string;
55
- description: string;
56
- keywordSeeds: string[];
57
- }[];
58
- explanation: string;
59
- } | null>;
60
- export declare function extractAndAssignTopics(texts: Array<string>): Promise<Array<{
61
- topic: string | null;
62
- subtopic: string | null;
63
- }>>;
64
- export declare function assignFunnelStages(texts: Array<string>, funnel: Funnel): Promise<Array<{
65
- funnelStage: string | null;
66
- funnelCategory: string | null;
67
- }>>;
68
- export declare function classifyIntoPersonas(texts: Array<string>, personas: Array<Persona>): Promise<Array<Array<string> | null>>;
69
- export declare function classifyBrandedNonBranded(texts: Array<string>): Promise<Array<string | null>>;
70
- export declare function extractEntities(texts: Array<string>): Promise<Array<Array<Entity> | null>>;
71
- export declare function scorePurchaseProbability(texts: Array<string>, numDays?: number): Promise<Array<number | null>>;
72
- export declare function scoreRelevance(prompts: Array<string>, context: BrandContext): Promise<Array<number | null>>;
73
- //# sourceMappingURL=api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/src/api.ts"],"names":[],"mappings":"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"}