@flowselections/logistiek-engine 1.0.140 → 1.0.151

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 (70) hide show
  1. package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
  2. package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
  3. package/dist-lib/components/AutomatischVersturenCard.js +22 -0
  4. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  5. package/dist-lib/components/BeheerPage.js +3 -1
  6. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts +2 -0
  7. package/dist-lib/components/GearchiveerdeOrdersCard.d.ts.map +1 -0
  8. package/dist-lib/components/GearchiveerdeOrdersCard.js +32 -0
  9. package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
  10. package/dist-lib/components/GeblokkeerdeOrdersCard.js +1 -1
  11. package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
  12. package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
  13. package/dist-lib/components/OudeOrderregelsCard.js +28 -0
  14. package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -1
  15. package/dist-lib/components/PlanWachtrijPage.js +20 -13
  16. package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
  17. package/dist-lib/components/RuleEnginePage.js +24 -3
  18. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +20 -0
  19. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
  20. package/dist-lib/hooks/useGeblokkeerdeOrders.js +57 -0
  21. package/dist-lib/index.d.ts +1 -0
  22. package/dist-lib/index.d.ts.map +1 -1
  23. package/dist-lib/index.js +1 -0
  24. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  26. package/dist-lib/integrations/supabase/types.d.ts +914 -2
  27. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/types.js +1 -0
  29. package/dist-lib/lib/autoSend.d.ts +21 -0
  30. package/dist-lib/lib/autoSend.d.ts.map +1 -0
  31. package/dist-lib/lib/autoSend.functions.d.ts +10 -0
  32. package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
  33. package/dist-lib/lib/autoSend.functions.js +18 -0
  34. package/dist-lib/lib/autoSend.js +69 -0
  35. package/dist-lib/lib/autoSend.server.d.ts +13 -0
  36. package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
  37. package/dist-lib/lib/autoSend.server.js +75 -0
  38. package/dist-lib/lib/briefTransport.server.d.ts +17 -0
  39. package/dist-lib/lib/briefTransport.server.d.ts.map +1 -0
  40. package/dist-lib/lib/briefTransport.server.js +41 -0
  41. package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
  42. package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
  43. package/dist-lib/lib/centralSecrets.server.js +82 -0
  44. package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
  45. package/dist-lib/lib/controlScan.server.js +8 -0
  46. package/dist-lib/lib/handlers/logistics-tick.server.js +31 -0
  47. package/dist-lib/lib/layoutPrint.server.d.ts +2 -0
  48. package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -1
  49. package/dist-lib/lib/layoutPrint.server.js +1 -1
  50. package/dist-lib/lib/logisticsTasks.d.ts +1 -0
  51. package/dist-lib/lib/logisticsTasks.d.ts.map +1 -1
  52. package/dist-lib/lib/logisticsTasks.js +2 -1
  53. package/dist-lib/lib/modulePrompts.d.ts +1 -0
  54. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  55. package/dist-lib/lib/modulePrompts.js +420 -1
  56. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  57. package/dist-lib/lib/moduleVersion.js +1 -1
  58. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  59. package/dist-lib/lib/planQueue.server.js +13 -0
  60. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  61. package/dist-lib/lib/ruleEngineSchema.js +25 -0
  62. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  63. package/dist-lib/lib/shippingNoteQueue.server.js +3 -0
  64. package/dist-lib/lib/stickerQueue.server.d.ts +15 -0
  65. package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -0
  66. package/dist-lib/lib/stickerQueue.server.js +349 -0
  67. package/dist-lib/lib/stickerRules.d.ts +38 -0
  68. package/dist-lib/lib/stickerRules.d.ts.map +1 -0
  69. package/dist-lib/lib/stickerRules.js +111 -0
  70. package/package.json +5 -5
@@ -39,6 +39,7 @@ export const Constants = {
39
39
  "veilingbon",
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
+ "traysticker",
42
43
  ],
43
44
  doc_orientation: ["portrait", "landscape"],
44
45
  exact_env: ["staging", "live"],
