@flowselections/mailbox-orders 1.0.30 → 1.0.32
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/dist-lib/components/MailboxProcessedPage.js +1 -1
- package/dist-lib/components/MailboxProposalsPage.d.ts.map +1 -1
- package/dist-lib/components/MailboxProposalsPage.js +202 -122
- package/dist-lib/components/MailboxSkippedPage.d.ts +2 -0
- package/dist-lib/components/MailboxSkippedPage.d.ts.map +1 -0
- package/dist-lib/components/MailboxSkippedPage.js +71 -0
- package/dist-lib/components/settings/MailboxFilterSettingsCard.d.ts +2 -0
- package/dist-lib/components/settings/MailboxFilterSettingsCard.d.ts.map +1 -0
- package/dist-lib/components/settings/MailboxFilterSettingsCard.js +78 -0
- package/dist-lib/components/settings/MailboxTestSetCard.d.ts +2 -0
- package/dist-lib/components/settings/MailboxTestSetCard.d.ts.map +1 -0
- package/dist-lib/components/settings/MailboxTestSetCard.js +69 -0
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +8 -2
- package/dist-lib/integrations/supabase/types.d.ts +864 -1
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/mailbox-ai.server.d.ts +33 -12
- package/dist-lib/lib/mailbox-ai.server.d.ts.map +1 -1
- package/dist-lib/lib/mailbox-ai.server.js +47 -17
- package/dist-lib/lib/mailbox-filter-settings.functions.d.ts +143 -0
- package/dist-lib/lib/mailbox-filter-settings.functions.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-filter-settings.functions.js +241 -0
- package/dist-lib/lib/mailbox-filter.d.ts +34 -0
- package/dist-lib/lib/mailbox-filter.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-filter.js +121 -0
- package/dist-lib/lib/mailbox-ingest.server.d.ts +114 -17
- package/dist-lib/lib/mailbox-ingest.server.d.ts.map +1 -1
- package/dist-lib/lib/mailbox-ingest.server.js +594 -266
- package/dist-lib/lib/mailbox-match.d.ts +28 -0
- package/dist-lib/lib/mailbox-match.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-match.js +74 -0
- package/dist-lib/lib/mailbox-units.d.ts +18 -0
- package/dist-lib/lib/mailbox-units.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-units.js +80 -0
- package/dist-lib/lib/mailbox.functions.d.ts +74 -0
- package/dist-lib/lib/mailbox.functions.d.ts.map +1 -1
- package/dist-lib/lib/mailbox.functions.js +170 -25
- package/package.json +6 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Voorfilter vóór elke AI-aanroep. Puur (geen database), zodat het zowel in de
|
|
2
|
+
// ingest als in de testset gebruikt kan worden. Alle woordenlijsten en drempels
|
|
3
|
+
// komen uit de instellingen (mailbox_filter_settings).
|
|
4
|
+
const lower = (s) => (s ?? "").toLowerCase();
|
|
5
|
+
/** Postgres-woordgrenzen (\m, \M) omzetten naar JS (\b). */
|
|
6
|
+
export function toJsRegex(pattern) {
|
|
7
|
+
try {
|
|
8
|
+
return new RegExp(pattern.replace(/\\m|\\M/g, "\\b"), "i");
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function splitEmail(email) {
|
|
15
|
+
const e = lower(email).trim();
|
|
16
|
+
const at = e.lastIndexOf("@");
|
|
17
|
+
return at < 0 ? { local: e, domain: "" } : { local: e.slice(0, at), domain: e.slice(at + 1) };
|
|
18
|
+
}
|
|
19
|
+
function domainMatches(domain, d) {
|
|
20
|
+
const x = lower(d).trim().replace(/^@/, "");
|
|
21
|
+
return !!x && (domain === x || domain.endsWith(`.${x}`));
|
|
22
|
+
}
|
|
23
|
+
function hasWord(hay, word) {
|
|
24
|
+
const w = lower(word).trim();
|
|
25
|
+
if (!w)
|
|
26
|
+
return false;
|
|
27
|
+
const esc = w.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
28
|
+
return new RegExp(`(^|[^\\p{L}\\p{N}])${esc}($|[^\\p{L}\\p{N}])`, "iu").test(hay);
|
|
29
|
+
}
|
|
30
|
+
export function classifyMessage(input, s) {
|
|
31
|
+
const { local, domain } = splitEmail(input.fromEmail);
|
|
32
|
+
const hay = lower(`${input.subject}\n${input.body}`);
|
|
33
|
+
if (input.knownSender) {
|
|
34
|
+
return { outcome: "analyseren", reason: "Bekende afzender (klant of contactpersoon)", signals: [] };
|
|
35
|
+
}
|
|
36
|
+
const skipSender = (s.skip_senders ?? []).find((x) => {
|
|
37
|
+
const v = lower(x).trim();
|
|
38
|
+
return !!v && (v.includes("@") ? lower(input.fromEmail).trim() === v : local.includes(v));
|
|
39
|
+
});
|
|
40
|
+
if (skipSender) {
|
|
41
|
+
return { outcome: "geen_bestelling", reason: `Afzender staat op de overslaan-lijst ("${skipSender}")`, signals: [] };
|
|
42
|
+
}
|
|
43
|
+
const skipDomain = (s.skip_domains ?? []).find((d) => domainMatches(domain, d));
|
|
44
|
+
if (skipDomain) {
|
|
45
|
+
return { outcome: "geen_bestelling", reason: `Domein staat op de overslaan-lijst ("${skipDomain}")`, signals: [] };
|
|
46
|
+
}
|
|
47
|
+
const negative = (s.negative_keywords ?? []).filter((w) => hasWord(hay, w));
|
|
48
|
+
if (negative.length > 0) {
|
|
49
|
+
return {
|
|
50
|
+
outcome: "geen_bestelling",
|
|
51
|
+
reason: `Lijkt een nieuwsbrief, bon of melding ("${negative.slice(0, 3).join('", "')}")`,
|
|
52
|
+
signals: [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const signals = [];
|
|
56
|
+
for (const w of s.order_keywords ?? [])
|
|
57
|
+
if (hasWord(hay, w))
|
|
58
|
+
signals.push(w);
|
|
59
|
+
for (const p of s.order_patterns ?? []) {
|
|
60
|
+
const re = toJsRegex(p);
|
|
61
|
+
const m = re?.exec(hay);
|
|
62
|
+
if (m)
|
|
63
|
+
signals.push(m[0].trim());
|
|
64
|
+
}
|
|
65
|
+
const unique = Array.from(new Set(signals));
|
|
66
|
+
const min = Math.max(1, Number(s.min_signals_unknown ?? 2));
|
|
67
|
+
if (unique.length >= min) {
|
|
68
|
+
return {
|
|
69
|
+
outcome: "onbekend_met_signalen",
|
|
70
|
+
reason: `Onbekende afzender met bestel-signalen ("${unique.slice(0, 4).join('", "')}")`,
|
|
71
|
+
signals: unique,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
outcome: "geen_bestelling",
|
|
76
|
+
reason: unique.length
|
|
77
|
+
? `Onbekende afzender met te weinig bestel-signalen (${unique.length} van ${min})`
|
|
78
|
+
: "Onbekende afzender zonder bestel-signalen",
|
|
79
|
+
signals: unique,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const FORWARD_RE = /^[ \t>]*(-{2,}\s*(forwarded message|doorgestuurd bericht|weitergeleitete nachricht|original message|oorspronkelijk bericht)\s*-{2,}|begin forwarded message:?)\s*$/im;
|
|
83
|
+
const QUOTE_START_RES = [
|
|
84
|
+
/^\s*>/m,
|
|
85
|
+
/^\s*(on|op|am)\s.{3,200}\s(wrote|schreef|schrieb|heeft .{0,60}geschreven)\s?.{0,80}:\s*$/im,
|
|
86
|
+
/^\s*-{2,}\s*(original message|oorspronkelijk bericht|ursprüngliche nachricht)\s*-{2,}\s*$/im,
|
|
87
|
+
/^\s*(van|from|von):\s.+\n\s*(verzonden|sent|gesendet|datum|date):\s/im,
|
|
88
|
+
];
|
|
89
|
+
const SIGNATURE_RES = [/^--\s*$/m, /^\s*(verzonden (vanaf|met)|sent from my|von meinem)\b.*$/im];
|
|
90
|
+
function cutAtFirst(text, res) {
|
|
91
|
+
let cut = text.length;
|
|
92
|
+
for (const re of res) {
|
|
93
|
+
const m = re.exec(text);
|
|
94
|
+
if (m && m.index < cut)
|
|
95
|
+
cut = m.index;
|
|
96
|
+
}
|
|
97
|
+
return text.slice(0, cut);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Alleen het nieuwste deel van de mail: geciteerde tekst en handtekening weg.
|
|
101
|
+
* Bij een doorgestuurde mail is het doorgestuurde bericht leidend en wordt de
|
|
102
|
+
* oorspronkelijke afzender teruggegeven.
|
|
103
|
+
*/
|
|
104
|
+
export function extractLatestPart(body) {
|
|
105
|
+
const src = (body ?? "").replace(/\r\n/g, "\n");
|
|
106
|
+
const fw = FORWARD_RE.exec(src);
|
|
107
|
+
if (fw) {
|
|
108
|
+
const rest = src.slice(fw.index + fw[0].length);
|
|
109
|
+
const fromLine = /^\s*(from|van|von):\s*(.+)$/im.exec(rest);
|
|
110
|
+
const addr = fromLine ? /[\w.+-]+@[\w-]+(\.[\w-]+)+/.exec(fromLine[2])?.[0] ?? null : null;
|
|
111
|
+
// Kopregels (From/To/Subject/Date) van het doorgestuurde bericht overslaan.
|
|
112
|
+
const lines = rest.split("\n");
|
|
113
|
+
let i = 0;
|
|
114
|
+
while (i < lines.length && (/^\s*$/.test(lines[i]) || /^\s*[\p{L} -]{2,20}:\s/u.test(lines[i])))
|
|
115
|
+
i++;
|
|
116
|
+
const inner = lines.slice(i).join("\n");
|
|
117
|
+
return { text: cutAtFirst(cutAtFirst(inner, QUOTE_START_RES), SIGNATURE_RES).trim(), forwardedFrom: addr ? addr.toLowerCase() : null };
|
|
118
|
+
}
|
|
119
|
+
const text = cutAtFirst(cutAtFirst(src, QUOTE_START_RES), SIGNATURE_RES).trim();
|
|
120
|
+
return { text: text || src.trim(), forwardedFrom: null };
|
|
121
|
+
}
|
|
@@ -1,11 +1,52 @@
|
|
|
1
1
|
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
2
|
import type { Database } from "../integrations/supabase/types.js";
|
|
3
|
+
import { type FilterSettings } from "./mailbox-filter.js";
|
|
4
|
+
import { type BeladingDims, type UnitKind } from "./mailbox-units.js";
|
|
3
5
|
type AdminClient = SupabaseClient<Database>;
|
|
4
6
|
/** Centrale AI-instellingen van deze module (aanpasbaar via Instellingen). */
|
|
5
7
|
export declare function loadMailboxAiSettings(admin: AdminClient): Promise<{
|
|
6
8
|
systemPrompt: string | null;
|
|
7
9
|
requiredFields: string[];
|
|
10
|
+
enabled: boolean;
|
|
8
11
|
}>;
|
|
12
|
+
export interface MailboxFilterSettingsRow extends FilterSettings {
|
|
13
|
+
max_ai_per_day: number;
|
|
14
|
+
max_ai_per_month: number;
|
|
15
|
+
max_candidates: number;
|
|
16
|
+
max_retry_attempts: number;
|
|
17
|
+
max_retries_per_run: number;
|
|
18
|
+
max_agent_reparse: number;
|
|
19
|
+
conf_green: number;
|
|
20
|
+
conf_orange: number;
|
|
21
|
+
duplicate_days: number;
|
|
22
|
+
}
|
|
23
|
+
/** Filter- en limietinstellingen. Fail closed: zonder instellingen geen analyse. */
|
|
24
|
+
export declare function loadFilterSettings(admin: AdminClient): Promise<MailboxFilterSettingsRow>;
|
|
25
|
+
export interface EnrichedLine {
|
|
26
|
+
product_id: string | null;
|
|
27
|
+
raw_product_text: string;
|
|
28
|
+
plant_type: string | null;
|
|
29
|
+
raw_code: string | null;
|
|
30
|
+
name_in_mail: string | null;
|
|
31
|
+
qty_in_mail: number | null;
|
|
32
|
+
unit_text: string | null;
|
|
33
|
+
unit_kind: UnitKind;
|
|
34
|
+
pieces_per_unit: number | null;
|
|
35
|
+
plants: number | null;
|
|
36
|
+
unit_price: number | null;
|
|
37
|
+
currency: string | null;
|
|
38
|
+
price_per: "stuk" | "eenheid" | null;
|
|
39
|
+
mail_price: number | null;
|
|
40
|
+
belading: BeladingDims | null;
|
|
41
|
+
match_source: "code" | "ai" | "naam" | null;
|
|
42
|
+
confidence: {
|
|
43
|
+
product: number;
|
|
44
|
+
quantity: number;
|
|
45
|
+
unit: number;
|
|
46
|
+
price: number;
|
|
47
|
+
};
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}
|
|
9
50
|
/**
|
|
10
51
|
* Combineert de zelfcontrole van de AI met een harde servercheck op de
|
|
11
52
|
* verplichte velden. Ontbrekende of onzekere gegevens worden expliciet
|
|
@@ -13,6 +54,8 @@ export declare function loadMailboxAiSettings(admin: AdminClient): Promise<{
|
|
|
13
54
|
*/
|
|
14
55
|
export declare function computeValidation(parsed: import("./mailbox-ai.server.js").ParsedOrder, requiredFields: string[], extra: {
|
|
15
56
|
customerId: string | null;
|
|
57
|
+
lines?: EnrichedLine[];
|
|
58
|
+
confGreen?: number;
|
|
16
59
|
}): {
|
|
17
60
|
missing: string[];
|
|
18
61
|
uncertain: string[];
|
|
@@ -20,15 +63,14 @@ export declare function computeValidation(parsed: import("./mailbox-ai.server.js
|
|
|
20
63
|
ok: boolean;
|
|
21
64
|
};
|
|
22
65
|
/** Maximaal aantal achtergrondpogingen voordat we het voorstel handmatig laten. */
|
|
23
|
-
export declare const AI_MAX_BACKGROUND_RETRIES =
|
|
66
|
+
export declare const AI_MAX_BACKGROUND_RETRIES = 3;
|
|
24
67
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* locatie van deze klant, dan blijft die staan.
|
|
68
|
+
* Afleveradres: een GLN of locatie uit de mail wint. Anders de vaste locatie
|
|
69
|
+
* (is_primary, maximaal één per klant). Geen vaste locatie → niets kiezen.
|
|
28
70
|
*/
|
|
29
|
-
export declare function resolveDeliveryLocation(admin: AdminClient, customerId: string | null, aiValue: unknown): Promise<{
|
|
71
|
+
export declare function resolveDeliveryLocation(admin: AdminClient, customerId: string | null, aiValue: unknown, mailText?: string): Promise<{
|
|
30
72
|
id: string;
|
|
31
|
-
|
|
73
|
+
source: "mail" | "gln" | "vast";
|
|
32
74
|
} | null>;
|
|
33
75
|
/**
|
|
34
76
|
* Afhaallocatie (eigen tuin/warehouse): AI-herkenning wint, anders de hoofdlocatie
|
|
@@ -38,23 +80,32 @@ export declare function resolvePickupLocation(admin: AdminClient, aiValue: unkno
|
|
|
38
80
|
id: string;
|
|
39
81
|
primary: boolean;
|
|
40
82
|
} | null>;
|
|
83
|
+
export type StubOutcome = {
|
|
84
|
+
status: "exists" | "created" | "busy" | "skipped" | "waiting";
|
|
85
|
+
reason?: string;
|
|
86
|
+
};
|
|
41
87
|
/**
|
|
42
|
-
* Maakt exact één voorstel per bericht.
|
|
43
|
-
*
|
|
44
|
-
* leeg voorstel met de reden erbij. Ingest mag nooit stukvallen op AI.
|
|
88
|
+
* Maakt exact één voorstel per bericht. Eerst het voorfilter (zonder AI), dan
|
|
89
|
+
* het vastleggen van de analyse (één tegelijk + limieten), en pas dan de AI.
|
|
45
90
|
*/
|
|
46
|
-
export declare function createStubProposal(admin: AdminClient, messageId: string, fromEmail: string | null
|
|
91
|
+
export declare function createStubProposal(admin: AdminClient, messageId: string, fromEmail: string | null, opts?: {
|
|
92
|
+
force?: boolean;
|
|
93
|
+
trigger?: string;
|
|
94
|
+
}): Promise<StubOutcome>;
|
|
47
95
|
/**
|
|
48
96
|
* Analyseert een bestaand (nog niet goedgekeurd) voorstel opnieuw met de
|
|
49
97
|
* huidige AI-agent. De vorige AI-analyse wordt vervangen.
|
|
50
98
|
*/
|
|
51
|
-
export declare function reparseProposal(admin: AdminClient, proposalId: string
|
|
99
|
+
export declare function reparseProposal(admin: AdminClient, proposalId: string, opts?: {
|
|
100
|
+
force?: boolean;
|
|
101
|
+
trigger?: string;
|
|
102
|
+
}): Promise<{
|
|
52
103
|
ok: boolean;
|
|
53
104
|
error: string | null;
|
|
54
105
|
}>;
|
|
55
106
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
107
|
+
* Gewijzigde AI-agent: openstaande voorstellen opnieuw analyseren. Alleen via
|
|
108
|
+
* de knop, of automatisch tot het ingestelde maximum (standaard 0 = uit).
|
|
58
109
|
*/
|
|
59
110
|
export declare function reparseChangedAgentProposals(admin: AdminClient, limit?: number): Promise<{
|
|
60
111
|
checked: number;
|
|
@@ -62,13 +113,14 @@ export declare function reparseChangedAgentProposals(admin: AdminClient, limit?:
|
|
|
62
113
|
failed: number;
|
|
63
114
|
fingerprint: string | null;
|
|
64
115
|
}>;
|
|
116
|
+
/** Telt openstaande voorstellen met een verouderde AI-analyse (voor de knop). */
|
|
117
|
+
export declare function countOutdatedAgentProposals(admin: AdminClient): Promise<number>;
|
|
65
118
|
/**
|
|
66
119
|
* Achtergrondherstel: voorstellen waarvan de AI-analyse door een tijdelijke
|
|
67
|
-
* storing
|
|
68
|
-
*
|
|
69
|
-
* Blijft strikt idempotent: alleen 'pending' voorstellen worden aangeraakt.
|
|
120
|
+
* storing mislukte, worden bij een volgende run opnieuw geanalyseerd — begrensd
|
|
121
|
+
* per run en per voorstel (instellingen), en binnen de dag-/maandlimiet.
|
|
70
122
|
*/
|
|
71
|
-
export declare function retryFailedAiProposals(admin: AdminClient, limit?: number): Promise<{
|
|
123
|
+
export declare function retryFailedAiProposals(admin: AdminClient, limit?: number, maxRetries?: number): Promise<{
|
|
72
124
|
retried: number;
|
|
73
125
|
recovered: number;
|
|
74
126
|
stillFailing: number;
|
|
@@ -85,5 +137,50 @@ export type IngestRunResult = {
|
|
|
85
137
|
skipped?: "no_active_connection";
|
|
86
138
|
};
|
|
87
139
|
export declare function runIngest(trigger: Trigger): Promise<IngestRunResult>;
|
|
140
|
+
export declare function dryRunAnalysis(admin: AdminClient, input: {
|
|
141
|
+
subject: string;
|
|
142
|
+
body: string;
|
|
143
|
+
fromEmail: string;
|
|
144
|
+
hasAttachment: boolean;
|
|
145
|
+
simulateKnownSender?: boolean;
|
|
146
|
+
}): Promise<{
|
|
147
|
+
filter: import("./mailbox-filter.js").FilterResult;
|
|
148
|
+
sender: string;
|
|
149
|
+
forwarded: boolean;
|
|
150
|
+
analyzed: boolean;
|
|
151
|
+
tokens: {
|
|
152
|
+
input: number;
|
|
153
|
+
output: number;
|
|
154
|
+
};
|
|
155
|
+
result: null;
|
|
156
|
+
} | {
|
|
157
|
+
filter: import("./mailbox-filter.js").FilterResult;
|
|
158
|
+
sender: string;
|
|
159
|
+
forwarded: boolean;
|
|
160
|
+
analyzed: boolean;
|
|
161
|
+
tokens: {
|
|
162
|
+
input: number;
|
|
163
|
+
output: number;
|
|
164
|
+
};
|
|
165
|
+
result: {
|
|
166
|
+
error: string | null;
|
|
167
|
+
customer_known: boolean;
|
|
168
|
+
delivery_date: any;
|
|
169
|
+
reference: any;
|
|
170
|
+
attachment_unread: boolean;
|
|
171
|
+
lines: {
|
|
172
|
+
text: string;
|
|
173
|
+
code: string | null;
|
|
174
|
+
product_id: string | null;
|
|
175
|
+
product_known: boolean;
|
|
176
|
+
match_source: "code" | "naam" | "ai" | null;
|
|
177
|
+
quantity: number | null;
|
|
178
|
+
unit: UnitKind;
|
|
179
|
+
plants: number | null;
|
|
180
|
+
unit_price: number | null;
|
|
181
|
+
warnings: string[];
|
|
182
|
+
}[];
|
|
183
|
+
};
|
|
184
|
+
}>;
|
|
88
185
|
export {};
|
|
89
186
|
//# sourceMappingURL=mailbox-ingest.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailbox-ingest.server.d.ts","sourceRoot":"","sources":["../../src/lib/mailbox-ingest.server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"mailbox-ingest.server.d.ts","sourceRoot":"","sources":["../../src/lib/mailbox-ingest.server.ts"],"names":[],"mappings":"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"}
|