nemoris 0.1.12 → 0.1.13
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/cli.js +5 -0
- package/src/onboarding/phases/auth.js +20 -3
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -70,6 +70,11 @@ printVersionAndExit();
|
|
|
70
70
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
71
71
|
const parentEnvPath = resolveEnvPath(__dirname);
|
|
72
72
|
loadParentEnv(parentEnvPath);
|
|
73
|
+
// Also load source repo .env as fallback (dev mode: CWD is source, installDir is elsewhere)
|
|
74
|
+
const cwdEnvPath = path.join(process.cwd(), ".env");
|
|
75
|
+
if (cwdEnvPath !== parentEnvPath && fs.existsSync(cwdEnvPath)) {
|
|
76
|
+
loadParentEnv(cwdEnvPath);
|
|
77
|
+
}
|
|
73
78
|
|
|
74
79
|
const { main } = await import("./cli-main.js");
|
|
75
80
|
const exitCode = await main(process.argv);
|
|
@@ -316,9 +316,16 @@ async function buildProviderSelectionOptions(provider, key, { fetchImpl = global
|
|
|
316
316
|
const extra = fetchedModels
|
|
317
317
|
.filter((m) => {
|
|
318
318
|
if (curatedIds.has(m.id)) return false;
|
|
319
|
-
|
|
319
|
+
const rawId = m.id.replace(/^openrouter\//, "").replace(/^openai-codex\//, "").replace(/^anthropic\//, "");
|
|
320
|
+
// For direct provider APIs, only show that provider's models
|
|
321
|
+
if (provider === "anthropic") {
|
|
322
|
+
return rawId.startsWith("claude-");
|
|
323
|
+
}
|
|
324
|
+
if (provider === "openai") {
|
|
325
|
+
return rawId.startsWith("gpt-") || rawId.startsWith("o1") || rawId.startsWith("o3") || rawId.startsWith("o4");
|
|
326
|
+
}
|
|
327
|
+
// For large catalogs (OpenRouter), only show models from known vendors
|
|
320
328
|
if (fetchedModels.length > 50) {
|
|
321
|
-
const rawId = m.id.replace(/^openrouter\//, "").replace(/^openai-codex\//, "").replace(/^anthropic\//, "");
|
|
322
329
|
const vendor = rawId.split("/")[0];
|
|
323
330
|
return KNOWN_VENDORS.has(vendor);
|
|
324
331
|
}
|
|
@@ -380,7 +387,11 @@ async function promptForProviderModels(provider, key, tui, { fetchImpl = globalT
|
|
|
380
387
|
let activeOptions = options;
|
|
381
388
|
const chosen = [];
|
|
382
389
|
const manualOptionValue = "__custom__";
|
|
383
|
-
|
|
390
|
+
// Use first curated model as placeholder for custom entry, not a "new" or extra model
|
|
391
|
+
const defaultModelValue = options.find((item) => {
|
|
392
|
+
const v = String(item.value);
|
|
393
|
+
return !v.startsWith("__") && !v.startsWith("\u2605");
|
|
394
|
+
})?.value || "";
|
|
384
395
|
|
|
385
396
|
console.log(`\n ${cyan(`Choose ${provider === "openrouter" ? "OpenRouter" : provider === "openai" ? "OpenAI" : "Anthropic"} models`)}`);
|
|
386
397
|
console.log(` ${dim("Pick up to three models. The first is your default. The others are fallbacks when the default is slow or unavailable.")}`);
|
|
@@ -743,6 +754,12 @@ export async function runAuthPhase(installDir, options = {}) {
|
|
|
743
754
|
if (validatedKeys.openrouter) {
|
|
744
755
|
envKeys.OPENROUTER_API_KEY = validatedKeys.openrouter;
|
|
745
756
|
}
|
|
757
|
+
// Enable provider mode when any remote provider is configured
|
|
758
|
+
const hasRemoteProvider = !!(envKeys.NEMORIS_ANTHROPIC_API_KEY || envKeys.OPENROUTER_API_KEY || envKeys.NEMORIS_OPENAI_API_KEY);
|
|
759
|
+
if (hasRemoteProvider) {
|
|
760
|
+
envKeys.NEMORIS_ALLOW_PROVIDER_MODE = "1";
|
|
761
|
+
envKeys.NEMORIS_ALLOW_REMOTE_PROVIDER_MODE = "1";
|
|
762
|
+
}
|
|
746
763
|
if (Object.keys(envKeys).length > 0) {
|
|
747
764
|
writeEnvFile(installDir, envKeys);
|
|
748
765
|
}
|