natureco-cli 5.55.0 → 5.57.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/package.json +1 -1
- package/src/commands/agent.js +14 -12
- package/src/commands/agents.js +26 -24
- package/src/commands/bots.js +10 -8
- package/src/commands/config.js +31 -29
- package/src/commands/discord.js +7 -5
- package/src/commands/imessage.js +50 -48
- package/src/commands/irc.js +27 -25
- package/src/commands/mattermost.js +34 -32
- package/src/commands/signal.js +61 -59
- package/src/commands/slack.js +7 -5
- package/src/commands/sms.js +35 -33
- package/src/commands/tasks.js +78 -76
- package/src/commands/team.js +172 -170
- package/src/commands/telegram.js +50 -48
- package/src/commands/whatsapp.js +43 -41
- package/src/commands/workboard.js +15 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "natureco-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.57.0",
|
|
4
4
|
"description": "OpenClaw'dan daha güvenli, daha hızlı, daha ucuz AI agent CLI. Multi-agent, self-evolving skills, audit log, maliyet optimizasyonu ve NatureCo platform-native.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"natureco": "bin/natureco.js"
|
package/src/commands/agent.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
const chalk = require('chalk');
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
const { getLang: _gl } = require('../utils/i18n');
|
|
3
|
+
const L = (tr, en) => (_gl() === 'en' ? en : tr);
|
|
2
4
|
const fs = require('fs');
|
|
3
5
|
const path = require('path');
|
|
4
6
|
const os = require('os');
|
|
@@ -29,7 +31,7 @@ async function agent(args) {
|
|
|
29
31
|
if (opts.action === 'unbind') return unbindAgent(opts);
|
|
30
32
|
if (opts.action === 'set-identity') return setIdentity(opts);
|
|
31
33
|
|
|
32
|
-
console.log(chalk.red(`\n ❌ Bilinmeyen komut: ${opts.action}\n`));
|
|
34
|
+
console.log(chalk.red(`\n ❌ ${L('Bilinmeyen komut', 'Unknown command')}: ${opts.action}\n`));
|
|
33
35
|
process.exit(1);
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -46,7 +48,7 @@ async function runAgent(opts) {
|
|
|
46
48
|
const apiKey = pc?.apiKey || config[`${provider}ApiKey`] || process.env[`${provider.toUpperCase()}_API_KEY`];
|
|
47
49
|
|
|
48
50
|
if (!apiKey) {
|
|
49
|
-
console.log(chalk.red(`\n ❌ ${provider} API key gerekli\n`));
|
|
51
|
+
console.log(chalk.red(`\n ❌ ${provider} API key ${L('gerekli', 'required')}\n`));
|
|
50
52
|
process.exit(1);
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -104,18 +106,18 @@ function abortAgent(taskId) {
|
|
|
104
106
|
const { cancelTask, listTasks } = require('../utils/background');
|
|
105
107
|
if (taskId) {
|
|
106
108
|
const t = cancelTask(taskId);
|
|
107
|
-
if (!t) { console.log(chalk.red(`\n ❌ Task
|
|
108
|
-
console.log(chalk.yellow(`\n 🛑 Task iptal edildi: ${taskId}\n`));
|
|
109
|
+
if (!t) { console.log(chalk.red(`\n ❌ ${L('Task bulunamadı', 'Task not found')}: ${taskId}\n`)); process.exit(1); }
|
|
110
|
+
console.log(chalk.yellow(`\n 🛑 ${L('Task iptal edildi', 'Task cancelled')}: ${taskId}\n`));
|
|
109
111
|
return;
|
|
110
112
|
}
|
|
111
113
|
const running = listTasks({ status: 'running' });
|
|
112
114
|
if (running.length === 0) {
|
|
113
|
-
console.log(chalk.gray('\n Çalışan task yok\n'));
|
|
115
|
+
console.log(chalk.gray(L('\n Çalışan task yok\n', '\n No running tasks\n')));
|
|
114
116
|
return;
|
|
115
117
|
}
|
|
116
118
|
for (const t of running) {
|
|
117
119
|
cancelTask(t.id);
|
|
118
|
-
console.log(chalk.yellow(` 🛑 Task iptal edildi: ${t.id} — ${t.message}`));
|
|
120
|
+
console.log(chalk.yellow(` 🛑 ${L('Task iptal edildi', 'Task cancelled')}: ${t.id} — ${t.message}`));
|
|
119
121
|
}
|
|
120
122
|
console.log();
|
|
121
123
|
}
|
|
@@ -123,11 +125,11 @@ function abortAgent(taskId) {
|
|
|
123
125
|
function tailAgent(taskId) {
|
|
124
126
|
const { getTask } = require('../utils/background');
|
|
125
127
|
if (!taskId) {
|
|
126
|
-
console.log(chalk.red('\n ❌ Task ID gerekli. Kullanım: natureco agent tail <id>\n'));
|
|
128
|
+
console.log(chalk.red(L('\n ❌ Task ID gerekli. Kullanım: natureco agent tail <id>\n', '\n ❌ Task ID required. Usage: natureco agent tail <id>\n')));
|
|
127
129
|
process.exit(1);
|
|
128
130
|
}
|
|
129
131
|
const task = getTask(taskId);
|
|
130
|
-
if (!task) { console.log(chalk.red(`\n ❌ Task
|
|
132
|
+
if (!task) { console.log(chalk.red(`\n ❌ ${L('Task bulunamadı', 'Task not found')}: ${taskId}\n`)); process.exit(1); }
|
|
131
133
|
console.log(chalk.cyan(`\n 📋 Task: ${task.id}\n`));
|
|
132
134
|
console.log(chalk.gray(' ' + '─'.repeat(48)));
|
|
133
135
|
console.log(` ${chalk.white('Message:')} ${task.message}`);
|
|
@@ -145,11 +147,11 @@ function logsAgent(statusFilter) {
|
|
|
145
147
|
console.log(chalk.cyan(`\n 📜 Agent Logs${statusFilter ? ` (${statusFilter})` : ''}\n`));
|
|
146
148
|
console.log(chalk.gray(' ' + '─'.repeat(48)));
|
|
147
149
|
if (tasks.length === 0) {
|
|
148
|
-
console.log(chalk.gray(' Task bulunamadı.\n'));
|
|
150
|
+
console.log(chalk.gray(L(' Task bulunamadı.\n', ' Task not found.\n')));
|
|
149
151
|
return;
|
|
150
152
|
}
|
|
151
153
|
for (const t of tasks.slice(0, 20)) {
|
|
152
|
-
console.log(` ${statusColor(t.status)} ${chalk.white(t.message || '(boş)')}`);
|
|
154
|
+
console.log(` ${statusColor(t.status)} ${chalk.white(t.message || L('(boş)', '(empty)'))}`);
|
|
153
155
|
console.log(chalk.gray(` [${t.id}] ${t.createdAt?.slice(0, 16) || ''} — ${t.runtime}`));
|
|
154
156
|
}
|
|
155
157
|
console.log();
|
|
@@ -271,7 +273,7 @@ function showHelp() {
|
|
|
271
273
|
console.log(chalk.cyan(' --model <model>') + chalk.gray(' Model override'));
|
|
272
274
|
console.log(chalk.cyan(' --provider <name>') + chalk.gray(' Provider override'));
|
|
273
275
|
console.log(chalk.gray('\n Examples:'));
|
|
274
|
-
console.log(chalk.gray(' natureco agent run --message "Merhaba"'));
|
|
276
|
+
console.log(chalk.gray(L(' natureco agent run --message "Merhaba"', ' natureco agent run --message "Hello"')));
|
|
275
277
|
console.log(chalk.gray(' natureco agent abort'));
|
|
276
278
|
console.log(chalk.gray(' natureco agent tail <id>'));
|
|
277
279
|
console.log(chalk.gray(' natureco agent logs running\n'));
|
package/src/commands/agents.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
|
+
const { getLang: _gl } = require('../utils/i18n');
|
|
3
|
+
const L = (tr, en) => (_gl() === 'en' ? en : tr);
|
|
2
4
|
const tui = require('../utils/tui');
|
|
3
5
|
const F = require('../utils/format');
|
|
4
6
|
const fs = require('fs');
|
|
@@ -47,8 +49,8 @@ async function agents(args) {
|
|
|
47
49
|
if (action === 'unbind') return unbindAgent(params[0], params[1]);
|
|
48
50
|
if (action === 'set-identity') return setIdentity(params[0], params.slice(1).join(' '));
|
|
49
51
|
|
|
50
|
-
console.log(chalk.red(`\n ❌ Bilinmeyen komut: ${action}\n`));
|
|
51
|
-
console.log(chalk.gray(' Kullanım: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n'));
|
|
52
|
+
console.log(chalk.red(`\n ❌ ${L('Bilinmeyen komut', 'Unknown command')}: ${action}\n`));
|
|
53
|
+
console.log(chalk.gray(L(' Kullanım: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n', ' Usage: natureco agents [list|set|info|add|bindings|bind|unbind|set-identity]\n')));
|
|
52
54
|
process.exit(1);
|
|
53
55
|
}
|
|
54
56
|
|
|
@@ -56,7 +58,7 @@ async function listAgents() {
|
|
|
56
58
|
const config = getConfig();
|
|
57
59
|
const apiKey = config.providerApiKey || config.apiKey || '';
|
|
58
60
|
|
|
59
|
-
F.info('Agentlar yükleniyor...');
|
|
61
|
+
F.info(L('Agentlar yükleniyor...', 'Loading agents...'));
|
|
60
62
|
|
|
61
63
|
let botList = { bots: [] };
|
|
62
64
|
try {
|
|
@@ -67,8 +69,8 @@ async function listAgents() {
|
|
|
67
69
|
console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
|
|
68
70
|
|
|
69
71
|
if (!botList.bots?.length) {
|
|
70
|
-
console.log('\n ' + tui.C.muted('Agent bulunamadı.'));
|
|
71
|
-
console.log(' ' + tui.C.muted('Oluşturmak için: ') + tui.C.brand('developers.natureco.me'));
|
|
72
|
+
console.log('\n ' + tui.C.muted(L('Agent bulunamadı.', 'No agents found.')));
|
|
73
|
+
console.log(' ' + tui.C.muted(L('Oluşturmak için: ', 'To create: ')) + tui.C.brand('developers.natureco.me'));
|
|
72
74
|
console.log('');
|
|
73
75
|
return;
|
|
74
76
|
}
|
|
@@ -83,7 +85,7 @@ async function listAgents() {
|
|
|
83
85
|
|
|
84
86
|
console.log('\n' + tui.table(rows, [
|
|
85
87
|
{
|
|
86
|
-
key: 'name', label: 'İsim', minWidth: 18,
|
|
88
|
+
key: 'name', label: L('İsim', 'Name'), minWidth: 18,
|
|
87
89
|
render: r => r.active
|
|
88
90
|
? tui.styled(r.name, { color: tui.PALETTE.success, bold: true })
|
|
89
91
|
: tui.C.text(r.name)
|
|
@@ -93,7 +95,7 @@ async function listAgents() {
|
|
|
93
95
|
{ key: 'model', label: 'Model', minWidth: 18, render: r => tui.C.muted(r.model) },
|
|
94
96
|
], { borderStyle: 'round', zebra: true }));
|
|
95
97
|
|
|
96
|
-
console.log('\n ' + tui.C.muted('Değiştirmek için: ') + tui.C.brand('natureco agents set <bot-adı>'));
|
|
98
|
+
console.log('\n ' + tui.C.muted(L('Değiştirmek için: ', 'To switch: ')) + tui.C.brand(L('natureco agents set <bot-adı>', 'natureco agents set <bot-name>')));
|
|
97
99
|
console.log('');
|
|
98
100
|
}
|
|
99
101
|
|
|
@@ -108,13 +110,13 @@ async function setActiveAgent(botName) {
|
|
|
108
110
|
|
|
109
111
|
if (!botName) {
|
|
110
112
|
if (!botList.bots?.length) {
|
|
111
|
-
console.log(chalk.gray('\n Agent bulunamadı.\n'));
|
|
113
|
+
console.log(chalk.gray(L('\n Agent bulunamadı.\n', '\n No agents found.\n')));
|
|
112
114
|
return;
|
|
113
115
|
}
|
|
114
116
|
const { selected } = await inquirer.prompt([{
|
|
115
117
|
type: 'list',
|
|
116
118
|
name: 'selected',
|
|
117
|
-
message: ' Aktif agent seç:',
|
|
119
|
+
message: L(' Aktif agent seç:', ' Select active agent:'),
|
|
118
120
|
choices: botList.bots.map(b => ({ name: b.name, value: b.name })),
|
|
119
121
|
}]);
|
|
120
122
|
botName = selected;
|
|
@@ -122,7 +124,7 @@ async function setActiveAgent(botName) {
|
|
|
122
124
|
|
|
123
125
|
const bot = botList.bots?.find(b => b.name === botName || b.id === botName);
|
|
124
126
|
if (!bot && botList.bots?.length) {
|
|
125
|
-
console.log(chalk.red(`\n ❌ Agent
|
|
127
|
+
console.log(chalk.red(`\n ❌ ${L('Agent bulunamadı', 'No agent found')}: ${botName}\n`));
|
|
126
128
|
process.exit(1);
|
|
127
129
|
}
|
|
128
130
|
|
|
@@ -130,7 +132,7 @@ async function setActiveAgent(botName) {
|
|
|
130
132
|
if (bot?.id) config.defaultBotId = bot.id;
|
|
131
133
|
saveConfig(config);
|
|
132
134
|
|
|
133
|
-
console.log(chalk.green(`\n ✓ Aktif agent: ${botName}\n`));
|
|
135
|
+
console.log(chalk.green(`\n ✓ ${L('Aktif agent', 'Active agent')}: ${botName}\n`));
|
|
134
136
|
}
|
|
135
137
|
|
|
136
138
|
async function agentInfo(botName) {
|
|
@@ -139,7 +141,7 @@ async function agentInfo(botName) {
|
|
|
139
141
|
const name = botName || config.botName;
|
|
140
142
|
|
|
141
143
|
if (!name) {
|
|
142
|
-
F.error('Agent adı belirtin: natureco agents info <bot-adı>');
|
|
144
|
+
F.error(L('Agent adı belirtin: natureco agents info <bot-adı>', 'Specify agent name: natureco agents info <bot-name>'));
|
|
143
145
|
return;
|
|
144
146
|
}
|
|
145
147
|
|
|
@@ -160,24 +162,24 @@ async function agentInfo(botName) {
|
|
|
160
162
|
F.kv('Prompt', bot.system_prompt.slice(0, 80) + (bot.system_prompt.length > 80 ? '...' : ''));
|
|
161
163
|
}
|
|
162
164
|
} else {
|
|
163
|
-
F.meta('(Detay alınamadı)');
|
|
165
|
+
F.meta(L('(Detay alınamadı)', '(Details unavailable)'));
|
|
164
166
|
}
|
|
165
167
|
|
|
166
168
|
try {
|
|
167
169
|
const { loadMemory } = require('../utils/memory');
|
|
168
170
|
const mem = loadMemory(bot?.id || 'universal-provider');
|
|
169
171
|
if (mem.name || mem.facts?.length) {
|
|
170
|
-
if (mem.name) F.kv('Kullanıcı', mem.name);
|
|
171
|
-
F.kv('Hafıza', (mem.facts || []).length + ' bilgi');
|
|
172
|
+
if (mem.name) F.kv(L('Kullanıcı', 'User'), mem.name);
|
|
173
|
+
F.kv(L('Hafıza', 'Memory'), (mem.facts || []).length + L(' bilgi', ' facts'));
|
|
172
174
|
}
|
|
173
175
|
} catch {}
|
|
174
176
|
}
|
|
175
177
|
|
|
176
178
|
async function addAgent() {
|
|
177
179
|
console.log('');
|
|
178
|
-
console.log(chalk.gray(' Yeni agent oluşturmak için Developers Portal\'ı kullanın:'));
|
|
180
|
+
console.log(chalk.gray(L(' Yeni agent oluşturmak için Developers Portal\'ı kullanın:', ' Use the Developers Portal to create a new agent:')));
|
|
179
181
|
console.log(chalk.cyan(' developers.natureco.me\n'));
|
|
180
|
-
console.log(chalk.gray(' Oluşturduktan sonra: ') + chalk.cyan('natureco agents list\n'));
|
|
182
|
+
console.log(chalk.gray(L(' Oluşturduktan sonra: ', ' After creating: ')) + chalk.cyan('natureco agents list\n'));
|
|
181
183
|
}
|
|
182
184
|
|
|
183
185
|
// ── Bindings ──────────────────────────────────────────────────────────────────
|
|
@@ -189,7 +191,7 @@ function listBindings() {
|
|
|
189
191
|
F.section('Bindings (' + keys.length + ')');
|
|
190
192
|
|
|
191
193
|
if (keys.length === 0) {
|
|
192
|
-
F.meta('Henüz binding yok.');
|
|
194
|
+
F.meta(L('Henüz binding yok.', 'No bindings yet.'));
|
|
193
195
|
return;
|
|
194
196
|
}
|
|
195
197
|
|
|
@@ -202,35 +204,35 @@ function listBindings() {
|
|
|
202
204
|
|
|
203
205
|
function bindAgent(agentId, channel) {
|
|
204
206
|
if (!agentId || !channel) {
|
|
205
|
-
F.error('Kullanım: natureco agents bind <agentId> <channel>');
|
|
207
|
+
F.error(L('Kullanım: natureco agents bind <agentId> <channel>', 'Usage: natureco agents bind <agentId> <channel>'));
|
|
206
208
|
return;
|
|
207
209
|
}
|
|
208
210
|
const bindings = loadBindings();
|
|
209
211
|
if (!bindings[agentId]) bindings[agentId] = [];
|
|
210
212
|
if (!bindings[agentId].includes(channel)) bindings[agentId].push(channel);
|
|
211
213
|
saveBindings(bindings);
|
|
212
|
-
F.success('Agent ' + agentId + ' → ' + channel + ' bağlandı');
|
|
214
|
+
F.success('Agent ' + agentId + ' → ' + channel + L(' bağlandı', ' bound'));
|
|
213
215
|
}
|
|
214
216
|
|
|
215
217
|
function unbindAgent(agentId, channel) {
|
|
216
218
|
if (!agentId || !channel) {
|
|
217
|
-
F.error('Kullanım: natureco agents unbind <agentId> <channel>');
|
|
219
|
+
F.error(L('Kullanım: natureco agents unbind <agentId> <channel>', 'Usage: natureco agents unbind <agentId> <channel>'));
|
|
218
220
|
return;
|
|
219
221
|
}
|
|
220
222
|
const bindings = loadBindings();
|
|
221
223
|
if (!bindings[agentId]) {
|
|
222
|
-
F.warning('Agent ' + agentId + ' için binding bulunamadı');
|
|
224
|
+
F.warning('Agent ' + agentId + L(' için binding bulunamadı', ' has no bindings'));
|
|
223
225
|
return;
|
|
224
226
|
}
|
|
225
227
|
bindings[agentId] = bindings[agentId].filter(ch => ch !== channel);
|
|
226
228
|
if (bindings[agentId].length === 0) delete bindings[agentId];
|
|
227
229
|
saveBindings(bindings);
|
|
228
|
-
F.success('Agent ' + agentId + ' → ' + channel + ' bağlantısı kaldırıldı');
|
|
230
|
+
F.success('Agent ' + agentId + ' → ' + channel + L(' bağlantısı kaldırıldı', ' unbound'));
|
|
229
231
|
}
|
|
230
232
|
|
|
231
233
|
function setIdentity(agentId, identity) {
|
|
232
234
|
if (!agentId) {
|
|
233
|
-
F.error('Kullanım: natureco agents set-identity <agentId> <identity>');
|
|
235
|
+
F.error(L('Kullanım: natureco agents set-identity <agentId> <identity>', 'Usage: natureco agents set-identity <agentId> <identity>'));
|
|
234
236
|
return;
|
|
235
237
|
}
|
|
236
238
|
const identities = loadIdentities();
|
package/src/commands/bots.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
|
+
const { getLang: _gl } = require('../utils/i18n');
|
|
3
|
+
const L = (tr, en) => (_gl() === 'en' ? en : tr);
|
|
2
4
|
const tui = require('../utils/tui');
|
|
3
5
|
const { getApiKey, getConfig } = require('../utils/config');
|
|
4
6
|
const { getBots } = require('../utils/api');
|
|
@@ -7,7 +9,7 @@ async function bots() {
|
|
|
7
9
|
const config = getConfig();
|
|
8
10
|
const apiKey = getApiKey() || config.providerApiKey || '';
|
|
9
11
|
|
|
10
|
-
console.log('\n' + tui.styled(' ⏳ Botlar yükleniyor...', { color: tui.PALETTE.muted }));
|
|
12
|
+
console.log('\n' + tui.styled(L(' ⏳ Botlar yükleniyor...', ' ⏳ Loading bots...'), { color: tui.PALETTE.muted }));
|
|
11
13
|
|
|
12
14
|
try {
|
|
13
15
|
// v4.6+: Eğer local provider varsa (api.minimax.io, api.groq.com),
|
|
@@ -37,27 +39,27 @@ async function bots() {
|
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
if (!botList || !botList.bots || botList.bots.length === 0) {
|
|
40
|
-
console.log('\n' + tui.C.muted(' Bot bulunamadı.'));
|
|
41
|
-
console.log(' ' + tui.C.muted('Oluşturmak için: ') + tui.C.brand('natureco setup') + ' ' + tui.C.muted('veya config\'e bot ekleyin.'));
|
|
42
|
+
console.log('\n' + tui.C.muted(L(' Bot bulunamadı.', ' No bots found.')));
|
|
43
|
+
console.log(' ' + tui.C.muted(L('Oluşturmak için: ', 'To create: ')) + tui.C.brand('natureco setup') + ' ' + tui.C.muted(L('veya config\'e bot ekleyin.', 'or add a bot to config.')));
|
|
42
44
|
console.log('');
|
|
43
45
|
return;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
const rows = botList.bots.map((bot, i) => ({
|
|
47
49
|
idx: String(i + 1),
|
|
48
|
-
name: bot.name || '(isimsiz)',
|
|
50
|
+
name: bot.name || L('(isimsiz)', '(unnamed)'),
|
|
49
51
|
id: bot.id,
|
|
50
52
|
provider: bot.ai_provider || bot.provider || '—',
|
|
51
53
|
model: bot.model || '—',
|
|
52
54
|
active: config.botName === bot.name,
|
|
53
55
|
}));
|
|
54
56
|
|
|
55
|
-
console.log('\n' + tui.styled(' 🤖 Bot Listesi (' + rows.length + ')', { color: tui.PALETTE.primary, bold: true }));
|
|
57
|
+
console.log('\n' + tui.styled(L(' 🤖 Bot Listesi (', ' 🤖 Bot List (') + rows.length + ')', { color: tui.PALETTE.primary, bold: true }));
|
|
56
58
|
console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
|
|
57
59
|
console.log('\n' + tui.table(rows, [
|
|
58
60
|
{ key: 'idx', label: '#', minWidth: 4 },
|
|
59
61
|
{
|
|
60
|
-
key: 'name', label: 'İsim', minWidth: 18,
|
|
62
|
+
key: 'name', label: L('İsim', 'Name'), minWidth: 18,
|
|
61
63
|
render: r => r.active
|
|
62
64
|
? tui.styled(r.name + ' ●', { color: tui.PALETTE.success, bold: true })
|
|
63
65
|
: tui.C.text(r.name)
|
|
@@ -67,10 +69,10 @@ async function bots() {
|
|
|
67
69
|
{ key: 'model', label: 'Model', minWidth: 20, render: r => tui.C.muted(r.model) },
|
|
68
70
|
], { borderStyle: 'round', zebra: true }));
|
|
69
71
|
|
|
70
|
-
console.log('\n ' + tui.C.muted('Chat başlatmak için: ') + tui.C.brand('natureco chat') + ' ' + tui.C.muted('veya ') + tui.C.brand('natureco repl'));
|
|
72
|
+
console.log('\n ' + tui.C.muted(L('Chat başlatmak için: ', 'To start chat: ')) + tui.C.brand('natureco chat') + ' ' + tui.C.muted(L('veya ', 'or ')) + tui.C.brand('natureco repl'));
|
|
71
73
|
console.log('');
|
|
72
74
|
} catch (err) {
|
|
73
|
-
console.log('\n' + tui.C.red(' ❌ Hata: ' + err.message) + '\n');
|
|
75
|
+
console.log('\n' + tui.C.red(L(' ❌ Hata: ', ' ❌ Error: ') + err.message) + '\n');
|
|
74
76
|
process.exit(1);
|
|
75
77
|
}
|
|
76
78
|
}
|
package/src/commands/config.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
|
+
const { getLang: _gl } = require('../utils/i18n');
|
|
3
|
+
const L = (tr, en) => (_gl() === 'en' ? en : tr);
|
|
2
4
|
const F = require('../utils/format');
|
|
3
5
|
const path = require('path');
|
|
4
6
|
const fs = require('fs');
|
|
@@ -13,7 +15,7 @@ function config(args) {
|
|
|
13
15
|
const [action, key, ...valueParts] = args;
|
|
14
16
|
|
|
15
17
|
if (!action) {
|
|
16
|
-
F.error('Kullanım: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]');
|
|
18
|
+
F.error(L('Kullanım: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]', 'Usage: natureco config <get|set|unset|list|file|schema|validate|backups|restore> [key] [value]'));
|
|
17
19
|
process.exit(1);
|
|
18
20
|
}
|
|
19
21
|
|
|
@@ -34,12 +36,12 @@ function config(args) {
|
|
|
34
36
|
sensitive: SENSITIVE_KEYS.some(sk => k.toLowerCase().includes(sk.toLowerCase())),
|
|
35
37
|
}));
|
|
36
38
|
|
|
37
|
-
console.log('\n' + tui.styled(' ⚙️ Configuration (' + rows.length + ' ayar)', { color: tui.PALETTE.primary, bold: true }));
|
|
39
|
+
console.log('\n' + tui.styled(' ⚙️ Configuration (' + rows.length + L(' ayar)', ' settings)'), { color: tui.PALETTE.primary, bold: true }));
|
|
38
40
|
console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
|
|
39
41
|
console.log('\n' + tui.table(rows, [
|
|
40
|
-
{ key: 'key', label: 'Anahtar', minWidth: 24, render: r => tui.styled(r.key, { color: tui.PALETTE.primary, bold: true }) },
|
|
42
|
+
{ key: 'key', label: L('Anahtar', 'Key'), minWidth: 24, render: r => tui.styled(r.key, { color: tui.PALETTE.primary, bold: true }) },
|
|
41
43
|
{
|
|
42
|
-
key: 'value', label: 'Değer', minWidth: 40,
|
|
44
|
+
key: 'value', label: L('Değer', 'Value'), minWidth: 40,
|
|
43
45
|
render: r => r.sensitive
|
|
44
46
|
? tui.styled(r.value, { color: tui.PALETTE.warning })
|
|
45
47
|
: tui.C.text(r.value)
|
|
@@ -51,7 +53,7 @@ function config(args) {
|
|
|
51
53
|
|
|
52
54
|
if (action === 'get') {
|
|
53
55
|
if (!key) {
|
|
54
|
-
console.log('\n' + tui.C.red(' ❌ Key belirtilmedi.') + '\n');
|
|
56
|
+
console.log('\n' + tui.C.red(L(' ❌ Key belirtilmedi.', ' ❌ Key not specified.')) + '\n');
|
|
55
57
|
process.exit(1);
|
|
56
58
|
}
|
|
57
59
|
const cfg = getConfig();
|
|
@@ -61,7 +63,7 @@ function config(args) {
|
|
|
61
63
|
value = value?.[k];
|
|
62
64
|
}
|
|
63
65
|
if (value === undefined) {
|
|
64
|
-
console.log('\n' + tui.styled(' ℹ ' + key + ': (tanımlı değil)', { color: tui.PALETTE.muted }) + '\n');
|
|
66
|
+
console.log('\n' + tui.styled(' ℹ ' + key + L(': (tanımlı değil)', ': (not set)'), { color: tui.PALETTE.muted }) + '\n');
|
|
65
67
|
} else {
|
|
66
68
|
const cardW = 60;
|
|
67
69
|
console.log('\n' + tui.styled(' 🔍 ' + key, { color: tui.PALETTE.primary, bold: true }));
|
|
@@ -79,11 +81,11 @@ function config(args) {
|
|
|
79
81
|
|
|
80
82
|
if (action === 'set') {
|
|
81
83
|
if (!key) {
|
|
82
|
-
F.error('Key belirtilmedi.');
|
|
84
|
+
F.error(L('Key belirtilmedi.', 'Key not specified.'));
|
|
83
85
|
process.exit(1);
|
|
84
86
|
}
|
|
85
87
|
if (valueParts.length === 0) {
|
|
86
|
-
F.error('Value belirtilmedi.');
|
|
88
|
+
F.error(L('Value belirtilmedi.', 'Value not specified.'));
|
|
87
89
|
process.exit(1);
|
|
88
90
|
}
|
|
89
91
|
const value = valueParts.join(' ');
|
|
@@ -100,7 +102,7 @@ function config(args) {
|
|
|
100
102
|
|
|
101
103
|
if (action === 'unset') {
|
|
102
104
|
if (!key) {
|
|
103
|
-
F.error('Key belirtilmedi.');
|
|
105
|
+
F.error(L('Key belirtilmedi.', 'Key not specified.'));
|
|
104
106
|
process.exit(1);
|
|
105
107
|
}
|
|
106
108
|
const cfg = getConfig();
|
|
@@ -197,18 +199,18 @@ function config(args) {
|
|
|
197
199
|
|
|
198
200
|
if (action === 'backups' || action === 'backup') {
|
|
199
201
|
const backups = listBackups();
|
|
200
|
-
F.section('Config Yedekleri');
|
|
202
|
+
F.section(L('Config Yedekleri', 'Config Backups'));
|
|
201
203
|
if (backups.length === 0) {
|
|
202
|
-
F.info('Hen\u00fcz yedek al\u0131nmam\u0131\u015f.');
|
|
204
|
+
F.info(L('Hen\u00fcz yedek al\u0131nmam\u0131\u015f.', 'No backups yet.'));
|
|
203
205
|
return;
|
|
204
206
|
}
|
|
205
207
|
const rows = backups.map((f, i) => {
|
|
206
208
|
const ts = f.replace(/^config-|\.json$/g, '').replace(/T/, ' ').replace(/-/g, ':').replace(/:[^:]*$/, '');
|
|
207
209
|
return [String(i + 1), ts, path.join(CONFIG_BACKUP_DIR, f)];
|
|
208
210
|
});
|
|
209
|
-
F.table(['#', 'Tarih', 'Dosya'], rows);
|
|
210
|
-
F.meta('Geri y\u00fcklemek i\u00e7in: natureco config restore <dosya-ad\u0131>');
|
|
211
|
-
F.meta(
|
|
211
|
+
F.table(['#', L('Tarih', 'Date'), L('Dosya', 'File')], rows);
|
|
212
|
+
F.meta(L('Geri y\u00fcklemek i\u00e7in: natureco config restore <dosya-ad\u0131>', 'To restore: natureco config restore <file-name>'));
|
|
213
|
+
F.meta(`${L('Örnek', 'Example')}: natureco config restore ${backups[0] || 'config-....json'}`);
|
|
212
214
|
return;
|
|
213
215
|
}
|
|
214
216
|
|
|
@@ -217,22 +219,22 @@ function config(args) {
|
|
|
217
219
|
if (!backupId) {
|
|
218
220
|
const backups = listBackups();
|
|
219
221
|
if (backups.length === 0) {
|
|
220
|
-
F.error('Geri y\u00fcklenecek yedek bulunamad\u0131.');
|
|
222
|
+
F.error(L('Geri y\u00fcklenecek yedek bulunamad\u0131.', 'No backup found to restore.'));
|
|
221
223
|
process.exit(1);
|
|
222
224
|
}
|
|
223
|
-
F.section('Geri Y\u00fckleme');
|
|
224
|
-
F.kv('En son yedek', backups[0]);
|
|
225
|
-
F.meta(
|
|
226
|
-
F.meta('Yedekleri listelemek i\u00e7in: natureco config backups');
|
|
225
|
+
F.section(L('Geri Y\u00fckleme', 'Restore'));
|
|
226
|
+
F.kv(L('En son yedek', 'Latest backup'), backups[0]);
|
|
227
|
+
F.meta(`${L('Kullanım', 'Usage')}: natureco config restore ${backups[0]}`);
|
|
228
|
+
F.meta(L('Yedekleri listelemek i\u00e7in: natureco config backups', 'To list backups: natureco config backups'));
|
|
227
229
|
return;
|
|
228
230
|
}
|
|
229
231
|
|
|
230
232
|
try {
|
|
231
233
|
const result = restoreConfig(backupId);
|
|
232
|
-
F.success(
|
|
233
|
-
F.meta(
|
|
234
|
+
F.success(`${L('Config geri yüklendi', 'Config restored')}: ${result.timestamp}`);
|
|
235
|
+
F.meta(`${L('Kaynak', 'Source')}: ${result.path}`);
|
|
234
236
|
} catch (err) {
|
|
235
|
-
F.error(
|
|
237
|
+
F.error(`${L('Geri yükleme başarısız', 'Restore failed')}: ${err.message}`);
|
|
236
238
|
process.exit(1);
|
|
237
239
|
}
|
|
238
240
|
return;
|
|
@@ -242,8 +244,8 @@ function config(args) {
|
|
|
242
244
|
return configBudget(key, valueParts);
|
|
243
245
|
}
|
|
244
246
|
|
|
245
|
-
F.error(
|
|
246
|
-
F.meta('Kullan\u0131m: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]');
|
|
247
|
+
F.error(`${L('Geçersiz action', 'Invalid action')}: ${action}`);
|
|
248
|
+
F.meta(L('Kullan\u0131m: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]', 'Usage: natureco config <get|set|unset|list|file|schema|validate|backups|restore|budget> [key] [value]'));
|
|
247
249
|
process.exit(1);
|
|
248
250
|
}
|
|
249
251
|
|
|
@@ -294,12 +296,12 @@ function configBudget(sub, args) {
|
|
|
294
296
|
const key = args[0];
|
|
295
297
|
const val = args[1];
|
|
296
298
|
if (!key || val === undefined) {
|
|
297
|
-
F.error('Kullan\u0131m: natureco config budget set <key> <value>');
|
|
299
|
+
F.error(L('Kullan\u0131m: natureco config budget set <key> <value>', 'Usage: natureco config budget set <key> <value>'));
|
|
298
300
|
return;
|
|
299
301
|
}
|
|
300
302
|
const budget = TB.load();
|
|
301
303
|
if (!(key in budget)) {
|
|
302
|
-
F.error('Bilinmeyen budget key: ' + key);
|
|
304
|
+
F.error(L('Bilinmeyen budget key: ', 'Unknown budget key: ') + key);
|
|
303
305
|
return;
|
|
304
306
|
}
|
|
305
307
|
const num = Number(val);
|
|
@@ -312,7 +314,7 @@ function configBudget(sub, args) {
|
|
|
312
314
|
if (sub === 'usage') {
|
|
313
315
|
const usage = TB.getAllUsage();
|
|
314
316
|
if (!usage || Object.keys(usage).length === 0) {
|
|
315
|
-
F.info('Hen\u00fcz token kullan\u0131m\u0131 kaydedilmedi.');
|
|
317
|
+
F.info(L('Hen\u00fcz token kullan\u0131m\u0131 kaydedilmedi.', 'No token usage recorded yet.'));
|
|
316
318
|
return;
|
|
317
319
|
}
|
|
318
320
|
F.header('Token Usage');
|
|
@@ -327,8 +329,8 @@ function configBudget(sub, args) {
|
|
|
327
329
|
return;
|
|
328
330
|
}
|
|
329
331
|
|
|
330
|
-
F.error('Budget alt komutu: ' + sub);
|
|
331
|
-
F.meta('Kullan\u0131m: natureco config budget <show|preset|set|usage>');
|
|
332
|
+
F.error(L('Budget alt komutu: ', 'Budget sub-command: ') + sub);
|
|
333
|
+
F.meta(L('Kullan\u0131m: natureco config budget <show|preset|set|usage>', 'Usage: natureco config budget <show|preset|set|usage>'));
|
|
332
334
|
}
|
|
333
335
|
|
|
334
336
|
module.exports = config;
|
package/src/commands/discord.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
|
+
const { getLang: _gl } = require('../utils/i18n');
|
|
3
|
+
const L = (tr, en) => (_gl() === 'en' ? en : tr);
|
|
2
4
|
const inquirer = require('../utils/inquirer-wrapper');
|
|
3
5
|
const { getApiKey, getConfig, saveConfig } = require('../utils/config');
|
|
4
6
|
const { getBots } = require('../utils/api');
|
|
@@ -27,7 +29,7 @@ async function connectDiscord() {
|
|
|
27
29
|
const config = getConfig();
|
|
28
30
|
|
|
29
31
|
if (!config.providerUrl) {
|
|
30
|
-
console.log(chalk.red('\n❌ Setup yapılmamış. Önce "natureco setup" çalıştırın.\n'));
|
|
32
|
+
console.log(chalk.red(L('\n❌ Setup yapılmamış. Önce "natureco setup" çalıştırın.\n', '\n❌ Setup not done. Run "natureco setup" first.\n')));
|
|
31
33
|
process.exit(1);
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -46,18 +48,18 @@ async function connectDiscord() {
|
|
|
46
48
|
const botId = `discord_${Date.now()}`;
|
|
47
49
|
const selectedBot = { name: 'Discord Bot', id: botId };
|
|
48
50
|
|
|
49
|
-
console.log(chalk.yellow('\n⏳ Discord bağlantısı kaydediliyor...\n'));
|
|
51
|
+
console.log(chalk.yellow(L('\n⏳ Discord bağlantısı kaydediliyor...\n', '\n⏳ Saving Discord connection...\n')));
|
|
50
52
|
|
|
51
53
|
// Save to config (v2.x - no backend call)
|
|
52
54
|
config.discordToken = answers.token.trim();
|
|
53
55
|
config.discordBotId = botId;
|
|
54
56
|
saveConfig(config);
|
|
55
57
|
|
|
56
|
-
console.log(chalk.green('✅ Discord token kaydedildi!\n'));
|
|
58
|
+
console.log(chalk.green(L('✅ Discord token kaydedildi!\n', '✅ Discord token saved!\n')));
|
|
57
59
|
console.log(chalk.cyan('Bot ID:'), chalk.white(botId));
|
|
58
60
|
console.log(chalk.cyan('Token:'), chalk.white(answers.token.slice(0, 20) + '...'));
|
|
59
|
-
console.log(chalk.gray('\nNot: Discord botunuzu Discord Developer Portal\'dan yapılandırmanız gerekiyor.'));
|
|
60
|
-
console.log(chalk.gray('Token config\'e kaydedildi: ~/.natureco/config.json\n'));
|
|
61
|
+
console.log(chalk.gray(L('\nNot: Discord botunuzu Discord Developer Portal\'dan yapılandırmanız gerekiyor.', '\nNote: You need to configure your Discord bot from the Discord Developer Portal.')));
|
|
62
|
+
console.log(chalk.gray(L('Token config\'e kaydedildi: ~/.natureco/config.json\n', 'Token saved to config: ~/.natureco/config.json\n')));
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
async function disconnectDiscord() {
|