@rahul_vendure/ai-chat-plugin 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/README.md +214 -0
- package/dist/ai-assistant.plugin.d.ts +18 -0
- package/dist/ai-assistant.plugin.d.ts.map +1 -0
- package/dist/ai-assistant.plugin.js +86 -0
- package/dist/ai-assistant.plugin.js.map +1 -0
- package/dist/api/ai-assistant.resolver.d.ts +11 -0
- package/dist/api/ai-assistant.resolver.d.ts.map +1 -0
- package/dist/api/ai-assistant.resolver.js +43 -0
- package/dist/api/ai-assistant.resolver.js.map +1 -0
- package/dist/api/schema-extensions.d.ts +3 -0
- package/dist/api/schema-extensions.d.ts.map +1 -0
- package/dist/api/schema-extensions.js +15 -0
- package/dist/api/schema-extensions.js.map +1 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/controllers/admin-chat.controller.d.ts +21 -0
- package/dist/controllers/admin-chat.controller.d.ts.map +1 -0
- package/dist/controllers/admin-chat.controller.js +64 -0
- package/dist/controllers/admin-chat.controller.js.map +1 -0
- package/dist/controllers/ai-assistant.controller.d.ts +96 -0
- package/dist/controllers/ai-assistant.controller.d.ts.map +1 -0
- package/dist/controllers/ai-assistant.controller.js +272 -0
- package/dist/controllers/ai-assistant.controller.js.map +1 -0
- package/dist/entities/collection-embedding.entity.d.ts +13 -0
- package/dist/entities/collection-embedding.entity.d.ts.map +1 -0
- package/dist/entities/collection-embedding.entity.js +43 -0
- package/dist/entities/collection-embedding.entity.js.map +1 -0
- package/dist/entities/product-embedding.entity.d.ts +14 -0
- package/dist/entities/product-embedding.entity.d.ts.map +1 -0
- package/dist/entities/product-embedding.entity.js +44 -0
- package/dist/entities/product-embedding.entity.js.map +1 -0
- package/dist/entities/variant-embedding.entity.d.ts +13 -0
- package/dist/entities/variant-embedding.entity.d.ts.map +1 -0
- package/dist/entities/variant-embedding.entity.js +43 -0
- package/dist/entities/variant-embedding.entity.js.map +1 -0
- package/dist/handlers/collection-embedding-handler.d.ts +18 -0
- package/dist/handlers/collection-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/collection-embedding-handler.js +90 -0
- package/dist/handlers/collection-embedding-handler.js.map +1 -0
- package/dist/handlers/product-embedding-handler.d.ts +20 -0
- package/dist/handlers/product-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/product-embedding-handler.js +96 -0
- package/dist/handlers/product-embedding-handler.js.map +1 -0
- package/dist/handlers/variant-embedding-handler.d.ts +19 -0
- package/dist/handlers/variant-embedding-handler.d.ts.map +1 -0
- package/dist/handlers/variant-embedding-handler.js +101 -0
- package/dist/handlers/variant-embedding-handler.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-ai-chat.service.d.ts +40 -0
- package/dist/services/admin-ai-chat.service.d.ts.map +1 -0
- package/dist/services/admin-ai-chat.service.js +201 -0
- package/dist/services/admin-ai-chat.service.js.map +1 -0
- package/dist/services/admin-system-prompt.d.ts +2 -0
- package/dist/services/admin-system-prompt.d.ts.map +1 -0
- package/dist/services/admin-system-prompt.js +44 -0
- package/dist/services/admin-system-prompt.js.map +1 -0
- package/dist/services/admin-tools/admin-collection-tools.d.ts +15 -0
- package/dist/services/admin-tools/admin-collection-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-collection-tools.js +48 -0
- package/dist/services/admin-tools/admin-collection-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-customer-tools.d.ts +15 -0
- package/dist/services/admin-tools/admin-customer-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-customer-tools.js +56 -0
- package/dist/services/admin-tools/admin-customer-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-order-tools.d.ts +16 -0
- package/dist/services/admin-tools/admin-order-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-order-tools.js +69 -0
- package/dist/services/admin-tools/admin-order-tools.js.map +1 -0
- package/dist/services/admin-tools/admin-product-tools.d.ts +29 -0
- package/dist/services/admin-tools/admin-product-tools.d.ts.map +1 -0
- package/dist/services/admin-tools/admin-product-tools.js +139 -0
- package/dist/services/admin-tools/admin-product-tools.js.map +1 -0
- package/dist/services/ai-chat.service.d.ts +42 -0
- package/dist/services/ai-chat.service.d.ts.map +1 -0
- package/dist/services/ai-chat.service.js +308 -0
- package/dist/services/ai-chat.service.js.map +1 -0
- package/dist/services/chat-result-mapper.d.ts +17 -0
- package/dist/services/chat-result-mapper.d.ts.map +1 -0
- package/dist/services/chat-result-mapper.js +176 -0
- package/dist/services/chat-result-mapper.js.map +1 -0
- package/dist/services/collection-embedding.service.d.ts +14 -0
- package/dist/services/collection-embedding.service.d.ts.map +1 -0
- package/dist/services/collection-embedding.service.js +67 -0
- package/dist/services/collection-embedding.service.js.map +1 -0
- package/dist/services/conversation-cache.service.d.ts +47 -0
- package/dist/services/conversation-cache.service.d.ts.map +1 -0
- package/dist/services/conversation-cache.service.js +87 -0
- package/dist/services/conversation-cache.service.js.map +1 -0
- package/dist/services/embed-all-job.service.d.ts +28 -0
- package/dist/services/embed-all-job.service.d.ts.map +1 -0
- package/dist/services/embed-all-job.service.js +151 -0
- package/dist/services/embed-all-job.service.js.map +1 -0
- package/dist/services/embedding.service.d.ts +21 -0
- package/dist/services/embedding.service.d.ts.map +1 -0
- package/dist/services/embedding.service.js +58 -0
- package/dist/services/embedding.service.js.map +1 -0
- package/dist/services/product-embedding.service.d.ts +19 -0
- package/dist/services/product-embedding.service.d.ts.map +1 -0
- package/dist/services/product-embedding.service.js +78 -0
- package/dist/services/product-embedding.service.js.map +1 -0
- package/dist/services/system-prompt.d.ts +2 -0
- package/dist/services/system-prompt.d.ts.map +1 -0
- package/dist/services/system-prompt.js +107 -0
- package/dist/services/system-prompt.js.map +1 -0
- package/dist/services/tools/cart-tools.d.ts +14 -0
- package/dist/services/tools/cart-tools.d.ts.map +1 -0
- package/dist/services/tools/cart-tools.js +168 -0
- package/dist/services/tools/cart-tools.js.map +1 -0
- package/dist/services/tools/checkout-tools.d.ts +37 -0
- package/dist/services/tools/checkout-tools.d.ts.map +1 -0
- package/dist/services/tools/checkout-tools.js +228 -0
- package/dist/services/tools/checkout-tools.js.map +1 -0
- package/dist/services/tools/order-tools.d.ts +15 -0
- package/dist/services/tools/order-tools.d.ts.map +1 -0
- package/dist/services/tools/order-tools.js +105 -0
- package/dist/services/tools/order-tools.js.map +1 -0
- package/dist/services/tools/search-tools.d.ts +21 -0
- package/dist/services/tools/search-tools.d.ts.map +1 -0
- package/dist/services/tools/search-tools.js +214 -0
- package/dist/services/tools/search-tools.js.map +1 -0
- package/dist/services/types.d.ts +118 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +3 -0
- package/dist/services/types.js.map +1 -0
- package/dist/services/variant-embedding.service.d.ts +14 -0
- package/dist/services/variant-embedding.service.d.ts.map +1 -0
- package/dist/services/variant-embedding.service.js +59 -0
- package/dist/services/variant-embedding.service.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var AdminAiChatService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.AdminAiChatService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const core_1 = require("@nestjs/core");
|
|
19
|
+
const ai_1 = require("ai");
|
|
20
|
+
const openai_1 = require("@ai-sdk/openai");
|
|
21
|
+
const zod_1 = require("zod");
|
|
22
|
+
const core_2 = require("@vendure/core");
|
|
23
|
+
const constants_1 = require("../constants");
|
|
24
|
+
const embedding_service_1 = require("./embedding.service");
|
|
25
|
+
const product_embedding_service_1 = require("./product-embedding.service");
|
|
26
|
+
const collection_embedding_service_1 = require("./collection-embedding.service");
|
|
27
|
+
const chat_result_mapper_1 = require("./chat-result-mapper");
|
|
28
|
+
const admin_product_tools_1 = require("./admin-tools/admin-product-tools");
|
|
29
|
+
const admin_order_tools_1 = require("./admin-tools/admin-order-tools");
|
|
30
|
+
const admin_customer_tools_1 = require("./admin-tools/admin-customer-tools");
|
|
31
|
+
const admin_collection_tools_1 = require("./admin-tools/admin-collection-tools");
|
|
32
|
+
const admin_system_prompt_1 = require("./admin-system-prompt");
|
|
33
|
+
let AdminAiChatService = AdminAiChatService_1 = class AdminAiChatService {
|
|
34
|
+
constructor(options, connection, moduleRef, configService, embeddingService, productEmbeddingService, collectionEmbeddingService) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
this.connection = connection;
|
|
37
|
+
this.moduleRef = moduleRef;
|
|
38
|
+
this.configService = configService;
|
|
39
|
+
this.embeddingService = embeddingService;
|
|
40
|
+
this.productEmbeddingService = productEmbeddingService;
|
|
41
|
+
this.collectionEmbeddingService = collectionEmbeddingService;
|
|
42
|
+
this.logger = new common_1.Logger(AdminAiChatService_1.name);
|
|
43
|
+
this.assetUrlPrefix = '';
|
|
44
|
+
this.openai = (0, openai_1.createOpenAI)({ apiKey: options.openaiApiKey });
|
|
45
|
+
}
|
|
46
|
+
async onModuleInit() {
|
|
47
|
+
// Resolve FulltextSearchService
|
|
48
|
+
try {
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
50
|
+
const mod = require('@vendure/core/dist/plugin/default-search-plugin/fulltext-search.service');
|
|
51
|
+
this.fulltextSearchService = this.moduleRef.get(mod.FulltextSearchService, { strict: false });
|
|
52
|
+
this.logger.log('FulltextSearchService resolved for admin chat');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
this.logger.warn('FulltextSearchService not available for admin chat');
|
|
56
|
+
}
|
|
57
|
+
// Resolve asset URL prefix
|
|
58
|
+
if (this.options.assetBaseUrl) {
|
|
59
|
+
this.assetUrlPrefix = this.options.assetBaseUrl.endsWith('/')
|
|
60
|
+
? this.options.assetBaseUrl
|
|
61
|
+
: this.options.assetBaseUrl + '/';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
try {
|
|
65
|
+
const { apiOptions } = this.configService;
|
|
66
|
+
const hostname = apiOptions.hostname || 'localhost';
|
|
67
|
+
const port = apiOptions.port || 3000;
|
|
68
|
+
this.assetUrlPrefix = `http://${hostname === '0.0.0.0' ? 'localhost' : hostname}:${port}/assets/`;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
this.assetUrlPrefix = '/assets/';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Initialize helpers
|
|
75
|
+
this.mapper = new chat_result_mapper_1.ChatResultMapper(this.connection, this.assetUrlPrefix);
|
|
76
|
+
this.productTools = new admin_product_tools_1.AdminProductTools(this.connection, this.mapper, this.fulltextSearchService, this.embeddingService, this.productEmbeddingService, this.collectionEmbeddingService);
|
|
77
|
+
this.orderTools = new admin_order_tools_1.AdminOrderTools(this.connection, this.mapper);
|
|
78
|
+
this.customerTools = new admin_customer_tools_1.AdminCustomerTools(this.connection);
|
|
79
|
+
this.collectionTools = new admin_collection_tools_1.AdminCollectionTools(this.connection);
|
|
80
|
+
}
|
|
81
|
+
buildTools(ctx) {
|
|
82
|
+
return {
|
|
83
|
+
searchProducts: (0, ai_1.tool)({
|
|
84
|
+
description: 'Search products by keyword. Returns product cards with images, prices, stock levels, and admin details.',
|
|
85
|
+
inputSchema: zod_1.z.object({
|
|
86
|
+
query: zod_1.z.string().describe('Search term or product name'),
|
|
87
|
+
take: zod_1.z.number().optional().describe('Number of results (default 10, max 25)'),
|
|
88
|
+
includeDisabled: zod_1.z.boolean().optional().describe('Include disabled products (default false)'),
|
|
89
|
+
}),
|
|
90
|
+
execute: async (args) => this.productTools.searchProducts(ctx, args),
|
|
91
|
+
}),
|
|
92
|
+
vectorSearch: (0, ai_1.tool)({
|
|
93
|
+
description: 'Semantic/intent-based product search. Use for vague queries like "products for developers", "gaming accessories", "gifts for photographers". Falls back to this when keyword search returns no results.',
|
|
94
|
+
inputSchema: zod_1.z.object({
|
|
95
|
+
query: zod_1.z.string().describe('The semantic search query'),
|
|
96
|
+
}),
|
|
97
|
+
execute: async (args) => this.productTools.vectorSearch(ctx, args),
|
|
98
|
+
}),
|
|
99
|
+
getProductDetails: (0, ai_1.tool)({
|
|
100
|
+
description: 'Get full details for a specific product including all variants with stock levels, prices, and SKUs.',
|
|
101
|
+
inputSchema: zod_1.z.object({
|
|
102
|
+
productId: zod_1.z.string().optional().describe('Product ID'),
|
|
103
|
+
slug: zod_1.z.string().optional().describe('Product slug'),
|
|
104
|
+
}),
|
|
105
|
+
execute: async (args) => this.productTools.getProductDetails(ctx, args),
|
|
106
|
+
}),
|
|
107
|
+
searchOrders: (0, ai_1.tool)({
|
|
108
|
+
description: 'Search orders across the store. Can filter by order code, customer name/email, or order state.',
|
|
109
|
+
inputSchema: zod_1.z.object({
|
|
110
|
+
orderCode: zod_1.z.string().optional().describe('Order code to search for (partial match)'),
|
|
111
|
+
customerName: zod_1.z.string().optional().describe('Customer name or email to filter by'),
|
|
112
|
+
state: zod_1.z.string().optional().describe('Order state filter (e.g. PaymentSettled, Shipped, Delivered)'),
|
|
113
|
+
take: zod_1.z.number().optional().describe('Number of results (default 10, max 25)'),
|
|
114
|
+
}),
|
|
115
|
+
execute: async (args) => this.orderTools.searchOrders(ctx, args),
|
|
116
|
+
}),
|
|
117
|
+
searchCustomers: (0, ai_1.tool)({
|
|
118
|
+
description: 'Search customers by name or email. Returns customer details including order count and total spent.',
|
|
119
|
+
inputSchema: zod_1.z.object({
|
|
120
|
+
query: zod_1.z.string().describe('Customer name or email to search for'),
|
|
121
|
+
take: zod_1.z.number().optional().describe('Number of results (default 10, max 25)'),
|
|
122
|
+
}),
|
|
123
|
+
execute: async (args) => this.customerTools.searchCustomers(ctx, args),
|
|
124
|
+
}),
|
|
125
|
+
getCollections: (0, ai_1.tool)({
|
|
126
|
+
description: 'List or search product collections/categories with product counts.',
|
|
127
|
+
inputSchema: zod_1.z.object({
|
|
128
|
+
query: zod_1.z.string().optional().describe('Optional search term to filter collections'),
|
|
129
|
+
take: zod_1.z.number().optional().describe('Number of results (default 20, max 50)'),
|
|
130
|
+
}),
|
|
131
|
+
execute: async (args) => this.collectionTools.getCollections(ctx, args),
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async chat(ctx, userMessage, conversationHistory = []) {
|
|
136
|
+
var _a, _b, _c, _d;
|
|
137
|
+
const messages = [
|
|
138
|
+
{ role: 'system', content: admin_system_prompt_1.ADMIN_SYSTEM_PROMPT },
|
|
139
|
+
...conversationHistory,
|
|
140
|
+
{ role: 'user', content: userMessage },
|
|
141
|
+
];
|
|
142
|
+
const tools = this.buildTools(ctx);
|
|
143
|
+
const result = (0, ai_1.streamText)({
|
|
144
|
+
model: this.openai('gpt-4o-mini'),
|
|
145
|
+
messages,
|
|
146
|
+
tools,
|
|
147
|
+
stopWhen: (0, ai_1.stepCountIs)(5),
|
|
148
|
+
temperature: 0.7,
|
|
149
|
+
maxOutputTokens: 2048,
|
|
150
|
+
onStepFinish: (step) => {
|
|
151
|
+
if (step.toolResults && step.toolResults.length > 0) {
|
|
152
|
+
for (const tr of step.toolResults) {
|
|
153
|
+
this.logger.log(`Admin tool "${tr.toolName}" completed`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
onError: (event) => {
|
|
158
|
+
this.logger.error(`Admin chat streamText error: ${event.error}`);
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
const text = await result.text;
|
|
162
|
+
const steps = await result.steps;
|
|
163
|
+
let allProducts = [];
|
|
164
|
+
let allCollections = [];
|
|
165
|
+
let allOrders = [];
|
|
166
|
+
for (const step of steps) {
|
|
167
|
+
for (const toolResult of step.toolResults) {
|
|
168
|
+
const data = (_a = toolResult.output) !== null && _a !== void 0 ? _a : toolResult.result;
|
|
169
|
+
if (!data)
|
|
170
|
+
continue;
|
|
171
|
+
if (((_b = data.products) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
172
|
+
allProducts = this.mapper.mergeProducts(allProducts, data.products);
|
|
173
|
+
}
|
|
174
|
+
if (((_c = data.collections) === null || _c === void 0 ? void 0 : _c.length) > 0) {
|
|
175
|
+
allCollections = this.mapper.mergeCollections(allCollections, data.collections);
|
|
176
|
+
}
|
|
177
|
+
if (((_d = data.orders) === null || _d === void 0 ? void 0 : _d.length) > 0) {
|
|
178
|
+
allOrders = data.orders;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
message: text,
|
|
184
|
+
products: allProducts.slice(0, constants_1.MAX_CHAT_PRODUCTS),
|
|
185
|
+
collections: allCollections.slice(0, 5),
|
|
186
|
+
orders: allOrders.length > 0 ? allOrders : undefined,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
exports.AdminAiChatService = AdminAiChatService;
|
|
191
|
+
exports.AdminAiChatService = AdminAiChatService = AdminAiChatService_1 = __decorate([
|
|
192
|
+
(0, common_1.Injectable)(),
|
|
193
|
+
__param(0, (0, common_1.Inject)(constants_1.AI_ASSISTANT_OPTIONS)),
|
|
194
|
+
__metadata("design:paramtypes", [Object, core_2.TransactionalConnection,
|
|
195
|
+
core_1.ModuleRef,
|
|
196
|
+
core_2.ConfigService,
|
|
197
|
+
embedding_service_1.EmbeddingService,
|
|
198
|
+
product_embedding_service_1.ProductEmbeddingService,
|
|
199
|
+
collection_embedding_service_1.CollectionEmbeddingService])
|
|
200
|
+
], AdminAiChatService);
|
|
201
|
+
//# sourceMappingURL=admin-ai-chat.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-ai-chat.service.js","sourceRoot":"","sources":["../../src/services/admin-ai-chat.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const ADMIN_SYSTEM_PROMPT = "You are an AI assistant for store administrators using the Vendure e-commerce dashboard. You help admins manage their store by looking up products, orders, customers, and collections.\n\n## What you CAN do:\n- Search and look up products (including disabled/out-of-stock) with full admin details\n- Semantic search for products by intent (e.g. \"products for developers\", \"gaming gear\")\n- Search and look up orders by code, state, customer, or date range\n- Look up customer information by name or email\n- Browse and search collections/categories\n- Answer questions about the data you retrieve\n\n## What you MUST NOT do:\n- Answer questions unrelated to store administration\n- Make up data \u2014 ONLY use information from tool results\n- Perform destructive actions (delete products, cancel orders, etc.) \u2014 this is read-only for now\n\n## How to handle off-topic questions:\nPolitely redirect: \"I'm your store admin assistant and can help with products, orders, customers, and collections. What would you like to look up?\"\n\n## Tool usage:\n- `searchProducts` \u2014 keyword search for products. Returns product cards with images.\n- `vectorSearch` \u2014 semantic/intent-based product search. Use for vague or conceptual queries like \"products for gamers\", \"developer tools\", \"photography gear\".\n- `getProductDetails` \u2014 get full details for a specific product by ID or slug.\n- `searchOrders` \u2014 search orders by code, customer name, state. Returns order cards.\n- `searchCustomers` \u2014 search customers by name or email.\n- `getCollections` \u2014 list or search product collections/categories.\n\n## CRITICAL response rules for products:\n- When tools return product data, the UI automatically renders product cards with images, names, and prices below your message.\n- Do NOT list individual product names with prices in your text. Keep text to a brief summary like \"Here are the laptops we have in stock!\" or \"Found 3 products related to your search.\"\n- NEVER include markdown images in your response.\n\n## CRITICAL response rules for orders:\n- When tools return order data, the UI automatically renders order cards below your message.\n- Keep text to a brief summary. Do NOT repeat order details that are shown in the cards.\n\n## Response style:\n- Be concise and data-focused \u2014 admins want facts, not marketing fluff\n- Prices in tool results are in cents \u2014 convert to dollars when displaying (e.g. 4999 = $49.99)\n- NEVER echo raw tool result summaries. Paraphrase naturally.\n- For customers and collections (no cards), use markdown formatting (tables, bold, lists)";
|
|
2
|
+
//# sourceMappingURL=admin-system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-system-prompt.d.ts","sourceRoot":"","sources":["../../src/services/admin-system-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,ykFAuC0D,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ADMIN_SYSTEM_PROMPT = void 0;
|
|
4
|
+
exports.ADMIN_SYSTEM_PROMPT = `You are an AI assistant for store administrators using the Vendure e-commerce dashboard. You help admins manage their store by looking up products, orders, customers, and collections.
|
|
5
|
+
|
|
6
|
+
## What you CAN do:
|
|
7
|
+
- Search and look up products (including disabled/out-of-stock) with full admin details
|
|
8
|
+
- Semantic search for products by intent (e.g. "products for developers", "gaming gear")
|
|
9
|
+
- Search and look up orders by code, state, customer, or date range
|
|
10
|
+
- Look up customer information by name or email
|
|
11
|
+
- Browse and search collections/categories
|
|
12
|
+
- Answer questions about the data you retrieve
|
|
13
|
+
|
|
14
|
+
## What you MUST NOT do:
|
|
15
|
+
- Answer questions unrelated to store administration
|
|
16
|
+
- Make up data — ONLY use information from tool results
|
|
17
|
+
- Perform destructive actions (delete products, cancel orders, etc.) — this is read-only for now
|
|
18
|
+
|
|
19
|
+
## How to handle off-topic questions:
|
|
20
|
+
Politely redirect: "I'm your store admin assistant and can help with products, orders, customers, and collections. What would you like to look up?"
|
|
21
|
+
|
|
22
|
+
## Tool usage:
|
|
23
|
+
- \`searchProducts\` — keyword search for products. Returns product cards with images.
|
|
24
|
+
- \`vectorSearch\` — semantic/intent-based product search. Use for vague or conceptual queries like "products for gamers", "developer tools", "photography gear".
|
|
25
|
+
- \`getProductDetails\` — get full details for a specific product by ID or slug.
|
|
26
|
+
- \`searchOrders\` — search orders by code, customer name, state. Returns order cards.
|
|
27
|
+
- \`searchCustomers\` — search customers by name or email.
|
|
28
|
+
- \`getCollections\` — list or search product collections/categories.
|
|
29
|
+
|
|
30
|
+
## CRITICAL response rules for products:
|
|
31
|
+
- When tools return product data, the UI automatically renders product cards with images, names, and prices below your message.
|
|
32
|
+
- Do NOT list individual product names with prices in your text. Keep text to a brief summary like "Here are the laptops we have in stock!" or "Found 3 products related to your search."
|
|
33
|
+
- NEVER include markdown images in your response.
|
|
34
|
+
|
|
35
|
+
## CRITICAL response rules for orders:
|
|
36
|
+
- When tools return order data, the UI automatically renders order cards below your message.
|
|
37
|
+
- Keep text to a brief summary. Do NOT repeat order details that are shown in the cards.
|
|
38
|
+
|
|
39
|
+
## Response style:
|
|
40
|
+
- Be concise and data-focused — admins want facts, not marketing fluff
|
|
41
|
+
- Prices in tool results are in cents — convert to dollars when displaying (e.g. 4999 = $49.99)
|
|
42
|
+
- NEVER echo raw tool result summaries. Paraphrase naturally.
|
|
43
|
+
- For customers and collections (no cards), use markdown formatting (tables, bold, lists)`;
|
|
44
|
+
//# sourceMappingURL=admin-system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-system-prompt.js","sourceRoot":"","sources":["../../src/services/admin-system-prompt.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0FAuCuD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
interface AdminToolResult {
|
|
3
|
+
summary: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class AdminCollectionTools {
|
|
6
|
+
private connection;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(connection: TransactionalConnection);
|
|
9
|
+
getCollections(ctx: RequestContext, args: {
|
|
10
|
+
query?: string;
|
|
11
|
+
take?: number;
|
|
12
|
+
}): Promise<AdminToolResult>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=admin-collection-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-collection-tools.d.ts","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-collection-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAc,MAAM,eAAe,CAAC;AAEpF,UAAU,eAAe;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAIzB,OAAO,CAAC,UAAU;IAHtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAGpD,UAAU,EAAE,uBAAuB;IAGzC,cAAc,CAChB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACxC,OAAO,CAAC,eAAe,CAAC;CAwC9B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdminCollectionTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
class AdminCollectionTools {
|
|
7
|
+
constructor(connection) {
|
|
8
|
+
this.connection = connection;
|
|
9
|
+
this.logger = new common_1.Logger(AdminCollectionTools.name);
|
|
10
|
+
}
|
|
11
|
+
async getCollections(ctx, args) {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
const query = ((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
14
|
+
const take = Math.min((_b = args.take) !== null && _b !== void 0 ? _b : 20, 50);
|
|
15
|
+
const repo = this.connection.rawConnection.getRepository(core_1.Collection);
|
|
16
|
+
let qb = repo.createQueryBuilder('collection')
|
|
17
|
+
.leftJoinAndSelect('collection.translations', 'translation')
|
|
18
|
+
.loadRelationCountAndMap('collection.productCount', 'collection.productVariants')
|
|
19
|
+
.where('collection.isRoot = :isRoot', { isRoot: false });
|
|
20
|
+
if (query) {
|
|
21
|
+
qb = qb.andWhere('LOWER(translation.name) LIKE :term', { term: `%${query.toLowerCase()}%` });
|
|
22
|
+
}
|
|
23
|
+
qb = qb.orderBy('collection.position', 'ASC').take(take);
|
|
24
|
+
try {
|
|
25
|
+
const collections = await qb.getMany();
|
|
26
|
+
if (collections.length === 0) {
|
|
27
|
+
return { summary: query ? `No collections found matching "${query}".` : 'No collections found.' };
|
|
28
|
+
}
|
|
29
|
+
const lines = collections.map(c => {
|
|
30
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
31
|
+
const name = (_c = (_b = (_a = c.translations) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '';
|
|
32
|
+
const slug = (_f = (_e = (_d = c.translations) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.slug) !== null && _f !== void 0 ? _f : '';
|
|
33
|
+
const isPrivate = c.isPrivate ? ' (PRIVATE)' : '';
|
|
34
|
+
const productCount = (_g = c.productCount) !== null && _g !== void 0 ? _g : '?';
|
|
35
|
+
return `- **${name}** (ID: ${c.id}) | Slug: ${slug} | ${productCount} product(s)${isPrivate}`;
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
summary: `Found ${collections.length} collection(s)${query ? ` matching "${query}"` : ''}:\n${lines.join('\n')}`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
this.logger.error(`Error fetching collections: ${e}`);
|
|
43
|
+
return { summary: 'Error fetching collections. Please try again.' };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.AdminCollectionTools = AdminCollectionTools;
|
|
48
|
+
//# sourceMappingURL=admin-collection-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-collection-tools.js","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-collection-tools.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AACxC,wCAAoF;AAMpF,MAAa,oBAAoB;IAG7B,YACY,UAAmC;QAAnC,eAAU,GAAV,UAAU,CAAyB;QAH9B,WAAM,GAAG,IAAI,eAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAI7D,CAAC;IAEJ,KAAK,CAAC,cAAc,CAChB,GAAmB,EACnB,IAAuC;;QAEvC,MAAM,KAAK,GAAG,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,iBAAU,CAAC,CAAC;QAErE,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;aACzC,iBAAiB,CAAC,yBAAyB,EAAE,aAAa,CAAC;aAC3D,uBAAuB,CAAC,yBAAyB,EAAE,4BAA4B,CAAC;aAChF,KAAK,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7D,IAAI,KAAK,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,oCAAoC,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YAEvC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,kCAAkC,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC;YACtG,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;;gBAC9B,MAAM,IAAI,GAAG,MAAA,MAAA,MAAC,CAAS,CAAC,YAAY,0CAAG,CAAC,CAAC,0CAAE,IAAI,mCAAI,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,MAAA,MAAA,MAAC,CAAS,CAAC,YAAY,0CAAG,CAAC,CAAC,0CAAE,IAAI,mCAAI,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAI,CAAS,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,MAAM,YAAY,GAAG,MAAC,CAAS,CAAC,YAAY,mCAAI,GAAG,CAAC;gBACpD,OAAO,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,IAAI,MAAM,YAAY,cAAc,SAAS,EAAE,CAAC;YAClG,CAAC,CAAC,CAAC;YAEH,OAAO;gBACH,OAAO,EAAE,SAAS,WAAW,CAAC,MAAM,iBAAiB,KAAK,CAAC,CAAC,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACnH,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC;QACxE,CAAC;IACL,CAAC;CACJ;AAlDD,oDAkDC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
interface AdminToolResult {
|
|
3
|
+
summary: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class AdminCustomerTools {
|
|
6
|
+
private connection;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(connection: TransactionalConnection);
|
|
9
|
+
searchCustomers(ctx: RequestContext, args: {
|
|
10
|
+
query: string;
|
|
11
|
+
take?: number;
|
|
12
|
+
}): Promise<AdminToolResult>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=admin-customer-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-customer-tools.d.ts","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-customer-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAmB,MAAM,eAAe,CAAC;AAGzF,UAAU,eAAe;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,kBAAkB;IAIvB,OAAO,CAAC,UAAU;IAHtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAGlD,UAAU,EAAE,uBAAuB;IAGzC,eAAe,CACjB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC,eAAe,CAAC;CAqD9B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdminCustomerTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
class AdminCustomerTools {
|
|
8
|
+
constructor(connection) {
|
|
9
|
+
this.connection = connection;
|
|
10
|
+
this.logger = new common_1.Logger(AdminCustomerTools.name);
|
|
11
|
+
}
|
|
12
|
+
async searchCustomers(ctx, args) {
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
14
|
+
const query = ((_a = args.query) !== null && _a !== void 0 ? _a : '').trim();
|
|
15
|
+
const take = Math.min((_b = args.take) !== null && _b !== void 0 ? _b : 10, 25);
|
|
16
|
+
if (!query) {
|
|
17
|
+
return { summary: 'No search query provided.' };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const customerRepo = this.connection.rawConnection.getRepository(core_1.Customer);
|
|
21
|
+
const customers = await customerRepo.createQueryBuilder('customer')
|
|
22
|
+
.leftJoinAndSelect('customer.user', 'user')
|
|
23
|
+
.where('customer.deletedAt IS NULL')
|
|
24
|
+
.andWhere('(LOWER(customer.firstName) LIKE :term OR LOWER(customer.lastName) LIKE :term OR LOWER(customer.emailAddress) LIKE :term)', { term: `%${query.toLowerCase()}%` })
|
|
25
|
+
.take(take)
|
|
26
|
+
.getMany();
|
|
27
|
+
if (customers.length === 0) {
|
|
28
|
+
return { summary: `No customers found matching "${query}".` };
|
|
29
|
+
}
|
|
30
|
+
// Get order counts and totals for each customer
|
|
31
|
+
const orderRepo = this.connection.rawConnection.getRepository(core_1.Order);
|
|
32
|
+
const lines = [];
|
|
33
|
+
for (const c of customers) {
|
|
34
|
+
const orderStats = await orderRepo.createQueryBuilder('order')
|
|
35
|
+
.select('COUNT(order.id)', 'count')
|
|
36
|
+
.addSelect('COALESCE(SUM(order.totalWithTax), 0)', 'total')
|
|
37
|
+
.where('order.customerId = :customerId', { customerId: c.id })
|
|
38
|
+
.andWhere('order.active = :active', { active: false })
|
|
39
|
+
.getRawOne();
|
|
40
|
+
const orderCount = parseInt((_c = orderStats === null || orderStats === void 0 ? void 0 : orderStats.count) !== null && _c !== void 0 ? _c : '0', 10);
|
|
41
|
+
const totalSpent = parseInt((_d = orderStats === null || orderStats === void 0 ? void 0 : orderStats.total) !== null && _d !== void 0 ? _d : '0', 10);
|
|
42
|
+
const created = c.createdAt ? new Date(c.createdAt).toISOString().split('T')[0] : 'N/A';
|
|
43
|
+
lines.push(`- **${(_e = c.firstName) !== null && _e !== void 0 ? _e : ''} ${(_f = c.lastName) !== null && _f !== void 0 ? _f : ''}** (ID: ${c.id}) | ${(_g = c.emailAddress) !== null && _g !== void 0 ? _g : 'no email'} | ${orderCount} order(s) | Total spent: ${(0, constants_1.formatPrice)(totalSpent)} | Joined: ${created}`);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
summary: `Found ${customers.length} customer(s) matching "${query}":\n${lines.join('\n')}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
this.logger.error(`Error searching customers: ${e}`);
|
|
51
|
+
return { summary: 'Error searching customers. Please try again.' };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.AdminCustomerTools = AdminCustomerTools;
|
|
56
|
+
//# sourceMappingURL=admin-customer-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-customer-tools.js","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-customer-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
import { ChatResultMapper } from '../chat-result-mapper';
|
|
3
|
+
import type { ToolResult } from '../types';
|
|
4
|
+
export declare class AdminOrderTools {
|
|
5
|
+
private connection;
|
|
6
|
+
private mapper;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(connection: TransactionalConnection, mapper: ChatResultMapper);
|
|
9
|
+
searchOrders(ctx: RequestContext, args: {
|
|
10
|
+
orderCode?: string;
|
|
11
|
+
customerName?: string;
|
|
12
|
+
state?: string;
|
|
13
|
+
take?: number;
|
|
14
|
+
}): Promise<ToolResult>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=admin-order-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-order-tools.d.ts","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-order-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAS,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,qBAAa,eAAe;IAIpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IAJlB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAG/C,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB;IAG9B,YAAY,CACd,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,GACF,OAAO,CAAC,UAAU,CAAC;CA8DzB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdminOrderTools = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const core_1 = require("@vendure/core");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
class AdminOrderTools {
|
|
8
|
+
constructor(connection, mapper) {
|
|
9
|
+
this.connection = connection;
|
|
10
|
+
this.mapper = mapper;
|
|
11
|
+
this.logger = new common_1.Logger(AdminOrderTools.name);
|
|
12
|
+
}
|
|
13
|
+
async searchOrders(ctx, args) {
|
|
14
|
+
var _a;
|
|
15
|
+
const take = Math.min((_a = args.take) !== null && _a !== void 0 ? _a : 10, 25);
|
|
16
|
+
const orderRepo = this.connection.rawConnection.getRepository(core_1.Order);
|
|
17
|
+
let qb = orderRepo.createQueryBuilder('order')
|
|
18
|
+
.leftJoinAndSelect('order.customer', 'customer')
|
|
19
|
+
.leftJoinAndSelect('customer.user', 'user')
|
|
20
|
+
.leftJoinAndSelect('order.lines', 'line')
|
|
21
|
+
.leftJoinAndSelect('line.featuredAsset', 'lineFeaturedAsset')
|
|
22
|
+
.leftJoinAndSelect('line.productVariant', 'variant')
|
|
23
|
+
.leftJoinAndSelect('variant.translations', 'variantTranslation')
|
|
24
|
+
.leftJoinAndSelect('variant.featuredAsset', 'variantFeaturedAsset')
|
|
25
|
+
.leftJoinAndSelect('variant.product', 'product')
|
|
26
|
+
.leftJoinAndSelect('product.featuredAsset', 'productFeaturedAsset')
|
|
27
|
+
.leftJoinAndSelect('product.translations', 'productTranslation')
|
|
28
|
+
.leftJoinAndSelect('order.fulfillments', 'fulfillment')
|
|
29
|
+
.where('order.active = :active', { active: false });
|
|
30
|
+
if (args.orderCode) {
|
|
31
|
+
qb = qb.andWhere('order.code ILIKE :code', { code: `%${args.orderCode}%` });
|
|
32
|
+
}
|
|
33
|
+
if (args.customerName) {
|
|
34
|
+
qb = qb.andWhere('(LOWER(customer.firstName) LIKE :name OR LOWER(customer.lastName) LIKE :name OR LOWER(customer.emailAddress) LIKE :name)', { name: `%${args.customerName.toLowerCase()}%` });
|
|
35
|
+
}
|
|
36
|
+
if (args.state) {
|
|
37
|
+
qb = qb.andWhere('order.state = :state', { state: args.state });
|
|
38
|
+
}
|
|
39
|
+
qb = qb.orderBy('order.orderPlacedAt', 'DESC').take(take);
|
|
40
|
+
try {
|
|
41
|
+
const orders = await qb.getMany();
|
|
42
|
+
if (orders.length === 0) {
|
|
43
|
+
return { products: [], collections: [], summary: 'No orders found matching the criteria.' };
|
|
44
|
+
}
|
|
45
|
+
const mapped = this.mapper.mapOrders(orders);
|
|
46
|
+
const summaryLines = orders.map(o => {
|
|
47
|
+
var _a, _b, _c;
|
|
48
|
+
const customer = o.customer;
|
|
49
|
+
const customerStr = customer
|
|
50
|
+
? `${(_a = customer.firstName) !== null && _a !== void 0 ? _a : ''} ${(_b = customer.lastName) !== null && _b !== void 0 ? _b : ''}`.trim()
|
|
51
|
+
: 'Guest';
|
|
52
|
+
const total = (_c = o.totalWithTax) !== null && _c !== void 0 ? _c : 0;
|
|
53
|
+
return `${o.code} (${o.state}, ${customerStr}, ${(0, constants_1.formatPrice)(total)})`;
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
products: [],
|
|
57
|
+
collections: [],
|
|
58
|
+
orders: mapped,
|
|
59
|
+
summary: `Found ${mapped.length} order(s): ${summaryLines.join('; ')}. Order cards are shown in the UI — keep your text brief.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
this.logger.error(`Error searching orders: ${e}`);
|
|
64
|
+
return { products: [], collections: [], summary: 'Error searching orders. Please try again.' };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.AdminOrderTools = AdminOrderTools;
|
|
69
|
+
//# sourceMappingURL=admin-order-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-order-tools.js","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-order-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { RequestContext, TransactionalConnection } from '@vendure/core';
|
|
2
|
+
import { ChatResultMapper } from '../chat-result-mapper';
|
|
3
|
+
import { EmbeddingService } from '../embedding.service';
|
|
4
|
+
import { ProductEmbeddingService } from '../product-embedding.service';
|
|
5
|
+
import { CollectionEmbeddingService } from '../collection-embedding.service';
|
|
6
|
+
import type { ToolResult } from '../types';
|
|
7
|
+
export declare class AdminProductTools {
|
|
8
|
+
private connection;
|
|
9
|
+
private mapper;
|
|
10
|
+
private fulltextSearchService;
|
|
11
|
+
private embeddingService;
|
|
12
|
+
private productEmbeddingService;
|
|
13
|
+
private collectionEmbeddingService;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
constructor(connection: TransactionalConnection, mapper: ChatResultMapper, fulltextSearchService: any, embeddingService: EmbeddingService, productEmbeddingService: ProductEmbeddingService, collectionEmbeddingService: CollectionEmbeddingService);
|
|
16
|
+
searchProducts(ctx: RequestContext, args: {
|
|
17
|
+
query: string;
|
|
18
|
+
take?: number;
|
|
19
|
+
includeDisabled?: boolean;
|
|
20
|
+
}): Promise<ToolResult>;
|
|
21
|
+
vectorSearch(ctx: RequestContext, args: {
|
|
22
|
+
query: string;
|
|
23
|
+
}): Promise<ToolResult>;
|
|
24
|
+
getProductDetails(ctx: RequestContext, args: {
|
|
25
|
+
productId?: string;
|
|
26
|
+
slug?: string;
|
|
27
|
+
}): Promise<ToolResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=admin-product-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-product-tools.d.ts","sourceRoot":"","sources":["../../../src/services/admin-tools/admin-product-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAW,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAmC,UAAU,EAAE,MAAM,UAAU,CAAC;AAE5E,qBAAa,iBAAiB;IAItB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,qBAAqB;IAC7B,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,uBAAuB;IAC/B,OAAO,CAAC,0BAA0B;IARtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;gBAGjD,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,gBAAgB,EACxB,qBAAqB,EAAE,GAAG,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,uBAAuB,EAChD,0BAA0B,EAAE,0BAA0B;IAG5D,cAAc,CAChB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAClE,OAAO,CAAC,UAAU,CAAC;IAoDhB,YAAY,CACd,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GACxB,OAAO,CAAC,UAAU,CAAC;IAwChB,iBAAiB,CACnB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,UAAU,CAAC;CAgDzB"}
|