wormclaude 1.0.150 → 1.0.152
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/dist/api.js +1 -0
- package/dist/auth.js +41 -10
- package/dist/cli.js +16 -6
- package/dist/theme.js +1 -1
- package/package.json +1 -1
package/dist/api.js
CHANGED
|
@@ -151,6 +151,7 @@ export async function* streamChat(messages, tools, config, signal) {
|
|
|
151
151
|
method: 'POST',
|
|
152
152
|
headers: {
|
|
153
153
|
'Content-Type': 'application/json',
|
|
154
|
+
'X-WormClaude-Client': 'cli', // gateway: CLI kullanımı abonelik kovasından düşer (çıplak API = API cüzdanı)
|
|
154
155
|
...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),
|
|
155
156
|
...(getTrace() ? { 'X-WC-Trace': getTrace(), 'X-WC-Session': getSession() } : {}),
|
|
156
157
|
},
|
package/dist/auth.js
CHANGED
|
@@ -4,6 +4,9 @@ import * as path from 'node:path';
|
|
|
4
4
|
import * as os from 'node:os';
|
|
5
5
|
import * as readline from 'node:readline';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
|
+
import { getLang } from './i18n.js';
|
|
8
|
+
// Kullanıcıya gösterilen metin: VARSAYILAN İngilizce; yalnız dil 'tr' ise Türkçe.
|
|
9
|
+
const tt = (en, tr) => (getLang() === 'tr' ? tr : en);
|
|
7
10
|
export const CONFIG_DIR = path.join(os.homedir(), '.wormclaude');
|
|
8
11
|
export const CONFIG_PATH = path.join(CONFIG_DIR, 'config.json');
|
|
9
12
|
// Müşteriler bunu değiştirmesin diye varsayılan public API.
|
|
@@ -31,6 +34,32 @@ export function clearStored() {
|
|
|
31
34
|
}
|
|
32
35
|
catch { }
|
|
33
36
|
}
|
|
37
|
+
// Anahtarı doğrudan yapıştırarak giriş: web Ayarlar → API'den kopyalanan anahtarı kaydet.
|
|
38
|
+
// Anahtar gateway'de doğrulanır (geçersizse kaydetmez). [[api-key-unification]] Faz 3.
|
|
39
|
+
export async function loginWithKey(rawKey) {
|
|
40
|
+
const key = (rawKey || '').trim();
|
|
41
|
+
if (!key) {
|
|
42
|
+
process.stdout.write('\n ' + tt('Empty key. Usage: wormclaude login --key <KEY>', 'Anahtar boş. Kullanım: wormclaude login --key <ANAHTAR>') + '\n\n');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
const base = process.env.WORMCLAUDE_BASE_URL || DEFAULT_BASE_URL;
|
|
46
|
+
process.stdout.write(' ' + tt('Validating key...', 'Anahtar doğrulanıyor...'));
|
|
47
|
+
try {
|
|
48
|
+
const r = await fetch(`${base}/account`, { headers: { Authorization: `Bearer ${key}` } });
|
|
49
|
+
if (!r.ok) {
|
|
50
|
+
process.stdout.write('\n\n \x1b[31m' + tt('✗ Invalid key', '✗ Anahtar geçersiz') + '\x1b[0m (HTTP ' + r.status + '). ' +
|
|
51
|
+
tt('Copy the correct key from web Settings → API.', 'Web Ayarlar → API\'den doğru anahtarı kopyala.') + '\n\n');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
process.stdout.write('\n\n ' + tt('Could not reach the server: ', 'Sunucuya ulaşılamadı: ') + (e?.message || e) + '\n\n');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
saveStored({ baseUrl: base, apiKey: key, model: 'wormclaude-v2' });
|
|
60
|
+
process.stdout.write('\n\n \x1b[32m' + tt('✓ Signed in!', '✓ Giriş başarılı!') + '\x1b[0m ' +
|
|
61
|
+
tt('You can now use `wormclaude`.', 'Artık `wormclaude` yazarak kullanabilirsiniz.') + '\n\n');
|
|
62
|
+
}
|
|
34
63
|
// baseUrl ".../v1" → device endpoint'leri için kök (".../v1" olmadan)
|
|
35
64
|
function apiOrigin(baseUrl) {
|
|
36
65
|
return baseUrl.replace(/\/v1\/?$/, '');
|
|
@@ -111,8 +140,8 @@ export function runUpdate() {
|
|
|
111
140
|
// ↑/↓ ok tuşlarıyla gezin, Enter ile seç. (1/2 tuşları da çalışır.)
|
|
112
141
|
export function promptLoginMenu() {
|
|
113
142
|
const items = [
|
|
114
|
-
{ label: 'Giriş yap', value: 'login' },
|
|
115
|
-
{ label: 'Çıkış', value: 'exit' },
|
|
143
|
+
{ label: tt('Log in', 'Giriş yap'), value: 'login' },
|
|
144
|
+
{ label: tt('Exit', 'Çıkış'), value: 'exit' },
|
|
116
145
|
];
|
|
117
146
|
return new Promise((resolve) => {
|
|
118
147
|
const stdin = process.stdin;
|
|
@@ -124,7 +153,7 @@ export function promptLoginMenu() {
|
|
|
124
153
|
}
|
|
125
154
|
let idx = 0;
|
|
126
155
|
process.stdout.write('\n \x1b[1mWormClaude\x1b[0m\n');
|
|
127
|
-
process.stdout.write(' \x1b[2m↑/↓ ile seç · Enter ile onayla\x1b[0m\n\n');
|
|
156
|
+
process.stdout.write(' \x1b[2m' + tt('↑/↓ to select · Enter to confirm', '↑/↓ ile seç · Enter ile onayla') + '\x1b[0m\n\n');
|
|
128
157
|
const draw = (first) => {
|
|
129
158
|
if (!first)
|
|
130
159
|
process.stdout.write(`\x1b[${items.length}A`); // imleci listenin başına al
|
|
@@ -193,17 +222,17 @@ export async function deviceLogin() {
|
|
|
193
222
|
start = await r.json();
|
|
194
223
|
}
|
|
195
224
|
catch (e) {
|
|
196
|
-
process.stderr.write('Giriş başlatılamadı: ' + (e?.message || e) + '\n');
|
|
225
|
+
process.stderr.write(tt('Could not start login: ', 'Giriş başlatılamadı: ') + (e?.message || e) + '\n');
|
|
197
226
|
process.exit(1);
|
|
198
227
|
}
|
|
199
228
|
const url = start.verification_uri_complete || start.verification_uri;
|
|
200
229
|
const deviceCode = start.device_code;
|
|
201
230
|
openBrowser(url);
|
|
202
|
-
process.stdout.write('\n Tarayıcıda Google ile giriş yapın
|
|
203
|
-
process.stdout.write(' \x1b[2m(tarayıcı açılmadıysa: ' + url + ')\x1b[0m\n\n');
|
|
231
|
+
process.stdout.write('\n ' + tt('Sign in with Google in your browser...', 'Tarayıcıda Google ile giriş yapın...') + '\n');
|
|
232
|
+
process.stdout.write(' \x1b[2m(' + tt('if the browser did not open: ', 'tarayıcı açılmadıysa: ') + url + ')\x1b[0m\n\n');
|
|
204
233
|
const pollMs = Math.max(2, Number(start.interval) || 3) * 1000;
|
|
205
234
|
const deadline = Date.now() + (Number(start.expires_in) || 600) * 1000;
|
|
206
|
-
process.stdout.write(' Bekleniyor');
|
|
235
|
+
process.stdout.write(' ' + tt('Waiting', 'Bekleniyor'));
|
|
207
236
|
while (Date.now() < deadline) {
|
|
208
237
|
await sleep(pollMs);
|
|
209
238
|
process.stdout.write('.');
|
|
@@ -216,19 +245,21 @@ export async function deviceLogin() {
|
|
|
216
245
|
continue; // geçici ağ hatası — tekrar dene
|
|
217
246
|
}
|
|
218
247
|
if (d.status === 'approved') {
|
|
248
|
+
// Gateway onayda anahtarı CLI'ye bağlar (yoksa oluşturur, varsa yeniler) → api_key hep dolu.
|
|
219
249
|
saveStored({
|
|
220
250
|
baseUrl: d.base_url || base,
|
|
221
251
|
apiKey: d.api_key,
|
|
222
252
|
model: d.model || 'wormclaude-v2',
|
|
223
253
|
});
|
|
224
|
-
process.stdout.write('\n\n \x1b[32m✓ Giriş başarıl
|
|
254
|
+
process.stdout.write('\n\n \x1b[32m' + tt('✓ Signed in!', '✓ Giriş başarılı!') + '\x1b[0m ' +
|
|
255
|
+
tt('You can now use `wormclaude`.', 'Artık `wormclaude` yazarak kullanabilirsiniz.') + '\n\n');
|
|
225
256
|
return;
|
|
226
257
|
}
|
|
227
258
|
if (d.status === 'expired') {
|
|
228
|
-
process.stdout.write('\n\n Kodun süresi doldu. Tekrar deneyin: wormclaude login\n\n');
|
|
259
|
+
process.stdout.write('\n\n ' + tt('Code expired. Try again: wormclaude login', 'Kodun süresi doldu. Tekrar deneyin: wormclaude login') + '\n\n');
|
|
229
260
|
process.exit(1);
|
|
230
261
|
}
|
|
231
262
|
}
|
|
232
|
-
process.stdout.write('\n\n Süre doldu. Tekrar deneyin: wormclaude login\n\n');
|
|
263
|
+
process.stdout.write('\n\n ' + tt('Timed out. Try again: wormclaude login', 'Süre doldu. Tekrar deneyin: wormclaude login') + '\n\n');
|
|
233
264
|
process.exit(1);
|
|
234
265
|
}
|
package/dist/cli.js
CHANGED
|
@@ -61,11 +61,15 @@ import { shouldAutoCompact, runCompact, isContextError } from './compact.js';
|
|
|
61
61
|
import { shouldExtract, triggerMemory, loadMemoryContext } from './memory.js';
|
|
62
62
|
// --- WORMCLAUDE SUBCOMMANDS (TUI oncesi) ---
|
|
63
63
|
const _arg = (process.argv[2] || '').toLowerCase();
|
|
64
|
+
// Dil: VARSAYILAN İngilizce; kayıtlı dil varsa onu uygula. TÜM yollardan (subcommand + TUI) ÖNCE
|
|
65
|
+
// ayarla ki login/whoami/hata mesajları da doğru dilde olsun (eskiden subcommand'lar default'a düşüyordu).
|
|
66
|
+
setLang(loadLang() ?? 'en');
|
|
67
|
+
const _tt = (en, tr) => (getLang() === 'tr' ? tr : en);
|
|
64
68
|
// Headless mod: wormclaude -p "<görev>" → TUI'siz çalıştır, stdout'a yaz, çık (scriptlenebilir + test).
|
|
65
69
|
if (_arg === '-p' || _arg === '--print') {
|
|
66
70
|
const _prompt = process.argv.slice(3).join(' ').trim();
|
|
67
71
|
if (!_prompt) {
|
|
68
|
-
console.error('Kullanım: wormclaude -p "<görev>"');
|
|
72
|
+
console.error(_tt('Usage: wormclaude -p "<task>"', 'Kullanım: wormclaude -p "<görev>"'));
|
|
69
73
|
process.exit(1);
|
|
70
74
|
}
|
|
71
75
|
const { runHeadless } = await import('./headless.js');
|
|
@@ -74,15 +78,21 @@ if (_arg === '-p' || _arg === '--print') {
|
|
|
74
78
|
}
|
|
75
79
|
if (_arg === 'login' || _arg === 'logout' || _arg === 'whoami' || _arg === '--version' || _arg === '-v' || _arg === 'update') {
|
|
76
80
|
const auth = await import('./auth.js');
|
|
77
|
-
if (_arg === 'login')
|
|
78
|
-
|
|
81
|
+
if (_arg === 'login') {
|
|
82
|
+
// wormclaude login --key <ANAHTAR> → anahtarı doğrudan yapıştır (web Ayarlar'dan kopyalanan).
|
|
83
|
+
const _ki = process.argv.indexOf('--key');
|
|
84
|
+
if (_ki > 0 && process.argv[_ki + 1])
|
|
85
|
+
await auth.loginWithKey(process.argv[_ki + 1]);
|
|
86
|
+
else
|
|
87
|
+
await auth.deviceLogin();
|
|
88
|
+
}
|
|
79
89
|
else if (_arg === 'logout') {
|
|
80
90
|
auth.clearStored();
|
|
81
|
-
console.log('
|
|
91
|
+
console.log(_tt('Logged out.', 'Çıkış yapıldı.'));
|
|
82
92
|
}
|
|
83
93
|
else if (_arg === 'whoami') {
|
|
84
94
|
const c = auth.loadStored();
|
|
85
|
-
console.log(c.apiKey ? ('
|
|
95
|
+
console.log(c.apiKey ? (_tt('Logged in (', 'Giriş yapıldı (') + (c.baseUrl || '') + ')') : _tt('Not logged in - wormclaude login', 'Giriş yapılmadı - wormclaude login'));
|
|
86
96
|
}
|
|
87
97
|
else if (_arg === 'update') {
|
|
88
98
|
await auth.runUpdate();
|
|
@@ -162,7 +172,7 @@ if (_needLogin) {
|
|
|
162
172
|
setToolConfig(config); // Agent/alt-agent araçları aynı config'i kullanır
|
|
163
173
|
setCheckpointStore(process.cwd()); // rewind deposu (/rewind, /checkpoints)
|
|
164
174
|
const MAX_TURNS = Number(process.env.WORMCLAUDE_MAX_TURNS) || 90; // tur limiti
|
|
165
|
-
setLang(loadLang() ?? '
|
|
175
|
+
setLang(loadLang() ?? 'en'); // kayıtlı dili yükle (yoksa İngilizce)
|
|
166
176
|
loadSkills(); // .wormclaude/skills/*.md yükle
|
|
167
177
|
loadExtensions(); // extensions/<ad>/ (gömülü + kullanıcı + proje) yükle
|
|
168
178
|
// Kalıcı hafıza: açılışta .wormclaude/memory.md + WORMCLAUDE.md'yi context'e yükle
|
package/dist/theme.js
CHANGED