@claritylabs/cl-sdk 1.3.5 → 1.3.7

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.mjs CHANGED
@@ -6436,113 +6436,6 @@ Your task:
6436
6436
  Return JSON only.`;
6437
6437
  }
6438
6438
 
6439
- // src/extraction/heuristics.ts
6440
- function looksReferential(value) {
6441
- if (typeof value !== "string") return false;
6442
- const normalized = value.toLowerCase();
6443
- return normalized.includes("shown in the declarations") || normalized.includes("shown in declarations") || normalized.includes("shown in the schedule") || normalized.includes("as stated") || normalized.includes("if applicable");
6444
- }
6445
- function looksCoveredReasonSection(section) {
6446
- const title = String(section.title ?? "").toLowerCase();
6447
- const type = String(section.type ?? "").toLowerCase();
6448
- return type === "covered_reason" || title.includes("covered cause") || title.includes("covered reason") || title.includes("covered peril");
6449
- }
6450
-
6451
- // src/extraction/referential-workflow.ts
6452
- function normalizeText2(value) {
6453
- return typeof value === "string" ? value.trim().toLowerCase() : "";
6454
- }
6455
- function containsTarget(value, target) {
6456
- const normalizedValue = normalizeText2(value);
6457
- return Boolean(normalizedValue && target && normalizedValue.includes(target));
6458
- }
6459
- function pageRangeFrom(startPage, endPage) {
6460
- if (typeof startPage !== "number" || !Number.isFinite(startPage) || startPage <= 0) {
6461
- return void 0;
6462
- }
6463
- const normalizedEnd = typeof endPage === "number" && Number.isFinite(endPage) && endPage >= startPage ? endPage : startPage;
6464
- return { startPage, endPage: normalizedEnd };
6465
- }
6466
- function parseReferentialTarget(rawTarget) {
6467
- const raw = rawTarget?.trim() || "unknown";
6468
- const normalized = raw.toLowerCase();
6469
- if (normalized === "unknown") return { raw, normalized, kind: "unknown" };
6470
- if (/declarations?|dec\b|decs\b/.test(normalized)) return { raw, normalized, kind: "declarations" };
6471
- if (/schedule|scheduled/.test(normalized)) return { raw, normalized, kind: "schedule" };
6472
- if (/\bitem\b/.test(normalized)) return { raw, normalized, kind: "item" };
6473
- if (/premises?|location|building/.test(normalized)) return { raw, normalized, kind: "premises" };
6474
- if (/\bsection\b/.test(normalized)) return { raw, normalized, kind: "section" };
6475
- if (/policy|coverage\s+part|coverage\s+form/.test(normalized)) return { raw, normalized, kind: "policy" };
6476
- return { raw, normalized, kind: "unknown" };
6477
- }
6478
- function findLocalReferentialPages(params) {
6479
- const targetLower = params.referenceTarget.toLowerCase();
6480
- for (const section of params.sections) {
6481
- if (containsTarget(section.title, targetLower)) {
6482
- const range = pageRangeFrom(section.pageStart, section.pageEnd);
6483
- if (range) return range;
6484
- }
6485
- }
6486
- for (const form of params.formInventory) {
6487
- const titleMatch = containsTarget(form.title, targetLower);
6488
- const typeMatch = containsTarget(form.formType, targetLower);
6489
- const numberMatch = containsTarget(form.formNumber, targetLower);
6490
- if (titleMatch || typeMatch || numberMatch) {
6491
- const range = pageRangeFrom(form.pageStart, form.pageEnd);
6492
- if (range) return range;
6493
- }
6494
- }
6495
- return void 0;
6496
- }
6497
- function findDeclarationsSchedulePages(parsedTarget, formInventory) {
6498
- for (const form of formInventory) {
6499
- const formType = normalizeText2(form.formType);
6500
- const title = normalizeText2(form.title);
6501
- const matchesDeclarations = formType === "declarations" || /declarations?|dec\b|decs\b/.test(title);
6502
- const matchesSchedule = /schedule|scheduled|coverage/.test(title) || formType === "coverage";
6503
- const shouldUse = parsedTarget.kind === "declarations" ? matchesDeclarations : parsedTarget.kind === "schedule" || parsedTarget.kind === "item" || parsedTarget.kind === "premises" ? matchesSchedule || matchesDeclarations : parsedTarget.kind === "policy" ? matchesDeclarations || matchesSchedule : false;
6504
- if (shouldUse) {
6505
- const range = pageRangeFrom(form.pageStart, form.pageEnd);
6506
- if (range) return range;
6507
- }
6508
- }
6509
- return void 0;
6510
- }
6511
- function findSectionPages(parsedTarget, sections) {
6512
- for (const section of sections) {
6513
- const title = normalizeText2(section.title);
6514
- const type = normalizeText2(section.type);
6515
- const matchesKind = parsedTarget.kind === "declarations" && (type === "declarations" || /declarations?/.test(title)) || parsedTarget.kind === "schedule" && (type === "schedule" || /schedule|scheduled/.test(title)) || parsedTarget.kind === "premises" && /premises?|location|building/.test(title) || parsedTarget.kind === "item" && /\bitem\b|schedule|scheduled/.test(title) || parsedTarget.kind === "section" && containsTarget(title, parsedTarget.normalized);
6516
- if (matchesKind) {
6517
- const range = pageRangeFrom(section.pageStart, section.pageEnd);
6518
- if (range) return range;
6519
- }
6520
- }
6521
- return void 0;
6522
- }
6523
- function decideReferentialResolutionAction(params) {
6524
- if (params.localPageRange) {
6525
- return { kind: "lookup_pages", source: "local", pageRange: params.localPageRange };
6526
- }
6527
- const parsedTarget = parseReferentialTarget(params.referenceTarget);
6528
- const declarationsScheduleRange = findDeclarationsSchedulePages(parsedTarget, params.formInventory);
6529
- if (declarationsScheduleRange) {
6530
- return {
6531
- kind: "lookup_pages",
6532
- source: "declarations_schedule",
6533
- pageRange: declarationsScheduleRange
6534
- };
6535
- }
6536
- const sectionRange = findSectionPages(parsedTarget, params.sections);
6537
- if (sectionRange) {
6538
- return { kind: "lookup_pages", source: "sections", pageRange: sectionRange };
6539
- }
6540
- if (parsedTarget.kind === "unknown") {
6541
- return { kind: "skip", reason: "no concrete reference target" };
6542
- }
6543
- return { kind: "page_location" };
6544
- }
6545
-
6546
6439
  // src/extraction/resolve-referential.ts
6547
6440
  function formatDoclingTextContext(providerOptions) {
6548
6441
  const doclingText = providerOptions?.doclingText;
@@ -6555,24 +6448,7 @@ ${doclingText}`;
6555
6448
  function parseReferenceTarget(text) {
6556
6449
  if (typeof text !== "string") return void 0;
6557
6450
  const normalized = text.trim();
6558
- if (!normalized) return void 0;
6559
- const sectionMatch = normalized.match(/\b(Section\s+\d+[A-Za-z]?)/i);
6560
- if (sectionMatch) return sectionMatch[1];
6561
- const itemMatch = normalized.match(/\b(Item\s+\d+[A-Za-z]?)/i);
6562
- if (itemMatch) return itemMatch[1];
6563
- const premisesMatch = normalized.match(/\b(Premises?(?:\s+No\.?\s*\d+[A-Za-z]?|\s+\d+[A-Za-z]?)?)/i);
6564
- if (premisesMatch) return premisesMatch[1].trim();
6565
- if (/declarations/i.test(normalized)) return "Declarations";
6566
- const scheduleMatch = normalized.match(/\b(Schedule(?:\s+of\s+[A-Za-z ]+)?)/i);
6567
- if (scheduleMatch) return scheduleMatch[1].trim();
6568
- const asStatedMatch = normalized.match(/(?:as\s+stated\s+in|see|shown\s+in(?:\s+the)?)\s+(.+)/i);
6569
- if (asStatedMatch) {
6570
- let target = asStatedMatch[1].trim().replace(/\s+of\s+the\s+policy$/i, "").trim();
6571
- target = target.replace(/\.+$/, "").trim();
6572
- if (target) return target;
6573
- }
6574
- if (/if applicable/i.test(normalized)) return void 0;
6575
- return void 0;
6451
+ return normalized || void 0;
6576
6452
  }
