@unchainedshop/api 5.0.0-alpha.1 → 5.0.0-alpha.3

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 (117) hide show
  1. package/README.md +6 -4
  2. package/lib/adminUiPlugins.d.ts +73 -0
  3. package/lib/adminUiPlugins.js +164 -0
  4. package/lib/adminUiTheme.d.ts +25 -0
  5. package/lib/adminUiTheme.js +34 -0
  6. package/lib/chat/generateImageHandler.d.ts +273 -7
  7. package/lib/chat/utils.d.ts +8 -0
  8. package/lib/chat/utils.js +54 -2
  9. package/lib/createGraphQLServer.js +6 -0
  10. package/lib/express/chatHandler.js +52 -61
  11. package/lib/express/createMCPMiddleware.js +19 -78
  12. package/lib/express/index.d.ts +8 -2
  13. package/lib/express/index.js +55 -7
  14. package/lib/fastify/chatHandler.js +52 -61
  15. package/lib/fastify/index.d.ts +7 -1
  16. package/lib/fastify/index.js +58 -11
  17. package/lib/fastify/mcpHandler.js +24 -75
  18. package/lib/loaders/cartLoader.d.ts +13 -0
  19. package/lib/loaders/cartLoader.js +8 -0
  20. package/lib/loaders/enrollmentByOrderLoader.d.ts +9 -0
  21. package/lib/loaders/enrollmentByOrderLoader.js +17 -0
  22. package/lib/loaders/index.d.ts +14 -0
  23. package/lib/loaders/index.js +4 -0
  24. package/lib/loaders/orderDeliveryLoader.d.ts +9 -0
  25. package/lib/loaders/orderDeliveryLoader.js +12 -0
  26. package/lib/loaders/orderDiscountsLoader.d.ts +9 -0
  27. package/lib/loaders/orderDiscountsLoader.js +17 -0
  28. package/lib/loaders/orderPaymentLoader.d.ts +9 -0
  29. package/lib/loaders/orderPaymentLoader.js +12 -0
  30. package/lib/loaders/orderPositionsLoader.d.ts +9 -0
  31. package/lib/loaders/orderPositionsLoader.js +17 -0
  32. package/lib/loaders/tokenExportStatusLoader.d.ts +9 -0
  33. package/lib/loaders/tokenExportStatusLoader.js +31 -0
  34. package/lib/locale-context.d.ts +2 -4
  35. package/lib/locale-context.js +2 -1
  36. package/lib/mcp/handleMcpHttpRequest.d.ts +2 -0
  37. package/lib/mcp/handleMcpHttpRequest.js +83 -0
  38. package/lib/mcp/index.d.ts +1 -1
  39. package/lib/mcp/nodeHttpBridge.d.ts +3 -0
  40. package/lib/mcp/nodeHttpBridge.js +64 -0
  41. package/lib/mcp/resources/localization.d.ts +5 -1
  42. package/lib/mcp/resources/localization.js +93 -69
  43. package/lib/mcp/tools/assortment/handlers/getAssortment.js +1 -1
  44. package/lib/mcp/tools/assortment/index.d.ts +1 -1
  45. package/lib/mcp/tools/assortment/index.js +4 -1
  46. package/lib/mcp/tools/assortment/schemas.d.ts +2 -2
  47. package/lib/mcp/tools/filter/handlers/createFilter.js +2 -4
  48. package/lib/mcp/tools/filter/handlers/createFilterOption.js +2 -4
  49. package/lib/mcp/tools/filter/handlers/removeFilterOption.js +2 -4
  50. package/lib/mcp/tools/filter/handlers/updateFilter.js +2 -2
  51. package/lib/mcp/tools/filter/index.d.ts +1 -1
  52. package/lib/mcp/tools/filter/index.js +4 -1
  53. package/lib/mcp/tools/filter/schemas.d.ts +2 -2
  54. package/lib/mcp/tools/localization/index.d.ts +1 -1
  55. package/lib/mcp/tools/localization/index.js +4 -1
  56. package/lib/mcp/tools/localization/schemas.d.ts +2 -2
  57. package/lib/mcp/tools/order/index.d.ts +1 -1
  58. package/lib/mcp/tools/order/index.js +4 -1
  59. package/lib/mcp/tools/order/schemas.d.ts +2 -2
  60. package/lib/mcp/tools/product/handlers/getProduct.js +1 -1
  61. package/lib/mcp/tools/product/index.d.ts +1 -1
  62. package/lib/mcp/tools/product/index.js +4 -1
  63. package/lib/mcp/tools/product/schemas.d.ts +7 -7
  64. package/lib/mcp/tools/product/schemas.js +3 -2
  65. package/lib/mcp/tools/provider/index.d.ts +1 -1
  66. package/lib/mcp/tools/provider/index.js +4 -1
  67. package/lib/mcp/tools/provider/schemas.d.ts +2 -2
  68. package/lib/mcp/tools/quotation/index.d.ts +1 -1
  69. package/lib/mcp/tools/quotation/index.js +4 -1
  70. package/lib/mcp/tools/quotation/schemas.d.ts +2 -2
  71. package/lib/mcp/tools/system/index.d.ts +1 -1
  72. package/lib/mcp/tools/system/index.js +4 -1
  73. package/lib/mcp/tools/users/index.d.ts +1 -1
  74. package/lib/mcp/tools/users/index.js +4 -1
  75. package/lib/mcp/tools/users/schemas.d.ts +2 -2
  76. package/lib/mcp/utils/sharedSchemas.d.ts +1 -0
  77. package/lib/mcp/utils/sharedSchemas.js +1 -0
  78. package/lib/middleware/createAuthMiddleware.js +1 -3
  79. package/lib/resolvers/index.js +2 -1
  80. package/lib/resolvers/mutations/bookmarks/createBookmark.d.ts +1 -1
  81. package/lib/resolvers/mutations/bookmarks/createBookmark.js +4 -3
  82. package/lib/resolvers/mutations/filters/createFilter.js +3 -4
  83. package/lib/resolvers/mutations/filters/createFilterOption.d.ts +1 -1
  84. package/lib/resolvers/mutations/filters/createFilterOption.js +3 -4
  85. package/lib/resolvers/mutations/filters/removeFilterOption.d.ts +1 -1
  86. package/lib/resolvers/mutations/filters/removeFilterOption.js +2 -8
  87. package/lib/resolvers/mutations/filters/updateFilter.d.ts +1 -1
  88. package/lib/resolvers/mutations/filters/updateFilter.js +2 -5
  89. package/lib/resolvers/mutations/index.js +3 -3
  90. package/lib/resolvers/mutations/products/updateProductCommerce.js +10 -1
  91. package/lib/resolvers/scalars/LowerCaseString.d.ts +1 -1
  92. package/lib/resolvers/scalars/index.d.ts +1 -1
  93. package/lib/resolvers/type/filter/loaded-filter-types.d.ts +1 -1
  94. package/lib/resolvers/type/filter/loaded-filter-types.js +1 -1
  95. package/lib/resolvers/type/index.d.ts +12 -8
  96. package/lib/resolvers/type/product/product-bundle-types.d.ts +1 -1
  97. package/lib/resolvers/type/product/product-plan-types.d.ts +1 -1
  98. package/lib/resolvers/type/product/product-simple-types.d.ts +1 -1
  99. package/lib/resolvers/type/product/product-tokenized-types.d.ts +1 -1
  100. package/lib/resolvers/type/quotation-types.d.ts +4 -0
  101. package/lib/resolvers/type/quotation-types.js +1 -0
  102. package/lib/resolvers/type/token-types.d.ts +3 -3
  103. package/lib/resolvers/type/token-types.js +6 -5
  104. package/lib/resolvers/type/user-types.d.ts +1 -1
  105. package/lib/resolvers/type/user-types.js +2 -2
  106. package/lib/roles/all.js +1 -1
  107. package/lib/roles/index.js +2 -0
  108. package/lib/roles/loggedIn.js +11 -0
  109. package/lib/schema/inputTypes.js +3 -3
  110. package/lib/schema/scalars.js +1 -0
  111. package/lib/schema/types/filter.js +2 -2
  112. package/lib/schema/types/product/product.js +1 -1
  113. package/lib/schema/types/quotation.js +5 -0
  114. package/lib/schema/types/user.js +1 -1
  115. package/lib/utils/optionalPeerError.d.ts +1 -0
  116. package/lib/utils/optionalPeerError.js +6 -0
  117. package/package.json +39 -15
