@ansvar/ch-organic-regen-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.
Files changed (108) hide show
  1. package/.github/workflows/check-freshness.yml +49 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +25 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +18 -0
  6. package/.github/workflows/ingest.yml +59 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +15 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +47 -0
  11. package/DISCLAIMER.md +67 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +23 -0
  15. package/README.md +117 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +141 -0
  18. package/data/coverage.json +22 -0
  19. package/data/database.db +0 -0
  20. package/data/sources.yml +36 -0
  21. package/dist/db.d.ts +25 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +184 -0
  24. package/dist/db.js.map +1 -0
  25. package/dist/http-server.d.ts +2 -0
  26. package/dist/http-server.d.ts.map +1 -0
  27. package/dist/http-server.js +263 -0
  28. package/dist/http-server.js.map +1 -0
  29. package/dist/jurisdiction.d.ts +18 -0
  30. package/dist/jurisdiction.d.ts.map +1 -0
  31. package/dist/jurisdiction.js +16 -0
  32. package/dist/jurisdiction.js.map +1 -0
  33. package/dist/metadata.d.ts +11 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +31 -0
  36. package/dist/metadata.js.map +1 -0
  37. package/dist/server.d.ts +3 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +209 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/about.d.ts +15 -0
  42. package/dist/tools/about.d.ts.map +1 -0
  43. package/dist/tools/about.js +27 -0
  44. package/dist/tools/about.js.map +1 -0
  45. package/dist/tools/check-freshness.d.ts +15 -0
  46. package/dist/tools/check-freshness.d.ts.map +1 -0
  47. package/dist/tools/check-freshness.js +26 -0
  48. package/dist/tools/check-freshness.js.map +1 -0
  49. package/dist/tools/get-approved-inputs.d.ts +26 -0
  50. package/dist/tools/get-approved-inputs.d.ts.map +1 -0
  51. package/dist/tools/get-approved-inputs.js +28 -0
  52. package/dist/tools/get-approved-inputs.js.map +1 -0
  53. package/dist/tools/get-conversion-requirements.d.ts +28 -0
  54. package/dist/tools/get-conversion-requirements.d.ts.map +1 -0
  55. package/dist/tools/get-conversion-requirements.js +32 -0
  56. package/dist/tools/get-conversion-requirements.js.map +1 -0
  57. package/dist/tools/get-organic-standards.d.ts +27 -0
  58. package/dist/tools/get-organic-standards.d.ts.map +1 -0
  59. package/dist/tools/get-organic-standards.js +31 -0
  60. package/dist/tools/get-organic-standards.js.map +1 -0
  61. package/dist/tools/get-organic-subsidies.d.ts +28 -0
  62. package/dist/tools/get-organic-subsidies.d.ts.map +1 -0
  63. package/dist/tools/get-organic-subsidies.js +32 -0
  64. package/dist/tools/get-organic-subsidies.js.map +1 -0
  65. package/dist/tools/get-soil-health-guidance.d.ts +25 -0
  66. package/dist/tools/get-soil-health-guidance.d.ts.map +1 -0
  67. package/dist/tools/get-soil-health-guidance.js +27 -0
  68. package/dist/tools/get-soil-health-guidance.js.map +1 -0
  69. package/dist/tools/list-sources.d.ts +18 -0
  70. package/dist/tools/list-sources.d.ts.map +1 -0
  71. package/dist/tools/list-sources.js +61 -0
  72. package/dist/tools/list-sources.js.map +1 -0
  73. package/dist/tools/search-certification-guidance.d.ts +24 -0
  74. package/dist/tools/search-certification-guidance.d.ts.map +1 -0
  75. package/dist/tools/search-certification-guidance.js +24 -0
  76. package/dist/tools/search-certification-guidance.js.map +1 -0
  77. package/dist/tools/search-organic-rules.d.ts +25 -0
  78. package/dist/tools/search-organic-rules.d.ts.map +1 -0
  79. package/dist/tools/search-organic-rules.js +26 -0
  80. package/dist/tools/search-organic-rules.js.map +1 -0
  81. package/docker-compose.yml +12 -0
  82. package/eslint.config.js +26 -0
  83. package/package.json +54 -0
  84. package/scripts/ingest.ts +963 -0
  85. package/server.json +16 -0
  86. package/src/db.ts +225 -0
  87. package/src/http-server.ts +302 -0
  88. package/src/jurisdiction.ts +30 -0
  89. package/src/metadata.ts +45 -0
  90. package/src/server.ts +239 -0
  91. package/src/tools/about.ts +28 -0
  92. package/src/tools/check-freshness.ts +42 -0
  93. package/src/tools/get-approved-inputs.ts +44 -0
  94. package/src/tools/get-conversion-requirements.ts +50 -0
  95. package/src/tools/get-organic-standards.ts +48 -0
  96. package/src/tools/get-organic-subsidies.ts +50 -0
  97. package/src/tools/get-soil-health-guidance.ts +42 -0
  98. package/src/tools/list-sources.ts +75 -0
  99. package/src/tools/search-certification-guidance.ts +41 -0
  100. package/src/tools/search-organic-rules.ts +35 -0
  101. package/tests/db.test.ts +96 -0
  102. package/tests/helpers/seed-db.ts +145 -0
  103. package/tests/jurisdiction.test.ts +35 -0
  104. package/tests/tools/about.test.ts +22 -0
  105. package/tests/tools/check-freshness.test.ts +57 -0
  106. package/tests/tools/list-sources.test.ts +55 -0
  107. package/tests/tools/search-organic-rules.test.ts +56 -0
  108. 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 Organic & Regenerative Farming MCP',
