@flowselections/floriday-voorraad 1.0.38 → 1.0.40

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 (63) hide show
  1. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  2. package/dist-lib/components/voorraad/ArtikelWizard.js +34 -3
  3. package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
  4. package/dist-lib/components/voorraad/FustenPage.js +7 -1
  5. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts +10 -0
  6. package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts.map +1 -0
  7. package/dist-lib/components/voorraad/InventorySettingsDrawer.js +99 -0
  8. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts +6 -0
  9. package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts.map +1 -0
  10. package/dist-lib/components/voorraad/InventoryStatusBadge.js +43 -0
  11. package/dist-lib/components/voorraad/StockHistoryChart.d.ts +4 -0
  12. package/dist-lib/components/voorraad/StockHistoryChart.d.ts.map +1 -0
  13. package/dist-lib/components/voorraad/StockHistoryChart.js +53 -0
  14. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  15. package/dist-lib/components/voorraad/VoorraadPage.js +29 -1
  16. package/dist-lib/components/voorraad/VoorraadTable.d.ts +9 -1
  17. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  18. package/dist-lib/components/voorraad/VoorraadTable.js +17 -6
  19. package/dist-lib/hooks/useInventorySettings.d.ts +29 -0
  20. package/dist-lib/hooks/useInventorySettings.d.ts.map +1 -0
  21. package/dist-lib/hooks/useInventorySettings.js +62 -0
  22. package/dist-lib/hooks/useTradeItemStock.d.ts.map +1 -1
  23. package/dist-lib/hooks/useTradeItemStock.js +1 -0
  24. package/dist-lib/integrations/supabase/auth-middleware.d.ts +3833 -1196
  25. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  26. package/dist-lib/integrations/supabase/client.d.ts +3833 -1196
  27. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/client.server.d.ts +3833 -1196
  29. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  30. package/dist-lib/integrations/supabase/types.d.ts +3987 -1324
  31. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  32. package/dist-lib/integrations/supabase/types.js +1 -0
  33. package/dist-lib/lib/floricode-required-features.functions.d.ts +3833 -1196
  34. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/floriday-2026v1.server.d.ts +77 -0
  36. package/dist-lib/lib/floriday-2026v1.server.d.ts.map +1 -0
  37. package/dist-lib/lib/floriday-2026v1.server.js +178 -0
  38. package/dist-lib/lib/floriday-customer-offer.functions.d.ts +3833 -1196
  39. package/dist-lib/lib/floriday-customer-offer.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/floriday-env.functions.d.ts +6593 -1319
  41. package/dist-lib/lib/floriday-env.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/floriday-gateway.functions.d.ts +19621 -3799
  43. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/floriday-stock-supply.server.d.ts +18 -7
  45. package/dist-lib/lib/floriday-stock-supply.server.d.ts.map +1 -1
  46. package/dist-lib/lib/floriday-stock-supply.server.js +70 -68
  47. package/dist-lib/lib/floriday-vbn-required.functions.d.ts +6593 -1319
  48. package/dist-lib/lib/floriday-vbn-required.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/floriday-warehouse.functions.d.ts +9850 -1939
  50. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/floriday-writes.functions.d.ts +6593 -1319
  52. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/fusten.d.ts +1 -0
  54. package/dist-lib/lib/fusten.d.ts.map +1 -1
  55. package/dist-lib/lib/fusten.js +1 -1
  56. package/dist-lib/lib/inventory-settings.functions.d.ts +51709 -0
  57. package/dist-lib/lib/inventory-settings.functions.d.ts.map +1 -0
  58. package/dist-lib/lib/inventory-settings.functions.js +97 -0
  59. package/dist-lib/lib/module-health.functions.d.ts +6593 -1319
  60. package/dist-lib/lib/module-health.functions.d.ts.map +1 -1
  61. package/dist-lib/lib/stock-sync.functions.d.ts +6593 -1319
  62. package/dist-lib/lib/stock-sync.functions.d.ts.map +1 -1
  63. package/package.json +1 -1
@@ -1,30 +1,39 @@
1
1
  /**
2
- * Server-side voorraadpush naar Floriday.
2
+ * Server-side voorraadpush naar Floriday (Suppliers API 2026v1).
3
3
  *
4
- * Eén wachtrijregel = de laatst bekende voorraadstand van één trade item.
5
- * Per regel worden twee dingen doorgezet, in vaste volgorde:
6
- * 1. het werkelijke aantal stuks → `PUT /trade-items/{id}/base-supply/{jaar}/{week}`
7
- * 2. de beschikbaarheidsschakelaar → `PUT /trade-items/{id}/continuous-stock`
4
+ * Eén wachtrijregel = de gewenste stand van één trade item voor één
5
+ * handelsweek. Per regel gebeuren maximaal twee dingen, in vaste volgorde:
6
+ * 1. het aantal stuks → `PUT` /trade-items/{id}/base-supply/{jaar}/{week}
7
+ * of `PATCH` (…?numberOfPieces=…) zonder prijs
8
+ * 2. de beschikbaarheid → `PUT` /trade-items/availabilities-per-week
8
9
  *
9
10
  * Deze module bevat geen HTTP-route en geen wachtrijbeheer; hij wordt
10
11
  * aangeroepen door de verwerker (dit project als terugvalweg, en de
11
12
  * Floriday-Authenticatie-module als vaste verwerker).
12
13
  */
