cogeai 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/coge.js CHANGED
@@ -3,7 +3,7 @@
3
3
  import readline from "readline";
4
4
  import { execSync } from "child_process";
5
5
  import { loadConfig, writeDefaultConfigIfMissing, writeConfig, getConfigPath, defaultConfig } from "./lib/config.js";
6
- import { getProvider, getConfiguredProviders, getDefaultModels, PROVIDER_MODELS, PROVIDER_FETCH_MODELS, PROVIDER_PAGE_URLS, getAvailableModels } from "./providers/index.js";
6
+ import { getProvider, getConfiguredProviders, getDefaultModels, PROVIDER_MODELS, PROVIDER_FETCH_MODELS, PROVIDER_PAGE_URLS, getAvailableModels, PROVIDER_ENV_KEYS } from "./providers/index.js";
7
7
  import { loadBanditState, saveBanditState, updateArm, pickProviders } from "./lib/bandit.js";
8
8
  import { recordAction, loadStats, formatStats } from "./lib/stats.js";
9
9
  import { normalizeAvailableEntry, sortByCategory, isBlacklisted } from "./lib/model-classify.js";
@@ -399,16 +399,23 @@ Providers: ${PROVIDERS.join(", ")}`);
399
399
  const { selected, banditArms } = pickProviders(config, configured, defaultModels, 3);
400
400
  if (debug && banditArms) console.log(`Bandit arms: ${banditArms.join(", ")}`);
401
401
 
402
+ if (selected.length === 0) {
403
+ const envVars = [...new Set(Object.values(PROVIDER_ENV_KEYS).filter(Boolean))].sort().join(", ");
404
+ throw new Error(
405
+ `No provider configured. Set one of: ${envVars} — or run 'coge configure'.`
406
+ );
407
+ }
408
+
402
409
  let command;
403
410
  let winnerArm;
404
411
  const startTime = Date.now();
405
412
 
406
- if (selected.length <= 1) {
407
- // 0 or 1 configured — use the user's configured provider directly
408
- const provider = getProvider(config);
413
+ if (selected.length === 1) {
414
+ const providerName = selected[0];
415
+ const provider = getProvider({ ...config, provider: providerName });
409
416
  command = await provider.generateContent(systemPrompt, promptText);
410
- const model = config.providers?.[config.provider]?.default ?? defaultModels[config.provider] ?? config.model ?? "unknown";
411
- winnerArm = `${config.provider}:${model}`;
417
+ const model = config.providers?.[providerName]?.default ?? defaultModels[providerName] ?? config.model ?? "unknown";
418
+ winnerArm = `${providerName}:${model}`;
412
419
  } else {
413
420
  if (debug) {
414
421
  console.log(`Racing providers: ${selected.join(", ")}`);
@@ -444,6 +451,11 @@ Providers: ${PROVIDERS.join(", ")}`);
444
451
  }
445
452
 
446
453
  process.stdout.write(`\n${command}\n`);
454
+
455
+ if (!process.stdin.isTTY) {
456
+ process.exit(0);
457
+ }
458
+
447
459
  process.stdout.write(`\x1b[2m [Enter] Execute [c] Copy [Esc] Cancel\x1b[0m\n`);
448
460
 
449
461
  process.stdin.setRawMode(true);
@@ -473,7 +485,16 @@ Providers: ${PROVIDERS.join(", ")}`);
473
485
  }
474
486
 
475
487
  main().catch((err) => {
476
- console.error("Error:", err);
488
+ const msg = err?.message ?? String(err);
489
+ const isConfigError =
490
+ msg.includes("No provider configured") ||
491
+ msg.includes("not set") ||
492
+ (msg.includes("requires ") && msg.includes("export "));
493
+ if (isConfigError) {
494
+ console.error("coge:", msg);
495
+ } else {
496
+ console.error("Error:", err);
497
+ }
477
498
  process.exit(1);
478
499
  });
479
500
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cogeai",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "description": "AI-powered command generator — describe what you want, get a shell command back",
6
6
  "main": "coge.js",
7
7
  "bin": {
@@ -96,7 +96,8 @@ export function getAvailableModels(providerName) {
96
96
  return defaultConfig.providers[providerName]?.available ?? [];
97
97
  }
98
98
 
99
- const PROVIDER_ENV_KEYS = {
99
+ /** Env var name per provider (null = no key, e.g. ollama). */
100
+ export const PROVIDER_ENV_KEYS = {
100
101
  gemini: "COGE_GEMINI_API_KEY",
101
102
  openrouter: "COGE_OPENROUTER_API_KEY",
102
103
  openai: "COGE_OPENAI_API_KEY",
@@ -137,6 +138,16 @@ export function getProvider(config) {
137
138
  }
138
139
  const envKey = PROVIDER_ENV_KEYS[name];
139
140
  const apiKey = envKey ? process.env[envKey] : undefined;
141
+ if (envKey && !apiKey) {
142
+ const configured = getConfiguredProviders();
143
+ const hint =
144
+ configured.length > 0
145
+ ? ` Configured providers: ${configured.join(", ")}. Run 'coge configure' to switch.`
146
+ : ` Run 'coge configure' to set up a provider.`;
147
+ throw new Error(
148
+ `Provider "${name}" requires ${envKey}. Set it: export ${envKey}=your-key.${hint}`
149
+ );
150
+ }
140
151
  const model = config.model ?? config.models?.[name];
141
152
  return factory(apiKey, model);
142
153
  }