@ansvar/india-law-mcp 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +404 -0
- package/data/database.db +0 -0
- package/dist/capabilities.d.ts +16 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +45 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/citation/formatter.d.ts +11 -0
- package/dist/citation/formatter.d.ts.map +1 -0
- package/dist/citation/formatter.js +35 -0
- package/dist/citation/formatter.js.map +1 -0
- package/dist/citation/parser.d.ts +12 -0
- package/dist/citation/parser.d.ts.map +1 -0
- package/dist/citation/parser.js +69 -0
- package/dist/citation/parser.js.map +1 -0
- package/dist/citation/validator.d.ts +10 -0
- package/dist/citation/validator.d.ts.map +1 -0
- package/dist/citation/validator.js +74 -0
- package/dist/citation/validator.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/about.d.ts +35 -0
- package/dist/tools/about.d.ts.map +1 -0
- package/dist/tools/about.js +51 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/build-legal-stance.d.ts +29 -0
- package/dist/tools/build-legal-stance.d.ts.map +1 -0
- package/dist/tools/build-legal-stance.js +54 -0
- package/dist/tools/build-legal-stance.js.map +1 -0
- package/dist/tools/check-currency.d.ts +23 -0
- package/dist/tools/check-currency.d.ts.map +1 -0
- package/dist/tools/check-currency.js +49 -0
- package/dist/tools/check-currency.js.map +1 -0
- package/dist/tools/format-citation.d.ts +18 -0
- package/dist/tools/format-citation.d.ts.map +1 -0
- package/dist/tools/format-citation.js +38 -0
- package/dist/tools/format-citation.js.map +1 -0
- package/dist/tools/get-eu-basis.d.ts +26 -0
- package/dist/tools/get-eu-basis.d.ts.map +1 -0
- package/dist/tools/get-eu-basis.js +69 -0
- package/dist/tools/get-eu-basis.js.map +1 -0
- package/dist/tools/get-indian-implementations.d.ts +25 -0
- package/dist/tools/get-indian-implementations.d.ts.map +1 -0
- package/dist/tools/get-indian-implementations.js +48 -0
- package/dist/tools/get-indian-implementations.js.map +1 -0
- package/dist/tools/get-provision-eu-basis.d.ts +18 -0
- package/dist/tools/get-provision-eu-basis.d.ts.map +1 -0
- package/dist/tools/get-provision-eu-basis.js +55 -0
- package/dist/tools/get-provision-eu-basis.js.map +1 -0
- package/dist/tools/get-provision.d.ts +28 -0
- package/dist/tools/get-provision.d.ts.map +1 -0
- package/dist/tools/get-provision.js +74 -0
- package/dist/tools/get-provision.js.map +1 -0
- package/dist/tools/list-sources.d.ts +29 -0
- package/dist/tools/list-sources.d.ts.map +1 -0
- package/dist/tools/list-sources.js +78 -0
- package/dist/tools/list-sources.js.map +1 -0
- package/dist/tools/registry.d.ts +13 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +398 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-eu-implementations.d.ts +32 -0
- package/dist/tools/search-eu-implementations.d.ts.map +1 -0
- package/dist/tools/search-eu-implementations.js +63 -0
- package/dist/tools/search-eu-implementations.js.map +1 -0
- package/dist/tools/search-legislation.d.ts +24 -0
- package/dist/tools/search-legislation.d.ts.map +1 -0
- package/dist/tools/search-legislation.js +60 -0
- package/dist/tools/search-legislation.js.map +1 -0
- package/dist/tools/validate-citation.d.ts +20 -0
- package/dist/tools/validate-citation.d.ts.map +1 -0
- package/dist/tools/validate-citation.js +37 -0
- package/dist/tools/validate-citation.js.map +1 -0
- package/dist/tools/validate-eu-compliance.d.ts +20 -0
- package/dist/tools/validate-eu-compliance.d.ts.map +1 -0
- package/dist/tools/validate-eu-compliance.js +63 -0
- package/dist/tools/validate-eu-compliance.js.map +1 -0
- package/dist/types/citations.d.ts +21 -0
- package/dist/types/citations.d.ts.map +1 -0
- package/dist/types/citations.js +2 -0
- package/dist/types/citations.js.map +1 -0
- package/dist/types/documents.d.ts +16 -0
- package/dist/types/documents.d.ts.map +1 -0
- package/dist/types/documents.js +2 -0
- package/dist/types/documents.js.map +1 -0
- package/dist/types/eu-references.d.ts +54 -0
- package/dist/types/eu-references.d.ts.map +1 -0
- package/dist/types/eu-references.js +2 -0
- package/dist/types/eu-references.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provisions.d.ts +18 -0
- package/dist/types/provisions.d.ts.map +1 -0
- package/dist/types/provisions.js +2 -0
- package/dist/types/provisions.js.map +1 -0
- package/dist/utils/as-of-date.d.ts +2 -0
- package/dist/utils/as-of-date.d.ts.map +1 -0
- package/dist/utils/as-of-date.js +23 -0
- package/dist/utils/as-of-date.js.map +1 -0
- package/dist/utils/fts-query.d.ts +13 -0
- package/dist/utils/fts-query.d.ts.map +1 -0
- package/dist/utils/fts-query.js +56 -0
- package/dist/utils/fts-query.js.map +1 -0
- package/dist/utils/metadata.d.ts +15 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +29 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/statute-id.d.ts +13 -0
- package/dist/utils/statute-id.d.ts.map +1 -0
- package/dist/utils/statute-id.js +69 -0
- package/dist/utils/statute-id.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate_citation — Validate an Indian legal citation against the database.
|
|
3
|
+
*/
|
|
4
|
+
import { validateCitation as doValidate } from '../citation/validator.js';
|
|
5
|
+
import { formatCitation } from '../citation/formatter.js';
|
|
6
|
+
import { generateResponseMetadata } from '../utils/metadata.js';
|
|
7
|
+
export async function validateCitationTool(db, input) {
|
|
8
|
+
if (!input.citation || input.citation.trim().length === 0) {
|
|
9
|
+
return {
|
|
10
|
+
results: {
|
|
11
|
+
citation: input.citation,
|
|
12
|
+
formatted_citation: '',
|
|
13
|
+
valid: false,
|
|
14
|
+
document_exists: false,
|
|
15
|
+
provision_exists: false,
|
|
16
|
+
warnings: ['Empty citation'],
|
|
17
|
+
},
|
|
18
|
+
_metadata: generateResponseMetadata(db)
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const result = doValidate(db, input.citation);
|
|
22
|
+
const formatted = formatCitation(result.citation);
|
|
23
|
+
return {
|
|
24
|
+
results: {
|
|
25
|
+
citation: input.citation,
|
|
26
|
+
formatted_citation: formatted,
|
|
27
|
+
valid: result.citation.valid && result.document_exists && result.provision_exists,
|
|
28
|
+
document_exists: result.document_exists,
|
|
29
|
+
provision_exists: result.provision_exists,
|
|
30
|
+
document_title: result.document_title,
|
|
31
|
+
status: result.status,
|
|
32
|
+
warnings: result.warnings,
|
|
33
|
+
},
|
|
34
|
+
_metadata: generateResponseMetadata(db)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=validate-citation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-citation.js","sourceRoot":"","sources":["../../src/tools/validate-citation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAiBnF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAY,EACZ,KAA4B;IAE5B,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,OAAO,EAAE;gBACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,kBAAkB,EAAE,EAAE;gBACtB,KAAK,EAAE,KAAK;gBACZ,eAAe,EAAE,KAAK;gBACtB,gBAAgB,EAAE,KAAK;gBACvB,QAAQ,EAAE,CAAC,gBAAgB,CAAC;aAC7B;YACD,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAqB,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElD,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,kBAAkB,EAAE,SAAS;YAC7B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,gBAAgB;YACjF,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B;QACD,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate_eu_compliance — Check Indian statute's EU/international equivalence status.
|
|
3
|
+
*/
|
|
4
|
+
import type { Database } from '@ansvar/mcp-sqlite';
|
|
5
|
+
import { type ToolResponse } from '../utils/metadata.js';
|
|
6
|
+
export interface ValidateEUComplianceInput {
|
|
7
|
+
document_id: string;
|
|
8
|
+
provision_ref?: string;
|
|
9
|
+
eu_document_id?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EUComplianceResult {
|
|
12
|
+
document_id: string;
|
|
13
|
+
provision_ref?: string;
|
|
14
|
+
compliance_status: 'compliant' | 'partial' | 'unclear' | 'not_applicable';
|
|
15
|
+
eu_references_found: number;
|
|
16
|
+
warnings: string[];
|
|
17
|
+
recommendations?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function validateEUCompliance(db: Database, input: ValidateEUComplianceInput): Promise<ToolResponse<EUComplianceResult>>;
|
|
20
|
+
//# sourceMappingURL=validate-eu-compliance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-eu-compliance.d.ts","sourceRoot":"","sources":["../../src/tools/validate-eu-compliance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGnF,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC;IAC1E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CA8E3C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate_eu_compliance — Check Indian statute's EU/international equivalence status.
|
|
3
|
+
*/
|
|
4
|
+
import { generateResponseMetadata } from '../utils/metadata.js';
|
|
5
|
+
import { resolveExistingStatuteId } from '../utils/statute-id.js';
|
|
6
|
+
export async function validateEUCompliance(db, input) {
|
|
7
|
+
if (!input.document_id) {
|
|
8
|
+
throw new Error('document_id is required');
|
|
9
|
+
}
|
|
10
|
+
const resolvedId = resolveExistingStatuteId(db, input.document_id);
|
|
11
|
+
if (!resolvedId) {
|
|
12
|
+
throw new Error(`Document "${input.document_id}" not found in database`);
|
|
13
|
+
}
|
|
14
|
+
let provisionId = null;
|
|
15
|
+
if (input.provision_ref?.trim()) {
|
|
16
|
+
const row = db.prepare('SELECT id FROM legal_provisions WHERE document_id = ? AND (provision_ref = ? OR section = ?) LIMIT 1').get(resolvedId, input.provision_ref, input.provision_ref);
|
|
17
|
+
if (!row) {
|
|
18
|
+
throw new Error(`Provision "${input.provision_ref}" not found in ${resolvedId}`);
|
|
19
|
+
}
|
|
20
|
+
provisionId = row.id;
|
|
21
|
+
}
|
|
22
|
+
let sql = `
|
|
23
|
+
SELECT ed.id, ed.type, ed.title, er.reference_type, er.is_primary_implementation
|
|
24
|
+
FROM eu_documents ed
|
|
25
|
+
JOIN eu_references er ON ed.id = er.eu_document_id
|
|
26
|
+
WHERE er.document_id = ?
|
|
27
|
+
`;
|
|
28
|
+
const params = [resolvedId];
|
|
29
|
+
if (provisionId != null) {
|
|
30
|
+
sql += ` AND er.provision_id = ?`;
|
|
31
|
+
params.push(provisionId);
|
|
32
|
+
}
|
|
33
|
+
if (input.eu_document_id) {
|
|
34
|
+
sql += ` AND ed.id = ?`;
|
|
35
|
+
params.push(input.eu_document_id);
|
|
36
|
+
}
|
|
37
|
+
const rows = db.prepare(sql).all(...params);
|
|
38
|
+
const warnings = [];
|
|
39
|
+
const recommendations = [];
|
|
40
|
+
const primaryCount = rows.filter((row) => row.is_primary_implementation === 1).length;
|
|
41
|
+
if (rows.length === 0) {
|
|
42
|
+
recommendations.push('No EU/international references found. If this statute has international equivalents, consider adding cross-references.');
|
|
43
|
+
}
|
|
44
|
+
else if (primaryCount === 0) {
|
|
45
|
+
warnings.push('EU/international references exist, but none are marked as primary equivalents.');
|
|
46
|
+
recommendations.push('Review reference quality and mark the primary equivalent links.');
|
|
47
|
+
}
|
|
48
|
+
const status = rows.length === 0 ? 'not_applicable' :
|
|
49
|
+
primaryCount > 0 ? 'compliant' :
|
|
50
|
+
'partial';
|
|
51
|
+
return {
|
|
52
|
+
results: {
|
|
53
|
+
document_id: resolvedId,
|
|
54
|
+
provision_ref: input.provision_ref,
|
|
55
|
+
compliance_status: status,
|
|
56
|
+
eu_references_found: rows.length,
|
|
57
|
+
warnings,
|
|
58
|
+
recommendations: recommendations.length > 0 ? recommendations : undefined,
|
|
59
|
+
},
|
|
60
|
+
_metadata: generateResponseMetadata(db),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=validate-eu-compliance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-eu-compliance.js","sourceRoot":"","sources":["../../src/tools/validate-eu-compliance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type CitationFormat = 'full' | 'short' | 'pinpoint';
|
|
2
|
+
export interface ParsedCitation {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
type: 'statute' | 'rules' | 'directions' | 'unknown';
|
|
5
|
+
title?: string;
|
|
6
|
+
year?: number;
|
|
7
|
+
section?: string;
|
|
8
|
+
subsection?: string;
|
|
9
|
+
clause?: string;
|
|
10
|
+
act_number?: number;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ValidationResult {
|
|
14
|
+
citation: ParsedCitation;
|
|
15
|
+
document_exists: boolean;
|
|
16
|
+
provision_exists: boolean;
|
|
17
|
+
document_title?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
warnings: string[];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=citations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citations.d.ts","sourceRoot":"","sources":["../../src/types/citations.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citations.js","sourceRoot":"","sources":["../../src/types/citations.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type DocumentType = 'statute' | 'rules' | 'directions' | 'constitutional_provision';
|
|
2
|
+
export type DocumentStatus = 'in_force' | 'amended' | 'repealed' | 'not_yet_in_force';
|
|
3
|
+
export interface LegalDocument {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
title_en?: string;
|
|
7
|
+
short_name?: string;
|
|
8
|
+
document_type: DocumentType;
|
|
9
|
+
status: DocumentStatus;
|
|
10
|
+
issued_date?: string;
|
|
11
|
+
in_force_date?: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
language?: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/types/documents.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,0BAA0B,CAAC;AAC3F,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,kBAAkB,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/types/documents.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type EUDocumentType = 'directive' | 'regulation';
|
|
2
|
+
export type EUCommunity = 'EU' | 'EC' | 'EEC' | 'Euratom';
|
|
3
|
+
export type ReferenceType = 'implements' | 'supplements' | 'applies' | 'cites' | 'cites_article' | 'equivalent_to';
|
|
4
|
+
export type ImplementationStatus = 'full' | 'partial' | 'pending' | 'unknown';
|
|
5
|
+
export interface EUDocument {
|
|
6
|
+
id: string;
|
|
7
|
+
type: EUDocumentType;
|
|
8
|
+
year: number;
|
|
9
|
+
number: number;
|
|
10
|
+
community: EUCommunity;
|
|
11
|
+
celex_number?: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
short_name?: string;
|
|
14
|
+
url_eur_lex?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface EUReference {
|
|
17
|
+
id: number;
|
|
18
|
+
document_id: string;
|
|
19
|
+
eu_document_id: string;
|
|
20
|
+
reference_type: ReferenceType;
|
|
21
|
+
eu_article?: string;
|
|
22
|
+
is_primary_implementation: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface EUBasisDocument {
|
|
25
|
+
id: string;
|
|
26
|
+
type: EUDocumentType;
|
|
27
|
+
year: number;
|
|
28
|
+
number: number;
|
|
29
|
+
community: EUCommunity;
|
|
30
|
+
reference_type: ReferenceType;
|
|
31
|
+
is_primary_implementation: boolean;
|
|
32
|
+
celex_number?: string;
|
|
33
|
+
title?: string;
|
|
34
|
+
short_name?: string;
|
|
35
|
+
url_eur_lex?: string;
|
|
36
|
+
articles?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface IndianImplementation {
|
|
39
|
+
document_id: string;
|
|
40
|
+
title: string;
|
|
41
|
+
reference_type: ReferenceType;
|
|
42
|
+
is_primary: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface ProvisionEUReference {
|
|
45
|
+
id: string;
|
|
46
|
+
type: EUDocumentType;
|
|
47
|
+
reference_type: ReferenceType;
|
|
48
|
+
full_citation: string;
|
|
49
|
+
title?: string;
|
|
50
|
+
short_name?: string;
|
|
51
|
+
article?: string;
|
|
52
|
+
context?: string;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=eu-references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eu-references.d.ts","sourceRoot":"","sources":["../../src/types/eu-references.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,YAAY,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC;AACnH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,CAAC;IACvB,cAAc,EAAE,aAAa,CAAC;IAC9B,yBAAyB,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,aAAa,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eu-references.js","sourceRoot":"","sources":["../../src/types/eu-references.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { DocumentType, DocumentStatus, LegalDocument, } from './documents.js';
|
|
2
|
+
export type { LegalProvision, ProvisionRef, } from './provisions.js';
|
|
3
|
+
export type { CitationFormat, ParsedCitation, ValidationResult, } from './citations.js';
|
|
4
|
+
export type { EUDocumentType, EUCommunity, ReferenceType, ImplementationStatus, EUDocument, EUReference, EUBasisDocument, IndianImplementation, ProvisionEUReference, } from './eu-references.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,cAAc,EACd,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface LegalProvision {
|
|
2
|
+
id: number;
|
|
3
|
+
document_id: string;
|
|
4
|
+
provision_ref: string;
|
|
5
|
+
chapter?: string;
|
|
6
|
+
section: string;
|
|
7
|
+
title?: string;
|
|
8
|
+
content: string;
|
|
9
|
+
order_index?: number;
|
|
10
|
+
valid_from?: string;
|
|
11
|
+
valid_to?: string;
|
|
12
|
+
language?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ProvisionRef {
|
|
15
|
+
document_id: string;
|
|
16
|
+
provision_ref: string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=provisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisions.d.ts","sourceRoot":"","sources":["../../src/types/provisions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisions.js","sourceRoot":"","sources":["../../src/types/provisions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"as-of-date.d.ts","sourceRoot":"","sources":["../../src/utils/as-of-date.ts"],"names":[],"mappings":"AAWA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAe/E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
2
|
+
function isValidCalendarDate(value) {
|
|
3
|
+
const parsed = Date.parse(`${value}T00:00:00Z`);
|
|
4
|
+
if (Number.isNaN(parsed)) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const iso = new Date(parsed).toISOString().slice(0, 10);
|
|
8
|
+
return iso === value;
|
|
9
|
+
}
|
|
10
|
+
export function normalizeAsOfDate(value) {
|
|
11
|
+
if (value == null) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const trimmed = value.trim();
|
|
15
|
+
if (trimmed.length === 0) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
if (!ISO_DATE_PATTERN.test(trimmed) || !isValidCalendarDate(trimmed)) {
|
|
19
|
+
throw new Error('as_of_date must be an ISO date in YYYY-MM-DD format');
|
|
20
|
+
}
|
|
21
|
+
return trimmed;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=as-of-date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"as-of-date.js","sourceRoot":"","sources":["../../src/utils/as-of-date.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAE/C,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,GAAG,KAAK,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FTS5 query builder for India Law MCP.
|
|
3
|
+
*
|
|
4
|
+
* Sanitises user input to prevent FTS5 syntax errors from unescaped
|
|
5
|
+
* special characters (quotes, parentheses, colons, etc.) while still
|
|
6
|
+
* allowing intentional FTS5 operators (AND, OR, NOT, *, "phrase").
|
|
7
|
+
*/
|
|
8
|
+
export interface FtsQueryVariants {
|
|
9
|
+
primary: string;
|
|
10
|
+
fallback?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildFtsQueryVariants(query: string): FtsQueryVariants;
|
|
13
|
+
//# sourceMappingURL=fts-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts-query.d.ts","sourceRoot":"","sources":["../../src/utils/fts-query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAuCrE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FTS5 query builder for India Law MCP.
|
|
3
|
+
*
|
|
4
|
+
* Sanitises user input to prevent FTS5 syntax errors from unescaped
|
|
5
|
+
* special characters (quotes, parentheses, colons, etc.) while still
|
|
6
|
+
* allowing intentional FTS5 operators (AND, OR, NOT, *, "phrase").
|
|
7
|
+
*/
|
|
8
|
+
const EXPLICIT_FTS_SYNTAX = /["""]|(\bAND\b)|(\bOR\b)|(\bNOT\b)|\*$/;
|
|
9
|
+
/** Maximum query length to prevent abuse */
|
|
10
|
+
const MAX_QUERY_LENGTH = 1000;
|
|
11
|
+
/**
|
|
12
|
+
* Sanitise a single token for safe inclusion in an FTS5 query.
|
|
13
|
+
* Strips characters that have special meaning in FTS5 syntax:
|
|
14
|
+
* - Quotes
|
|
15
|
+
* - Parentheses
|
|
16
|
+
* - Colons (column filters)
|
|
17
|
+
* - Carets (NEAR operator)
|
|
18
|
+
* - Curly braces
|
|
19
|
+
* Preserves alphanumeric, hyphens, underscores, and Unicode letters (including Devanagari).
|
|
20
|
+
*/
|
|
21
|
+
function sanitiseToken(token) {
|
|
22
|
+
return token.replace(/[^\p{L}\p{N}_-]/gu, '');
|
|
23
|
+
}
|
|
24
|
+
export function buildFtsQueryVariants(query) {
|
|
25
|
+
const trimmed = query.trim().slice(0, MAX_QUERY_LENGTH);
|
|
26
|
+
if (trimmed.length === 0) {
|
|
27
|
+
return { primary: '""' };
|
|
28
|
+
}
|
|
29
|
+
// If user is using explicit FTS5 syntax, sanitise dangerous chars
|
|
30
|
+
// but preserve the intent of AND/OR/NOT and quotes
|
|
31
|
+
if (EXPLICIT_FTS_SYNTAX.test(trimmed)) {
|
|
32
|
+
let normalised = trimmed
|
|
33
|
+
.replace(/[\u201C\u201D]/g, '"') // smart quotes → standard
|
|
34
|
+
.replace(/;/g, '') // strip semicolons (no SQL leakage)
|
|
35
|
+
.replace(/--/g, '') // strip comment sequences
|
|
36
|
+
.slice(0, MAX_QUERY_LENGTH);
|
|
37
|
+
// Balance unmatched double quotes to prevent FTS5 "unterminated string" errors
|
|
38
|
+
const quoteCount = (normalised.match(/"/g) ?? []).length;
|
|
39
|
+
if (quoteCount % 2 !== 0) {
|
|
40
|
+
normalised += '"';
|
|
41
|
+
}
|
|
42
|
+
return { primary: normalised };
|
|
43
|
+
}
|
|
44
|
+
const tokens = trimmed
|
|
45
|
+
.split(/\s+/)
|
|
46
|
+
.filter(t => t.length > 0)
|
|
47
|
+
.map(sanitiseToken)
|
|
48
|
+
.filter(t => t.length > 0);
|
|
49
|
+
if (tokens.length === 0) {
|
|
50
|
+
return { primary: '""' };
|
|
51
|
+
}
|
|
52
|
+
const primary = tokens.map(t => `"${t}"*`).join(' ');
|
|
53
|
+
const fallback = tokens.map(t => `${t}*`).join(' OR ');
|
|
54
|
+
return { primary, fallback };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=fts-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts-query.js","sourceRoot":"","sources":["../../src/utils/fts-query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,mBAAmB,GAAG,wCAAwC,CAAC;AAErE,4CAA4C;AAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAO9B;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAExD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,kEAAkE;IAClE,mDAAmD;IACnD,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,IAAI,UAAU,GAAG,OAAO;aACrB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAE,0BAA0B;aAC3D,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAiB,oCAAoC;aACtE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAgB,0BAA0B;aAC5D,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAE9B,+EAA+E;QAC/E,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,IAAI,GAAG,CAAC;QACpB,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,OAAO;SACnB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACzB,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response metadata for India Law MCP tool responses.
|
|
3
|
+
*/
|
|
4
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
5
|
+
export interface ResponseMetadata {
|
|
6
|
+
data_freshness: string;
|
|
7
|
+
disclaimer: string;
|
|
8
|
+
source_authority: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ToolResponse<T> {
|
|
11
|
+
results: T;
|
|
12
|
+
_metadata: ResponseMetadata;
|
|
13
|
+
}
|
|
14
|
+
export declare function generateResponseMetadata(db?: InstanceType<typeof Database>): ResponseMetadata;
|
|
15
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAID,wBAAgB,wBAAwB,CACtC,EAAE,CAAC,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GACjC,gBAAgB,CAyBlB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response metadata for India Law MCP tool responses.
|
|
3
|
+
*/
|
|
4
|
+
const STALENESS_THRESHOLD_DAYS = 30;
|
|
5
|
+
export function generateResponseMetadata(db) {
|
|
6
|
+
let freshness = 'Database freshness unknown';
|
|
7
|
+
if (db) {
|
|
8
|
+
try {
|
|
9
|
+
const row = db.prepare("SELECT value FROM db_metadata WHERE key = 'built_at'").get();
|
|
10
|
+
if (row?.value) {
|
|
11
|
+
const builtDate = new Date(row.value);
|
|
12
|
+
const daysSince = Math.floor((Date.now() - builtDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
13
|
+
freshness = daysSince > STALENESS_THRESHOLD_DAYS
|
|
14
|
+
? `WARNING: Database is ${daysSince} days old. Data may be outdated.`
|
|
15
|
+
: `Database built ${daysSince} day(s) ago.`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Ignore metadata read errors
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
data_freshness: freshness,
|
|
24
|
+
disclaimer: 'This data is derived from indiacode.nic.in open data. ' +
|
|
25
|
+
'Verify against official publications when legal certainty is required.',
|
|
26
|
+
source_authority: 'India Code (National Informatics Centre, Ministry of Law and Justice)',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,wBAAwB,CACtC,EAAkC;IAElC,IAAI,SAAS,GAAG,4BAA4B,CAAC;IAE7C,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAmC,CAAC;YACtH,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzF,SAAS,GAAG,SAAS,GAAG,wBAAwB;oBAC9C,CAAC,CAAC,wBAAwB,SAAS,kCAAkC;oBACrE,CAAC,CAAC,kBAAkB,SAAS,cAAc,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,UAAU,EACR,wDAAwD;YACxD,wEAAwE;QAC1E,gBAAgB,EAAE,uEAAuE;KAC1F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indian statute identifier handling.
|
|
3
|
+
*
|
|
4
|
+
* Indian Acts are identified by act number and year, e.g. "act-22-2023" for DPDPA.
|
|
5
|
+
* The ID in the database is a slug derived from the act number and year.
|
|
6
|
+
* Some Acts use Roman numeral numbering which is normalised to Arabic numerals.
|
|
7
|
+
*/
|
|
8
|
+
import type { Database } from '@ansvar/mcp-sqlite';
|
|
9
|
+
export declare function romanToArabic(roman: string): number | null;
|
|
10
|
+
export declare function isValidStatuteId(id: string): boolean;
|
|
11
|
+
export declare function statuteIdCandidates(id: string): string[];
|
|
12
|
+
export declare function resolveExistingStatuteId(db: Database, inputId: string): string | null;
|
|
13
|
+
//# sourceMappingURL=statute-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statute-id.d.ts","sourceRoot":"","sources":["../../src/utils/statute-id.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAanD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB1D;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBxD;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAcf"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indian statute identifier handling.
|
|
3
|
+
*
|
|
4
|
+
* Indian Acts are identified by act number and year, e.g. "act-22-2023" for DPDPA.
|
|
5
|
+
* The ID in the database is a slug derived from the act number and year.
|
|
6
|
+
* Some Acts use Roman numeral numbering which is normalised to Arabic numerals.
|
|
7
|
+
*/
|
|
8
|
+
/** Map of common Roman numerals used in Indian Act numbering */
|
|
9
|
+
const ROMAN_TO_ARABIC = {
|
|
10
|
+
'I': 1, 'II': 2, 'III': 3, 'IV': 4, 'V': 5,
|
|
11
|
+
'VI': 6, 'VII': 7, 'VIII': 8, 'IX': 9, 'X': 10,
|
|
12
|
+
'XI': 11, 'XII': 12, 'XIII': 13, 'XIV': 14, 'XV': 15,
|
|
13
|
+
'XVI': 16, 'XVII': 17, 'XVIII': 18, 'XIX': 19, 'XX': 20,
|
|
14
|
+
'XXI': 21, 'XXII': 22, 'XXIII': 23, 'XXIV': 24, 'XXV': 25,
|
|
15
|
+
'XXX': 30, 'XL': 40, 'L': 50, 'LX': 60, 'LXX': 70,
|
|
16
|
+
'LXXX': 80, 'XC': 90, 'C': 100,
|
|
17
|
+
};
|
|
18
|
+
export function romanToArabic(roman) {
|
|
19
|
+
const upper = roman.toUpperCase().trim();
|
|
20
|
+
if (ROMAN_TO_ARABIC[upper] !== undefined) {
|
|
21
|
+
return ROMAN_TO_ARABIC[upper];
|
|
22
|
+
}
|
|
23
|
+
// Try simple Roman numeral parsing
|
|
24
|
+
const romanValues = {
|
|
25
|
+
'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000,
|
|
26
|
+
};
|
|
27
|
+
let total = 0;
|
|
28
|
+
for (let i = 0; i < upper.length; i++) {
|
|
29
|
+
const current = romanValues[upper[i]];
|
|
30
|
+
const next = romanValues[upper[i + 1]];
|
|
31
|
+
if (current === undefined)
|
|
32
|
+
return null;
|
|
33
|
+
if (next !== undefined && current < next) {
|
|
34
|
+
total -= current;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
total += current;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return total > 0 ? total : null;
|
|
41
|
+
}
|
|
42
|
+
export function isValidStatuteId(id) {
|
|
43
|
+
return id.length > 0 && id.trim().length > 0;
|
|
44
|
+
}
|
|
45
|
+
export function statuteIdCandidates(id) {
|
|
46
|
+
const trimmed = id.trim().toLowerCase();
|
|
47
|
+
const candidates = new Set();
|
|
48
|
+
candidates.add(trimmed);
|
|
49
|
+
// Also try the original casing
|
|
50
|
+
candidates.add(id.trim());
|
|
51
|
+
// Convert spaces/dashes to the other form
|
|
52
|
+
if (trimmed.includes(' ')) {
|
|
53
|
+
candidates.add(trimmed.replace(/\s+/g, '-'));
|
|
54
|
+
}
|
|
55
|
+
if (trimmed.includes('-')) {
|
|
56
|
+
candidates.add(trimmed.replace(/-/g, ' '));
|
|
57
|
+
}
|
|
58
|
+
return [...candidates];
|
|
59
|
+
}
|
|
60
|
+
export function resolveExistingStatuteId(db, inputId) {
|
|
61
|
+
// Try exact match first
|
|
62
|
+
const exact = db.prepare("SELECT id FROM legal_documents WHERE id = ? LIMIT 1").get(inputId);
|
|
63
|
+
if (exact)
|
|
64
|
+
return exact.id;
|
|
65
|
+
// Try LIKE match on title
|
|
66
|
+
const byTitle = db.prepare("SELECT id FROM legal_documents WHERE title LIKE ? LIMIT 1").get(`%${inputId}%`);
|
|
67
|
+
return byTitle?.id ?? null;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=statute-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statute-id.js","sourceRoot":"","sources":["../../src/utils/statute-id.ts"],"names":[],"mappings":"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"}
|