14
+ import { type ErrorClass } from "./floriday-2026v1.server";
13
15
  export type StockQueueRow = {
14
16
  id: string;
15
17
  connection_id: string;
16
18
  trade_item_id: string;
19
+ product_id?: string | null;
17
20
  number_of_pieces: number | null;
18
21
  desired_available: boolean | null;
19
22
  attempts: number | null;
23
+ target_year?: number | null;
24
+ target_week?: number | null;
25
+ stock_mode?: string | null;
20
26
  };
21
27
  export type StockPushOutcome = {
22
28
  ok: boolean;
23
29
  /** Fout die niet vanzelf overgaat: niet opnieuw proberen. */
24
30
  permanent?: boolean;
25
31
  error?: string;
32
+ errorClass?: ErrorClass;
26
33
  attemptId?: string;
27
- /** Aantal is niet meegestuurd (bijv. geen prijs bekend). */
34
+ /** Regel sloeg op een verlopen week en is overgeslagen. */
35
+ skipped?: string;
36
+ /** Aantal is via PATCH doorgezet omdat er geen prijs bekend is. */
28
37
  quantitySkipped?: string;
29
38
  };
30
39
  /** ISO-weeknummer van vandaag (of van een gegeven datum). */
@@ -38,7 +47,7 @@ export declare function isoWeekParts(input?: string | Date): {
38
47
  * opnieuw geprobeerd — anders blijft een kapotte regel eindeloos rondgaan.
39
48
  */
40
49
  export declare function isPermanentError(message: string): boolean;
41
- /** Snelheidslimiet-signaal: verwerker moet de ronde afbreken. */
50
+ /** Snelheidslimiet- of vergrendelingssignaal: verwerker breekt de ronde af. */
42
51
  export declare function isRateLimited(message: string): boolean;
43
52
  /**
44
53
  * Zet één wachtrijregel door naar Floriday. Gooit nooit: het resultaat
@@ -49,5 +58,7 @@ export declare function pushStockRow(params: {
49
58
  supabaseAdmin: any;
50
59
  environment: string;
51
60
  row: StockQueueRow;
61
+ /** Alleen berekenen en teruggeven wat er zou gebeuren. */
62
+ dryRun?: boolean;
52
63
  }): Promise<StockPushOutcome>;
53
64
  //# sourceMappingURL=floriday-stock-supply.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-stock-supply.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-stock-supply.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYlF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASzD;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAmCD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,aAAa,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2F5B"}
1
+ {"version":3,"file":"floriday-stock-supply.server.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-stock-supply.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAElF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGtD;AAmCD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,aAAa,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoH5B"}
@@ -1,26 +1,20 @@
1
1
  /**
2
- * Server-side voorraadpush naar Floriday.
2
+ * Server-side voorraadpush naar Floriday (Suppliers API 2026v1).
3
3
  *
4
- * Eén wachtrijregel = de laatst bekende voorraadstand van één trade item.
5
- * Per regel worden twee dingen doorgezet, in vaste volgorde:
6
- * 1. het werkelijke aantal stuks → `PUT /trade-items/{id}/base-supply/{jaar}/{week}`
7
- * 2. de beschikbaarheidsschakelaar → `PUT /trade-items/{id}/continuous-stock`
4
+ * Eén wachtrijregel = de gewenste stand van één trade item voor één
5
+ * handelsweek. Per regel gebeuren maximaal twee dingen, in vaste volgorde:
6
+ * 1. het aantal stuks → `PUT` /trade-items/{id}/base-supply/{jaar}/{week}
7
+ * of `PATCH` (…?numberOfPieces=…) zonder prijs
8
+ * 2. de beschikbaarheid → `PUT` /trade-items/availabilities-per-week
8
9
  *
9
10
  * Deze module bevat geen HTTP-route en geen wachtrijbeheer; hij wordt
10
11
  * aangeroepen door de verwerker (dit project als terugvalweg, en de
11
12
  * Floriday-Authenticatie-module als vaste verwerker).
12
13
  */
