aura-code 0.3.0 → 0.3.2

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 (46) hide show
  1. package/README.md +2 -2
  2. package/dist/agent/loop.js +6 -0
  3. package/dist/agent/loop.js.map +1 -1
  4. package/dist/agent/system-prompt.js +9 -0
  5. package/dist/agent/system-prompt.js.map +1 -1
  6. package/dist/cli/index.js +161 -28
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/config/defaults.js +1 -1
  9. package/dist/providers/factory.d.ts +17 -0
  10. package/dist/providers/factory.js +130 -1
  11. package/dist/providers/factory.js.map +1 -1
  12. package/dist/providers/google.js +21 -8
  13. package/dist/providers/google.js.map +1 -1
  14. package/dist/providers/openai-compatible.js +4 -0
  15. package/dist/providers/openai-compatible.js.map +1 -1
  16. package/dist/ruby/model-selector.d.ts +20 -0
  17. package/dist/ruby/model-selector.js +114 -0
  18. package/dist/ruby/model-selector.js.map +1 -0
  19. package/dist/ruby/stats.d.ts +6 -0
  20. package/dist/ruby/stats.js +103 -0
  21. package/dist/ruby/stats.js.map +1 -0
  22. package/dist/setup/provider-registry.d.ts +32 -0
  23. package/dist/setup/provider-registry.js +159 -0
  24. package/dist/setup/provider-registry.js.map +1 -0
  25. package/dist/setup/provider-test.d.ts +15 -0
  26. package/dist/setup/provider-test.js +195 -0
  27. package/dist/setup/provider-test.js.map +1 -0
  28. package/dist/setup/provider-wizard.d.ts +29 -0
  29. package/dist/setup/provider-wizard.js +376 -0
  30. package/dist/setup/provider-wizard.js.map +1 -0
  31. package/dist/setup/xiaomi.d.ts +23 -0
  32. package/dist/setup/xiaomi.js +67 -0
  33. package/dist/setup/xiaomi.js.map +1 -0
  34. package/dist/tools/index.js +3 -0
  35. package/dist/tools/index.js.map +1 -1
  36. package/dist/tools/shadow-shield.d.ts +11 -0
  37. package/dist/tools/shadow-shield.js +538 -0
  38. package/dist/tools/shadow-shield.js.map +1 -0
  39. package/dist/tools/telegram-bot.js +32 -8
  40. package/dist/tools/telegram-bot.js.map +1 -1
  41. package/dist/util/errors.js +9 -1
  42. package/dist/util/errors.js.map +1 -1
  43. package/dist/util/load-env.d.ts +10 -0
  44. package/dist/util/load-env.js +93 -0
  45. package/dist/util/load-env.js.map +1 -0
  46. package/package.json +1 -1
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  <p align="center">
13
13
  <a href="https://www.npmjs.com/package/aura-code"><img src="https://img.shields.io/npm/v/aura-code?color=cc0000&label=npm&logo=npm" alt="npm version"></a>
14
14
  <a href="https://github.com/milodule3-debug/aura-code/actions/workflows/ci.yml"><img src="https://github.com/milodule3-debug/aura-code/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
15
- <img src="https://img.shields.io/badge/tests-734%2B-brightgreen" alt="734+ tests">
15
+ <img src="https://img.shields.io/badge/tests-1035%2B-brightgreen" alt="1035+ tests">
16
16
  <a href="https://github.com/milodule3-debug/aura-code/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT License"></a>
17
17
  <img src="https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js&logoColor=white" alt="Node.js 18+">
18
18
  <a href="https://github.com/milodule3-debug/aura-code"><img src="https://img.shields.io/github/stars/milodule3-debug/aura-code?style=social" alt="GitHub Stars"></a>
@@ -111,7 +111,7 @@ Any OpenAI-compatible endpoint also works via `openrouter/<model>`.
111
111
 
112
112
  | Metric | Value |
113
113
  |--------|-------|
114
- | Tests | 734+ passing, 0 failures |
114
+ | Tests | 1035+ passing, 0 failures |
115
115
  | Version | v0.3.0 |
116
116
  | Language | TypeScript (strict) |
