@ansvar/ch-environmental-compliance-mcp 0.1.0
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/.github/workflows/check-freshness.yml +49 -0
- package/.github/workflows/ci.yml +21 -0
- package/.github/workflows/codeql.yml +25 -0
- package/.github/workflows/ghcr-build.yml +45 -0
- package/.github/workflows/gitleaks.yml +18 -0
- package/.github/workflows/ingest.yml +59 -0
- package/.github/workflows/publish.yml +24 -0
- package/CHANGELOG.md +15 -0
- package/CODEOWNERS +1 -0
- package/COVERAGE.md +50 -0
- package/DISCLAIMER.md +48 -0
- package/Dockerfile +26 -0
- package/LICENSE +17 -0
- package/PRIVACY.md +23 -0
- package/README.md +116 -0
- package/SECURITY.md +25 -0
- package/TOOLS.md +142 -0
- package/data/coverage.json +24 -0
- package/data/database.db +0 -0
- package/data/sources.yml +36 -0
- package/dist/db.d.ts +25 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +197 -0
- package/dist/db.js.map +1 -0
- package/dist/http-server.d.ts +2 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +274 -0
- package/dist/http-server.js.map +1 -0
- package/dist/jurisdiction.d.ts +18 -0
- package/dist/jurisdiction.d.ts.map +1 -0
- package/dist/jurisdiction.js +16 -0
- package/dist/jurisdiction.js.map +1 -0
- package/dist/metadata.d.ts +10 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +22 -0
- package/dist/metadata.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +220 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/about.d.ts +15 -0
- package/dist/tools/about.d.ts.map +1 -0
- package/dist/tools/about.js +27 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/check-environmental-compliance.d.ts +30 -0
- package/dist/tools/check-environmental-compliance.d.ts.map +1 -0
- package/dist/tools/check-environmental-compliance.js +103 -0
- package/dist/tools/check-environmental-compliance.js.map +1 -0
- package/dist/tools/check-freshness.d.ts +15 -0
- package/dist/tools/check-freshness.d.ts.map +1 -0
- package/dist/tools/check-freshness.js +26 -0
- package/dist/tools/check-freshness.js.map +1 -0
- package/dist/tools/get-ammonia-rules.d.ts +24 -0
- package/dist/tools/get-ammonia-rules.d.ts.map +1 -0
- package/dist/tools/get-ammonia-rules.js +31 -0
- package/dist/tools/get-ammonia-rules.js.map +1 -0
- package/dist/tools/get-bff-requirements.d.ts +26 -0
- package/dist/tools/get-bff-requirements.d.ts.map +1 -0
- package/dist/tools/get-bff-requirements.js +36 -0
- package/dist/tools/get-bff-requirements.js.map +1 -0
- package/dist/tools/get-buffer-zone-rules.d.ts +23 -0
- package/dist/tools/get-buffer-zone-rules.d.ts.map +1 -0
- package/dist/tools/get-buffer-zone-rules.js +30 -0
- package/dist/tools/get-buffer-zone-rules.js.map +1 -0
- package/dist/tools/get-eip-requirements.d.ts +31 -0
- package/dist/tools/get-eip-requirements.d.ts.map +1 -0
- package/dist/tools/get-eip-requirements.js +40 -0
- package/dist/tools/get-eip-requirements.js.map +1 -0
- package/dist/tools/get-nutrient-loss-limits.d.ts +24 -0
- package/dist/tools/get-nutrient-loss-limits.d.ts.map +1 -0
- package/dist/tools/get-nutrient-loss-limits.js +31 -0
- package/dist/tools/get-nutrient-loss-limits.js.map +1 -0
- package/dist/tools/get-water-protection-zones.d.ts +32 -0
- package/dist/tools/get-water-protection-zones.d.ts.map +1 -0
- package/dist/tools/get-water-protection-zones.js +36 -0
- package/dist/tools/get-water-protection-zones.js.map +1 -0
- package/dist/tools/list-sources.d.ts +18 -0
- package/dist/tools/list-sources.d.ts.map +1 -0
- package/dist/tools/list-sources.js +61 -0
- package/dist/tools/list-sources.js.map +1 -0
- package/dist/tools/search-environmental-rules.d.ts +25 -0
- package/dist/tools/search-environmental-rules.d.ts.map +1 -0
- package/dist/tools/search-environmental-rules.js +26 -0
- package/dist/tools/search-environmental-rules.js.map +1 -0
- package/docker-compose.yml +12 -0
- package/eslint.config.js +26 -0
- package/package.json +54 -0
- package/scripts/ingest.ts +911 -0
- package/server.json +16 -0
- package/src/db.ts +238 -0
- package/src/http-server.ts +307 -0
- package/src/jurisdiction.ts +30 -0
- package/src/metadata.ts +32 -0
- package/src/server.ts +244 -0
- package/src/tools/about.ts +28 -0
- package/src/tools/check-environmental-compliance.ts +143 -0
- package/src/tools/check-freshness.ts +42 -0
- package/src/tools/get-ammonia-rules.ts +44 -0
- package/src/tools/get-bff-requirements.ts +52 -0
- package/src/tools/get-buffer-zone-rules.ts +43 -0
- package/src/tools/get-eip-requirements.ts +57 -0
- package/src/tools/get-nutrient-loss-limits.ts +44 -0
- package/src/tools/get-water-protection-zones.ts +50 -0
- package/src/tools/list-sources.ts +75 -0
- package/src/tools/search-environmental-rules.ts +35 -0
- package/tests/db.test.ts +80 -0
- package/tests/helpers/seed-db.ts +173 -0
- package/tests/jurisdiction.test.ts +35 -0
- package/tests/tools/about.test.ts +26 -0
- package/tests/tools/check-freshness.test.ts +50 -0
- package/tests/tools/list-sources.test.ts +61 -0
- package/tests/tools/search-environmental-rules.test.ts +47 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { SUPPORTED_JURISDICTIONS } from '../jurisdiction.js';
|
|
3
|
+
export function handleAbout() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'Switzerland Environmental Compliance MCP',
|
|
6
|
+
description: 'Swiss environmental compliance data for agriculture: Gewaesserschutz (GSchG), Grundwasserschutzzonen, ' +
|
|
7
|
+
'Pufferstreifen, Ammoniakemissionen (LRV, Agrammon), Biodiversitaetsfoerderflaechen (BFF), ' +
|
|
8
|
+
'Naehrstoffverlust-Absenkpfad (Pa.Iv. 19.475), UVP-Schwellenwerte, and Bodenbelastung (VBBo). ' +
|
|
9
|
+
'Covers federal regulations and cantonal implementation for Swiss agricultural operations.',
|
|
10
|
+
version: '0.1.0',
|
|
11
|
+
jurisdiction: [...SUPPORTED_JURISDICTIONS],
|
|
12
|
+
data_sources: [
|
|
13
|
+
'BAFU — Gewaesserschutz, Luftreinhaltung, Biodiversitaet',
|
|
14
|
+
'BLW — OELN-Auflagen, BFF-Typen, DZV',
|
|
15
|
+
'Agroscope — Agrammon Ammoniakemissionsfaktoren',
|
|
16
|
+
'Kantonale Umweltaemter — Grundwasserschutzzonen',
|
|
17
|
+
],
|
|
18
|
+
tools_count: 11,
|
|
19
|
+
links: {
|
|
20
|
+
homepage: 'https://ansvar.eu/open-agriculture',
|
|
21
|
+
repository: 'https://github.com/ansvar-systems/ch-environmental-compliance-mcp',
|
|
22
|
+
mcp_network: 'https://ansvar.ai/mcp',
|
|
23
|
+
},
|
|
24
|
+
_meta: buildMeta(),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=about.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,IAAI,EAAE,0CAA0C;QAChD,WAAW,EACT,wGAAwG;YACxG,4FAA4F;YAC5F,+FAA+F;YAC/F,2FAA2F;QAC7F,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC1C,YAAY,EAAE;YACZ,yDAAyD;YACzD,qCAAqC;YACrC,gDAAgD;YAChD,iDAAiD;SAClD;QACD,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,QAAQ,EAAE,oCAAoC;YAC9C,UAAU,EAAE,mEAAmE;YAC/E,WAAW,EAAE,uBAAuB;SACrC;QACD,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface ComplianceArgs {
|
|
3
|
+
facility_type: string;
|
|
4
|
+
animal_count?: number;
|
|
5
|
+
area_ha?: number;
|
|
6
|
+
jurisdiction?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function handleCheckEnvironmentalCompliance(db: Database, args: ComplianceArgs): {
|
|
9
|
+
error: string;
|
|
10
|
+
supported: readonly string[];
|
|
11
|
+
message: string;
|
|
12
|
+
} | {
|
|
13
|
+
facility_type: string;
|
|
14
|
+
animal_count: number | null;
|
|
15
|
+
area_ha: number | null;
|
|
16
|
+
jurisdiction: "CH";
|
|
17
|
+
applicable_rules: number;
|
|
18
|
+
rules: {
|
|
19
|
+
category: string;
|
|
20
|
+
rule: string;
|
|
21
|
+
requirement: string;
|
|
22
|
+
legal_basis: string;
|
|
23
|
+
applies: boolean;
|
|
24
|
+
reason: string;
|
|
25
|
+
}[];
|
|
26
|
+
note: string;
|
|
27
|
+
_meta: import("../metadata.js").Meta;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=check-environmental-compliance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-environmental-compliance.d.ts","sourceRoot":"","sources":["../../src/tools/check-environmental-compliance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kCAAkC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;kBAKvE,MAAM;cACV,MAAM;qBACC,MAAM;qBACN,MAAM;iBACV,OAAO;gBACR,MAAM;;;;EAyHjB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleCheckEnvironmentalCompliance(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
const applicable = [];
|
|
8
|
+
// Check water protection requirements
|
|
9
|
+
const waterZones = db.all('SELECT zone_type, restrictions, legal_basis FROM water_protection_zones WHERE jurisdiction = ?', [jv.jurisdiction]);
|
|
10
|
+
for (const z of waterZones) {
|
|
11
|
+
applicable.push({
|
|
12
|
+
category: 'Gewaesserschutz',
|
|
13
|
+
rule: `Grundwasserschutzzone ${z.zone_type}`,
|
|
14
|
+
requirement: z.restrictions,
|
|
15
|
+
legal_basis: z.legal_basis ?? 'GSchG Art. 20',
|
|
16
|
+
applies: true,
|
|
17
|
+
reason: 'Pruefen Sie, ob Ihr Standort in einer Schutzzone liegt (kantonaler Zonenplan).',
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
// Check buffer zone requirements
|
|
21
|
+
const buffers = db.all('SELECT type, distance_m, requirement, source_law FROM buffer_zones WHERE jurisdiction = ?', [jv.jurisdiction]);
|
|
22
|
+
for (const b of buffers) {
|
|
23
|
+
applicable.push({
|
|
24
|
+
category: 'Pufferstreifen',
|
|
25
|
+
rule: `${b.type} — ${b.distance_m}m`,
|
|
26
|
+
requirement: b.requirement,
|
|
27
|
+
legal_basis: b.source_law,
|
|
28
|
+
applies: true,
|
|
29
|
+
reason: 'OELN-Pflicht fuer alle Direktzahlungsempfaenger.',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// Check ammonia rules
|
|
33
|
+
const ammoniaRules = db.all('SELECT technique, requirement, legal_basis FROM ammonia_rules WHERE jurisdiction = ?', [jv.jurisdiction]);
|
|
34
|
+
const hasLivestock = args.animal_count !== undefined && args.animal_count > 0;
|
|
35
|
+
for (const a of ammoniaRules) {
|
|
36
|
+
applicable.push({
|
|
37
|
+
category: 'Ammoniakemissionen',
|
|
38
|
+
rule: a.technique,
|
|
39
|
+
requirement: a.requirement,
|
|
40
|
+
legal_basis: a.legal_basis ?? 'LRV Anhang 2',
|
|
41
|
+
applies: hasLivestock,
|
|
42
|
+
reason: hasLivestock
|
|
43
|
+
? `Relevant bei ${args.animal_count} Tieren.`
|
|
44
|
+
: 'Nur relevant bei Tierhaltung.',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Check BFF minimum
|
|
48
|
+
const bffMin = db.get(`SELECT min_area_pct FROM bff_types WHERE min_area_pct > 0 AND jurisdiction = ? ORDER BY min_area_pct DESC LIMIT 1`, [jv.jurisdiction]);
|
|
49
|
+
if (bffMin && args.area_ha) {
|
|
50
|
+
applicable.push({
|
|
51
|
+
category: 'Biodiversitaetsfoerderflaechen',
|
|
52
|
+
rule: 'Mindestanteil BFF',
|
|
53
|
+
requirement: `Mindestens ${bffMin.min_area_pct}% der LN als BFF (${(args.area_ha * bffMin.min_area_pct / 100).toFixed(2)} ha bei ${args.area_ha} ha LN)`,
|
|
54
|
+
legal_basis: 'DZV Art. 14',
|
|
55
|
+
applies: true,
|
|
56
|
+
reason: 'OELN-Pflicht fuer alle Direktzahlungsempfaenger.',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Check UVP thresholds
|
|
60
|
+
const uvpRules = db.all(`SELECT rule, threshold, legal_basis FROM environmental_rules WHERE topic = 'UVP' AND jurisdiction = ?`, [jv.jurisdiction]);
|
|
61
|
+
for (const u of uvpRules) {
|
|
62
|
+
const uvpApplies = args.animal_count !== undefined && args.animal_count >= 150;
|
|
63
|
+
applicable.push({
|
|
64
|
+
category: 'UVP (Umweltvertraeglichkeitspruefung)',
|
|
65
|
+
rule: u.rule,
|
|
66
|
+
requirement: u.threshold ?? '',
|
|
67
|
+
legal_basis: u.legal_basis,
|
|
68
|
+
applies: uvpApplies,
|
|
69
|
+
reason: uvpApplies
|
|
70
|
+
? `Bei ${args.animal_count} Tieren ist eine UVP-Pruefung wahrscheinlich erforderlich.`
|
|
71
|
+
: 'UVP-Schwellenwerte pruefen (kantonal, ab ca. 150 GVE).',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Check Pa.Iv. 19.475 nutrient loss limits
|
|
75
|
+
const currentYear = new Date().getFullYear();
|
|
76
|
+
const limits = db.all('SELECT nutrient, limit_pct, target FROM nutrient_loss_limits WHERE year <= ? AND jurisdiction = ? ORDER BY year DESC', [currentYear, jv.jurisdiction]);
|
|
77
|
+
const latestN = limits.find(l => l.nutrient === 'N');
|
|
78
|
+
const latestP = limits.find(l => l.nutrient === 'P');
|
|
79
|
+
if (latestN || latestP) {
|
|
80
|
+
applicable.push({
|
|
81
|
+
category: 'Naehrstoffverluste (Pa.Iv. 19.475)',
|
|
82
|
+
rule: 'Absenkpfad Stickstoff und Phosphor',
|
|
83
|
+
requirement: [
|
|
84
|
+
latestN ? `N: -${latestN.limit_pct}% (${latestN.target})` : '',
|
|
85
|
+
latestP ? `P: -${latestP.limit_pct}% (${latestP.target})` : '',
|
|
86
|
+
].filter(Boolean).join('; '),
|
|
87
|
+
legal_basis: 'LwG Art. 6a (Pa.Iv. 19.475)',
|
|
88
|
+
applies: true,
|
|
89
|
+
reason: 'Betrifft alle Betriebe mit Direktzahlungen.',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
facility_type: args.facility_type,
|
|
94
|
+
animal_count: args.animal_count ?? null,
|
|
95
|
+
area_ha: args.area_ha ?? null,
|
|
96
|
+
jurisdiction: jv.jurisdiction,
|
|
97
|
+
applicable_rules: applicable.length,
|
|
98
|
+
rules: applicable,
|
|
99
|
+
note: 'Diese Zusammenstellung ist indikativ. Kantonale Auflagen und standortspezifische Anforderungen sind separat zu pruefen.',
|
|
100
|
+
_meta: buildMeta(),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=check-environmental-compliance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-environmental-compliance.js","sourceRoot":"","sources":["../../src/tools/check-environmental-compliance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAU1D,MAAM,UAAU,kCAAkC,CAAC,EAAY,EAAE,IAAoB;IACnF,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,MAAM,UAAU,GAOV,EAAE,CAAC;IAET,sCAAsC;IACtC,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,CACvB,gGAAgG,EAChG,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,iBAAiB;YAC3B,IAAI,EAAE,yBAAyB,CAAC,CAAC,SAAS,EAAE;YAC5C,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,eAAe;YAC7C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gFAAgF;SACzF,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CACpB,2FAA2F,EAC3F,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,UAAU,GAAG;YACpC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,kDAAkD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CACzB,sFAAsF,EACtF,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,oBAAoB;YAC9B,IAAI,EAAE,CAAC,CAAC,SAAS;YACjB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,cAAc;YAC5C,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,YAAY;gBAClB,CAAC,CAAC,gBAAgB,IAAI,CAAC,YAAY,UAAU;gBAC7C,CAAC,CAAC,+BAA+B;SACpC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CACnB,mHAAmH,EACnH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,gCAAgC;YAC1C,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,cAAc,MAAM,CAAC,YAAY,qBAAqB,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,OAAO,SAAS;YACxJ,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,kDAAkD;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CACrB,uGAAuG,EACvG,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC;QAC/E,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,uCAAuC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;YAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,UAAU;gBAChB,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,4DAA4D;gBACtF,CAAC,CAAC,wDAAwD;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CACnB,sHAAsH,EACtH,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,CAC/B,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;IACrD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,oCAAoC;YAC9C,IAAI,EAAE,oCAAoC;YAC1C,WAAW,EAAE;gBACX,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9D,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;aAC/D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,6CAA6C;SACtD,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACvC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,gBAAgB,EAAE,UAAU,CAAC,MAAM;QACnC,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,yHAAyH;QAC/H,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import type { Database } from '../db.js';
|
|
3
|
+
interface FreshnessResult {
|
|
4
|
+
status: 'fresh' | 'stale' | 'unknown';
|
|
5
|
+
last_ingest: string | null;
|
|
6
|
+
build_date: string | null;
|
|
7
|
+
schema_version: string | null;
|
|
8
|
+
days_since_ingest: number | null;
|
|
9
|
+
staleness_threshold_days: number;
|
|
10
|
+
refresh_command: string;
|
|
11
|
+
_meta: ReturnType<typeof buildMeta>;
|
|
12
|
+
}
|
|
13
|
+
export declare function handleCheckFreshness(db: Database): FreshnessResult;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=check-freshness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-freshness.d.ts","sourceRoot":"","sources":["../../src/tools/check-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CACrC;AAID,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,GAAG,eAAe,CAyBlE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
const STALENESS_THRESHOLD_DAYS = 90;
|
|
3
|
+
export function handleCheckFreshness(db) {
|
|
4
|
+
const lastIngest = db.get('SELECT value FROM db_metadata WHERE key = ?', ['last_ingest']);
|
|
5
|
+
const buildDate = db.get('SELECT value FROM db_metadata WHERE key = ?', ['build_date']);
|
|
6
|
+
const schemaVersion = db.get('SELECT value FROM db_metadata WHERE key = ?', ['schema_version']);
|
|
7
|
+
let status = 'unknown';
|
|
8
|
+
let daysSinceIngest = null;
|
|
9
|
+
if (lastIngest?.value) {
|
|
10
|
+
const ingestDate = new Date(lastIngest.value);
|
|
11
|
+
const now = new Date();
|
|
12
|
+
daysSinceIngest = Math.floor((now.getTime() - ingestDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
13
|
+
status = daysSinceIngest <= STALENESS_THRESHOLD_DAYS ? 'fresh' : 'stale';
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
status,
|
|
17
|
+
last_ingest: lastIngest?.value ?? null,
|
|
18
|
+
build_date: buildDate?.value ?? null,
|
|
19
|
+
schema_version: schemaVersion?.value ?? null,
|
|
20
|
+
days_since_ingest: daysSinceIngest,
|
|
21
|
+
staleness_threshold_days: STALENESS_THRESHOLD_DAYS,
|
|
22
|
+
refresh_command: 'gh workflow run ingest.yml -R ansvar-systems/ch-environmental-compliance-mcp',
|
|
23
|
+
_meta: buildMeta(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=check-freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-freshness.js","sourceRoot":"","sources":["../../src/tools/check-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc3C,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3G,MAAM,aAAa,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEnH,IAAI,MAAM,GAAkC,SAAS,CAAC;IACtD,IAAI,eAAe,GAAkB,IAAI,CAAC;IAE1C,IAAI,UAAU,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7F,MAAM,GAAG,eAAe,IAAI,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI;QACtC,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;QACpC,cAAc,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI;QAC5C,iBAAiB,EAAE,eAAe;QAClC,wBAAwB,EAAE,wBAAwB;QAClD,eAAe,EAAE,8EAA8E;QAC/F,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface AmmoniaArgs {
|
|
3
|
+
technique?: string;
|
|
4
|
+
jurisdiction?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function handleGetAmmoniaRules(db: Database, args: AmmoniaArgs): {
|
|
7
|
+
error: string;
|
|
8
|
+
supported: readonly string[];
|
|
9
|
+
message: string;
|
|
10
|
+
} | {
|
|
11
|
+
jurisdiction: "CH";
|
|
12
|
+
rules_count: number;
|
|
13
|
+
rules: {
|
|
14
|
+
technique: string;
|
|
15
|
+
emission_factor_pct: number;
|
|
16
|
+
requirement: string;
|
|
17
|
+
legal_basis: string;
|
|
18
|
+
effective_date: string;
|
|
19
|
+
notes: string;
|
|
20
|
+
}[];
|
|
21
|
+
_meta: import("../metadata.js").Meta;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=get-ammonia-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ammonia-rules.d.ts","sourceRoot":"","sources":["../../src/tools/get-ammonia-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW;;;;;;;;;;;;;;;;EAkCpE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleGetAmmoniaRules(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
let sql = 'SELECT * FROM ammonia_rules WHERE jurisdiction = ?';
|
|
8
|
+
const params = [jv.jurisdiction];
|
|
9
|
+
if (args.technique) {
|
|
10
|
+
sql += ' AND LOWER(technique) LIKE LOWER(?)';
|
|
11
|
+
params.push(`%${args.technique}%`);
|
|
12
|
+
}
|
|
13
|
+
sql += ' ORDER BY technique';
|
|
14
|
+
const rules = db.all(sql, params);
|
|
15
|
+
return {
|
|
16
|
+
jurisdiction: jv.jurisdiction,
|
|
17
|
+
rules_count: rules.length,
|
|
18
|
+
rules: rules.map(r => ({
|
|
19
|
+
technique: r.technique,
|
|
20
|
+
emission_factor_pct: r.emission_factor,
|
|
21
|
+
requirement: r.requirement,
|
|
22
|
+
legal_basis: r.legal_basis,
|
|
23
|
+
effective_date: r.effective_date,
|
|
24
|
+
notes: r.notes,
|
|
25
|
+
})),
|
|
26
|
+
_meta: buildMeta({
|
|
27
|
+
source_url: 'https://www.bafu.admin.ch/bafu/de/home/themen/luft/fachinformationen/luftschadstoffquellen/emissionen-der-landwirtschaft.html',
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=get-ammonia-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ammonia-rules.js","sourceRoot":"","sources":["../../src/tools/get-ammonia-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,qBAAqB,CAAC,EAAY,EAAE,IAAiB;IACnE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,oDAAoD,CAAC;IAC/D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,IAAI,qCAAqC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,IAAI,qBAAqB,CAAC;IAE7B,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,mBAAmB,EAAE,CAAC,CAAC,eAAe;YACtC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,+HAA+H;SAC5I,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface BffArgs {
|
|
3
|
+
bff_type?: string;
|
|
4
|
+
quality_level?: string;
|
|
5
|
+
jurisdiction?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function handleGetBffRequirements(db: Database, args: BffArgs): {
|
|
8
|
+
error: string;
|
|
9
|
+
supported: readonly string[];
|
|
10
|
+
message: string;
|
|
11
|
+
} | {
|
|
12
|
+
jurisdiction: "CH";
|
|
13
|
+
types_count: number;
|
|
14
|
+
types: {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
quality_level: string;
|
|
18
|
+
payment_chf_ha: number;
|
|
19
|
+
min_area_pct: number;
|
|
20
|
+
botanical_criteria: string;
|
|
21
|
+
notes: string;
|
|
22
|
+
}[];
|
|
23
|
+
_meta: import("../metadata.js").Meta;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=get-bff-requirements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-bff-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-bff-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;EAyCnE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleGetBffRequirements(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
let sql = 'SELECT * FROM bff_types WHERE jurisdiction = ?';
|
|
8
|
+
const params = [jv.jurisdiction];
|
|
9
|
+
if (args.bff_type) {
|
|
10
|
+
sql += ' AND (LOWER(id) LIKE LOWER(?) OR LOWER(name) LIKE LOWER(?))';
|
|
11
|
+
params.push(`%${args.bff_type}%`, `%${args.bff_type}%`);
|
|
12
|
+
}
|
|
13
|
+
if (args.quality_level) {
|
|
14
|
+
sql += ' AND UPPER(quality_level) = UPPER(?)';
|
|
15
|
+
params.push(args.quality_level);
|
|
16
|
+
}
|
|
17
|
+
sql += ' ORDER BY name, quality_level';
|
|
18
|
+
const types = db.all(sql, params);
|
|
19
|
+
return {
|
|
20
|
+
jurisdiction: jv.jurisdiction,
|
|
21
|
+
types_count: types.length,
|
|
22
|
+
types: types.map(t => ({
|
|
23
|
+
id: t.id,
|
|
24
|
+
name: t.name,
|
|
25
|
+
quality_level: t.quality_level,
|
|
26
|
+
payment_chf_ha: t.payment_chf_ha,
|
|
27
|
+
min_area_pct: t.min_area_pct,
|
|
28
|
+
botanical_criteria: t.botanical_criteria,
|
|
29
|
+
notes: t.notes,
|
|
30
|
+
})),
|
|
31
|
+
_meta: buildMeta({
|
|
32
|
+
source_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/biodiversitaetsbeitraege.html',
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=get-bff-requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-bff-requirements.js","sourceRoot":"","sources":["../../src/tools/get-bff-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAa;IAClE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,gDAAgD,CAAC;IAC3D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,GAAG,IAAI,6DAA6D,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,GAAG,IAAI,sCAAsC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,IAAI,+BAA+B,CAAC;IAEvC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAIjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,gGAAgG;SAC7G,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface BufferZoneArgs {
|
|
3
|
+
zone_type?: string;
|
|
4
|
+
jurisdiction?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function handleGetBufferZoneRules(db: Database, args: BufferZoneArgs): {
|
|
7
|
+
error: string;
|
|
8
|
+
supported: readonly string[];
|
|
9
|
+
message: string;
|
|
10
|
+
} | {
|
|
11
|
+
jurisdiction: "CH";
|
|
12
|
+
rules_count: number;
|
|
13
|
+
rules: {
|
|
14
|
+
type: string;
|
|
15
|
+
distance_m: number;
|
|
16
|
+
requirement: string;
|
|
17
|
+
source_law: string;
|
|
18
|
+
notes: string;
|
|
19
|
+
}[];
|
|
20
|
+
_meta: import("../metadata.js").Meta;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=get-buffer-zone-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-buffer-zone-rules.d.ts","sourceRoot":"","sources":["../../src/tools/get-buffer-zone-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;;;;;EAiC1E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleGetBufferZoneRules(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
let sql = 'SELECT * FROM buffer_zones WHERE jurisdiction = ?';
|
|
8
|
+
const params = [jv.jurisdiction];
|
|
9
|
+
if (args.zone_type) {
|
|
10
|
+
sql += ' AND LOWER(type) LIKE LOWER(?)';
|
|
11
|
+
params.push(`%${args.zone_type}%`);
|
|
12
|
+
}
|
|
13
|
+
sql += ' ORDER BY distance_m DESC';
|
|
14
|
+
const zones = db.all(sql, params);
|
|
15
|
+
return {
|
|
16
|
+
jurisdiction: jv.jurisdiction,
|
|
17
|
+
rules_count: zones.length,
|
|
18
|
+
rules: zones.map(z => ({
|
|
19
|
+
type: z.type,
|
|
20
|
+
distance_m: z.distance_m,
|
|
21
|
+
requirement: z.requirement,
|
|
22
|
+
source_law: z.source_law,
|
|
23
|
+
notes: z.notes,
|
|
24
|
+
})),
|
|
25
|
+
_meta: buildMeta({
|
|
26
|
+
source_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/oekologischer-leistungsnachweis.html',
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=get-buffer-zone-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-buffer-zone-rules.js","sourceRoot":"","sources":["../../src/tools/get-buffer-zone-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAoB;IACzE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,mDAAmD,CAAC;IAC9D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,GAAG,IAAI,gCAAgC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,IAAI,2BAA2B,CAAC;IAEnC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,uGAAuG;SACpH,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface EipArgs {
|
|
3
|
+
project_type?: string;
|
|
4
|
+
jurisdiction?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function handleGetEipRequirements(db: Database, args: EipArgs): {
|
|
7
|
+
error: string;
|
|
8
|
+
supported: readonly string[];
|
|
9
|
+
message: string;
|
|
10
|
+
} | {
|
|
11
|
+
jurisdiction: "CH";
|
|
12
|
+
uvp_rules_count: number;
|
|
13
|
+
uvp_rules: {
|
|
14
|
+
rule: string;
|
|
15
|
+
authority: string;
|
|
16
|
+
legal_basis: string;
|
|
17
|
+
threshold: string;
|
|
18
|
+
notes: string;
|
|
19
|
+
}[];
|
|
20
|
+
vbbo_rules_count: number;
|
|
21
|
+
vbbo_rules: {
|
|
22
|
+
rule: string;
|
|
23
|
+
authority: string;
|
|
24
|
+
legal_basis: string;
|
|
25
|
+
threshold: string;
|
|
26
|
+
notes: string;
|
|
27
|
+
}[];
|
|
28
|
+
_meta: import("../metadata.js").Meta;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=get-eip-requirements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-eip-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-eip-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,OAAO;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;EA+CnE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleGetEipRequirements(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
let sql = `SELECT * FROM environmental_rules WHERE topic = 'UVP' AND jurisdiction = ?`;
|
|
8
|
+
const params = [jv.jurisdiction];
|
|
9
|
+
if (args.project_type) {
|
|
10
|
+
sql += ' AND LOWER(rule) LIKE LOWER(?)';
|
|
11
|
+
params.push(`%${args.project_type}%`);
|
|
12
|
+
}
|
|
13
|
+
sql += ' ORDER BY id';
|
|
14
|
+
const rules = db.all(sql, params);
|
|
15
|
+
// Also get VBBo (soil contamination) rules
|
|
16
|
+
const vbbo = db.all(`SELECT * FROM environmental_rules WHERE topic = 'VBBo' AND jurisdiction = ? ORDER BY id`, [jv.jurisdiction]);
|
|
17
|
+
return {
|
|
18
|
+
jurisdiction: jv.jurisdiction,
|
|
19
|
+
uvp_rules_count: rules.length,
|
|
20
|
+
uvp_rules: rules.map(r => ({
|
|
21
|
+
rule: r.rule,
|
|
22
|
+
authority: r.authority,
|
|
23
|
+
legal_basis: r.legal_basis,
|
|
24
|
+
threshold: r.threshold,
|
|
25
|
+
notes: r.notes,
|
|
26
|
+
})),
|
|
27
|
+
vbbo_rules_count: vbbo.length,
|
|
28
|
+
vbbo_rules: vbbo.map(r => ({
|
|
29
|
+
rule: r.rule,
|
|
30
|
+
authority: r.authority,
|
|
31
|
+
legal_basis: r.legal_basis,
|
|
32
|
+
threshold: r.threshold,
|
|
33
|
+
notes: r.notes,
|
|
34
|
+
})),
|
|
35
|
+
_meta: buildMeta({
|
|
36
|
+
source_url: 'https://www.bafu.admin.ch/bafu/de/home/themen/uvp.html',
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=get-eip-requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-eip-requirements.js","sourceRoot":"","sources":["../../src/tools/get-eip-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAa;IAClE,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,4EAA4E,CAAC;IACvF,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,IAAI,gCAAgC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,IAAI,cAAc,CAAC;IAEtB,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAGjB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,2CAA2C;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAGhB,yFAAyF,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjH,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,eAAe,EAAE,KAAK,CAAC,MAAM;QAC7B,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,gBAAgB,EAAE,IAAI,CAAC,MAAM;QAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,wDAAwD;SACrE,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface NutrientLossArgs {
|
|
3
|
+
nutrient?: string;
|
|
4
|
+
jurisdiction?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function handleGetNutrientLossLimits(db: Database, args: NutrientLossArgs): {
|
|
7
|
+
error: string;
|
|
8
|
+
supported: readonly string[];
|
|
9
|
+
message: string;
|
|
10
|
+
} | {
|
|
11
|
+
jurisdiction: "CH";
|
|
12
|
+
limits_count: number;
|
|
13
|
+
limits: {
|
|
14
|
+
nutrient: string;
|
|
15
|
+
year: number;
|
|
16
|
+
reduction_target_pct: number;
|
|
17
|
+
target: string;
|
|
18
|
+
legal_basis: string;
|
|
19
|
+
notes: string;
|
|
20
|
+
}[];
|
|
21
|
+
_meta: import("../metadata.js").Meta;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=get-nutrient-loss-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-nutrient-loss-limits.d.ts","sourceRoot":"","sources":["../../src/tools/get-nutrient-loss-limits.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB;;;;;;;;;;;;;;;;EAkC/E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { buildMeta } from '../metadata.js';
|
|
2
|
+
import { validateJurisdiction } from '../jurisdiction.js';
|
|
3
|
+
export function handleGetNutrientLossLimits(db, args) {
|
|
4
|
+
const jv = validateJurisdiction(args.jurisdiction);
|
|
5
|
+
if (!jv.valid)
|
|
6
|
+
return jv.error;
|
|
7
|
+
let sql = 'SELECT * FROM nutrient_loss_limits WHERE jurisdiction = ?';
|
|
8
|
+
const params = [jv.jurisdiction];
|
|
9
|
+
if (args.nutrient) {
|
|
10
|
+
sql += ' AND LOWER(nutrient) = LOWER(?)';
|
|
11
|
+
params.push(args.nutrient);
|
|
12
|
+
}
|
|
13
|
+
sql += ' ORDER BY nutrient, year';
|
|
14
|
+
const limits = db.all(sql, params);
|
|
15
|
+
return {
|
|
16
|
+
jurisdiction: jv.jurisdiction,
|
|
17
|
+
limits_count: limits.length,
|
|
18
|
+
limits: limits.map(l => ({
|
|
19
|
+
nutrient: l.nutrient,
|
|
20
|
+
year: l.year,
|
|
21
|
+
reduction_target_pct: l.limit_pct,
|
|
22
|
+
target: l.target,
|
|
23
|
+
legal_basis: l.legal_basis,
|
|
24
|
+
notes: l.notes,
|
|
25
|
+
})),
|
|
26
|
+
_meta: buildMeta({
|
|
27
|
+
source_url: 'https://www.blw.admin.ch/blw/de/home/nachhaltige-produktion/umwelt/naehrstoffe.html',
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=get-nutrient-loss-limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-nutrient-loss-limits.js","sourceRoot":"","sources":["../../src/tools/get-nutrient-loss-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,2BAA2B,CAAC,EAAY,EAAE,IAAsB;IAC9E,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAE/B,IAAI,GAAG,GAAG,2DAA2D,CAAC;IACtE,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,GAAG,IAAI,iCAAiC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,IAAI,0BAA0B,CAAC;IAElC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAGlB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,oBAAoB,EAAE,CAAC,CAAC,SAAS;YACjC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC;YACf,UAAU,EAAE,qFAAqF;SAClG,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Database } from '../db.js';
|
|
2
|
+
interface WaterProtectionArgs {
|
|
3
|
+
zone_type?: string;
|
|
4
|
+
jurisdiction?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function handleGetWaterProtectionZones(db: Database, args: WaterProtectionArgs): {
|
|
7
|
+
error: string;
|
|
8
|
+
supported: readonly string[];
|
|
9
|
+
message: string;
|
|
10
|
+
} | {
|
|
11
|
+
error: string;
|
|
12
|
+
message: string;
|
|
13
|
+
jurisdiction?: undefined;
|
|
14
|
+
zones_count?: undefined;
|
|
15
|
+
zones?: undefined;
|
|
16
|
+
_meta?: undefined;
|
|
17
|
+
} | {
|
|
18
|
+
jurisdiction: "CH";
|
|
19
|
+
zones_count: number;
|
|
20
|
+
zones: {
|
|
21
|
+
zone_type: string;
|
|
22
|
+
name: string;
|
|
23
|
+
restrictions: string;
|
|
24
|
+
description: string;
|
|
25
|
+
legal_basis: string;
|
|
26
|
+
}[];
|
|
27
|
+
_meta: import("../metadata.js").Meta;
|
|
28
|
+
error?: undefined;
|
|
29
|
+
message?: undefined;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=get-water-protection-zones.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-water-protection-zones.d.ts","sourceRoot":"","sources":["../../src/tools/get-water-protection-zones.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;EAwCpF"}
|