@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.
- package/.github/workflows/check-freshness.yml +53 -0
- package/.github/workflows/ci.yml +21 -0
- package/.github/workflows/codeql.yml +30 -0
- package/.github/workflows/ghcr-build.yml +45 -0
- package/.github/workflows/gitleaks.yml +24 -0
- package/.github/workflows/ingest.yml +67 -0
- package/.github/workflows/publish.yml +24 -0
- package/CHANGELOG.md +23 -0
- package/CODEOWNERS +1 -0
- package/COVERAGE.md +54 -0
- package/DISCLAIMER.md +51 -0
- package/Dockerfile +26 -0
- package/LICENSE +17 -0
- package/PRIVACY.md +25 -0
- package/README.md +129 -0
- package/SECURITY.md +25 -0
- package/TOOLS.md +140 -0
- package/data/coverage.json +22 -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 +200 -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 +250 -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 +20 -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 +196 -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-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-accident-reporting.d.ts +49 -0
- package/dist/tools/get-accident-reporting.d.ts.map +1 -0
- package/dist/tools/get-accident-reporting.js +31 -0
- package/dist/tools/get-accident-reporting.js.map +1 -0
- package/dist/tools/get-chemical-safety.d.ts +47 -0
- package/dist/tools/get-chemical-safety.d.ts.map +1 -0
- package/dist/tools/get-chemical-safety.js +31 -0
- package/dist/tools/get-chemical-safety.js.map +1 -0
- package/dist/tools/get-machinery-safety.d.ts +46 -0
- package/dist/tools/get-machinery-safety.d.ts.map +1 -0
- package/dist/tools/get-machinery-safety.js +31 -0
- package/dist/tools/get-machinery-safety.js.map +1 -0
- package/dist/tools/get-risk-assessment-requirements.d.ts +47 -0
- package/dist/tools/get-risk-assessment-requirements.d.ts.map +1 -0
- package/dist/tools/get-risk-assessment-requirements.js +31 -0
- package/dist/tools/get-risk-assessment-requirements.js.map +1 -0
- package/dist/tools/get-young-worker-rules.d.ts +47 -0
- package/dist/tools/get-young-worker-rules.d.ts.map +1 -0
- package/dist/tools/get-young-worker-rules.js +31 -0
- package/dist/tools/get-young-worker-rules.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 +51 -0
- package/dist/tools/list-sources.js.map +1 -0
- package/dist/tools/search-bul-guidance.d.ts +23 -0
- package/dist/tools/search-bul-guidance.d.ts.map +1 -0
- package/dist/tools/search-bul-guidance.js +35 -0
- package/dist/tools/search-bul-guidance.js.map +1 -0
- package/dist/tools/search-safety-rules.d.ts +25 -0
- package/dist/tools/search-safety-rules.d.ts.map +1 -0
- package/dist/tools/search-safety-rules.js +26 -0
- package/dist/tools/search-safety-rules.js.map +1 -0
- package/docker-compose.yml +12 -0
- package/eslint.config.js +27 -0
- package/package.json +54 -0
- package/scripts/ingest.ts +879 -0
- package/server.json +31 -0
- package/src/db.ts +241 -0
- package/src/http-server.ts +282 -0
- package/src/jurisdiction.ts +30 -0
- package/src/metadata.ts +30 -0
- package/src/server.ts +219 -0
- package/src/tools/about.ts +28 -0
- package/src/tools/check-freshness.ts +42 -0
- package/src/tools/get-accident-reporting.ts +52 -0
- package/src/tools/get-chemical-safety.ts +52 -0
- package/src/tools/get-machinery-safety.ts +52 -0
- package/src/tools/get-risk-assessment-requirements.ts +52 -0
- package/src/tools/get-young-worker-rules.ts +52 -0
- package/src/tools/list-sources.ts +65 -0
- package/src/tools/search-bul-guidance.ts +51 -0
- package/src/tools/search-safety-rules.ts +35 -0
- package/tests/db.test.ts +121 -0
- package/tests/helpers/seed-db.ts +134 -0
- package/tests/jurisdiction.test.ts +54 -0
- package/tests/tools/about.test.ts +44 -0
- package/tests/tools/check-freshness.test.ts +68 -0
- package/tests/tools/list-sources.test.ts +75 -0
- package/tests/tools/search-safety-rules.test.ts +75 -0
- package/tsconfig.json +19 -0
- 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"}
|