@hszrdm/core 1.3.0 → 1.5.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 (166) hide show
  1. package/.medusa/server/src/admin/index.js +5572 -3759
  2. package/.medusa/server/src/admin/index.mjs +5572 -3759
  3. package/.medusa/server/src/api/admin/back-in-stock/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/back-in-stock/route.js +70 -0
  5. package/.medusa/server/src/api/admin/customer-activation/route.d.ts +2 -0
  6. package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
  7. package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
  9. package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/order-export/route.js +88 -0
  11. package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
  12. package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
  13. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
  14. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
  15. package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
  17. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
  18. package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
  19. package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
  20. package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
  21. package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
  22. package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
  23. package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
  24. package/.medusa/server/src/api/mcp/route.d.ts +4 -0
  25. package/.medusa/server/src/api/mcp/route.js +19 -0
  26. package/.medusa/server/src/api/middlewares.js +16 -1
  27. package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
  28. package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
  29. package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
  30. package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
  31. package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
  32. package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
  33. package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
  34. package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
  35. package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
  36. package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
  37. package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
  38. package/.medusa/server/src/api/store/review-request/route.js +60 -0
  39. package/.medusa/server/src/config.d.ts +1 -1
  40. package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
  41. package/.medusa/server/src/core/abandoned-cart.js +197 -0
  42. package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
  43. package/.medusa/server/src/core/back-in-stock.js +107 -0
  44. package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
  45. package/.medusa/server/src/core/checkout-contract.js +2 -1
  46. package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
  47. package/.medusa/server/src/core/customer-account-contract.js +4 -1
  48. package/.medusa/server/src/core/customer-activation.d.ts +120 -0
  49. package/.medusa/server/src/core/customer-activation.js +169 -0
  50. package/.medusa/server/src/core/customer-email.d.ts +1 -1
  51. package/.medusa/server/src/core/customer-email.js +4 -1
  52. package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
  53. package/.medusa/server/src/core/native-migration-export.js +105 -0
  54. package/.medusa/server/src/core/order-export.d.ts +11 -0
  55. package/.medusa/server/src/core/order-export.js +297 -0
  56. package/.medusa/server/src/core/review-request.d.ts +61 -0
  57. package/.medusa/server/src/core/review-request.js +105 -0
  58. package/.medusa/server/src/core/review-reward.d.ts +94 -0
  59. package/.medusa/server/src/core/review-reward.js +124 -0
  60. package/.medusa/server/src/core/runtime-health.d.ts +39 -0
  61. package/.medusa/server/src/core/runtime-health.js +250 -0
  62. package/.medusa/server/src/core/store-mcp.d.ts +19 -0
  63. package/.medusa/server/src/core/store-mcp.js +541 -0
  64. package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
  65. package/.medusa/server/src/core/storefront-core-config.js +26 -1
  66. package/.medusa/server/src/core/version.d.ts +2 -2
  67. package/.medusa/server/src/core/version.js +2 -2
  68. package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
  69. package/.medusa/server/src/jobs/abandoned-cart-recovery.js +138 -0
  70. package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
  71. package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
  72. package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
  73. package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
  74. package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
  75. package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
  76. package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
  77. package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
  78. package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
  79. package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
  80. package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
  81. package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
  82. package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
  83. package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
  84. package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
  85. package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
  86. package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
  87. package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
  88. package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
  89. package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
  90. package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
  91. package/.medusa/server/src/localized-config.d.ts +1 -1
  92. package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
  93. package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
  94. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
  95. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
  96. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
  97. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
  98. package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
  99. package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
  100. package/.medusa/server/src/modules/cms/index.d.ts +32 -1
  101. package/.medusa/server/src/modules/core-audit/index.d.ts +18 -1
  102. package/.medusa/server/src/modules/core-audit/writer.d.ts +14 -1
  103. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
  104. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
  105. package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
  106. package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
  107. package/.medusa/server/src/modules/email-center/campaign.d.ts +69 -3
  108. package/.medusa/server/src/modules/email-center/defaults.js +7 -1
  109. package/.medusa/server/src/modules/email-center/index.d.ts +49 -1
  110. package/.medusa/server/src/modules/email-center/index.js +3 -1
  111. package/.medusa/server/src/modules/integration-operation/index.d.ts +18 -1
  112. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
  113. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
  114. package/.medusa/server/src/modules/integration-settings/index.d.ts +19 -1
  115. package/.medusa/server/src/modules/integration-settings/index.js +2 -1
  116. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
  117. package/.medusa/server/src/modules/lead/index.d.ts +18 -1
  118. package/.medusa/server/src/modules/legal-consent/consent.d.ts +4 -4
  119. package/.medusa/server/src/modules/legal-consent/index.d.ts +46 -1
  120. package/.medusa/server/src/modules/newsletter/index.d.ts +18 -1
  121. package/.medusa/server/src/modules/product-review/index.d.ts +32 -1
  122. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
  123. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
  124. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
  125. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
  126. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
  127. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
  128. package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
  129. package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
  130. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
  131. package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
  132. package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
  133. package/.medusa/server/src/modules/product-review/service.js +3 -2
  134. package/.medusa/server/src/modules/quote-request/index.d.ts +18 -1
  135. package/.medusa/server/src/modules/seo/index.d.ts +32 -1
  136. package/.medusa/server/src/modules/webshop-analytics/index.d.ts +18 -1
  137. package/.medusa/server/src/modules/wishlist/index.d.ts +18 -1
  138. package/.medusa/server/src/providers/dpd/index.d.ts +3 -1
  139. package/.medusa/server/src/providers/dpd/index.js +3 -1
  140. package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
  141. package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
  142. package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
  143. package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
  144. package/.medusa/server/src/providers/email/index.d.ts +1 -1
  145. package/.medusa/server/src/providers/foxpost/index.d.ts +1 -1
  146. package/.medusa/server/src/providers/gls/index.d.ts +1 -1
  147. package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
  148. package/.medusa/server/src/providers/mpl/client.js +154 -2
  149. package/.medusa/server/src/providers/mpl/index.d.ts +1 -1
  150. package/.medusa/server/src/providers/mpl/service.js +31 -20
  151. package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
  152. package/.medusa/server/src/providers/mpl/types.js +1 -1
  153. package/.medusa/server/src/providers/packeta/index.d.ts +2 -1
  154. package/.medusa/server/src/providers/packeta/index.js +2 -1
  155. package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
  156. package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
  157. package/.medusa/server/src/providers/packeta/service.js +22 -2
  158. package/.medusa/server/src/providers/resilient-stripe/index.d.ts +1 -1
  159. package/.medusa/server/src/providers/simplepay/index.d.ts +1 -1
  160. package/.medusa/server/src/scripts/core-init.d.ts +1 -1
  161. package/.medusa/server/src/scripts/core-init.js +3 -2
  162. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
  163. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
  164. package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
  165. package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
  166. package/package.json +2 -1
