@ansvar/ch-farm-safety-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 (109) hide show
  1. package/.github/workflows/check-freshness.yml +53 -0
  2. package/.github/workflows/ci.yml +21 -0
  3. package/.github/workflows/codeql.yml +30 -0
  4. package/.github/workflows/ghcr-build.yml +45 -0
  5. package/.github/workflows/gitleaks.yml +24 -0
  6. package/.github/workflows/ingest.yml +67 -0
  7. package/.github/workflows/publish.yml +24 -0
  8. package/CHANGELOG.md +23 -0
  9. package/CODEOWNERS +1 -0
  10. package/COVERAGE.md +54 -0
  11. package/DISCLAIMER.md +51 -0
  12. package/Dockerfile +26 -0
  13. package/LICENSE +17 -0
  14. package/PRIVACY.md +25 -0
  15. package/README.md +129 -0
  16. package/SECURITY.md +25 -0
  17. package/TOOLS.md +140 -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 +200 -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 +250 -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 +10 -0
  34. package/dist/metadata.d.ts.map +1 -0
  35. package/dist/metadata.js +20 -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 +196 -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-accident-reporting.d.ts +49 -0
  50. package/dist/tools/get-accident-reporting.d.ts.map +1 -0
  51. package/dist/tools/get-accident-reporting.js +31 -0
  52. package/dist/tools/get-accident-reporting.js.map +1 -0
  53. package/dist/tools/get-chemical-safety.d.ts +47 -0
  54. package/dist/tools/get-chemical-safety.d.ts.map +1 -0
  55. package/dist/tools/get-chemical-safety.js +31 -0
  56. package/dist/tools/get-chemical-safety.js.map +1 -0
  57. package/dist/tools/get-machinery-safety.d.ts +46 -0
  58. package/dist/tools/get-machinery-safety.d.ts.map +1 -0
  59. package/dist/tools/get-machinery-safety.js +31 -0
  60. package/dist/tools/get-machinery-safety.js.map +1 -0
  61. package/dist/tools/get-risk-assessment-requirements.d.ts +47 -0
  62. package/dist/tools/get-risk-assessment-requirements.d.ts.map +1 -0
  63. package/dist/tools/get-risk-assessment-requirements.js +31 -0
  64. package/dist/tools/get-risk-assessment-requirements.js.map +1 -0
  65. package/dist/tools/get-young-worker-rules.d.ts +47 -0
  66. package/dist/tools/get-young-worker-rules.d.ts.map +1 -0
  67. package/dist/tools/get-young-worker-rules.js +31 -0
  68. package/dist/tools/get-young-worker-rules.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 +51 -0
  72. package/dist/tools/list-sources.js.map +1 -0
  73. package/dist/tools/search-bul-guidance.d.ts +23 -0
  74. package/dist/tools/search-bul-guidance.d.ts.map +1 -0
  75. package/dist/tools/search-bul-guidance.js +35 -0
  76. package/dist/tools/search-bul-guidance.js.map +1 -0
  77. package/dist/tools/search-safety-rules.d.ts +25 -0
  78. package/dist/tools/search-safety-rules.d.ts.map +1 -0
  79. package/dist/tools/search-safety-rules.js +26 -0
  80. package/dist/tools/search-safety-rules.js.map +1 -0
  81. package/docker-compose.yml +12 -0
  82. package/eslint.config.js +27 -0
  83. package/package.json +54 -0
  84. package/scripts/ingest.ts +879 -0
  85. package/server.json +31 -0
  86. package/src/db.ts +241 -0
  87. package/src/http-server.ts +282 -0
  88. package/src/jurisdiction.ts +30 -0
  89. package/src/metadata.ts +30 -0
  90. package/src/server.ts +219 -0
  91. package/src/tools/about.ts +28 -0
  92. package/src/tools/check-freshness.ts +42 -0
  93. package/src/tools/get-accident-reporting.ts +52 -0
  94. package/src/tools/get-chemical-safety.ts +52 -0
  95. package/src/tools/get-machinery-safety.ts +52 -0
  96. package/src/tools/get-risk-assessment-requirements.ts +52 -0
  97. package/src/tools/get-young-worker-rules.ts +52 -0
  98. package/src/tools/list-sources.ts +65 -0
  99. package/src/tools/search-bul-guidance.ts +51 -0
  100. package/src/tools/search-safety-rules.ts +35 -0
  101. package/tests/db.test.ts +121 -0
  102. package/tests/helpers/seed-db.ts +134 -0
  103. package/tests/jurisdiction.test.ts +54 -0
  104. package/tests/tools/about.test.ts +44 -0
  105. package/tests/tools/check-freshness.test.ts +68 -0
  106. package/tests/tools/list-sources.test.ts +75 -0
  107. package/tests/tools/search-safety-rules.test.ts +75 -0
  108. package/tsconfig.json +19 -0
  109. package/vitest.config.ts +9 -0
