@raolin2025/claude-code-node 2.6.16 → 2.6.18

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": "@raolin2025/claude-code-node",
3
- "version": "2.6.16",
3
+ "version": "2.6.18",
4
4
  "description": "Node.js AI Code Agent CLI - Zero dependencies, pure JavaScript, security hardened, multi-channel notifications, Telegram & QQ Bot remote programming, rich media upload, multi-account management",
5
5
  "type": "module",
6
6
  "main": "src/core/index.js",
@@ -118,7 +118,9 @@ export class TelegramBotClient {
118
118
  const body = {
119
119
  chat_id: chatId,
120
120
  text: text.slice(0, 4096), // Telegram 消息最大 4096 字符
121
- parse_mode: parseMode || 'HTML',
121
+ // parseMode: null 表示降级为纯文本(去掉 parse_mode 字段);
122
+ // 否则默认 HTML,或用显式指定的 parseMode。
123
+ ...(parseMode === null ? {} : { parse_mode: parseMode || 'HTML' }),
122
124
  disable_notification: silent || false,
123
125
  disable_web_page_preview: disableWebPreview ?? true,
124
126
  }
@@ -139,9 +141,9 @@ export class TelegramBotClient {
139
141
  await new Promise(r => setTimeout(r, retryAfter * 1000))
140
142
  return this.sendMessage(chatId, text, options)
141
143
  }
142
- // 400 可能是消息太长或格式问题 — 降级为纯文本
144
+ // 400 可能是消息太长或格式问题 — 降级为纯文本(parseMode: null 去掉 parse_mode)
143
145
  if (data.error_code === 400 && parseMode) {
144
- return this.sendMessage(chatId, text, { ...options, parseMode: undefined })
146
+ return this.sendMessage(chatId, text, { ...options, parseMode: null })
145
147
  }
146
148
  throw new Error(`Telegram API ${data.error_code}: ${data.description?.slice(0, 200) || 'unknown'}`)
147
149
  }
package/src/core/cli.js CHANGED
@@ -601,6 +601,8 @@ const systemPrompt = cliArgs.systemPrompt || DEFAULT_SYSTEM_PROMPT
601
601
  let pendingConfirm = null
602
602
  // 最近一次 /models 拉取的模型列表(供 /model <编号> 选择)
603
603
  let modelList = []
604
+ // /models 从 Telegram 发出后,等待用户回复编号/名字来选择模型
605
+ let pendingModelSelect = false
604
606
 
605
607
  // 处理输入行
606
608
  // source: 'cli' 来自终端输入, 'telegram' 来自 Telegram
@@ -635,7 +637,31 @@ const systemPrompt = cliArgs.systemPrompt || DEFAULT_SYSTEM_PROMPT
635
637
  return
636
638
  }
637
639
 
640
+ // /models 从 Telegram 发出后,用户回复编号或名字来选择模型
641
+ if (source === 'telegram' && pendingModelSelect && !trimmed.startsWith('/')) {
642
+ const num = parseInt(trimmed, 10)
643
+ let selected = ''
644
+ if (!isNaN(num) && num >= 1 && num <= modelList.length) {
645
+ selected = modelList[num - 1]
646
+ } else if (modelList.includes(trimmed)) {
647
+ selected = trimmed
648
+ }
649
+ // 无论是否是有效选择,都结束"等待选择"状态
650
+ pendingModelSelect = false
651
+ if (selected) {
652
+ engine.config.model = selected
653
+ console.log(`Model → ${selected}`)
654
+ if (tgListener?.bot) {
655
+ await sendTelegram(`✅ 已切换模型 → ${selected}`, tgChatId || null).catch(() => {})
656
+ }
657
+ return
658
+ }
659
+ // 不是有效选择 → 当作普通消息继续处理
660
+ }
661
+
638
662
  if (trimmed.startsWith('/')) {
663
+ // 用户输入了命令,取消可能存在的"等待模型选择"状态
664
+ pendingModelSelect = false
639
665
  // 来自 Telegram 的命令:捕获 console 输出并回发到 Telegram
640
666
  const isTgCmd = source === 'telegram' && tgListener?.bot
641
667
  let tgOut = ''
@@ -694,9 +720,10 @@ const systemPrompt = cliArgs.systemPrompt || DEFAULT_SYSTEM_PROMPT
694
720
  modelList.forEach((id, i) => {
695
721
  console.log(` ${(i + 1).toString().padStart(2)}. ${id}`)
696
722
  })
697
- // 来自 Telegram:直接列出,不等待 CLI 交互(用 /model <名字或编号> 切换)
723
+ // 来自 Telegram:直接列出,不等待 CLI 交互(用 /model 名字或编号 切换)
698
724
  if (source === 'telegram') {
699
- console.log('\nℹ️ 用 /model <名字或编号> 切换模型')
725
+ console.log('\nℹ️ 直接回复编号或模型名即可切换')
726
+ pendingModelSelect = true // 等待用户回复编号/名字来选择模型
700
727
  break
701
728
  }
702
729
  console.log('\nType a number to select, or model name directly:')