PrithviGuardian / client /src /lib /knowledgeVault.ts
Varad Bakshi
Fresh upload
e7427b5
Raw
History Blame Contribute Delete
23.1 kB
// Knowledge Vault of Indian Environmental Laws, Policies, and IS Codes
// Comprehensive offline reference system for environmental compliance
interface LegalDocument {
id: string;
title: string;
type: 'act' | 'rule' | 'policy' | 'standard' | 'guideline' | 'notification';
authority: string;
year: number;
status: 'active' | 'amended' | 'superseded';
summary: string;
keyProvisions: string[];
applicableTo: string[];
penalties: string[];
references: string[];
lastUpdated: Date;
}
interface ISCode {
code: string;
title: string;
category: string;
year: number;
status: 'current' | 'revised' | 'withdrawn';
scope: string;
keyRequirements: string[];
testMethods: string[];
applicableIndustries: string[];
relatedCodes: string[];
}
interface ComplianceCheck {
parameter: string;
value: number;
unit: string;
applicable: LegalDocument[];
compliance: 'compliant' | 'non_compliant' | 'marginal';
recommendations: string[];
nextReview: Date;
}
class KnowledgeVault {
private legalDocuments: Map<string, LegalDocument> = new Map();
private isCodes: Map<string, ISCode> = new Map();
private searchIndex: Map<string, string[]> = new Map();
constructor() {
this.initializeLegalDatabase();
this.initializeISCodes();
this.buildSearchIndex();
}
// Search for legal documents
searchLegalDocuments(query: string, filters?: {
type?: LegalDocument['type'];
authority?: string;
year?: number;
}): LegalDocument[] {
try {
if (!query || query.trim().length === 0) {
return this.getAllDocuments(filters);
}
const searchTerms = query.toLowerCase().split(' ').filter(term => term.length > 2);
const results = new Set<string>();
// Search in index
searchTerms.forEach(term => {
const matches = this.searchIndex.get(term) || [];
matches.forEach(docId => results.add(docId));
});
let documents = Array.from(results)
.map(id => this.legalDocuments.get(id))
.filter((doc): doc is LegalDocument => doc !== undefined);
// Apply filters
if (filters) {
documents = documents.filter(doc => {
if (filters.type && doc.type !== filters.type) return false;
if (filters.authority && !doc.authority.toLowerCase().includes(filters.authority.toLowerCase())) return false;
if (filters.year && doc.year !== filters.year) return false;
return true;
});
}
return documents.sort((a, b) => b.year - a.year);
} catch (error) {
throw new Error(`Failed to search legal documents: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Search IS Codes
searchISCodes(query: string, category?: string): ISCode[] {
try {
if (!query || query.trim().length === 0) {
const allCodes = Array.from(this.isCodes.values());
return category
? allCodes.filter(code => code.category.toLowerCase().includes(category.toLowerCase()))
: allCodes;
}
const searchTerm = query.toLowerCase();
return Array.from(this.isCodes.values()).filter(code =>
code.code.toLowerCase().includes(searchTerm) ||
code.title.toLowerCase().includes(searchTerm) ||
code.scope.toLowerCase().includes(searchTerm) ||
(category && code.category.toLowerCase().includes(category.toLowerCase()))
).sort((a, b) => b.year - a.year);
} catch (error) {
throw new Error(`Failed to search IS codes: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Check compliance for specific parameters
checkCompliance(parameter: string, value: number, unit: string, context?: {
industryType?: string;
location?: string;
dischargeTo?: string;
}): ComplianceCheck {
try {
if (typeof value !== 'number' || isNaN(value)) {
throw new Error('Invalid parameter value');
}
const applicableDocs = this.getApplicableRegulations(parameter, context);
const limits = this.extractLimits(parameter, applicableDocs);
let compliance: ComplianceCheck['compliance'] = 'compliant';
const recommendations: string[] = [];
// Check against limits
for (const limit of limits) {
if (value > limit.maxValue) {
compliance = 'non_compliant';
recommendations.push(`Exceeds ${limit.standard} limit of ${limit.maxValue} ${unit}`);
} else if (value > limit.maxValue * 0.8) {
compliance = 'marginal';
recommendations.push(`Approaching ${limit.standard} limit - monitor closely`);
}
}
if (compliance === 'compliant') {
recommendations.push('Parameter within acceptable limits');
}
const nextReview = new Date();
nextReview.setMonth(nextReview.getMonth() + 6); // 6 months from now
return {
parameter,
value,
unit,
applicable: applicableDocs,
compliance,
recommendations,
nextReview
};
} catch (error) {
throw new Error(`Failed to check compliance: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Get applicable regulations for parameter
getApplicableRegulations(parameter: string, context?: any): LegalDocument[] {
const parameterKey = parameter.toLowerCase();
const regulations: LegalDocument[] = [];
this.legalDocuments.forEach(doc => {
const isApplicable = doc.keyProvisions.some(provision =>
provision.toLowerCase().includes(parameterKey) ||
provision.toLowerCase().includes('water') ||
provision.toLowerCase().includes('air') ||
provision.toLowerCase().includes('emission')
);
if (isApplicable) {
regulations.push(doc);
}
});
return regulations;
}
// Get environmental clearance requirements
getEnvironmentalClearanceInfo(projectType: string, projectCapacity?: number): {
category: 'A' | 'B1' | 'B2' | 'exempted';
authority: string;
requirements: string[];
timeline: string;
fees: string;
validity: string;
} {
try {
const projectTypeLower = projectType.toLowerCase();
// Simplified categorization based on EIA Notification 2006
let category: 'A' | 'B1' | 'B2' | 'exempted';
let authority: string;
let requirements: string[];
let timeline: string;
let fees: string;
if (projectTypeLower.includes('thermal power') && (projectCapacity || 0) >= 500) {
category = 'A';
authority = 'MoEF&CC, New Delhi';
timeline = '210 days';
fees = '₹5-50 lakhs';
} else if (projectTypeLower.includes('cement') && (projectCapacity || 0) >= 1.0) {
category = 'A';
authority = 'MoEF&CC, New Delhi';
timeline = '210 days';
fees = '₹10-25 lakhs';
} else if (projectTypeLower.includes('steel') || projectTypeLower.includes('iron')) {
category = (projectCapacity || 0) >= 5.0 ? 'A' : 'B1';
authority = category === 'A' ? 'MoEF&CC, New Delhi' : 'State Environment Impact Assessment Authority';
timeline = category === 'A' ? '210 days' : '105 days';
fees = category === 'A' ? '₹15-40 lakhs' : '₹2-10 lakhs';
} else {
category = 'B2';
authority = 'State Environment Impact Assessment Authority';
timeline = '105 days';
fees = '₹50,000-5 lakhs';
}
requirements = this.getECRequirements(category);
return {
category,
authority,
requirements,
timeline,
fees,
validity: '30 years (renewable)'
};
} catch (error) {
throw new Error(`Failed to get EC information: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Get consent to operate requirements
getConsentRequirements(industryType: string, pollutionCategory: 'red' | 'orange' | 'green' | 'white'): {
authority: string;
validity: string;
requirements: string[];
fees: string;
monitoring: string[];
} {
try {
const requirements = [
'Valid Environmental Clearance (if applicable)',
'Consent to Establish',
'Pollution control equipment installation certificates',
'Effluent/emission monitoring reports',
'Waste management plan',
'Emergency response plan'
];
const monitoring = [
'Monthly stack emission monitoring',
'Daily effluent monitoring',
'Quarterly ambient air quality monitoring',
'Annual environmental audit'
];
let validity: string;
let fees: string;
switch (pollutionCategory) {
case 'red':
validity = '5 years';
fees = '₹25,000-10 lakhs';
monitoring.push('Continuous emission monitoring system (CEMS)');
break;
case 'orange':
validity = '5 years';
fees = '₹10,000-5 lakhs';
break;
case 'green':
validity = '5 years';
fees = '₹5,000-1 lakh';
break;
default:
validity = '5 years';
fees = '₹2,500-25,000';
}
return {
authority: 'State Pollution Control Board',
validity,
requirements,
fees,
monitoring
};
} catch (error) {
throw new Error(`Failed to get consent requirements: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Export knowledge base
exportKnowledgeBase(): string {
try {
const exportData = {
legalDocuments: Array.from(this.legalDocuments.values()),
isCodes: Array.from(this.isCodes.values()),
exportDate: new Date().toISOString(),
version: '1.0'
};
return JSON.stringify(exportData, null, 2);
} catch (error) {
throw new Error(`Failed to export knowledge base: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
// Private initialization methods
private initializeLegalDatabase(): void {
// Water-related regulations
this.addLegalDocument({
id: 'water_act_1974',
title: 'Water (Prevention and Control of Pollution) Act, 1974',
type: 'act',
authority: 'Parliament of India',
year: 1974,
status: 'active',
summary: 'Provides for the prevention and control of water pollution and maintaining or restoring of wholesomeness of water.',
keyProvisions: [
'Prohibition of discharge of pollutants into water bodies without consent',
'Establishment of Central and State Pollution Control Boards',
'Power to take samples and analyze water',
'Penalties for violation of provisions'
],
applicableTo: ['Industries', 'Municipalities', 'Commercial establishments'],
penalties: ['Imprisonment up to 6 years', 'Fine up to ₹1 lakh', 'Daily fine of ₹5,000'],
references: ['Water Act 1974', 'Water Rules 1975']
});
this.addLegalDocument({
id: 'air_act_1981',
title: 'Air (Prevention and Control of Pollution) Act, 1981',
type: 'act',
authority: 'Parliament of India',
year: 1981,
status: 'active',
summary: 'Provides for the prevention, control and abatement of air pollution.',
keyProvisions: [
'Prohibition of air polluting industries in air pollution control areas',
'Consent required for establishment and operation',
'Power to give directions for closure of industries',
'Standards for emission of air pollutants'
],
applicableTo: ['Industries', 'Vehicles', 'Commercial establishments'],
penalties: ['Imprisonment up to 6 years', 'Fine up to ₹1 lakh', 'Daily fine of ₹5,000'],
references: ['Air Act 1981', 'Air Rules 1982']
});
this.addLegalDocument({
id: 'environment_protection_act_1986',
title: 'Environment (Protection) Act, 1986',
type: 'act',
authority: 'Parliament of India',
year: 1986,
status: 'active',
summary: 'Umbrella legislation providing for protection and improvement of environment.',
keyProvisions: [
'General powers to Central Government for environmental protection',
'Appointment of officers and authorities',
'Power to direct closure of industries',
'Environmental standards and guidelines'
],
applicableTo: ['All activities affecting environment'],
penalties: ['Imprisonment up to 5 years', 'Fine up to ₹1 lakh', 'Daily fine'],
references: ['EPA 1986', 'Environment Rules 1986']
});
this.addLegalDocument({
id: 'eia_notification_2006',
title: 'Environmental Impact Assessment Notification, 2006',
type: 'notification',
authority: 'Ministry of Environment, Forest and Climate Change',
year: 2006,
status: 'amended',
summary: 'Mandates prior environmental clearance for specified activities.',
keyProvisions: [
'Categorization of projects (Category A and B)',
'Screening and scoping procedures',
'Public consultation requirements',
'Monitoring and compliance procedures'
],
applicableTo: ['Mining', 'Thermal power', 'Industrial projects', 'Infrastructure'],
penalties: ['Project closure', 'Penalty up to ₹1 crore', 'Legal action'],
references: ['EIA Notification 2006', 'EIA Amendment 2020']
});
this.addLegalDocument({
id: 'swm_rules_2016',
title: 'Solid Waste Management Rules, 2016',
type: 'rule',
authority: 'Ministry of Environment, Forest and Climate Change',
year: 2016,
status: 'active',
summary: 'Comprehensive rules for management of solid waste.',
keyProvisions: [
'Waste segregation at source',
'Extended producer responsibility',
'Processing and treatment of waste',
'Waste to energy recovery'
],
applicableTo: ['Urban local bodies', 'Waste generators', 'Bulk generators'],
penalties: ['Fine as per local bye-laws', 'Spot fine up to ₹500'],
references: ['SWM Rules 2016', 'SWM Amendment 2018']
});
this.addLegalDocument({
id: 'hwm_rules_2016',
title: 'Hazardous and Other Wastes Management Rules, 2016',
type: 'rule',
authority: 'Ministry of Environment, Forest and Climate Change',
year: 2016,
status: 'active',
summary: 'Rules for management of hazardous and other wastes.',
keyProvisions: [
'Authorization for hazardous waste management',
'Manifest system for waste tracking',
'Treatment and disposal standards',
'Liability and compensation provisions'
],
applicableTo: ['Industries generating hazardous waste', 'Treatment facilities'],
penalties: ['Closure directions', 'Fine up to ₹1 crore', 'Criminal liability'],
references: ['HWM Rules 2016', 'HWM Amendment 2019']
});
}
private initializeISCodes(): void {
// Water quality standards
this.addISCode({
code: 'IS 10500:2012',
title: 'Drinking Water — Specification',
category: 'Water Quality',
year: 2012,
status: 'current',
scope: 'Specifies requirements for drinking water quality',
keyRequirements: [
'pH: 6.5-8.5',
'TDS: 500 mg/L (acceptable), 2000 mg/L (permissible)',
'Turbidity: 1 NTU (acceptable), 5 NTU (permissible)',
'Chloride: 250 mg/L (acceptable), 1000 mg/L (permissible)'
],
testMethods: ['IS 3025 series for water testing'],
applicableIndustries: ['Water supply', 'Bottled water', 'Food industry'],
relatedCodes: ['IS 3025', 'IS 14543']
});
this.addISCode({
code: 'IS 3025:2009',
title: 'Methods of Sampling and Test (Physical and Chemical) for Water and Wastewater',
category: 'Testing Methods',
year: 2009,
status: 'current',
scope: 'Standard methods for water and wastewater analysis',
keyRequirements: [
'Sample collection procedures',
'Preservation techniques',
'Analytical methods for various parameters',
'Quality control measures'
],
testMethods: ['Gravimetric', 'Titrimetric', 'Spectrophotometric', 'Chromatographic'],
applicableIndustries: ['Laboratories', 'Water treatment', 'Environmental monitoring'],
relatedCodes: ['IS 10500', 'IS 2490']
});
// Air quality standards
this.addISCode({
code: 'IS 5182:2006',
title: 'Methods for Measurement of Air Pollution',
category: 'Air Quality',
year: 2006,
status: 'current',
scope: 'Methods for measurement of ambient air quality',
keyRequirements: [
'Sampling methods for particulate matter',
'Gas sampling techniques',
'Calibration procedures',
'Data validation methods'
],
testMethods: ['Gravimetric analysis', 'Spectrophotometry', 'Gas chromatography'],
applicableIndustries: ['Environmental monitoring', 'Industrial hygiene', 'Research'],
relatedCodes: ['IS 11255', 'IS 9969']
});
// Structural codes
this.addISCode({
code: 'IS 456:2000',
title: 'Plain and Reinforced Concrete - Code of Practice',
category: 'Structural Engineering',
year: 2000,
status: 'current',
scope: 'Requirements for design and construction of concrete structures',
keyRequirements: [
'Material specifications',
'Design methods and principles',
'Construction practices',
'Quality control requirements'
],
testMethods: ['Concrete strength testing', 'Durability tests', 'Non-destructive testing'],
applicableIndustries: ['Construction', 'Infrastructure', 'Industrial structures'],
relatedCodes: ['IS 875', 'IS 1893', 'IS 13920']
});
this.addISCode({
code: 'IS 875:1987',
title: 'Code of Practice for Design Loads (Other than Earthquake) for Buildings and Structures',
category: 'Structural Engineering',
year: 1987,
status: 'current',
scope: 'Design loads for buildings and structures',
keyRequirements: [
'Dead load calculations',
'Live load specifications',
'Wind load calculations',
'Snow load considerations'
],
testMethods: ['Load testing', 'Material property testing'],
applicableIndustries: ['Building construction', 'Industrial structures', 'Infrastructure'],
relatedCodes: ['IS 456', 'IS 800', 'IS 1893']
});
// Environmental engineering codes
this.addISCode({
code: 'IS 4764:2017',
title: 'Code of Practice for Concrete Structures for the Storage of Liquids',
category: 'Environmental Engineering',
year: 2017,
status: 'current',
scope: 'Design and construction of liquid storage structures',
keyRequirements: [
'Structural design criteria',
'Waterproofing requirements',
'Joint design and sealing',
'Quality control procedures'
],
testMethods: ['Water tightness testing', 'Structural load testing'],
applicableIndustries: ['Water treatment', 'Chemical storage', 'Sewage treatment'],
relatedCodes: ['IS 456', 'IS 3370', 'IS 875']
});
}
private addLegalDocument(doc: Omit<LegalDocument, 'lastUpdated'>): void {
const document: LegalDocument = {
...doc,
lastUpdated: new Date()
};
this.legalDocuments.set(doc.id, document);
}
private addISCode(code: ISCode): void {
this.isCodes.set(code.code, code);
}
private buildSearchIndex(): void {
// Build search index for legal documents
this.legalDocuments.forEach(doc => {
const searchableText = [
doc.title,
doc.summary,
...doc.keyProvisions,
...doc.applicableTo
].join(' ').toLowerCase();
const words = searchableText.split(/\W+/).filter(word => word.length > 2);
words.forEach(word => {
if (!this.searchIndex.has(word)) {
this.searchIndex.set(word, []);
}
const docIds = this.searchIndex.get(word)!;
if (!docIds.includes(doc.id)) {
docIds.push(doc.id);
}
});
});
}
private getAllDocuments(filters?: any): LegalDocument[] {
let documents = Array.from(this.legalDocuments.values());
if (filters) {
documents = documents.filter(doc => {
if (filters.type && doc.type !== filters.type) return false;
if (filters.authority && !doc.authority.toLowerCase().includes(filters.authority.toLowerCase())) return false;
if (filters.year && doc.year !== filters.year) return false;
return true;
});
}
return documents.sort((a, b) => b.year - a.year);
}
private extractLimits(parameter: string, documents: LegalDocument[]): Array<{
standard: string;
maxValue: number;
unit: string;
}> {
// Simplified limit extraction - in a real implementation, this would parse the documents
const limits: Array<{ standard: string; maxValue: number; unit: string }> = [];
const paramLower = parameter.toLowerCase();
if (paramLower.includes('ph')) {
limits.push({ standard: 'IS 10500:2012', maxValue: 8.5, unit: 'pH units' });
} else if (paramLower.includes('bod')) {
limits.push({ standard: 'CPCB Standards', maxValue: 30, unit: 'mg/L' });
} else if (paramLower.includes('cod')) {
limits.push({ standard: 'CPCB Standards', maxValue: 250, unit: 'mg/L' });
} else if (paramLower.includes('tds')) {
limits.push({ standard: 'IS 10500:2012', maxValue: 500, unit: 'mg/L' });
} else if (paramLower.includes('pm2.5')) {
limits.push({ standard: 'CPCB NAAQS', maxValue: 40, unit: 'μg/m³' });
} else if (paramLower.includes('pm10')) {
limits.push({ standard: 'CPCB NAAQS', maxValue: 60, unit: 'μg/m³' });
}
return limits;
}
private getECRequirements(category: string): string[] {
const baseRequirements = [
'Project proposal with detailed technical specifications',
'Environmental Impact Assessment report',
'Environmental Management Plan',
'Risk assessment and disaster management plan',
'Details of public consultation (for Category A & B1)'
];
if (category === 'A') {
return [
...baseRequirements,
'Approved Terms of Reference from MoEF&CC',
'Comprehensive EIA by accredited consultants',
'Expert Appraisal Committee presentation',
'State government recommendation'
];
} else if (category === 'B1') {
return [
...baseRequirements,
'State level expert appraisal',
'District Collector certificate'
];
} else {
return [
'Simplified project information',
'Environmental clearance from SEIAA',
'No public consultation required'
];
}
}
}
export const knowledgeVault = new KnowledgeVault();
export { LegalDocument, ISCode, ComplianceCheck };