@nac3/forge-cli 0.2.0-alpha.1 → 0.2.0-alpha.11

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.
Files changed (74) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +9 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/claude.d.ts +12 -15
  5. package/dist/chat/claude.d.ts.map +1 -1
  6. package/dist/chat/claude.js +60 -20
  7. package/dist/chat/claude.js.map +1 -1
  8. package/dist/chat/panel.d.ts.map +1 -1
  9. package/dist/chat/panel.js +90 -3
  10. package/dist/chat/panel.js.map +1 -1
  11. package/dist/chat/server.js +451 -32
  12. package/dist/chat/server.js.map +1 -1
  13. package/dist/chat/tools/audit_consumers.d.ts +66 -0
  14. package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
  15. package/dist/chat/tools/audit_consumers.js +231 -0
  16. package/dist/chat/tools/audit_consumers.js.map +1 -0
  17. package/dist/chat/tools/git.js +4 -4
  18. package/dist/chat/tools/github.js +3 -3
  19. package/dist/chat/tools/lifecycle.js +3 -3
  20. package/dist/chat/tools/manual.js +1 -1
  21. package/dist/chat/tools/reader.js +8 -8
  22. package/dist/chat/tools.d.ts.map +1 -1
  23. package/dist/chat/tools.js +11 -4
  24. package/dist/chat/tools.js.map +1 -1
  25. package/dist/commands/chat.d.ts +3 -0
  26. package/dist/commands/chat.d.ts.map +1 -1
  27. package/dist/commands/chat.js +46 -1
  28. package/dist/commands/chat.js.map +1 -1
  29. package/dist/commands/discover.d.ts +30 -0
  30. package/dist/commands/discover.d.ts.map +1 -0
  31. package/dist/commands/discover.js +178 -0
  32. package/dist/commands/discover.js.map +1 -0
  33. package/dist/commands/doctor.js +94 -42
  34. package/dist/commands/doctor.js.map +1 -1
  35. package/dist/commands/keys_setup.d.ts +53 -0
  36. package/dist/commands/keys_setup.d.ts.map +1 -0
  37. package/dist/commands/keys_setup.js +487 -0
  38. package/dist/commands/keys_setup.js.map +1 -0
  39. package/dist/commands/triage.d.ts +34 -0
  40. package/dist/commands/triage.d.ts.map +1 -0
  41. package/dist/commands/triage.js +228 -0
  42. package/dist/commands/triage.js.map +1 -0
  43. package/dist/commands/voice.d.ts.map +1 -1
  44. package/dist/commands/voice.js +3 -0
  45. package/dist/commands/voice.js.map +1 -1
  46. package/dist/commands/voice_setup.d.ts +37 -0
  47. package/dist/commands/voice_setup.d.ts.map +1 -0
  48. package/dist/commands/voice_setup.js +308 -0
  49. package/dist/commands/voice_setup.js.map +1 -0
  50. package/dist/core/keys_envelope.d.ts +54 -0
  51. package/dist/core/keys_envelope.d.ts.map +1 -0
  52. package/dist/core/keys_envelope.js +135 -0
  53. package/dist/core/keys_envelope.js.map +1 -0
  54. package/dist/license/hito4_client.d.ts +17 -1
  55. package/dist/license/hito4_client.d.ts.map +1 -1
  56. package/dist/license/hito4_client.js +71 -10
  57. package/dist/license/hito4_client.js.map +1 -1
  58. package/dist/license/index.d.ts.map +1 -1
  59. package/dist/license/index.js +7 -0
  60. package/dist/license/index.js.map +1 -1
  61. package/dist/version.d.ts +1 -1
  62. package/dist/version.d.ts.map +1 -1
  63. package/dist/version.js +1 -1
  64. package/dist/version.js.map +1 -1
  65. package/dist/voice/intents.d.ts +1 -1
  66. package/dist/voice/intents.js +0 -0
  67. package/dist/voice/providers/google.d.ts.map +1 -1
  68. package/dist/voice/providers/google.js +129 -23
  69. package/dist/voice/providers/google.js.map +1 -1
  70. package/dist/workflow/state.d.ts +190 -0
  71. package/dist/workflow/state.d.ts.map +1 -0
  72. package/dist/workflow/state.js +119 -0
  73. package/dist/workflow/state.js.map +1 -0
  74. package/package.json +3 -3
