vantuz 3.3.1 → 3.3.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.
@@ -0,0 +1,191 @@
1
+ // core/openclaw-bridge.js
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import crypto from 'crypto';
5
+ import { log } from './ai-provider.js';
6
+
7
+ const DEFAULT_PORT = 18789;
8
+
9
+ function loadOpenclawConfig() {
10
+ try {
11
+ const configPath = path.join(process.cwd(), '.openclaw', 'openclaw.json');
12
+ if (fs.existsSync(configPath)) {
13
+ return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
14
+ }
15
+ } catch (e) {
16
+ log('WARN', 'Gateway config okunamadı', { error: e.message });
17
+ }
18
+ return {};
19
+ }
20
+
21
+ function buildGatewayUrl(config) {
22
+ const port = config?.gateway?.port || DEFAULT_PORT;
23
+ const tls = config?.gateway?.tls?.enabled === true;
24
+ const scheme = tls ? 'wss' : 'ws';
25
+ return `${scheme}://127.0.0.1:${port}`;
26
+ }
27
+
28
+ function getAuthToken(config) {
29
+ return config?.gateway?.auth?.token || null;
30
+ }
31
+
32
+ function toStringSafe(value) {
33
+ return typeof value === 'string' ? value : '';
34
+ }
35
+
36
+ function normalizeChannel(value) {
37
+ if (!value) return '';
38
+ return String(value).toLowerCase();
39
+ }
40
+
41
+ function isOutbound(payload) {
42
+ if (!payload || typeof payload !== 'object') return false;
43
+ if (payload.fromMe === true) return true;
44
+ if (payload.outbound === true) return true;
45
+ if (payload.direction && String(payload.direction).toLowerCase() === 'outbound') return true;
46
+ if (payload.isBot === true) return true;
47
+ return false;
48
+ }
49
+
50
+ function extractInbound(evt) {
51
+ if (!evt || evt.type !== 'event') return null;
52
+ const payload = evt.payload;
53
+ if (!payload || typeof payload !== 'object') return null;
54
+
55
+ if (isOutbound(payload)) return null;
56
+
57
+ const message =
58
+ toStringSafe(payload.message) ||
59
+ toStringSafe(payload.body) ||
60
+ toStringSafe(payload.text) ||
61
+ toStringSafe(payload.content);
62
+
63
+ if (!message) return null;
64
+
65
+ const channel =
66
+ normalizeChannel(payload.channel) ||
67
+ normalizeChannel(payload.provider) ||
68
+ normalizeChannel(payload.channelId);
69
+
70
+ const from =
71
+ toStringSafe(payload.from) ||
72
+ toStringSafe(payload.sender) ||
73
+ toStringSafe(payload.author) ||
74
+ toStringSafe(payload.user) ||
75
+ toStringSafe(payload.peer) ||
76
+ toStringSafe(payload.chatJid);
77
+
78
+ if (!from) return null;
79
+
80
+ return { message, channel: channel || 'whatsapp', from };
81
+ }
82
+
83
+ function appendEventLog(evt) {
84
+ try {
85
+ const logPath = path.join(process.cwd(), '.vantuz', 'gateway-events.log');
86
+ const line = `${new Date().toISOString()} ${JSON.stringify(evt)}\n`;
87
+ fs.appendFileSync(logPath, line);
88
+ } catch { }
89
+ }
90
+
91
+ export class OpenClawBridge {
92
+ constructor(engine, gateway) {
93
+ this.engine = engine;
94
+ this.gateway = gateway;
95
+ this.ws = null;
96
+ this.connected = false;
97
+ }
98
+
99
+ start() {
100
+ const config = loadOpenclawConfig();
101
+ const url = buildGatewayUrl(config);
102
+ const token = getAuthToken(config);
103
+
104
+ if (!token) {
105
+ log('WARN', 'Gateway token bulunamadı; bridge başlatılmadı');
106
+ return;
107
+ }
108
+
109
+ if (typeof WebSocket === 'undefined') {
110
+ log('WARN', 'WebSocket bulunamadı; bridge başlatılamadı');
111
+ return;
112
+ }
113
+
114
+ this.ws = new WebSocket(url);
115
+ this.ws.onopen = () => {
116
+ this._sendConnect(token);
117
+ };
118
+
119
+ this.ws.onmessage = async (event) => {
120
+ let parsed = null;
121
+ try {
122
+ parsed = JSON.parse(event.data);
123
+ } catch {
124
+ return;
125
+ }
126
+
127
+ if (parsed?.type === 'event') {
128
+ const inbound = extractInbound(parsed);
129
+ if (inbound) {
130
+ try {
131
+ const response = await this.engine.handleMessage(inbound.message, {
132
+ channel: inbound.channel,
133
+ from: inbound.from
134
+ });
135
+ if (response && this.gateway?.isConnected()) {
136
+ await this.gateway.sendMessage(inbound.channel, inbound.from, response);
137
+ }
138
+ } catch (e) {
139
+ log('ERROR', 'Inbound 처리 hatası', { error: e.message });
140
+ }
141
+ } else {
142
+ appendEventLog(parsed);
143
+ }
144
+ }
145
+ };
146
+
147
+ this.ws.onclose = () => {
148
+ this.connected = false;
149
+ log('WARN', 'Gateway WS bağlantısı kapandı');
150
+ };
151
+
152
+ this.ws.onerror = (err) => {
153
+ this.connected = false;
154
+ log('WARN', 'Gateway WS hata', { error: String(err?.message || err) });
155
+ };
156
+ }
157
+
158
+ _sendConnect(token) {
159
+ const id = crypto.randomUUID();
160
+ const params = {
161
+ minProtocol: 3,
162
+ maxProtocol: 3,
163
+ client: {
164
+ id: 'vantuz',
165
+ version: '3.3.1',
166
+ platform: process.platform,
167
+ mode: 'backend'
168
+ },
169
+ role: 'operator',
170
+ scopes: ['operator.admin'],
171
+ auth: { token }
172
+ };
173
+
174
+ const frame = {
175
+ type: 'req',
176
+ id,
177
+ method: 'connect',
178
+ params
179
+ };
180
+
181
+ try {
182
+ this.ws.send(JSON.stringify(frame));
183
+ this.connected = true;
184
+ log('INFO', 'Gateway WS connect gönderildi');
185
+ } catch (e) {
186
+ log('WARN', 'Gateway WS connect gönderilemedi', { error: e.message });
187
+ }
188
+ }
189
+ }
190
+
191
+ export default OpenClawBridge;
package/onboard.js CHANGED
@@ -1,322 +1,11 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * VANTUZ - Profesyonel Kurulum Sihirbazı
5
- * v3.2.7 - OpenClaw Gateway Entegrasyonlu
6
- */
7
-
8
- import fs from 'fs';
9
- import path from 'path';
10
- import os from 'os';
11
- import readline from 'readline';
12
- import { fileURLToPath } from 'url';
13
-
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
- const VANTUZ_HOME = path.join(os.homedir(), '.vantuz');
16
- const CONFIG_PATH = path.join(VANTUZ_HOME, '.env');
17
-
18
- // Colors
19
- const colors = {
20
- reset: '\x1b[0m', bold: '\x1b[1m', dim: '\x1b[2m',
21
- red: '\x1b[31m', green: '\x1b[32m', yellow: '\x1b[33m',
22
- blue: '\x1b[34m', magenta: '\x1b[35m', cyan: '\x1b[36m'
23
- };
24
-
25
- const c = (color, text) => `${colors[color]}${text}${colors.reset}`;
26
- const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
27
-
28
- const LOGO = `
29
- V A N T U Z A I
30
- -----------------
31
- Enterprise E-Ticaret Yönetimi
32
- `;
33
-
34
- const WELCOME_BOX = `
35
- -----------------------------------------------------------------
36
- HOŞ GELDİNİZ - Vantuz AI Kurulumu
37
- -----------------------------------------------------------------
38
-
39
- Bu sihirbaz kurulumu tamamlamanıza yardımcı olacak:
40
-
41
- [ ] AI Servis Seçimi
42
- [ ] Pazaryeri Bağlantıları
43
- [ ] İletişim Kanalları
44
- [ ] OpenClaw Gateway Yapılandırması
45
-
46
- -----------------------------------------------------------------
47
- `;
48
-
49
- class OnboardingWizard {
50
- constructor() {
51
- this.envVars = {};
52
- this.step = 0;
53
- this.totalSteps = 6; // Updated total steps
54
- }
55
-
56
- async step_EIAConfig() {
57
- this.step = 5; // Adjust step number
58
- this.printHeader('E-TICARET YÖNETİM AJANSI (EIA) YAPILANDIRMASI');
59
-
60
- console.log('EIA\'nın operasyonlarını optimize etmek için bazı bilgiler sağlayın.\n');
61
-
62
- const competitorUrls = await this.prompt('Rakip Ürün URL\'leri (virgülle ayırarak): ');
63
- if (competitorUrls) {
64
- this.envVars.EIA_COMPETITOR_URLS = competitorUrls.trim();
65
- console.log(c('green', '[OK] Rakip URL\'leri kaydedildi.\n'));
66
- } else {
67
- console.log(c('yellow', '[BİLGİ] Rakip URL\'leri girilmedi.\n'));
68
- }
69
-
70
- const profitMargin = await this.prompt('Hedef Kar Marjı (%) [15]: ');
71
- if (profitMargin && !isNaN(parseFloat(profitMargin))) {
72
- this.envVars.EIA_TARGET_PROFIT_MARGIN = parseFloat(profitMargin);
73
- console.log(c('green', '[OK] Hedef Kar Marjı kaydedildi.\n'));
74
- } else {
75
- this.envVars.EIA_TARGET_PROFIT_MARGIN = 15; // Default if invalid
76
- console.log(c('yellow', '[BİLGİ] Geçersiz kar marjı, varsayılan %15 kullanılıyor.\n'));
77
- }
78
- await sleep(1000);
79
- }
80
-
81
- clear() { console.clear(); }
82
-
83
- async showLogo() {
84
- this.clear();
85
- console.log(c('cyan', LOGO));
86
- await sleep(500);
87
- }
88
-
89
- async run() {
90
- try {
91
- await this.showLogo();
92
- await this.showWelcome();
93
- console.log(c('green', '⚡ Geliştirici Modu: Lisans kontrolü atlandı.\n'));
94
- await this.step1_AIProvider();
95
- await this.step2_Platforms();
96
- await this.step3_Channels();
97
- await this.step4_Gateway();
98
- await this.step_EIAConfig(); // New step
99
- await this.step5_Save();
100
- await this.showSuccess();
101
- } catch (error) {
102
- console.error('\n' + c('red', `Beklenmeyen Hata: ${error.message}`));
103
- process.exit(1);
104
- }
105
- }
106
-
107
- printHeader(title) {
108
- this.clear();
109
- console.log(c('cyan', LOGO));
110
- console.log('\n' + c('bold', `ADIM ${this.step}/${this.totalSteps}: ${title}`));
111
- console.log('-'.repeat(50) + '\n');
112
- }
113
-
114
- async showWelcome() {
115
- console.log(WELCOME_BOX);
116
- await this.prompt(c('dim', 'Devam etmek için Enter\'a basın...'));
117
- }
118
-
119
- // ADIM 1: AI PROVIDER
120
- async step1_AIProvider() {
121
- this.step = 1;
122
- this.printHeader('YAPAY ZEKA SERVİSİ');
123
-
124
- console.log('Kullanılacak AI modelini seçin:\n');
125
- console.log(' 1. Google Gemini (Önerilen/Ücretsiz)');
126
- console.log(' 2. OpenAI GPT-4o');
127
- console.log(' 3. Anthropic Claude 3.5');
128
- console.log(' 4. DeepSeek V3');
129
- console.log(' 5. Groq (Hızlı/Ücretsiz)');
130
- console.log(c('dim', ' S. Atla (Daha sonra ayarla)\n'));
131
-
132
- const choice = await this.prompt('Seçiminiz (1-5 veya S) [1]: ') || '1';
133
-
134
- if (choice.toLowerCase() === 's') {
135
- console.log(c('yellow', '\n[ATLANDI] AI yapılandırması geçildi.\n'));
136
- await sleep(1000);
137
- return;
138
- }
139
-
140
- const providers = {
141
- '1': { label: 'Google Gemini', env: 'GEMINI_API_KEY' },
142
- '2': { label: 'OpenAI', env: 'OPENAI_API_KEY' },
143
- '3': { label: 'Anthropic', env: 'ANTHROPIC_API_KEY' },
144
- '4': { label: 'DeepSeek', env: 'DEEPSEEK_API_KEY' },
145
- '5': { label: 'Groq', env: 'GROQ_API_KEY' }
146
- };
147
-
148
- const selected = providers[choice] || providers['1'];
149
- console.log(c('green', `\n[SEÇİLDİ] ${selected.label}\n`));
150
-
151
- const key = await this.prompt(`${selected.label} API Key: `);
152
-
153
- if (key && key.trim()) {
154
- this.envVars[selected.env] = key.trim();
155
- console.log(c('green', '\n[OK] API anahtarı kaydedildi.\n'));
156
- } else {
157
- console.log(c('yellow', '\n[BİLGİ] API anahtarı girilmedi, daha sonra ekleyebilirsiniz.\n'));
158
- }
159
- await sleep(1000);
160
- }
161
-
162
- // ADIM 2: PAZARYERLERİ
163
- async step2_Platforms() {
164
- this.step = 2;
165
- this.printHeader('PAZARYERİ ENTEGRASYONLARI');
166
-
167
- console.log('Hangi pazaryerini yapılandırmak istersiniz?\n');
168
- console.log(' 1. Trendyol');
169
- console.log(' 2. Hepsiburada');
170
- console.log(' 3. N11');
171
- console.log(' 4. Amazon');
172
- console.log(c('dim', ' S. Atla (Tümünü geç)\n'));
173
-
174
- const choice = await this.prompt('Seçiminiz (1-4 veya S) [1]: ') || '1';
175
-
176
- if (choice.toLowerCase() === 's') return;
177
-
178
- if (choice === '1') {
179
- console.log(c('cyan', '\nTrendyol Yapılandırması\n'));
180
- console.log(c('dim', '(Boş bırakıp Enter\'a basarak geçebilirsiniz)\n'));
181
-
182
- const supplierId = await this.prompt('Supplier ID: ');
183
- if (!supplierId) {
184
- console.log(c('yellow', '[ATLANDI] Trendyol ayarları yapılmadı.'));
185
- return;
186
- }
187
-
188
- const apiKey = await this.prompt('API Key: ');
189
- const apiSecret = await this.prompt('API Secret: ');
190
-
191
- this.envVars.TRENDYOL_SUPPLIER_ID = supplierId;
192
- this.envVars.TRENDYOL_API_KEY = apiKey;
193
- this.envVars.TRENDYOL_API_SECRET = apiSecret;
194
-
195
- console.log(c('green', '\n[OK] Trendyol bilgileri alındı.\n'));
196
- await sleep(1000);
197
- }
198
- }
199
-
200
- // ADIM 3: KANALLAR
201
- async step3_Channels() {
202
- this.step = 3;
203
- this.printHeader('İLETİŞİM KANALLARI');
204
-
205
- console.log('WhatsApp ve Telegram entegrasyonu.\n');
206
-
207
- const setup = await this.prompt('Telegram Bot Token eklemek ister misiniz? (e/H): ');
208
-
209
- if (setup.toLowerCase() === 'e' || setup.toLowerCase() === 'y') {
210
- const token = await this.prompt('Telegram Bot Token: ');
211
- if (token) {
212
- this.envVars.TELEGRAM_BOT_TOKEN = token;
213
- console.log(c('green', '\n[OK] Telegram token alındı.\n'));
214
- }
215
- }
216
-
217
- console.log(c('dim', '\nNot: WhatsApp bağlantısı "openclaw channels login" ile yapılır.\n'));
218
- await sleep(1500);
219
- }
220
-
221
- // ADIM 4: VANTUZ GATEWAY
222
- async step4_Gateway() {
223
- this.step = 4;
224
- this.printHeader('VANTUZ GATEWAY');
225
-
226
- console.log('Vantuz Gateway, AI ve kanal yönetimini güçlendirir.\n');
227
-
228
- // .openclaw/ klasörü kontrolü
229
- const openclawDir = path.join(process.cwd(), '.openclaw');
230
- const openclawConfig = path.join(openclawDir, 'openclaw.json');
231
-
232
- if (fs.existsSync(openclawConfig)) {
233
- console.log(c('green', '✔ Gateway yapılandırması bulundu.'));
234
- try {
235
- const config = JSON.parse(fs.readFileSync(openclawConfig, 'utf-8'));
236
- if (config.gateway?.auth?.token) {
237
- console.log(c('green', '✔ Token ve güvenlik anahtarları hazır.'));
238
- }
239
- } catch (e) {
240
- console.log(c('yellow', '⚠ Config okunamadı.'));
241
- }
242
- } else {
243
- console.log(c('yellow', '⚠ Gateway yapılandırması eksik.'));
244
- console.log(c('dim', '\nOtomatik olarak oluşturulacak...\n'));
245
- }
246
-
247
- console.log(c('dim', '\nBaşlatmak için sadece: start.bat'));
248
- console.log(c('dim', 'Durum kontrolü: vantuz gateway status\n'));
249
-
250
- await this.prompt(c('dim', 'Devam etmek için Enter\'a basın...'));
251
- }
252
-
253
- // KAYDET
254
- async step5_Save() {
255
- this.step = 5;
256
- this.printHeader('AYARLAR KAYDEDİLİYOR');
257
-
258
- console.log('Yapılandırma dosyası oluşturuluyor...');
259
-
260
- if (!fs.existsSync(VANTUZ_HOME)) {
261
- fs.mkdirSync(VANTUZ_HOME, { recursive: true });
262
- }
263
-
264
- let envContent = '# Vantuz AI Yapılandırması\n';
265
- envContent += `# Oluşturulma Tarihi: ${new Date().toISOString()}\n\n`;
266
-
267
- for (const [key, value] of Object.entries(this.envVars)) {
268
- if (value) {
269
- envContent += `${key}=${value}\n`;
270
- }
271
- }
272
-
273
- fs.writeFileSync(CONFIG_PATH, envContent);
274
- console.log(c('green', `[OK] Dosya kaydedildi: ${CONFIG_PATH}`));
275
- await sleep(500);
276
-
277
- // Klasörler
278
- ['logs', 'data', 'cache'].forEach(dir => {
279
- const p = path.join(VANTUZ_HOME, dir);
280
- if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true });
281
- });
282
- console.log(c('green', '[OK] Veri klasörleri oluşturuldu.'));
283
- await sleep(1000);
284
- }
285
-
286
- async showSuccess() {
287
- this.clear();
288
- console.log('\n');
289
- console.log(c('green', '=================================================='));
290
- console.log(c('green', ' KURULUM BAŞARIYLA TAMAMLANDI '));
291
- console.log(c('green', '=================================================='));
292
- console.log('\n');
293
- console.log('Vantuz AI kullanıma hazırdır.\n');
294
- console.log('Başlamak için şu komutları kullanabilirsiniz:');
295
- console.log(c('cyan', ' vantuz tui') + ' - Sohbet arayüzünü başlatır');
296
- console.log(c('cyan', ' vantuz status') + ' - Sistem durumunu gösterir');
297
- console.log(c('cyan', ' vantuz gateway') + ' - Gateway durumunu gösterir');
298
- console.log(c('cyan', ' vantuz doctor') + ' - Sistem sağlık kontrolü');
299
- console.log('\n');
300
-
301
- await this.prompt(c('dim', 'Çıkmak için Enter\'a basın...'));
302
- }
303
-
304
- // ARAÇLAR
305
- prompt(question) {
306
- return new Promise((resolve) => {
307
- const rl = readline.createInterface({
308
- input: process.stdin,
309
- output: process.stdout
310
- });
311
-
312
- rl.question(question, (answer) => {
313
- rl.close();
314
- resolve(answer.trim());
315
- });
316
- });
317
- }
1
+ #!/usr/bin/env node
2
+
3
+ import { Configurator } from './config.js';
4
+
5
+ try {
6
+ const configurator = new Configurator();
7
+ await configurator.run();
8
+ } catch (e) {
9
+ console.error('[HATA] Onboarding basarisiz:', e?.message || e);
10
+ process.exitCode = 1;
318
11
  }
