@zerocarbon/erp-config-sdk 1.0.29 → 1.0.32

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.
@@ -31,6 +31,7 @@ const BULK_BILL_AGENT_PROFILES = {
31
31
  extractionRules: [
32
32
  'Prefer current-period bill-level or net billed consumption over charges, rates, TOD/slab rows, arrears, or historical meter rows.',
33
33
  'For grid import or purchased electricity, use current-period import/from-grid consumption.',
34
+ 'When a purchased grid electricity bill does not explicitly distinguish national vs regional grid, default the ERP mapping to Regional Grid; do not send it to review for that ambiguity alone.',
34
35
  'For solar or renewable electricity, use current-period generation or renewable energy consumption.',
35
36
  'Treat “units” as kWh only for electricity documents.',
36
37
  ],
@@ -260,6 +261,60 @@ const buildBulkBillAgentPromptConfig = (context = {}, documentText = '') => {
260
261
  },
261
262
  };
262
263
  };
264
+ const baseBulkBillAgentSystemPrompt = `You are a ZeroCarbon bulk bill processing agent running inside an open-ended tool harness.
265
+
266
+ You do not follow a fixed workflow. You maintain a workspace, inspect evidence, form hypotheses, revise them, and stop only when no useful tool call remains.
267
+
268
+ Non-negotiable extraction contract:
269
+ - First understand the document. For each bill/page group, stage pages and call classify_bill_group. The classify result records ERP compatibility; call check_erp_bill_compatibility only if compatibility is missing, stale, or needs revision before extracting or saving rows.
270
+ - A PDF can contain mixed bill types. Classify each bill group independently: electricity_bill, fuel_invoice, gas_invoice, material_invoice, purchase_order, or unknown. Never finalize after only the first incompatible bill in a multi-page PDF; inspect and classify every page or page group first.
271
+ - If a bill type is incompatible with the locked ERP page/allowed items, do not force mapping. Leave it for review with a clear reason.
272
+ - After compatibility is recorded, call extract_activity_candidates to get typed physical candidates. Use those candidates as evidence; do not extract random numbers from flat OCR text.
273
+ - If a specialized profile is listed below, treat it as the active sub-agent contract for this ERP page. Apply its extraction rules before generic extraction heuristics.
274
+ - If extract_activity_candidates returns recommendedRows for electricity, use those rows directly with save_extracted_rows unless you can cite a concrete validation problem. Do not replace deterministic recommended rows with review rows.
275
+ - Extract only physical activity rows: energy, mass, volume, distance, count only when the ERP item supports count-based activity. Do not extract vendor names, invoice labels, taxes, charges, payments, arrears, subtotals, or accounting metadata as items.
276
+ - For each candidate row, classify doubtful rows and search the locked ERP items before deciding to save or review.
277
+ - When more than one allowed ERP item can match, make an evidence-backed mapping decision when possible. In save_extracted_rows include matchedAllowedItemKey or matchedAllowedItemSourceId, matchedAllowedItemName, mappingConfidence from 0 to 1, mappingReason, and mappingSource.
278
+ - If OCR is partial, use neighboring rows, repeated labels, row evidence, typed candidates, and ERP context to repair the candidate. Keep raw evidence in rowEvidenceText.
279
+ - For electricity or any ambiguous utility bill, call select_activity_quantity on staged bill pages before save_extracted_rows. Prefer bill-level/billing consumption for generic grid bills. If the allowed ERP item is explicitly grid import/purchased electricity, use the current-period import/from-grid kWh row; if it is solar/renewable energy, use the current-period solar/generation kWh row. Do not use TOD, slab, charge, amount, rate, date, register, or historical rows. Never switch to a weaker component only to match ERP unit.
280
+ - Never persist just because a row exists. Persist only rows that pass document type, ERP compatibility, evidence, unit, quantity, ERP-context, and duplicate/aggregation sanity.
281
+ - It is acceptable to call the same tool multiple times with repaired inputs. It is acceptable to revise groups and rows.
282
+ - If a group cannot be safely extracted or mapped, call save_review_rows with source pages, evidence, and a clear reason instead of saving an incomplete normal row.
283
+ - Use persist_validated_rows after validation. If there are only review rows, still use persist_validated_rows so the backend can create the review PDF/email. Use finalize_bill_job only after all useful rows are persisted or intentionally left for review; its outcome must be exactly one of completed, review_required, or failed.
284
+ - Do not invent emission factors, quantities, units, invoice numbers, or page evidence.
285
+
286
+ Your output to the user is the job state and streamed tool activity, so keep tool arguments and notes specific and evidence-backed.`;
287
+ const promptBulletList = (items) => items.map((item) => `- ${item}`).join('\n');
288
+ const buildBulkBillAgentSystemPrompt = (context = {}, documentText = '') => {
289
+ const config = buildBulkBillAgentPromptConfig(context, documentText);
290
+ const allowedItems = config.allowedItemSummaries.slice(0, 40);
291
+ return `${baseBulkBillAgentSystemPrompt}
292
+
293
+ Active ERP extraction sub-agent contract:
294
+ Profile: ${config.profile.label} (${config.profile.id})
295
+ Description: ${config.profile.description}
296
+ Expected document types: ${config.profile.documentTypes.join(', ') || 'not specified'}
297
+ Preferred units: ${config.profile.preferredUnits.join(', ') || 'not specified'}
298
+
299
+ Upload context:
300
+ - Scope: ${config.uploadContext.scope || 'not specified'}
301
+ - Category: ${config.uploadContext.category || 'not specified'}
302
+ - Plant: ${config.uploadContext.plant || 'not specified'}
303
+
304
+ Critical document-period rule:
305
+ - Do not assume the upload period is the bill period. Extract invoice dates, bill period, and quantity period from document evidence. Use upload context only when the document truly has no period evidence.
306
+
307
+ Category-specific extraction rules:
308
+ ${promptBulletList(config.profile.extractionRules)}
309
+
310
+ Category-specific reject rules:
311
+ ${promptBulletList(config.profile.rejectRules)}
312
+
313
+ Allowed ERP items for this upload (${config.allowedItemCount} total, first ${allowedItems.length} shown):
314
+ ${promptBulletList(allowedItems)}
315
+
316
+ Follow this profile unless page evidence clearly proves a different bill type; if evidence conflicts with the ERP page, send rows to review instead of forcing a mapping.`;
317
+ };
263
318
  const numericPattern = /-?(?:(?:\d{1,3}(?:,\d{3})+)|\d+)(?:\.\d+)?/g;
264
319
  const physicalUnitPattern = /\b(kwh|kw\s*h|kvah|kva\s*h|mwh|kg|kgs|kilograms?|tonnes?|tons?|mt|kl|litres?|liters?|ltr?s?|m3|m³|scm|ncm|nm3|km|passenger[-\s]?km|room[-\s]?nights?|nights?|cyl(?:inders?)?|nos?|pcs|pieces?)\b/i;
265
320
  const metadataOnlyPattern = /(?:₹|rs\.?|inr|amount|payable|charge|tax|gst|duty|cess|rate|tariff|arrear|rebate|subsidy|surcharge|rent|total\s+amount|invoice\s*(?:no|number)|account\s*(?:no|number)|consumer\s*(?:no|number))/i;
@@ -609,9 +664,109 @@ const extractBulkBillAgentProfileCandidates = ({ mappingContext = {}, pages = []
609
664
  })
610
665
  .slice(0, 30);
611
666
  };
667
+ const buildBulkBillAgentRouterPrompt = (context = {}, documentText = '') => {
668
+ const config = buildBulkBillAgentPromptConfig(context, documentText);
669
+ return `You are the ZeroCarbon bulk bill router and grouping supervisor.
670
+
671
+ Your only job is to prepare worker-ready bill groups.
672
+
673
+ Responsibilities:
674
+ - inspect the ERP page context and allowed items
675
+ - load document metadata
676
+ - read OCR text in batches for the whole document
677
+ - fingerprint pages when useful
678
+ - compare neighboring page boundaries when useful
679
+ - stage bill groups
680
+ - classify each staged group
681
+ - record ERP compatibility for each staged group
682
+
683
+ Do not extract quantities, do not save extracted rows, do not validate rows, and do not persist rows.
684
+
685
+ Stop once every page is read and every staged group has both:
686
+ - a document classification
687
+ - an ERP compatibility decision
688
+
689
+ Locked ERP page context:
690
+ - profile: ${config.profile.label} (${config.profile.id})
691
+ - scope: ${config.uploadContext.scope || 'not specified'}
692
+ - category: ${config.uploadContext.category || 'not specified'}
693
+ - plant: ${config.uploadContext.plant || 'not specified'}
694
+
695
+ Allowed ERP items on this page (${config.allowedItemCount} total):
696
+ ${promptBulletList(config.allowedItemSummaries.slice(0, 30))}
697
+
698
+ If the document appears to contain multiple bills or mixed bill types, stage separate groups. If one page is a summary/control sheet and other pages are supplier invoices, keep them in separate groups.`;
699
+ };
700
+ const buildBulkBillAgentWorkerPrompt = ({ mappingContext = {}, groupId, pageNumbers, documentType = 'unknown', documentText = '', }) => {
701
+ const config = buildBulkBillAgentPromptConfig(mappingContext, documentText);
702
+ return `You are the ZeroCarbon ${config.profile.label} worker for one staged bill group.
703
+
704
+ You must only work on:
705
+ - groupId: ${groupId}
706
+ - pages: ${pageNumbers.join(', ')}
707
+ - classified document type: ${documentType}
708
+
709
+ Your job:
710
+ - inspect only this group's evidence
711
+ - extract physical activity candidates for this group
712
+ - repair OCR issues when evidence supports it
713
+ - search/inspect the locked ERP items for this group
714
+ - save extracted rows for this group
715
+ - save review rows for this group when a safe normal row cannot be produced
716
+
717
+ Do not regroup the document. Do not validate all rows across the whole job. Do not persist validated rows. Do not finalize the whole job.
718
+
719
+ Active extraction profile:
720
+ - profile: ${config.profile.label} (${config.profile.id})
721
+ - scope: ${config.uploadContext.scope || 'not specified'}
722
+ - category: ${config.uploadContext.category || 'not specified'}
723
+ - plant: ${config.uploadContext.plant || 'not specified'}
724
+
725
+ Category-specific extraction rules:
726
+ ${promptBulletList(config.profile.extractionRules)}
727
+
728
+ Category-specific reject rules:
729
+ ${promptBulletList(config.profile.rejectRules)}
730
+
731
+ Allowed ERP items for this worker (${config.allowedItemCount} total):
732
+ ${promptBulletList(config.allowedItemSummaries.slice(0, 30))}
733
+
734
+ Critical rules:
735
+ - never save rows for any other group
736
+ - never use another group's page evidence
737
+ - if the group is incompatible with the ERP page, save review rows instead of forcing mapping
738
+ - if the document has its own dates or period, use those instead of upload context`;
739
+ };
740
+ const buildBulkBillAgentFinalizerPrompt = (context = {}, documentText = '') => {
741
+ const config = buildBulkBillAgentPromptConfig(context, documentText);
742
+ return `You are the ZeroCarbon finalizer and persistence worker.
743
+
744
+ Your only job is to:
745
+ - inspect the current workspace state
746
+ - validate extracted rows against locked ERP items
747
+ - persist validated rows to the backend
748
+ - finalize the job with the correct outcome
749
+
750
+ Do not read more pages. Do not restage groups. Do not perform new extraction unless there is a critical gap that prevents safe finalization.
751
+
752
+ Active ERP page:
753
+ - profile: ${config.profile.label} (${config.profile.id})
754
+ - scope: ${config.uploadContext.scope || 'not specified'}
755
+ - category: ${config.uploadContext.category || 'not specified'}
756
+
757
+ Finalize rules:
758
+ - use outcome completed when backend persistence succeeded, no review rows remain, and backend returned no blocking review/conflict rows
759
+ - backend skipped duplicates are non-blocking if the mapped row was otherwise persisted or intentionally skipped as a duplicate
760
+ - use outcome review_required when review rows remain or backend returned blocking review/conflict rows
761
+ - use outcome failed only for unrecoverable execution errors`;
762
+ };
612
763
 
613
764
  exports.BULK_BILL_AGENT_PROFILES = BULK_BILL_AGENT_PROFILES;
765
+ exports.buildBulkBillAgentFinalizerPrompt = buildBulkBillAgentFinalizerPrompt;
614
766
  exports.buildBulkBillAgentPromptConfig = buildBulkBillAgentPromptConfig;
767
+ exports.buildBulkBillAgentRouterPrompt = buildBulkBillAgentRouterPrompt;
768
+ exports.buildBulkBillAgentSystemPrompt = buildBulkBillAgentSystemPrompt;
769
+ exports.buildBulkBillAgentWorkerPrompt = buildBulkBillAgentWorkerPrompt;
615
770
  exports.extractBulkBillAgentProfileCandidates = extractBulkBillAgentProfileCandidates;
616
771
  exports.getBulkBillAgentProfile = getBulkBillAgentProfile;
