@factorypure/client-helpers 1.1.16 → 1.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -508,28 +508,12 @@ export declare const immersiveScrapeResultsSchema: z.ZodObject<{
508
508
  }, z.core.$strip>>;
509
509
  ai_extracted_sku: z.ZodOptional<z.ZodNullable<z.ZodString>>;
510
510
  ai_extracted_brand: z.ZodOptional<z.ZodNullable<z.ZodString>>;
511
- ai_best_match_sku: z.ZodOptional<z.ZodNullable<z.ZodString>>;
512
- ai_alternate_match_skus: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
513
- ai_extraction_confidence: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
514
- ai_extraction_reasoning: z.ZodOptional<z.ZodNullable<z.ZodString>>;
515
- ai_extraction_quality: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
516
- high: "high";
517
- medium: "medium";
518
- low: "low";
519
- }>>>;
520
- ai_extraction_method: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
521
- openai: "openai";
522
- regex_fallback: "regex_fallback";
523
- cached: "cached";
524
- none: "none";
525
- }>>>;
511
+ ai_extracted_description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
512
+ ai_extracted_features: z.ZodOptional<z.ZodNullable<z.ZodString>>;
513
+ ai_extracted_specifications: z.ZodOptional<z.ZodNullable<z.ZodString>>;
514
+ ai_extracted_shipping: z.ZodOptional<z.ZodNullable<z.ZodString>>;
526
515
  ai_processed_at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
527
516
  listing_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
528
- ai_unique_skus_found: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodNumber>>>;
529
- ai_most_common_sku: z.ZodOptional<z.ZodNullable<z.ZodString>>;
530
- ai_sku_confidence_avg: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
531
- ai_high_quality_listing_count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
532
- ai_total_listing_count: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
533
517
  inline_link: z.ZodOptional<z.ZodNull>;
534
518
  delivery: z.ZodOptional<z.ZodNull>;
535
519
  }, z.core.$strip>;
@@ -697,6 +681,7 @@ export declare const HIDE_OVERRIDE_REASONS: {
697
681
  CALCULATED_SKU_MATCH: string;
698
682
  CALCULATED_SKU_PARTIAL_MATCH: string;
699
683
  CALCULATED_ALT_SKU_MATCH: string;
684
+ AI_COMPARISON_MATCH: string;
700
685
  };
701
686
  export declare const TOO_CHEAP_MULTIPLIER = 0.75;
702
687
  export declare const TOO_EXPENSIVE_MULTIPLIER = 1.15;
package/dist/index.js CHANGED
@@ -334,20 +334,12 @@ export const immersiveScrapeResultsSchema = z.object({
334
334
  // AI extraction fields (per store listing)
335
335
  ai_extracted_sku: z.string().nullable().optional(),
336
336
  ai_extracted_brand: z.string().nullable().optional(),
337
- ai_best_match_sku: z.string().nullable().optional(),
338
- ai_alternate_match_skus: z.array(z.string()).nullable().optional(),
339
- ai_extraction_confidence: z.number().nullable().optional(),
340
- ai_extraction_reasoning: z.string().nullable().optional(),
341
- ai_extraction_quality: z.enum(['high', 'medium', 'low']).nullable().optional(),
342
- ai_extraction_method: z.enum(['openai', 'regex_fallback', 'cached', 'none']).nullable().optional(),
337
+ ai_extracted_description: z.string().nullable().optional(),
338
+ ai_extracted_features: z.string().nullable().optional(),
339
+ ai_extracted_specifications: z.string().nullable().optional(),
340
+ ai_extracted_shipping: z.string().nullable().optional(),
343
341
  ai_processed_at: z.string().nullable().optional(),
344
342
  listing_hash: z.string().nullable().optional(),
345
- // AI aggregate fields (from variant_scrape_found_product_ids)
346
- ai_unique_skus_found: z.record(z.string(), z.number()).nullable().optional(),
347
- ai_most_common_sku: z.string().nullable().optional(),
348
- ai_sku_confidence_avg: z.number().nullable().optional(),
349
- ai_high_quality_listing_count: z.number().nullable().optional(),
350
- ai_total_listing_count: z.number().nullable().optional(),
351
343
  inline_link: z.null().optional(),
352
344
  delivery: z.null().optional(),
353
345
  });
@@ -429,6 +421,7 @@ export const HIDE_OVERRIDE_REASONS = {
429
421
  CALCULATED_SKU_MATCH: 'Calculated SKU Match',
430
422
  CALCULATED_SKU_PARTIAL_MATCH: 'Calculated SKU Partial Match',
431
423
  CALCULATED_ALT_SKU_MATCH: 'Calc. Alt SKU Match',
424
+ AI_COMPARISON_MATCH: 'AI Comparison Match',
432
425
  };
433
426
  const HIDE_ALWAYS_MAP = {
434
427
  [HIDE_REASONS.HIGH_PRICE_OUTLIER]: true,
@@ -1199,6 +1192,55 @@ class RefurbishedUsedRule {
1199
1192
  // ===============================
1200
1193
  // Override Rules
1201
1194
  // ===============================
1195
+ /**
1196
+ * Rule for filtering AI comparison mismatches
1197
+ */
1198
+ class AIComparisonOverrideRule {
1199
+ id = 'ai_comparison_override';
1200
+ name = 'AI Comparison Override';
1201
+ description = 'Filters results where AI comparison determined the listing does match the variant';
1202
+ severity = FilterSeverity.INFO;
1203
+ priority = 200;
1204
+ enabled = true;
1205
+ canBeOverridden = true;
1206
+ overridableBy = [];
1207
+ evaluate(context) {
1208
+ // Only applies to results with listing_hash (primarily immersive results)
1209
+ const result = context.result;
1210
+ if (!result.listing_hash || !context.comparisonMap) {
1211
+ return null;
1212
+ }
1213
+ const variantId = String(context.variant.id);
1214
+ const listingHash = result.listing_hash;
1215
+ // Check if we have comparison data for this variant and listing
1216
+ const variantComparisons = context.comparisonMap[variantId];
1217
+ if (!variantComparisons) {
1218
+ return null;
1219
+ }
1220
+ const comparison = variantComparisons[listingHash];
1221
+ if (!comparison) {
1222
+ return null;
1223
+ }
1224
+ // Only filter confirmed overrides (is_match = 1 AND sufficient_info = 1)
1225
+ // Allow results where we don't have sufficient info to compare
1226
+ if (comparison.is_match === 1 && comparison.sufficient_info === 1) {
1227
+ return {
1228
+ ruleId: this.id,
1229
+ severity: this.severity,
1230
+ message: HIDE_OVERRIDE_REASONS.AI_COMPARISON_MATCH,
1231
+ metadata: {
1232
+ listingHash,
1233
+ isMatch: comparison.is_match,
1234
+ sufficientInfo: comparison.sufficient_info,
1235
+ resultDescription: comparison.result_description,
1236
+ comparedAt: comparison.compared_at,
1237
+ },
1238
+ timestamp: new Date().toISOString(),
1239
+ };
1240
+ }
1241
+ return null;
1242
+ }
1243
+ }
1202
1244
  /**
1203
1245
  * Override rule for SKU matches in title
1204
1246
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@factorypure/client-helpers",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",