@@ -15,7 +15,7 @@ export declare const BundleProduct: {
15
15
  currencyCode?: string;
16
16
  }, requestContext: import("../../../context.ts").Context): Promise<{
17
17
  minQuantity: number;
18
- maxQuantity: number;
18
+ maxQuantity: number | null;
19
19
  price: import("@unchainedshop/core-products").ProductPrice;
20
20
  }[]>;
21
21
  salesUnit({ commerce }: import("@unchainedshop/core-products").Product): string | null;
@@ -15,7 +15,7 @@ export declare const PlanProduct: {
15
15
  currencyCode?: string;
16
16
  }, requestContext: Context): Promise<{
17
17
  minQuantity: number;
18
- maxQuantity: number;
18
+ maxQuantity: number | null;
19
19
  price: ProductPrice;
20
20
  }[]>;
21
21
  salesUnit({ commerce }: ProductType): string | null;
@@ -45,7 +45,7 @@ export declare const SimpleProduct: {
45
45
  currencyCode?: string;
46
46
  }, requestContext: Context): Promise<{
47
47
  minQuantity: number;
48
- maxQuantity: number;
48
+ maxQuantity: number | null;
49
49
  price: import("@unchainedshop/core-products").ProductPrice;
50
50
  }[]>;
51
51
  salesUnit({ commerce }: Product): string | null;