6577
6453
  var PageLocationSchema = z40.object({
6578
6454
  startPage: z40.number(),
@@ -6581,8 +6457,6 @@ var PageLocationSchema = z40.object({
6581
6457
  async function findReferencedPages(params) {
6582
6458
  const {
6583
6459
  referenceTarget,
6584
- sections,
6585
- formInventory,
6586
6460
  pdfInput,
6587
6461
  pageCount,
6588
6462
  generateObject,
@@ -6592,29 +6466,6 @@ async function findReferencedPages(params) {
6592
6466
  modelBudgetConstraints,
6593
6467
  log
6594
6468
  } = params;
6595
- const localPageRange = findLocalReferentialPages({
6596
- referenceTarget,
6597
- sections,
6598
- formInventory
6599
- });
6600
- const action = decideReferentialResolutionAction({
6601
- referenceTarget,
6602
- sections,
6603
- formInventory,
6604
- localPageRange
6605
- });
6606
- if (action.kind === "lookup_pages") {
6607
- await log?.(
6608
- `Referential target "${referenceTarget}" resolved to pages ${action.pageRange.startPage}-${action.pageRange.endPage} via ${action.source}.`
6609
- );
6610
- return action.pageRange;
6611
- }
6612
- if (action.kind === "skip") {
6613
- await log?.(
6614
- `Skipping referential target "${referenceTarget}": ${action.reason}.`
6615
- );
6616
- return void 0;
6617
- }
6618
6469
  try {
6619
6470
  const budget = resolveModelBudget({
6620
6471
  taskKind: "extraction_referential_lookup",
@@ -6693,7 +6544,7 @@ async function resolveReferentialCoverages(params) {
6693
6544
  const referentialCoverages = coverages.filter((cov) => {
6694
6545
  const limitType = cov.limitValueType;
6695
6546
  const deductibleType = cov.deductibleValueType;
6696
- return limitType === "referential" || limitType === "as_stated" || deductibleType === "referential" || deductibleType === "as_stated" || looksReferential(cov.limit) || looksReferential(cov.deductible);
6547
+ return limitType === "referential" || limitType === "as_stated" || deductibleType === "referential" || deductibleType === "as_stated";
6697
6548
  });
6698
6549
  const attempts = referentialCoverages.length;
6699
6550
  if (attempts === 0) {
@@ -6711,9 +6562,9 @@ async function resolveReferentialCoverages(params) {
6711
6562
  const targetGroups = /* @__PURE__ */ new Map();
6712
6563
  for (let i = 0; i < referentialCoverages.length; i++) {
6713
6564
  const cov = referentialCoverages[i];
6714
- const refString = (looksReferential(cov.limit) ? cov.limit : void 0) ?? (looksReferential(cov.deductible) ? cov.deductible : void 0) ?? cov.limit ?? "";
6565
+ const refString = cov.limit ?? "";
6715
6566
  const sectionRef = typeof cov.sectionRef === "string" ? cov.sectionRef : "";
6716
- const parsedTarget = parseReferenceTarget(refString) ?? parseReferenceTarget(sectionRef) ?? sectionRef;
6567
+ const parsedTarget = sectionRef || parseReferenceTarget(refString);
6717
6568
  const target = parsedTarget || "unknown";
6718
6569
  const group = targetGroups.get(target) ?? [];
6719
6570
  group.push({ coverage: cov, index: i });
@@ -6807,8 +6658,8 @@ async function resolveReferentialCoverages(params) {
6807
6658
  unresolved++;
6808
6659
  continue;
6809
6660
  }
6810
- const limitResolved = rc.resolvedLimit && rc.resolvedLimitValueType !== "referential" && rc.resolvedLimitValueType !== "as_stated" && !looksReferential(rc.resolvedLimit);
6811
- const deductibleResolved = rc.resolvedDeductible && rc.resolvedDeductibleValueType !== "referential" && rc.resolvedDeductibleValueType !== "as_stated" && !looksReferential(rc.resolvedDeductible);
6661
+ const limitResolved = rc.resolvedLimit && rc.resolvedLimitValueType !== "referential" && rc.resolvedLimitValueType !== "as_stated";
6662
+ const deductibleResolved = rc.resolvedDeductible && rc.resolvedDeductibleValueType !== "referential" && rc.resolvedDeductibleValueType !== "as_stated";
6812
6663
  if (limitResolved || deductibleResolved) {
6813
6664
  if (limitResolved) {
6814
6665
  coverage.limit = rc.resolvedLimit;
@@ -6987,6 +6838,13 @@ function shouldFailQualityGate(mode, status) {
6987
6838
  return mode === "strict" && status === "failed";
6988
6839
  }
6989
6840
 
6841
+ // src/extraction/heuristics.ts
6842
+ function looksCoveredReasonSection(section) {
6843
+ const title = String(section.title ?? "").toLowerCase();
6844
+ const type = String(section.type ?? "").toLowerCase();
6845
+ return type === "covered_reason" || title.includes("covered cause") || title.includes("covered reason") || title.includes("covered peril");
6846
+ }
6847
+
6990
6848
  // src/extraction/quality.ts
6991
6849
  function normalizeFormNumber(value) {
6992
6850
  if (typeof value !== "string") return void 0;
@@ -7025,6 +6883,20 @@ function sourcePrecedence(sectionRef) {
7025
6883
  if (normalized.includes("coverage form") || normalized.includes("policy form")) return 1;
7026
6884
  return 0;
7027
6885
  }
6886
+ function looksDeductibleOnlyCoverageRow(coverage) {
6887
+ const name = typeof coverage.name === "string" ? coverage.name : "";
6888
+ const originalContent = typeof coverage.originalContent === "string" ? coverage.originalContent : "";
6889
+ const evidenceText = originalContent || name;
6890
+ const normalizedEvidence = evidenceText.toLowerCase();
6891
+ const normalizedName = name.toLowerCase();
6892
+ if (!/\b(deductible|retention|self[-\s]?insured retention|sir)\b/.test(`${normalizedName} ${normalizedEvidence}`)) return false;
6893
+ if (coverage.deductible || coverage.deductibleAmount !== void 0) return false;
6894
+ if (!coverage.limit && coverage.limitAmount === void 0) return false;
6895
+ if (originalContent && /\b(deductible|retention|self[-\s]?insured retention|sir)\b/.test(normalizedEvidence) && !/\b(?:sub[-\s]?limit|limit|coverage)\b/.test(normalizedEvidence)) {
6896
+ return true;
6897
+ }
6898
+ return /[-–—]\s*(?:enhanced\s+|standard\s+)?(?:deductible|retention|sir)\b/.test(normalizedName);
6899
+ }
7028
6900
  function buildExtractionReviewReport(params) {
7029
6901
  const { memory, reviewRounds } = params;
7030
6902
  const deterministicIssues = [];
@@ -7130,6 +7002,17 @@ function buildExtractionReviewReport(params) {
7130
7002
  itemName: coverage.name
7131
7003
  });
7132
7004
  }
7005
+ if (looksDeductibleOnlyCoverageRow(coverage)) {
7006
+ deterministicIssues.push({
7007
+ code: "deductible_row_as_coverage_limit",
7008
+ severity: "blocking",
7009
+ message: `Coverage "${String(coverage.name ?? "unknown")}" appears to store a deductible or retention value as a coverage limit.`,
7010
+ extractorName: "coverage_limits",
7011
+ formNumber,
7012
+ pageNumber: typeof coverage.pageNumber === "number" ? coverage.pageNumber : void 0,
7013
+ itemName: typeof coverage.name === "string" ? coverage.name : void 0
7014
+ });
7015
+ }
7133
7016
  if (typeof coverage.pageNumber !== "number") {
7134
7017
  deterministicIssues.push({
7135
7018
  code: "coverage_missing_page_number",
@@ -7162,17 +7045,6 @@ function buildExtractionReviewReport(params) {
7162
7045
  itemName: typeof coverage.name === "string" ? coverage.name : void 0
7163
7046
  });
7164
7047
  }
7165
- if (looksReferential(coverage.limit) || looksReferential(coverage.deductible)) {
7166
- deterministicIssues.push({
7167
- code: "coverage_referential_value",
7168
- severity: "warning",
7169
- message: `Coverage "${String(coverage.name ?? "unknown")}" contains referential language instead of a concrete scheduled term.`,
7170
- extractorName: "coverage_limits",
7171
- formNumber,
7172
- pageNumber: typeof coverage.pageNumber === "number" ? coverage.pageNumber : void 0,
7173
- itemName: typeof coverage.name === "string" ? coverage.name : void 0
7174
- });
7175
- }
7176
7048
  if (formNumber && !inventory.has(formNumber)) {
7177
7049
  deterministicIssues.push({
7178
7050
  code: "coverage_form_missing_from_inventory",
@@ -7312,17 +7184,6 @@ function buildExtractionReviewReport(params) {
7312
7184
  itemName
7313
7185
  });
7314
7186
  }
7315
- if (looksReferential(content) || looksReferential(coveredReason.reason)) {
7316
- deterministicIssues.push({
7317
- code: "covered_reason_referential_value",
7318
- severity: "warning",
7319
- message: `Covered reason "${itemName}" contains referential language instead of the extracted covered cause wording.`,
7320
- extractorName: "covered_reasons",
7321
- formNumber: normalizeFormNumber(coveredReason.formNumber),
7322
- pageNumber: typeof coveredReason.pageNumber === "number" ? coveredReason.pageNumber : typeof coveredReason.pageStart === "number" ? coveredReason.pageStart : void 0,
7323
- itemName
7324
- });
7325
- }
7326
7187
  }
7327
7188
  for (const section of sections) {
7328
7189
  if (typeof section.content === "string" && section.content.trim().length < 120 && typeof section.pageStart === "number" && (!("pageEnd" in section) || section.pageEnd === section.pageStart || section.pageEnd === void 0)) {