@hszrdm/core 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.medusa/server/src/admin/index.js +4357 -4110
  2. package/.medusa/server/src/admin/index.mjs +4357 -4110
  3. package/.medusa/server/src/api/admin/email/preview/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/email/preview/route.js +20 -0
  5. package/.medusa/server/src/api/admin/email/templates/[id]/route.d.ts +4 -0
  6. package/.medusa/server/src/api/admin/email/templates/[id]/route.js +25 -0
  7. package/.medusa/server/src/api/admin/email/templates/route.d.ts +3 -0
  8. package/.medusa/server/src/api/admin/email/templates/route.js +40 -0
  9. package/.medusa/server/src/api/admin/email/test-send/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/email/test-send/route.js +64 -0
  11. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.d.ts +2 -0
  12. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.js +15 -0
  13. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.d.ts +4 -0
  14. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.js +39 -0
  15. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.js +14 -0
  17. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.d.ts +2 -0
  18. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.js +17 -0
  19. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.js +23 -0
  21. package/.medusa/server/src/api/admin/newsletter/campaigns/route.d.ts +3 -0
  22. package/.medusa/server/src/api/admin/newsletter/campaigns/route.js +40 -0
  23. package/.medusa/server/src/api/hooks/email/status/route.d.ts +2 -0
  24. package/.medusa/server/src/api/hooks/email/status/route.js +69 -0
  25. package/.medusa/server/src/api/mcp/route.d.ts +4 -0
  26. package/.medusa/server/src/api/mcp/route.js +19 -0
  27. package/.medusa/server/src/api/store/email/track/click/[token]/route.d.ts +2 -0
  28. package/.medusa/server/src/api/store/email/track/click/[token]/route.js +19 -0
  29. package/.medusa/server/src/api/store/email/track/open/[token]/route.d.ts +2 -0
  30. package/.medusa/server/src/api/store/email/track/open/[token]/route.js +22 -0
  31. package/.medusa/server/src/api/store/leads/route.js +27 -93
  32. package/.medusa/server/src/api/store/newsletter/route.js +24 -107
  33. package/.medusa/server/src/api/store/quote-requests/route.js +41 -129
  34. package/.medusa/server/src/config.d.ts +1 -1
  35. package/.medusa/server/src/config.js +38 -15
  36. package/.medusa/server/src/core/customer-email.d.ts +5 -5
  37. package/.medusa/server/src/core/customer-email.js +55 -109
  38. package/.medusa/server/src/core/store-mcp.d.ts +19 -0
  39. package/.medusa/server/src/core/store-mcp.js +541 -0
  40. package/.medusa/server/src/core/transactional-email.d.ts +9 -8
  41. package/.medusa/server/src/core/transactional-email.js +74 -244
  42. package/.medusa/server/src/core/version.d.ts +2 -2
  43. package/.medusa/server/src/core/version.js +2 -2
  44. package/.medusa/server/src/jobs/email-campaign-dispatch.d.ts +6 -0
  45. package/.medusa/server/src/jobs/email-campaign-dispatch.js +18 -0
  46. package/.medusa/server/src/localized-config.d.ts +1 -1
  47. package/.medusa/server/src/modules/cms/index.d.ts +32 -1
  48. package/.medusa/server/src/modules/core-audit/index.d.ts +18 -1
  49. package/.medusa/server/src/modules/core-audit/writer.d.ts +14 -1
  50. package/.medusa/server/src/modules/email-center/campaign.d.ts +74 -0
  51. package/.medusa/server/src/modules/email-center/campaign.js +193 -0
  52. package/.medusa/server/src/modules/email-center/constants.d.ts +1 -0
  53. package/.medusa/server/src/modules/email-center/constants.js +5 -0
  54. package/.medusa/server/src/modules/email-center/defaults.d.ts +10 -0
  55. package/.medusa/server/src/modules/email-center/defaults.js +49 -0
  56. package/.medusa/server/src/modules/email-center/index.d.ts +57 -0
  57. package/.medusa/server/src/modules/email-center/index.js +42 -0
  58. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.d.ts +5 -0
  59. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.js +25 -0
  60. package/.medusa/server/src/modules/email-center/models/email-campaign.d.ts +22 -0
  61. package/.medusa/server/src/modules/email-center/models/email-campaign.js +37 -0
  62. package/.medusa/server/src/modules/email-center/models/email-delivery.d.ts +21 -0
  63. package/.medusa/server/src/modules/email-center/models/email-delivery.js +38 -0
  64. package/.medusa/server/src/modules/email-center/models/email-template.d.ts +13 -0
  65. package/.medusa/server/src/modules/email-center/models/email-template.js +20 -0
  66. package/.medusa/server/src/modules/email-center/render.d.ts +31 -0
  67. package/.medusa/server/src/modules/email-center/render.js +92 -0
  68. package/.medusa/server/src/modules/email-center/send.d.ts +27 -0
  69. package/.medusa/server/src/modules/email-center/send.js +67 -0
  70. package/.medusa/server/src/modules/email-center/service.d.ts +56 -0
  71. package/.medusa/server/src/modules/email-center/service.js +13 -0
  72. package/.medusa/server/src/modules/email-center/tracking.d.ts +9 -0
  73. package/.medusa/server/src/modules/email-center/tracking.js +92 -0
  74. package/.medusa/server/src/modules/integration-operation/index.d.ts +18 -1
  75. package/.medusa/server/src/modules/integration-settings/index.d.ts +18 -1
  76. package/.medusa/server/src/modules/lead/index.d.ts +18 -1
  77. package/.medusa/server/src/modules/legal-consent/consent.d.ts +4 -4
  78. package/.medusa/server/src/modules/legal-consent/index.d.ts +46 -1
  79. package/.medusa/server/src/modules/newsletter/index.d.ts +18 -1
  80. package/.medusa/server/src/modules/product-review/index.d.ts +18 -1
  81. package/.medusa/server/src/modules/quote-request/index.d.ts +18 -1
  82. package/.medusa/server/src/modules/seo/index.d.ts +32 -1
  83. package/.medusa/server/src/modules/webshop-analytics/index.d.ts +18 -1
  84. package/.medusa/server/src/modules/wishlist/index.d.ts +18 -1
  85. package/.medusa/server/src/providers/dpd/index.d.ts +1 -1
  86. package/.medusa/server/src/providers/email/index.d.ts +2 -0
  87. package/.medusa/server/src/providers/email/index.js +11 -0
  88. package/.medusa/server/src/providers/email/service.d.ts +24 -0
  89. package/.medusa/server/src/providers/email/service.js +117 -0
  90. package/.medusa/server/src/providers/foxpost/index.d.ts +1 -1
  91. package/.medusa/server/src/providers/gls/index.d.ts +1 -1
  92. package/.medusa/server/src/providers/mpl/index.d.ts +1 -1
  93. package/.medusa/server/src/providers/packeta/index.d.ts +1 -1
  94. package/.medusa/server/src/providers/resilient-stripe/index.d.ts +1 -1
  95. package/.medusa/server/src/providers/simplepay/index.d.ts +1 -1
  96. package/.medusa/server/src/scripts/core-init.js +20 -3
  97. package/.medusa/server/src/scripts/verify-bootstrap.js +1 -7
  98. package/.medusa/server/src/subscribers/transactional-email-shipment-created.js +6 -2
  99. package/package.json +3 -3
