medusa-plugin-statistics 0.1.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.
- package/.medusa/server/medusa-config.d.ts +1 -0
- package/.medusa/server/medusa-config.js +23 -0
- package/.medusa/server/src/admin/index.js +790 -0
- package/.medusa/server/src/admin/index.mjs +789 -0
- package/.medusa/server/src/api/admin/mcp/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/mcp/route.js +60 -0
- package/.medusa/server/src/api/admin/statistics/layout/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/statistics/layout/route.js +37 -0
- package/.medusa/server/src/api/admin/statistics/low-stock/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/statistics/low-stock/route.js +85 -0
- package/.medusa/server/src/api/admin/statistics/recalculate/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/statistics/recalculate/route.js +32 -0
- package/.medusa/server/src/api/admin/statistics/recent-orders/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/statistics/recent-orders/route.js +19 -0
- package/.medusa/server/src/api/admin/statistics/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/statistics/route.js +55 -0
- package/.medusa/server/src/api/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/middlewares.js +44 -0
- package/.medusa/server/src/api/validators.d.ts +85 -0
- package/.medusa/server/src/api/validators.js +30 -0
- package/.medusa/server/src/jobs/update-statistics.d.ts +7 -0
- package/.medusa/server/src/jobs/update-statistics.js +165 -0
- package/.medusa/server/src/mcp/server.d.ts +3 -0
- package/.medusa/server/src/mcp/server.js +23 -0
- package/.medusa/server/src/mcp/tools/customers.d.ts +3 -0
- package/.medusa/server/src/mcp/tools/customers.js +72 -0
- package/.medusa/server/src/mcp/tools/inventory.d.ts +3 -0
- package/.medusa/server/src/mcp/tools/inventory.js +70 -0
- package/.medusa/server/src/mcp/tools/orders.d.ts +3 -0
- package/.medusa/server/src/mcp/tools/orders.js +80 -0
- package/.medusa/server/src/mcp/tools/products.d.ts +3 -0
- package/.medusa/server/src/mcp/tools/products.js +72 -0
- package/.medusa/server/src/mcp/tools/query.d.ts +3 -0
- package/.medusa/server/src/mcp/tools/query.js +42 -0
- package/.medusa/server/src/modules/statistics/index.d.ts +22 -0
- package/.medusa/server/src/modules/statistics/index.js +25 -0
- package/.medusa/server/src/modules/statistics/migrations/Migration20260409171831.d.ts +5 -0
- package/.medusa/server/src/modules/statistics/migrations/Migration20260409171831.js +15 -0
- package/.medusa/server/src/modules/statistics/models/statistics-daily.d.ts +13 -0
- package/.medusa/server/src/modules/statistics/models/statistics-daily.js +18 -0
- package/.medusa/server/src/modules/statistics/service.d.ts +18 -0
- package/.medusa/server/src/modules/statistics/service.js +9 -0
- package/LICENSE +21 -0
- package/package.json +97 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.computeStatsForDay = computeStatsForDay;
|
|
5
|
+
exports.default = updateStatisticsJob;
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const statistics_1 = require("../modules/statistics");
|
|
8
|
+
async function computeStatsForDay(container, day) {
|
|
9
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
10
|
+
const statisticsService = container.resolve(statistics_1.STATISTICS_MODULE);
|
|
11
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
12
|
+
const startOfDay = day.toISOString();
|
|
13
|
+
const endOfDay = new Date(Date.UTC(day.getUTCFullYear(), day.getUTCMonth(), day.getUTCDate() + 1)).toISOString();
|
|
14
|
+
logger.info(`statistics: computing stats for ${startOfDay.slice(0, 10)}`);
|
|
15
|
+
// ── Orders & Revenue ────────────────────────────────────────────────
|
|
16
|
+
let revenueTotal = 0;
|
|
17
|
+
let orderCount = 0;
|
|
18
|
+
const productQuantities = {};
|
|
19
|
+
const customerIdsInPeriod = new Set();
|
|
20
|
+
const limit = 100;
|
|
21
|
+
let offset = 0;
|
|
22
|
+
let totalCount = 0;
|
|
23
|
+
do {
|
|
24
|
+
const { data: orders, metadata } = await query.graph({
|
|
25
|
+
entity: 'order',
|
|
26
|
+
fields: [
|
|
27
|
+
'id', 'total', 'status',
|
|
28
|
+
'customer.id',
|
|
29
|
+
'items.*'
|
|
30
|
+
],
|
|
31
|
+
filters: {
|
|
32
|
+
created_at: { $gte: startOfDay, $lt: endOfDay }
|
|
33
|
+
},
|
|
34
|
+
pagination: { take: limit, skip: offset }
|
|
35
|
+
});
|
|
36
|
+
totalCount = metadata?.count || 0;
|
|
37
|
+
offset += limit;
|
|
38
|
+
for (const order of orders) {
|
|
39
|
+
if (order.status === 'canceled')
|
|
40
|
+
continue;
|
|
41
|
+
orderCount++;
|
|
42
|
+
revenueTotal += order.total ?? 0;
|
|
43
|
+
if (order.customer?.id) {
|
|
44
|
+
customerIdsInPeriod.add(order.customer.id);
|
|
45
|
+
}
|
|
46
|
+
for (const item of order.items ?? []) {
|
|
47
|
+
if (!item?.product_id)
|
|
48
|
+
continue;
|
|
49
|
+
const existing = productQuantities[item.product_id];
|
|
50
|
+
if (existing) {
|
|
51
|
+
existing.quantity += item.quantity ?? 0;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
productQuantities[item.product_id] = {
|
|
55
|
+
title: item.title ?? '',
|
|
56
|
+
quantity: item.quantity ?? 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
} while (offset < totalCount);
|
|
62
|
+
const averageOrderValue = orderCount > 0 ? revenueTotal / orderCount : 0;
|
|
63
|
+
// Top 10 products by quantity sold
|
|
64
|
+
const topProducts = Object.entries(productQuantities)
|
|
65
|
+
.map(([product_id, { title, quantity }]) => ({ product_id, title, quantity_sold: quantity }))
|
|
66
|
+
.sort((a, b) => b.quantity_sold - a.quantity_sold)
|
|
67
|
+
.slice(0, 10);
|
|
68
|
+
// ── Customer Counts ─────────────────────────────────────────────────
|
|
69
|
+
let newCustomerCount = 0;
|
|
70
|
+
let customerOffset = 0;
|
|
71
|
+
let customerTotal = 0;
|
|
72
|
+
do {
|
|
73
|
+
const { data: customers, metadata } = await query.graph({
|
|
74
|
+
entity: 'customer',
|
|
75
|
+
fields: ['id'],
|
|
76
|
+
filters: {
|
|
77
|
+
created_at: { $gte: startOfDay, $lt: endOfDay }
|
|
78
|
+
},
|
|
79
|
+
pagination: { take: limit, skip: customerOffset }
|
|
80
|
+
});
|
|
81
|
+
customerTotal = metadata?.count || 0;
|
|
82
|
+
customerOffset += limit;
|
|
83
|
+
newCustomerCount += customers.length;
|
|
84
|
+
} while (customerOffset < customerTotal);
|
|
85
|
+
// Returning = customers who placed orders in period but were created before it
|
|
86
|
+
let returningCustomerCount = 0;
|
|
87
|
+
for (const customerId of customerIdsInPeriod) {
|
|
88
|
+
const { data: [customer] } = await query.graph({
|
|
89
|
+
entity: 'customer',
|
|
90
|
+
fields: ['id', 'created_at'],
|
|
91
|
+
filters: { id: customerId }
|
|
92
|
+
});
|
|
93
|
+
if (customer && new Date(customer.created_at) < day) {
|
|
94
|
+
returningCustomerCount++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── Pending Fulfillment ─────────────────────────────────────────────
|
|
98
|
+
let pendingFulfillmentCount = 0;
|
|
99
|
+
let pendingOffset = 0;
|
|
100
|
+
let pendingTotal = 0;
|
|
101
|
+
do {
|
|
102
|
+
const { data: orders, metadata } = await query.graph({
|
|
103
|
+
entity: 'order',
|
|
104
|
+
fields: ['id'],
|
|
105
|
+
filters: {
|
|
106
|
+
status: { $nin: ['completed', 'canceled', 'archived'] }
|
|
107
|
+
},
|
|
108
|
+
pagination: { take: limit, skip: pendingOffset }
|
|
109
|
+
});
|
|
110
|
+
pendingTotal = metadata?.count || 0;
|
|
111
|
+
pendingOffset += limit;
|
|
112
|
+
pendingFulfillmentCount += orders.length;
|
|
113
|
+
} while (pendingOffset < pendingTotal);
|
|
114
|
+
// ── Low Stock ───────────────────────────────────────────────────────
|
|
115
|
+
const { metadata: lowStockMeta } = await query.graph({
|
|
116
|
+
entity: 'inventory_item',
|
|
117
|
+
fields: ['id'],
|
|
118
|
+
filters: {
|
|
119
|
+
location_levels: {
|
|
120
|
+
stocked_quantity: { $lte: 10 }
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
pagination: { take: 1 }
|
|
124
|
+
});
|
|
125
|
+
const lowStockCount = lowStockMeta?.count || 0;
|
|
126
|
+
// ── Upsert ──────────────────────────────────────────────────────────
|
|
127
|
+
const [existing] = await statisticsService.listStatisticsDailies({ date: day }, { take: 1 });
|
|
128
|
+
const statData = {
|
|
129
|
+
date: day,
|
|
130
|
+
revenue_total: revenueTotal,
|
|
131
|
+
order_count: orderCount,
|
|
132
|
+
average_order_value: averageOrderValue,
|
|
133
|
+
new_customer_count: newCustomerCount,
|
|
134
|
+
returning_customer_count: returningCustomerCount,
|
|
135
|
+
pending_fulfillment_count: pendingFulfillmentCount,
|
|
136
|
+
low_stock_count: lowStockCount,
|
|
137
|
+
top_products: topProducts
|
|
138
|
+
};
|
|
139
|
+
if (existing) {
|
|
140
|
+
await statisticsService.updateStatisticsDailies({ id: existing.id, ...statData });
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
await statisticsService.createStatisticsDailies(statData);
|
|
144
|
+
}
|
|
145
|
+
logger.info(`statistics: ${startOfDay.slice(0, 10)} — ` +
|
|
146
|
+
`revenue: ${revenueTotal}, orders: ${orderCount}, AOV: ${averageOrderValue.toFixed(2)}, ` +
|
|
147
|
+
`new customers: ${newCustomerCount}, returning: ${returningCustomerCount}, ` +
|
|
148
|
+
`pending fulfillment: ${pendingFulfillmentCount}, low stock: ${lowStockCount}`);
|
|
149
|
+
}
|
|
150
|
+
async function updateStatisticsJob(container) {
|
|
151
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
152
|
+
try {
|
|
153
|
+
const now = new Date();
|
|
154
|
+
const yesterday = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 1));
|
|
155
|
+
await computeStatsForDay(container, yesterday);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
logger.error(`statistics: failed to update stats: ${error.message}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.config = {
|
|
162
|
+
name: 'update-statistics',
|
|
163
|
+
schedule: '0 1 * * *'
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN0YXRpc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy91cGRhdGUtc3RhdGlzdGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxnREFzS0M7QUFFRCxzQ0FTQztBQXJMRCxxREFBcUU7QUFDckUsc0RBQXlEO0FBR2xELEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQixFQUFFLEdBQVM7SUFDN0UsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLGlCQUFpQixHQUFzQixTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFDLENBQUE7SUFDakYsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRWhILE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUV6RSx1RUFBdUU7SUFDdkUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQTtJQUNsQixNQUFNLGlCQUFpQixHQUF3RCxFQUFFLENBQUE7SUFDakYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO0lBRTdDLE1BQU0sS0FBSyxH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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpServer = void 0;
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const query_1 = require("./tools/query");
|
|
6
|
+
const orders_1 = require("./tools/orders");
|
|
7
|
+
const customers_1 = require("./tools/customers");
|
|
8
|
+
const products_1 = require("./tools/products");
|
|
9
|
+
const inventory_1 = require("./tools/inventory");
|
|
10
|
+
const createMcpServer = (scope) => {
|
|
11
|
+
const server = new mcp_js_1.McpServer({
|
|
12
|
+
name: 'medusa-admin',
|
|
13
|
+
version: '1.0.0'
|
|
14
|
+
});
|
|
15
|
+
(0, query_1.registerQueryTool)(server, scope);
|
|
16
|
+
(0, orders_1.registerOrderTools)(server, scope);
|
|
17
|
+
(0, customers_1.registerCustomerTools)(server, scope);
|
|
18
|
+
(0, products_1.registerProductTools)(server, scope);
|
|
19
|
+
(0, inventory_1.registerInventoryTools)(server, scope);
|
|
20
|
+
return server;
|
|
21
|
+
};
|
|
22
|
+
exports.createMcpServer = createMcpServer;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21jcC9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0VBQW1FO0FBRW5FLHlDQUFpRDtBQUNqRCwyQ0FBbUQ7QUFDbkQsaURBQXlEO0FBQ3pELCtDQUF1RDtBQUN2RCxpREFBMEQ7QUFFbkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFzQixFQUFhLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBUyxDQUFDO1FBQzVCLElBQUksRUFBRSxjQUFjO1FBQ3BCLE9BQU8sRUFBRSxPQUFPO0tBQ2hCLENBQUMsQ0FBQTtJQUVGLElBQUEseUJBQWlCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUEsMkJBQWtCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pDLElBQUEsaUNBQXFCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3BDLElBQUEsK0JBQW9CLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ25DLElBQUEsa0NBQXNCLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXJDLE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQyxDQUFBO0FBYlksUUFBQSxlQUFlLG1CQWEzQiJ9
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCustomerTools = registerCustomerTools;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
function registerCustomerTools(server, scope) {
|
|
7
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
|
+
server.registerTool('search_customers', {
|
|
9
|
+
description: 'Search customers by email or name.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
q: zod_1.z.string().describe('Search term (matches email, first_name, or last_name)'),
|
|
12
|
+
limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10)
|
|
13
|
+
}
|
|
14
|
+
}, async ({ q, limit }) => {
|
|
15
|
+
const { data } = await query.graph({
|
|
16
|
+
entity: 'customer',
|
|
17
|
+
fields: [
|
|
18
|
+
'id',
|
|
19
|
+
'email',
|
|
20
|
+
'first_name',
|
|
21
|
+
'last_name',
|
|
22
|
+
'phone',
|
|
23
|
+
'has_account',
|
|
24
|
+
'created_at'
|
|
25
|
+
],
|
|
26
|
+
filters: {
|
|
27
|
+
$or: [
|
|
28
|
+
{ email: { $ilike: `%${q}%` } },
|
|
29
|
+
{ first_name: { $ilike: `%${q}%` } },
|
|
30
|
+
{ last_name: { $ilike: `%${q}%` } }
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
pagination: { take: limit }
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
server.registerTool('get_customer', {
|
|
40
|
+
description: 'Fetch a single customer by ID with their order history.',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
customer_id: zod_1.z.string().describe('The customer ID')
|
|
43
|
+
}
|
|
44
|
+
}, async ({ customer_id }) => {
|
|
45
|
+
const { data: [customer] } = await query.graph({
|
|
46
|
+
entity: 'customer',
|
|
47
|
+
fields: [
|
|
48
|
+
'id',
|
|
49
|
+
'email',
|
|
50
|
+
'first_name',
|
|
51
|
+
'last_name',
|
|
52
|
+
'phone',
|
|
53
|
+
'has_account',
|
|
54
|
+
'orders.id',
|
|
55
|
+
'orders.display_id',
|
|
56
|
+
'orders.status',
|
|
57
|
+
'orders.total',
|
|
58
|
+
'orders.created_at',
|
|
59
|
+
'created_at',
|
|
60
|
+
'updated_at'
|
|
61
|
+
],
|
|
62
|
+
filters: { id: customer_id }
|
|
63
|
+
});
|
|
64
|
+
if (!customer) {
|
|
65
|
+
return { content: [{ type: 'text', text: 'Customer not found.' }] };
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: 'text', text: JSON.stringify(customer, null, 2) }]
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9jdXN0b21lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxzREFnRkM7QUFuRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixxQkFBcUIsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQzlFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsa0JBQWtCLEVBQ2xCO1FBQ0MsV0FBVyxFQUFFLG9DQUFvQztRQUNqRCxXQUFXLEVBQUU7WUFDWixDQUFDLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1REFBdUQsQ0FBQztZQUMvRSxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDcEU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQ3RCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFO2dCQUNQLElBQUk7Z0JBQ0osT0FBTztnQkFDUCxZQUFZO2dCQUNaLFdBQVc7Z0JBQ1gsT0FBTztnQkFDUCxhQUFhO2dCQUNiLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRTtnQkFDUixHQUFHLEVBQUU7b0JBQ0osRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUMvQixFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ3BDLEVBQUUsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtpQkFDbkM7YUFDRDtZQUNELFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7U0FDM0IsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNOLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDekUsQ0FBQTtJQUNGLENBQUMsQ0FDRCxDQUFBO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsY0FBYyxFQUNkO1FBQ0MsV0FBVyxFQUFFLHlEQUF5RDtRQUN0RSxXQUFXLEVBQUU7WUFDWixXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztTQUNuRDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtRQUN6QixNQUFNLEVBQ0wsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQ2hCLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsWUFBWTtnQkFDWixXQUFXO2dCQUNYLE9BQU87Z0JBQ1AsYUFBYTtnQkFDYixXQUFXO2dCQUNYLG1CQUFtQjtnQkFDbkIsZUFBZTtnQkFDZixjQUFjO2dCQUNkLG1CQUFtQjtnQkFDbkIsWUFBWTtnQkFDWixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFO1NBQzVCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQzdFLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM3RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInventoryTools = registerInventoryTools;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
function registerInventoryTools(server, scope) {
|
|
7
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
|
+
server.registerTool('low_stock_items', {
|
|
9
|
+
description: 'Find inventory items with stock levels at or below a threshold.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
threshold: zod_1.z.coerce.number().int().min(0).optional().default(10),
|
|
12
|
+
limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20)
|
|
13
|
+
}
|
|
14
|
+
}, async ({ threshold, limit }) => {
|
|
15
|
+
const { data } = await query.graph({
|
|
16
|
+
entity: 'inventory_item',
|
|
17
|
+
fields: [
|
|
18
|
+
'id',
|
|
19
|
+
'sku',
|
|
20
|
+
'title',
|
|
21
|
+
'location_levels.id',
|
|
22
|
+
'location_levels.stocked_quantity',
|
|
23
|
+
'location_levels.reserved_quantity',
|
|
24
|
+
'location_levels.stock_location.id',
|
|
25
|
+
'location_levels.stock_location.name'
|
|
26
|
+
],
|
|
27
|
+
filters: {
|
|
28
|
+
location_levels: {
|
|
29
|
+
stocked_quantity: { $lte: threshold }
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
pagination: { take: limit }
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
server.registerTool('get_inventory_item', {
|
|
39
|
+
description: 'Fetch a single inventory item by ID with stock levels across locations.',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
inventory_item_id: zod_1.z.string().describe('The inventory item ID')
|
|
42
|
+
}
|
|
43
|
+
}, async ({ inventory_item_id }) => {
|
|
44
|
+
const { data: [item] } = await query.graph({
|
|
45
|
+
entity: 'inventory_item',
|
|
46
|
+
fields: [
|
|
47
|
+
'id',
|
|
48
|
+
'sku',
|
|
49
|
+
'title',
|
|
50
|
+
'requires_shipping',
|
|
51
|
+
'location_levels.id',
|
|
52
|
+
'location_levels.stocked_quantity',
|
|
53
|
+
'location_levels.reserved_quantity',
|
|
54
|
+
'location_levels.incoming_quantity',
|
|
55
|
+
'location_levels.stock_location.id',
|
|
56
|
+
'location_levels.stock_location.name',
|
|
57
|
+
'created_at',
|
|
58
|
+
'updated_at'
|
|
59
|
+
],
|
|
60
|
+
filters: { id: inventory_item_id }
|
|
61
|
+
});
|
|
62
|
+
if (!item) {
|
|
63
|
+
return { content: [{ type: 'text', text: 'Inventory item not found.' }] };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: 'text', text: JSON.stringify(item, null, 2) }]
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52ZW50b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9pbnZlbnRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSx3REE4RUM7QUFqRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixzQkFBc0IsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQy9FLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsaUJBQWlCLEVBQ2pCO1FBQ0MsV0FBVyxFQUFFLGlFQUFpRTtRQUM5RSxXQUFXLEVBQUU7WUFDWixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7U0FDckU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzlCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLGdCQUFnQjtZQUN4QixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixLQUFLO2dCQUNMLE9BQU87Z0JBQ1Asb0JBQW9CO2dCQUNwQixrQ0FBa0M7Z0JBQ2xDLG1DQUFtQztnQkFDbkMsbUNBQW1DO2dCQUNuQyxxQ0FBcUM7YUFDckM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFO29CQUNoQixnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7aUJBQ3JDO2FBQ007WUFDUixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQzNCLENBQUMsQ0FBQTtRQUVGLE9BQU87WUFDTixPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3pFLENBQUE7SUFDRixDQUFDLENBQ0QsQ0FBQTtJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2xCLG9CQUFvQixFQUNwQjtRQUNDLFdBQVcsRUFBRSx5RUFBeUU7UUFDdEYsV0FBVyxFQUFFO1lBQ1osaUJBQWlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztTQUMvRDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFO1FBQy9CLE1BQU0sRUFDTCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDWixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLEtBQUs7Z0JBQ0wsT0FBTztnQkFDUCxtQkFBbUI7Z0JBQ25CLG9CQUFvQjtnQkFDcEIsa0NBQWtDO2dCQUNsQyxtQ0FBbUM7Z0JBQ25DLG1DQUFtQztnQkFDbkMsbUNBQW1DO2dCQUNuQyxxQ0FBcUM7Z0JBQ3JDLFlBQVk7Z0JBQ1osWUFBWTthQUNaO1lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFO1NBQ2xDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQ25GLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerOrderTools = registerOrderTools;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
function registerOrderTools(server, scope) {
|
|
7
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
|
+
server.registerTool('recent_orders', {
|
|
9
|
+
description: 'Fetch recent orders with status, totals, and customer info.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10),
|
|
12
|
+
status: zod_1.z.string().optional().describe('Filter by order status')
|
|
13
|
+
}
|
|
14
|
+
}, async ({ limit, status }) => {
|
|
15
|
+
const { data } = await query.graph({
|
|
16
|
+
entity: 'order',
|
|
17
|
+
fields: [
|
|
18
|
+
'id',
|
|
19
|
+
'display_id',
|
|
20
|
+
'status',
|
|
21
|
+
'email',
|
|
22
|
+
'total',
|
|
23
|
+
'subtotal',
|
|
24
|
+
'tax_total',
|
|
25
|
+
'shipping_total',
|
|
26
|
+
'customer.first_name',
|
|
27
|
+
'customer.last_name',
|
|
28
|
+
'created_at'
|
|
29
|
+
],
|
|
30
|
+
filters: (status ? { status } : {}),
|
|
31
|
+
pagination: { take: limit, order: { created_at: 'DESC' } }
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
server.registerTool('get_order', {
|
|
38
|
+
description: 'Fetch a single order by ID with full details including items, fulfillments, and customer.',
|
|
39
|
+
inputSchema: {
|
|
40
|
+
order_id: zod_1.z.string().describe('The order ID')
|
|
41
|
+
}
|
|
42
|
+
}, async ({ order_id }) => {
|
|
43
|
+
const { data: [order] } = await query.graph({
|
|
44
|
+
entity: 'order',
|
|
45
|
+
fields: [
|
|
46
|
+
'id',
|
|
47
|
+
'display_id',
|
|
48
|
+
'status',
|
|
49
|
+
'email',
|
|
50
|
+
'total',
|
|
51
|
+
'subtotal',
|
|
52
|
+
'tax_total',
|
|
53
|
+
'shipping_total',
|
|
54
|
+
'discount_total',
|
|
55
|
+
'customer.id',
|
|
56
|
+
'customer.first_name',
|
|
57
|
+
'customer.last_name',
|
|
58
|
+
'customer.email',
|
|
59
|
+
'items.id',
|
|
60
|
+
'items.title',
|
|
61
|
+
'items.quantity',
|
|
62
|
+
'items.unit_price',
|
|
63
|
+
'shipping_address.*',
|
|
64
|
+
'billing_address.*',
|
|
65
|
+
'fulfillments.id',
|
|
66
|
+
'fulfillments.status',
|
|
67
|
+
'created_at',
|
|
68
|
+
'updated_at'
|
|
69
|
+
],
|
|
70
|
+
filters: { id: order_id }
|
|
71
|
+
});
|
|
72
|
+
if (!order) {
|
|
73
|
+
return { content: [{ type: 'text', text: 'Order not found.' }] };
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: JSON.stringify(order, null, 2) }]
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21jcC90b29scy9vcmRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxnREF3RkM7QUEzRkQscURBQXFFO0FBQ3JFLDZCQUF1QjtBQUV2QixTQUFnQixrQkFBa0IsQ0FBQyxNQUFpQixFQUFFLEtBQXNCO0lBQzNFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsZUFBZSxFQUNmO1FBQ0MsV0FBVyxFQUFFLDZEQUE2RDtRQUMxRSxXQUFXLEVBQUU7WUFDWixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7U0FDaEU7S0FDRCxFQUNELEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQzNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLHFCQUFxQjtnQkFDckIsb0JBQW9CO2dCQUNwQixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBUTtZQUMxQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRTtTQUMxRCxDQUFDLENBQUE7UUFFRixPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNsQixXQUFXLEVBQ1g7UUFDQyxXQUFXLEVBQUUsMkZBQTJGO1FBQ3hHLFdBQVcsRUFBRTtZQUNaLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztTQUM3QztLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLEVBQ0wsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQ2IsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDckIsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixZQUFZO2dCQUNaLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxPQUFPO2dCQUNQLFVBQVU7Z0JBQ1YsV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIsYUFBYTtnQkFDYixxQkFBcUI7Z0JBQ3JCLG9CQUFvQjtnQkFDcEIsZ0JBQWdCO2dCQUNoQixVQUFVO2dCQUNWLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLG9CQUFvQjtnQkFDcEIsbUJBQW1CO2dCQUNuQixpQkFBaUI7Z0JBQ2pCLHFCQUFxQjtnQkFDckIsWUFBWTtnQkFDWixZQUFZO2FBQ1o7WUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFO1NBQ3pCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRSxDQUFBO1FBQzFFLENBQUM7UUFFRCxPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMxRSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7QUFDRixDQUFDIn0=
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerProductTools = registerProductTools;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
function registerProductTools(server, scope) {
|
|
7
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
8
|
+
server.registerTool('search_products', {
|
|
9
|
+
description: 'Search products by title.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
q: zod_1.z.string().describe('Search term (matches title)'),
|
|
12
|
+
limit: zod_1.z.coerce.number().int().min(1).max(50).optional().default(10)
|
|
13
|
+
}
|
|
14
|
+
}, async ({ q, limit }) => {
|
|
15
|
+
const { data } = await query.graph({
|
|
16
|
+
entity: 'product',
|
|
17
|
+
fields: [
|
|
18
|
+
'id',
|
|
19
|
+
'title',
|
|
20
|
+
'handle',
|
|
21
|
+
'status',
|
|
22
|
+
'variants.id',
|
|
23
|
+
'variants.title',
|
|
24
|
+
'variants.sku',
|
|
25
|
+
'created_at'
|
|
26
|
+
],
|
|
27
|
+
filters: { title: { $ilike: `%${q}%` } },
|
|
28
|
+
pagination: { take: limit }
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
server.registerTool('get_product', {
|
|
35
|
+
description: 'Fetch a single product by ID with variants and pricing.',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
product_id: zod_1.z.string().describe('The product ID')
|
|
38
|
+
}
|
|
39
|
+
}, async ({ product_id }) => {
|
|
40
|
+
const { data: [product] } = await query.graph({
|
|
41
|
+
entity: 'product',
|
|
42
|
+
fields: [
|
|
43
|
+
'id',
|
|
44
|
+
'title',
|
|
45
|
+
'handle',
|
|
46
|
+
'subtitle',
|
|
47
|
+
'description',
|
|
48
|
+
'status',
|
|
49
|
+
'variants.id',
|
|
50
|
+
'variants.title',
|
|
51
|
+
'variants.sku',
|
|
52
|
+
'variants.prices.amount',
|
|
53
|
+
'variants.prices.currency_code',
|
|
54
|
+
'options.id',
|
|
55
|
+
'options.title',
|
|
56
|
+
'options.values.value',
|
|
57
|
+
'tags.id',
|
|
58
|
+
'tags.value',
|
|
59
|
+
'created_at',
|
|
60
|
+
'updated_at'
|
|
61
|
+
],
|
|
62
|
+
filters: { id: product_id }
|
|
63
|
+
});
|
|
64
|
+
if (!product) {
|
|
65
|
+
return { content: [{ type: 'text', text: 'Product not found.' }] };
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: 'text', text: JSON.stringify(product, null, 2) }]
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL3Byb2R1Y3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0Esb0RBZ0ZDO0FBbkZELHFEQUFxRTtBQUNyRSw2QkFBdUI7QUFFdkIsU0FBZ0Isb0JBQW9CLENBQUMsTUFBaUIsRUFBRSxLQUFzQjtJQUM3RSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTVELE1BQU0sQ0FBQyxZQUFZLENBQ2xCLGlCQUFpQixFQUNqQjtRQUNDLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsV0FBVyxFQUFFO1lBQ1osQ0FBQyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUM7WUFDckQsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3BFO0tBQ0QsRUFDRCxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRTtnQkFDUCxJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsUUFBUTtnQkFDUixRQUFRO2dCQUNSLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixjQUFjO2dCQUNkLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtTQUMzQixDQUFDLENBQUE7UUFFRixPQUFPO1lBQ04sT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RSxDQUFBO0lBQ0YsQ0FBQyxDQUNELENBQUE7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNsQixhQUFhLEVBQ2I7UUFDQyxXQUFXLEVBQUUseURBQXlEO1FBQ3RFLFdBQVcsRUFBRTtZQUNaLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1NBQ2pEO0tBQ0QsRUFDRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sRUFDTCxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFDZixHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUU7Z0JBQ1AsSUFBSTtnQkFDSixPQUFPO2dCQUNQLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsYUFBYTtnQkFDYixnQkFBZ0I7Z0JBQ2hCLGNBQWM7Z0JBQ2Qsd0JBQXdCO2dCQUN4QiwrQkFBK0I7Z0JBQy9CLFlBQVk7Z0JBQ1osZUFBZTtnQkFDZixzQkFBc0I7Z0JBQ3RCLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixZQUFZO2dCQUNaLFlBQVk7YUFDWjtZQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUU7U0FDM0IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQWUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUE7UUFDNUUsQ0FBQztRQUVELE9BQU87WUFDTixPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzVFLENBQUE7SUFDRixDQUFDLENBQ0QsQ0FBQTtBQUNGLENBQUMifQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerQueryTool = registerQueryTool;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const ALLOWED_ENTITIES = [
|
|
7
|
+
'order', 'product', 'product_variant', 'customer', 'inventory_item',
|
|
8
|
+
'fulfillment', 'cart', 'shipping_option', 'sales_channel', 'store',
|
|
9
|
+
'form', 'form_submission', 'review', 'complaint', 'complaint_tag',
|
|
10
|
+
'content_item', 'content_collection', 'stock_lot', 'serial_number',
|
|
11
|
+
'veeqo_order', 'veeqo_shipment', 'webhook_trigger', 'webhook_action',
|
|
12
|
+
'barcode', 'order_note', 'customer_tag'
|
|
13
|
+
];
|
|
14
|
+
function registerQueryTool(server, scope) {
|
|
15
|
+
server.registerTool('query', {
|
|
16
|
+
description: `Run a query against any Medusa entity using query.graph(). Allowed entities: ${ALLOWED_ENTITIES.join(', ')}. ` +
|
|
17
|
+
'Use dot notation for relations (e.g. "customer.first_name"). ' +
|
|
18
|
+
'Filters support operators: $eq, $ne, $in, $nin, $like, $ilike, $gt, $gte, $lt, $lte.',
|
|
19
|
+
inputSchema: {
|
|
20
|
+
entity: zod_1.z.enum(ALLOWED_ENTITIES),
|
|
21
|
+
fields: zod_1.z.array(zod_1.z.string()).min(1).describe('Fields to return, e.g. ["id", "email", "orders.id"]'),
|
|
22
|
+
filters: zod_1.z.record(zod_1.z.unknown()).optional().describe('Filter conditions, e.g. { status: "completed" }'),
|
|
23
|
+
limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(20),
|
|
24
|
+
offset: zod_1.z.coerce.number().int().min(0).optional().default(0)
|
|
25
|
+
}
|
|
26
|
+
}, async ({ entity, fields, filters, limit, offset }) => {
|
|
27
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
28
|
+
const { data, metadata } = await query.graph({
|
|
29
|
+
entity,
|
|
30
|
+
fields,
|
|
31
|
+
filters: filters ?? {},
|
|
32
|
+
pagination: { take: limit, skip: offset }
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
content: [{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: JSON.stringify({ data, count: metadata?.count ?? data.length, limit, offset }, null, 2)
|
|
38
|
+
}]
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0EsOENBa0NDO0FBOUNELHFEQUFxRTtBQUNyRSw2QkFBdUI7QUFFdkIsTUFBTSxnQkFBZ0IsR0FBRztJQUN4QixPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxnQkFBZ0I7SUFDbkUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsT0FBTztJQUNsRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlO0lBQ2pFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsZUFBZTtJQUNsRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCO0lBQ3BFLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYztDQUN2QyxDQUFBO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsTUFBaUIsRUFBRSxLQUFzQjtJQUMxRSxNQUFNLENBQUMsWUFBWSxDQUNsQixPQUFPLEVBQ1A7UUFDQyxXQUFXLEVBQ1YsZ0ZBQWdGLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUMvRywrREFBK0Q7WUFDL0Qsc0ZBQXNGO1FBQ3ZGLFdBQVcsRUFBRTtZQUNaLE1BQU0sRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLGdCQUF5QyxDQUFDO1lBQ3pELE1BQU0sRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMscURBQXFELENBQUM7WUFDbEcsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGlEQUFpRCxDQUFDO1lBQ3JHLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM1RDtLQUNELEVBQ0QsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDcEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU1RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM1QyxNQUFNO1lBQ04sTUFBTTtZQUNOLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtZQUN0QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7U0FDekMsQ0FBQyxDQUFBO1FBRUYsT0FBTztZQUNOLE9BQU8sRUFBRSxDQUFDO29CQUNULElBQUksRUFBRSxNQUFlO29CQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RixDQUFDO1NBQ0YsQ0FBQTtJQUNGLENBQUMsQ0FDRCxDQUFBO0FBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { StatisticsService } from './service';
|
|
2
|
+
export declare const STATISTICS_MODULE = "statistics";
|
|
3
|
+
declare const _default: import("@medusajs/types").ModuleExports<typeof StatisticsService> & {
|
|
4
|
+
linkable: {
|
|
5
|
+
readonly statisticsDaily: {
|
|
6
|
+
id: {
|
|
7
|
+
serviceName: "statistics";
|
|
8
|
+
field: "statisticsDaily";
|
|
9
|
+
linkable: "statistics_daily_id";
|
|
10
|
+
primaryKey: "id";
|
|
11
|
+
};
|
|
12
|
+
toJSON: () => {
|
|
13
|
+
serviceName: "statistics";
|
|
14
|
+
field: "statisticsDaily";
|
|
15
|
+
linkable: "statistics_daily_id";
|
|
16
|
+
primaryKey: "id";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export default _default;
|
|
22
|
+
export * from './service';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.STATISTICS_MODULE = void 0;
|
|
18
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
19
|
+
const service_1 = require("./service");
|
|
20
|
+
exports.STATISTICS_MODULE = 'statistics';
|
|
21
|
+
exports.default = (0, utils_1.Module)(exports.STATISTICS_MODULE, {
|
|
22
|
+
service: service_1.StatisticsService
|
|
23
|
+
});
|
|
24
|
+
__exportStar(require("./service"), exports);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zdGF0aXN0aWNzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHVDQUE2QztBQUVoQyxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQTtBQUU3QyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx5QkFBaUIsRUFBRTtJQUN4QyxPQUFPLEVBQUUsMkJBQWlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGLDRDQUF5QiJ9
|