UNPKG

@ansvar/singapore-law-mcp

Version:

Complete Singapore law database — 523 Acts, 28K+ provisions from Singapore Statutes Online (sso.agc.gov.sg) with full-text search, definitions, and citation support

101 lines 3.75 kB
/** * validate_citation — Validate a Singapore legal citation against the database. */ import { resolveDocumentId } from '../utils/statute-id.js'; import { generateResponseMetadata } from '../utils/metadata.js'; /** * Parse a Singapore legal citation. * Supports: * - "Section 2 PDPA" / "s 2 PDPA" * - "Section 2 Personal Data Protection Act 2012" * - "PDPA s 2" * - Document title with section reference */ function parseCitation(citation) { const trimmed = citation.trim(); // "Section N <act>" or "s N <act>" const secFirst = trimmed.match(/^(?:Section|s\.?)\s*(\d+[A-Za-z]*)\s+(.+)$/i); if (secFirst) { return { documentRef: secFirst[2].trim(), sectionRef: secFirst[1] }; } // "<act> Section N" or "<act>, s N" const secLast = trimmed.match(/^(.+?)[,;]?\s*(?:Section|s\.?)\s*(\d+[A-Za-z]*)$/i); if (secLast) { return { documentRef: secLast[1].trim(), sectionRef: secLast[2] }; } // Just a document reference return { documentRef: trimmed }; } export async function validateCitationTool(db, input) { const warnings = []; const parsed = parseCitation(input.citation); if (!parsed) { return { results: { valid: false, citation: input.citation, warnings: ['Could not parse citation format'], }, _metadata: generateResponseMetadata(db), }; } const docId = resolveDocumentId(db, parsed.documentRef); if (!docId) { return { results: { valid: false, citation: input.citation, warnings: [`Document not found: "${parsed.documentRef}"`], }, _metadata: generateResponseMetadata(db), }; } const doc = db.prepare('SELECT id, title, status FROM legal_documents WHERE id = ?').get(docId); if (doc.status === 'repealed') { warnings.push(`WARNING: This statute has been repealed.`); } else if (doc.status === 'amended') { warnings.push(`Note: This statute has been amended. Verify you are referencing the current version.`); } if (parsed.sectionRef) { const provision = db.prepare("SELECT provision_ref FROM legal_provisions WHERE document_id = ? AND (provision_ref = ? OR provision_ref = ? OR provision_ref = ? OR section = ?)").get(docId, parsed.sectionRef, `s${parsed.sectionRef}`, `art${parsed.sectionRef}`, parsed.sectionRef); if (!provision) { return { results: { valid: false, citation: input.citation, document_id: docId, document_title: doc.title, warnings: [...warnings, `Provision "${parsed.sectionRef}" not found in ${doc.title}`], }, _metadata: generateResponseMetadata(db), }; } return { results: { valid: true, citation: input.citation, normalized: `Section ${parsed.sectionRef} ${doc.title}`, document_id: docId, document_title: doc.title, provision_ref: provision.provision_ref, status: doc.status, warnings, }, _metadata: generateResponseMetadata(db), }; } return { results: { valid: true, citation: input.citation, normalized: doc.title, document_id: docId, document_title: doc.title, status: doc.status, warnings, }, _metadata: generateResponseMetadata(db), }; } //# sourceMappingURL=validate-citation.js.map