@@ -0,0 +1,541 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleStoreMcpRequest = handleStoreMcpRequest;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const node_crypto_1 = require("node:crypto");
6
+ const zod_1 = require("zod");
7
+ const MODERN_PROTOCOL = "2026-07-28";
8
+ const LEGACY_PROTOCOL = "2025-11-25";
9
+ const SERVER_NAME = "hszrdm-store";
10
+ const SERVER_VERSION = "1.0.0";
11
+ const DEFAULT_LIMIT = 20;
12
+ const MAX_LIMIT = 100;
13
+ const DEFAULT_RATE_LIMIT = 120;
14
+ const TOOL_CACHE_TTL_MS = 300_000;
15
+ const rateLimitBuckets = new Map();
16
+ const pageSchema = zod_1.z.object({
17
+ limit: zod_1.z.number().int().min(1).max(MAX_LIMIT).optional(),
18
+ offset: zod_1.z.number().int().min(0).optional(),
19
+ });
20
+ const pageWithStatusSchema = pageSchema.extend({
21
+ status: zod_1.z.string().trim().min(1).optional(),
22
+ });
23
+ const idSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
24
+ const tools = [
25
+ {
26
+ name: "store_summary",
27
+ title: "Store summary",
28
+ description: "Return a compact read-only summary of the store, including counts for orders, products, customers, and sales channels.",
29
+ inputSchema: objectSchema({}),
30
+ parse: (input) => zod_1.z.object({}).parse(input ?? {}),
31
+ run: async (query) => {
32
+ const [orders, products, customers, salesChannels] = await Promise.all([
33
+ countEntity(query, "order"),
34
+ countEntity(query, "product"),
35
+ countEntity(query, "customer"),
36
+ countEntity(query, "sales_channel"),
37
+ ]);
38
+ return {
39
+ orders,
40
+ products,
41
+ customers,
42
+ sales_channels: salesChannels,
43
+ };
44
+ },
45
+ },
46
+ {
47
+ name: "orders_list",
48
+ title: "List orders",
49
+ description: "List recent orders with totals, payment status, fulfillment status, customer email, and timestamps. Read-only.",
50
+ inputSchema: objectSchema({
51
+ limit: integerSchema(1, MAX_LIMIT),
52
+ offset: integerSchema(0),
53
+ status: stringSchema(),
54
+ }),
55
+ parse: (input) => pageWithStatusSchema.parse(input ?? {}),
56
+ run: async (query, input) => {
57
+ const { limit, offset, status } = input;
58
+ return query.graph({
59
+ entity: "order",
60
+ fields: [
61
+ "id",
62
+ "display_id",
63
+ "email",
64
+ "currency_code",
65
+ "total",
66
+ "subtotal",
67
+ "tax_total",
68
+ "shipping_total",
69
+ "status",
70
+ "fulfillment_status",
71
+ "payment_status",
72
+ "created_at",
73
+ "updated_at",
74
+ ],
75
+ filters: status ? { status } : undefined,
76
+ pagination: page(limit, offset, { created_at: "DESC" }),
77
+ });
78
+ },
79
+ },
80
+ {
81
+ name: "order_get",
82
+ title: "Get order",
83
+ description: "Get one order by its Medusa order ID, including line items. Read-only.",
84
+ inputSchema: objectSchema({ id: stringSchema() }, ["id"]),
85
+ parse: (input) => idSchema.parse(input ?? {}),
86
+ run: async (query, input) => {
87
+ const { id } = input;
88
+ const result = await query.graph({
89
+ entity: "order",
90
+ fields: [
91
+ "id",
92
+ "display_id",
93
+ "email",
94
+ "currency_code",
95
+ "total",
96
+ "subtotal",
97
+ "discount_total",
98
+ "tax_total",
99
+ "shipping_total",
100
+ "status",
101
+ "fulfillment_status",
102
+ "payment_status",
103
+ "created_at",
104
+ "updated_at",
105
+ "items.id",
106
+ "items.title",
107
+ "items.subtitle",
108
+ "items.quantity",
109
+ "items.unit_price",
110
+ "items.total",
111
+ "items.variant_id",
112
+ "items.product_id",
113
+ ],
114
+ filters: { id },
115
+ pagination: { take: 1 },
116
+ });
117
+ return result.data[0] ?? null;
118
+ },
119
+ },
120
+ {
121
+ name: "products_list",
122
+ title: "List products",
123
+ description: "List products with status, handle, thumbnail, and variants. Read-only.",
124
+ inputSchema: objectSchema({
125
+ limit: integerSchema(1, MAX_LIMIT),
126
+ offset: integerSchema(0),
127
+ status: stringSchema(),
128
+ }),
129
+ parse: (input) => pageWithStatusSchema.parse(input ?? {}),
130
+ run: async (query, input) => {
131
+ const { limit, offset, status } = input;
132
+ return query.graph({
133
+ entity: "product",
134
+ fields: [
135
+ "id",
136
+ "title",
137
+ "handle",
138
+ "status",
139
+ "thumbnail",
140
+ "created_at",
141
+ "updated_at",
142
+ "variants.id",
143
+ "variants.title",
144
+ "variants.sku",
145
+ "variants.manage_inventory",
146
+ ],
147
+ filters: status ? { status } : undefined,
148
+ pagination: page(limit, offset, { created_at: "DESC" }),
149
+ });
150
+ },
151
+ },
152
+ {
153
+ name: "product_get",
154
+ title: "Get product",
155
+ description: "Get one product by Medusa product ID, including variants and sales-channel membership. Read-only.",
156
+ inputSchema: objectSchema({ id: stringSchema() }, ["id"]),
157
+ parse: (input) => idSchema.parse(input ?? {}),
158
+ run: async (query, input) => {
159
+ const { id } = input;
160
+ const result = await query.graph({
161
+ entity: "product",
162
+ fields: [
163
+ "id",
164
+ "title",
165
+ "subtitle",
166
+ "description",
167
+ "handle",
168
+ "status",
169
+ "thumbnail",
170
+ "created_at",
171
+ "updated_at",
172
+ "variants.id",
173
+ "variants.title",
174
+ "variants.sku",
175
+ "variants.manage_inventory",
176
+ "sales_channels.id",
177
+ "sales_channels.name",
178
+ ],
179
+ filters: { id },
180
+ pagination: { take: 1 },
181
+ });
182
+ return result.data[0] ?? null;
183
+ },
184
+ },
185
+ {
186
+ name: "customers_list",
187
+ title: "List customers",
188
+ description: "List basic customer identity and account metadata. Addresses, credentials, and secrets are not exposed. Read-only.",
189
+ inputSchema: objectSchema({
190
+ limit: integerSchema(1, MAX_LIMIT),
191
+ offset: integerSchema(0),
192
+ }),
193
+ parse: (input) => pageSchema.parse(input ?? {}),
194
+ run: async (query, input) => {
195
+ const { limit, offset } = input;
196
+ return query.graph({
197
+ entity: "customer",
198
+ fields: [
199
+ "id",
200
+ "email",
201
+ "first_name",
202
+ "last_name",
203
+ "company_name",
204
+ "has_account",
205
+ "created_at",
206
+ "updated_at",
207
+ ],
208
+ pagination: page(limit, offset, { created_at: "DESC" }),
209
+ });
210
+ },
211
+ },
212
+ {
213
+ name: "sales_channels_list",
214
+ title: "List sales channels",
215
+ description: "List configured Medusa sales channels. Read-only.",
216
+ inputSchema: objectSchema({
217
+ limit: integerSchema(1, MAX_LIMIT),
218
+ offset: integerSchema(0),
219
+ }),
220
+ parse: (input) => pageSchema.parse(input ?? {}),
221
+ run: async (query, input) => {
222
+ const { limit, offset } = input;
223
+ return query.graph({
224
+ entity: "sales_channel",
225
+ fields: [
226
+ "id",
227
+ "name",
228
+ "description",
229
+ "is_disabled",
230
+ "created_at",
231
+ "updated_at",
232
+ ],
233
+ pagination: page(limit, offset, { created_at: "DESC" }),
234
+ });
235
+ },
236
+ },
237
+ {
238
+ name: "inventory_list",
239
+ title: "List inventory",
240
+ description: "List inventory items and stock levels by location, including stocked, reserved, incoming, and available quantities. Read-only.",
241
+ inputSchema: objectSchema({
242
+ limit: integerSchema(1, MAX_LIMIT),
243
+ offset: integerSchema(0),
244
+ }),
245
+ parse: (input) => pageSchema.parse(input ?? {}),
246
+ run: async (query, input) => {
247
+ const { limit, offset } = input;
248
+ return query.graph({
249
+ entity: "inventory_item",
250
+ fields: [
251
+ "id",
252
+ "sku",
253
+ "title",
254
+ "requires_shipping",
255
+ "location_levels.id",
256
+ "location_levels.stocked_quantity",
257
+ "location_levels.reserved_quantity",
258
+ "location_levels.incoming_quantity",
259
+ "location_levels.available_quantity",
260
+ "location_levels.location_id",
261
+ ],
262
+ pagination: page(limit, offset, { created_at: "DESC" }),
263
+ });
264
+ },
265
+ },
266
+ ];
267
+ async function handleStoreMcpRequest(req, res) {
268
+ res.setHeader("Cache-Control", "private, no-store, max-age=0");
269
+ if (String(req.method || "POST").toUpperCase() !== "POST") {
270
+ res.setHeader("Allow", "POST");
271
+ return res.status(405).json({ error: "Method not allowed" });
272
+ }
273
+ const token = String(process.env.HSZRDM_MCP_TOKEN || "").trim();
274
+ if (!token) {
275
+ return res.status(503).json({
276
+ error: "HSZRDM Store MCP is disabled. Set HSZRDM_MCP_TOKEN to enable it.",
277
+ });
278
+ }
279
+ const authorization = header(req, "authorization");
280
+ if (!isValidBearerToken(authorization, token)) {
281
+ res.setHeader("WWW-Authenticate", 'Bearer realm="HSZRDM Store MCP"');
282
+ return res.status(401).json({ error: "Unauthorized" });
283
+ }
284
+ const allowedOrigins = csv(process.env.HSZRDM_MCP_ALLOWED_ORIGINS);
285
+ const origin = header(req, "origin");
286
+ if (origin && allowedOrigins.length && !allowedOrigins.includes(origin)) {
287
+ return res.status(403).json({ error: "Origin is not allowed" });
288
+ }
289
+ const allowedHosts = csv(process.env.HSZRDM_MCP_ALLOWED_HOSTS);
290
+ const host = header(req, "host")?.split(":")[0];
291
+ if (host && allowedHosts.length && !allowedHosts.includes(host)) {
292
+ return res.status(403).json({ error: "Host is not allowed" });
293
+ }
294
+ if (!consumeRateLimit(req, token)) {
295
+ res.setHeader("Retry-After", "60");
296
+ return res.status(429).json({ error: "MCP rate limit exceeded" });
297
+ }
298
+ const rpc = parseRpc(req.body);
299
+ if (!rpc.ok) {
300
+ return res.status(400).json(rpcError(null, -32600, rpc.message));
301
+ }
302
+ const request = rpc.request;
303
+ if (request.method === "notifications/initialized") {
304
+ return res.status(202).end();
305
+ }
306
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
307
+ const modern = isModernRequest(req, request);
308
+ try {
309
+ switch (request.method) {
310
+ case "server/discover":
311
+ return res.json(rpcResult(request.id, modernDiscoverResult()));
312
+ case "initialize":
313
+ return res.json(rpcResult(request.id, legacyInitializeResult(request.params)));
314
+ case "ping":
315
+ return res.json(rpcResult(request.id, completeResult(modern, {})));
316
+ case "tools/list":
317
+ return res.json(rpcResult(request.id, completeResult(modern, {
318
+ tools: tools.map(publicTool),
319
+ ...(modern
320
+ ? { ttlMs: TOOL_CACHE_TTL_MS, cacheScope: "private" }
321
+ : {}),
322
+ })));
323
+ case "tools/call":
324
+ return handleToolCall(query, request, res, modern);
325
+ default:
326
+ return res.status(404).json(rpcError(request.id, -32601, `Method not found: ${request.method}`));
327
+ }
328
+ }
329
+ catch (error) {
330
+ const message = error instanceof Error ? error.message : "Internal MCP error";
331
+ return res.status(500).json(rpcError(request.id, -32603, message));
332
+ }
333
+ }
334
+ async function handleToolCall(query, request, res, modern) {
335
+ const params = isRecord(request.params) ? request.params : {};
336
+ const name = typeof params.name === "string" ? params.name : "";
337
+ const tool = tools.find((candidate) => candidate.name === name);
338
+ if (!tool) {
339
+ return res.status(400).json(rpcError(request.id, -32602, `Unknown tool: ${name || "(missing name)"}`));
340
+ }
341
+ let input;
342
+ try {
343
+ input = tool.parse(params.arguments ?? {});
344
+ }
345
+ catch (error) {
346
+ const message = error instanceof Error ? error.message : "Invalid tool arguments";
347
+ return res.json(rpcResult(request.id, completeResult(modern, {
348
+ content: [{ type: "text", text: message }],
349
+ isError: true,
350
+ })));
351
+ }
352
+ try {
353
+ const value = await tool.run(query, input);
354
+ console.info(`[HSZRDM MCP] ${tool.name}`);
355
+ return res.json(rpcResult(request.id, completeResult(modern, {
356
+ content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
357
+ structuredContent: value,
358
+ })));
359
+ }
360
+ catch (error) {
361
+ const message = error instanceof Error ? error.message : "Tool execution failed";
362
+ return res.json(rpcResult(request.id, completeResult(modern, {
363
+ content: [{ type: "text", text: message }],
364
+ isError: true,
365
+ })));
366
+ }
367
+ }
368
+ function publicTool(tool) {
369
+ return {
370
+ name: tool.name,
371
+ title: tool.title,
372
+ description: tool.description,
373
+ inputSchema: tool.inputSchema,
374
+ annotations: {
375
+ readOnlyHint: true,
376
+ destructiveHint: false,
377
+ idempotentHint: true,
378
+ openWorldHint: false,
379
+ },
380
+ };
381
+ }
382
+ function modernDiscoverResult() {
383
+ return {
384
+ resultType: "complete",
385
+ supportedVersions: [MODERN_PROTOCOL],
386
+ capabilities: { tools: {} },
387
+ instructions: "Read-only HSZRDM commerce access backed by Medusa. Use tools to inspect orders, products, customers, sales channels, and inventory. No tool can modify store data.",
388
+ ttlMs: TOOL_CACHE_TTL_MS,
389
+ cacheScope: "private",
390
+ _meta: serverMeta(),
391
+ };
392
+ }
393
+ function legacyInitializeResult(params) {
394
+ const requested = isRecord(params) && typeof params.protocolVersion === "string"
395
+ ? params.protocolVersion
396
+ : LEGACY_PROTOCOL;
397
+ const protocolVersion = requested.startsWith("2025-") || requested === "2024-11-05"
398
+ ? requested
399
+ : LEGACY_PROTOCOL;
400
+ return {
401
+ protocolVersion,
402
+ capabilities: { tools: {} },
403
+ serverInfo: { name: SERVER_NAME, version: SERVER_VERSION },
404
+ instructions: "Read-only HSZRDM commerce access backed by Medusa. No tool can create, update, or delete store data.",
405
+ };
406
+ }
407
+ function completeResult(modern, value) {
408
+ if (!modern)
409
+ return value;
410
+ return {
411
+ resultType: "complete",
412
+ ...value,
413
+ _meta: serverMeta(),
414
+ };
415
+ }
416
+ function serverMeta() {
417
+ return {
418
+ "io.modelcontextprotocol/serverInfo": {
419
+ name: SERVER_NAME,
420
+ version: SERVER_VERSION,
421
+ },
422
+ };
423
+ }
424
+ function parseRpc(body) {
425
+ if (!isRecord(body) || body.jsonrpc !== "2.0" || typeof body.method !== "string") {
426
+ return { ok: false, message: "Invalid JSON-RPC request" };
427
+ }
428
+ return {
429
+ ok: true,
430
+ request: {
431
+ id: body.id ?? null,
432
+ method: body.method,
433
+ params: body.params ?? {},
434
+ },
435
+ };
436
+ }
437
+ function isModernRequest(req, request) {
438
+ if (request.method === "server/discover")
439
+ return true;
440
+ if (header(req, "mcp-protocol-version") === MODERN_PROTOCOL)
441
+ return true;
442
+ if (!isRecord(request.params) || !isRecord(request.params._meta))
443
+ return false;
444
+ return request.params._meta["io.modelcontextprotocol/protocolVersion"] === MODERN_PROTOCOL;
445
+ }
446
+ function rpcResult(id, result) {
447
+ return { jsonrpc: "2.0", id, result };
448
+ }
449
+ function rpcError(id, code, message) {
450
+ return {
451
+ jsonrpc: "2.0",
452
+ id,
453
+ error: { code, message },
454
+ };
455
+ }
456
+ function page(limit, offset, order) {
457
+ return {
458
+ take: Math.min(limit ?? DEFAULT_LIMIT, MAX_LIMIT),
459
+ skip: offset ?? 0,
460
+ ...(order ? { order } : {}),
461
+ };
462
+ }
463
+ async function countEntity(query, entity) {
464
+ const result = await query.graph({
465
+ entity,
466
+ fields: ["id"],
467
+ pagination: { take: 1, skip: 0 },
468
+ });
469
+ const count = result.metadata?.count;
470
+ return typeof count === "number" ? count : result.data.length;
471
+ }
472
+ function objectSchema(properties, required = []) {
473
+ return {
474
+ type: "object",
475
+ properties,
476
+ additionalProperties: false,
477
+ ...(required.length ? { required } : {}),
478
+ };
479
+ }
480
+ function integerSchema(minimum, maximum) {
481
+ return {
482
+ type: "integer",
483
+ minimum,
484
+ ...(maximum === undefined ? {} : { maximum }),
485
+ };
486
+ }
487
+ function stringSchema() {
488
+ return { type: "string", minLength: 1 };
489
+ }
490
+ function csv(value) {
491
+ return String(value || "")
492
+ .split(",")
493
+ .map((item) => item.trim())
494
+ .filter(Boolean);
495
+ }
496
+ function header(req, name) {
497
+ const viaGetter = req.get?.(name);
498
+ if (viaGetter)
499
+ return viaGetter;
500
+ const raw = req.headers?.[name] ?? req.headers?.[name.toLowerCase()];
501
+ return Array.isArray(raw) ? String(raw[0] || "") : raw ? String(raw) : undefined;
502
+ }
503
+ function isValidBearerToken(authorization, expected) {
504
+ if (!authorization?.startsWith("Bearer "))
505
+ return false;
506
+ const provided = authorization.slice("Bearer ".length).trim();
507
+ const left = Buffer.from(provided);
508
+ const right = Buffer.from(expected);
509
+ if (left.length !== right.length)
510
+ return false;
511
+ return (0, node_crypto_1.timingSafeEqual)(left, right);
512
+ }
513
+ function consumeRateLimit(req, token) {
514
+ const configured = Number(process.env.HSZRDM_MCP_RATE_LIMIT_PER_MINUTE || DEFAULT_RATE_LIMIT);
515
+ const limit = Number.isFinite(configured) && configured > 0
516
+ ? Math.floor(configured)
517
+ : DEFAULT_RATE_LIMIT;
518
+ const minute = Math.floor(Date.now() / 60_000);
519
+ const forwarded = header(req, "x-forwarded-for")?.split(",")[0]?.trim();
520
+ const key = `${token.slice(0, 12)}:${forwarded || req.ip || "unknown"}`;
521
+ const current = rateLimitBuckets.get(key);
522
+ if (!current || current.minute !== minute) {
523
+ rateLimitBuckets.set(key, { minute, count: 1 });
524
+ pruneRateLimits(minute);
525
+ return true;
526
+ }
527
+ current.count += 1;
528
+ return current.count <= limit;
529
+ }
530
+ function pruneRateLimits(currentMinute) {
531
+ if (rateLimitBuckets.size < 500)
532
+ return;
533
+ for (const [key, value] of rateLimitBuckets) {
534
+ if (value.minute < currentMinute - 1)
535
+ rateLimitBuckets.delete(key);
536
+ }
537
+ }
538
+ function isRecord(value) {
539
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
540
+ }
541
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtbWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvc3RvcmUtbWNwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd1VBLHNEQTRGQztBQXBhRCxxREFBcUU7QUFDckUsNkNBQTZDO0FBQzdDLDZCQUF1QjtBQUV2QixNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUE7QUFDcEMsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFBO0FBQ3BDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQTtBQUNsQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUE7QUFDOUIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFBO0FBQ3hCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQTtBQUNyQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQTtBQUM5QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQTtBQUVqQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFBO0FBK0M3RSxNQUFNLFVBQVUsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFCLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEQsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQzNDLENBQUMsQ0FBQTtBQUVGLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDNUMsQ0FBQyxDQUFBO0FBRUYsTUFBTSxRQUFR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
@@ -2,6 +2,7 @@ type ResolveContainer = {
2
2
  resolve: (key: string) => unknown;
3
3
  };