617
772
  exports.getBulkBillAgentProfilesForMappingContext = getBulkBillAgentProfilesForMappingContext;
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-bill-agent.js","sources":["../src/config/bulk-bill-agent.ts"],"sourcesContent":["export type BulkBillAgentProfileId =\n | 'electricity'\n | 'fuel_combustion'\n | 'refrigerants'\n | 'industrial_gases'\n | 'employee_commuting'\n | 'business_travel'\n | 'lpg_usage'\n | 'fire_extinguisher'\n | 'sf6_usage'\n | 'water'\n | 'waste'\n | 'purchased_goods'\n | 'process_emissions'\n | 'generic_material';\n\nexport interface BulkBillAgentAllowedItem {\n itemKey?: string;\n sourceId?: string;\n itemName?: string;\n billCategory?: string;\n billSubCategory?: string;\n billNestedSubCategory?: string;\n billType?: string;\n unit?: string;\n emissionFactor?: number;\n requiresMassData?: boolean;\n}\n\nexport interface BulkBillAgentMappingContext {\n locked?: boolean;\n scope?: string;\n category?: string;\n route?: string;\n plant?: string;\n year?: number | string;\n month?: number | string;\n yearType?: string;\n allowedItems?: BulkBillAgentAllowedItem[];\n}\n\nexport interface BulkBillAgentProfile {\n id: BulkBillAgentProfileId;\n label: string;\n description: string;\n documentTypes: string[];\n itemSignals: string[];\n documentSignals: string[];\n preferredUnits: string[];\n extractionRules: string[];\n rejectRules: string[];\n}\n\nexport interface BulkBillAgentPromptConfig {\n profile: BulkBillAgentProfile;\n allowedItemCount: number;\n allowedItemSummaries: string[];\n uploadContext: {\n scope: string;\n category: string;\n plant: string;\n year: string;\n month: string;\n yearType: string;\n route: string;\n };\n}\n\nconst normalize = (value: unknown) =>\n String(value ?? '')\n .toLowerCase()\n .replace(/co₂/g, 'co2')\n .replace(/[^a-z0-9]+/g, ' ')\n .trim();\n\nconst includesAny = (text: string, signals: readonly string[]) =>\n signals.some((signal) => text.includes(signal));\n\nconst itemText = (item: BulkBillAgentAllowedItem) =>\n normalize([\n item.itemName,\n item.billCategory,\n item.billSubCategory,\n item.billNestedSubCategory,\n item.billType,\n item.unit,\n ].filter(Boolean).join(' '));\n\nconst mappingContextText = (context: BulkBillAgentMappingContext = {}) =>\n normalize([\n context.scope,\n context.category,\n ...(Array.isArray(context.allowedItems) ? context.allowedItems.map(itemText) : []),\n ].filter(Boolean).join(' '));\n\nexport const BULK_BILL_AGENT_PROFILES: Record<BulkBillAgentProfileId, BulkBillAgentProfile> = {\n electricity: {\n id: 'electricity',\n label: 'Electricity',\n description: 'Grid electricity, renewable electricity, kWh/kVAh/MWh utility bills.',\n documentTypes: ['electricity_bill'],\n itemSignals: ['electric', 'electricity', 'grid', 'renewable', 'solar', 'power', 'kwh', 'kvah', 'mwh', 'location based', 'market based', 'purchased electricity'],\n documentSignals: ['kwh', 'kvah', 'mwh', 'meter', 'discom', 'vidyut', 'billed units', 'net consumption', 'energy charge'],\n preferredUnits: ['kWh', 'kVAh', 'MWh'],\n extractionRules: [\n 'Prefer current-period bill-level or net billed consumption over charges, rates, TOD/slab rows, arrears, or historical meter rows.',\n 'For grid import or purchased electricity, use current-period import/from-grid consumption.',\n 'For solar or renewable electricity, use current-period generation or renewable energy consumption.',\n 'Treat “units” as kWh only for electricity documents.',\n ],\n rejectRules: ['Reject taxes, demand/fixed charges, tariff/rate rows, previous readings, arrears, and currency amounts.'],\n },\n fuel_combustion: {\n id: 'fuel_combustion',\n label: 'Fuel combustion',\n description: 'Diesel, HSD, petrol, furnace oil, coal, coke, CNG and other stationary/mobile combustion fuels.',\n documentTypes: ['fuel_invoice', 'material_invoice'],\n itemSignals: ['diesel', 'hsd', 'petrol', 'fuel', 'furnace oil', 'coal', 'coke', 'cng', 'kerosene', 'ldo', 'mobile combustion', 'stationary combustion', 'operation'],\n documentSignals: ['diesel', 'hsd', 'petrol', 'fuel', 'litre', 'liter', 'kl', 'furnace oil', 'coal', 'petcoke', 'cng'],\n preferredUnits: ['KL', 'Litre', 'Kg', 'Tonnes', 'M3', 'SCM'],\n extractionRules: [\n 'Extract physical fuel quantity, not invoice amount or rate.',\n 'Map vehicle fuel rows to mobile combustion items and generator/boiler/process fuel rows to stationary or operation items when the evidence supports it.',\n 'Preserve the bill unit; unit conversion belongs to validation unless the document states density or conversion explicitly.',\n ],\n rejectRules: ['Reject fuel rates, taxes, HSN/SAC codes, payment totals, and non-fuel services.'],\n },\n refrigerants: {\n id: 'refrigerants',\n label: 'Refrigerants',\n description: 'AC gas and refrigerant purchases/refills such as R-410A, R-32, R-134a, R-22.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['refrigerant', 'refrigerants', 'r 410', 'r410', 'r 32', 'r32', 'r 134', 'r134', 'r 22', 'r22', 'hfc', 'ac gas', 'chiller'],\n documentSignals: ['refrigerant', 'r 410', 'r410', 'r 32', 'r32', 'r 134', 'r134', 'r 22', 'r22', 'ac gas', 'chiller gas'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: [\n 'Extract refrigerant top-up, refill, or purchase quantity by refrigerant grade.',\n 'Repair OCR variants like R410, R-410, R 410A, R-410 A to the closest allowed ERP item.',\n 'Do not infer leakage; only extract documented physical quantity.',\n ],\n rejectRules: ['Reject service charges, labour, AC unit model numbers, invoice totals, and taxes.'],\n },\n industrial_gases: {\n id: 'industrial_gases',\n label: 'Industrial gases',\n description: 'Oxygen, CO2, nitrogen, argon, acetylene and cylinder gas invoices.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['oxygen', 'o2', 'co2', 'carbon dioxide', 'nitrogen', 'argon', 'acetylene', 'gas cylinder', 'industrial gas', 'welding'],\n documentSignals: ['oxygen', 'o2 gas', 'co2 gas', 'nitrogen', 'argon', 'acetylene', 'cylinder', 'scm', 'nm3', 'm3'],\n preferredUnits: ['M3', 'SCM', 'NM3', 'Kg', 'Cyl'],\n extractionRules: [\n 'Extract gas quantity from row-level item quantity, not cylinder deposit, rental, or amount.',\n 'Keep cylinder count only when the ERP item unit supports count-based activity.',\n 'Repair OCR variants such as 02/O2 and C02/CO2 using allowed ERP items.',\n ],\n rejectRules: ['Reject cylinder deposits, rent, returnable assets, rates, taxes, and empty cylinder rows.'],\n },\n employee_commuting: {\n id: 'employee_commuting',\n label: 'Employee commuting',\n description: 'Employee commute rosters and distance summaries grouped by transport mode.',\n documentTypes: ['transport_roster', 'material_invoice'],\n itemSignals: ['employee commuting', 'commute', 'commuting', 'motorcycle', 'scooter', 'hatchback', 'car', 'rail', 'train', 'metro', 'bus', 'cycle', 'passenger km'],\n documentSignals: ['employee', 'transport', 'mode', 'commute', 'bike', 'scooty', 'car', 'metro', 'bus', 'cycle', 'km'],\n preferredUnits: ['km', 'passenger-km'],\n extractionRules: [\n 'Treat roster files as activity evidence even when they have no invoice number, supplier, or amount.',\n 'Group by transport mode and sum current-period distance into one row per mapped ERP item.',\n 'Use the upload period as the bill period when the roster has no date.',\n ],\n rejectRules: ['Reject employee IDs, names, phone numbers, addresses, and non-distance row counts as activity quantities.'],\n },\n business_travel: {\n id: 'business_travel',\n label: 'Business travel',\n description: 'Flights, rail, hotel stays, and rental vehicle activity.',\n documentTypes: ['travel_invoice', 'material_invoice'],\n itemSignals: ['business travel', 'flight', 'air travel', 'rail', 'train', 'hotel', 'rental car', 'passenger km', 'room night'],\n documentSignals: ['flight', 'airline', 'pnr', 'hotel', 'room night', 'train', 'rail', 'passenger km', 'ticket'],\n preferredUnits: ['km', 'passenger-km', 'night', 'room-night'],\n extractionRules: ['Extract distance, passenger-km, room nights, or trip counts only when the ERP item supports the unit.'],\n rejectRules: ['Reject fares, taxes, booking fees, passenger names, and ticket numbers as activity quantities.'],\n },\n lpg_usage: {\n id: 'lpg_usage',\n label: 'LPG usage',\n description: 'LPG cylinder and bulk LPG invoices.',\n documentTypes: ['fuel_invoice', 'gas_invoice', 'material_invoice'],\n itemSignals: ['lpg', 'liquefied petroleum gas', 'cylinder'],\n documentSignals: ['lpg', 'liquefied petroleum', 'cylinder', 'kg', 'commercial gas'],\n preferredUnits: ['Kg', 'Tonnes', 'KL', 'Cyl'],\n extractionRules: ['Extract filled LPG quantity by kg/tonnes/KL/cylinder size; prefer net fill quantity over cylinder deposit count.'],\n rejectRules: ['Reject cylinder deposits, rental, delivery charges, and taxes.'],\n },\n fire_extinguisher: {\n id: 'fire_extinguisher',\n label: 'Fire extinguisher refilling',\n description: 'CO2 and other extinguisher refill activity.',\n documentTypes: ['material_invoice'],\n itemSignals: ['fire extinguisher', 'extinguisher', 'co2 fire', 'refilling'],\n documentSignals: ['fire extinguisher', 'extinguisher', 'co2', 'refill', 'refilling'],\n preferredUnits: ['Kg', 'Tonnes', 'Cyl'],\n extractionRules: ['Extract refill gas quantity, not extinguisher asset count unless the ERP item is count-based.'],\n rejectRules: ['Reject maintenance service charges, inspection fees, and asset serial numbers.'],\n },\n sf6_usage: {\n id: 'sf6_usage',\n label: 'SF6 usage',\n description: 'SF6 gas purchase, refill, and switchgear top-up activity.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['sf6', 'sulfur hexafluoride', 'sulphur hexafluoride'],\n documentSignals: ['sf6', 'sulfur hexafluoride', 'sulphur hexafluoride', 'switchgear'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: ['Extract documented SF6 purchase/refill/top-up quantity only.'],\n rejectRules: ['Reject switchgear model numbers, pressure readings without refill quantity, and service charges.'],\n },\n water: {\n id: 'water',\n label: 'Water',\n description: 'Municipal, borewell, tanker, and wastewater quantities.',\n documentTypes: ['water_bill', 'material_invoice'],\n itemSignals: ['water', 'groundwater', 'municipal', 'tanker', 'wastewater', 'effluent'],\n documentSignals: ['water', 'kl', 'litre', 'liter', 'tanker', 'municipal', 'wastewater', 'effluent'],\n preferredUnits: ['KL', 'Litre', 'M3'],\n extractionRules: ['Extract physical water volume by source/disposal type where possible.'],\n rejectRules: ['Reject water charges, sewerage taxes, arrears, and meter numbers as quantities.'],\n },\n waste: {\n id: 'waste',\n label: 'Waste generated in operations',\n description: 'Waste disposal, recycling, composting, landfill, hazardous/non-hazardous waste.',\n documentTypes: ['waste_invoice', 'material_invoice'],\n itemSignals: ['waste', 'landfill', 'recycl', 'compost', 'hazardous', 'scrap', 'disposal'],\n documentSignals: ['waste', 'landfill', 'recycl', 'compost', 'hazardous', 'scrap', 'disposal', 'kg', 'tonne'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: ['Extract disposed/recycled physical waste mass by waste type and treatment route.'],\n rejectRules: ['Reject disposal fees, GST, container rental, and vehicle numbers.'],\n },\n purchased_goods: {\n id: 'purchased_goods',\n label: 'Purchased goods and services',\n description: 'Raw materials, consumables, and purchased product quantities.',\n documentTypes: ['material_invoice', 'purchase_order'],\n itemSignals: ['purchased goods', 'goods', 'services', 'material', 'raw material', 'consumable', 'packaging'],\n documentSignals: ['invoice', 'tax invoice', 'hsn', 'material', 'goods', 'quantity', 'qty', 'purchase order'],\n preferredUnits: ['Kg', 'Tonnes', 'Litre', 'KL', 'M3', 'Nos'],\n extractionRules: ['Extract row-level material quantity only when the item maps to an allowed ERP item.'],\n rejectRules: ['Reject rates, taxes, HSN/SAC codes, payment terms, and unmatched non-emission materials.'],\n },\n process_emissions: {\n id: 'process_emissions',\n label: 'Process emissions',\n description: 'Cement clinker calcination, ironmaking/steelmaking, flux calcination and other process quantities.',\n documentTypes: ['production_log', 'material_invoice'],\n itemSignals: ['calcination', 'clinker', 'ironmaking', 'steelmaking', 'flux', 'process emissions', 'hot metal', 'limestone', 'dolomite'],\n documentSignals: ['clinker', 'calcination', 'limestone', 'dolomite', 'hot metal', 'steelmaking', 'production', 'tonne'],\n preferredUnits: ['Tonnes', 'Kg'],\n extractionRules: ['Extract production/process input quantity tied to the selected process item.'],\n rejectRules: ['Reject financial totals, quality percentages, and composition values unless explicitly configured as activity data.'],\n },\n generic_material: {\n id: 'generic_material',\n label: 'Generic material invoice',\n description: 'Fallback for material invoices that do not fit a narrower profile.',\n documentTypes: ['material_invoice', 'purchase_order', 'unknown'],\n itemSignals: ['material', 'goods', 'services', 'quantity', 'qty'],\n documentSignals: ['invoice', 'quantity', 'qty', 'unit', 'hsn', 'sac'],\n preferredUnits: ['Kg', 'Tonnes', 'Litre', 'KL', 'M3', 'Nos'],\n extractionRules: ['Extract only row-level physical quantities that can be matched to allowed ERP items.'],\n rejectRules: ['Reject invoice metadata, rates, taxes, totals, and unmatched rows.'],\n },\n};\n\nconst ROUTING_PRIORITY: BulkBillAgentProfileId[] = [\n 'electricity',\n 'employee_commuting',\n 'refrigerants',\n 'sf6_usage',\n 'fire_extinguisher',\n 'lpg_usage',\n 'industrial_gases',\n 'fuel_combustion',\n 'business_travel',\n 'water',\n 'waste',\n 'process_emissions',\n 'purchased_goods',\n 'generic_material',\n];\n\nexport const getBulkBillAgentProfile = (profileId: BulkBillAgentProfileId) =>\n BULK_BILL_AGENT_PROFILES[profileId];\n\nexport const listBulkBillAgentProfiles = () =>\n ROUTING_PRIORITY.map((profileId) => BULK_BILL_AGENT_PROFILES[profileId]);\n\nexport const scoreBulkBillAgentProfile = (\n profile: BulkBillAgentProfile,\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const contextText = mappingContextText(context);\n const docText = normalize(documentText);\n const allowedItems = Array.isArray(context.allowedItems) ? context.allowedItems : [];\n const itemMatches = allowedItems.filter((item) => includesAny(itemText(item), profile.itemSignals)).length;\n const contextMatch = includesAny(contextText, profile.itemSignals) ? 2 : 0;\n const categoryMatch = includesAny(normalize(context.category), profile.itemSignals) ? 3 : 0;\n const documentMatch = docText && includesAny(docText, profile.documentSignals) ? 2 : 0;\n const unitMatch = allowedItems.filter((item) => includesAny(normalize(item.unit), profile.preferredUnits.map(normalize))).length;\n return itemMatches * 3 + unitMatch + contextMatch + categoryMatch + documentMatch;\n};\n\nexport const getBulkBillAgentProfilesForMappingContext = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const scored = ROUTING_PRIORITY\n .map((profileId) => {\n const profile = BULK_BILL_AGENT_PROFILES[profileId];\n return { profile, score: scoreBulkBillAgentProfile(profile, context, documentText) };\n })\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score);\n\n return scored.length ? scored : [{ profile: BULK_BILL_AGENT_PROFILES.generic_material, score: 0 }];\n};\n\nexport const getPrimaryBulkBillAgentProfile = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => getBulkBillAgentProfilesForMappingContext(context, documentText)[0].profile;\n\nconst formatAllowedItem = (item: BulkBillAgentAllowedItem) => {\n const hierarchy = [item.billCategory, item.billSubCategory, item.billNestedSubCategory]\n .filter(Boolean)\n .join(' > ');\n return `${item.itemName || item.billNestedSubCategory || 'Unnamed item'}${hierarchy ? ` (${hierarchy})` : ''}; expected unit: ${item.unit || 'not specified'}; key: ${item.itemKey || item.sourceId || 'not specified'}`;\n};\n\nexport const buildBulkBillAgentPromptConfig = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n): BulkBillAgentPromptConfig => {\n const profile = getPrimaryBulkBillAgentProfile(context, documentText);\n const allowedItems = Array.isArray(context.allowedItems) ? context.allowedItems : [];\n return {\n profile,\n allowedItemCount: allowedItems.length,\n allowedItemSummaries: allowedItems.map(formatAllowedItem),\n uploadContext: {\n scope: String(context.scope || ''),\n category: String(context.category || ''),\n plant: String(context.plant || ''),\n year: String(context.year || ''),\n month: String(context.month || ''),\n yearType: String(context.yearType || ''),\n route: String(context.route || ''),\n },\n };\n};\n\nexport interface BulkBillAgentProfilePage {\n pageNumber: number | string;\n text?: string;\n}\n\nexport interface BulkBillAgentProfileGroup {\n groupId: string;\n pageNumbers: Array<number | string>;\n}\n\nexport interface BulkBillAgentProfileCandidate {\n candidateId: string;\n groupId: string;\n profileId: BulkBillAgentProfileId;\n itemName: string;\n quantity: string;\n unit: string;\n role: string;\n confidence: number;\n pageNumber: number;\n evidenceText: string;\n matchedAllowedItemName?: string;\n matchedAllowedItemKey?: string;\n matchedAllowedItemSourceId?: string;\n mappingConfidence?: number;\n}\n\nexport interface BulkBillAgentProfileExtractionInput {\n mappingContext?: BulkBillAgentMappingContext;\n pages?: BulkBillAgentProfilePage[];\n group: BulkBillAgentProfileGroup;\n documentText?: string;\n}\n\nconst numericPattern = /-?(?:(?:\\d{1,3}(?:,\\d{3})+)|\\d+)(?:\\.\\d+)?/g;\nconst physicalUnitPattern = /\\b(kwh|kw\\s*h|kvah|kva\\s*h|mwh|kg|kgs|kilograms?|tonnes?|tons?|mt|kl|litres?|liters?|ltr?s?|m3|m³|scm|ncm|nm3|km|passenger[-\\s]?km|room[-\\s]?nights?|nights?|cyl(?:inders?)?|nos?|pcs|pieces?)\\b/i;\nconst metadataOnlyPattern = /(?:₹|rs\\.?|inr|amount|payable|charge|tax|gst|duty|cess|rate|tariff|arrear|rebate|subsidy|surcharge|rent|total\\s+amount|invoice\\s*(?:no|number)|account\\s*(?:no|number)|consumer\\s*(?:no|number))/i;\n\nconst compactKey = (value: unknown) => normalize(value).replace(/\\s+/g, '');\n\nconst canonicalActivityUnit = (unit: string) => {\n const value = compactKey(unit);\n if (value === 'kwh' || value === 'unit' || value === 'units') return 'kWh';\n if (value === 'kvah') return 'kVAh';\n if (value === 'mwh') return 'MWh';\n if (value === 'kg' || value === 'kgs' || value === 'kilogram' || value === 'kilograms') return 'Kg';\n if (value === 'tonne' || value === 'tonnes' || value === 'ton' || value === 'tons' || value === 'mt') return 'Tonnes';\n if (value === 'litre' || value === 'litres' || value === 'liter' || value === 'liters' || value === 'ltr' || value === 'ltrs') return 'Litre';\n if (value === 'kl') return 'KL';\n if (value === 'm3' || value === 'm³' || value === 'scm' || value === 'ncm' || value === 'nm3') return 'M3';\n if (value === 'km') return 'km';\n if (value === 'passengerkm') return 'passenger-km';\n if (value === 'night' || value === 'nights' || value === 'roomnight' || value === 'roomnights') return 'night';\n if (value === 'cyl' || value === 'cylinder' || value === 'cylinders') return 'Cyl';\n if (value === 'nos' || value === 'no' || value === 'pcs' || value === 'pieces') return 'Nos';\n return unit;\n};\n\nconst parsePositiveNumbers = (line: string) =>\n [...line.matchAll(numericPattern)]\n .map((match) => ({\n value: match[0],\n index: match.index || 0,\n number: Number(match[0].replace(/,/g, '')),\n }))\n .filter((entry) => Number.isFinite(entry.number) && entry.number > 0 && !/[A-Za-z]/.test(line[entry.index - 1] || ''));\n\nconst adjacentActivityUnit = (line: string, numberIndex: number, valueLength: number) => {\n const after = line.slice(numberIndex + valueLength, numberIndex + valueLength + 18);\n const right = after.match(/^\\s*([A-Za-z³][-A-Za-z0-9³ ]{0,16})/i)?.[1] || '';\n const rightUnit = right.match(physicalUnitPattern)?.[1];\n if (rightUnit) return canonicalActivityUnit(rightUnit);\n const before = line.slice(Math.max(0, numberIndex - 18), numberIndex);\n const beforeUnit = before.match(new RegExp(`(${physicalUnitPattern.source})\\\\s*$`, 'i'))?.[1];\n return beforeUnit ? canonicalActivityUnit(beforeUnit) : '';\n};\n\nconst candidateAllowedScore = (query: string, item: BulkBillAgentAllowedItem) => {\n const queryKey = normalize(query);\n const text = itemText(item);\n if (!queryKey || !text) return 0;\n const itemNameKey = normalize(item.itemName);\n if (itemNameKey && (queryKey.includes(itemNameKey) || itemNameKey.includes(queryKey))) return 1;\n const queryTokens = queryKey.split(' ').filter((token) => token.length > 1);\n const itemTokens = text.split(' ').filter((token) => token.length > 1);\n if (!queryTokens.length || !itemTokens.length) return 0;\n const matched = itemTokens.filter((token) =>\n queryTokens.some((candidate) => token === candidate || token.includes(candidate) || candidate.includes(token)),\n ).length;\n return matched / itemTokens.length;\n};\n\nconst bestAllowedItemForQuery = (query: string, allowedItems: BulkBillAgentAllowedItem[]) => {\n const best = allowedItems\n .map((item) => ({ item, score: candidateAllowedScore(query, item) }))\n .sort((left, right) => right.score - left.score)[0];\n return best && best.score >= 0.34 ? best : null;\n};\n\nconst profileTextLines = (pages: BulkBillAgentProfilePage[] = [], group: BulkBillAgentProfileGroup, documentText = '') => {\n const wanted = new Set(group.pageNumbers.map(Number));\n const selectedPages = pages.filter((page) => wanted.has(Number(page.pageNumber)));\n if (!selectedPages.length && documentText) {\n return documentText.split(/\\n+/).map((text, lineIndex) => ({\n pageNumber: 1,\n lineIndex,\n text: text.replace(/\\s+/g, ' ').trim(),\n }));\n }\n return selectedPages.flatMap((page) =>\n String(page.text || '').split(/\\n+/).map((text, lineIndex) => ({\n pageNumber: Number(page.pageNumber),\n lineIndex,\n text: text.replace(/\\s+/g, ' ').trim(),\n })),\n );\n};\n\nconst buildProfileCandidate = ({\n group,\n profileId,\n pageNumber,\n lineIndex,\n numberIndex,\n itemName,\n quantity,\n unit,\n evidenceText,\n allowedMatch,\n role = 'item_table_quantity',\n confidence = 0.76,\n}: {\n group: BulkBillAgentProfileGroup;\n profileId: BulkBillAgentProfileId;\n pageNumber: number;\n lineIndex: number;\n numberIndex: number;\n itemName: string;\n quantity: string;\n unit: string;\n evidenceText: string;\n allowedMatch: { item: BulkBillAgentAllowedItem; score: number } | null;\n role?: string;\n confidence?: number;\n}): BulkBillAgentProfileCandidate => ({\n candidateId: `${group.groupId}-${profileId}-${pageNumber}-${lineIndex}-${numberIndex}-${compactKey(itemName).slice(0, 24)}`,\n groupId: group.groupId,\n profileId,\n itemName: allowedMatch?.item.itemName || itemName,\n quantity: quantity.replace(/,/g, ''),\n unit,\n role,\n confidence: Math.min(0.98, confidence + (allowedMatch?.score || 0) * 0.14),\n pageNumber,\n evidenceText,\n matchedAllowedItemName: allowedMatch?.item.itemName,\n matchedAllowedItemKey: allowedMatch?.item.itemKey,\n matchedAllowedItemSourceId: allowedMatch?.item.sourceId,\n mappingConfidence: allowedMatch?.score || undefined,\n});\n\nconst refrigerantLabel = (line: string) => {\n const match = line.match(/\\b(?:hfc[-\\s]*)?r[-\\s]?(?:410\\s*a?|32|134\\s*a?|22|404\\s*a?|125|407\\s*c?)\\b/i);\n if (!match) return '';\n return match[0].toUpperCase().replace(/\\s+/g, ' ').replace(/^R\\s*/, 'R-').replace(/R-410A$/, 'R-410 A');\n};\n\nconst industrialGasLabel = (line: string) => {\n if (/\\b(?:o2|0?2\\s*gas|oxygen)\\b/i.test(line)) return 'Oxygen Gas';\n if (/\\b(?:co2|c0?2|carbon\\s+dioxide)\\b/i.test(line)) return 'CO2 Gas';\n if (/\\bnitrogen\\b/i.test(line)) return 'Nitrogen Gas';\n if (/\\bargon\\b/i.test(line)) return 'Argon Gas';\n if (/\\bacetylene\\b/i.test(line)) return 'Acetylene';\n return '';\n};\n\nconst fuelLabel = (line: string) => {\n if (/\\b(?:hsd|diesel)\\b/i.test(line)) return 'Diesel';\n if (/\\bpetrol\\b/i.test(line)) return 'Petrol';\n if (/\\bcng\\b/i.test(line)) return 'CNG';\n if (/\\bfurnace\\s+oil\\b/i.test(line)) return 'Furnace Oil';\n if (/\\b(?:petroleum\\s+coke|petcoke|coke)\\b/i.test(line)) return 'Petroleum Coke';\n if (/\\bcoal\\b/i.test(line)) return 'Coal';\n if (/\\b(?:lpg|liquefied\\s+petroleum)\\b/i.test(line)) return 'LPG';\n if (/\\b(?:lubrication\\s+oil|lube\\s+oil|grease)\\b/i.test(line)) return 'Lubrication Oil';\n if (/\\bkerosene\\b/i.test(line)) return 'Kerosene';\n return '';\n};\n\nconst fireExtinguisherLabel = (line: string) =>\n /\\b(?:fire\\s+extinguisher|extinguisher|refill|refilling)\\b/i.test(line) ? 'Fire Extinguisher Refilling' : '';\n\nconst sf6Label = (line: string) =>\n /\\b(?:sf6|sulph?ur\\s+hexafluoride)\\b/i.test(line) ? 'SF6 Usage' : '';\n\nconst waterLabel = (line: string) => {\n if (/\\b(?:tanker)\\b/i.test(line)) return 'Tanker Water';\n if (/\\b(?:municipal|corporation|utility)\\b/i.test(line)) return 'Municipal Water';\n if (/\\b(?:ground\\s*water|borewell|bore\\s*well)\\b/i.test(line)) return 'Groundwater';\n if (/\\b(?:wastewater|effluent|sewage)\\b/i.test(line)) return 'Wastewater';\n return /\\bwater\\b/i.test(line) ? 'Water' : '';\n};\n\nconst wasteLabel = (line: string) => {\n if (/\\bhazardous\\b/i.test(line)) return 'Hazardous Waste';\n if (/\\b(?:recycl|scrap)\\b/i.test(line)) return 'Recycled Waste';\n if (/\\bcompost\\b/i.test(line)) return 'Composted Waste';\n if (/\\blandfill\\b/i.test(line)) return 'Landfill Waste';\n return /\\bwaste\\b/i.test(line) ? 'Waste Generated in Operations' : '';\n};\n\nconst businessTravelLabel = (line: string) => {\n if (/\\b(?:flight|airline|air\\s+travel)\\b/i.test(line)) return 'Air Travel';\n if (/\\b(?:train|rail|metro)\\b/i.test(line)) return 'Rail Travel';\n if (/\\b(?:hotel|room\\s*night|nights?)\\b/i.test(line)) return 'Hotel Stay';\n if (/\\b(?:taxi|cab|rental\\s+car|car\\s+rental)\\b/i.test(line)) return 'Rental Car';\n return '';\n};\n\nconst processEmissionLabel = (line: string) => {\n if (/\\bclinker\\b/i.test(line)) return 'Clinker';\n if (/\\bcalcination\\b/i.test(line)) return 'Calcination Process';\n if (/\\b(?:limestone|dolomite|flux)\\b/i.test(line)) return 'Flux calcination';\n if (/\\b(?:hot\\s+metal|ironmaking)\\b/i.test(line)) return 'Process Emissions- Ironmaking';\n if (/\\bsteelmaking\\b/i.test(line)) return 'Process Emissions- Steelmaking';\n return '';\n};\n\nconst genericMaterialLabel = (line: string, allowedItems: BulkBillAgentAllowedItem[]) => {\n if (metadataOnlyPattern.test(line) && !physicalUnitPattern.test(line)) return '';\n const best = bestAllowedItemForQuery(line, allowedItems);\n return best?.item.itemName || line.split('|').map((part) => part.trim()).find((part) => /[A-Za-z]/.test(part) && !metadataOnlyPattern.test(part)) || '';\n};\n\nconst commuteModeLabel = (line: string) => {\n const text = normalize(line);\n if (/\\b(bike|bikt|motorcycle)\\b/.test(text)) return 'Motorcycle';\n if (/\\b(scooty|scoow|scooter)\\b/.test(text)) return 'Scooter';\n if (/\\b(auto|byauto|auio)\\b/.test(text)) return 'Small Car Gasoline';\n if (/\\b(car|eycar|hatchback)\\b/.test(text)) return 'Hatchback Gasoline';\n if (/\\b(metro|14etro|train|rail)\\b/.test(text)) return 'Train Domestic Electric';\n if (/\\b(cycle|cycl|cyct)\\b/.test(text)) return 'Employee commute cycle';\n if (/\\b(bus)\\b/.test(text)) return 'Bus';\n return '';\n};\n\nconst extractNamedQuantityCandidates = ({\n profileId,\n group,\n lines,\n allowedItems,\n labelForLine,\n}: {\n profileId: BulkBillAgentProfileId;\n group: BulkBillAgentProfileGroup;\n lines: ReturnType<typeof profileTextLines>;\n allowedItems: BulkBillAgentAllowedItem[];\n labelForLine: (line: string, allowedItems: BulkBillAgentAllowedItem[]) => string;\n}) => lines.flatMap(({ pageNumber, lineIndex, text }) => {\n if (!text || (metadataOnlyPattern.test(text) && !physicalUnitPattern.test(text))) return [];\n const itemName = labelForLine(text, allowedItems);\n if (!itemName) return [];\n return parsePositiveNumbers(text).flatMap((entry, numberIndex) => {\n const unit = adjacentActivityUnit(text, entry.index, entry.value.length);\n if (!unit) return [];\n const allowedMatch = bestAllowedItemForQuery(`${itemName} ${text}`, allowedItems);\n return [buildProfileCandidate({\n group,\n profileId,\n pageNumber,\n lineIndex,\n numberIndex,\n itemName,\n quantity: entry.value,\n unit,\n evidenceText: text,\n allowedMatch,\n })];\n });\n});\n\nconst extractElectricityCandidates = (\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n const electricityLine = /\\b(?:net\\s+cons\\.?\\s+for\\s+billing|billed\\s+units?|billing\\s+units?|units\\s+consumed|energy\\s+consumption|import|export|generation|solar|renewable)\\b/i;\n return lines.flatMap(({ pageNumber, lineIndex, text }) => {\n if (!electricityLine.test(text) || metadataOnlyPattern.test(text)) return [];\n return parsePositiveNumbers(text).flatMap((entry, numberIndex) => {\n const unit = adjacentActivityUnit(text, entry.index, entry.value.length) || (/\\bunits?\\b/i.test(text) ? 'kWh' : '');\n if (!unit || !/\\b(?:kwh|kvah|mwh)\\b/i.test(unit)) return [];\n const role = /\\b(?:solar|renewable|generation|export)\\b/i.test(text) ? 'component_consumption' : 'bill_level_consumption';\n const allowedMatch = bestAllowedItemForQuery(text, allowedItems);\n return [buildProfileCandidate({\n group,\n profileId: 'electricity',\n pageNumber,\n lineIndex,\n numberIndex,\n itemName: allowedMatch?.item.itemName || 'Electricity Purchased from Grid',\n quantity: entry.value,\n unit,\n evidenceText: text,\n allowedMatch,\n role,\n confidence: role === 'bill_level_consumption' ? 0.86 : 0.78,\n })];\n });\n });\n};\n\nconst extractEmployeeCommutingCandidates = (\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n const totals = new Map<string, { total: number; evidence: string[]; pageNumber: number }>();\n for (const { pageNumber, text } of lines) {\n const mode = commuteModeLabel(text);\n if (!mode) continue;\n const distanceValues = parsePositiveNumbers(text)\n .filter((entry) => /\\bkm\\b/i.test(text.slice(entry.index, entry.index + 24)) || /\\bkm\\b/i.test(text));\n const value = distanceValues.length ? distanceValues[distanceValues.length - 1].number : null;\n if (!value) continue;\n const current = totals.get(mode) || { total: 0, evidence: [], pageNumber };\n current.total += value;\n if (current.evidence.length < 4) current.evidence.push(text);\n totals.set(mode, current);\n }\n return [...totals.entries()].map(([mode, aggregate], index) => {\n const allowedMatch = bestAllowedItemForQuery(mode, allowedItems);\n return buildProfileCandidate({\n group,\n profileId: 'employee_commuting',\n pageNumber: aggregate.pageNumber,\n lineIndex: index,\n numberIndex: 0,\n itemName: mode,\n quantity: String(Number(aggregate.total.toFixed(5))),\n unit: 'km',\n evidenceText: aggregate.evidence.join(' | '),\n allowedMatch,\n role: 'aggregated_distance',\n confidence: 0.88,\n });\n });\n};\n\nconst extractForProfile = (\n profileId: BulkBillAgentProfileId,\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n if (profileId === 'electricity') return extractElectricityCandidates(group, lines, allowedItems);\n if (profileId === 'employee_commuting') return extractEmployeeCommutingCandidates(group, lines, allowedItems);\n\n const labelForProfile: Partial<Record<BulkBillAgentProfileId, (line: string, allowedItems: BulkBillAgentAllowedItem[]) => string>> = {\n fuel_combustion: (line) => fuelLabel(line),\n lpg_usage: (line) => fuelLabel(line),\n refrigerants: (line) => refrigerantLabel(line),\n industrial_gases: (line) => industrialGasLabel(line),\n business_travel: (line) => businessTravelLabel(line),\n fire_extinguisher: (line) => fireExtinguisherLabel(line),\n sf6_usage: (line) => sf6Label(line),\n water: (line) => waterLabel(line),\n waste: (line) => wasteLabel(line),\n process_emissions: (line) => processEmissionLabel(line),\n purchased_goods: genericMaterialLabel,\n generic_material: genericMaterialLabel,\n };\n\n const labelForLine = labelForProfile[profileId] || genericMaterialLabel;\n return extractNamedQuantityCandidates({ profileId, group, lines, allowedItems, labelForLine });\n};\n\nexport const extractBulkBillAgentProfileCandidates = ({\n mappingContext = {},\n pages = [],\n group,\n documentText = '',\n}: BulkBillAgentProfileExtractionInput) => {\n const allowedItems = Array.isArray(mappingContext.allowedItems) ? mappingContext.allowedItems : [];\n const lines = profileTextLines(pages, group, documentText);\n const groupText = documentText || lines.map((line) => line.text).join('\\n');\n const primaryProfile = getPrimaryBulkBillAgentProfile(mappingContext, groupText);\n const profiles = getBulkBillAgentProfilesForMappingContext(mappingContext, groupText)\n .map((entry) => entry.profile.id)\n .filter((profileId, index, profileIds) => profileIds.indexOf(profileId) === index);\n const extractionProfiles = profiles.length ? profiles : [primaryProfile.id];\n const candidates = extractionProfiles.flatMap((profileId) =>\n extractForProfile(profileId, group, lines, allowedItems),\n );\n const seen = new Set<string>();\n return candidates\n .sort((left, right) => right.confidence - left.confidence)\n .filter((candidate) => {\n const key = [candidate.profileId, candidate.matchedAllowedItemKey || candidate.itemName, candidate.quantity, candidate.unit, candidate.pageNumber].join('|');\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n })\n .slice(0, 30);\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bulk-bill-agent.js","sources":["../src/config/bulk-bill-agent.ts"],"sourcesContent":["export type BulkBillAgentProfileId =\n | 'electricity'\n | 'fuel_combustion'\n | 'refrigerants'\n | 'industrial_gases'\n | 'employee_commuting'\n | 'business_travel'\n | 'lpg_usage'\n | 'fire_extinguisher'\n | 'sf6_usage'\n | 'water'\n | 'waste'\n | 'purchased_goods'\n | 'process_emissions'\n | 'generic_material';\n\nexport interface BulkBillAgentAllowedItem {\n itemKey?: string;\n sourceId?: string;\n itemName?: string;\n billCategory?: string;\n billSubCategory?: string;\n billNestedSubCategory?: string;\n billType?: string;\n unit?: string;\n emissionFactor?: number;\n requiresMassData?: boolean;\n}\n\nexport interface BulkBillAgentMappingContext {\n locked?: boolean;\n scope?: string;\n category?: string;\n route?: string;\n plant?: string;\n year?: number | string;\n month?: number | string;\n yearType?: string;\n allowedItems?: BulkBillAgentAllowedItem[];\n}\n\nexport interface BulkBillAgentProfile {\n id: BulkBillAgentProfileId;\n label: string;\n description: string;\n documentTypes: string[];\n itemSignals: string[];\n documentSignals: string[];\n preferredUnits: string[];\n extractionRules: string[];\n rejectRules: string[];\n}\n\nexport interface BulkBillAgentPromptConfig {\n profile: BulkBillAgentProfile;\n allowedItemCount: number;\n allowedItemSummaries: string[];\n uploadContext: {\n scope: string;\n category: string;\n plant: string;\n year: string;\n month: string;\n yearType: string;\n route: string;\n };\n}\n\nconst normalize = (value: unknown) =>\n String(value ?? '')\n .toLowerCase()\n .replace(/co₂/g, 'co2')\n .replace(/[^a-z0-9]+/g, ' ')\n .trim();\n\nconst includesAny = (text: string, signals: readonly string[]) =>\n signals.some((signal) => text.includes(signal));\n\nconst itemText = (item: BulkBillAgentAllowedItem) =>\n normalize([\n item.itemName,\n item.billCategory,\n item.billSubCategory,\n item.billNestedSubCategory,\n item.billType,\n item.unit,\n ].filter(Boolean).join(' '));\n\nconst mappingContextText = (context: BulkBillAgentMappingContext = {}) =>\n normalize([\n context.scope,\n context.category,\n ...(Array.isArray(context.allowedItems) ? context.allowedItems.map(itemText) : []),\n ].filter(Boolean).join(' '));\n\nexport const BULK_BILL_AGENT_PROFILES: Record<BulkBillAgentProfileId, BulkBillAgentProfile> = {\n electricity: {\n id: 'electricity',\n label: 'Electricity',\n description: 'Grid electricity, renewable electricity, kWh/kVAh/MWh utility bills.',\n documentTypes: ['electricity_bill'],\n itemSignals: ['electric', 'electricity', 'grid', 'renewable', 'solar', 'power', 'kwh', 'kvah', 'mwh', 'location based', 'market based', 'purchased electricity'],\n documentSignals: ['kwh', 'kvah', 'mwh', 'meter', 'discom', 'vidyut', 'billed units', 'net consumption', 'energy charge'],\n preferredUnits: ['kWh', 'kVAh', 'MWh'],\n extractionRules: [\n 'Prefer current-period bill-level or net billed consumption over charges, rates, TOD/slab rows, arrears, or historical meter rows.',\n 'For grid import or purchased electricity, use current-period import/from-grid consumption.',\n 'When a purchased grid electricity bill does not explicitly distinguish national vs regional grid, default the ERP mapping to Regional Grid; do not send it to review for that ambiguity alone.',\n 'For solar or renewable electricity, use current-period generation or renewable energy consumption.',\n 'Treat “units” as kWh only for electricity documents.',\n ],\n rejectRules: ['Reject taxes, demand/fixed charges, tariff/rate rows, previous readings, arrears, and currency amounts.'],\n },\n fuel_combustion: {\n id: 'fuel_combustion',\n label: 'Fuel combustion',\n description: 'Diesel, HSD, petrol, furnace oil, coal, coke, CNG and other stationary/mobile combustion fuels.',\n documentTypes: ['fuel_invoice', 'material_invoice'],\n itemSignals: ['diesel', 'hsd', 'petrol', 'fuel', 'furnace oil', 'coal', 'coke', 'cng', 'kerosene', 'ldo', 'mobile combustion', 'stationary combustion', 'operation'],\n documentSignals: ['diesel', 'hsd', 'petrol', 'fuel', 'litre', 'liter', 'kl', 'furnace oil', 'coal', 'petcoke', 'cng'],\n preferredUnits: ['KL', 'Litre', 'Kg', 'Tonnes', 'M3', 'SCM'],\n extractionRules: [\n 'Extract physical fuel quantity, not invoice amount or rate.',\n 'Map vehicle fuel rows to mobile combustion items and generator/boiler/process fuel rows to stationary or operation items when the evidence supports it.',\n 'Preserve the bill unit; unit conversion belongs to validation unless the document states density or conversion explicitly.',\n ],\n rejectRules: ['Reject fuel rates, taxes, HSN/SAC codes, payment totals, and non-fuel services.'],\n },\n refrigerants: {\n id: 'refrigerants',\n label: 'Refrigerants',\n description: 'AC gas and refrigerant purchases/refills such as R-410A, R-32, R-134a, R-22.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['refrigerant', 'refrigerants', 'r 410', 'r410', 'r 32', 'r32', 'r 134', 'r134', 'r 22', 'r22', 'hfc', 'ac gas', 'chiller'],\n documentSignals: ['refrigerant', 'r 410', 'r410', 'r 32', 'r32', 'r 134', 'r134', 'r 22', 'r22', 'ac gas', 'chiller gas'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: [\n 'Extract refrigerant top-up, refill, or purchase quantity by refrigerant grade.',\n 'Repair OCR variants like R410, R-410, R 410A, R-410 A to the closest allowed ERP item.',\n 'Do not infer leakage; only extract documented physical quantity.',\n ],\n rejectRules: ['Reject service charges, labour, AC unit model numbers, invoice totals, and taxes.'],\n },\n industrial_gases: {\n id: 'industrial_gases',\n label: 'Industrial gases',\n description: 'Oxygen, CO2, nitrogen, argon, acetylene and cylinder gas invoices.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['oxygen', 'o2', 'co2', 'carbon dioxide', 'nitrogen', 'argon', 'acetylene', 'gas cylinder', 'industrial gas', 'welding'],\n documentSignals: ['oxygen', 'o2 gas', 'co2 gas', 'nitrogen', 'argon', 'acetylene', 'cylinder', 'scm', 'nm3', 'm3'],\n preferredUnits: ['M3', 'SCM', 'NM3', 'Kg', 'Cyl'],\n extractionRules: [\n 'Extract gas quantity from row-level item quantity, not cylinder deposit, rental, or amount.',\n 'Keep cylinder count only when the ERP item unit supports count-based activity.',\n 'Repair OCR variants such as 02/O2 and C02/CO2 using allowed ERP items.',\n ],\n rejectRules: ['Reject cylinder deposits, rent, returnable assets, rates, taxes, and empty cylinder rows.'],\n },\n employee_commuting: {\n id: 'employee_commuting',\n label: 'Employee commuting',\n description: 'Employee commute rosters and distance summaries grouped by transport mode.',\n documentTypes: ['transport_roster', 'material_invoice'],\n itemSignals: ['employee commuting', 'commute', 'commuting', 'motorcycle', 'scooter', 'hatchback', 'car', 'rail', 'train', 'metro', 'bus', 'cycle', 'passenger km'],\n documentSignals: ['employee', 'transport', 'mode', 'commute', 'bike', 'scooty', 'car', 'metro', 'bus', 'cycle', 'km'],\n preferredUnits: ['km', 'passenger-km'],\n extractionRules: [\n 'Treat roster files as activity evidence even when they have no invoice number, supplier, or amount.',\n 'Group by transport mode and sum current-period distance into one row per mapped ERP item.',\n 'Use the upload period as the bill period when the roster has no date.',\n ],\n rejectRules: ['Reject employee IDs, names, phone numbers, addresses, and non-distance row counts as activity quantities.'],\n },\n business_travel: {\n id: 'business_travel',\n label: 'Business travel',\n description: 'Flights, rail, hotel stays, and rental vehicle activity.',\n documentTypes: ['travel_invoice', 'material_invoice'],\n itemSignals: ['business travel', 'flight', 'air travel', 'rail', 'train', 'hotel', 'rental car', 'passenger km', 'room night'],\n documentSignals: ['flight', 'airline', 'pnr', 'hotel', 'room night', 'train', 'rail', 'passenger km', 'ticket'],\n preferredUnits: ['km', 'passenger-km', 'night', 'room-night'],\n extractionRules: ['Extract distance, passenger-km, room nights, or trip counts only when the ERP item supports the unit.'],\n rejectRules: ['Reject fares, taxes, booking fees, passenger names, and ticket numbers as activity quantities.'],\n },\n lpg_usage: {\n id: 'lpg_usage',\n label: 'LPG usage',\n description: 'LPG cylinder and bulk LPG invoices.',\n documentTypes: ['fuel_invoice', 'gas_invoice', 'material_invoice'],\n itemSignals: ['lpg', 'liquefied petroleum gas', 'cylinder'],\n documentSignals: ['lpg', 'liquefied petroleum', 'cylinder', 'kg', 'commercial gas'],\n preferredUnits: ['Kg', 'Tonnes', 'KL', 'Cyl'],\n extractionRules: ['Extract filled LPG quantity by kg/tonnes/KL/cylinder size; prefer net fill quantity over cylinder deposit count.'],\n rejectRules: ['Reject cylinder deposits, rental, delivery charges, and taxes.'],\n },\n fire_extinguisher: {\n id: 'fire_extinguisher',\n label: 'Fire extinguisher refilling',\n description: 'CO2 and other extinguisher refill activity.',\n documentTypes: ['material_invoice'],\n itemSignals: ['fire extinguisher', 'extinguisher', 'co2 fire', 'refilling'],\n documentSignals: ['fire extinguisher', 'extinguisher', 'co2', 'refill', 'refilling'],\n preferredUnits: ['Kg', 'Tonnes', 'Cyl'],\n extractionRules: ['Extract refill gas quantity, not extinguisher asset count unless the ERP item is count-based.'],\n rejectRules: ['Reject maintenance service charges, inspection fees, and asset serial numbers.'],\n },\n sf6_usage: {\n id: 'sf6_usage',\n label: 'SF6 usage',\n description: 'SF6 gas purchase, refill, and switchgear top-up activity.',\n documentTypes: ['gas_invoice', 'material_invoice'],\n itemSignals: ['sf6', 'sulfur hexafluoride', 'sulphur hexafluoride'],\n documentSignals: ['sf6', 'sulfur hexafluoride', 'sulphur hexafluoride', 'switchgear'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: ['Extract documented SF6 purchase/refill/top-up quantity only.'],\n rejectRules: ['Reject switchgear model numbers, pressure readings without refill quantity, and service charges.'],\n },\n water: {\n id: 'water',\n label: 'Water',\n description: 'Municipal, borewell, tanker, and wastewater quantities.',\n documentTypes: ['water_bill', 'material_invoice'],\n itemSignals: ['water', 'groundwater', 'municipal', 'tanker', 'wastewater', 'effluent'],\n documentSignals: ['water', 'kl', 'litre', 'liter', 'tanker', 'municipal', 'wastewater', 'effluent'],\n preferredUnits: ['KL', 'Litre', 'M3'],\n extractionRules: ['Extract physical water volume by source/disposal type where possible.'],\n rejectRules: ['Reject water charges, sewerage taxes, arrears, and meter numbers as quantities.'],\n },\n waste: {\n id: 'waste',\n label: 'Waste generated in operations',\n description: 'Waste disposal, recycling, composting, landfill, hazardous/non-hazardous waste.',\n documentTypes: ['waste_invoice', 'material_invoice'],\n itemSignals: ['waste', 'landfill', 'recycl', 'compost', 'hazardous', 'scrap', 'disposal'],\n documentSignals: ['waste', 'landfill', 'recycl', 'compost', 'hazardous', 'scrap', 'disposal', 'kg', 'tonne'],\n preferredUnits: ['Kg', 'Tonnes'],\n extractionRules: ['Extract disposed/recycled physical waste mass by waste type and treatment route.'],\n rejectRules: ['Reject disposal fees, GST, container rental, and vehicle numbers.'],\n },\n purchased_goods: {\n id: 'purchased_goods',\n label: 'Purchased goods and services',\n description: 'Raw materials, consumables, and purchased product quantities.',\n documentTypes: ['material_invoice', 'purchase_order'],\n itemSignals: ['purchased goods', 'goods', 'services', 'material', 'raw material', 'consumable', 'packaging'],\n documentSignals: ['invoice', 'tax invoice', 'hsn', 'material', 'goods', 'quantity', 'qty', 'purchase order'],\n preferredUnits: ['Kg', 'Tonnes', 'Litre', 'KL', 'M3', 'Nos'],\n extractionRules: ['Extract row-level material quantity only when the item maps to an allowed ERP item.'],\n rejectRules: ['Reject rates, taxes, HSN/SAC codes, payment terms, and unmatched non-emission materials.'],\n },\n process_emissions: {\n id: 'process_emissions',\n label: 'Process emissions',\n description: 'Cement clinker calcination, ironmaking/steelmaking, flux calcination and other process quantities.',\n documentTypes: ['production_log', 'material_invoice'],\n itemSignals: ['calcination', 'clinker', 'ironmaking', 'steelmaking', 'flux', 'process emissions', 'hot metal', 'limestone', 'dolomite'],\n documentSignals: ['clinker', 'calcination', 'limestone', 'dolomite', 'hot metal', 'steelmaking', 'production', 'tonne'],\n preferredUnits: ['Tonnes', 'Kg'],\n extractionRules: ['Extract production/process input quantity tied to the selected process item.'],\n rejectRules: ['Reject financial totals, quality percentages, and composition values unless explicitly configured as activity data.'],\n },\n generic_material: {\n id: 'generic_material',\n label: 'Generic material invoice',\n description: 'Fallback for material invoices that do not fit a narrower profile.',\n documentTypes: ['material_invoice', 'purchase_order', 'unknown'],\n itemSignals: ['material', 'goods', 'services', 'quantity', 'qty'],\n documentSignals: ['invoice', 'quantity', 'qty', 'unit', 'hsn', 'sac'],\n preferredUnits: ['Kg', 'Tonnes', 'Litre', 'KL', 'M3', 'Nos'],\n extractionRules: ['Extract only row-level physical quantities that can be matched to allowed ERP items.'],\n rejectRules: ['Reject invoice metadata, rates, taxes, totals, and unmatched rows.'],\n },\n};\n\nconst ROUTING_PRIORITY: BulkBillAgentProfileId[] = [\n 'electricity',\n 'employee_commuting',\n 'refrigerants',\n 'sf6_usage',\n 'fire_extinguisher',\n 'lpg_usage',\n 'industrial_gases',\n 'fuel_combustion',\n 'business_travel',\n 'water',\n 'waste',\n 'process_emissions',\n 'purchased_goods',\n 'generic_material',\n];\n\nexport const getBulkBillAgentProfile = (profileId: BulkBillAgentProfileId) =>\n BULK_BILL_AGENT_PROFILES[profileId];\n\nexport const listBulkBillAgentProfiles = () =>\n ROUTING_PRIORITY.map((profileId) => BULK_BILL_AGENT_PROFILES[profileId]);\n\nexport const scoreBulkBillAgentProfile = (\n profile: BulkBillAgentProfile,\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const contextText = mappingContextText(context);\n const docText = normalize(documentText);\n const allowedItems = Array.isArray(context.allowedItems) ? context.allowedItems : [];\n const itemMatches = allowedItems.filter((item) => includesAny(itemText(item), profile.itemSignals)).length;\n const contextMatch = includesAny(contextText, profile.itemSignals) ? 2 : 0;\n const categoryMatch = includesAny(normalize(context.category), profile.itemSignals) ? 3 : 0;\n const documentMatch = docText && includesAny(docText, profile.documentSignals) ? 2 : 0;\n const unitMatch = allowedItems.filter((item) => includesAny(normalize(item.unit), profile.preferredUnits.map(normalize))).length;\n return itemMatches * 3 + unitMatch + contextMatch + categoryMatch + documentMatch;\n};\n\nexport const getBulkBillAgentProfilesForMappingContext = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const scored = ROUTING_PRIORITY\n .map((profileId) => {\n const profile = BULK_BILL_AGENT_PROFILES[profileId];\n return { profile, score: scoreBulkBillAgentProfile(profile, context, documentText) };\n })\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score);\n\n return scored.length ? scored : [{ profile: BULK_BILL_AGENT_PROFILES.generic_material, score: 0 }];\n};\n\nexport const getPrimaryBulkBillAgentProfile = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => getBulkBillAgentProfilesForMappingContext(context, documentText)[0].profile;\n\nconst formatAllowedItem = (item: BulkBillAgentAllowedItem) => {\n const hierarchy = [item.billCategory, item.billSubCategory, item.billNestedSubCategory]\n .filter(Boolean)\n .join(' > ');\n return `${item.itemName || item.billNestedSubCategory || 'Unnamed item'}${hierarchy ? ` (${hierarchy})` : ''}; expected unit: ${item.unit || 'not specified'}; key: ${item.itemKey || item.sourceId || 'not specified'}`;\n};\n\nexport const buildBulkBillAgentPromptConfig = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n): BulkBillAgentPromptConfig => {\n const profile = getPrimaryBulkBillAgentProfile(context, documentText);\n const allowedItems = Array.isArray(context.allowedItems) ? context.allowedItems : [];\n return {\n profile,\n allowedItemCount: allowedItems.length,\n allowedItemSummaries: allowedItems.map(formatAllowedItem),\n uploadContext: {\n scope: String(context.scope || ''),\n category: String(context.category || ''),\n plant: String(context.plant || ''),\n year: String(context.year || ''),\n month: String(context.month || ''),\n yearType: String(context.yearType || ''),\n route: String(context.route || ''),\n },\n };\n};\n\nconst baseBulkBillAgentSystemPrompt = `You are a ZeroCarbon bulk bill processing agent running inside an open-ended tool harness.\n\nYou do not follow a fixed workflow. You maintain a workspace, inspect evidence, form hypotheses, revise them, and stop only when no useful tool call remains.\n\nNon-negotiable extraction contract:\n- First understand the document. For each bill/page group, stage pages and call classify_bill_group. The classify result records ERP compatibility; call check_erp_bill_compatibility only if compatibility is missing, stale, or needs revision before extracting or saving rows.\n- A PDF can contain mixed bill types. Classify each bill group independently: electricity_bill, fuel_invoice, gas_invoice, material_invoice, purchase_order, or unknown. Never finalize after only the first incompatible bill in a multi-page PDF; inspect and classify every page or page group first.\n- If a bill type is incompatible with the locked ERP page/allowed items, do not force mapping. Leave it for review with a clear reason.\n- After compatibility is recorded, call extract_activity_candidates to get typed physical candidates. Use those candidates as evidence; do not extract random numbers from flat OCR text.\n- If a specialized profile is listed below, treat it as the active sub-agent contract for this ERP page. Apply its extraction rules before generic extraction heuristics.\n- If extract_activity_candidates returns recommendedRows for electricity, use those rows directly with save_extracted_rows unless you can cite a concrete validation problem. Do not replace deterministic recommended rows with review rows.\n- Extract only physical activity rows: energy, mass, volume, distance, count only when the ERP item supports count-based activity. Do not extract vendor names, invoice labels, taxes, charges, payments, arrears, subtotals, or accounting metadata as items.\n- For each candidate row, classify doubtful rows and search the locked ERP items before deciding to save or review.\n- When more than one allowed ERP item can match, make an evidence-backed mapping decision when possible. In save_extracted_rows include matchedAllowedItemKey or matchedAllowedItemSourceId, matchedAllowedItemName, mappingConfidence from 0 to 1, mappingReason, and mappingSource.\n- If OCR is partial, use neighboring rows, repeated labels, row evidence, typed candidates, and ERP context to repair the candidate. Keep raw evidence in rowEvidenceText.\n- For electricity or any ambiguous utility bill, call select_activity_quantity on staged bill pages before save_extracted_rows. Prefer bill-level/billing consumption for generic grid bills. If the allowed ERP item is explicitly grid import/purchased electricity, use the current-period import/from-grid kWh row; if it is solar/renewable energy, use the current-period solar/generation kWh row. Do not use TOD, slab, charge, amount, rate, date, register, or historical rows. Never switch to a weaker component only to match ERP unit.\n- Never persist just because a row exists. Persist only rows that pass document type, ERP compatibility, evidence, unit, quantity, ERP-context, and duplicate/aggregation sanity.\n- It is acceptable to call the same tool multiple times with repaired inputs. It is acceptable to revise groups and rows.\n- If a group cannot be safely extracted or mapped, call save_review_rows with source pages, evidence, and a clear reason instead of saving an incomplete normal row.\n- Use persist_validated_rows after validation. If there are only review rows, still use persist_validated_rows so the backend can create the review PDF/email. Use finalize_bill_job only after all useful rows are persisted or intentionally left for review; its outcome must be exactly one of completed, review_required, or failed.\n- Do not invent emission factors, quantities, units, invoice numbers, or page evidence.\n\nYour output to the user is the job state and streamed tool activity, so keep tool arguments and notes specific and evidence-backed.`;\n\nconst promptBulletList = (items: readonly string[]) => items.map((item) => `- ${item}`).join('\\n');\n\nexport const buildBulkBillAgentSystemPrompt = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const config = buildBulkBillAgentPromptConfig(context, documentText);\n const allowedItems = config.allowedItemSummaries.slice(0, 40);\n return `${baseBulkBillAgentSystemPrompt}\n\nActive ERP extraction sub-agent contract:\nProfile: ${config.profile.label} (${config.profile.id})\nDescription: ${config.profile.description}\nExpected document types: ${config.profile.documentTypes.join(', ') || 'not specified'}\nPreferred units: ${config.profile.preferredUnits.join(', ') || 'not specified'}\n\nUpload context:\n- Scope: ${config.uploadContext.scope || 'not specified'}\n- Category: ${config.uploadContext.category || 'not specified'}\n- Plant: ${config.uploadContext.plant || 'not specified'}\n\nCritical document-period rule:\n- Do not assume the upload period is the bill period. Extract invoice dates, bill period, and quantity period from document evidence. Use upload context only when the document truly has no period evidence.\n\nCategory-specific extraction rules:\n${promptBulletList(config.profile.extractionRules)}\n\nCategory-specific reject rules:\n${promptBulletList(config.profile.rejectRules)}\n\nAllowed ERP items for this upload (${config.allowedItemCount} total, first ${allowedItems.length} shown):\n${promptBulletList(allowedItems)}\n\nFollow this profile unless page evidence clearly proves a different bill type; if evidence conflicts with the ERP page, send rows to review instead of forcing a mapping.`;\n};\n\nexport interface BulkBillAgentProfilePage {\n pageNumber: number | string;\n text?: string;\n}\n\nexport interface BulkBillAgentProfileGroup {\n groupId: string;\n pageNumbers: Array<number | string>;\n}\n\nexport interface BulkBillAgentProfileCandidate {\n candidateId: string;\n groupId: string;\n profileId: BulkBillAgentProfileId;\n itemName: string;\n quantity: string;\n unit: string;\n role: string;\n confidence: number;\n pageNumber: number;\n evidenceText: string;\n matchedAllowedItemName?: string;\n matchedAllowedItemKey?: string;\n matchedAllowedItemSourceId?: string;\n mappingConfidence?: number;\n}\n\nexport interface BulkBillAgentProfileExtractionInput {\n mappingContext?: BulkBillAgentMappingContext;\n pages?: BulkBillAgentProfilePage[];\n group: BulkBillAgentProfileGroup;\n documentText?: string;\n}\n\nconst numericPattern = /-?(?:(?:\\d{1,3}(?:,\\d{3})+)|\\d+)(?:\\.\\d+)?/g;\nconst physicalUnitPattern = /\\b(kwh|kw\\s*h|kvah|kva\\s*h|mwh|kg|kgs|kilograms?|tonnes?|tons?|mt|kl|litres?|liters?|ltr?s?|m3|m³|scm|ncm|nm3|km|passenger[-\\s]?km|room[-\\s]?nights?|nights?|cyl(?:inders?)?|nos?|pcs|pieces?)\\b/i;\nconst metadataOnlyPattern = /(?:₹|rs\\.?|inr|amount|payable|charge|tax|gst|duty|cess|rate|tariff|arrear|rebate|subsidy|surcharge|rent|total\\s+amount|invoice\\s*(?:no|number)|account\\s*(?:no|number)|consumer\\s*(?:no|number))/i;\n\nconst compactKey = (value: unknown) => normalize(value).replace(/\\s+/g, '');\n\nconst canonicalActivityUnit = (unit: string) => {\n const value = compactKey(unit);\n if (value === 'kwh' || value === 'unit' || value === 'units') return 'kWh';\n if (value === 'kvah') return 'kVAh';\n if (value === 'mwh') return 'MWh';\n if (value === 'kg' || value === 'kgs' || value === 'kilogram' || value === 'kilograms') return 'Kg';\n if (value === 'tonne' || value === 'tonnes' || value === 'ton' || value === 'tons' || value === 'mt') return 'Tonnes';\n if (value === 'litre' || value === 'litres' || value === 'liter' || value === 'liters' || value === 'ltr' || value === 'ltrs') return 'Litre';\n if (value === 'kl') return 'KL';\n if (value === 'm3' || value === 'm³' || value === 'scm' || value === 'ncm' || value === 'nm3') return 'M3';\n if (value === 'km') return 'km';\n if (value === 'passengerkm') return 'passenger-km';\n if (value === 'night' || value === 'nights' || value === 'roomnight' || value === 'roomnights') return 'night';\n if (value === 'cyl' || value === 'cylinder' || value === 'cylinders') return 'Cyl';\n if (value === 'nos' || value === 'no' || value === 'pcs' || value === 'pieces') return 'Nos';\n return unit;\n};\n\nconst parsePositiveNumbers = (line: string) =>\n [...line.matchAll(numericPattern)]\n .map((match) => ({\n value: match[0],\n index: match.index || 0,\n number: Number(match[0].replace(/,/g, '')),\n }))\n .filter((entry) => Number.isFinite(entry.number) && entry.number > 0 && !/[A-Za-z]/.test(line[entry.index - 1] || ''));\n\nconst adjacentActivityUnit = (line: string, numberIndex: number, valueLength: number) => {\n const after = line.slice(numberIndex + valueLength, numberIndex + valueLength + 18);\n const right = after.match(/^\\s*([A-Za-z³][-A-Za-z0-9³ ]{0,16})/i)?.[1] || '';\n const rightUnit = right.match(physicalUnitPattern)?.[1];\n if (rightUnit) return canonicalActivityUnit(rightUnit);\n const before = line.slice(Math.max(0, numberIndex - 18), numberIndex);\n const beforeUnit = before.match(new RegExp(`(${physicalUnitPattern.source})\\\\s*$`, 'i'))?.[1];\n return beforeUnit ? canonicalActivityUnit(beforeUnit) : '';\n};\n\nconst candidateAllowedScore = (query: string, item: BulkBillAgentAllowedItem) => {\n const queryKey = normalize(query);\n const text = itemText(item);\n if (!queryKey || !text) return 0;\n const itemNameKey = normalize(item.itemName);\n if (itemNameKey && (queryKey.includes(itemNameKey) || itemNameKey.includes(queryKey))) return 1;\n const queryTokens = queryKey.split(' ').filter((token) => token.length > 1);\n const itemTokens = text.split(' ').filter((token) => token.length > 1);\n if (!queryTokens.length || !itemTokens.length) return 0;\n const matched = itemTokens.filter((token) =>\n queryTokens.some((candidate) => token === candidate || token.includes(candidate) || candidate.includes(token)),\n ).length;\n return matched / itemTokens.length;\n};\n\nconst bestAllowedItemForQuery = (query: string, allowedItems: BulkBillAgentAllowedItem[]) => {\n const best = allowedItems\n .map((item) => ({ item, score: candidateAllowedScore(query, item) }))\n .sort((left, right) => right.score - left.score)[0];\n return best && best.score >= 0.34 ? best : null;\n};\n\nconst profileTextLines = (pages: BulkBillAgentProfilePage[] = [], group: BulkBillAgentProfileGroup, documentText = '') => {\n const wanted = new Set(group.pageNumbers.map(Number));\n const selectedPages = pages.filter((page) => wanted.has(Number(page.pageNumber)));\n if (!selectedPages.length && documentText) {\n return documentText.split(/\\n+/).map((text, lineIndex) => ({\n pageNumber: 1,\n lineIndex,\n text: text.replace(/\\s+/g, ' ').trim(),\n }));\n }\n return selectedPages.flatMap((page) =>\n String(page.text || '').split(/\\n+/).map((text, lineIndex) => ({\n pageNumber: Number(page.pageNumber),\n lineIndex,\n text: text.replace(/\\s+/g, ' ').trim(),\n })),\n );\n};\n\nconst buildProfileCandidate = ({\n group,\n profileId,\n pageNumber,\n lineIndex,\n numberIndex,\n itemName,\n quantity,\n unit,\n evidenceText,\n allowedMatch,\n role = 'item_table_quantity',\n confidence = 0.76,\n}: {\n group: BulkBillAgentProfileGroup;\n profileId: BulkBillAgentProfileId;\n pageNumber: number;\n lineIndex: number;\n numberIndex: number;\n itemName: string;\n quantity: string;\n unit: string;\n evidenceText: string;\n allowedMatch: { item: BulkBillAgentAllowedItem; score: number } | null;\n role?: string;\n confidence?: number;\n}): BulkBillAgentProfileCandidate => ({\n candidateId: `${group.groupId}-${profileId}-${pageNumber}-${lineIndex}-${numberIndex}-${compactKey(itemName).slice(0, 24)}`,\n groupId: group.groupId,\n profileId,\n itemName: allowedMatch?.item.itemName || itemName,\n quantity: quantity.replace(/,/g, ''),\n unit,\n role,\n confidence: Math.min(0.98, confidence + (allowedMatch?.score || 0) * 0.14),\n pageNumber,\n evidenceText,\n matchedAllowedItemName: allowedMatch?.item.itemName,\n matchedAllowedItemKey: allowedMatch?.item.itemKey,\n matchedAllowedItemSourceId: allowedMatch?.item.sourceId,\n mappingConfidence: allowedMatch?.score || undefined,\n});\n\nconst refrigerantLabel = (line: string) => {\n const match = line.match(/\\b(?:hfc[-\\s]*)?r[-\\s]?(?:410\\s*a?|32|134\\s*a?|22|404\\s*a?|125|407\\s*c?)\\b/i);\n if (!match) return '';\n return match[0].toUpperCase().replace(/\\s+/g, ' ').replace(/^R\\s*/, 'R-').replace(/R-410A$/, 'R-410 A');\n};\n\nconst industrialGasLabel = (line: string) => {\n if (/\\b(?:o2|0?2\\s*gas|oxygen)\\b/i.test(line)) return 'Oxygen Gas';\n if (/\\b(?:co2|c0?2|carbon\\s+dioxide)\\b/i.test(line)) return 'CO2 Gas';\n if (/\\bnitrogen\\b/i.test(line)) return 'Nitrogen Gas';\n if (/\\bargon\\b/i.test(line)) return 'Argon Gas';\n if (/\\bacetylene\\b/i.test(line)) return 'Acetylene';\n return '';\n};\n\nconst fuelLabel = (line: string) => {\n if (/\\b(?:hsd|diesel)\\b/i.test(line)) return 'Diesel';\n if (/\\bpetrol\\b/i.test(line)) return 'Petrol';\n if (/\\bcng\\b/i.test(line)) return 'CNG';\n if (/\\bfurnace\\s+oil\\b/i.test(line)) return 'Furnace Oil';\n if (/\\b(?:petroleum\\s+coke|petcoke|coke)\\b/i.test(line)) return 'Petroleum Coke';\n if (/\\bcoal\\b/i.test(line)) return 'Coal';\n if (/\\b(?:lpg|liquefied\\s+petroleum)\\b/i.test(line)) return 'LPG';\n if (/\\b(?:lubrication\\s+oil|lube\\s+oil|grease)\\b/i.test(line)) return 'Lubrication Oil';\n if (/\\bkerosene\\b/i.test(line)) return 'Kerosene';\n return '';\n};\n\nconst fireExtinguisherLabel = (line: string) =>\n /\\b(?:fire\\s+extinguisher|extinguisher|refill|refilling)\\b/i.test(line) ? 'Fire Extinguisher Refilling' : '';\n\nconst sf6Label = (line: string) =>\n /\\b(?:sf6|sulph?ur\\s+hexafluoride)\\b/i.test(line) ? 'SF6 Usage' : '';\n\nconst waterLabel = (line: string) => {\n if (/\\b(?:tanker)\\b/i.test(line)) return 'Tanker Water';\n if (/\\b(?:municipal|corporation|utility)\\b/i.test(line)) return 'Municipal Water';\n if (/\\b(?:ground\\s*water|borewell|bore\\s*well)\\b/i.test(line)) return 'Groundwater';\n if (/\\b(?:wastewater|effluent|sewage)\\b/i.test(line)) return 'Wastewater';\n return /\\bwater\\b/i.test(line) ? 'Water' : '';\n};\n\nconst wasteLabel = (line: string) => {\n if (/\\bhazardous\\b/i.test(line)) return 'Hazardous Waste';\n if (/\\b(?:recycl|scrap)\\b/i.test(line)) return 'Recycled Waste';\n if (/\\bcompost\\b/i.test(line)) return 'Composted Waste';\n if (/\\blandfill\\b/i.test(line)) return 'Landfill Waste';\n return /\\bwaste\\b/i.test(line) ? 'Waste Generated in Operations' : '';\n};\n\nconst businessTravelLabel = (line: string) => {\n if (/\\b(?:flight|airline|air\\s+travel)\\b/i.test(line)) return 'Air Travel';\n if (/\\b(?:train|rail|metro)\\b/i.test(line)) return 'Rail Travel';\n if (/\\b(?:hotel|room\\s*night|nights?)\\b/i.test(line)) return 'Hotel Stay';\n if (/\\b(?:taxi|cab|rental\\s+car|car\\s+rental)\\b/i.test(line)) return 'Rental Car';\n return '';\n};\n\nconst processEmissionLabel = (line: string) => {\n if (/\\bclinker\\b/i.test(line)) return 'Clinker';\n if (/\\bcalcination\\b/i.test(line)) return 'Calcination Process';\n if (/\\b(?:limestone|dolomite|flux)\\b/i.test(line)) return 'Flux calcination';\n if (/\\b(?:hot\\s+metal|ironmaking)\\b/i.test(line)) return 'Process Emissions- Ironmaking';\n if (/\\bsteelmaking\\b/i.test(line)) return 'Process Emissions- Steelmaking';\n return '';\n};\n\nconst genericMaterialLabel = (line: string, allowedItems: BulkBillAgentAllowedItem[]) => {\n if (metadataOnlyPattern.test(line) && !physicalUnitPattern.test(line)) return '';\n const best = bestAllowedItemForQuery(line, allowedItems);\n return best?.item.itemName || line.split('|').map((part) => part.trim()).find((part) => /[A-Za-z]/.test(part) && !metadataOnlyPattern.test(part)) || '';\n};\n\nconst commuteModeLabel = (line: string) => {\n const text = normalize(line);\n if (/\\b(bike|bikt|motorcycle)\\b/.test(text)) return 'Motorcycle';\n if (/\\b(scooty|scoow|scooter)\\b/.test(text)) return 'Scooter';\n if (/\\b(auto|byauto|auio)\\b/.test(text)) return 'Small Car Gasoline';\n if (/\\b(car|eycar|hatchback)\\b/.test(text)) return 'Hatchback Gasoline';\n if (/\\b(metro|14etro|train|rail)\\b/.test(text)) return 'Train Domestic Electric';\n if (/\\b(cycle|cycl|cyct)\\b/.test(text)) return 'Employee commute cycle';\n if (/\\b(bus)\\b/.test(text)) return 'Bus';\n return '';\n};\n\nconst extractNamedQuantityCandidates = ({\n profileId,\n group,\n lines,\n allowedItems,\n labelForLine,\n}: {\n profileId: BulkBillAgentProfileId;\n group: BulkBillAgentProfileGroup;\n lines: ReturnType<typeof profileTextLines>;\n allowedItems: BulkBillAgentAllowedItem[];\n labelForLine: (line: string, allowedItems: BulkBillAgentAllowedItem[]) => string;\n}) => lines.flatMap(({ pageNumber, lineIndex, text }) => {\n if (!text || (metadataOnlyPattern.test(text) && !physicalUnitPattern.test(text))) return [];\n const itemName = labelForLine(text, allowedItems);\n if (!itemName) return [];\n return parsePositiveNumbers(text).flatMap((entry, numberIndex) => {\n const unit = adjacentActivityUnit(text, entry.index, entry.value.length);\n if (!unit) return [];\n const allowedMatch = bestAllowedItemForQuery(`${itemName} ${text}`, allowedItems);\n return [buildProfileCandidate({\n group,\n profileId,\n pageNumber,\n lineIndex,\n numberIndex,\n itemName,\n quantity: entry.value,\n unit,\n evidenceText: text,\n allowedMatch,\n })];\n });\n});\n\nconst extractElectricityCandidates = (\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n const electricityLine = /\\b(?:net\\s+cons\\.?\\s+for\\s+billing|billed\\s+units?|billing\\s+units?|units\\s+consumed|energy\\s+consumption|import|export|generation|solar|renewable)\\b/i;\n return lines.flatMap(({ pageNumber, lineIndex, text }) => {\n if (!electricityLine.test(text) || metadataOnlyPattern.test(text)) return [];\n return parsePositiveNumbers(text).flatMap((entry, numberIndex) => {\n const unit = adjacentActivityUnit(text, entry.index, entry.value.length) || (/\\bunits?\\b/i.test(text) ? 'kWh' : '');\n if (!unit || !/\\b(?:kwh|kvah|mwh)\\b/i.test(unit)) return [];\n const role = /\\b(?:solar|renewable|generation|export)\\b/i.test(text) ? 'component_consumption' : 'bill_level_consumption';\n const allowedMatch = bestAllowedItemForQuery(text, allowedItems);\n return [buildProfileCandidate({\n group,\n profileId: 'electricity',\n pageNumber,\n lineIndex,\n numberIndex,\n itemName: allowedMatch?.item.itemName || 'Electricity Purchased from Grid',\n quantity: entry.value,\n unit,\n evidenceText: text,\n allowedMatch,\n role,\n confidence: role === 'bill_level_consumption' ? 0.86 : 0.78,\n })];\n });\n });\n};\n\nconst extractEmployeeCommutingCandidates = (\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n const totals = new Map<string, { total: number; evidence: string[]; pageNumber: number }>();\n for (const { pageNumber, text } of lines) {\n const mode = commuteModeLabel(text);\n if (!mode) continue;\n const distanceValues = parsePositiveNumbers(text)\n .filter((entry) => /\\bkm\\b/i.test(text.slice(entry.index, entry.index + 24)) || /\\bkm\\b/i.test(text));\n const value = distanceValues.length ? distanceValues[distanceValues.length - 1].number : null;\n if (!value) continue;\n const current = totals.get(mode) || { total: 0, evidence: [], pageNumber };\n current.total += value;\n if (current.evidence.length < 4) current.evidence.push(text);\n totals.set(mode, current);\n }\n return [...totals.entries()].map(([mode, aggregate], index) => {\n const allowedMatch = bestAllowedItemForQuery(mode, allowedItems);\n return buildProfileCandidate({\n group,\n profileId: 'employee_commuting',\n pageNumber: aggregate.pageNumber,\n lineIndex: index,\n numberIndex: 0,\n itemName: mode,\n quantity: String(Number(aggregate.total.toFixed(5))),\n unit: 'km',\n evidenceText: aggregate.evidence.join(' | '),\n allowedMatch,\n role: 'aggregated_distance',\n confidence: 0.88,\n });\n });\n};\n\nconst extractForProfile = (\n profileId: BulkBillAgentProfileId,\n group: BulkBillAgentProfileGroup,\n lines: ReturnType<typeof profileTextLines>,\n allowedItems: BulkBillAgentAllowedItem[],\n) => {\n if (profileId === 'electricity') return extractElectricityCandidates(group, lines, allowedItems);\n if (profileId === 'employee_commuting') return extractEmployeeCommutingCandidates(group, lines, allowedItems);\n\n const labelForProfile: Partial<Record<BulkBillAgentProfileId, (line: string, allowedItems: BulkBillAgentAllowedItem[]) => string>> = {\n fuel_combustion: (line) => fuelLabel(line),\n lpg_usage: (line) => fuelLabel(line),\n refrigerants: (line) => refrigerantLabel(line),\n industrial_gases: (line) => industrialGasLabel(line),\n business_travel: (line) => businessTravelLabel(line),\n fire_extinguisher: (line) => fireExtinguisherLabel(line),\n sf6_usage: (line) => sf6Label(line),\n water: (line) => waterLabel(line),\n waste: (line) => wasteLabel(line),\n process_emissions: (line) => processEmissionLabel(line),\n purchased_goods: genericMaterialLabel,\n generic_material: genericMaterialLabel,\n };\n\n const labelForLine = labelForProfile[profileId] || genericMaterialLabel;\n return extractNamedQuantityCandidates({ profileId, group, lines, allowedItems, labelForLine });\n};\n\nexport const extractBulkBillAgentProfileCandidates = ({\n mappingContext = {},\n pages = [],\n group,\n documentText = '',\n}: BulkBillAgentProfileExtractionInput) => {\n const allowedItems = Array.isArray(mappingContext.allowedItems) ? mappingContext.allowedItems : [];\n const lines = profileTextLines(pages, group, documentText);\n const groupText = documentText || lines.map((line) => line.text).join('\\n');\n const primaryProfile = getPrimaryBulkBillAgentProfile(mappingContext, groupText);\n const profiles = getBulkBillAgentProfilesForMappingContext(mappingContext, groupText)\n .map((entry) => entry.profile.id)\n .filter((profileId, index, profileIds) => profileIds.indexOf(profileId) === index);\n const extractionProfiles = profiles.length ? profiles : [primaryProfile.id];\n const candidates = extractionProfiles.flatMap((profileId) =>\n extractForProfile(profileId, group, lines, allowedItems),\n );\n const seen = new Set<string>();\n return candidates\n .sort((left, right) => right.confidence - left.confidence)\n .filter((candidate) => {\n const key = [candidate.profileId, candidate.matchedAllowedItemKey || candidate.itemName, candidate.quantity, candidate.unit, candidate.pageNumber].join('|');\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n })\n .slice(0, 30);\n};\n\nexport interface BulkBillAgentWorkerPromptInput {\n mappingContext?: BulkBillAgentMappingContext;\n groupId: string;\n pageNumbers: number[];\n documentType?: string;\n documentText?: string;\n}\n\nexport const buildBulkBillAgentRouterPrompt = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const config = buildBulkBillAgentPromptConfig(context, documentText);\n return `You are the ZeroCarbon bulk bill router and grouping supervisor.\n\nYour only job is to prepare worker-ready bill groups.\n\nResponsibilities:\n- inspect the ERP page context and allowed items\n- load document metadata\n- read OCR text in batches for the whole document\n- fingerprint pages when useful\n- compare neighboring page boundaries when useful\n- stage bill groups\n- classify each staged group\n- record ERP compatibility for each staged group\n\nDo not extract quantities, do not save extracted rows, do not validate rows, and do not persist rows.\n\nStop once every page is read and every staged group has both:\n- a document classification\n- an ERP compatibility decision\n\nLocked ERP page context:\n- profile: ${config.profile.label} (${config.profile.id})\n- scope: ${config.uploadContext.scope || 'not specified'}\n- category: ${config.uploadContext.category || 'not specified'}\n- plant: ${config.uploadContext.plant || 'not specified'}\n\nAllowed ERP items on this page (${config.allowedItemCount} total):\n${promptBulletList(config.allowedItemSummaries.slice(0, 30))}\n\nIf the document appears to contain multiple bills or mixed bill types, stage separate groups. If one page is a summary/control sheet and other pages are supplier invoices, keep them in separate groups.`;\n};\n\nexport const buildBulkBillAgentWorkerPrompt = ({\n mappingContext = {},\n groupId,\n pageNumbers,\n documentType = 'unknown',\n documentText = '',\n}: BulkBillAgentWorkerPromptInput) => {\n const config = buildBulkBillAgentPromptConfig(mappingContext, documentText);\n return `You are the ZeroCarbon ${config.profile.label} worker for one staged bill group.\n\nYou must only work on:\n- groupId: ${groupId}\n- pages: ${pageNumbers.join(', ')}\n- classified document type: ${documentType}\n\nYour job:\n- inspect only this group's evidence\n- extract physical activity candidates for this group\n- repair OCR issues when evidence supports it\n- search/inspect the locked ERP items for this group\n- save extracted rows for this group\n- save review rows for this group when a safe normal row cannot be produced\n\nDo not regroup the document. Do not validate all rows across the whole job. Do not persist validated rows. Do not finalize the whole job.\n\nActive extraction profile:\n- profile: ${config.profile.label} (${config.profile.id})\n- scope: ${config.uploadContext.scope || 'not specified'}\n- category: ${config.uploadContext.category || 'not specified'}\n- plant: ${config.uploadContext.plant || 'not specified'}\n\nCategory-specific extraction rules:\n${promptBulletList(config.profile.extractionRules)}\n\nCategory-specific reject rules:\n${promptBulletList(config.profile.rejectRules)}\n\nAllowed ERP items for this worker (${config.allowedItemCount} total):\n${promptBulletList(config.allowedItemSummaries.slice(0, 30))}\n\nCritical rules:\n- never save rows for any other group\n- never use another group's page evidence\n- if the group is incompatible with the ERP page, save review rows instead of forcing mapping\n- if the document has its own dates or period, use those instead of upload context`;\n};\n\nexport const buildBulkBillAgentFinalizerPrompt = (\n context: BulkBillAgentMappingContext = {},\n documentText = '',\n) => {\n const config = buildBulkBillAgentPromptConfig(context, documentText);\n return `You are the ZeroCarbon finalizer and persistence worker.\n\nYour only job is to:\n- inspect the current workspace state\n- validate extracted rows against locked ERP items\n- persist validated rows to the backend\n- finalize the job with the correct outcome\n\nDo not read more pages. Do not restage groups. Do not perform new extraction unless there is a critical gap that prevents safe finalization.\n\nActive ERP page:\n- profile: ${config.profile.label} (${config.profile.id})\n- scope: ${config.uploadContext.scope || 'not specified'}\n- category: ${config.uploadContext.category || 'not specified'}\n\nFinalize rules:\n- use outcome completed when backend persistence succeeded, no review rows remain, and backend returned no blocking review/conflict rows\n- backend skipped duplicates are non-blocking if the mapped row was otherwise persisted or intentionally skipped as a duplicate\n- use outcome review_required when review rows remain or backend returned blocking review/conflict rows\n- use outcome failed only for unrecoverable execution errors`;\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -980,6 +980,7 @@ declare const getBulkBillAgentProfilesForMappingContext: (context?: BulkBillAgen
980
980
  }[];
981
981
  declare const getPrimaryBulkBillAgentProfile: (context?: BulkBillAgentMappingContext, documentText?: string) => BulkBillAgentProfile;
982
982
  declare const buildBulkBillAgentPromptConfig: (context?: BulkBillAgentMappingContext, documentText?: string) => BulkBillAgentPromptConfig;
983
+ declare const buildBulkBillAgentSystemPrompt: (context?: BulkBillAgentMappingContext, documentText?: string) => string;
983
984
  interface BulkBillAgentProfilePage {
984
985
  pageNumber: number | string;
985
986
  text?: string;
@@ -1011,6 +1012,16 @@ interface BulkBillAgentProfileExtractionInput {
1011
1012
  documentText?: string;
1012
1013
  }
1013
1014
  declare const extractBulkBillAgentProfileCandidates: ({ mappingContext, pages, group, documentText, }: BulkBillAgentProfileExtractionInput) => BulkBillAgentProfileCandidate[];
1015
+ interface BulkBillAgentWorkerPromptInput {
1016
+ mappingContext?: BulkBillAgentMappingContext;
1017
+ groupId: string;
1018
+ pageNumbers: number[];
1019
+ documentType?: string;
1020
+ documentText?: string;
1021
+ }
1022
+ declare const buildBulkBillAgentRouterPrompt: (context?: BulkBillAgentMappingContext, documentText?: string) => string;
1023
+ declare const buildBulkBillAgentWorkerPrompt: ({ mappingContext, groupId, pageNumbers, documentType, documentText, }: BulkBillAgentWorkerPromptInput) => string;
1024
+ declare const buildBulkBillAgentFinalizerPrompt: (context?: BulkBillAgentMappingContext, documentText?: string) => string;
1014
1025
 
1015
1026
  declare const getUserNameScopeConfig: <T = any>(scopeKey: "scope1" | "scope2" | "scope3" | "waterManagement", username?: string, defaultScope?: T) => T;
1016
1027
  type IndustryAdditionalScopeItem = {
@@ -6527,5 +6538,5 @@ declare namespace index {
6527
6538
  };
6528
6539
  }
6529
6540
 
6530
- export { ALL_SCOPES_3_RCO, API_ENDPOINTS, API_SCOPE3_CEMENT_CONFIG, BILL_CALCULATION_CONFIGS, BULK_BILL_AGENT_PROFILES, BillManager, CCTS_ALLSCOPES_CEMENT, CCTS_CALCINATION_PRODUCTS, CCTS_ELECTRICITY_PRODUCTS, CCTS_FIRE_EXTINGUISHER_PRODUCTS, CCTS_FUEL_COMBUSTION_PRODUCTS, CCTS_LPG_PRODUCTS, CCTS_MINING_OPERATIONS_PRODUCTS, CCTS_ONSITE_POWER_PRODUCTS, CCTS_PURCHASED_ELECTRICITY, CCTS_REFRIGERANTS, CCTS_SCOPE1_CEMENT, CCTS_SCOPE2_CEMENT, CCTS_SF6_PRODUCTS, CCTS_TABLE_COLUMNS, DEFAULT_BILL_MATCHING_CONFIG, EmissionSourceGenerator, FRONTEND_INDUSTRY_CONFIGS, HTTP_STATUS, INDUSTRIES_CONFIG, INDUSTRY_MAPPING, INDUSTRY_SPECIFIC_FIELDS, INTENSITY_FIELD_LABELS, ISO_CATEGORIES_PACKAGING, index as Industries, UI_FEATURES, WATER_PRODUCTS$5 as WATER_PRODUCTS, addItemForUser, buildBulkBillAgentPromptConfig, buildUserConfigItemKey, calculateCCTSEmission, calculateIntensityMetrics, categorizeApiItem, cleanValue, createBillManager, createCapitalizedMonthMapping, createEmissionSourceGenerator, createMonthMapping, debugCarbonIntensityMapping, extractBulkBillAgentProfileCandidates, extractCarbonIntensityData, formatEmissionValue, formatIntensityValue, formatKPIEmission, formatMonthlyEmission, formatPercentage, getAllConfig, getApiIndustryType, getAvailableFieldsForIndustry, getBulkBillAgentProfile, getBulkBillAgentProfilesForMappingContext, getCombinedBackendConfig, getIndustryBackendConfig, getIndustryConfig$1 as getIndustryConfig, getIndustryFieldConfig, getIntensityFormulas, getItemsForUser, getPlantNameConfig, getPrimaryBulkBillAgentProfile, getRCOConfigByName, getScope3ConfigByName, getUserNameBackendConfig, getUserNameScopeConfig, hasIntensities, isUIFeatureEnabled, listBulkBillAgentProfiles, mapIndustryToApiType, mergeUserItemsIntoIndustryConfig, normalizeConfigKeyText, normalizeConfigText, resolveEmissionFactorsForUser, sameUserConfigText, sanitizeNumber, scoreBulkBillAgentProfile, supportsIntensityCalculations, updateItemEmissionFactorForUser, updateSdkItemEmissionFactorForUser, validateCarbonIntensityData };
6531
- export type { AllConfigurations, AlloyRequest, AlloyResponse, AluminiumRequest, AluminiumResponse, ApiEndpointConfig, ApiResponse, AutomobileRequest, AutomobileResponse, AviationRequest, AviationResponse, BackendAdditionalScopeItem, BackendEmissionItem, BackendEmissions, BackendEquipmentCategory, BackendIndustries, BackendIndustryConfig, BackendProduct, BackendScope, BackendScope3Item, BackendUserConfig, BackendUserConfigs, BaseRequest, BaseResponse, Bill, BillCalculationConfig, BillFilterOptions, BillMatchingConfig, BulkBillAgentAllowedItem, BulkBillAgentMappingContext, BulkBillAgentProfile, BulkBillAgentProfileCandidate, BulkBillAgentProfileExtractionInput, BulkBillAgentProfileGroup, BulkBillAgentProfileId, BulkBillAgentProfilePage, BulkBillAgentPromptConfig, BusinessTravelEmission, BusinessTravelEmissionAttributes, BusinessTravelEmissionsResponse, BillsAnalyzed$1 as CarbonIntensityBillsAnalyzed, Calculations$1 as CarbonIntensityCalculations, EmissionData$2 as CarbonIntensityEmissionData, ErrorResponse$1 as CarbonIntensityErrorResponse, CarbonIntensityRequest, CarbonIntensityResponse, ChemicalRequest, ChemicalResponse, DetailedCarbonIntensityResponse, EditableItem, EmissionData$3 as EmissionData, EmissionSource, Emissions$j as Emissions, EmissionsDataAttributes, EmissionsDataResponse, FieldConfig, FoodBeveragesRequest, FoodBeveragesResponse, FormData, FormValidationResult, FrontendIndustryConfig, HospitalityRequest, HospitalityResponse, IndustryConfig$1 as IndustryConfig, EmissionData as IndustryEmissionData, IndustryFieldConfig, IndustryFieldSection, ProductionData as IndustryProductionData, IndustryType, IntensityCalculation, IntensityValue, LogisticsRequest, LogisticsResponse, ManufacturingRequest, ManufacturingResponse, Meta, MetalEnergyRequest, MetalEnergyResponse, PackagingRequest, PackagingResponse, Pagination, PetrochemicalRequest, PetrochemicalResponse, PharmaRequest, PharmaResponse, PlantNameConfig, ProcessedEmissionCategory, ProcessedEmissionItem, ProcessedScope3Data, RealEstateRequest, RealEstateResponse, BillsAnalyzed as ResponseBillsAnalyzed, Calculations as ResponseCalculations, EmissionData$1 as ResponseEmissionData, ErrorResponse as ResponseErrorResponse, ScopeConfig, ScopeProduct, ShippingRequest, ShippingResponse, SteelRequest, SteelResponse, StrapiItem, StrapiResponse, TelecommunicationRequest, TelecommunicationResponse, TextileRequest, TextileResponse, TransportationEmission, TransportationEmissionAttributes, TransportationEmissionsResponse, UserConfigApiClient, UserConfigItem, UserData, UserEmissionFactorApprovalResponse, UserEmissionFactorResolution, UtilitiesRequest, UtilitiesResponse, ValidationError, VehicleEmission, VehicleEmissionAttributes, VehicleEmissionsResponse };
6541
+ export { ALL_SCOPES_3_RCO, API_ENDPOINTS, API_SCOPE3_CEMENT_CONFIG, BILL_CALCULATION_CONFIGS, BULK_BILL_AGENT_PROFILES, BillManager, CCTS_ALLSCOPES_CEMENT, CCTS_CALCINATION_PRODUCTS, CCTS_ELECTRICITY_PRODUCTS, CCTS_FIRE_EXTINGUISHER_PRODUCTS, CCTS_FUEL_COMBUSTION_PRODUCTS, CCTS_LPG_PRODUCTS, CCTS_MINING_OPERATIONS_PRODUCTS, CCTS_ONSITE_POWER_PRODUCTS, CCTS_PURCHASED_ELECTRICITY, CCTS_REFRIGERANTS, CCTS_SCOPE1_CEMENT, CCTS_SCOPE2_CEMENT, CCTS_SF6_PRODUCTS, CCTS_TABLE_COLUMNS, DEFAULT_BILL_MATCHING_CONFIG, EmissionSourceGenerator, FRONTEND_INDUSTRY_CONFIGS, HTTP_STATUS, INDUSTRIES_CONFIG, INDUSTRY_MAPPING, INDUSTRY_SPECIFIC_FIELDS, INTENSITY_FIELD_LABELS, ISO_CATEGORIES_PACKAGING, index as Industries, UI_FEATURES, WATER_PRODUCTS$5 as WATER_PRODUCTS, addItemForUser, buildBulkBillAgentFinalizerPrompt, buildBulkBillAgentPromptConfig, buildBulkBillAgentRouterPrompt, buildBulkBillAgentSystemPrompt, buildBulkBillAgentWorkerPrompt, buildUserConfigItemKey, calculateCCTSEmission, calculateIntensityMetrics, categorizeApiItem, cleanValue, createBillManager, createCapitalizedMonthMapping, createEmissionSourceGenerator, createMonthMapping, debugCarbonIntensityMapping, extractBulkBillAgentProfileCandidates, extractCarbonIntensityData, formatEmissionValue, formatIntensityValue, formatKPIEmission, formatMonthlyEmission, formatPercentage, getAllConfig, getApiIndustryType, getAvailableFieldsForIndustry, getBulkBillAgentProfile, getBulkBillAgentProfilesForMappingContext, getCombinedBackendConfig, getIndustryBackendConfig, getIndustryConfig$1 as getIndustryConfig, getIndustryFieldConfig, getIntensityFormulas, getItemsForUser, getPlantNameConfig, getPrimaryBulkBillAgentProfile, getRCOConfigByName, getScope3ConfigByName, getUserNameBackendConfig, getUserNameScopeConfig, hasIntensities, isUIFeatureEnabled, listBulkBillAgentProfiles, mapIndustryToApiType, mergeUserItemsIntoIndustryConfig, normalizeConfigKeyText, normalizeConfigText, resolveEmissionFactorsForUser, sameUserConfigText, sanitizeNumber, scoreBulkBillAgentProfile, supportsIntensityCalculations, updateItemEmissionFactorForUser, updateSdkItemEmissionFactorForUser, validateCarbonIntensityData };
6542
+ export type { AllConfigurations, AlloyRequest, AlloyResponse, AluminiumRequest, AluminiumResponse, ApiEndpointConfig, ApiResponse, AutomobileRequest, AutomobileResponse, AviationRequest, AviationResponse, BackendAdditionalScopeItem, BackendEmissionItem, BackendEmissions, BackendEquipmentCategory, BackendIndustries, BackendIndustryConfig, BackendProduct, BackendScope, BackendScope3Item, BackendUserConfig, BackendUserConfigs, BaseRequest, BaseResponse, Bill, BillCalculationConfig, BillFilterOptions, BillMatchingConfig, BulkBillAgentAllowedItem, BulkBillAgentMappingContext, BulkBillAgentProfile, BulkBillAgentProfileCandidate, BulkBillAgentProfileExtractionInput, BulkBillAgentProfileGroup, BulkBillAgentProfileId, BulkBillAgentProfilePage, BulkBillAgentPromptConfig, BulkBillAgentWorkerPromptInput, BusinessTravelEmission, BusinessTravelEmissionAttributes, BusinessTravelEmissionsResponse, BillsAnalyzed$1 as CarbonIntensityBillsAnalyzed, Calculations$1 as CarbonIntensityCalculations, EmissionData$2 as CarbonIntensityEmissionData, ErrorResponse$1 as CarbonIntensityErrorResponse, CarbonIntensityRequest, CarbonIntensityResponse, ChemicalRequest, ChemicalResponse, DetailedCarbonIntensityResponse, EditableItem, EmissionData$3 as EmissionData, EmissionSource, Emissions$j as Emissions, EmissionsDataAttributes, EmissionsDataResponse, FieldConfig, FoodBeveragesRequest, FoodBeveragesResponse, FormData, FormValidationResult, FrontendIndustryConfig, HospitalityRequest, HospitalityResponse, IndustryConfig$1 as IndustryConfig, EmissionData as IndustryEmissionData, IndustryFieldConfig, IndustryFieldSection, ProductionData as IndustryProductionData, IndustryType, IntensityCalculation, IntensityValue, LogisticsRequest, LogisticsResponse, ManufacturingRequest, ManufacturingResponse, Meta, MetalEnergyRequest, MetalEnergyResponse, PackagingRequest, PackagingResponse, Pagination, PetrochemicalRequest, PetrochemicalResponse, PharmaRequest, PharmaResponse, PlantNameConfig, ProcessedEmissionCategory, ProcessedEmissionItem, ProcessedScope3Data, RealEstateRequest, RealEstateResponse, BillsAnalyzed as ResponseBillsAnalyzed, Calculations as ResponseCalculations, EmissionData$1 as ResponseEmissionData, ErrorResponse as ResponseErrorResponse, ScopeConfig, ScopeProduct, ShippingRequest, ShippingResponse, SteelRequest, SteelResponse, StrapiItem, StrapiResponse, TelecommunicationRequest, TelecommunicationResponse, TextileRequest, TextileResponse, TransportationEmission, TransportationEmissionAttributes, TransportationEmissionsResponse, UserConfigApiClient, UserConfigItem, UserData, UserEmissionFactorApprovalResponse, UserEmissionFactorResolution, UtilitiesRequest, UtilitiesResponse, ValidationError, VehicleEmission, VehicleEmissionAttributes, VehicleEmissionsResponse };