@@ -0,0 +1,487 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import prompts from 'prompts';
5
+ import { c, header } from '../ui/colors.js';
6
+ import { Vault } from '../vault/store.js';
7
+ import { configDir } from '../license/index.js';
8
+ import { readLicense } from '../core/polar.js';
9
+ import { signBearer, HITO4_BASE_URL } from '../license/hito4_client.js';
10
+ import { encryptUserKeys, decryptUserKeys, envelopeToBlob, envelopeFromBlob, } from '../core/keys_envelope.js';
11
+ const VAULT_SECRET_SLOT = 'yf_server_api_key';
12
+ const LOCAL_KEYS_FILE = 'provider_keys.json';
13
+ function localKeysPath() {
14
+ const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
15
+ return path.join(home, '.yujin-forge', LOCAL_KEYS_FILE);
16
+ }
17
+ async function readLocalKeys() {
18
+ try {
19
+ const raw = await fs.readFile(localKeysPath(), 'utf-8');
20
+ const parsed = JSON.parse(raw);
21
+ if (parsed && parsed.v === 1)
22
+ return parsed;
23
+ }
24
+ catch { /* missing or malformed -- treat as empty */ }
25
+ return { v: 1, updated_at: '1970-01-01T00:00:00Z' };
26
+ }
27
+ async function writeLocalKeys(payload) {
28
+ const p = localKeysPath();
29
+ await fs.mkdir(path.dirname(p), { recursive: true });
30
+ const tmp = p + '.tmp';
31
+ await fs.writeFile(tmp, JSON.stringify(payload, null, 2), 'utf-8');
32
+ await fs.rename(tmp, p);
33
+ }
34
+ function maskKey(k) {
35
+ if (!k)
36
+ return '(none)';
37
+ if (k.length <= 8)
38
+ return '****';
39
+ return k.slice(0, 4) + '...' + k.slice(-4);
40
+ }
41
+ async function loadServerSecret() {
42
+ const vault = await Vault.open({ configDir: configDir() });
43
+ if (!vault.has(VAULT_SECRET_SLOT)) {
44
+ throw new Error('keys setup: vault slot "' + VAULT_SECRET_SLOT + '" is empty. '
45
+ + 'Run `yf vault set ' + VAULT_SECRET_SLOT + '` with the value '
46
+ + 'provided at signup before configuring provider keys.');
47
+ }
48
+ return vault.get(VAULT_SECRET_SLOT);
49
+ }
50
+ async function loadUserHandle() {
51
+ const lic = await readLicense();
52
+ if (!lic.user_handle) {
53
+ throw new Error('keys setup: no user_handle on the local license cache. '
54
+ + 'Run `yf license activate --user-handle <you@example.com>` first.');
55
+ }
56
+ return lic.user_handle;
57
+ }
58
+ async function pushToServer(payload) {
59
+ const secret = await loadServerSecret();
60
+ const handle = await loadUserHandle();
61
+ const env = await encryptUserKeys(payload, secret);
62
+ const blob = envelopeToBlob(env);
63
+ const bearer = signBearer(secret, handle);
64
+ const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
65
+ const r = await fetch(url, {
66
+ method: 'POST',
67
+ headers: { Authorization: 'Bearer ' + bearer, 'content-type': 'application/json' },
68
+ body: JSON.stringify({ blob, ts: payload.updated_at }),
69
+ });
70
+ if (!r.ok) {
71
+ let detail = '';
72
+ try {
73
+ detail = await r.text();
74
+ }
75
+ catch { /* */ }
76
+ throw new Error('keys setup: server push failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
77
+ }
78
+ }
79
+ async function pullFromServer() {
80
+ const secret = await loadServerSecret();
81
+ const handle = await loadUserHandle();
82
+ const bearer = signBearer(secret, handle);
83
+ const url = HITO4_BASE_URL.replace(/\/+$/, '') + '/v1/keys-sync/' + encodeURIComponent(handle);
84
+ const r = await fetch(url, { method: 'GET', headers: { Authorization: 'Bearer ' + bearer } });
85
+ if (!r.ok) {
86
+ let detail = '';
87
+ try {
88
+ detail = await r.text();
89
+ }
90
+ catch { /* */ }
91
+ throw new Error('keys setup: server pull failed (HTTP ' + r.status + '): ' + detail.slice(0, 200));
92
+ }
93
+ const body = await r.json();
94
+ if (!body.blob)
95
+ return null;
96
+ const env = envelopeFromBlob(body.blob);
97
+ return decryptUserKeys(env, secret);
98
+ }
99
+ /** Fetch the live model list from the worker. The worker proxies
100
+ * to the upstream provider using the BYOK key in the header --
101
+ * key is never persisted nor logged on the server. */
102
+ async function fetchBrainModels(provider, apiKey) {
103
+ const url = HITO4_BASE_URL.replace(/\/+$/, '')
104
+ + '/v1/brain-providers/' + encodeURIComponent(provider) + '/models';
105
+ try {
106
+ const r = await fetch(url, {
107
+ method: 'GET',
108
+ headers: { 'x-yf-brain-key': apiKey },
109
+ });
110
+ if (!r.ok) {
111
+ return { models: [], fromUpstream: false, error: 'HTTP ' + r.status };
112
+ }
113
+ const body = await r.json();
114
+ return {
115
+ models: body.models ?? [],
116
+ fromUpstream: body.from_upstream === true,
117
+ error: body.upstream_error ?? undefined,
118
+ };
119
+ }
120
+ catch (e) {
121
+ return { models: [], fromUpstream: false, error: e instanceof Error ? e.message : String(e) };
122
+ }
123
+ }
124
+ const BRAIN_PROVIDER_CHOICES = [
125
+ { title: 'Anthropic (Claude opus/sonnet/haiku)', value: 'anthropic',
126
+ hint: 'API key starts with sk-ant-' },
127
+ { title: 'OpenAI (GPT-5 / GPT-4o / o3 / o3-mini)', value: 'openai',
128
+ hint: 'API key starts with sk-' },
129
+ { title: 'Google AI Studio (Gemini 2.5 Pro/Flash)', value: 'google',
130
+ hint: 'API key from aistudio.google.com (NOT a Cloud STT/TTS key)' },
131
+ { title: 'DeepSeek (chat / reasoner R1)', value: 'deepseek',
132
+ hint: 'API key starts with sk-' },
133
+ ];
134
+ function brainKeyOf(p, provider) {
135
+ if (provider === 'anthropic')
136
+ return p.anthropic_api_key;
137
+ if (provider === 'openai')
138
+ return p.openai_api_key;
139
+ if (provider === 'google')
140
+ return p.google_ai_key;
141
+ if (provider === 'deepseek')
142
+ return p.deepseek_api_key;
143
+ return undefined;
144
+ }
145
+ function setBrainKey(p, provider, key) {
146
+ if (provider === 'anthropic')
147
+ p.anthropic_api_key = key;
148
+ else if (provider === 'openai')
149
+ p.openai_api_key = key;
150
+ else if (provider === 'google')
151
+ p.google_ai_key = key;
152
+ else if (provider === 'deepseek')
153
+ p.deepseek_api_key = key;
154
+ }
155
+ function brainModelOf(p, provider) {
156
+ if (provider === 'anthropic')
157
+ return p.anthropic_model_preference;
158
+ if (provider === 'openai')
159
+ return p.openai_brain_model_preference;
160
+ if (provider === 'google')
161
+ return p.google_brain_model_preference;
162
+ if (provider === 'deepseek')
163
+ return p.deepseek_model_preference;
164
+ return undefined;
165
+ }
166
+ function setBrainModel(p, provider, model) {
167
+ if (provider === 'anthropic')
168
+ p.anthropic_model_preference = model;
169
+ else if (provider === 'openai')
170
+ p.openai_brain_model_preference = model;
171
+ else if (provider === 'google')
172
+ p.google_brain_model_preference = model;
173
+ else if (provider === 'deepseek')
174
+ p.deepseek_model_preference = model;
175
+ }
176
+ function printCurrent(p) {
177
+ header('Yujin Forge -- keys setup (current local)');
178
+ console.log('');
179
+ console.log(c.brand(' Brain (AI for chat + code):'));
180
+ console.log(' Preferred provider: ' + c.brand(p.brain_provider_preference ?? '(not set)'));
181
+ console.log(' Anthropic key: ' + c.dim(maskKey(p.anthropic_api_key))
182
+ + (p.anthropic_model_preference ? ' -- model: ' + c.brand(p.anthropic_model_preference) : ''));
183
+ console.log(' OpenAI key: ' + c.dim(maskKey(p.openai_api_key))
184
+ + (p.openai_brain_model_preference ? ' -- model: ' + c.brand(p.openai_brain_model_preference) : ''));
185
+ console.log(' Google AI key: ' + c.dim(maskKey(p.google_ai_key))
186
+ + (p.google_brain_model_preference ? ' -- model: ' + c.brand(p.google_brain_model_preference) : ''));
187
+ console.log(' DeepSeek key: ' + c.dim(maskKey(p.deepseek_api_key))
188
+ + (p.deepseek_model_preference ? ' -- model: ' + c.brand(p.deepseek_model_preference) : ''));
189
+ console.log('');
190
+ console.log(c.brand(' Voice (STT + TTS):'));
191
+ console.log(' OpenAI key (shared): ' + c.dim(maskKey(p.openai_api_key)));
192
+ console.log(' Google STT key: ' + c.dim(maskKey(p.google_stt_key)));
193
+ console.log(' Google TTS key: ' + c.dim(maskKey(p.google_tts_key)));
194
+ console.log(' ElevenLabs key: ' + c.dim(maskKey(p.elevenlabs_api_key)));
195
+ console.log(' STT preference: ' + c.brand(p.stt_provider_preference ?? '(not set)'));
196
+ console.log(' TTS preference: ' + c.brand(p.tts_provider_preference ?? '(not set)'));
197
+ console.log(' STT language: ' + (p.stt_language ?? c.dim('(default)')));
198
+ console.log(' TTS voice: ' + (p.tts_voice ?? c.dim('(default)')));
199
+ console.log('');
200
+ console.log(' Last updated: ' + c.dim(p.updated_at));
201
+ }
202
+ const NON_INTERACTIVE_PROVIDERS = new Set([
203
+ 'anthropic', 'openai', 'google-ai', 'deepseek',
204
+ 'openai-voice', 'google-stt', 'google-tts', 'elevenlabs',
205
+ ]);
206
+ function applyNonInteractiveSet(merged, provider, key) {
207
+ const p = provider.toLowerCase();
208
+ if (!NON_INTERACTIVE_PROVIDERS.has(p))
209
+ return false;
210
+ if (p === 'anthropic')
211
+ merged.anthropic_api_key = key;
212
+ else if (p === 'openai' || p === 'openai-voice')
213
+ merged.openai_api_key = key;
214
+ else if (p === 'google-ai')
215
+ merged.google_ai_key = key;
216
+ else if (p === 'deepseek')
217
+ merged.deepseek_api_key = key;
218
+ else if (p === 'google-stt')
219
+ merged.google_stt_key = key;
220
+ else if (p === 'google-tts')
221
+ merged.google_tts_key = key;
222
+ else if (p === 'elevenlabs')
223
+ merged.elevenlabs_api_key = key;
224
+ return true;
225
+ }
226
+ export function registerKeysSetupCommand(parent) {
227
+ parent
228
+ .command('setup')
229
+ .description('Configure BYOK provider keys -- Brain (Anthropic / OpenAI / Google AI / DeepSeek) '
230
+ + 'and Voice (OpenAI / Google Cloud / ElevenLabs). Encrypts + syncs to your other devices.')
231
+ .option('--show', 'print current local config (keys masked)')
232
+ .option('--pull', 'pull the server copy + overwrite local')
233
+ .option('--provider <name>', 'non-interactive: anthropic|openai|google-ai|deepseek|google-stt|google-tts|elevenlabs')
234
+ .option('--key <value>', 'non-interactive: the API key value for --provider')
235
+ .action(async (opts) => { await runKeysSetup(opts); });
236
+ }
237
+ /** Back-compat alias -- `yf voice setup` still works. */
238
+ export function registerVoiceSetupCommand(parent) {
239
+ registerKeysSetupCommand(parent);
240
+ }
241
+ export async function runKeysSetup(opts) {
242
+ /* --show: print current + exit. */
243
+ if (opts.show) {
244
+ const current = await readLocalKeys();
245
+ printCurrent(current);
246
+ return;
247
+ }
248
+ /* --pull: server -> local. */
249
+ if (opts.pull) {
250
+ let pulled;
251
+ try {
252
+ pulled = await pullFromServer();
253
+ }
254
+ catch (err) {
255
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
256
+ process.exitCode = 1;
257
+ return;
258
+ }
259
+ if (!pulled) {
260
+ console.log(c.dim('Server has no provider keys for this user yet.'));
261
+ return;
262
+ }
263
+ await writeLocalKeys(pulled);
264
+ header('Yujin Forge -- keys setup (pulled from server)');
265
+ console.log('');
266
+ printCurrent(pulled);
267
+ return;
268
+ }
269
+ /* --provider / --key: non-interactive single set. */
270
+ if (opts.provider || opts.key) {
271
+ if (!opts.provider || !opts.key) {
272
+ console.error(c.error('--provider and --key must be used together.'));
273
+ process.exitCode = 1;
274
+ return;
275
+ }
276
+ const merged = await readLocalKeys();
277
+ if (!applyNonInteractiveSet(merged, opts.provider, opts.key)) {
278
+ console.error(c.error('--provider must be one of: '
279
+ + Array.from(NON_INTERACTIVE_PROVIDERS).join(', ')));
280
+ process.exitCode = 1;
281
+ return;
282
+ }
283
+ merged.updated_at = new Date().toISOString();
284
+ try {
285
+ await pushToServer(merged);
286
+ await writeLocalKeys(merged);
287
+ header('Yujin Forge -- keys setup (saved)');
288
+ console.log('');
289
+ printCurrent(merged);
290
+ }
291
+ catch (err) {
292
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
293
+ process.exitCode = 1;
294
+ }
295
+ return;
296
+ }
297
+ /* Interactive flow. */
298
+ const current = await readLocalKeys();
299
+ header('Yujin Forge -- keys setup');
300
+ console.log('');
301
+ console.log(c.dim('Configure the API keys for your chosen providers. The keys are'));
302
+ console.log(c.dim('encrypted with your account secret + synced to your mobile + other'));
303
+ console.log(c.dim('paired devices automatically. The server never sees plaintext.'));
304
+ console.log('');
305
+ console.log(c.dim('Press Enter on any field to keep its current value.'));
306
+ console.log('');
307
+ const cats = await prompts({
308
+ type: 'multiselect',
309
+ name: 'cats',
310
+ message: 'Which categories do you want to configure?',
311
+ choices: [
312
+ { title: 'Brain (AI for chat + code) -- REQUIRED for Forge',
313
+ value: 'brain', selected: !current.brain_provider_preference },
314
+ { title: 'Voice (STT + TTS)',
315
+ value: 'voice', selected: false },
316
+ ],
317
+ min: 1,
318
+ hint: 'Space to select, Enter to confirm.',
319
+ });
320
+ if (!cats.cats || cats.cats.length === 0) {
321
+ console.log(c.dim('Nothing selected. Aborting.'));
322
+ return;
323
+ }
324
+ const merged = { ...current };
325
+ /* ----- Brain section ----- */
326
+ if (cats.cats.includes('brain')) {
327
+ console.log('');
328
+ console.log(c.brand('Brain provider'));
329
+ console.log(c.dim('A heavy dev easily burns $100-$200/mo on any of these. Forge is BYOK --'));
330
+ console.log(c.dim('you pay the provider directly. Pick the one you already have credits on.'));
331
+ console.log('');
332
+ const providerAns = await prompts({
333
+ type: 'select',
334
+ name: 'p',
335
+ message: 'Pick your brain provider',
336
+ choices: BRAIN_PROVIDER_CHOICES.map((ch) => ({
337
+ title: ch.title + (brainKeyOf(current, ch.value) ? c.success(' [configured]') : ''),
338
+ value: ch.value,
339
+ description: ch.hint,
340
+ })),
341
+ initial: BRAIN_PROVIDER_CHOICES.findIndex((ch) => ch.value === (current.brain_provider_preference ?? 'anthropic')),
342
+ });
343
+ const provider = (providerAns.p ?? null);
344
+ if (provider) {
345
+ merged.brain_provider_preference = provider;
346
+ const existingKey = brainKeyOf(merged, provider);
347
+ const keyAns = await prompts({
348
+ type: 'password',
349
+ name: 'k',
350
+ message: 'API key for ' + provider + '. Current: ' + maskKey(existingKey),
351
+ });
352
+ const keyToUse = keyAns.k || existingKey;
353
+ if (keyToUse) {
354
+ setBrainKey(merged, provider, keyToUse);
355
+ /* Fetch live model list from the worker, fall back to
356
+ * baked-in default list if unreachable. */
357
+ console.log(c.dim('Fetching available models from ' + provider + '...'));
358
+ const ml = await fetchBrainModels(provider, keyToUse);
359
+ if (!ml.fromUpstream) {
360
+ console.log(c.dim(' (upstream call failed' + (ml.error ? ': ' + ml.error : '') + ' -- using default list)'));
361
+ }
362
+ else {
363
+ console.log(c.success(' found ' + ml.models.length + ' chat models on your account'));
364
+ }
365
+ const currentModel = brainModelOf(merged, provider);
366
+ const modelChoices = ml.models.map((m) => ({
367
+ title: (m.display_name && m.display_name !== m.id)
368
+ ? m.display_name + c.dim(' (' + m.id + ')')
369
+ : m.id,
370
+ value: m.id,
371
+ description: m.created_at ? 'released ' + m.created_at.slice(0, 10) : undefined,
372
+ }));
373
+ const initialIdx = Math.max(0, modelChoices.findIndex((ch) => ch.value === currentModel));
374
+ const modelAns = await prompts({
375
+ type: 'select',
376
+ name: 'm',
377
+ message: 'Pick the model to use as default',
378
+ choices: modelChoices,
379
+ initial: initialIdx,
380
+ });
381
+ if (modelAns.m)
382
+ setBrainModel(merged, provider, modelAns.m);
383
+ }
384
+ else {
385
+ console.log(c.warn('No API key entered + none on file -- brain will fail until you set one.'));
386
+ }
387
+ }
388
+ }
389
+ /* ----- Voice section ----- */
390
+ if (cats.cats.includes('voice')) {
391
+ console.log('');
392
+ console.log(c.brand('Voice providers'));
393
+ const answers = await prompts({
394
+ type: 'multiselect',
395
+ name: 'providers',
396
+ message: 'Which voice providers do you want to configure?',
397
+ choices: [
398
+ { title: 'OpenAI (Whisper for STT + tts-1 for TTS)', value: 'openai',
399
+ selected: !!merged.openai_api_key },
400
+ { title: 'Google Cloud (STT + TTS)', value: 'google',
401
+ selected: !!(merged.google_stt_key || merged.google_tts_key) },
402
+ { title: 'ElevenLabs (TTS only -- higher quality voice)', value: 'elevenlabs',
403
+ selected: !!merged.elevenlabs_api_key },
404
+ ],
405
+ min: 0,
406
+ hint: 'Space to select, Enter to confirm.',
407
+ });
408
+ if (answers.providers && answers.providers.includes('openai')) {
409
+ const r = await prompts({
410
+ type: 'password',
411
+ name: 'k',
412
+ message: 'OpenAI API key (sk-...). Current: ' + maskKey(merged.openai_api_key),
413
+ });
414
+ if (r.k)
415
+ merged.openai_api_key = r.k;
416
+ }
417
+ if (answers.providers && answers.providers.includes('google')) {
418
+ const sttR = await prompts({
419
+ type: 'password',
420
+ name: 'k',
421
+ message: 'Google Cloud Speech-to-Text API key. Current: ' + maskKey(merged.google_stt_key),
422
+ });
423
+ if (sttR.k)
424
+ merged.google_stt_key = sttR.k;
425
+ const ttsR = await prompts({
426
+ type: 'password',
427
+ name: 'k',
428
+ message: 'Google Cloud Text-to-Speech API key (can be same as STT). Current: ' + maskKey(merged.google_tts_key),
429
+ });
430
+ if (ttsR.k)
431
+ merged.google_tts_key = ttsR.k;
432
+ }
433
+ if (answers.providers && answers.providers.includes('elevenlabs')) {
434
+ const r = await prompts({
435
+ type: 'password',
436
+ name: 'k',
437
+ message: 'ElevenLabs API key. Current: ' + maskKey(merged.elevenlabs_api_key),
438
+ });
439
+ if (r.k)
440
+ merged.elevenlabs_api_key = r.k;
441
+ }
442
+ const sttCandidates = [];
443
+ if (merged.openai_api_key)
444
+ sttCandidates.push({ title: 'OpenAI (Whisper)', value: 'openai' });
445
+ if (merged.google_stt_key)
446
+ sttCandidates.push({ title: 'Google', value: 'google' });
447
+ if (sttCandidates.length > 0) {
448
+ const pref = await prompts({
449
+ type: 'select', name: 'p', message: 'Preferred STT provider',
450
+ choices: sttCandidates, initial: 0,
451
+ });
452
+ if (pref.p)
453
+ merged.stt_provider_preference = pref.p;
454
+ }
455
+ const ttsCandidates = [];
456
+ if (merged.openai_api_key)
457
+ ttsCandidates.push({ title: 'OpenAI (tts-1)', value: 'openai' });
458
+ if (merged.google_tts_key)
459
+ ttsCandidates.push({ title: 'Google', value: 'google' });
460
+ if (merged.elevenlabs_api_key)
461
+ ttsCandidates.push({ title: 'ElevenLabs', value: 'elevenlabs' });
462
+ if (ttsCandidates.length > 0) {
463
+ const pref = await prompts({
464
+ type: 'select', name: 'p', message: 'Preferred TTS provider',
465
+ choices: ttsCandidates, initial: 0,
466
+ });
467
+ if (pref.p)
468
+ merged.tts_provider_preference = pref.p;
469
+ }
470
+ }
471
+ merged.updated_at = new Date().toISOString();
472
+ try {
473
+ await pushToServer(merged);
474
+ await writeLocalKeys(merged);
475
+ console.log('');
476
+ console.log(c.success('Provider keys saved + synced.'));
477
+ console.log('');
478
+ printCurrent(merged);
479
+ }
480
+ catch (err) {
481
+ console.error(c.error(err instanceof Error ? err.message : String(err)));
482
+ process.exitCode = 1;
483
+ }
484
+ }
485
+ /* Back-compat aliases so callers using the old names still work. */
486
+ export const runVoiceSetup = runKeysSetup;
487
+ //# sourceMappingURL=keys_setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys_setup.js","sourceRoot":"","sources":["../../src/commands/keys_setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `yf triage` -- Phase I step 1 of PRODUCT_WORKFLOW.md.
3
+ *
4
+ * Asks the user 5 questions, classifies the project into one of
5
+ * three complexity tiers (Simple / Medium / Full), and persists
6
+ * the decision to yujin.forge.json::workflow. The result drives
7
+ * which subsequent phases apply (see PRODUCT_WORKFLOW.md sec 1).
8
+ *
9
+ * Questions:
10
+ * 1. Output type (landing / blog / CRUD app / SaaS / regulated system)
11
+ * 2. Volumetria 12m (numeric: expected concurrent users at 12 months)
12
+ * 3. Industry context (general / health / finance / education / government)
13
+ * 4. Region (LATAM / US / EU / global)
14
+ * 5. Team maintaining (solo / pair / team)
15
+ *
16
+ * Classification rules:
17
+ * Simple = output in {landing, blog, demo} OR volumetria < 50 AND
18
+ * industry = general AND team = solo
19
+ * Full = industry in {health, finance, government} OR volumetria > 5000
20
+ * OR output = regulated_system OR (region = EU AND volumetria > 100)
21
+ * Medium = everything else
22
+ *
23
+ * User can override the auto-tier in the final confirmation.
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import type { Command } from 'commander';
28
+ export interface TriageOptions {
29
+ cwd?: string;
30
+ yes?: boolean;
31
+ }
32
+ export declare function runTriage(opts: TriageOptions): Promise<void>;
33
+ export declare function registerTriageCommand(program: Command): void;
34
+ //# sourceMappingURL=triage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HlE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc5D"}