@@ -29,7 +29,7 @@ export declare const TokenizedProduct: {
29
29
  currencyCode?: string;
30
30
  }, requestContext: Context): Promise<{
31
31
  minQuantity: number;
32
- maxQuantity: number;
32
+ maxQuantity: number | null;
33
33
  price: import("@unchainedshop/core-products").ProductPrice;
34
34
  }[]>;
35
35
  salesUnit({ commerce }: Product): string | null;
@@ -6,6 +6,10 @@ export declare const Quotation: {
6
6
  isExpired: (obj: QuotationType, { referenceDate }: {
7
7
  referenceDate: Date;
8
8
  }, { modules }: Context) => boolean;
9
+ price: (obj: QuotationType) => {
10
+ amount: number;
11
+ currencyCode: string;
12
+ } | null;
9
13
  product: (obj: QuotationType, _: never, { loaders }: Context) => Promise<import("@unchainedshop/core-products").Product>;
10
14
  status: (obj: QuotationType, _: never, { modules }: Context) => import("@unchainedshop/core-quotations").QuotationStatus;
11
15
  user: (obj: QuotationType, _: never, { loaders }: Context) => Promise<import("@unchainedshop/core-users").User>;
@@ -2,6 +2,7 @@ export const Quotation = {
2
2
  country: async (obj, _, { loaders }) => obj.countryCode ? loaders.countryLoader.load({ isoCode: obj.countryCode }) : null,
3
3
  currency: async (obj, _, { loaders }) => obj.currencyCode ? loaders.currencyLoader.load({ isoCode: obj.currencyCode }) : null,
4
4
  isExpired: (obj, { referenceDate }, { modules }) => modules.quotations.isExpired(obj, { referenceDate }),
5
+ price: (obj) => obj.price != null && obj.currencyCode ? { amount: obj.price, currencyCode: obj.currencyCode } : null,
5
6
  product: async (obj, _, { loaders }) => {
6
7
  const product = await loaders.productLoader.load({
7
8
  productId: obj.productId,
@@ -3,10 +3,10 @@ import type { TokenSurrogate } from '@unchainedshop/core-warehousing';
3
3
  export declare const Token: {
4
4
  product: (token: TokenSurrogate, params: never, { loaders }: Context) => Promise<import("@unchainedshop/core-products").Product>;
5
5
  user: (token: TokenSurrogate, params: never, { loaders }: Context) => Promise<import("@unchainedshop/core-users").User | null>;
6
- status: (token: TokenSurrogate, params: never, { services }: Context) => Promise<import("@unchainedshop/core-warehousing").TokenStatus>;
6
+ status: (token: TokenSurrogate, params: never, { loaders }: Context) => Promise<import("@unchainedshop/core-warehousing").TokenStatus>;
7
7
  ercMetadata: (token: TokenSurrogate, { forceLocale }: {
8
8
  forceLocale: string;
9
9
  }, context: Context) => Promise<any>;
10
- isInvalidateable: (token: TokenSurrogate, _params: never, { services }: Context) => Promise<boolean>;
11
- accessKey: (token: TokenSurrogate, params: never, requestContext: Context) => Promise<string | null>;
10
+ isInvalidateable: (token: TokenSurrogate, _params: never, { loaders, services }: Context) => Promise<boolean>;
11
+ accessKey: (token: TokenSurrogate, params: never, requestContext: Context) => Promise<string>;
12
12
  };
@@ -9,8 +9,8 @@ export const Token = {
9
9
  return null;
10
10
  return loaders.userLoader.load({ userId: token.userId });
11
11
  },
12
- status: async (token, params, { services }) => {
13
- return services.warehousing.resolveTokenStatus({ token });
12
+ status: async (token, params, { loaders }) => {
13
+ return loaders.tokenExportStatusLoader.load({ token });
14
14
  },
15
15
  ercMetadata: async (token, { forceLocale }, context) => {
16
16
  const { loaders, services } = context;
@@ -21,12 +21,13 @@ export const Token = {
21
21
  locale: forceLocale ? new Intl.Locale(forceLocale) : context.locale,
22
22
  });
23
23
  },
24
- isInvalidateable: async (token, _params, { services }) => {
25
- return services.warehousing.isTokenInvalidateable({ token });
24
+ isInvalidateable: async (token, _params, { loaders, services }) => {
25
+ const product = await loaders.productLoader.load({ productId: token.productId });
26
+ return services.warehousing.isTokenInvalidateable({ token, product });
26
27
  },
27
28
  accessKey: async (token, params, requestContext) => {
28
29
  const { modules } = requestContext;
29
30
  await checkAction(requestContext, actions.updateToken, [undefined, { tokenId: token._id }]);
30
- return modules.warehousing.buildAccessKeyForToken(token._id);
31
+ return modules.warehousing.buildAccessKeyFromToken(token);
31
32
  },
32
33
  };
@@ -20,7 +20,7 @@ export interface PushSubscription {
20
20
  }
21
21
  export interface Web3Address {
22
22
  address: string;
23
- nonce?: number;
23
+ nonce?: string;
24
24
  verified: boolean;
25
25
  }
26
26
  export interface WebAuthnCredentials {
@@ -49,9 +49,9 @@ export const User = {
49
49
  return context.modules.bookmarks.findBookmarksByUserId(user._id);
50
50
  },
51
51
  async cart(user, params, context) {
52
- const { modules, countryCode } = context;
52
+ const { loaders, countryCode } = context;
53
53
  await checkAction(context, viewUserOrders, [user, params]);
54
- return modules.orders.cart({
54
+ return loaders.cartLoader.load({
55
55
  countryCode,
56
56
  orderNumber: params.orderNumber,
57
57
  userId: user._id,
package/lib/roles/all.js CHANGED
@@ -20,7 +20,7 @@ export const all = (role, actions) => {
20
20
  if (isOwnedByUser)
21
21
  return true;
22
22
  const accessKeyHeader = context.getHeader('x-token-accesskey');
23
- const accessKey = await context.modules.warehousing.buildAccessKeyForToken(tokenId);
23
+ const accessKey = await context.modules.warehousing.buildAccessKeyFromToken(token);
24
24
  if (accessKeyHeader && accessKey && (await timingSafeStringEqual(accessKeyHeader, accessKey)))
25
25
  return true;
26
26
  return false;
@@ -60,6 +60,7 @@ const actions = [
60
60
  'createEnrollment',
61
61
  'updateEnrollment',
62
62
  'updateCart',
63
+ 'addCartQuotation',
63
64
  'checkoutCart',
64
65
  'updateOrder',
65
66
  'updateOrderDelivery',
@@ -84,6 +85,7 @@ const actions = [
84
85
  'manageQuotations',
85
86
  'answerQuotation',
86
87
  'bookmarkProduct',
88
+ 'createBookmark',
87
89
  'manageBookmarks',
88
90
  'search',
89
91
  'manageWorker',
@@ -116,6 +116,14 @@ export const loggedIn = (role, actions) => {
116
116
  return true;
117
117
  return bookmark.userId === userId;
118
118
  };
119
+ const isOwnBookmarkUser = (obj, { userId: bookmarkUserId }, { userId }) => {
120
+ return !bookmarkUserId || bookmarkUserId === userId;
121
+ };
122
+ const isOwnedCartAndQuotation = async (obj, params, context) => {
123
+ if (!(await isOwnedOrderOrCart(obj, params, context)))
124
+ return false;
125
+ return isOwnedQuotation(obj, params, context);
126
+ };
119
127
  const isOwnedPaymentCredential = async (obj, { paymentCredentialsId }, { modules, userId }) => {
120
128
  const credentials = await modules.payment.paymentCredentials.findPaymentCredential({
121
129
  paymentCredentialsId,
@@ -155,6 +163,7 @@ export const loggedIn = (role, actions) => {
155
163
  role.allow(actions.updateOrderPayment, isOwnedOrderPayment);
156
164
  role.allow(actions.checkoutCart, isOwnedOrderOrCart);
157
165
  role.allow(actions.updateCart, isOwnedOrderOrCart);
166
+ role.allow(actions.addCartQuotation, isOwnedCartAndQuotation);
158
167
  role.allow(actions.createCart, () => true);
159
168
  role.allow(actions.viewEnrollment, isOwnedEnrollment);
160
169
  role.allow(actions.updateEnrollment, isOwnedEnrollment);
@@ -163,7 +172,9 @@ export const loggedIn = (role, actions) => {
163
172
  role.allow(actions.updateProductReview, isOwnedProductReview);
164
173
  role.allow(actions.requestQuotation, () => true);
165
174
  role.allow(actions.answerQuotation, isOwnedQuotation);
175
+ role.allow(actions.viewQuotation, isOwnedQuotation);
166
176
  role.allow(actions.manageBookmarks, isOwnedBookmark);
177
+ role.allow(actions.createBookmark, isOwnBookmarkUser);
167
178
  role.allow(actions.bookmarkProduct, () => true);
168
179
  role.allow(actions.voteProductReview, () => true);
169
180
  role.allow(actions.registerPaymentCredentials, () => true);
@@ -8,7 +8,7 @@ export default [
8
8
  input UserProfileInput {
9
9
  displayName: String
10
10
  birthday: Timestamp
11
- phoneMobile: String
11
+ phoneMobile: PhoneNumber
12
12
  gender: String
13
13
  address: AddressInput
14
14
  }
@@ -27,7 +27,7 @@ export default [
27
27
 
28
28
  input ContactInput {
29
29
  emailAddress: String
30
- telNumber: String
30
+ telNumber: PhoneNumber
31
31
  }
32
32
 
33
33
  input CreateLanguageInput {
@@ -105,7 +105,7 @@ export default [
105
105
 
106
106
  input UpdateProductCommercePricingInput {
107
107
  amount: Int!
108
- maxQuantity: Int
108
+ minQuantity: Int
109
109
  isTaxable: Boolean
110
110
  isNetPrice: Boolean
111
111
  currencyCode: String!
@@ -6,5 +6,6 @@ export default [
6
6
  scalar Timestamp
7
7
  scalar LowerCaseString
8
8
  scalar Locale
9
+ scalar PhoneNumber
9
10
  `,
10
11
  ];
@@ -49,14 +49,14 @@ export default [
49
49
  type LoadedFilterOption @cacheControl(maxAge: 180) {
50
50
  filteredProductsCount: Int!
51
51
  definition: FilterOption!
52
- isSelected: Boolean
52
+ isSelected: Boolean!
53
53
  }
54
54
 
55
55
  type LoadedFilter @cacheControl(maxAge: 180) {
56
56
  productsCount: Int!
57
57
  filteredProductsCount: Int!
58
58
  definition: Filter!
59
- isSelected: Boolean
59
+ isSelected: Boolean!
60
60
  options: [LoadedFilterOption!]
61
61
  }
62
62
  `,
@@ -139,7 +139,7 @@ export default [
139
139
  country: Country!
140
140
  currency: Currency!
141
141
  amount: Int!
142
- maxQuantity: Int
142
+ minQuantity: Int
143
143
  }
144
144
 
145
145
  union ConfigurableOrBundleProduct = BundleProduct | ConfigurableProduct
@@ -57,6 +57,11 @@ export default [
57
57
  country: Country
58
58
  currency: Currency
59
59
  configuration: [ProductConfigurationParameter!]
60
+
61
+ """
62
+ Proposed unit price (minor units of the quotation's currency), set when the quotation reaches PROPOSED
63
+ """
64
+ price: Price
60
65
  }
61
66
  `,
62
67
  ];
@@ -82,7 +82,7 @@ export default [
82
82
 
83
83
  type Web3Address {
84
84
  address: String!
85
- nonce: Int
85
+ nonce: String
86
86
  verified: Boolean!
87
87
  }
88
88
 
@@ -0,0 +1 @@
1
+ export declare function isPeerNotInstalledError(packageName: string, error: unknown): boolean;
@@ -0,0 +1,6 @@
1
+ export function isPeerNotInstalledError(packageName, error) {
2
+ if (error?.code !== 'ERR_MODULE_NOT_FOUND')
3
+ return false;
4
+ const match = String(error?.message || '').match(/^Cannot find (?:package|module) '([^']+)'/);
5
+ return !!match && (match[1] === packageName || match[1].startsWith(`${packageName}/`));
6
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unchainedshop/api",
3
3
  "description": "GraphQL API layer for the Unchained Engine with Express/Fastify adapters and MCP server",
4
- "version": "5.0.0-alpha.1",
4
+ "version": "5.0.0-alpha.3",
5
5
  "main": "lib/api-index.js",
6
6
  "types": "lib/api-index.d.ts",
7
7
  "type": "module",
@@ -60,26 +60,30 @@
60
60
  },
61
61
  "homepage": "https://github.com/unchainedshop/unchained#readme",
62
62
  "peerDependencies": {
63
- "@ai-sdk/mcp": "^1",
63
+ "@ai-sdk/mcp": "^2.0.29",
64
64
  "@fastify/cookie": ">= 11 < 12",
65
- "@fastify/multipart": ">= 9 < 10",
66
- "@fastify/static": ">= 9 < 10",
67
- "@modelcontextprotocol/sdk": ">= 1 < 2",
68
- "ai": ">= 6 < 7",
65
+ "@fastify/multipart": ">= 10 < 11",
66
+ "@fastify/static": ">= 10.1.3 < 11",
67
+ "@modelcontextprotocol/server": ">= 2 < 3",
68
+ "ai": ">= 7 < 8",
69
69
  "cookie-parser": ">= 1.4 < 2",
70
70
  "express": ">= 5 < 6",
71
71
  "fastify": ">= 5.2 < 6",
72
+ "graphql": ">= 16.14 < 18",
72
73
  "graphql-yoga": ">= 5.9 < 6",
73
74
  "multer": ">= 2 < 3"
74
75
  },
75
76
  "peerDependenciesMeta": {
77
+ "graphql": {
78
+ "optional": false
79
+ },
76
80
  "graphql-yoga": {
77
81
  "optional": false
78
82
  },
79
83
  "cookie-parser": {
80
84
  "optional": false
81
85
  },
82
- "@modelcontextprotocol/sdk": {
86
+ "@modelcontextprotocol/server": {
83
87
  "optional": true
84
88
  },
85
89
  "ai": {
@@ -108,31 +112,51 @@
108
112
  }
109
113
  },
110
114
  "dependencies": {
115
+ "@envelop/core": "^5.6.0",
111
116
  "@unchainedshop/core": "^5.0.0-alpha.1",
117
+ "@unchainedshop/core-assortments": "^5.0.0-alpha.1",
118
+ "@unchainedshop/core-bookmarks": "^5.0.0-alpha.1",
119
+ "@unchainedshop/core-countries": "^5.0.0-alpha.1",
120
+ "@unchainedshop/core-currencies": "^5.0.0-alpha.1",
121
+ "@unchainedshop/core-delivery": "^5.0.0-alpha.1",
122
+ "@unchainedshop/core-enrollments": "^5.0.0-alpha.1",
123
+ "@unchainedshop/core-events": "^5.0.0-alpha.1",
124
+ "@unchainedshop/core-files": "^5.0.0-alpha.1",
125
+ "@unchainedshop/core-filters": "^5.0.0-alpha.1",
126
+ "@unchainedshop/core-languages": "^5.0.0-alpha.1",
127
+ "@unchainedshop/core-orders": "^5.0.0-alpha.1",
128
+ "@unchainedshop/core-payment": "^5.0.0-alpha.1",
129
+ "@unchainedshop/core-products": "^5.0.0-alpha.1",
130
+ "@unchainedshop/core-quotations": "^5.0.0-alpha.1",
131
+ "@unchainedshop/core-users": "^5.0.0-alpha.1",
132
+ "@unchainedshop/core-warehousing": "^5.0.0-alpha.1",
133
+ "@unchainedshop/core-worker": "^5.0.0-alpha.1",
112
134
  "@unchainedshop/events": "^5.0.0-alpha.1",
113
135
  "@unchainedshop/logger": "^5.0.0-alpha.1",
136
+ "@unchainedshop/mongodb": "^5.0.0-alpha.1",
114
137
  "@unchainedshop/roles": "^5.0.0-alpha.1",
115
138
  "@unchainedshop/utils": "^5.0.0-alpha.1",
116
139
  "@whatwg-node/server": "^0.10.18",
117
140
  "dataloader": "^2.2.3",
118
- "graphql-scalars": "^1.24.2",
141
+ "graphql-scalars": "^2.0.0",
119
142
  "jose": "^6.0.10",
120
143
  "mime": ">= 4 < 5",
121
- "zod": "^3.25.76 || ^4"
144
+ "zod": "^4.2.0"
122
145
  },
123
146
  "devDependencies": {
124
- "@ai-sdk/mcp": "^1.0.5",
147
+ "@ai-sdk/mcp": "^2.0.34",
125
148
  "@fastify/cookie": "^11.0.2",
126
- "@fastify/multipart": "^9.0.3",
127
- "@fastify/static": "^9.0.0",
128
- "@modelcontextprotocol/sdk": "^1.15.1",
149
+ "@fastify/multipart": "^10.0.0",
150
+ "@fastify/static": "^10.1.3",
151
+ "@modelcontextprotocol/server": "^2.0.0",
129
152
  "@types/cookie-parser": "^1.4.8",
130
153
  "@types/express": "^5.0.3",
131
- "@types/node": "^25.0.0",
132
- "ai": "^6.0.14",
154
+ "@types/node": "^26.2.0",
155
+ "ai": "^7.0.73",
133
156
  "cookie-parser": "^1.4.7",
134
157
  "express": "^5.1.0",
135
158
  "fastify": "^5.4.0",
159
+ "graphql": "^17.0.2",
136
160
  "multer": "^2.0.1",
137
161
  "typescript": "^5.8.3"
138
162
  }