319
-
320
- // BAŞLAT
321
- const wizard = new OnboardingWizard();
322
- wizard.run();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
- {
1
+ {
2
2
  "name": "vantuz",
3
- "version": "3.3.1",
3
+ "version": "3.3.3",
4
4
  "description": "Yapay Zeka Destekli E-Ticaret Yönetim Platformu - 7 Pazaryeri + WhatsApp/Telegram",
5
5
  "type": "module",
6
6
  "main": "cli.js",
@@ -13,8 +13,7 @@
13
13
  "tui": "node cli.js tui",
14
14
  "config": "node cli.js config",
15
15
  "status": "node cli.js status",
16
- "onboard": "node onboard.js",
17
- "postinstall": "echo \u0027🐙 Vantuz kuruldu! Başlatmak için: npx vantuz-onboard\u0027",
16
+ "postinstall": "echo \u0027Vantuz kuruldu! Baslatmak icin: npx vantuz-onboard\u0027",
18
17
  "test": "node --test",
19
18
  "lint": "eslint plugins/"
20
19
  },
@@ -41,18 +40,15 @@
41
40
  "management",
42
41
  "cli"
43
42
  ],
44
- "author": {
45
- "name": "Nuri Can Avşar",
46
- "email": "nuricanavsar2000@gmail.com"
47
- },
43
+ "author": "Vantuz",
48
44
  "license": "SEE LICENSE IN LICENSE",
