vantuz 3.4.2 β 3.5.1
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/.env.example +21 -0
- package/.openclaw/completions/openclaw.bash +227 -0
- package/.openclaw/completions/openclaw.fish +1552 -0
- package/.openclaw/completions/openclaw.ps1 +1966 -0
- package/.openclaw/completions/openclaw.zsh +3571 -0
- package/.openclaw/gateway.cmd +10 -0
- package/.openclaw/identity/device.json +7 -0
- package/.openclaw/openclaw.json +40 -0
- package/.windsurf/workflows/vantuz-dev.md +31 -0
- package/DOCS_TR.md +80 -0
- package/LICENSE +45 -45
- package/README.md +52 -21
- package/cli.js +685 -585
- package/config.js +733 -733
- package/core/agent-loop.js +190 -190
- package/core/ai-provider.js +298 -261
- package/core/automation.js +523 -523
- package/core/brand-analyst.js +101 -0
- package/core/channels.js +167 -167
- package/core/dashboard.js +230 -230
- package/core/database.js +135 -37
- package/core/eia-monitor.js +3 -1
- package/core/engine.js +648 -636
- package/core/gateway.js +447 -447
- package/core/learning.js +214 -214
- package/core/license.js +113 -0
- package/core/marketplace-adapter.js +168 -168
- package/core/memory.js +190 -190
- package/core/migrations/001-initial-schema.sql +1 -1
- package/core/queue.js +120 -120
- package/core/self-healer.js +314 -314
- package/core/unified-product.js +214 -214
- package/core/vision-service.js +113 -113
- package/index.js +217 -174
- package/modules/crm/sentiment-crm.js +231 -231
- package/modules/healer/listing-healer.js +201 -201
- package/modules/oracle/predictor.js +214 -214
- package/modules/researcher/agent.js +169 -169
- package/modules/team/agents/base.js +92 -92
- package/modules/team/agents/dev.js +33 -33
- package/modules/team/agents/josh.js +40 -40
- package/modules/team/agents/marketing.js +33 -33
- package/modules/team/agents/milo.js +36 -36
- package/modules/team/index.js +78 -78
- package/modules/team/shared-memory.js +87 -87
- package/modules/war-room/competitor-tracker.js +250 -250
- package/modules/war-room/pricing-engine.js +308 -308
- package/n11docs.md +1680 -0
- package/nodes/warehouse.js +238 -238
- package/onboard.js +1 -1
- package/openclawdocs.md +3 -0
- package/package.json +7 -5
- package/platforms/pttavm.js +14 -14
- package/plugins/vantuz/index.js +528 -528
- package/plugins/vantuz/memory/hippocampus.js +465 -465
- package/plugins/vantuz/package.json +20 -20
- package/plugins/vantuz/platforms/_template.js +118 -118
- package/plugins/vantuz/platforms/amazon.js +236 -236
- package/plugins/vantuz/platforms/ciceksepeti.js +166 -166
- package/plugins/vantuz/platforms/hepsiburada.js +180 -180
- package/plugins/vantuz/platforms/index.js +165 -165
- package/plugins/vantuz/platforms/n11.js +229 -229
- package/plugins/vantuz/platforms/pazarama.js +154 -154
- package/plugins/vantuz/platforms/pttavm.js +127 -127
- package/plugins/vantuz/platforms/trendyol.js +326 -326
- package/plugins/vantuz/services/alerts.js +253 -253
- package/plugins/vantuz/services/license.js +34 -34
- package/plugins/vantuz/services/scheduler.js +232 -232
- package/plugins/vantuz/tools/analytics.js +152 -152
- package/plugins/vantuz/tools/crossborder.js +187 -187
- package/plugins/vantuz/tools/nl-parser.js +211 -211
- package/plugins/vantuz/tools/product.js +110 -110
- package/plugins/vantuz/tools/quick-report.js +175 -175
- package/plugins/vantuz/tools/repricer.js +314 -314
- package/plugins/vantuz/tools/sentiment.js +115 -115
- package/plugins/vantuz/tools/vision.js +257 -257
- package/public.pem +9 -0
- package/server/app.js +260 -260
- package/server/public/index.html +514 -514
- package/start.bat +33 -33
- package/vantuz.sqlite +0 -0
- package/workspace/AGENTS.md +73 -0
- package/workspace/BRAND.md +29 -0
- package/workspace/SOUL.md +72 -0
- package/workspace/team/DECISIONS.md +3 -0
- package/workspace/team/GOALS.md +3 -0
- package/workspace/team/PROJECT_STATUS.md +3 -0
- package/workspace/team/agents/dev/SOUL.md +12 -0
- package/workspace/team/agents/josh/SOUL.md +12 -0
- package/workspace/team/agents/marketing/SOUL.md +12 -0
- package/workspace/team/agents/milo/SOUL.md +12 -0
- package/vantuz-3.3.4.tgz +0 -0
package/core/agent-loop.js
CHANGED
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
// core/agent-loop.js
|
|
2
|
-
// The Heartbeat of Vantuz OS V2 β Autonomous Agent Loop
|
|
3
|
-
// Cron-driven cycle that orchestrates all intelligence modules.
|
|
4
|
-
|
|
5
|
-
import { log } from './ai-provider.js';
|
|
6
|
-
import { getLearning } from './learning.js';
|
|
7
|
-
import { getSelfHealer } from './self-healer.js';
|
|
8
|
-
import { CronJob } from 'cron';
|
|
9
|
-
|
|
10
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
11
|
-
// AGENT LOOP
|
|
12
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
13
|
-
|
|
14
|
-
class AgentLoop {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.modules = new Map(); // name -> { fn, interval, enabled }
|
|
17
|
-
this.cronJobs = new Map(); // name -> CronJob instance
|
|
18
|
-
this.running = false;
|
|
19
|
-
this.lastRun = {}; // name -> timestamp
|
|
20
|
-
this.results = {}; // name -> last result
|
|
21
|
-
this.healer = getSelfHealer();
|
|
22
|
-
this.learning = getLearning();
|
|
23
|
-
|
|
24
|
-
log('INFO', 'π« AgentLoop initialized');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Register a module to run in the loop.
|
|
29
|
-
* @param {string} name - Module name (e.g., 'warroom', 'oracle').
|
|
30
|
-
* @param {function} fn - Async function to execute.
|
|
31
|
-
* @param {string} cronExpr - Cron expression (default: every 30 min).
|
|
32
|
-
* @param {boolean} enabled - Start enabled? (default: true).
|
|
33
|
-
*/
|
|
34
|
-
register(name, fn, cronExpr = '*/30 * * * *', enabled = true) {
|
|
35
|
-
this.modules.set(name, { fn, cronExpr, enabled });
|
|
36
|
-
log('INFO', `AgentLoop: registered "${name}" (${cronExpr}, ${enabled ? 'enabled' : 'disabled'})`);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Start the loop β creates cron jobs for all registered modules.
|
|
41
|
-
*/
|
|
42
|
-
start() {
|
|
43
|
-
if (this.running) {
|
|
44
|
-
log('WARN', 'AgentLoop already running');
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
for (const [name, mod] of this.modules) {
|
|
49
|
-
if (!mod.enabled) continue;
|
|
50
|
-
|
|
51
|
-
const job = new CronJob(mod.cronExpr, async () => {
|
|
52
|
-
await this._executeModule(name);
|
|
53
|
-
}, null, false, 'Europe/Istanbul');
|
|
54
|
-
|
|
55
|
-
this.cronJobs.set(name, job);
|
|
56
|
-
job.start();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
this.running = true;
|
|
60
|
-
log('INFO', `π« AgentLoop STARTED β ${this.cronJobs.size} modules active`);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Stop the loop.
|
|
65
|
-
*/
|
|
66
|
-
stop() {
|
|
67
|
-
for (const [name, job] of this.cronJobs) {
|
|
68
|
-
job.stop();
|
|
69
|
-
}
|
|
70
|
-
this.cronJobs.clear();
|
|
71
|
-
this.running = false;
|
|
72
|
-
log('INFO', 'π« AgentLoop STOPPED');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Enable/disable a module.
|
|
77
|
-
*/
|
|
78
|
-
setEnabled(name, enabled) {
|
|
79
|
-
const mod = this.modules.get(name);
|
|
80
|
-
if (mod) {
|
|
81
|
-
mod.enabled = enabled;
|
|
82
|
-
const job = this.cronJobs.get(name);
|
|
83
|
-
if (job) {
|
|
84
|
-
enabled ? job.start() : job.stop();
|
|
85
|
-
}
|
|
86
|
-
log('INFO', `AgentLoop: "${name}" ${enabled ? 'enabled' : 'disabled'}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Manually trigger a module immediately.
|
|
92
|
-
*/
|
|
93
|
-
async trigger(name) {
|
|
94
|
-
if (!this.modules.has(name)) {
|
|
95
|
-
return { error: `Module "${name}" not found` };
|
|
96
|
-
}
|
|
97
|
-
return await this._executeModule(name);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Run all modules once (manual full cycle).
|
|
102
|
-
*/
|
|
103
|
-
async runFullCycle() {
|
|
104
|
-
log('INFO', 'π« Full cycle triggered manually');
|
|
105
|
-
const results = {};
|
|
106
|
-
for (const [name, mod] of this.modules) {
|
|
107
|
-
if (mod.enabled) {
|
|
108
|
-
results[name] = await this._executeModule(name);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return results;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
getStatus() {
|
|
115
|
-
const moduleStatus = {};
|
|
116
|
-
for (const [name, mod] of this.modules) {
|
|
117
|
-
moduleStatus[name] = {
|
|
118
|
-
enabled: mod.enabled,
|
|
119
|
-
cronExpr: mod.cronExpr,
|
|
120
|
-
lastRun: this.lastRun[name] || null,
|
|
121
|
-
lastResult: this.results[name] ? 'OK' : null
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
running: this.running,
|
|
127
|
-
autonomous: this.learning.isAutonomous(),
|
|
128
|
-
netScore: this.learning.getNetScore(),
|
|
129
|
-
activeModules: [...this.modules.entries()].filter(([_, m]) => m.enabled).length,
|
|
130
|
-
totalModules: this.modules.size,
|
|
131
|
-
modules: moduleStatus
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
136
|
-
|
|
137
|
-
async _executeModule(name) {
|
|
138
|
-
const mod = this.modules.get(name);
|
|
139
|
-
if (!mod) return null;
|
|
140
|
-
|
|
141
|
-
// Autonomy check
|
|
142
|
-
if (!this.learning.isAutonomous()) {
|
|
143
|
-
log('WARN', `AgentLoop: "${name}" skipped β otonom mod kapalΔ± (skor: ${this.learning.getNetScore()})`);
|
|
144
|
-
return { skipped: true, reason: 'Autonomous mode disabled' };
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
log('INFO', `AgentLoop: executing "${name}"`);
|
|
148
|
-
const startTime = Date.now();
|
|
149
|
-
|
|
150
|
-
try {
|
|
151
|
-
// Execute with self-healing wrapper
|
|
152
|
-
const result = await this.healer.withHealing(
|
|
153
|
-
`agent-loop/${name}`,
|
|
154
|
-
() => mod.fn(),
|
|
155
|
-
`agent-loop-${name}`,
|
|
156
|
-
{ module: name, timestamp: new Date().toISOString() }
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
const duration = Date.now() - startTime;
|
|
160
|
-
this.lastRun[name] = new Date().toISOString();
|
|
161
|
-
this.results[name] = result;
|
|
162
|
-
|
|
163
|
-
// Positive learning
|
|
164
|
-
this.learning.record('successful_price_update', `${name} baΕarΔ±lΔ± (${duration}ms)`, name);
|
|
165
|
-
|
|
166
|
-
log('INFO', `AgentLoop: "${name}" completed in ${duration}ms`);
|
|
167
|
-
return result;
|
|
168
|
-
|
|
169
|
-
} catch (e) {
|
|
170
|
-
const duration = Date.now() - startTime;
|
|
171
|
-
|
|
172
|
-
// Negative learning
|
|
173
|
-
this.learning.record('listing_error', `${name} hata: ${e.message}`, name);
|
|
174
|
-
|
|
175
|
-
log('ERROR', `AgentLoop: "${name}" failed after ${duration}ms`, { error: e.message });
|
|
176
|
-
return { error: e.message };
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
let loopInstance = null;
|
|
182
|
-
|
|
183
|
-
export function getAgentLoop() {
|
|
184
|
-
if (!loopInstance) {
|
|
185
|
-
loopInstance = new AgentLoop();
|
|
186
|
-
}
|
|
187
|
-
return loopInstance;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export default AgentLoop;
|
|
1
|
+
// core/agent-loop.js
|
|
2
|
+
// The Heartbeat of Vantuz OS V2 β Autonomous Agent Loop
|
|
3
|
+
// Cron-driven cycle that orchestrates all intelligence modules.
|
|
4
|
+
|
|
5
|
+
import { log } from './ai-provider.js';
|
|
6
|
+
import { getLearning } from './learning.js';
|
|
7
|
+
import { getSelfHealer } from './self-healer.js';
|
|
8
|
+
import { CronJob } from 'cron';
|
|
9
|
+
|
|
10
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
11
|
+
// AGENT LOOP
|
|
12
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
13
|
+
|
|
14
|
+
class AgentLoop {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.modules = new Map(); // name -> { fn, interval, enabled }
|
|
17
|
+
this.cronJobs = new Map(); // name -> CronJob instance
|
|
18
|
+
this.running = false;
|
|
19
|
+
this.lastRun = {}; // name -> timestamp
|
|
20
|
+
this.results = {}; // name -> last result
|
|
21
|
+
this.healer = getSelfHealer();
|
|
22
|
+
this.learning = getLearning();
|
|
23
|
+
|
|
24
|
+
log('INFO', 'π« AgentLoop initialized');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Register a module to run in the loop.
|
|
29
|
+
* @param {string} name - Module name (e.g., 'warroom', 'oracle').
|
|
30
|
+
* @param {function} fn - Async function to execute.
|
|
31
|
+
* @param {string} cronExpr - Cron expression (default: every 30 min).
|
|
32
|
+
* @param {boolean} enabled - Start enabled? (default: true).
|
|
33
|
+
*/
|
|
34
|
+
register(name, fn, cronExpr = '*/30 * * * *', enabled = true) {
|
|
35
|
+
this.modules.set(name, { fn, cronExpr, enabled });
|
|
36
|
+
log('INFO', `AgentLoop: registered "${name}" (${cronExpr}, ${enabled ? 'enabled' : 'disabled'})`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Start the loop β creates cron jobs for all registered modules.
|
|
41
|
+
*/
|
|
42
|
+
start() {
|
|
43
|
+
if (this.running) {
|
|
44
|
+
log('WARN', 'AgentLoop already running');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for (const [name, mod] of this.modules) {
|
|
49
|
+
if (!mod.enabled) continue;
|
|
50
|
+
|
|
51
|
+
const job = new CronJob(mod.cronExpr, async () => {
|
|
52
|
+
await this._executeModule(name);
|
|
53
|
+
}, null, false, 'Europe/Istanbul');
|
|
54
|
+
|
|
55
|
+
this.cronJobs.set(name, job);
|
|
56
|
+
job.start();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this.running = true;
|
|
60
|
+
log('INFO', `π« AgentLoop STARTED β ${this.cronJobs.size} modules active`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Stop the loop.
|
|
65
|
+
*/
|
|
66
|
+
stop() {
|
|
67
|
+
for (const [name, job] of this.cronJobs) {
|
|
68
|
+
job.stop();
|
|
69
|
+
}
|
|
70
|
+
this.cronJobs.clear();
|
|
71
|
+
this.running = false;
|
|
72
|
+
log('INFO', 'π« AgentLoop STOPPED');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Enable/disable a module.
|
|
77
|
+
*/
|
|
78
|
+
setEnabled(name, enabled) {
|
|
79
|
+
const mod = this.modules.get(name);
|
|
80
|
+
if (mod) {
|
|
81
|
+
mod.enabled = enabled;
|
|
82
|
+
const job = this.cronJobs.get(name);
|
|
83
|
+
if (job) {
|
|
84
|
+
enabled ? job.start() : job.stop();
|
|
85
|
+
}
|
|
86
|
+
log('INFO', `AgentLoop: "${name}" ${enabled ? 'enabled' : 'disabled'}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Manually trigger a module immediately.
|
|
92
|
+
*/
|
|
93
|
+
async trigger(name) {
|
|
94
|
+
if (!this.modules.has(name)) {
|
|
95
|
+
return { error: `Module "${name}" not found` };
|
|
96
|
+
}
|
|
97
|
+
return await this._executeModule(name);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Run all modules once (manual full cycle).
|
|
102
|
+
*/
|
|
103
|
+
async runFullCycle() {
|
|
104
|
+
log('INFO', 'π« Full cycle triggered manually');
|
|
105
|
+
const results = {};
|
|
106
|
+
for (const [name, mod] of this.modules) {
|
|
107
|
+
if (mod.enabled) {
|
|
108
|
+
results[name] = await this._executeModule(name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getStatus() {
|
|
115
|
+
const moduleStatus = {};
|
|
116
|
+
for (const [name, mod] of this.modules) {
|
|
117
|
+
moduleStatus[name] = {
|
|
118
|
+
enabled: mod.enabled,
|
|
119
|
+
cronExpr: mod.cronExpr,
|
|
120
|
+
lastRun: this.lastRun[name] || null,
|
|
121
|
+
lastResult: this.results[name] ? 'OK' : null
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
running: this.running,
|
|
127
|
+
autonomous: this.learning.isAutonomous(),
|
|
128
|
+
netScore: this.learning.getNetScore(),
|
|
129
|
+
activeModules: [...this.modules.entries()].filter(([_, m]) => m.enabled).length,
|
|
130
|
+
totalModules: this.modules.size,
|
|
131
|
+
modules: moduleStatus
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
136
|
+
|
|
137
|
+
async _executeModule(name) {
|
|
138
|
+
const mod = this.modules.get(name);
|
|
139
|
+
if (!mod) return null;
|
|
140
|
+
|
|
141
|
+
// Autonomy check
|
|
142
|
+
if (!this.learning.isAutonomous()) {
|
|
143
|
+
log('WARN', `AgentLoop: "${name}" skipped β otonom mod kapalΔ± (skor: ${this.learning.getNetScore()})`);
|
|
144
|
+
return { skipped: true, reason: 'Autonomous mode disabled' };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
log('INFO', `AgentLoop: executing "${name}"`);
|
|
148
|
+
const startTime = Date.now();
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
// Execute with self-healing wrapper
|
|
152
|
+
const result = await this.healer.withHealing(
|
|
153
|
+
`agent-loop/${name}`,
|
|
154
|
+
() => mod.fn(),
|
|
155
|
+
`agent-loop-${name}`,
|
|
156
|
+
{ module: name, timestamp: new Date().toISOString() }
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const duration = Date.now() - startTime;
|
|
160
|
+
this.lastRun[name] = new Date().toISOString();
|
|
161
|
+
this.results[name] = result;
|
|
162
|
+
|
|
163
|
+
// Positive learning
|
|
164
|
+
this.learning.record('successful_price_update', `${name} baΕarΔ±lΔ± (${duration}ms)`, name);
|
|
165
|
+
|
|
166
|
+
log('INFO', `AgentLoop: "${name}" completed in ${duration}ms`);
|
|
167
|
+
return result;
|
|
168
|
+
|
|
169
|
+
} catch (e) {
|
|
170
|
+
const duration = Date.now() - startTime;
|
|
171
|
+
|
|
172
|
+
// Negative learning
|
|
173
|
+
this.learning.record('listing_error', `${name} hata: ${e.message}`, name);
|
|
174
|
+
|
|
175
|
+
log('ERROR', `AgentLoop: "${name}" failed after ${duration}ms`, { error: e.message });
|
|
176
|
+
return { error: e.message };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
let loopInstance = null;
|
|
182
|
+
|
|
183
|
+
export function getAgentLoop() {
|
|
184
|
+
if (!loopInstance) {
|
|
185
|
+
loopInstance = new AgentLoop();
|
|
186
|
+
}
|
|
187
|
+
return loopInstance;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export default AgentLoop;
|