6
+ description: 'Swiss organic and regenerative agriculture data: Bio Suisse Knospe standards, Bio-Verordnung (SR 910.18), ' +
7
+ 'Demeter biodynamic rules, FiBL Betriebsmittelliste (approved inputs), conversion requirements, ' +
8
+ 'organic subsidies (Bio-Beitrag), soil health guidance, and certification processes (bio.inspecta, Bio Test Agro).',
9
+ version: '0.1.0',
10
+ jurisdiction: [...SUPPORTED_JURISDICTIONS],
11
+ data_sources: [
12
+ 'Bio Suisse Richtlinien (Knospe)',
13
+ 'Bio-Verordnung SR 910.18 (BLW)',
14
+ 'FiBL Betriebsmittelliste',
15
+ 'Demeter Schweiz Richtlinien',
16
+ 'AGRIDEA Umstellungsberatung',
17
+ ],
18
+ tools_count: 10,
19
+ links: {
20
+ homepage: 'https://ansvar.eu/open-agriculture',
21
+ repository: 'https://github.com/ansvar-systems/ch-organic-regen-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,gDAAgD;QACtD,WAAW,EACT,4GAA4G;YAC5G,iGAAiG;YACjG,mHAAmH;QACrH,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC1C,YAAY,EAAE;YACZ,iCAAiC;YACjC,gCAAgC;YAChC,0BAA0B;YAC1B,6BAA6B;YAC7B,6BAA6B;SAC9B;QACD,WAAW,EAAE,EAAE;QACf,KAAK,EAAE;YACL,QAAQ,EAAE,oCAAoC;YAC9C,UAAU,EAAE,wDAAwD;YACpE,WAAW,EAAE,uBAAuB;SACrC;QACD,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-organic-regen-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,mEAAmE;QACpF,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Database } from '../db.js';
2
+ interface InputsArgs {
3
+ input_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetApprovedInputs(db: Database, args: InputsArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ filters: {
13
+ input_type: string | undefined;
14
+ };
15
+ results_count: number;
16
+ results: {
17
+ input_type: string;
18
+ product_name: string;
19
+ description: string;
20
+ restrictions: string;
21
+ source: string;
22
+ }[];
23
+ _meta: import("../metadata.js").Meta;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=get-approved-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-approved-inputs.d.ts","sourceRoot":"","sources":["../../src/tools/get-approved-inputs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU;;;;;;;;;;;;;;;;;;EAkCrE"}
@@ -0,0 +1,28 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetApprovedInputs(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM approved_inputs WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.input_type) {
10
+ sql += ' AND LOWER(input_type) LIKE LOWER(?)';
11
+ params.push(`%${args.input_type}%`);
12
+ }
13
+ const rows = db.all(sql, params);
14
+ return {
15
+ jurisdiction: jv.jurisdiction,
16
+ filters: { input_type: args.input_type },
17
+ results_count: rows.length,
18
+ results: rows.map(r => ({
19
+ input_type: r.input_type,
20
+ product_name: r.product_name,
21
+ description: r.description,
22
+ restrictions: r.restrictions,
23
+ source: r.source,
24
+ })),
25
+ _meta: buildMeta({ source_url: 'https://www.betriebsmittelliste.ch' }),
26
+ };
27
+ }
28
+ //# sourceMappingURL=get-approved-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-approved-inputs.js","sourceRoot":"","sources":["../../src/tools/get-approved-inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,uBAAuB,CAAC,EAAY,EAAE,IAAgB;IACpE,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,sDAAsD,CAAC;IACjE,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,GAAG,IAAI,sCAAsC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAOhB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;QACxC,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,oCAAoC,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Database } from '../db.js';
2
+ interface ConversionArgs {
3
+ farm_type?: string;
4
+ current_system?: string;
5
+ jurisdiction?: string;
6
+ }
7
+ export declare function handleGetConversionRequirements(db: Database, args: ConversionArgs): {
8
+ error: string;
9
+ supported: readonly string[];
10
+ message: string;
11
+ } | {
12
+ jurisdiction: "CH";
13
+ filters: {
14
+ farm_type: string | undefined;
15
+ current_system: string | undefined;
16
+ };
17
+ results_count: number;
18
+ results: {
19
+ farm_type: string;
20
+ current_system: string;
21
+ timeline_years: number;
22
+ requirements: string;
23
+ support_measures: string;
24
+ }[];
25
+ _meta: import("../metadata.js").Meta;
26
+ };
27
+ export {};
28
+ //# sourceMappingURL=get-conversion-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversion-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-conversion-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;;;;;;;;;EAuCjF"}
@@ -0,0 +1,32 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetConversionRequirements(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM conversion_requirements WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.farm_type) {
10
+ sql += ' AND LOWER(farm_type) LIKE LOWER(?)';
11
+ params.push(`%${args.farm_type}%`);
12
+ }
13
+ if (args.current_system) {
14
+ sql += ' AND LOWER(current_system) LIKE LOWER(?)';
15
+ params.push(`%${args.current_system}%`);
16
+ }
17
+ const rows = db.all(sql, params);
18
+ return {
19
+ jurisdiction: jv.jurisdiction,
20
+ filters: { farm_type: args.farm_type, current_system: args.current_system },
21
+ results_count: rows.length,
22
+ results: rows.map(r => ({
23
+ farm_type: r.farm_type,
24
+ current_system: r.current_system,
25
+ timeline_years: r.timeline_years,
26
+ requirements: r.requirements,
27
+ support_measures: r.support_measures,
28
+ })),
29
+ _meta: buildMeta({ source_url: 'https://www.bio-suisse.ch/de/umstellung' }),
30
+ };
31
+ }
32
+ //# sourceMappingURL=get-conversion-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-conversion-requirements.js","sourceRoot":"","sources":["../../src/tools/get-conversion-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,+BAA+B,CAAC,EAAY,EAAE,IAAoB;IAChF,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,8DAA8D,CAAC;IACzE,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,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,GAAG,IAAI,0CAA0C,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAOhB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;QAC3E,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;SACrC,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,yCAAyC,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Database } from '../db.js';
2
+ interface StandardsArgs {
3
+ production_type?: string;
4
+ standard?: string;
5
+ jurisdiction?: string;
6
+ }
7
+ export declare function handleGetOrganicStandards(db: Database, args: StandardsArgs): {
8
+ error: string;
9
+ supported: readonly string[];
10
+ message: string;
11
+ } | {
12
+ jurisdiction: "CH";
13
+ filters: {
14
+ production_type: string | undefined;
15
+ standard: string | undefined;
16
+ };
17
+ results_count: number;
18
+ results: {
19
+ production_type: string;
20
+ standard: string;
21
+ rule: string;
22
+ description: string;
23
+ }[];
24
+ _meta: import("../metadata.js").Meta;
25
+ };
26
+ export {};
27
+ //# sourceMappingURL=get-organic-standards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-organic-standards.d.ts","sourceRoot":"","sources":["../../src/tools/get-organic-standards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,aAAa;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa;;;;;;;;;;;;;;;;;;EAqC1E"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetOrganicStandards(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM organic_standards WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.production_type) {
10
+ sql += ' AND LOWER(production_type) LIKE LOWER(?)';
11
+ params.push(`%${args.production_type}%`);
12
+ }
13
+ if (args.standard) {
14
+ sql += ' AND LOWER(standard) LIKE LOWER(?)';
15
+ params.push(`%${args.standard}%`);
16
+ }
17
+ const rows = db.all(sql, params);
18
+ return {
19
+ jurisdiction: jv.jurisdiction,
20
+ filters: { production_type: args.production_type, standard: args.standard },
21
+ results_count: rows.length,
22
+ results: rows.map(r => ({
23
+ production_type: r.production_type,
24
+ standard: r.standard,
25
+ rule: r.rule,
26
+ description: r.description,
27
+ })),
28
+ _meta: buildMeta({ source_url: 'https://www.bio-suisse.ch/de/richtlinien' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-organic-standards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-organic-standards.js","sourceRoot":"","sources":["../../src/tools/get-organic-standards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,yBAAyB,CAAC,EAAY,EAAE,IAAmB;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,wDAAwD,CAAC;IACnE,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,GAAG,IAAI,2CAA2C,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,GAAG,IAAI,oCAAoC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAMhB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC3E,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,0CAA0C,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Database } from '../db.js';
2
+ interface SubsidiesArgs {
3
+ subsidy_type?: string;
4
+ zone?: string;
5
+ jurisdiction?: string;
6
+ }
7
+ export declare function handleGetOrganicSubsidies(db: Database, args: SubsidiesArgs): {
8
+ error: string;
9
+ supported: readonly string[];
10
+ message: string;
11
+ } | {
12
+ jurisdiction: "CH";
13
+ filters: {
14
+ subsidy_type: string | undefined;
15
+ zone: string | undefined;
16
+ };
17
+ results_count: number;
18
+ results: {
19
+ subsidy_type: string;
20
+ zone: string;
21
+ rate_chf_ha: number;
22
+ conditions: string;
23
+ stacking_rules: string;
24
+ }[];
25
+ _meta: import("../metadata.js").Meta;
26
+ };
27
+ export {};
28
+ //# sourceMappingURL=get-organic-subsidies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-organic-subsidies.d.ts","sourceRoot":"","sources":["../../src/tools/get-organic-subsidies.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,aAAa;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa;;;;;;;;;;;;;;;;;;;EAuC1E"}
@@ -0,0 +1,32 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetOrganicSubsidies(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM organic_subsidies WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.subsidy_type) {
10
+ sql += ' AND LOWER(subsidy_type) LIKE LOWER(?)';
11
+ params.push(`%${args.subsidy_type}%`);
12
+ }
13
+ if (args.zone) {
14
+ sql += ' AND (LOWER(zone) LIKE LOWER(?) OR zone IS NULL)';
15
+ params.push(`%${args.zone}%`);
16
+ }
17
+ const rows = db.all(sql, params);
18
+ return {
19
+ jurisdiction: jv.jurisdiction,
20
+ filters: { subsidy_type: args.subsidy_type, zone: args.zone },
21
+ results_count: rows.length,
22
+ results: rows.map(r => ({
23
+ subsidy_type: r.subsidy_type,
24
+ zone: r.zone,
25
+ rate_chf_ha: r.rate_chf_ha,
26
+ conditions: r.conditions,
27
+ stacking_rules: r.stacking_rules,
28
+ })),
29
+ _meta: buildMeta({ source_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/produktionssystembeitraege.html' }),
30
+ };
31
+ }
32
+ //# sourceMappingURL=get-organic-subsidies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-organic-subsidies.js","sourceRoot":"","sources":["../../src/tools/get-organic-subsidies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,yBAAyB,CAAC,EAAY,EAAE,IAAmB;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,wDAAwD,CAAC;IACnE,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,GAAG,IAAI,wCAAwC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,GAAG,IAAI,kDAAkD,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAOhB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QAC7D,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,cAAc;SACjC,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,kGAAkG,EAAE,CAAC;KACrI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Database } from '../db.js';
2
+ interface SoilHealthArgs {
3
+ topic?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetSoilHealthGuidance(db: Database, args: SoilHealthArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ jurisdiction: "CH";
12
+ filters: {
13
+ topic: string | undefined;
14
+ };
15
+ results_count: number;
16
+ results: {
17
+ topic: string;
18
+ guidance: string;
19
+ technique: string;
20
+ benefits: string;
21
+ }[];
22
+ _meta: import("../metadata.js").Meta;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=get-soil-health-guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-soil-health-guidance.d.ts","sourceRoot":"","sources":["../../src/tools/get-soil-health-guidance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc;;;;;;;;;;;;;;;;;EAgC7E"}
@@ -0,0 +1,27 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetSoilHealthGuidance(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ let sql = 'SELECT * FROM soil_health WHERE jurisdiction = ?';
8
+ const params = [jv.jurisdiction];
9
+ if (args.topic) {
10
+ sql += ' AND LOWER(topic) LIKE LOWER(?)';
11
+ params.push(`%${args.topic}%`);
12
+ }
13
+ const rows = db.all(sql, params);
14
+ return {
15
+ jurisdiction: jv.jurisdiction,
16
+ filters: { topic: args.topic },
17
+ results_count: rows.length,
18
+ results: rows.map(r => ({
19
+ topic: r.topic,
20
+ guidance: r.guidance,
21
+ technique: r.technique,
22
+ benefits: r.benefits,
23
+ })),
24
+ _meta: buildMeta({ source_url: 'https://www.fibl.org/de/themen/bodenfruchtbarkeit' }),
25
+ };
26
+ }
27
+ //# sourceMappingURL=get-soil-health-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-soil-health-guidance.js","sourceRoot":"","sources":["../../src/tools/get-soil-health-guidance.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,IAAoB;IAC5E,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,kDAAkD,CAAC;IAC7D,MAAM,MAAM,GAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,GAAG,IAAI,iCAAiC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAMhB,GAAG,EAAE,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;QAC9B,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,mDAAmD,EAAE,CAAC;KACtF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import type { Database } from '../db.js';
3
+ interface Source {
4
+ name: string;
5
+ authority: string;
6
+ official_url: string;
7
+ retrieval_method: string;
8
+ update_frequency: string;
9
+ license: string;
10
+ coverage: string;
11
+ last_retrieved?: string;
12
+ }
13
+ export declare function handleListSources(db: Database): {
14
+ sources: Source[];
15
+ _meta: ReturnType<typeof buildMeta>;
16
+ };
17
+ export {};
18
+ //# sourceMappingURL=list-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sources.d.ts","sourceRoot":"","sources":["../../src/tools/list-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;CAAE,CA4D1G"}
@@ -0,0 +1,61 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ export function handleListSources(db) {
3
+ const lastIngest = db.get('SELECT value FROM db_metadata WHERE key = ?', ['last_ingest']);
4
+ const sources = [
5
+ {
6
+ name: 'Bio Suisse Richtlinien (Knospe)',
7
+ authority: 'Bio Suisse',
8
+ official_url: 'https://www.bio-suisse.ch/de/richtlinien',
9
+ retrieval_method: 'PDF_EXTRACT',
10
+ update_frequency: 'annual (Delegiertenversammlung)',
11
+ license: 'Bio Suisse — public standards document',
12
+ coverage: 'Knospe production rules: feed, animal welfare, processing, BFF, imports',
13
+ last_retrieved: lastIngest?.value,
14
+ },
15
+ {
16
+ name: 'Bio-Verordnung (SR 910.18)',
17
+ authority: 'Bundesamt fuer Landwirtschaft (BLW)',
18
+ official_url: 'https://www.fedlex.admin.ch/eli/cc/1997/2498_2498_2498/de',
19
+ retrieval_method: 'PDF_EXTRACT',
20
+ update_frequency: 'periodic (with ordinance revisions)',
21
+ license: 'Swiss Federal Administration — free reuse',
22
+ coverage: 'Federal organic farming regulation: minimum standards, conversion, labelling',
23
+ last_retrieved: lastIngest?.value,
24
+ },
25
+ {
26
+ name: 'FiBL Betriebsmittelliste',
27
+ authority: 'Forschungsinstitut fuer biologischen Landbau (FiBL)',
28
+ official_url: 'https://www.betriebsmittelliste.ch',
29
+ retrieval_method: 'ONLINE_REGISTER',
30
+ update_frequency: 'annual',
31
+ license: 'FiBL — public reference list',
32
+ coverage: 'Approved inputs for Swiss organic farming: fertilisers, plant protection, feed',
33
+ last_retrieved: lastIngest?.value,
34
+ },
35
+ {
36
+ name: 'Demeter Schweiz Richtlinien',
37
+ authority: 'Demeter Schweiz',
38
+ official_url: 'https://www.demeter.ch/richtlinien',
39
+ retrieval_method: 'PDF_EXTRACT',
40
+ update_frequency: 'periodic',
41
+ license: 'Demeter — public standards document',
42
+ coverage: 'Biodynamic farming rules: preparations 500-508, composting, livestock integration',
43
+ last_retrieved: lastIngest?.value,
44
+ },
45
+ {
46
+ name: 'Direktzahlungsverordnung (DZV) — Bio-Beitrag',
47
+ authority: 'Bundesamt fuer Landwirtschaft (BLW)',
48
+ official_url: 'https://www.blw.admin.ch/blw/de/home/instrumente/direktzahlungen/produktionssystembeitraege.html',
49
+ retrieval_method: 'PDF_EXTRACT',
50
+ update_frequency: 'annual (DZV updates)',
51
+ license: 'Swiss Federal Administration — free reuse',
52
+ coverage: 'Bio-Beitrag rates per land use type and altitude zone',
53
+ last_retrieved: lastIngest?.value,
54
+ },
55
+ ];
56
+ return {
57
+ sources,
58
+ _meta: buildMeta(),
59
+ };
60
+ }
61
+ //# sourceMappingURL=list-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sources.js","sourceRoot":"","sources":["../../src/tools/list-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc3C,MAAM,UAAU,iBAAiB,CAAC,EAAY;IAC5C,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,CAAoB,6CAA6C,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAE7G,MAAM,OAAO,GAAa;QACxB;YACE,IAAI,EAAE,iCAAiC;YACvC,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,0CAA0C;YACxD,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,iCAAiC;YACnD,OAAO,EAAE,wCAAwC;YACjD,QAAQ,EAAE,yEAAyE;YACnF,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,SAAS,EAAE,qCAAqC;YAChD,YAAY,EAAE,2DAA2D;YACzE,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,qCAAqC;YACvD,OAAO,EAAE,2CAA2C;YACpD,QAAQ,EAAE,8EAA8E;YACxF,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,SAAS,EAAE,qDAAqD;YAChE,YAAY,EAAE,oCAAoC;YAClD,gBAAgB,EAAE,iBAAiB;YACnC,gBAAgB,EAAE,QAAQ;YAC1B,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE,gFAAgF;YAC1F,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,6BAA6B;YACnC,SAAS,EAAE,iBAAiB;YAC5B,YAAY,EAAE,oCAAoC;YAClD,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,UAAU;YAC5B,OAAO,EAAE,qCAAqC;YAC9C,QAAQ,EAAE,mFAAmF;YAC7F,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,8CAA8C;YACpD,SAAS,EAAE,qCAAqC;YAChD,YAAY,EAAE,kGAAkG;YAChH,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,sBAAsB;YACxC,OAAO,EAAE,2CAA2C;YACpD,QAAQ,EAAE,uDAAuD;YACjE,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;KACF,CAAC;IAEF,OAAO;QACL,OAAO;QACP,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Database } from '../db.js';
2
+ interface CertArgs {
3
+ query: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleSearchCertificationGuidance(db: Database, args: CertArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ query: string;
12
+ jurisdiction: "CH";
13
+ results_count: number;
14
+ results: {
15
+ step: string;
16
+ description: string;
17
+ inspector: string;
18
+ frequency: string;
19
+ cost_notes: string;
20
+ }[];
21
+ _meta: import("../metadata.js").Meta;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=search-certification-guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-certification-guidance.d.ts","sourceRoot":"","sources":["../../src/tools/search-certification-guidance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iCAAiC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;;;;;;;;;;;;;;;;EA+B7E"}
@@ -0,0 +1,24 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleSearchCertificationGuidance(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ const searchTerm = `%${args.query}%`;
8
+ const rows = db.all(`SELECT * FROM certification_guidance WHERE jurisdiction = ?
9
+ AND (LOWER(step) LIKE LOWER(?) OR LOWER(description) LIKE LOWER(?))`, [jv.jurisdiction, searchTerm, searchTerm]);
10
+ return {
11
+ query: args.query,
12
+ jurisdiction: jv.jurisdiction,
13
+ results_count: rows.length,
14
+ results: rows.map(r => ({
15
+ step: r.step,
16
+ description: r.description,
17
+ inspector: r.inspector,
18
+ frequency: r.frequency,
19
+ cost_notes: r.cost_notes,
20
+ })),
21
+ _meta: buildMeta({ source_url: 'https://www.bio-inspecta.ch' }),
22
+ };
23
+ }
24
+ //# sourceMappingURL=search-certification-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-certification-guidance.js","sourceRoot":"","sources":["../../src/tools/search-certification-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,iCAAiC,CAAC,EAAY,EAAE,IAAc;IAC5E,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,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;IACrC,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAQjB;yEACqE,EACrE,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAC1C,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,6BAA6B,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Database } from '../db.js';
2
+ interface SearchArgs {
3
+ query: string;
4
+ topic?: string;
5
+ jurisdiction?: string;
6
+ limit?: number;
7
+ }
8
+ export declare function handleSearchOrganicRules(db: Database, args: SearchArgs): {
9
+ error: string;
10
+ supported: readonly string[];
11
+ message: string;
12
+ } | {
13
+ query: string;
14
+ jurisdiction: "CH";
15
+ results_count: number;
16
+ results: {
17
+ title: string;
18
+ body: string;
19
+ topic: string;
20
+ relevance_rank: number;
21
+ }[];
22
+ _meta: import("../metadata.js").Meta;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=search-organic-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-organic-rules.d.ts","sourceRoot":"","sources":["../../src/tools/search-organic-rules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpD,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU;;;;;;;;;;;;;;;EAuBtE"}
@@ -0,0 +1,26 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ import { ftsSearch } from '../db.js';
4
+ export function handleSearchOrganicRules(db, args) {
5
+ const jv = validateJurisdiction(args.jurisdiction);
6
+ if (!jv.valid)
7
+ return jv.error;
8
+ const limit = Math.min(args.limit ?? 20, 50);
9
+ let results = ftsSearch(db, args.query, limit);
10
+ if (args.topic) {
11
+ results = results.filter(r => r.topic.toLowerCase().includes(args.topic.toLowerCase()));
12
+ }
13
+ return {
14
+ query: args.query,
15
+ jurisdiction: jv.jurisdiction,
16
+ results_count: results.length,
17
+ results: results.map(r => ({
18
+ title: r.title,
19
+ body: r.body,
20
+ topic: r.topic,
21
+ relevance_rank: r.rank,
22
+ })),
23
+ _meta: buildMeta(),
24
+ };
25
+ }
26
+ //# sourceMappingURL=search-organic-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-organic-rules.js","sourceRoot":"","sources":["../../src/tools/search-organic-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAiB,MAAM,UAAU,CAAC;AASpD,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,IAAgB;IACrE,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,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAE/C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;QAC7B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,cAAc,EAAE,CAAC,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}