@@ -0,0 +1,94 @@
1
+ type ResolveContainer = {
2
+ resolve: (key: string) => unknown;
3
+ };
4
+ type RewardSettings = {
5
+ reward_enabled?: boolean;
6
+ reward_type?: "percentage" | "fixed";
7
+ reward_value?: number;
8
+ reward_currency_code?: string;
9
+ reward_coupon_expiry_days?: number;
10
+ reward_once_per_order?: boolean;
11
+ reward_email_enabled?: boolean;
12
+ };
13
+ export declare function isSuspiciousReview(body: string): boolean;
14
+ export declare function issuePublishedReviewReward(input: {
15
+ container: ResolveContainer;
16
+ review: Record<string, any>;
17
+ settings: RewardSettings;
18
+ }): Promise<{
19
+ id: any;
20
+ code: any;
21
+ existing: boolean;
22
+ orderReward?: undefined;
23
+ customer?: undefined;
24
+ type?: undefined;
25
+ value?: undefined;
26
+ currency?: undefined;
27
+ expiryDays?: undefined;
28
+ expiresAt?: undefined;
29
+ rewardEmailEnabled?: undefined;
30
+ } | {
31
+ id: any;
32
+ code: any;
33
+ existing: boolean;
34
+ orderReward: boolean;
35
+ customer?: undefined;
36
+ type?: undefined;
37
+ value?: undefined;
38
+ currency?: undefined;
39
+ expiryDays?: undefined;
40
+ expiresAt?: undefined;
41
+ rewardEmailEnabled?: undefined;
42
+ } | {
43
+ id: any;
44
+ code: any;
45
+ customer: any;
46
+ type: string;
47
+ value: number;
48
+ currency: string;
49
+ expiryDays: number;
50
+ expiresAt: any;
51
+ rewardEmailEnabled: boolean;
52
+ existing: boolean;
53
+ orderReward?: undefined;
54
+ } | null>;
55
+ export declare function sendPublishedReviewRewardEmail(input: {
56
+ container: ResolveContainer;
57
+ review: Record<string, any>;
58
+ reward: {
59
+ code: string;
60
+ customer: Record<string, any>;
61
+ type: string;
62
+ value: number;
63
+ currency: string;
64
+ expiryDays?: number;
65
+ expiresAt?: unknown;
66
+ rewardEmailEnabled?: boolean;
67
+ };
68
+ }): Promise<{
69
+ skipped: boolean;
70
+ reason: "missing-email";
71
+ locale?: undefined;
72
+ template?: undefined;
73
+ } | {
74
+ skipped: boolean;
75
+ reason: "disabled";
76
+ locale?: undefined;
77
+ template?: undefined;
78
+ } | {
79
+ skipped: boolean;
80
+ locale: string;
81
+ template: string;
82
+ reason?: undefined;
83
+ } | {
84
+ skipped: boolean;
85
+ reason: "provider-disabled";
86
+ locale?: undefined;
87
+ template?: undefined;
88
+ } | {
89
+ skipped: boolean;
90
+ reason: "missing-template";
91
+ locale?: undefined;
92
+ template?: undefined;
93
+ }>;
94
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSuspiciousReview = isSuspiciousReview;
4
+ exports.issuePublishedReviewReward = issuePublishedReviewReward;
5
+ exports.sendPublishedReviewRewardEmail = sendPublishedReviewRewardEmail;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const customer_email_1 = require("./customer-email");
9
+ const product_review_1 = require("../modules/product-review");
10
+ function isSuspiciousReview(body) {
11
+ const value = body.trim();
12
+ if (value.length < 8)
13
+ return true;
14
+ const links = (value.match(/https?:\/\//gi) || []).length;
15
+ if (links > 1)
16
+ return true;
17
+ if (/(.)\1{7,}/i.test(value))
18
+ return true;
19
+ const words = value.toLowerCase().split(/\s+/).filter(Boolean);
20
+ if (words.length >= 6 && new Set(words).size <= 2)
21
+ return true;
22
+ return false;
23
+ }
24
+ async function issuePublishedReviewReward(input) {
25
+ if (input.review.reward_coupon_code) {
26
+ return { id: input.review.reward_promotion_id || null, code: input.review.reward_coupon_code, existing: true };
27
+ }
28
+ if (input.settings.reward_enabled === false)
29
+ return null;
30
+ if (input.settings.reward_once_per_order !== false && input.review.order_id) {
31
+ const reviewService = input.container.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
32
+ const sameOrder = await reviewService.listProductReviews({ order_id: input.review.order_id, customer_id: input.review.customer_id }, { take: 200 });
33
+ const rewarded = sameOrder.find((review) => review.id !== input.review.id && review.reward_coupon_code);
34
+ if (rewarded) {
35
+ return { id: rewarded.reward_promotion_id || null, code: rewarded.reward_coupon_code, existing: true, orderReward: true };
36
+ }
37
+ }
38
+ const customerService = input.container.resolve(utils_1.Modules.CUSTOMER);
39
+ const promotionService = input.container.resolve(utils_1.Modules.PROMOTION);
40
+ const customer = await customerService.retrieveCustomer(input.review.customer_id);
41
+ if (!customer?.email)
42
+ throw new Error("A kupon kiküldéséhez hiányzik a vevő e-mail címe.");
43
+ const type = input.settings.reward_type === "fixed" ? "fixed" : "percentage";
44
+ const rawValue = Number(input.settings.reward_value ?? (type === "percentage" ? 5 : 2000));
45
+ const value = Number.isFinite(rawValue) && rawValue > 0 ? (type === "percentage" ? Math.min(rawValue, 100) : rawValue) : (type === "percentage" ? 5 : 2000);
46
+ const currency = String(input.settings.reward_currency_code || "huf").trim().toLowerCase() || "huf";
47
+ const rawExpiryDays = Number(input.settings.reward_coupon_expiry_days ?? 30);
48
+ const expiryDays = Number.isFinite(rawExpiryDays) ? Math.max(0, Math.min(3650, Math.trunc(rawExpiryDays))) : 30;
49
+ let campaign = null;
50
+ if (expiryDays > 0) {
51
+ const suffix = (0, node_crypto_1.randomBytes)(6).toString("hex").toUpperCase();
52
+ campaign = await promotionService.createCampaigns({
53
+ name: `Review reward ${input.review.id}`,
54
+ campaign_identifier: `review-reward-${suffix}`,
55
+ description: `Automatikus értékelési jutalom ${input.review.id}`,
56
+ starts_at: new Date(),
57
+ ends_at: new Date(Date.now() + expiryDays * 24 * 60 * 60 * 1000),
58
+ });
59
+ }
60
+ let promotion;
61
+ let lastError;
62
+ for (let attempt = 0; attempt < 3; attempt++) {
63
+ const code = `REVIEW-${(0, node_crypto_1.randomBytes)(5).toString("hex").toUpperCase()}`;
64
+ try {
65
+ promotion = await promotionService.createPromotions({
66
+ code,
67
+ type: "standard",
68
+ status: "active",
69
+ limit: 1,
70
+ ...(campaign?.id ? { campaign_id: campaign.id } : {}),
71
+ application_method: {
72
+ type,
73
+ target_type: "order",
74
+ value,
75
+ ...(type === "fixed" ? { currency_code: currency } : {}),
76
+ },
77
+ rules: [{ attribute: "customer_id", operator: "eq", values: [input.review.customer_id] }],
78
+ });
79
+ break;
80
+ }
81
+ catch (error) {
82
+ lastError = error;
83
+ }
84
+ }
85
+ if (!promotion)
86
+ throw lastError instanceof Error ? lastError : new Error("Az értékelési kupon létrehozása nem sikerült.");
87
+ return {
88
+ id: promotion.id,
89
+ code: promotion.code,
90
+ customer,
91
+ type,
92
+ value,
93
+ currency,
94
+ expiryDays,
95
+ expiresAt: campaign?.ends_at || null,
96
+ rewardEmailEnabled: input.settings.reward_email_enabled !== false,
97
+ existing: false,
98
+ };
99
+ }
100
+ async function sendPublishedReviewRewardEmail(input) {
101
+ if (input.reward.rewardEmailEnabled === false) {
102
+ return { skipped: true, reason: "disabled" };
103
+ }
104
+ return (0, customer_email_1.queueCustomerAccountEmail)({
105
+ container: input.container,
106
+ kind: "review_reward",
107
+ to: input.reward.customer.email,
108
+ resourceId: input.review.customer_id,
109
+ idempotencyKey: `product-review-reward:${input.review.order_id || input.review.id}:${input.reward.code}`,
110
+ data: {
111
+ first_name: input.reward.customer.first_name || "",
112
+ coupon_code: input.reward.code,
113
+ reward_type: input.reward.type,
114
+ reward_value: input.reward.value,
115
+ reward_currency_code: input.reward.currency,
116
+ coupon_expiry_days: input.reward.expiryDays ?? null,
117
+ coupon_expires_at: input.reward.expiresAt ?? null,
118
+ product_id: input.review.product_id,
119
+ review_id: input.review.id,
120
+ order_id: input.review.order_id || null,
121
+ },
122
+ });
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LXJld2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3Jldmlldy1yZXdhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpQkEsZ0RBU0M7QUFFRCxnRUFvRkM7QUFFRCx3RUE0QkM7QUE5SUQsNkNBQXlDO0FBQ3pDLHFEQUFtRDtBQUNuRCxxREFBNEQ7QUFDNUQsOERBQTRGO0FBYzVGLFNBQWdCLGtCQUFrQixDQUFDLElBQVk7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtJQUN6RCxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDMUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUM5RCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFTSxLQUFLLFVBQVUsMEJBQTBCLENBQUMsS0FJaEQ7SUFDQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUNoSCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFeEQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNDQUFxQixDQUF5QixDQUFBO1FBQzVGLE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixDQUN0RCxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQVcsRUFDbkYsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFXLENBQ2tCLENBQUE7UUFDMUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUN2RyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFDM0gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsUUFBUSxDQUFRLENBQUE7SUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFRLENBQUE7SUFDMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNqRixJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUs7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7SUFFMUYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtJQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDMUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNKLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQTtJQUNuRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM1RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRS9HLElBQUksUUFBUSxHQUFRLElBQUksQ0FBQTtJQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFBLHlCQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzNELFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztZQUNoRCxJQUFJLEVBQUUsaUJBQWlCLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQ3hDLG1CQUFtQixFQUFFLGlCQUFpQixNQUFNLEVBQUU7WUFDOUMsV0FBVyxFQUFFLGtDQUFrQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUNoRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ2pFLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxJQUFJLFNBQWMsQ0FBQTtJQUNsQixJQUFJLFNBQWtCLENBQUE7SUFDdEIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBQSx5QkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFBO1FBQ3JFLElBQUksQ0FBQztZQUNILFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO2dCQUNsRCxJQUFJO2dCQUNKLElBQUksRUFBRSxVQUFVO2dCQUNoQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxrQkFBa0IsRUFBRTtvQkFDbEIsSUFBSTtvQkFDSixXQUFXLEVBQUUsT0FBTztvQkFDcEIsS0FBSztvQkFDTCxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDekQ7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2FBQzFGLENBQUMsQ0FBQTtZQUNGLE1BQUs7UUFDUCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFNBQVMsR0FBRyxLQUFLLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsU0FBUztRQUFFLE1BQU0sU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO0lBRXpILE9BQU87UUFDTCxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDaEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1FBQ3BCLFFBQVE7UUFDUixJQUFJO1FBQ0osS0FBSztRQUNMLFFBQVE7UUFDUixVQUFVO1FBQ1YsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLElBQUksSUFBSTtRQUNwQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixLQUFLLEtBQUs7UUFDakUsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQTtBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsOEJBQThCLENBQUMsS0FJcEQ7SUFDQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQW1CLEVBQUUsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxJQUFBLDBDQUF5QixFQUFDO1FBQy9CLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixJQUFJLEVBQUUsZUFBZTtRQUNyQixFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztRQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXO1FBQ3BDLGNBQWMsRUFBRSx5QkFBeUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDeEcsSUFBSSxFQUFFO1lBQ0osVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFO1lBQ2xELFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDOUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSTtZQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ2hDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUMzQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJO1lBQ25ELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUk7WUFDakQsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNuQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQ3hDO0tBQ0YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,39 @@
1
+ export type RuntimeHealthState = "healthy" | "warning" | "error" | "missing";
2
+ type HeartbeatFile = {
3
+ schema_version?: number;
4
+ job?: string;
5
+ schedule?: string;
6
+ last_seen_at?: string;
7
+ pid?: number;
8
+ };
9
+ export type RuntimeHealthReport = {
10
+ generated_at: string;
11
+ project_root: string;
12
+ scheduler: {
13
+ state: RuntimeHealthState;
14
+ schedule: string;
15
+ last_seen_at: string | null;
16
+ age_minutes: number | null;
17
+ stale_after_minutes: number;
18
+ message: string;
19
+ };
20
+ backup: {
21
+ state: RuntimeHealthState;
22
+ last_attempt_status: "running" | "success" | "failed" | "unknown";
23
+ last_attempt_at: string | null;
24
+ last_success_at: string | null;
25
+ age_hours: number | null;
26
+ stale_after_hours: number;
27
+ bundle_name: string | null;
28
+ size_bytes: number | null;
29
+ database_dump: boolean;
30
+ manifest_ok: boolean;
31
+ error: string | null;
32
+ message: string;
33
+ };
34
+ };
35
+ export declare function resolveRuntimeProjectRoot(env?: NodeJS.ProcessEnv): string;
36
+ export declare function runtimeStateDirectory(env?: NodeJS.ProcessEnv): string;
37
+ export declare function writeRuntimeHeartbeat(env?: NodeJS.ProcessEnv): HeartbeatFile;
38
+ export declare function collectRuntimeHealth(env?: NodeJS.ProcessEnv, now?: Date): RuntimeHealthReport;
39
+ export {};
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveRuntimeProjectRoot = resolveRuntimeProjectRoot;
4
+ exports.runtimeStateDirectory = runtimeStateDirectory;
5
+ exports.writeRuntimeHeartbeat = writeRuntimeHeartbeat;
6
+ exports.collectRuntimeHealth = collectRuntimeHealth;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const HEARTBEAT_SCHEDULE = "*/5 * * * *";
10
+ const DEFAULT_HEARTBEAT_STALE_MINUTES = 15;
11
+ const DEFAULT_BACKUP_STALE_HOURS = 30;
12
+ function resolveRuntimeProjectRoot(env = process.env) {
13
+ const configured = String(env.CORE_PROJECT_DIR || "").trim();
14
+ if (configured)
15
+ return (0, node_path_1.resolve)(configured);
16
+ const candidates = ancestorPaths((0, node_path_1.resolve)(process.cwd()), 6);
17
+ // Prefer the operational backup script. In the monorepo this resolves to the
18
+ // repository root; in generated projects the script lives in backend/scripts,
19
+ // so it resolves to the backend runtime root. Backup status and heartbeat then
20
+ // always share the same .core directory.
21
+ const operationalRoot = candidates.find((candidate) => (0, node_fs_1.existsSync)((0, node_path_1.join)(candidate, "scripts", "core-backup.mjs")));
22
+ if (operationalRoot)
23
+ return operationalRoot;
24
+ const bootstrapRoot = candidates.find((candidate) => (0, node_fs_1.existsSync)((0, node_path_1.join)(candidate, ".core", "webshop-bootstrap.json")));
25
+ return bootstrapRoot || (0, node_path_1.resolve)(process.cwd());
26
+ }
27
+ function runtimeStateDirectory(env = process.env) {
28
+ const root = resolveRuntimeProjectRoot(env);
29
+ const configured = String(env.CORE_RUNTIME_STATE_DIR || "").trim();
30
+ if (!configured)
31
+ return (0, node_path_1.join)(root, ".core");
32
+ return (0, node_path_1.isAbsolute)(configured) ? configured : (0, node_path_1.resolve)(root, configured);
33
+ }
34
+ function writeRuntimeHeartbeat(env = process.env) {
35
+ const stateDir = runtimeStateDirectory(env);
36
+ const path = (0, node_path_1.join)(stateDir, "runtime-heartbeat.json");
37
+ const payload = {
38
+ schema_version: 1,
39
+ job: "runtime-heartbeat",
40
+ schedule: HEARTBEAT_SCHEDULE,
41
+ last_seen_at: new Date().toISOString(),
42
+ pid: process.pid,
43
+ };
44
+ writeJsonAtomic(path, payload);
45
+ return payload;
46
+ }
47
+ function collectRuntimeHealth(env = process.env, now = new Date()) {
48
+ const projectRoot = resolveRuntimeProjectRoot(env);
49
+ const stateDir = runtimeStateDirectory(env);
50
+ const heartbeatStaleMinutes = positiveNumber(env.CORE_CRON_HEARTBEAT_STALE_MINUTES, DEFAULT_HEARTBEAT_STALE_MINUTES);
51
+ const backupStaleHours = positiveNumber(env.CORE_BACKUP_STALE_HOURS, DEFAULT_BACKUP_STALE_HOURS);
52
+ const heartbeat = readJson((0, node_path_1.join)(stateDir, "runtime-heartbeat.json"));
53
+ const heartbeatAt = validDate(heartbeat?.last_seen_at);
54
+ const heartbeatAge = heartbeatAt
55
+ ? Math.max(0, (now.getTime() - heartbeatAt.getTime()) / 60_000)
56
+ : null;
57
+ const schedulerState = !heartbeatAt
58
+ ? "missing"
59
+ : heartbeatAge > heartbeatStaleMinutes
60
+ ? "error"
61
+ : "healthy";
62
+ const backupStatus = readJson((0, node_path_1.join)(stateDir, "backup-status.json"));
63
+ const backupRoot = resolveConfiguredPath(projectRoot, env.CORE_BACKUP_DIR, "backups");
64
+ const latestManifest = findLatestBackupManifest(backupRoot);
65
+ const statusSuccessAt = validDate(backupStatus?.status === "success"
66
+ ? backupStatus.created_at || backupStatus.finished_at
67
+ : undefined);
68
+ const manifestSuccessAt = validDate(latestManifest?.manifest.created_at);
69
+ const useStatusSuccess = Boolean(statusSuccessAt &&
70
+ (!manifestSuccessAt || statusSuccessAt.getTime() >= manifestSuccessAt.getTime()));
71
+ const successAt = useStatusSuccess ? statusSuccessAt : manifestSuccessAt;
72
+ const statusBundleDir = String(backupStatus?.bundle_dir || "").trim();
73
+ const latestBundleDir = useStatusSuccess && statusBundleDir
74
+ ? resolveConfiguredPath(projectRoot, statusBundleDir, statusBundleDir)
75
+ : latestManifest?.bundleDir || null;
76
+ const databaseDump = latestBundleDir
77
+ ? (0, node_fs_1.existsSync)((0, node_path_1.join)(latestBundleDir, "database.dump"))
78
+ : Boolean(backupStatus?.database_dump);
79
+ const manifestOk = latestBundleDir
80
+ ? (0, node_fs_1.existsSync)((0, node_path_1.join)(latestBundleDir, "manifest.json"))
81
+ : Boolean(latestManifest);
82
+ const backupAge = successAt
83
+ ? Math.max(0, (now.getTime() - successAt.getTime()) / 3_600_000)
84
+ : null;
85
+ const lastAttemptAt = validDate(backupStatus?.finished_at || backupStatus?.started_at);
86
+ const lastAttemptStatus = backupStatus?.status === "running" ||
87
+ backupStatus?.status === "success" ||
88
+ backupStatus?.status === "failed"
89
+ ? backupStatus.status
90
+ : "unknown";
91
+ let backupState = "healthy";
92
+ let backupMessage = "A legutóbbi backup rendben van.";
93
+ if (lastAttemptStatus === "failed") {
94
+ backupState = "error";
95
+ backupMessage = "A legutóbbi backup futás hibával leállt.";
96
+ }
97
+ else if (!successAt) {
98
+ backupState = "missing";
99
+ backupMessage = "Nem található sikeres backup.";
100
+ }
101
+ else if (!databaseDump || !manifestOk) {
102
+ backupState = "error";
103
+ backupMessage = "A legutóbbi backup hiányos: DB dump vagy manifest hiányzik.";
104
+ }
105
+ else if (backupAge > backupStaleHours) {
106
+ backupState = "warning";
107
+ backupMessage = `A legutóbbi sikeres backup ${Math.floor(backupAge)} órás.`;
108
+ }
109
+ else if (lastAttemptStatus === "running") {
110
+ backupState = "warning";
111
+ backupMessage = "Backup futás van folyamatban.";
112
+ }
113
+ const sizeBytes = useStatusSuccess && Number.isFinite(backupStatus?.size_bytes)
114
+ ? Number(backupStatus?.size_bytes)
115
+ : latestBundleDir
116
+ ? directorySize(latestBundleDir)
117
+ : null;
118
+ return {
119
+ generated_at: now.toISOString(),
120
+ project_root: projectRoot,
121
+ scheduler: {
122
+ state: schedulerState,
123
+ schedule: heartbeat?.schedule || HEARTBEAT_SCHEDULE,
124
+ last_seen_at: heartbeatAt?.toISOString() || null,
125
+ age_minutes: heartbeatAge == null ? null : round(heartbeatAge, 1),
126
+ stale_after_minutes: heartbeatStaleMinutes,
127
+ message: schedulerState === "healthy"
128
+ ? "A Medusa scheduled-job futtató aktív."
129
+ : schedulerState === "missing"
130
+ ? "Még nincs scheduler heartbeat."
131
+ : `A scheduler heartbeat több mint ${heartbeatStaleMinutes} perce nem frissült.`,
132
+ },
133
+ backup: {
134
+ state: backupState,
135
+ last_attempt_status: lastAttemptStatus,
136
+ last_attempt_at: lastAttemptAt?.toISOString() || null,
137
+ last_success_at: successAt?.toISOString() || null,
138
+ age_hours: backupAge == null ? null : round(backupAge, 1),
139
+ stale_after_hours: backupStaleHours,
140
+ bundle_name: useStatusSuccess && backupStatus?.bundle_name
141
+ ? backupStatus.bundle_name
142
+ : latestManifest?.bundleName || null,
143
+ size_bytes: sizeBytes,
144
+ database_dump: databaseDump,
145
+ manifest_ok: manifestOk,
146
+ error: backupStatus?.status === "failed"
147
+ ? String(backupStatus.error || "Ismeretlen backup hiba")
148
+ : null,
149
+ message: backupMessage,
150
+ },
151
+ };
152
+ }
153
+ function findLatestBackupManifest(root) {
154
+ if (!(0, node_fs_1.existsSync)(root))
155
+ return null;
156
+ let latest = null;
157
+ for (const entry of safeDirectories(root)) {
158
+ const bundleDir = (0, node_path_1.join)(root, entry);
159
+ const manifest = readJson((0, node_path_1.join)(bundleDir, "manifest.json"));
160
+ const created = validDate(manifest?.created_at);
161
+ if (!manifest || !created)
162
+ continue;
163
+ if (!latest || created.getTime() > latest.createdAt) {
164
+ latest = {
165
+ bundleDir,
166
+ bundleName: entry,
167
+ manifest,
168
+ createdAt: created.getTime(),
169
+ };
170
+ }
171
+ }
172
+ return latest;
173
+ }
174
+ function safeDirectories(root) {
175
+ try {
176
+ return (0, node_fs_1.readdirSync)(root, { withFileTypes: true })
177
+ .filter((entry) => entry.isDirectory())
178
+ .map((entry) => entry.name);
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ function directorySize(path) {
185
+ try {
186
+ const stat = (0, node_fs_1.statSync)(path);
187
+ if (stat.isFile())
188
+ return stat.size;
189
+ if (!stat.isDirectory())
190
+ return 0;
191
+ let total = 0;
192
+ for (const entry of (0, node_fs_1.readdirSync)(path)) {
193
+ const size = directorySize((0, node_path_1.join)(path, entry));
194
+ if (size != null)
195
+ total += size;
196
+ }
197
+ return total;
198
+ }
199
+ catch {
200
+ return null;
201
+ }
202
+ }
203
+ function readJson(path) {
204
+ try {
205
+ return JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ function writeJsonAtomic(path, value) {
212
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
213
+ const temp = `${path}.${process.pid}.tmp`;
214
+ (0, node_fs_1.writeFileSync)(temp, `${JSON.stringify(value, null, 2)}\n`, {
215
+ encoding: "utf8",
216
+ mode: 0o600,
217
+ });
218
+ (0, node_fs_1.renameSync)(temp, path);
219
+ }
220
+ function resolveConfiguredPath(root, value, fallback) {
221
+ const raw = String(value || fallback).trim();
222
+ return (0, node_path_1.isAbsolute)(raw) ? raw : (0, node_path_1.resolve)(root, raw);
223
+ }
224
+ function ancestorPaths(start, maxDepth) {
225
+ const result = [];
226
+ let current = start;
227
+ for (let depth = 0; depth <= maxDepth; depth++) {
228
+ result.push(current);
229
+ const parent = (0, node_path_1.dirname)(current);
230
+ if (parent === current)
231
+ break;
232
+ current = parent;
233
+ }
234
+ return result;
235
+ }
236
+ function validDate(value) {
237
+ if (!value)
238
+ return null;
239
+ const date = new Date(String(value));
240
+ return Number.isNaN(date.getTime()) ? null : date;
241
+ }
242
+ function positiveNumber(value, fallback) {
243
+ const number = Number(value);
244
+ return Number.isFinite(number) && number > 0 ? number : fallback;
245
+ }
246
+ function round(value, decimals) {
247
+ const multiplier = 10 ** decimals;
248
+ return Math.round(value * multiplier) / multiplier;
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1oZWFsdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLWhlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVFQSw4REFtQkM7QUFFRCxzREFLQztBQUVELHNEQVlDO0FBRUQsb0RBcUlDO0FBdFBELHFDQVFnQjtBQUNoQix5Q0FBOEQ7QUEwRDlELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQ3hDLE1BQU0sK0JBQStCLEdBQUcsRUFBRSxDQUFBO0FBQzFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFBO0FBRXJDLFNBQWdCLHlCQUF5QixDQUFDLE1BQXlCLE9BQU8sQ0FBQyxHQUFHO0lBQzVFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUQsSUFBSSxVQUFVO1FBQUUsT0FBTyxJQUFBLG1CQUFPLEVBQUMsVUFBVSxDQUFDLENBQUE7SUFFMUMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUEsbUJBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUUzRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSx5Q0FBeUM7SUFDekMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ3BELElBQUEsb0JBQVUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQzFELENBQUE7SUFDRCxJQUFJLGVBQWU7UUFBRSxPQUFPLGVBQWUsQ0FBQTtJQUUzQyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDbEQsSUFBQSxvQkFBVSxFQUFD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
@@ -0,0 +1,19 @@
1
+ type ScopeLike = {
2
+ resolve: (key: unknown) => unknown;
3
+ };
4
+ export type StoreMcpRequest = {
5
+ scope: ScopeLike;
6
+ headers: Record<string, unknown>;
7
+ body?: unknown;
8
+ method?: string;
9
+ ip?: string;
10
+ get?: (name: string) => string | undefined;
11
+ };
12
+ export type StoreMcpResponse = {
13
+ status: (code: number) => StoreMcpResponse;
14
+ json: (body: unknown) => unknown;
15
+ end: () => unknown;
16
+ setHeader: (name: string, value: string) => void;
17
+ };
18
+ export declare function handleStoreMcpRequest(req: StoreMcpRequest, res: StoreMcpResponse): Promise<unknown>;
19
+ export {};