49
45
  "repository": {
50
46
  "type": "git",
51
- "url": "git+https://github.com/nuricanavsar/vantuz.git"
47
+ "url": "git+https://github.com/cokdalazimdegil/vantuz.git"
52
48
  },
53
- "homepage": "https://vantuz.ai",
49
+ "homepage": "https://nuricanavsar.com/public/vantuz",
54
50
  "bugs": {
55
- "url": "https://github.com/nuricanavsar/vantuz/issues"
51
+ "url": "https://github.com/cokdalazimdegil/vantuz/issues"
56
52
  },
57
53
  "dependencies": {
58
54
  "axios": "^1.13.5",
@@ -60,9 +56,10 @@
60
56
  "cron": "^4.4.0",
61
57
  "dotenv": "^16.0.0",
62
58
  "express": "^5.2.1",
63
- "openclaw": "^2026.2.9",
59
+ "openclaw": "^0.0.1",
64
60
  "playwright": "^1.58.2",
65
- "sqlite3": "^5.1.7",
61
+ "sqlite": "^5.1.1",
62
+ "sqlite3": "^5.0.2",
66
63
  "xml2js": "^0.6.2"
67
64
  },
68
65
  "devDependencies": {
@@ -83,9 +80,8 @@
83
80
  "server",
84
81
  "platforms",
85
82
  "plugins",
86
- ".openclaw",
83
+ "start.bat",
87
84
  "LICENSE",
88
- "README.md",
89
- "DOCS_TR.md"
85
+ "README.md"
90
86
  ]
