nemoris 0.1.13 → 0.1.15

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.13",
3
+ "version": "0.1.15",
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",
@@ -48,31 +48,53 @@ export const CURATED_MODELS = {
48
48
  },
49
49
  ],
50
50
  openrouter: [
51
- {
52
- value: "openrouter/anthropic/claude-haiku-4-5",
53
- label: "anthropic/claude-haiku-4-5",
54
- hint: "ctx 200k · fast · recommended",
55
- },
51
+ // ── Top picks (most popular on OpenRouter) ──
56
52
  {
57
53
  value: "openrouter/anthropic/claude-sonnet-4-6",
58
54
  label: "anthropic/claude-sonnet-4-6",
59
- hint: "ctx 200k · balanced · strong default",
55
+ hint: "ctx 200k · balanced · recommended",
60
56
  },
61
57
  {
62
- value: "openrouter/openai/gpt-4o",
63
- label: "openai/gpt-4o",
64
- hint: "ctx 128k · vision · broad compatibility",
58
+ value: "openrouter/anthropic/claude-haiku-4-5",
59
+ label: "anthropic/claude-haiku-4-5",
60
+ hint: "ctx 200k · fast · cheap",
65
61
  },
66
62
  {
67
- value: "openrouter/google/gemini-2.5-flash",
68
- label: "google/gemini-2.5-flash",
63
+ value: "openrouter/google/gemini-3-flash-preview",
64
+ label: "google/gemini-3-flash-preview",
69
65
  hint: "ctx 1M · fast · long context",
70
66
  },
67
+ {
68
+ value: "openrouter/deepseek/deepseek-v3.2",
69
+ label: "deepseek/deepseek-v3.2",
70
+ hint: "ctx 164k · strong · very cheap",
71
+ },
71
72
  {
72
73
  value: "openrouter/anthropic/claude-opus-4-6",
73
74
  label: "anthropic/claude-opus-4-6",
74
75
  hint: "ctx 200k · most capable · expensive",
75
76
  },
77
+ // ── More options ──
78
+ {
79
+ value: "openrouter/openai/gpt-4o",
80
+ label: "openai/gpt-4o",
81
+ hint: "ctx 128k · vision · multimodal",
82
+ },
83
+ {
84
+ value: "openrouter/mistralai/mistral-large",
85
+ label: "mistralai/mistral-large",
86
+ hint: "ctx 128k · strong · EU provider",
87
+ },
88
+ {
89
+ value: "openrouter/meta-llama/llama-4-maverick",
90
+ label: "meta-llama/llama-4-maverick",
91
+ hint: "ctx 1M · open-weight · free tier",
92
+ },
93
+ {
94
+ value: "openrouter/qwen/qwen3-235b-a22b",
95
+ label: "qwen/qwen3-235b-a22b",
96
+ hint: "ctx 128k · MoE · very cheap",
97
+ },
76
98
  ],
77
99
  };
78
100
 
@@ -28,9 +28,9 @@ export function stripAnsi(str) {
28
28
  return str.replace(/\x1b\[[0-9;]*m/g, "");
29
29
  }
30
30
 
31
- export function buildTelegramToml({ botTokenEnv, pollingMode, webhookUrl, operatorChatId, authorizedChatIds, defaultAgent }) {
31
+ export function buildTelegramToml({ botTokenEnv, pollingMode, webhookUrl, operatorChatId, authorizedChatIds, defaultAgent, botUsername }) {
32
32
  const authIds = (authorizedChatIds || []).map((id) => `"${id}"`).join(", ");
33
- return [
33
+ const lines = [
34
34
  "",
35
35
  "[telegram]",
36
36
  `bot_token_env = "${botTokenEnv}"`,
@@ -39,8 +39,10 @@ export function buildTelegramToml({ botTokenEnv, pollingMode, webhookUrl, operat
39
39
  `operator_chat_id = "${operatorChatId || ""}"`,
40
40
  `authorized_chat_ids = [${authIds}]`,
41
41
  `default_agent = "${defaultAgent}"`,
42
- "",
43
- ].join("\n");
42
+ ];
43
+ if (botUsername) lines.push(`bot_username = "${botUsername}"`);
44
+ lines.push("");
45
+ return lines.join("\n");
44
46
  }
45
47
 
46
48
  export function patchRuntimeToml(installDir, telegramToml) {
@@ -227,6 +229,7 @@ export async function runTelegramPhase({ installDir, agentId, nonInteractive = f
227
229
  patchRuntimeToml(installDir, buildTelegramToml({
228
230
  botTokenEnv, pollingMode: mode === "polling", webhookUrl,
229
231
  operatorChatId: chatId, authorizedChatIds, defaultAgent: agentId,
232
+ botUsername: me.username,
230
233
  }));
231
234
 
232
235
  return { configured: true, verified: false, botUsername: me.username, botToken: token, operatorChatId: chatId };
@@ -323,6 +326,7 @@ export async function runTelegramPhase({ installDir, agentId, nonInteractive = f
323
326
  patchRuntimeToml(installDir, buildTelegramToml({
324
327
  botTokenEnv, pollingMode, webhookUrl,
325
328
  operatorChatId: chatId || "", authorizedChatIds, defaultAgent: agentId,
329
+ botUsername,
326
330
  }));
327
331
 
328
332
  // Wire delivery.toml so the telegram profile is enabled
@@ -332,21 +336,6 @@ export async function runTelegramPhase({ installDir, agentId, nonInteractive = f
332
336
  chatIdPending: !chatId,
333
337
  });
334
338
 
335
- // Persist bot_username to runtime.toml for finish screen / status
336
- if (botUsername) {
337
- const runtimePath = path.join(installDir, "config", "runtime.toml");
338
- try {
339
- let runtime = fs.readFileSync(runtimePath, "utf8");
340
- if (runtime.includes("[telegram]") && !runtime.includes("bot_username")) {
341
- runtime = runtime.replace(
342
- /(\[telegram\][^\[]*)/s,
343
- (section) => section.trimEnd() + `\nbot_username = "${botUsername}"\n`
344
- );
345
- fs.writeFileSync(runtimePath, runtime);
346
- }
347
- } catch { /* non-fatal */ }
348
- }
349
-
350
339
  // Store chat_id in state for later phases (e.g. hatch)
351
340
  const result = { configured: true, verified: false, botUsername, botToken: token, operatorChatId: chatId || "" };
352
341