@@ -0,0 +1,21 @@
1
+ export declare const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
2
+ export declare const AUTO_SEND_WACHTTIJDEN_MIN: readonly [1, 5, 15, 60];
3
+ export declare const AUTO_SEND_MAX_POGINGEN = 5;
4
+ export declare const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
5
+ export declare function normaliseerShellAdres(v: unknown): string | null;
6
+ export declare function autoSendBody(orderId: string): string;
7
+ export declare function ondertekenAutoSend(secret: string, timestamp: number, rawBody: string): Promise<string>;
8
+ /** Wachttijd in minuten na poging n (1-based): 1, 5, 15, 60, daarna 60. */
9
+ export declare function wachttijdNaPoging(n: number): number;
10
+ export type AutoSendUitkomst = {
11
+ soort: "verstuurd" | "definitief" | "opnieuw";
12
+ reden: string | null;
13
+ };
14
+ /**
15
+ * Antwoord van Afhandeling beoordelen:
16
+ * 2xx (sent / already_sent) = verstuurd; 400 en 422 = definitief mislukt;
17
+ * al het andere (401, 409, 502, ...) = opnieuw volgens schema.
18
+ * Reden: veld "error" (met de code ervoor), anders de code, anders de status.
19
+ */
20
+ export declare function beoordeelAntwoord(status: number, tekst: string | null | undefined): AutoSendUitkomst;
21
+ //# sourceMappingURL=autoSend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,4CAA4C,CAAC;AACxE,eAAO,MAAM,yBAAyB,yBAA0B,CAAC;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,qBAAqB,+DAA+D,CAAC;AAElG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AASD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5G;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAoBpG"}
@@ -0,0 +1,10 @@
1
+ export declare const getAutoSendConfig: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, undefined, undefined, undefined>, import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
2
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
3
+ userId: string;
4
+ claims: import("@supabase/auth-js").User;
5
+ }, undefined, undefined, undefined>], undefined, Promise<{
6
+ sleutelOpTeHalen: boolean;
7
+ sleutelReden: string | null;
8
+ adresAanwezig: boolean;
9
+ }>>;
10
+ //# sourceMappingURL=autoSend.functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.functions.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.functions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;sBAEmB,OAAO;kBAAgB,MAAM,GAAG,IAAI;mBAAiB,OAAO;GAWzG,CAAC"}
@@ -0,0 +1,18 @@
1
+ // src/lib/autoSend.functions.ts — Beheer: is de sleutel op te halen en is er een Shell-adres? (alleen ja/nee)
2
+ import { createServerFn } from "@tanstack/react-start";
3
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
4
+ import { readableServerErrors } from "./readableServerErrors.js";
5
+ export const getAutoSendConfig = createServerFn({ method: "GET" })
6
+ .middleware([readableServerErrors, requireSupabaseAuth])
7
+ .handler(async () => {
8
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
9
+ const { leesShellAdres } = await import("./autoSend.server.js");
10
+ const { haalAutoSendSleutel } = await import("./centralSecrets.server.js");
11
+ const s = await haalAutoSendSleutel();
12
+ const adres = await leesShellAdres(supabaseAdmin);
13
+ return {
14
+ sleutelOpTeHalen: s.sleutel !== null,
15
+ sleutelReden: s.sleutel === null ? s.reden : null,
16
+ adresAanwezig: adres !== null,
17
+ };
18
+ });
@@ -0,0 +1,69 @@
1
+ // ============================================================================
2
+ // src/lib/autoSend.ts — automatisch versturen van de belading (Engine 1.0.149)
3
+ // ============================================================================
4
+ // Pure hulpfuncties (geen netwerk, geen database), zodat ze los te testen zijn.
5
+ // - Sleutel: zie centralSecrets.server.ts (AUTH_GATEWAY_HMAC_SECRET, anders
6
+ // floriday_gateway_secret via de centrale dienst).
7
+ // - Ondertekening: HMAC-SHA256 hex over `${timestamp}.${rawBody}`, timestamp
8
+ // in epoch-milliseconden.
9
+ // ============================================================================
10
+ export const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
11
+ export const AUTO_SEND_WACHTTIJDEN_MIN = [1, 5, 15, 60];
12
+ export const AUTO_SEND_MAX_POGINGEN = 5;
13
+ export const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
14
+ export function normaliseerShellAdres(v) {
15
+ if (typeof v !== "string")
16
+ return null;
17
+ const s = v.trim().replace(/\/+$/, "");
18
+ return /^https:\/\/[^\s/]+/i.test(s) ? s : null;
19
+ }
20
+ export function autoSendBody(orderId) {
21
+ return JSON.stringify({ orderId });
22
+ }
23
+ async function hmacHex(secret, message) {
24
+ const enc = new TextEncoder();
25
+ const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
26
+ const sig = await crypto.subtle.sign("HMAC", key, enc.encode(message));
27
+ return Array.from(new Uint8Array(sig)).map((b) => b.toString(16).padStart(2, "0")).join("");
28
+ }
29
+ export async function ondertekenAutoSend(secret, timestamp, rawBody) {
30
+ return hmacHex(secret, `${timestamp}.${rawBody}`);
31
+ }
32
+ /** Wachttijd in minuten na poging n (1-based): 1, 5, 15, 60, daarna 60. */
33
+ export function wachttijdNaPoging(n) {
34
+ const i = Math.min(Math.max(n, 1), AUTO_SEND_WACHTTIJDEN_MIN.length) - 1;
35
+ return AUTO_SEND_WACHTTIJDEN_MIN[i];
36
+ }
37
+ /**
38
+ * Antwoord van Afhandeling beoordelen:
39
+ * 2xx (sent / already_sent) = verstuurd; 400 en 422 = definitief mislukt;
40
+ * al het andere (401, 409, 502, ...) = opnieuw volgens schema.
41
+ * Reden: veld "error" (met de code ervoor), anders de code, anders de status.
42
+ */
43
+ export function beoordeelAntwoord(status, tekst) {
44
+ let code = null;
45
+ let fout = null;
46
+ try {
47
+ const j = JSON.parse(tekst ?? "");
48
+ if (j && typeof j === "object") {
49
+ const c = j["code"] ?? j["status"] ?? j["result"];
50
+ if (typeof c === "string")
51
+ code = c;
52
+ const e = j["error"];
53
+ if (typeof e === "string")
54
+ fout = e;
55
+ else if (Array.isArray(e))
56
+ fout = e.filter((x) => typeof x === "string").join("; ") || null;
57
+ }
58
+ }
59
+ catch {
60
+ /* geen JSON */
61
+ }
62
+ if (status >= 200 && status < 300)
63
+ return { soort: "verstuurd", reden: null };
64
+ const delen = [code, fout].filter((x) => !!x && x.trim() !== "");
65
+ const reden = (delen.length ? delen.join(": ") : `Afhandeling antwoordde ${status}`).slice(0, 300);
66
+ if (status === 400 || status === 422)
67
+ return { soort: "definitief", reden };
68
+ return { soort: "opnieuw", reden };
69
+ }
@@ -0,0 +1,13 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ /** shell_base_url; alleen als die ontbreekt: PUBLIC_BASE_URL of de centrale dienst. */
3
+ export declare function leesShellAdres(sb: SupabaseClient): Promise<string | null>;
4
+ export declare function runAutoSendQueue(sb: SupabaseClient, opts?: {
5
+ limit?: number;
6
+ }): Promise<{
7
+ claimed: number;
8
+ sent: number;
9
+ failed: number;
10
+ definitief: number;
11
+ configMissing: number;
12
+ }>;
13
+ //# sourceMappingURL=autoSend.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.server.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;GA0DvF"}
@@ -0,0 +1,75 @@
1
+ import { AUTO_SEND_ADRES_REDEN, AUTO_SEND_PATH, autoSendBody, beoordeelAntwoord, normaliseerShellAdres, ondertekenAutoSend, } from "./autoSend.js";
2
+ import { haalAutoSendSleutel, terugvalShellAdres } from "./centralSecrets.server.js";
3
+ /** shell_base_url; alleen als die ontbreekt: PUBLIC_BASE_URL of de centrale dienst. */
4
+ export async function leesShellAdres(sb) {
5
+ try {
6
+ const { data, error } = await sb.from("module_runtime_config").select("value").eq("key", "shell_base_url").maybeSingle();
7
+ const eigen = error ? null : normaliseerShellAdres(data?.value);
8
+ if (eigen)
9
+ return eigen;
10
+ }
11
+ catch {
12
+ /* val terug */
13
+ }
14
+ return normaliseerShellAdres(await terugvalShellAdres());
15
+ }
16
+ export async function runAutoSendQueue(sb, opts = {}) {
17
+ const run = { claimed: 0, sent: 0, failed: 0, definitief: 0, configMissing: 0 };
18
+ const { data, error } = await sb.rpc("logistics_auto_send_claim", { p_limit: opts.limit ?? 10 });
19
+ if (error)
20
+ throw new Error(error.message);
21
+ const rows = Array.isArray(data) ? data : [];
22
+ run.claimed = rows.length;
23
+ if (rows.length === 0)
24
+ return run;
25
+ const sleutel = await haalAutoSendSleutel();
26
+ const adres = await leesShellAdres(sb);
27
+ const configReden = sleutel.sleutel === null
28
+ ? `Automatisch versturen niet mogelijk: ${sleutel.reden}`
29
+ : !adres ? AUTO_SEND_ADRES_REDEN : null;
30
+ for (const row of rows) {
31
+ const finish = (ok, reason, http, cfg = false, definitief = false) => sb.rpc("logistics_auto_send_finish", {
32
+ p_id: row.id, p_ok: ok, p_reason: reason, p_http: http, p_config_missing: cfg, p_definitief: definitief,
33
+ });
34
+ if (configReden || !sleutel.sleutel || !adres) {
35
+ run.configMissing++;
36
+ await finish(false, configReden ?? AUTO_SEND_ADRES_REDEN, null, true);
37
+ continue;
38
+ }
39
+ try {
40
+ const body = autoSendBody(row.order_id);
41
+ const ts = Date.now();
42
+ const sig = await ondertekenAutoSend(sleutel.sleutel, ts, body);
43
+ const res = await fetch(`${adres}${AUTO_SEND_PATH}`, {
44
+ method: "POST",
45
+ headers: {
46
+ "content-type": "application/json",
47
+ "x-timestamp": String(ts),
48
+ "x-signature": sig,
49
+ "idempotency-key": `auto-send:${row.order_id}`,
50
+ },
51
+ body,
52
+ signal: AbortSignal.timeout(15000),
53
+ });
54
+ const uitkomst = beoordeelAntwoord(res.status, await res.text().catch(() => ""));
55
+ if (uitkomst.soort === "verstuurd") {
56
+ run.sent++;
57
+ await finish(true, null, res.status);
58
+ }
59
+ else if (uitkomst.soort === "definitief") {
60
+ run.definitief++;
61
+ await finish(false, uitkomst.reden, res.status, false, true);
62
+ }
63
+ else {
64
+ run.failed++;
65
+ await finish(false, uitkomst.reden, res.status);
66
+ }
67
+ }
68
+ catch (e) {
69
+ run.failed++;
70
+ const naam = e?.name === "TimeoutError" ? "time-out" : "geen verbinding";
71
+ await finish(false, `Afhandeling niet bereikbaar (${naam})`, null);
72
+ }
73
+ }
74
+ return run;
75
+ }
@@ -0,0 +1,17 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export interface BriefTransport {
3
+ velden: Record<string, unknown>;
4
+ onbekend: string[];
5
+ }
6
+ /** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
7
+ export declare function bouwBriefTransport(data: unknown): BriefTransport;
8
+ export declare function onbekendTekst(onbekend: string[]): string | null;
9
+ /** Haalt het blok op; een fout blokkeert het printen niet. */
10
+ export declare function briefTransport(sb: SupabaseClient, orderId: string | null, cartId: string | null, log: {
11
+ traceId?: string | null;
12
+ orderRef?: string | null;
13
+ cartRef?: string | null;
14
+ phase: string;
15
+ actor: string;
16
+ }): Promise<Record<string, unknown>>;
17
+ //# sourceMappingURL=briefTransport.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefTransport.server.d.ts","sourceRoot":"","sources":["../../src/lib/briefTransport.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAiBhE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAO/D;AAED,8DAA8D;AAC9D,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChH,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlC"}
@@ -0,0 +1,41 @@
1
+ import { trace } from "./trace.server.js";
2
+ /** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
3
+ export function bouwBriefTransport(data) {
4
+ const r = (data && typeof data === "object" ? data : {});
5
+ const velden = {};
6
+ const v = r["vervoerder"];
7
+ const naam = typeof v?.["naam"] === "string" ? v["naam"].trim() : "";
8
+ if (naam) {
9
+ const code = typeof v?.["code"] === "string" ? v["code"].trim() : "";
10
+ velden["vervoerder"] = code ? { naam, code } : { naam };
11
+ }
12
+ const om = r["ophaalmoment"];
13
+ if (typeof om === "string" && !Number.isNaN(Date.parse(om)))
14
+ velden["ophaalmoment"] = om;
15
+ const adres = r["ophaaladres"];
16
+ if (typeof adres === "string" && adres.trim())
17
+ velden["ophaaladres"] = adres.trim();
18
+ const onbekend = Array.isArray(r["onbekend"]) ? r["onbekend"].map(String) : [];
19
+ if (!naam && !onbekend.includes("vervoerder"))
20
+ onbekend.push("vervoerder");
21
+ if (!velden["ophaalmoment"] && !onbekend.some((x) => x.startsWith("ophaalmoment")))
22
+ onbekend.push("ophaalmoment");
23
+ return { velden, onbekend };
24
+ }
25
+ export function onbekendTekst(onbekend) {
26
+ const delen = onbekend
27
+ .filter((x) => x !== "ophaaladres")
28
+ .map((x) => x === "ophaalmoment_niet_eenduidig" ? "ophaalmoment niet eenduidig" : x === "order" ? "order niet gevonden" : `${x} onbekend`);
29
+ return delen.length ? `Op deze brief ontbreekt: ${delen.join(", ")}.` : null;
30
+ }
31
+ /** Haalt het blok op; een fout blokkeert het printen niet. */
32
+ export async function briefTransport(sb, orderId, cartId, log) {
33
+ if (!orderId)
34
+ return {};
35
+ const { data, error } = await sb.rpc("logistics_brief_transport", { p_order_id: orderId, p_cart_id: cartId });
36
+ const res = error ? { velden: {}, onbekend: ["vervoerder", "ophaalmoment"] } : bouwBriefTransport(data);
37
+ const tekst = error ? `Vervoerder/ophaalmoment niet te lezen: ${error.message}` : onbekendTekst(res.onbekend);
38
+ if (tekst)
39
+ await trace(sb, { ...log, step: "Vervoerder/ophaalmoment voor de brief", status: "waarschuwing", reason: tekst });
40
+ return res.velden;
41
+ }
@@ -0,0 +1,13 @@
1
+ export type SleutelUitkomst = {
2
+ sleutel: string;
3
+ bron: "lokaal" | "centraal";
4
+ } | {
5
+ sleutel: null;
6
+ reden: string;
7
+ };
8
+ export declare function _resetSleutelCache(): void;
9
+ export declare function centraalAdres(env: Record<string, string | undefined>): string | null;
10
+ export declare function haalAutoSendSleutel(env?: Record<string, string | undefined>, doFetch?: typeof fetch, nu?: () => number): Promise<SleutelUitkomst>;
11
+ /** Terugval voor het Shell-adres als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders de centrale dienst. */
12
+ export declare function terugvalShellAdres(env?: Record<string, string | undefined>, doFetch?: typeof fetch): Promise<string | null>;
13
+ //# sourceMappingURL=centralSecrets.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"centralSecrets.server.d.ts","sourceRoot":"","sources":["../../src/lib/centralSecrets.server.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAKlH,wBAAgB,kBAAkB,SAEjC;AAMD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,EAC3F,OAAO,GAAE,OAAO,KAAa,EAC7B,EAAE,GAAE,MAAM,MAAiB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAiC1B;AAED,8GAA8G;AAC9G,wBAAsB,kBAAkB,CACtC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,EAC3F,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
@@ -0,0 +1,82 @@
1
+ // ============================================================================
2
+ // src/lib/centralSecrets.server.ts — HMAC-sleutel voor automatisch versturen
3
+ // ============================================================================
4
+ // Zelfde werkwijze als Afhandeling (getFloridayGatewaySecret):
5
+ // 1. AUTH_GATEWAY_HMAC_SECRET uit de omgeving, als die gezet is.
6
+ // 2. Anders POST {CENTRAL_AUTH_URL}/api/secret/floriday_gateway_secret met
7
+ // Authorization: Bearer {CENTRAL_AUTH_SECRET}; sleutel = veld "value".
8
+ // CENTRAL_AUTH_SECRET is alleen toegang, nooit de sleutel zelf.
9
+ // Maximaal 60 s in het geheugen. Nooit opslaan, nooit loggen, nooit naar de
10
+ // browser. Mislukt het: null met een reden zonder geheime waarde (fail closed).
11
+ // ============================================================================
12
+ const CACHE_MS = 60000;
13
+ let cache = null;
14
+ export function _resetSleutelCache() {
15
+ cache = null;
16
+ }
17
+ function leeg(v) {
18
+ return typeof v !== "string" || v.trim() === "";
19
+ }
20
+ export function centraalAdres(env) {
21
+ const v = env["CENTRAL_AUTH_URL"];
22
+ return leeg(v) ? null : v.trim().replace(/\/+$/, "");
23
+ }
24
+ export async function haalAutoSendSleutel(env = process.env, doFetch = fetch, nu = Date.now) {
25
+ const lokaal = env["AUTH_GATEWAY_HMAC_SECRET"];
26
+ if (!leeg(lokaal))
27
+ return { sleutel: lokaal, bron: "lokaal" };
28
+ if (cache && cache.tot > nu())
29
+ return { sleutel: cache.sleutel, bron: "centraal" };
30
+ const adres = centraalAdres(env);
31
+ if (!adres)
32
+ return { sleutel: null, reden: "sleutel niet op te halen: CENTRAL_AUTH_URL ontbreekt" };
33
+ const toegang = env["CENTRAL_AUTH_SECRET"];
34
+ if (leeg(toegang))
35
+ return { sleutel: null, reden: "sleutel niet op te halen: CENTRAL_AUTH_SECRET ontbreekt" };
36
+ try {
37
+ const res = await doFetch(`${adres}/api/secret/floriday_gateway_secret`, {
38
+ method: "POST",
39
+ headers: { authorization: `Bearer ${toegang}` },
40
+ signal: AbortSignal.timeout(10000),
41
+ });
42
+ if (!res.ok)
43
+ return { sleutel: null, reden: `sleutel niet op te halen: centrale dienst antwoordde ${res.status}` };
44
+ let value = null;
45
+ try {
46
+ value = (await res.json())?.value;
47
+ }
48
+ catch {
49
+ return { sleutel: null, reden: "sleutel niet op te halen: antwoord van de centrale dienst is geen JSON" };
50
+ }
51
+ if (typeof value !== "string" || value.trim() === "") {
52
+ return { sleutel: null, reden: "sleutel niet op te halen: veld value ontbreekt" };
53
+ }
54
+ cache = { sleutel: value, tot: nu() + CACHE_MS };
55
+ return { sleutel: value, bron: "centraal" };
56
+ }
57
+ catch (e) {
58
+ const naam = e?.name === "TimeoutError" ? "time-out" : "geen verbinding";
59
+ return { sleutel: null, reden: `sleutel niet op te halen: centrale dienst niet bereikbaar (${naam})` };
60
+ }
61
+ }
62
+ /** Terugval voor het Shell-adres als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders de centrale dienst. */
63
+ export async function terugvalShellAdres(env = process.env, doFetch = fetch) {
64
+ if (!leeg(env["PUBLIC_BASE_URL"]))
65
+ return env["PUBLIC_BASE_URL"].trim();
66
+ const adres = centraalAdres(env);
67
+ if (!adres)
68
+ return null;
69
+ try {
70
+ const res = await doFetch(`${adres}/api/shell-host`, { method: "GET", signal: AbortSignal.timeout(10000) });
71
+ if (!res.ok)
72
+ return null;
73
+ const host = (await res.json())?.shell_host;
74
+ if (typeof host !== "string" || host.trim() === "")
75
+ return null;
76
+ const h = host.trim();
77
+ return /^https?:\/\//i.test(h) ? h : `https://${h}`;
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiBD,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAgBzC,mDAAmD;AACnD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1F,GAAG,GAAE,MAAmB,GACvB,UAAU,GAAG,MAAM,GAAG,IAAI,CAK5B;AA6BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CAgQzB"}
1
+ {"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiBD,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAgBzC,mDAAmD;AACnD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1F,GAAG,GAAE,MAAmB,GACvB,UAAU,GAAG,MAAM,GAAG,IAAI,CAK5B;AA6BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CAuQzB"}
@@ -15,6 +15,7 @@
15
15
  // klantwaarden in deze code; de printer komt uit de werkwijze in de database.
16
16
  // ============================================================================
17
17
  import { printViaLayoutGecontroleerd, floridayLayout, floridayPdfOpslag } from "./layoutPrint.server.js";
18
+ import { briefTransport } from "./briefTransport.server.js";
18
19
  import { isFloridayCancelled, FLORIDAY_CANCELLED_REASON } from "./floridayCancellation.server.js";
19
20
  import { trace } from "./trace.server.js";
20
21
  /** Maximaal aantal wachtrondes op Floriday voordat de controle als mislukt stopt. */
@@ -245,6 +246,12 @@ export async function runControlScanQueue(sb, options = {}) {
245
246
  pdfUrl: url,
246
247
  });
247
248
  // Via de Layout maker; idempotent per controle.
249
+ const transport = await briefTransport(sb, row.order_id ?? null, row.cart_id ?? null, {
250
+ orderRef: row.order_number ?? row.order_id ?? null,
251
+ cartRef: row.cart_id ?? null,
252
+ phase: "controle",
253
+ actor: "logistiek-engine:controlescan",
254
+ });
248
255
  const printed = await printViaLayoutGecontroleerd(sb, {
249
256
  documenttype: "afleverbrief",
250
257
  layoutId: layout.layoutId,
@@ -266,6 +273,7 @@ export async function runControlScanQueue(sb, options = {}) {
266
273
  fulfillment_order_id: fulfillmentOrderId,
267
274
  control_scan_id: row.id,
268
275
  ...(pdfOpslag ? { pdf_opslag: pdfOpslag } : {}),
276
+ ...transport,
269
277
  },
270
278
  });
271
279
  if (!printed.ok) {
@@ -265,6 +265,24 @@ async function runTickRound(supabase, tickJob, ident) {
265
265
  shippingNotes = { error: String(e?.message ?? e) };
266
266
  shippingNotesOk = false;
267
267
  }
268
+ // Stickerronde: klant- en tray-stickers (Engine is eigenaar).
269
+ let stickers = null;
270
+ try {
271
+ const { runStickerQueue } = await import("../stickerQueue.server.js");
272
+ stickers = await runStickerQueue(supabase, { limit: 10 });
273
+ }
274
+ catch (e) {
275
+ stickers = { error: String(e?.message ?? e) };
276
+ }
277
+ // Automatisch versturen (1.0.149): alleen Floriday-orders, alleen als de werkwijze het aanzet.
278
+ let autoSend = null;
279
+ try {
280
+ const { runAutoSendQueue } = await import("../autoSend.server.js");
281
+ autoSend = await runAutoSendQueue(supabase, { limit: 10 });
282
+ }
283
+ catch (e) {
284
+ autoSend = { error: String(e?.message ?? e) };
285
+ }
268
286
  // Seintjes van de pickschermen: karplan ontbreekt. Direct oppakken.
269
287
  let cartPlanRequests = null;
270
288
  try {
@@ -285,6 +303,16 @@ async function runTickRound(supabase, tickJob, ident) {
285
303
  catch (e) {
286
304
  queueCleanup = { error: String(e?.message ?? e) };
287
305
  }
306
+ // Blokkades van verzonden orders sluiten, niet-geleverde verlopen orders
307
+ // archiveren en meldingen sluiten waarvan de oorzaak weg is.
308
+ let housekeeping = null;
309
+ try {
310
+ const { data, error } = await supabase.rpc("logistics_plan_housekeeping");
311
+ housekeeping = error ? { error: error.message } : data;
312
+ }
313
+ catch (e) {
314
+ housekeeping = { error: String(e?.message ?? e) };
315
+ }
288
316
  // Pakbonnen zonder kar, of van een kar die na een herindeling niet meer
289
317
  // bestaat, kunnen nooit een barcode krijgen. Die worden hier afgesloten met
290
318
  // een leesbare reden in plaats van eeuwig te blijven wachten.
@@ -339,7 +367,10 @@ async function runTickRound(supabase, tickJob, ident) {
339
367
  shippingNotes,
340
368
  barcodes,
341
369
  cartPlanRequests,
370
+ stickers,
371
+ autoSend,
342
372
  queueCleanup,
373
+ housekeeping,
343
374
  orphanPrintJobs,
344
375
  }, { status: shippingNotesOk ? 200 : 500, headers: CORS_HEADERS });
345
376
  }
@@ -8,6 +8,8 @@ export interface LayoutPrintInput {
8
8
  printPlekId?: string | null;
9
9
  herkomst?: string | null;
10
10
  isHerprint?: boolean;
11
+ /** Aantal kopieën (standaard 1). */
12
+ kopieen?: number;
11
13
  /** Alleen snake_case-velden: print_plek_id, order_id, ordernummer, queue_item_id, cart_id, fulfillment_order_id. */
12
14
  payload: Record<string, unknown>;
13
15
  idempotentieSleutel: string;
@@ -1 +1 @@
1
- {"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"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"}
@@ -96,7 +96,7 @@ export async function printViaLayout(sb, input) {
96
96
  _layout_id: input.layoutId ?? null,
97
97
  _print_plek_id: input.printPlekId ?? null,
98
98
  _werkplek: null,
99
- _kopieen: 1,
99
+ _kopieen: Math.max(1, Math.floor(input.kopieen ?? 1)),
100
100
  _herkomst: input.herkomst ?? null,
101
101
  _is_herprint: input.isHerprint ?? false,
102
102
  _payload: input.payload,
@@ -7,6 +7,7 @@ export declare const LOGISTICS_MODULES: {
7
7
  readonly klanten: "Floriday - Klanten Module";
8
8
  readonly mailbox: "Mail box voor bestellingen ERP Kwekers";
9
9
  readonly personeelsplanning: "Personeelsplanning module";
10
+ readonly logistiek: "Logistiek Engine";
10
11
  };
11
12
  export type LogisticsModuleKey = keyof typeof LOGISTICS_MODULES;
12
13
  export declare const TASK_TYPES: readonly ["buffer.close", "stock.reserve", "load.compose", "pick.execute", "scan.verify", "control.execute", "print.packing_slip", "print.sticker", "print.shipping_note", "print.control_note", "print.production_note", "transport.dispatch"];
@@ -1 +1 @@
1
- {"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;;;;;CASpB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEhE,eAAO,MAAM,UAAU,iPAab,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAapE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAaxD,CAAC;AAEF,eAAO,MAAM,aAAa,wGAShB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CASjE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAMnD,CAAC;AAGF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEvE"}
1
+ {"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEhE,eAAO,MAAM,UAAU,iPAab,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAapE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAaxD,CAAC;AAEF,eAAO,MAAM,aAAa,wGAShB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CASjE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAMnD,CAAC;AAGF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEvE"}
@@ -13,6 +13,7 @@ export const LOGISTICS_MODULES = {
13
13
  klanten: "Floriday - Klanten Module",
14
14
  mailbox: "Mail box voor bestellingen ERP Kwekers",
15
15
  personeelsplanning: "Personeelsplanning module",
16
+ logistiek: "Logistiek Engine",
16
17
  };
17
18
  export const TASK_TYPES = [
18
19
  "buffer.close",
@@ -36,7 +37,7 @@ export const TASK_OWNER = {
36
37
  "scan.verify": "scanners",
37
38
  "control.execute": "afhandeling",
38
39
  "print.packing_slip": "pickschermen",
39
- "print.sticker": "pickschermen",
40
+ "print.sticker": "logistiek",
40
41
  "print.shipping_note": "afhandeling",
41
42
  "print.control_note": "afhandeling",
42
43
  "print.production_note": "pickschermen",
@@ -6,6 +6,7 @@
6
6
  export declare const PROMPT_MODULE_LABELS: {
7
7
  readonly layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)";
8
8
  readonly floridaykoppeling: "Floriday koppeling (authenticatie en gateway)";
9
+ readonly dashboards: "Dashboards (dashboard-erp-kwekers)";
9
10
  readonly verkoop: "Floriday - Verkoop Module";
10
11
  readonly voorraad: "Floriday - Voorraad Module";
11
12
  readonly afhandeling: "Floriday - Afhandeling Module";
@@ -1 +1 @@
1
- {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAIvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAw1JD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
1
+ {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAuwKD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}