4
4
  export type TransactionalEmailKind = "order_placed" | "payment_captured" | "fulfillment_created" | "shipment_created" | "order_canceled" | "payment_refunded";
5
+ export declare function transactionalEmailEnabled(kind: TransactionalEmailKind): boolean;
5
6
  export declare function queueOrderLifecycleEmail(input: {
6
7
  container: ResolveContainer;
7
8
  kind: TransactionalEmailKind;
@@ -16,13 +17,19 @@ export declare function queueOrderLifecycleEmail(input: {
16
17
  template?: undefined;
17
18
  } | {
18
19
  skipped: boolean;
19
- reason: "provider-disabled";
20
+ reason: "missing-email";
20
21
  orderId?: undefined;
21
22
  locale?: undefined;
22
23
  template?: undefined;
23
24
  } | {
24
25
  skipped: boolean;
25
- reason: "missing-email";
26
+ orderId: string;
27
+ locale: string;
28
+ template: string;
29
+ reason?: undefined;
30
+ } | {
31
+ skipped: boolean;
32
+ reason: "provider-disabled";
26
33
  orderId?: undefined;
27
34
  locale?: undefined;
28
35
  template?: undefined;
@@ -32,12 +39,6 @@ export declare function queueOrderLifecycleEmail(input: {
32
39
  orderId?: undefined;
33
40
  locale?: undefined;
34
41
  template?: undefined;
35
- } | {
36
- skipped: boolean;
37
- orderId: string;
38
- locale: string;
39
- template: string;
40
- reason?: undefined;
41
42
  }>;
42
43
  export declare function resolveOrderIdForPayment(container: ResolveContainer, paymentId: string): Promise<string | null>;
43
44
  export declare function resolveRefundEmailContexts(container: ResolveContainer, paymentId: string): Promise<{