91
87
  }
@@ -1,8 +1,10 @@
1
- module.exports = {
1
+ export default {
2
2
  name: 'Amazon',
3
+ icon: '🟡', // Yellow circle icon for Amazon
4
+ description: 'Global E-ticaret Platformu',
3
5
  requiredFields: [
4
- { key: 'sellerId', label: 'Seller ID' },
5
- { key: 'authToken', label: 'Auth Token' }
6
+ { key: 'sellerId', label: 'Seller ID', env: 'AMAZON_SELLER_ID' },
7
+ { key: 'authToken', label: 'Auth Token', env: 'AMAZON_AUTH_TOKEN' }
6
8
  ],
7
9
  async getOrders(creds) {
8
10
  // Stub
@@ -1,7 +1,9 @@
1
- module.exports = {
1
+ export default {
2
2
  name: 'ÇiçekSepeti',
3
+ icon: '🌸', // Flower icon for ÇiçekSepeti
4
+ description: 'Entegre Çevrimiçi Çiçek ve Hediye Platformu',
3
5
  requiredFields: [
4
- { key: 'apiKey', label: 'API Key' }
6
+ { key: 'apiKey', label: 'API Key', env: 'CICEKSEPETI_API_KEY' }
5
7
  ],
6
8
  async getOrders(creds) {
7
9
  // Stub
@@ -1,9 +1,11 @@
1
- module.exports = {
1
+ export default {
2
2
  name: 'Hepsiburada',
3
+ icon: '🟣', // Purple circle icon for Hepsiburada
4
+ description: 'Popüler E-ticaret Platformu',
3
5
  requiredFields: [
4
- { key: 'merchantId', label: 'Merchant ID' },
5
- { key: 'username', label: 'Username' },
6
- { key: 'password', label: 'Password' }
6
+ { key: 'merchantId', label: 'Merchant ID', env: 'HEPSIBURADA_MERCHANT_ID' },
7
+ { key: 'username', label: 'Username', env: 'HEPSIBURADA_USERNAME' },
8
+ { key: 'password', label: 'Password', env: 'HEPSIBURADA_PASSWORD' }
7
9
  ],
8
10
  async getOrders(creds) {
9
11
  // Stub
package/platforms/n11.js CHANGED
@@ -1,8 +1,10 @@
1
- module.exports = {
1
+ export default {
2
2
  name: 'N11',
3
+ icon: '🔵', // Blue circle icon for N11
4
+ description: 'Alternatif E-ticaret Platformu',
3
5
  requiredFields: [
4
- { key: 'apiKey', label: 'API Key' },
5
- { key: 'apiSecret', label: 'API Secret' }
6
+ { key: 'apiKey', label: 'API Key', env: 'N11_API_KEY' },
7
+ { key: 'apiSecret', label: 'API Secret', env: 'N11_API_SECRET' }
6
8
  ],
7
9
  async getOrders(creds) {
8
10
  // Stub
@@ -1,7 +1,9 @@
1
- module.exports = {
1
+ export default {
2
2
  name: 'Pazarama',
3
+ icon: '🛒', // Shopping cart icon for Pazarama
4
+ description: 'Yeni Nesil Mobil Alışveriş Platformu',
3
5
  requiredFields: [
4
- { key: 'apiKey', label: 'API Key' }
6
+ { key: 'apiKey', label: 'API Key', env: 'PAZARAMA_API_KEY' }
5
7
  ],
6
8
  async getOrders(creds) {
7
9
  // Stub
@@ -1,7 +1,7 @@
1
- const axios = require('axios');
2
-
3
- module.exports = {
1
+ export default {
4
2
  name: 'Trendyol',
3
+ icon: '🟠', // Orange circle icon for Trendyol
4
+ description: 'Türkiye\'nin En Büyük E-ticaret Platformu',
5
5
  requiredFields: [
6
6
  { key: 'supplierId', label: 'Supplier ID', env: 'TRENDYOL_SUPPLIER_ID' },
7
7
  { key: 'apiKey', label: 'API Key', env: 'TRENDYOL_API_KEY' },