@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
46 lines • 1.7 kB
JavaScript
/**
* build_legal_stance — Build a comprehensive set of citations for a legal question.
*/
import { buildFtsQueryVariants, sanitizeFtsInput } from '../utils/fts-query.js';
import { generateResponseMetadata } from '../utils/metadata.js';
export async function buildLegalStance(db, input) {
if (!input.query || input.query.trim().length === 0) {
return { results: [], _metadata: generateResponseMetadata(db) };
}
const limit = Math.min(Math.max(input.limit ?? 5, 1), 20);
const queryVariants = buildFtsQueryVariants(sanitizeFtsInput(input.query));
for (const ftsQuery of queryVariants) {
let sql = `
SELECT
lp.document_id,
ld.title as document_title,
lp.provision_ref,
lp.section,
lp.title,
snippet(provisions_fts, 0, '>>>', '<<<', '...', 48) as snippet,
bm25(provisions_fts) as relevance
FROM provisions_fts
JOIN legal_provisions lp ON lp.id = provisions_fts.rowid
JOIN legal_documents ld ON ld.id = lp.document_id
WHERE provisions_fts MATCH ?
`;
const params = [ftsQuery];
if (input.document_id) {
sql += ' AND lp.document_id = ?';
params.push(input.document_id);
}
sql += ' ORDER BY relevance LIMIT ?';
params.push(limit);
try {
const rows = db.prepare(sql).all(...params);
if (rows.length > 0) {
return { results: rows, _metadata: generateResponseMetadata(db) };
}
}
catch {
continue;
}
}
return { results: [], _metadata: generateResponseMetadata(db) };
}
//# sourceMappingURL=build-legal-stance.js.map