117
117
  | License | MIT |
@@ -126,6 +126,12 @@ async function runLoopBody(args) {
126
126
  }
127
127
  catch (e) {
128
128
  display.error(`Provider error: ${String(e)}`);
129
+ // If we failed on the first turn without making any tool calls, the assistant
130
+ // never responded. Pop the user's task so we don't poison the chat history
131
+ // with consecutive user messages on the next attempt.
132
+ if (turns === 1 && toolCallCount === 0) {
133
+ history.pop();
134
+ }
129
135
  await persist(opts.sessionPath, history);
130
136
  return {
131
137
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,15 @@ You are working in a ${ctx.language} project called "${ctx.name}" (${ctx.framewo
24
24
  - When done, summarize exactly what changed and what was verified (tests passed, build succeeded, specific checks that passed).
25
25
  - If the task requires a code change, you must eventually call write_file or edit_file to apply it. Do not spend all turns on read_file and search_code — at some point you must commit to making the change. Aim for a 2:1 ratio of reads to writes, not 100% reads.
26
26
  - Never respond to a task with only prose. Always begin by using at least one tool (search_code, read_file, or list_dir) to investigate the codebase before summarizing or concluding. A response with zero tool calls is almost always incomplete.
27
+ - Not every task is a coding task. For questions, research, or information requests, use web_search/web_fetch and respond with the information directly — no code changes needed.
28
+
29
+ ## Web and information tools
30
+ - You have web_search and web_fetch tools. USE THEM for any question about current events, weather, news, documentation, or anything that requires up-to-date information.
31
+ - When web_search returns results, READ THE RESULTS — they are already in your context. Extract the relevant information (temperatures, dates, facts, summaries) and present it directly to the user. Do NOT say "I can't browse the results" — you already have them.
32
+ - If search results contain snippets with the answer, give the answer directly. If you need more detail, use web_fetch on the most relevant URL to get the full page content.
33
+ - For weather: extract temperature, conditions, humidity, wind from the search snippets and present them clearly.
34
+ - For documentation/articles: summarize the key points, don't just list links.
35
+ - You are NOT limited to coding tasks. You can research, summarize, explain, translate, and answer general knowledge questions using your tools and knowledge.
27
36
 
28
37
  ## Code standards
29
38
  - Match the existing code style: indentation, naming conventions, comment style.
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":";;AAEA,8CA0DC;AAED,oDAmCC;AA/FD,SAAgB,iBAAiB,CAAC,GAAmB,EAAE,YAAoB;IACzE,OAAO;uBACc,GAAG,CAAC,QAAQ,oBAAoB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCtE,GAAG,CAAC,QAAQ;aACX,GAAG,CAAC,SAAS;QAClB,GAAG,CAAC,IAAI;;;;EAId,GAAG,CAAC,IAAI;;;;;EAKR,GAAG,CAAC,MAAM;;;;EAIV,GAAG,CAAC,MAAM;;;EAGV,GAAG,CAAC,aAAa;;YAEP,YAAY,uDAAuD,CAAC;AAChF,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,WAAmB;IACpE,OAAO,wEAAwE,IAAI;;gBAErE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BzB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":";;AAEA,8CAmEC;AAED,oDAmCC;AAxGD,SAAgB,iBAAiB,CAAC,GAAmB,EAAE,YAAoB;IACzE,OAAO;uBACc,GAAG,CAAC,QAAQ,oBAAoB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA4CtE,GAAG,CAAC,QAAQ;aACX,GAAG,CAAC,SAAS;QAClB,GAAG,CAAC,IAAI;;;;EAId,GAAG,CAAC,IAAI;;;;;EAKR,GAAG,CAAC,MAAM;;;;EAIV,GAAG,CAAC,MAAM;;;EAGV,GAAG,CAAC,aAAa;;YAEP,YAAY,uDAAuD,CAAC;AAChF,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,WAAmB;IACpE,OAAO,wEAAwE,IAAI;;gBAErE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BzB,CAAC;AACH,CAAC"}
package/dist/cli/index.js CHANGED
@@ -55,6 +55,7 @@ const defaults_js_1 = require("../config/defaults.js");
55
55
  const session_store_js_1 = require("../agent/session-store.js");
56
56
  const global_config_js_1 = require("../setup/global-config.js");
57
57
  const first_run_js_1 = require("../setup/first-run.js");
58
+ const provider_wizard_js_1 = require("../setup/provider-wizard.js");
58
59
  const index_js_3 = require("../orchestration/index.js");
59
60
  const index_js_4 = require("../perception/index.js");
60
61
  const weakness_miner_js_1 = require("../harness/weakness-miner.js");
@@ -63,12 +64,18 @@ const engine_js_1 = require("../workflows/engine.js");
63
64
  const engine_js_2 = require("../architect/engine.js");
64
65
  const diamond_js_1 = require("./diamond.js");
65
66
  const episode_capture_js_1 = require("../ruby/episode-capture.js");
67
+ const model_selector_js_1 = require("../ruby/model-selector.js");
68
+ const stats_js_1 = require("../ruby/stats.js");
69
+ const load_env_js_1 = require("../util/load-env.js");
70
+ const factory_js_2 = require("../providers/factory.js");
71
+ // Load API keys from ~/.hermes/.env, ~/.config/aura-code/.env, and project .env
72
+ (0, load_env_js_1.bootstrapAuraEnv)(process.cwd());
66
73
  // ─────────────────────────────────────────────────────────────────────────────
67
74
  // Parse args
68
75
  // ─────────────────────────────────────────────────────────────────────────────
69
76
  const argv = (0, minimist_1.default)(process.argv.slice(2), {
70
77
  string: ['model', 'm', 'api-key', 'base-url', 'mode', 'cwd', 'rate-limit-rpm', 'rate-limit-tpm', 'max-retries', 'max-verify-retries', 'max-turns', 'fallback', 'resume', 'chat-id', 'profile', 'test-command', 'workflow', 'resume-workflow', 'workflow-name', 'apply-harness', 'blueprint', 'build'],
71
- boolean: ['help', 'h', 'version', 'v', 'auto', 'readonly', 'models', 'no-session', 'no-setup', 'reset-setup', 'orchestrate', 'plan', 'architect', 'list-sessions', 'new-session', 'verify', 'analyze', 'workflows', 'propose-harness', 'blueprints', 'once'],
78
+ boolean: ['help', 'h', 'version', 'v', 'auto', 'readonly', 'models', 'no-session', 'no-setup', 'reset-setup', 'setup', 'orchestrate', 'plan', 'architect', 'list-sessions', 'new-session', 'verify', 'analyze', 'stats', 'workflows', 'propose-harness', 'blueprints', 'once'],
72
79
  alias: { m: 'model', h: 'help', v: 'version' },
73
80
  default: {
74
81
  model: process.env.AURA_MODEL,
@@ -165,6 +172,29 @@ if (argv.analyze) {
165
172
  }
166
173
  process.exit(0);
167
174
  }
175
+ if (argv.stats) {
176
+ (async () => {
177
+ const root = argv.cwd ? path.resolve(argv.cwd) : process.cwd();
178
+ const episodes = await (0, episode_capture_js_1.loadEpisodes)(root);
179
+ const output = (0, stats_js_1.formatStats)(episodes);
180
+ // Print each line, highlighting the header
181
+ for (const line of output.split('\n')) {
182
+ if (line.trim() === 'Aura Stats') {
183
+ console.log(chalk_1.default.hex('#cc785c').bold(line));
184
+ }
185
+ else if (line.includes(':')) {
186
+ const colonIdx = line.indexOf(':');
187
+ const label = line.slice(0, colonIdx + 1);
188
+ const value = line.slice(colonIdx + 1);
189
+ console.log(chalk_1.default.hex('#8a7768')(label) + chalk_1.default.hex('#ede0cc')(value));
190
+ }
191
+ else {
192
+ console.log(line);
193
+ }
194
+ }
195
+ process.exit(0);
196
+ })();
197
+ }
168
198
  if (argv['propose-harness']) {
169
199
  // Ensure a weakness report exists — mine if needed
170
200
  if (!fs.existsSync((0, weakness_miner_js_1.reportPath)())) {
@@ -335,9 +365,15 @@ const fileConfig = (0, project_config_js_1.loadProjectConfig)(cwd);
335
365
  // Pull global config (saved by the first-run wizard) so the user doesn't have
336
366
  // to re-set their provider on every run.
337
367
  const globalCfg = (0, global_config_js_1.loadGlobalConfig)();
338
- // Effective model = CLI > AURA_MODEL env > .aura.json > global config > undefined
368
+ // Effective model = CLI > AURA_MODEL env > global wizard > .aura.json project default
339
369
  const cliModel = typeof argv.model === 'string' ? argv.model : undefined;
340
- const effectiveModel = cliModel ?? fileConfig.model ?? globalCfg?.defaultModel ?? process.env.AURA_MODEL;
370
+ // Tracks whether the user has explicitly chosen a model (--model flag OR :model REPL command).
371
+ // The RubyAlternator must not override an explicit user choice.
372
+ let userSetModel = !!cliModel;
373
+ const effectiveModel = cliModel
374
+ ?? process.env.AURA_MODEL
375
+ ?? globalCfg?.defaultModel
376
+ ?? fileConfig.model;
341
377
  // Effective base URL = CLI > .aura.json > global config > undefined
342
378
  const cliBaseUrl = typeof argv['base-url'] === 'string' ? argv['base-url'] : undefined;
343
379
  const effectiveBaseUrl = cliBaseUrl ?? fileConfig.baseUrl ?? globalCfg?.baseUrl;
@@ -371,12 +407,16 @@ if (cliProfile === 'local') {
371
407
  function buildProvider(display) {
372
408
  // Use runtimeConfig.model (mutable via :model command) falling back to resolved.model.
373
409
  const model = runtimeConfig.model ?? resolved.model;
410
+ const transport = (0, factory_js_2.resolveProviderTransport)(model, {
411
+ baseUrl: runtimeConfig.baseUrl ?? resolved.baseUrl ?? undefined,
412
+ apiKey: runtimeConfig.apiKey,
413
+ });
374
414
  // Keep resolved in sync so external reads (e.g. header display) reflect the switch.
375
415
  resolved.model = model;
376
416
  return (0, resilient_factory_js_1.createResilientProvider)({
377
417
  model,
378
- apiKey: runtimeConfig.apiKey,
379
- baseUrl: runtimeConfig.baseUrl ?? undefined,
418
+ apiKey: transport.apiKey,
419
+ baseUrl: transport.baseUrl,
380
420
  }, {
381
421
  rpm: resolved.rateLimitRpm,
382
422
  tpm: resolved.rateLimitTpm,
@@ -410,6 +450,7 @@ async function main() {
410
450
  const cliModel = typeof argv.model === 'string' ? argv.model : undefined;
411
451
  const skipSetup = argv['no-setup'] === true || argv.help === true || argv.h === true || argv.models === true || argv.version === true || argv.v === true;
412
452
  const resetSetup = argv['reset-setup'] === true;
453
+ const cliSetup = argv['setup'] === true;
413
454
  if (resetSetup) {
414
455
  // Wipe global config so the wizard fires unconditionally.
415
456
  try {
@@ -417,9 +458,20 @@ async function main() {
417
458
  }
418
459
  catch { /* not present */ }
419
460
  }
461
+ // --setup flag: run provider wizard before entering REPL
462
+ if (cliSetup && !skipSetup) {
463
+ const cfg = await (0, provider_wizard_js_1.runProviderWizard)();
464
+ if (cfg) {
465
+ resolved.model = cfg.model;
466
+ resolved.baseUrl = cfg.baseUrl;
467
+ runtimeConfig.model = cfg.model;
468
+ runtimeConfig.baseUrl = cfg.baseUrl;
469
+ runtimeConfig.apiKey = cfg.apiKey;
470
+ }
471
+ }
420
472
  // When --reset-setup is set, force the wizard to fire (overrides env-var
421
473
  // detection — the user explicitly wants to reconfigure).
422
- const shouldRunWizard = !skipSetup && isInteractive && (resetSetup || (0, first_run_js_1.needsWizard)({ cliApiKey, cliModel }));
474
+ const shouldRunWizard = !skipSetup && !cliSetup && isInteractive && (resetSetup || (0, first_run_js_1.needsWizard)({ cliApiKey, cliModel }));
423
475
  if (shouldRunWizard) {
424
476
  // If stdin is not a TTY and there's nothing piped in, the wizard will
425
477
  // hang. Skip with a helpful message instead.
@@ -743,6 +795,28 @@ async function main() {
743
795
  catch {
744
796
  // Router failed — fall through to single agent
745
797
  }
798
+ // ── RubyAlternator: suggest model from competence history ─────────────────
799
+ // Only when the user has NOT explicitly specified --model or :model
800
+ if (!userSetModel && !globalCfg?.defaultModel) {
801
+ try {
802
+ const availableModelIds = (0, factory_js_1.getAllModels)()
803
+ .map(m => m.id)
804
+ .filter(id => (0, factory_js_2.isModelConfigured)(id))
805
+ .filter(id => (0, factory_js_2.modelProviderFamily)(id) === (0, factory_js_2.modelProviderFamily)(runtimeConfig.model ?? resolved.model));
806
+ const suggested = await (0, model_selector_js_1.selectModel)(ctx.root, task, availableModelIds);
807
+ if (suggested && suggested !== runtimeConfig.model) {
808
+ console.log(chalk_1.default.hex('#4e3d30')(` Using ${suggested} (selected by competence history)\n`));
809
+ runtimeConfig.model = suggested;
810
+ runtimeConfig.baseUrl = undefined;
811
+ runtimeConfig.apiKey = undefined;
812
+ // Rebuild provider with the suggested model
813
+ provider = buildProvider(display);
814
+ }
815
+ }
816
+ catch {
817
+ // Competence selection is best-effort; never block the user
818
+ }
819
+ }
746
820
  const doVerify = cliVerify || !!fileConfig.verify;
747
821
  const episodeStart = Date.now();
748
822
  let result;
@@ -845,6 +919,7 @@ async function main() {
845
919
  providerConfig: { model: resolved.model, apiKey: runtimeConfig.apiKey, baseUrl: runtimeConfig.baseUrl ?? undefined },
846
920
  permissions, cumulative,
847
921
  chatState: { projectRoot, activeChatId, activeChatHistory, activeChatTitle, noSession },
922
+ rl,
848
923
  };
849
924
  const cmdResult = await handleReplCommand(input, replCtx);
850
925
  if (cmdResult.handled) {
@@ -859,6 +934,26 @@ async function main() {
859
934
  return;
860
935
  }
861
936
  // Run task — pass current conversation history for stay-active mode
937
+ // ── RubyAlternator: suggest model from competence history ──────────────
938
+ // Only when the user has NOT set a model explicitly via --model or :model
939
+ if (!userSetModel && !globalCfg?.defaultModel) {
940
+ try {
941
+ const availableModelIds = (0, factory_js_1.getAllModels)()
942
+ .map(m => m.id)
943
+ .filter(id => (0, factory_js_2.isModelConfigured)(id))
944
+ .filter(id => (0, factory_js_2.modelProviderFamily)(id) === (0, factory_js_2.modelProviderFamily)(runtimeConfig.model ?? resolved.model));
945
+ const suggested = await (0, model_selector_js_1.selectModel)(ctx.root, input, availableModelIds);
946
+ if (suggested && suggested !== runtimeConfig.model) {
947
+ console.log(chalk_1.default.hex('#4e3d30')(` Using ${suggested} (selected by competence history)\n`));
948
+ runtimeConfig.model = suggested;
949
+ runtimeConfig.baseUrl = undefined;
950
+ runtimeConfig.apiKey = undefined;
951
+ }
952
+ }
953
+ catch {
954
+ // Competence selection is best-effort; never block the user
955
+ }
956
+ }
862
957
  let result;
863
958
  try {
864
959
  const currentProvider = buildProvider(display);
@@ -873,6 +968,11 @@ async function main() {
873
968
  context: ctx, permissions, display,
874
969
  initialHistory: activeChatHistory,
875
970
  maxTurns: resolved.maxTurns,
971
+ confirmFn: async (msg) => new Promise(res => {
972
+ rl.question(`\\n⚠️ ${msg} [y/N] `, a => {
973
+ res(a.trim().toLowerCase() === 'y' || a.trim().toLowerCase() === 'yes');
974
+ });
975
+ }),
876
976
  spawnConfig: {
877
977
  apiKey: runtimeConfig.apiKey,
878
978
  baseUrl: runtimeConfig.baseUrl ?? undefined,
@@ -891,6 +991,11 @@ async function main() {
891
991
  context: ctx, permissions, display,
892
992
  initialHistory: activeChatHistory,
893
993
  maxTurns: resolved.maxTurns,
994
+ confirmFn: async (msg) => new Promise(res => {
995
+ rl.question(`\\n⚠️ ${msg} [y/N] `, a => {
996
+ res(a.trim().toLowerCase() === 'y' || a.trim().toLowerCase() === 'yes');
997
+ });
998
+ }),
894
999
  spawnConfig: {
895
1000
  apiKey: runtimeConfig.apiKey,
896
1001
  baseUrl: runtimeConfig.baseUrl ?? undefined,
@@ -902,6 +1007,10 @@ async function main() {
902
1007
  catch (err) {
903
1008
  const msg = err instanceof Error ? (err.stack || err.message) : String(err);
904
1009
  console.error(chalk_1.default.hex('#b15439')(`\n ✗ Unhandled error: ${msg}\n`));
1010
+ // Suggest :provider on auth errors
1011
+ if (/\b(401|403|unauthorized|invalid.*api.?key|authentication)\b/i.test(msg)) {
1012
+ console.error(chalk_1.default.hex('#cc785c')(' 💡 Run :provider to reconfigure your API key\n'));
1013
+ }
905
1014
  ask();
906
1015
  return;
907
1016
  }
@@ -958,6 +1067,7 @@ function trySetModel(c, newModel) {
958
1067
  try {
959
1068
  const test = buildProvider(c.display);
960
1069
  c.providerConfig.model = newModel;
1070
+ userSetModel = true; // user explicitly chose — alternator must not override
961
1071
  console.log(chalk_1.default.hex('#5a9e6e')(` ✓ Switched to ${test.name} · ${newModel}`));
962
1072
  return { ok: true };
963
1073
  }
@@ -971,7 +1081,7 @@ function trySetModel(c, newModel) {
971
1081
  * Interactive model selector — shows all models grouped by provider,
972
1082
  * lets the user pick by number or type a custom model ID.
973
1083
  */
974
- function showModelSelector(c) {
1084
+ async function showModelSelector(c) {
975
1085
  const allModels = (0, factory_js_1.getAllModels)();
976
1086
  // Build flat numbered list grouped by provider
977
1087
  const entries = [];
@@ -993,28 +1103,31 @@ function showModelSelector(c) {
993
1103
  }
994
1104
  console.log(chalk_1.default.hex('#4e3d30')(`\n Current: ${runtimeConfig.model}`));
995
1105
  console.log(chalk_1.default.hex('#4e3d30')(' Type a number, model ID, or press Enter to cancel:\n'));
996
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
997
- rl.question(chalk_1.default.hex('#cc785c')(' ▸ '), (answer) => {
998
- const choice = answer.trim();
999
- rl.close();
1000
- if (!choice) {
1001
- console.log(chalk_1.default.hex('#4e3d30')(' Cancelled.\n'));
1002
- return;
1003
- }
1004
- // Try as a number
1005
- const num = parseInt(choice, 10);
1006
- if (!isNaN(num) && num >= 1 && num <= entries.length) {
1007
- const selected = entries[num - 1];
1008
- if (selected.id) {
1009
- trySetModel(c, selected.id);
1106
+ return new Promise(resolve => {
1107
+ c.rl.question(chalk_1.default.hex('#cc785c')(' ▸ '), (answer) => {
1108
+ const choice = answer.trim();
1109
+ if (!choice) {
1110
+ console.log(chalk_1.default.hex('#4e3d30')(' Cancelled.\n'));
1111
+ resolve();
1112
+ return;
1010
1113
  }
1011
- else {
1012
- console.log(chalk_1.default.hex('#b15439')(' ✗ That\'s a section header, pick a model number.'));
1114
+ // Try as a number
1115
+ const num = parseInt(choice, 10);
1116
+ if (!isNaN(num) && num >= 1 && num <= entries.length) {
1117
+ const selected = entries[num - 1];
1118
+ if (selected.id) {
1119
+ trySetModel(c, selected.id);
1120
+ }
1121
+ else {
1122
+ console.log(chalk_1.default.hex('#b15439')(' ✗ That\'s a section header, pick a model number.'));
1123
+ }
1124
+ resolve();
1125
+ return;
1013
1126
  }
1014
- return;
1015
- }
1016
- // Treat as a raw model ID
1017
- trySetModel(c, choice);
1127
+ // Treat as a raw model ID
1128
+ trySetModel(c, choice);
1129
+ resolve();
1130
+ });
1018
1131
  });
1019
1132
  }
1020
1133
  async function handleReplCommand(input, c) {
@@ -1037,6 +1150,7 @@ async function handleReplCommand(input, c) {
1037
1150
  ' :delete <id> Delete a saved session',
1038
1151
  '',
1039
1152
  ' ── Model / API ──────────────────────────────────',
1153
+ ' :provider Provider setup wizard (configure provider, model, API key)',
1040
1154
  ' :model Interactive model selector',
1041
1155
  ' :model <id> Switch to a specific model',
1042
1156
  ' :models List all available models',
@@ -1230,6 +1344,24 @@ async function handleReplCommand(input, c) {
1230
1344
  }
1231
1345
  return { handled: true };
1232
1346
  }
1347
+ // ── Provider wizard command ────────────────────────────────────────────────
1348
+ if (input === ':provider' || input === '/provider') {
1349
+ const cfg = await (0, provider_wizard_js_1.runProviderWizard)(c.rl);
1350
+ if (cfg) {
1351
+ // Update current session's provider without restart
1352
+ runtimeConfig.model = cfg.model;
1353
+ runtimeConfig.baseUrl = cfg.baseUrl;
1354
+ runtimeConfig.apiKey = cfg.apiKey;
1355
+ c.providerConfig.model = cfg.model;
1356
+ c.providerConfig.baseUrl = cfg.baseUrl;
1357
+ c.providerConfig.apiKey = cfg.apiKey;
1358
+ // Keep resolved in sync
1359
+ resolved.model = cfg.model;
1360
+ resolved.baseUrl = cfg.baseUrl;
1361
+ console.log(chalk_1.default.hex('#5a9e6e')(` ✓ Now using ${cfg.provider} · ${cfg.model}`));
1362
+ }
1363
+ return { handled: true };
1364
+ }
1233
1365
  if (input === ':models') {
1234
1366
  const allModels = (0, factory_js_1.getAllModels)();
1235
1367
  const byProvider = allModels.reduce((acc, m) => {
@@ -1246,7 +1378,7 @@ async function handleReplCommand(input, c) {
1246
1378
  return { handled: true };
1247
1379
  }
1248
1380
  if (input === ':model' || input === '/model') {
1249
- showModelSelector(c);
1381
+ await showModelSelector(c);
1250
1382
  return { handled: true };
1251
1383
  }
1252
1384
  if (input.startsWith(':model ') || input.startsWith('/model ')) {
@@ -1644,6 +1776,7 @@ ${chalk_1.default.hex('#cc785c').bold(' aura')} ${chalk_1.default.hex('#8a7768'
1644
1776
  --resume [id] Resume latest session, or a specific session by ID
1645
1777
  --chat-id <id> Attach to a specific chat ID (creates if missing)
1646
1778
  --list-sessions List all saved sessions for this project
1779
+ --setup Run the provider setup wizard before entering REPL
1647
1780
  --no-setup Skip the first-run setup wizard
1648
1781
  --reset-setup Wipe saved config and re-run the setup wizard
1649
1782
  --orchestrate Force multi-agent orchestration mode