14
+ import { Floriday2026v1Client, classifyError, isPastWeek, isoWeekOf, } from "./floriday-2026v1.server";
13
15
  /** ISO-weeknummer van vandaag (of van een gegeven datum). */
14
16
  export function isoWeekParts(input) {
15
- const parsed = input ? new Date(input) : new Date();
16
- const source = Number.isNaN(parsed.getTime()) ? new Date() : parsed;
17
- const date = new Date(Date.UTC(source.getUTCFullYear(), source.getUTCMonth(), source.getUTCDate()));
18
- const day = date.getUTCDay() || 7;
19
- date.setUTCDate(date.getUTCDate() + 4 - day);
20
- const year = date.getUTCFullYear();
21
- const yearStart = new Date(Date.UTC(year, 0, 1));
22
- const week = Math.ceil(((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
23
- return { year, week };
17
+ return isoWeekOf(input);
24
18
  }
25
19
  /**
26
20
  * Bepaalt of een fout tijdelijk is (netwerk, snelheidslimiet, 5xx) of
@@ -28,21 +22,12 @@ export function isoWeekParts(input) {
28
22
  * opnieuw geprobeerd — anders blijft een kapotte regel eindeloos rondgaan.
29
23
  */
30
24
  export function isPermanentError(message) {
31
- const m = message.toLowerCase();
32
- if (/\b(429|500|502|503|504)\b/.test(m))
33
- return false;
34
- if (/timeout|timed out|network|fetch failed|econn|socket|rate limit|too many requests/.test(m)) {
35
- return false;
36
- }
37
- if (/\b(400|401|403|404|409|422)\b/.test(m))
38
- return true;
39
- if (/unauthorized|forbidden|not found|validation|invalid/.test(m))
40
- return true;
41
- return false;
25
+ return classifyError(message) === "permanent";
42
26
  }
43
- /** Snelheidslimiet-signaal: verwerker moet de ronde afbreken. */
27
+ /** Snelheidslimiet- of vergrendelingssignaal: verwerker breekt de ronde af. */
44
28
  export function isRateLimited(message) {
45
- return /\b429\b|rate limit|too many requests/i.test(message);
29
+ const c = classifyError(message);
30
+ return c === "rate-limit" || c === "locked";
46
31
  }
47
32
  async function resolveWarehouseId(supabaseAdmin, connectionId, tradeItemId, cachedItem) {
48
33
  const { data: pref } = await supabaseAdmin
@@ -71,11 +56,19 @@ async function resolveWarehouseId(supabaseAdmin, connectionId, tradeItemId, cach
71
56
  * terugschrijven.
72
57
  */
73
58
  export async function pushStockRow(params) {
74
- const { supabaseAdmin, environment, row } = params;
59
+ const { supabaseAdmin, environment, row, dryRun } = params;
75
60
  const pieces = Math.max(0, Number(row.number_of_pieces ?? 0) || 0);
76
61
  const available = row.desired_available ?? pieces > 0;
62
+ // De doelweek staat vast in de regel zelf; nooit "nu" gebruiken, anders
63
+ // publiceert een late verwerking naar de verkeerde week.
64
+ const current = isoWeekOf();
65
+ const year = Number(row.target_year ?? current.year);
66
+ const week = Number(row.target_week ?? current.week);
67
+ if (isPastWeek(year, week)) {
68
+ return { ok: true, skipped: `Week ${year}-${week} is verlopen; regel overgeslagen.` };
69
+ }
77
70
  try {
78
- const { gatewayWrite } = await import("./floriday-gateway.server");
71
+ const client = new Floriday2026v1Client(supabaseAdmin, environment, row.connection_id);
79
72
  const { data: cached } = await supabaseAdmin
80
73
  .from("floriday_trade_items_cache")
81
74
  .select("data")
@@ -86,15 +79,12 @@ export async function pushStockRow(params) {
86
79
  return {
87
80
  ok: false,
88
81
  permanent: true,
82
+ errorClass: "permanent",
89
83
  error: "Dit artikel staat nog niet in de lokale Floriday-cache. Synchroniseer de artikelen en probeer opnieuw.",
90
84
  };
91
85
  }
92
86
  const item = cached.data ?? {};
93
- const warehouseId = await resolveWarehouseId(supabaseAdmin, row.connection_id, row.trade_item_id, item);
94
- // 1. Werkelijk aantal stuks via het weekaanbod van de lopende week.
95
- // Zonder bekende prijs kan Floriday geen basisaanbod aannemen; dan
96
- // zetten we alleen de beschikbaarheid en melden we dat rustig.
97
- const { year, week } = isoWeekParts();
87
+ await resolveWarehouseId(supabaseAdmin, row.connection_id, row.trade_item_id, item);
98
88
  const { data: supply } = await supabaseAdmin
99
89
  .from("trade_item_supply_lines")
100
90
  .select("price_per_piece, currency")
@@ -104,48 +94,60 @@ export async function pushStockRow(params) {
104
94
  .limit(1)
105
95
  .maybeSingle();
106
96
  const pricePerPiece = Number(supply?.price_per_piece ?? NaN);
97
+ const hasPrice = Number.isFinite(pricePerPiece) && pricePerPiece > 0;
107
98
  let quantitySkipped;
108
- if (Number.isFinite(pricePerPiece) && pricePerPiece > 0) {
109
- await gatewayWrite({
110
- environment: environment,
111
- module: "inventory",
112
- action: "edit-weekly-base-supply",
113
- method: "PUT",
114
- path: `/suppliers-api-2026v1/trade-items/${row.trade_item_id}/base-supply/${year}/${week}`,
115
- referenceId: row.trade_item_id,
116
- // Stabiele sleutel: dezelfde stand levert nooit een dubbele mutatie op.
117
- idempotencyKey: `inventory:weekly-base-supply:${row.trade_item_id}:${year}:${week}:${pieces}`,
118
- body: {
119
- basePricePerPiece: {
120
- currency: supply?.currency ?? "EUR",
121
- value: pricePerPiece,
122
- },
123
- numberOfPieces: pieces,
124
- },
99
+ if (dryRun) {
100
+ return {
101
+ ok: true,
102
+ skipped: `Proefrun: ${pieces} stuks, beschikbaar=${available}, week ${year}-${week}, ${hasPrice ? "met prijs (PUT)" : "zonder prijs (PATCH)"}.`,
103
+ };
104
+ }
105
+ // 1. Aantal stuks voor de doelweek.
106
+ const quantityResult = hasPrice
107
+ ? await client.updateWeeklyBaseSupply({
108
+ tradeItemId: row.trade_item_id,
109
+ year,
110
+ week,
111
+ numberOfPieces: pieces,
112
+ pricePerPiece,
113
+ currency: supply?.currency ?? "EUR",
114
+ })
115
+ : await client.patchWeeklyBaseSupplyQuantity({
116
+ tradeItemId: row.trade_item_id,
117
+ year,
118
+ week,
119
+ numberOfPieces: pieces,
125
120
  });
121
+ if (!quantityResult.ok) {
122
+ const message = quantityResult.error ?? "Onbekende fout bij het aanbod per week.";
123
+ const cls = classifyError(message);
124
+ return { ok: false, error: message, errorClass: cls, permanent: cls === "permanent" };
126
125
  }
127
- else {
126
+ if (!hasPrice) {
128
127
  quantitySkipped =
129
- "Aantal niet doorgezet: er is nog geen prijs bekend voor dit artikel.";
128
+ "Aantal doorgezet zonder prijs: het artikel is nog niet verkoopbaar tot er een prijs is.";
130
129
  }
131
- // 2. Beschikbaarheidsschakelaar.
132
- const body = { available };
133
- if (warehouseId)
134
- body.warehouseId = warehouseId;
135
- const res = await gatewayWrite({
136
- environment: environment,
137
- module: "inventory",
138
- action: "publish-continuous-stock",
139
- method: "PUT",
140
- path: `/suppliers-api-2026v1/trade-items/${row.trade_item_id}/continuous-stock`,
141
- referenceId: row.trade_item_id,
142
- idempotencyKey: `inventory:continuous-stock:${row.trade_item_id}:${available}:${pieces}`,
143
- body,
130
+ // 2. Beschikbaarheid voor exact dezelfde week.
131
+ const availabilityResult = await client.updateTradeItemAvailabilityPerWeek({
132
+ tradeItemIds: [row.trade_item_id],
133
+ year,
134
+ week,
135
+ isAvailable: available,
144
136
  });
145
- return { ok: true, attemptId: res?.attemptId, quantitySkipped };
137
+ if (!availabilityResult.ok) {
138
+ const message = availabilityResult.error ?? "Onbekende fout bij de beschikbaarheid.";
139
+ const cls = classifyError(message);
140
+ return { ok: false, error: message, errorClass: cls, permanent: cls === "permanent" };
141
+ }
142
+ return {
143
+ ok: true,
144
+ attemptId: availabilityResult.attemptId ?? quantityResult.attemptId,
145
+ quantitySkipped,
146
+ };
146
147
  }
147
148
  catch (e) {
148
149
  const message = e instanceof Error ? e.message : String(e);
149
- return { ok: false, permanent: isPermanentError(message), error: message };
150
+ const cls = classifyError(message);
151
+ return { ok: false, permanent: cls === "permanent", errorClass: cls, error: message };
150
152
  }
151
153
  }