@@ -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-farm-safety-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,iEAAiE;QAClF,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Database } from '../db.js';
2
+ interface AccidentReportingArgs {
3
+ severity?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetAccidentReporting(db: Database, args: AccidentReportingArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ severity?: undefined;
14
+ jurisdiction?: undefined;
15
+ results_count?: undefined;
16
+ results?: undefined;
17
+ _meta?: undefined;
18
+ } | {
19
+ severity: string;
20
+ jurisdiction: "CH";
21
+ results_count: number;
22
+ results: {
23
+ id: number;
24
+ severity: string;
25
+ obligation: string;
26
+ deadline: string;
27
+ form: string;
28
+ insurer: string;
29
+ }[];
30
+ _meta: import("../metadata.js").Meta;
31
+ error?: undefined;
32
+ message?: undefined;
33
+ } | {
34
+ jurisdiction: "CH";
35
+ results_count: number;
36
+ results: {
37
+ severity: string;
38
+ obligation: string;
39
+ deadline: string;
40
+ form: string;
41
+ insurer: string;
42
+ }[];
43
+ _meta: import("../metadata.js").Meta;
44
+ error?: undefined;
45
+ message?: undefined;
46
+ severity?: undefined;
47
+ };
48
+ export {};
49
+ //# sourceMappingURL=get-accident-reporting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-accident-reporting.d.ts","sourceRoot":"","sources":["../../src/tools/get-accident-reporting.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB;;;;;;;;;;;;;;;;;YAM1E,MAAM;kBAAY,MAAM;oBAAc,MAAM;kBACtC,MAAM;cAAQ,MAAM;iBAAW,MAAM;;;;;;;;;kBAuBvC,MAAM;oBAAc,MAAM;kBAAY,MAAM;cAAQ,MAAM;iBAAW,MAAM;;;;;;EAYxF"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetAccidentReporting(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ if (args.severity) {
8
+ const results = db.all('SELECT * FROM accident_reporting WHERE LOWER(severity) LIKE LOWER(?) AND jurisdiction = ?', [`%${args.severity}%`, jv.jurisdiction]);
9
+ if (results.length === 0) {
10
+ return {
11
+ error: 'not_found',
12
+ message: `No reporting obligations found for severity '${args.severity}'.`,
13
+ };
14
+ }
15
+ return {
16
+ severity: args.severity,
17
+ jurisdiction: jv.jurisdiction,
18
+ results_count: results.length,
19
+ results,
20
+ _meta: buildMeta({ source_url: 'https://www.suva.ch/de-ch/unfall-melden' }),
21
+ };
22
+ }
23
+ const all = db.all('SELECT severity, obligation, deadline, form, insurer FROM accident_reporting WHERE jurisdiction = ? ORDER BY severity', [jv.jurisdiction]);
24
+ return {
25
+ jurisdiction: jv.jurisdiction,
26
+ results_count: all.length,
27
+ results: all,
28
+ _meta: buildMeta({ source_url: 'https://www.suva.ch/de-ch/unfall-melden' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-accident-reporting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-accident-reporting.js","sourceRoot":"","sources":["../../src/tools/get-accident-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,0BAA0B,CAAC,EAAY,EAAE,IAA2B;IAClF,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,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAIpB,2FAA2F,EAC3F,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,CACxC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,gDAAgD,IAAI,CAAC,QAAQ,IAAI;aAC3E,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO;YACP,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,yCAAyC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAGhB,uHAAuH,EACvH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,yCAAyC,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Database } from '../db.js';
2
+ interface ChemicalSafetyArgs {
3
+ substance_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetChemicalSafety(db: Database, args: ChemicalSafetyArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ substance_type?: undefined;
14
+ jurisdiction?: undefined;
15
+ results_count?: undefined;
16
+ results?: undefined;
17
+ _meta?: undefined;
18
+ } | {
19
+ substance_type: string;
20
+ jurisdiction: "CH";
21
+ results_count: number;
22
+ results: {
23
+ id: number;
24
+ substance_type: string;
25
+ exposure_limit: string;
26
+ ppe_required: string;
27
+ storage_rule: string;
28
+ }[];
29
+ _meta: import("../metadata.js").Meta;
30
+ error?: undefined;
31
+ message?: undefined;
32
+ } | {
33
+ jurisdiction: "CH";
34
+ results_count: number;
35
+ results: {
36
+ substance_type: string;
37
+ exposure_limit: string;
38
+ ppe_required: string;
39
+ storage_rule: string;
40
+ }[];
41
+ _meta: import("../metadata.js").Meta;
42
+ error?: undefined;
43
+ message?: undefined;
44
+ substance_type?: undefined;
45
+ };
46
+ export {};
47
+ //# sourceMappingURL=get-chemical-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-chemical-safety.d.ts","sourceRoot":"","sources":["../../src/tools/get-chemical-safety.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,kBAAkB;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB;;;;;;;;;;;;;;;;;YAMpE,MAAM;wBAAkB,MAAM;wBAAkB,MAAM;sBAC5C,MAAM;sBAAgB,MAAM;;;;;;;;;wBAuB5B,MAAM;wBAAkB,MAAM;sBAAgB,MAAM;sBAAgB,MAAM;;;;;;EAY7F"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetChemicalSafety(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ if (args.substance_type) {
8
+ const results = db.all('SELECT * FROM chemical_safety WHERE LOWER(substance_type) LIKE LOWER(?) AND jurisdiction = ?', [`%${args.substance_type}%`, jv.jurisdiction]);
9
+ if (results.length === 0) {
10
+ return {
11
+ error: 'not_found',
12
+ message: `No chemical safety data found for substance type '${args.substance_type}'.`,
13
+ };
14
+ }
15
+ return {
16
+ substance_type: args.substance_type,
17
+ jurisdiction: jv.jurisdiction,
18
+ results_count: results.length,
19
+ results,
20
+ _meta: buildMeta({ source_url: 'https://www.suva.ch/de-ch/praevention/sachthemen/chemische-produkte' }),
21
+ };
22
+ }
23
+ const all = db.all('SELECT substance_type, exposure_limit, ppe_required, storage_rule FROM chemical_safety WHERE jurisdiction = ? ORDER BY substance_type', [jv.jurisdiction]);
24
+ return {
25
+ jurisdiction: jv.jurisdiction,
26
+ results_count: all.length,
27
+ results: all,
28
+ _meta: buildMeta({ source_url: 'https://www.suva.ch/de-ch/praevention/sachthemen/chemische-produkte' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-chemical-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-chemical-safety.js","sourceRoot":"","sources":["../../src/tools/get-chemical-safety.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,IAAwB;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,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAIpB,8FAA8F,EAC9F,CAAC,IAAI,IAAI,CAAC,cAAc,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,CAC9C,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,qDAAqD,IAAI,CAAC,cAAc,IAAI;aACtF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO;YACP,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,qEAAqE,EAAE,CAAC;SACxG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAGhB,uIAAuI,EACvI,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,qEAAqE,EAAE,CAAC;KACxG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { Database } from '../db.js';
2
+ interface MachinerySafetyArgs {
3
+ machine_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetMachinerySafety(db: Database, args: MachinerySafetyArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ machine_type?: undefined;
14
+ jurisdiction?: undefined;
15
+ results_count?: undefined;
16
+ results?: undefined;
17
+ _meta?: undefined;
18
+ } | {
19
+ machine_type: string;
20
+ jurisdiction: "CH";
21
+ results_count: number;
22
+ results: {
23
+ id: number;
24
+ machine_type: string;
25
+ requirement: string;
26
+ certification: string;
27
+ notes: string;
28
+ }[];
29
+ _meta: import("../metadata.js").Meta;
30
+ error?: undefined;
31
+ message?: undefined;
32
+ } | {
33
+ jurisdiction: "CH";
34
+ results_count: number;
35
+ results: {
36
+ machine_type: string;
37
+ requirement: string;
38
+ certification: string;
39
+ }[];
40
+ _meta: import("../metadata.js").Meta;
41
+ error?: undefined;
42
+ message?: undefined;
43
+ machine_type?: undefined;
44
+ };
45
+ export {};
46
+ //# sourceMappingURL=get-machinery-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-machinery-safety.d.ts","sourceRoot":"","sources":["../../src/tools/get-machinery-safety.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB;;;;;;;;;;;;;;;;;YAMtE,MAAM;sBAAgB,MAAM;qBAAe,MAAM;uBACtC,MAAM;eAAS,MAAM;;;;;;;;;sBAuBxB,MAAM;qBAAe,MAAM;uBAAiB,MAAM;;;;;;EAYnE"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetMachinerySafety(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ if (args.machine_type) {
8
+ const results = db.all('SELECT * FROM machinery_safety WHERE LOWER(machine_type) LIKE LOWER(?) AND jurisdiction = ?', [`%${args.machine_type}%`, jv.jurisdiction]);
9
+ if (results.length === 0) {
10
+ return {
11
+ error: 'not_found',
12
+ message: `No machinery safety requirements found for '${args.machine_type}'.`,
13
+ };
14
+ }
15
+ return {
16
+ machine_type: args.machine_type,
17
+ jurisdiction: jv.jurisdiction,
18
+ results_count: results.length,
19
+ results,
20
+ _meta: buildMeta({ source_url: 'https://www.bul.ch/de/themen/maschinen' }),
21
+ };
22
+ }
23
+ const all = db.all('SELECT machine_type, requirement, certification FROM machinery_safety WHERE jurisdiction = ? ORDER BY machine_type', [jv.jurisdiction]);
24
+ return {
25
+ jurisdiction: jv.jurisdiction,
26
+ results_count: all.length,
27
+ results: all,
28
+ _meta: buildMeta({ source_url: 'https://www.bul.ch/de/themen/maschinen' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-machinery-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-machinery-safety.js","sourceRoot":"","sources":["../../src/tools/get-machinery-safety.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,IAAyB;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,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAIpB,6FAA6F,EAC7F,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,CAC5C,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,+CAA+C,IAAI,CAAC,YAAY,IAAI;aAC9E,CAAC;QACJ,CAAC;QAED,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO;YACP,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,wCAAwC,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAGhB,oHAAoH,EACpH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,wCAAwC,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Database } from '../db.js';
2
+ interface RiskAssessmentArgs {
3
+ activity_type?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetRiskAssessmentRequirements(db: Database, args: RiskAssessmentArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ activity_type?: undefined;
14
+ jurisdiction?: undefined;
15
+ results_count?: undefined;
16
+ results?: undefined;
17
+ _meta?: undefined;
18
+ } | {
19
+ activity_type: string;
20
+ jurisdiction: "CH";
21
+ results_count: number;
22
+ results: {
23
+ id: number;
24
+ activity_type: string;
25
+ requirement: string;
26
+ content: string;
27
+ update_trigger: string;
28
+ legal_basis: string;
29
+ }[];
30
+ _meta: import("../metadata.js").Meta;
31
+ error?: undefined;
32
+ message?: undefined;
33
+ } | {
34
+ jurisdiction: "CH";
35
+ results_count: number;
36
+ results: {
37
+ activity_type: string;
38
+ requirement: string;
39
+ legal_basis: string;
40
+ }[];
41
+ _meta: import("../metadata.js").Meta;
42
+ error?: undefined;
43
+ message?: undefined;
44
+ activity_type?: undefined;
45
+ };
46
+ export {};
47
+ //# sourceMappingURL=get-risk-assessment-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-risk-assessment-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/get-risk-assessment-requirements.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,kBAAkB;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mCAAmC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB;;;;;;;;;;;;;;;;;YAMhF,MAAM;uBAAiB,MAAM;qBAAe,MAAM;iBAC7C,MAAM;wBAAkB,MAAM;qBAAe,MAAM;;;;;;;;;uBAuB/C,MAAM;qBAAe,MAAM;qBAAe,MAAM;;;;;;EAYlE"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetRiskAssessmentRequirements(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ if (args.activity_type) {
8
+ const results = db.all('SELECT * FROM risk_assessments WHERE LOWER(activity_type) LIKE LOWER(?) AND jurisdiction = ?', [`%${args.activity_type}%`, jv.jurisdiction]);
9
+ if (results.length === 0) {
10
+ return {
11
+ error: 'not_found',
12
+ message: `No risk assessment requirements found for activity type '${args.activity_type}'.`,
13
+ };
14
+ }
15
+ return {
16
+ activity_type: args.activity_type,
17
+ jurisdiction: jv.jurisdiction,
18
+ results_count: results.length,
19
+ results,
20
+ _meta: buildMeta({ source_url: 'https://www.bul.ch/de/themen/risikobeurteilung' }),
21
+ };
22
+ }
23
+ const all = db.all('SELECT activity_type, requirement, legal_basis FROM risk_assessments WHERE jurisdiction = ? ORDER BY activity_type', [jv.jurisdiction]);
24
+ return {
25
+ jurisdiction: jv.jurisdiction,
26
+ results_count: all.length,
27
+ results: all,
28
+ _meta: buildMeta({ source_url: 'https://www.bul.ch/de/themen/risikobeurteilung' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-risk-assessment-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-risk-assessment-requirements.js","sourceRoot":"","sources":["../../src/tools/get-risk-assessment-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,mCAAmC,CAAC,EAAY,EAAE,IAAwB;IACxF,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,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAIpB,8FAA8F,EAC9F,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,CAC7C,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,4DAA4D,IAAI,CAAC,aAAa,IAAI;aAC5F,CAAC;QACJ,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO;YACP,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,gDAAgD,EAAE,CAAC;SACnF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAGhB,oHAAoH,EACpH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,gDAAgD,EAAE,CAAC;KACnF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Database } from '../db.js';
2
+ interface YoungWorkerArgs {
3
+ age_group?: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleGetYoungWorkerRules(db: Database, args: YoungWorkerArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ error: string;
12
+ message: string;
13
+ age_group?: undefined;
14
+ jurisdiction?: undefined;
15
+ results_count?: undefined;
16
+ results?: undefined;
17
+ _meta?: undefined;
18
+ } | {
19
+ age_group: string;
20
+ jurisdiction: "CH";
21
+ results_count: number;
22
+ results: {
23
+ id: number;
24
+ age_group: string;
25
+ restriction: string;
26
+ exception: string;
27
+ legal_basis: string;
28
+ }[];
29
+ _meta: import("../metadata.js").Meta;
30
+ error?: undefined;
31
+ message?: undefined;
32
+ } | {
33
+ jurisdiction: "CH";
34
+ results_count: number;
35
+ results: {
36
+ age_group: string;
37
+ restriction: string;
38
+ exception: string;
39
+ legal_basis: string;
40
+ }[];
41
+ _meta: import("../metadata.js").Meta;
42
+ error?: undefined;
43
+ message?: undefined;
44
+ age_group?: undefined;
45
+ };
46
+ export {};
47
+ //# sourceMappingURL=get-young-worker-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-young-worker-rules.d.ts","sourceRoot":"","sources":["../../src/tools/get-young-worker-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe;;;;;;;;;;;;;;;;;YAMnE,MAAM;mBAAa,MAAM;qBAAe,MAAM;mBACvC,MAAM;qBAAe,MAAM;;;;;;;;;mBAuB7B,MAAM;qBAAe,MAAM;mBAAa,MAAM;qBAAe,MAAM;;;;;;EAYjF"}
@@ -0,0 +1,31 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleGetYoungWorkerRules(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ if (args.age_group) {
8
+ const results = db.all('SELECT * FROM young_worker_rules WHERE LOWER(age_group) LIKE LOWER(?) AND jurisdiction = ?', [`%${args.age_group}%`, jv.jurisdiction]);
9
+ if (results.length === 0) {
10
+ return {
11
+ error: 'not_found',
12
+ message: `No rules found for age group '${args.age_group}'.`,
13
+ };
14
+ }
15
+ return {
16
+ age_group: args.age_group,
17
+ jurisdiction: jv.jurisdiction,
18
+ results_count: results.length,
19
+ results,
20
+ _meta: buildMeta({ source_url: 'https://www.seco.admin.ch/seco/de/home/Arbeit/Arbeitsbedingungen/jugendarbeitsschutz.html' }),
21
+ };
22
+ }
23
+ const all = db.all('SELECT age_group, restriction, exception, legal_basis FROM young_worker_rules WHERE jurisdiction = ? ORDER BY age_group', [jv.jurisdiction]);
24
+ return {
25
+ jurisdiction: jv.jurisdiction,
26
+ results_count: all.length,
27
+ results: all,
28
+ _meta: buildMeta({ source_url: 'https://www.seco.admin.ch/seco/de/home/Arbeit/Arbeitsbedingungen/jugendarbeitsschutz.html' }),
29
+ };
30
+ }
31
+ //# sourceMappingURL=get-young-worker-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-young-worker-rules.js","sourceRoot":"","sources":["../../src/tools/get-young-worker-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,UAAU,yBAAyB,CAAC,EAAY,EAAE,IAAqB;IAC3E,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,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAIpB,4FAA4F,EAC5F,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,CACzC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,iCAAiC,IAAI,CAAC,SAAS,IAAI;aAC7D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,OAAO;YACP,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,2FAA2F,EAAE,CAAC;SAC9H,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAGhB,yHAAyH,EACzH,CAAC,EAAE,CAAC,YAAY,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,2FAA2F,EAAE,CAAC;KAC9H,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,CAkD1G"}
@@ -0,0 +1,51 @@
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: 'BUL/SPAA — Sicherheitsregeln und Merkblaetter',
7
+ authority: 'Beratungsstelle fuer Unfallverhuetung in der Landwirtschaft (BUL)',
8
+ official_url: 'https://www.bul.ch',
9
+ retrieval_method: 'PDF_EXTRACT + HTML_SCRAPE',
10
+ update_frequency: 'periodic (rules updated as needed)',
11
+ license: 'Swiss public-sector information — free reuse',
12
+ coverage: 'Lebenswichtige Regeln per Arbeitsbereich, Merkblaetter, Safe@Work-Kampagne',
13
+ last_retrieved: lastIngest?.value,
14
+ },
15
+ {
16
+ name: 'Suva — Arbeitssicherheit Landwirtschaft',
17
+ authority: 'Schweizerische Unfallversicherungsanstalt (Suva)',
18
+ official_url: 'https://www.suva.ch/de-ch/praevention/nach-branche/landwirtschaft',
19
+ retrieval_method: 'PDF_EXTRACT + HTML_SCRAPE',
20
+ update_frequency: 'periodic',
21
+ license: 'Swiss public-sector information — free reuse',
22
+ coverage: 'MAK-Werte, Grenzwerte, Unfallmeldung, PSA-Anforderungen',
23
+ last_retrieved: lastIngest?.value,
24
+ },
25
+ {
26
+ name: 'EKAS — Branchenloesung Landwirtschaft',
27
+ authority: 'Eidgenoessische Koordinationskommission fuer Arbeitssicherheit (EKAS)',
28
+ official_url: 'https://www.ekas.admin.ch',
29
+ retrieval_method: 'PDF_EXTRACT',
30
+ update_frequency: 'periodic',
31
+ license: 'Swiss Federal Administration — free reuse',
32
+ coverage: 'ASA-Konzept, systematische Sicherheitsarbeit, Branchenspezifisches',
33
+ last_retrieved: lastIngest?.value,
34
+ },
35
+ {
36
+ name: 'Agriss — Unfallstatistik Schweizer Landwirtschaft',
37
+ authority: 'BUL / Agroscope',
38
+ official_url: 'https://www.bul.ch/de/themen/unfallstatistik',
39
+ retrieval_method: 'PDF_EXTRACT',
40
+ update_frequency: 'annual',
41
+ license: 'Swiss public-sector information — free reuse',
42
+ coverage: 'Toedliche und schwere Unfaelle, Unfallursachen, saisonale Verteilung',
43
+ last_retrieved: lastIngest?.value,
44
+ },
45
+ ];
46
+ return {
47
+ sources,
48
+ _meta: buildMeta(),
49
+ };
50
+ }
51
+ //# 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,+CAA+C;YACrD,SAAS,EAAE,mEAAmE;YAC9E,YAAY,EAAE,oBAAoB;YAClC,gBAAgB,EAAE,2BAA2B;YAC7C,gBAAgB,EAAE,oCAAoC;YACtD,OAAO,EAAE,8CAA8C;YACvD,QAAQ,EAAE,4EAA4E;YACtF,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,yCAAyC;YAC/C,SAAS,EAAE,kDAAkD;YAC7D,YAAY,EAAE,mEAAmE;YACjF,gBAAgB,EAAE,2BAA2B;YAC7C,gBAAgB,EAAE,UAAU;YAC5B,OAAO,EAAE,8CAA8C;YACvD,QAAQ,EAAE,yDAAyD;YACnE,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,uCAAuC;YAC7C,SAAS,EAAE,uEAAuE;YAClF,YAAY,EAAE,2BAA2B;YACzC,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,UAAU;YAC5B,OAAO,EAAE,2CAA2C;YACpD,QAAQ,EAAE,oEAAoE;YAC9E,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;QACD;YACE,IAAI,EAAE,mDAAmD;YACzD,SAAS,EAAE,iBAAiB;YAC5B,YAAY,EAAE,8CAA8C;YAC5D,gBAAgB,EAAE,aAAa;YAC/B,gBAAgB,EAAE,QAAQ;YAC1B,OAAO,EAAE,8CAA8C;YACvD,QAAQ,EAAE,sEAAsE;YAChF,cAAc,EAAE,UAAU,EAAE,KAAK;SAClC;KACF,CAAC;IAEF,OAAO;QACL,OAAO;QACP,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Database } from '../db.js';
2
+ interface BulGuidanceArgs {
3
+ query: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export declare function handleSearchBulGuidance(db: Database, args: BulGuidanceArgs): {
7
+ error: string;
8
+ supported: readonly string[];
9
+ message: string;
10
+ } | {
11
+ query: string;
12
+ jurisdiction: "CH";
13
+ results_count: number;
14
+ results: {
15
+ topic: string;
16
+ title: string;
17
+ description: string;
18
+ url: string;
19
+ }[];
20
+ _meta: import("../metadata.js").Meta;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=search-bul-guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-bul-guidance.d.ts","sourceRoot":"","sources":["../../src/tools/search-bul-guidance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe;;;;;;;;;;;;;;;EAyC1E"}
@@ -0,0 +1,35 @@
1
+ import { buildMeta } from '../metadata.js';
2
+ import { validateJurisdiction } from '../jurisdiction.js';
3
+ export function handleSearchBulGuidance(db, args) {
4
+ const jv = validateJurisdiction(args.jurisdiction);
5
+ if (!jv.valid)
6
+ return jv.error;
7
+ // Search bul_guidance table using LIKE since it is not indexed in FTS
8
+ const words = args.query.split(/\s+/).filter(w => w.length > 1);
9
+ if (words.length === 0) {
10
+ return {
11
+ query: args.query,
12
+ jurisdiction: jv.jurisdiction,
13
+ results_count: 0,
14
+ results: [],
15
+ _meta: buildMeta({ source_url: 'https://www.bul.ch' }),
16
+ };
17
+ }
18
+ const conditions = words.map(() => '(LOWER(topic) LIKE LOWER(?) OR LOWER(title) LIKE LOWER(?) OR LOWER(description) LIKE LOWER(?))').join(' AND ');
19
+ const params = words.flatMap(w => [`%${w}%`, `%${w}%`, `%${w}%`]);
20
+ params.push(jv.jurisdiction);
21
+ const results = db.all(`SELECT * FROM bul_guidance WHERE ${conditions} AND jurisdiction = ? ORDER BY topic LIMIT 20`, params);
22
+ return {
23
+ query: args.query,
24
+ jurisdiction: jv.jurisdiction,
25
+ results_count: results.length,
26
+ results: results.map(r => ({
27
+ topic: r.topic,
28
+ title: r.title,
29
+ description: r.description,
30
+ url: r.url,
31
+ })),
32
+ _meta: buildMeta({ source_url: 'https://www.bul.ch' }),
33
+ };
34
+ }
35
+ //# sourceMappingURL=search-bul-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-bul-guidance.js","sourceRoot":"","sources":["../../src/tools/search-bul-guidance.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,IAAqB;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,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,aAAa,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAChC,gGAAgG,CACjG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChB,MAAM,MAAM,GAAc,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAGpB,oCAAoC,UAAU,+CAA+C,EAC7F,MAAM,CACP,CAAC;IAEF,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,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,GAAG,EAAE,CAAC,CAAC,GAAG;SACX,CAAC,CAAC;QACH,KAAK,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC;KACvD,CAAC;AACJ,CAAC"}