nemoris 0.1.17 → 0.1.19

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nemoris",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "type": "module",
5
5
  "description": "Personal AI agent runtime — persistent memory, delivery guarantees, task contracts, self-healing. Local-first, no cloud.",
6
6
  "license": "MIT",
@@ -20,12 +20,17 @@ export function resolveInstallDir({ env = process.env, cwd: _cwd = process.cwd()
20
20
  }
21
21
  return resolved;
22
22
  }
23
- // Dev mode: when CWD is the source repo, use it as install dir
23
+ // Default data dir prefer this if it exists with actual config
24
+ const defaultDataDir = path.join(os.homedir(), ".nemoris-data");
25
+ if (fs.existsSync(path.join(defaultDataDir, "config"))) {
26
+ return defaultDataDir;
27
+ }
28
+ // Dev mode: when CWD is the source repo and no ~/.nemoris-data config exists
24
29
  if (_cwd && fs.existsSync(path.join(_cwd, "package.json")) &&
25
30
  fs.existsSync(path.join(_cwd, "src", "cli.js"))) {
26
31
  return _cwd;
27
32
  }
28
- return path.join(os.homedir(), ".nemoris-data");
33
+ return defaultDataDir;
29
34
  }
30
35
 
31
36
  export function resolveAuthProfilesPath({ env = process.env, cwd = process.cwd() } = {}) {
package/src/cli-main.js CHANGED
@@ -2779,8 +2779,9 @@ export async function main(argv = process.argv) {
2779
2779
  // Re-read the installed package.json to get the actual new version
2780
2780
  let newVersion;
2781
2781
  try {
2782
- const globalPkg = execSync("node -e \"process.stdout.write(require('nemoris/package.json').version)\"", { encoding: "utf8", timeout: 5_000 }).trim();
2783
- newVersion = globalPkg || null;
2782
+ const globalRoot = execSync("npm root -g", { encoding: "utf8", timeout: 5_000 }).trim();
2783
+ const installedPkg = JSON.parse(fs.readFileSync(path.join(globalRoot, "nemoris", "package.json"), "utf8"));
2784
+ newVersion = installedPkg.version || null;
2784
2785
  } catch {
2785
2786
  newVersion = null;
2786
2787
  }
@@ -10,18 +10,18 @@ export const PROVIDER_ENV_KEYS = {
10
10
  export const CURATED_MODELS = {
11
11
  anthropic: [
12
12
  {
13
- value: "anthropic/claude-haiku-4-5",
14
- label: "claude-haiku-4-5",
15
- hint: "ctx 200k · fast · cheapest",
13
+ value: "anthropic/claude-sonnet-4.6",
14
+ label: "claude-sonnet-4.6",
15
+ hint: "ctx 200k · balanced · recommended",
16
16
  },
17
17
  {
18
- value: "anthropic/claude-sonnet-4-6",
19
- label: "claude-sonnet-4-6",
20
- hint: "ctx 200k · balanced · recommended",
18
+ value: "anthropic/claude-haiku-4.5",
19
+ label: "claude-haiku-4.5",
20
+ hint: "ctx 200k · fast · cheapest",
21
21
  },
22
22
  {
23
- value: "anthropic/claude-opus-4-6",
24
- label: "claude-opus-4-6",
23
+ value: "anthropic/claude-opus-4.6",
24
+ label: "claude-opus-4.6",
25
25
  hint: "ctx 200k · most capable · expensive",
26
26
  },
27
27
  ],
@@ -50,13 +50,13 @@ export const CURATED_MODELS = {
50
50
  openrouter: [
51
51
  // ── Top picks (most popular on OpenRouter) ──
52
52
  {
53
- value: "openrouter/anthropic/claude-sonnet-4-6",
54
- label: "anthropic/claude-sonnet-4-6",
53
+ value: "openrouter/anthropic/claude-sonnet-4.6",
54
+ label: "anthropic/claude-sonnet-4.6",
55
55
  hint: "ctx 200k · balanced · recommended",
56
56
  },
57
57
  {
58
- value: "openrouter/anthropic/claude-haiku-4-5",
59
- label: "anthropic/claude-haiku-4-5",
58
+ value: "openrouter/anthropic/claude-haiku-4.5",
59
+ label: "anthropic/claude-haiku-4.5",
60
60
  hint: "ctx 200k · fast · cheap",
61
61
  },
62
62
  {
@@ -70,8 +70,8 @@ export const CURATED_MODELS = {
70
70
  hint: "ctx 164k · strong · very cheap",
71
71
  },
72
72
  {
73
- value: "openrouter/anthropic/claude-opus-4-6",
74
- label: "anthropic/claude-opus-4-6",
73
+ value: "openrouter/anthropic/claude-opus-4.6",
74
+ label: "anthropic/claude-opus-4.6",
75
75
  hint: "ctx 200k · most capable · expensive",
76
76
  },
77
77
  // ── More options ──
@@ -59,79 +59,80 @@ const PROVIDER_CONFIGS = {
59
59
  const MODEL_ROLE_ORDER = ["cheap_interactive", "fallback", "manual_bump"];
60
60
  const PROVIDER_MODEL_PRESETS = {
61
61
  anthropic: [
62
- {
63
- key: "haiku",
64
- id: "anthropic/claude-haiku-4-5",
65
- label: "Claude Haiku 4.5",
66
- description: "Fastest and cheapest for interactive work.",
67
- },
68
62
  {
69
63
  key: "sonnet",
70
- id: "anthropic/claude-sonnet-4-6",
64
+ id: "anthropic/claude-sonnet-4.6",
71
65
  label: "Claude Sonnet 4.6",
72
66
  description: "Balanced default for most serious work.",
73
67
  },
68
+ {
69
+ key: "haiku",
70
+ id: "anthropic/claude-haiku-4.5",
71
+ label: "Claude Haiku 4.5",
72
+ description: "Fastest and cheapest for interactive work.",
73
+ },
74
74
  {
75
75
  key: "opus",
76
- id: "anthropic/claude-opus-4-6",
76
+ id: "anthropic/claude-opus-4.6",
77
77
  label: "Claude Opus 4.6",
78
78
  description: "Highest quality, slowest and most expensive.",
79
79
  },
80
80
  ],
81
81
  openrouter: [
82
- // Anthropic via OpenRouter
82
+ // Anthropic via OpenRouter — top picks
83
83
  {
84
84
  key: "sonnet",
85
- id: "openrouter/anthropic/claude-sonnet-4-6",
85
+ id: "openrouter/anthropic/claude-sonnet-4.6",
86
86
  label: "Sonnet 4.6 (Anthropic)",
87
- description: "Strong general-purpose default.",
87
+ description: "Strong balanced default · ctx 200k",
88
88
  group: "Anthropic",
89
89
  },
90
90
  {
91
91
  key: "haiku",
92
- id: "openrouter/anthropic/claude-haiku-4-5",
92
+ id: "openrouter/anthropic/claude-haiku-4.5",
93
93
  label: "Haiku 4.5 (Anthropic)",
94
- description: "Fastest and cheapest Anthropic model.",
94
+ description: "Fastest and cheapest · ctx 200k",
95
95
  group: "Anthropic",
96
96
  },
97
97
  {
98
98
  key: "opus",
99
- id: "openrouter/anthropic/claude-opus-4-6",
99
+ id: "openrouter/anthropic/claude-opus-4.6",
100
100
  label: "Opus 4.6 (Anthropic)",
101
- description: "Highest quality. Use when Sonnet isn't enough.",
101
+ description: "Highest quality · ctx 200k",
102
102
  group: "Anthropic",
103
103
  },
104
- // OpenAI via OpenRouter
105
- {
106
- key: "gpt4o",
107
- id: "openrouter/openai/gpt-4o",
108
- label: "GPT-4o (OpenAI)",
109
- description: "Fast multimodal OpenAI model.",
110
- group: "OpenAI",
111
- },
112
- {
113
- key: "gpt4omini",
114
- id: "openrouter/openai/gpt-4o-mini",
115
- label: "GPT-4o mini (OpenAI)",
116
- description: "Cheapest OpenAI option.",
117
- group: "OpenAI",
118
- },
119
104
  // Google via OpenRouter
120
105
  {
121
- key: "gemini31pro",
122
- id: "openrouter/google/gemini-3.1-pro",
123
- label: "Gemini 3.1 Pro (Google)",
124
- description: "Frontier Google model, strong benchmarks.",
106
+ key: "gemini3flash",
107
+ id: "openrouter/google/gemini-3-flash-preview",
108
+ label: "Gemini 3 Flash (Google)",
109
+ description: "Fast, long context · ctx 1M",
125
110
  group: "Google",
126
111
  },
112
+ // DeepSeek via OpenRouter
113
+ {
114
+ key: "deepseek",
115
+ id: "openrouter/deepseek/deepseek-v3.2",
116
+ label: "DeepSeek V3.2",
117
+ description: "Strong and very cheap · ctx 164k",
118
+ group: "DeepSeek",
119
+ },
127
120
  // Meta via OpenRouter
128
121
  {
129
- key: "llama4scout",
130
- id: "openrouter/meta-llama/llama-4-scout",
131
- label: "Llama 4 Scout (Meta)",
132
- description: "Open-weight Meta model.",
122
+ key: "llama4maverick",
123
+ id: "openrouter/meta-llama/llama-4-maverick",
124
+ label: "Llama 4 Maverick (Meta)",
125
+ description: "Open-weight · ctx 1M · free tier",
133
126
  group: "Meta",
134
127
  },
128
+ // OpenAI via OpenRouter
129
+ {
130
+ key: "gpt4o",
131
+ id: "openrouter/openai/gpt-4o",
132
+ label: "GPT-4o (OpenAI)",
133
+ description: "Fast multimodal · ctx 128k",
134
+ group: "OpenAI",
135
+ },
135
136
  ],
136
137
  openai: [
137
138
  {
@@ -110,14 +110,14 @@ export function routerTemplate({ anthropic = false, openrouter = false, openai =
110
110
  };
111
111
 
112
112
  const anthropicModels = pick("anthropic", [
113
- "anthropic/claude-haiku-4-5",
114
- "anthropic/claude-sonnet-4-6",
115
- "anthropic/claude-opus-4-6",
113
+ "anthropic/claude-sonnet-4.6",
114
+ "anthropic/claude-haiku-4.5",
115
+ "anthropic/claude-opus-4.6",
116
116
  ]);
117
117
  const openrouterModels = pick("openrouter", [
118
- "openrouter/anthropic/claude-haiku-4-5",
119
- "openrouter/anthropic/claude-sonnet-4-6",
120
- "openrouter/anthropic/claude-opus-4-6",
118
+ "openrouter/anthropic/claude-sonnet-4.6",
119
+ "openrouter/anthropic/claude-haiku-4.5",
120
+ "openrouter/anthropic/claude-opus-4.6",
121
121
  ]);
122
122
  const openaiModels = pick("openai", [
123
123
  "openai-codex/gpt-4.1",