jinzd-ai-cli 0.1.83 → 0.1.84
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/CLAUDE.md +55 -12
- package/dist/{chunk-F24DAC6L.js → chunk-L2PQET5S.js} +1 -1
- package/dist/{chunk-VLVLY5YV.js → chunk-YHB3S2KS.js} +1 -1
- package/dist/index.js +4 -4
- package/dist/{run-tests-QYSZ27IZ.js → run-tests-V2VE7ST5.js} +1 -1
- package/dist/{server-ZFMNC6PH.js → server-XWSMOXVH.js} +3 -3
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 项目简介
|
|
4
4
|
|
|
5
|
-
一个跨平台的 REPL 风格 AI 对话工具,支持多个主流 AI 提供商(OpenAI、Claude、Gemini、DeepSeek、智谱清言、Kimi),
|
|
5
|
+
一个跨平台的 REPL 风格 AI 对话工具,支持多个主流 AI 提供商(OpenAI、Claude、Gemini、DeepSeek、智谱清言、Kimi、OpenRouter),
|
|
6
6
|
带有 **AI 工具调用(Agentic)** 能力,支持执行 bash 命令、读写文件、运行交互式程序、流式生成大文档。
|
|
7
7
|
代理支持(`proxy` 配置字段 + 环境变量),Gemini 完整支持(2.5 Pro/Flash,array items schema 修复)。
|
|
8
8
|
**MCP 协议支持**:可接入外部 MCP 服务器,自动发现并注册工具,无缝融入 agentic 循环。
|
|
@@ -32,6 +32,7 @@ src/
|
|
|
32
32
|
│ ├── claude.ts # Anthropic SDK provider
|
|
33
33
|
│ ├── gemini.ts # Google Generative AI provider(role: assistant → model)
|
|
34
34
|
│ ├── openai.ts # OpenAI provider(GPT-5.4/5/4.1/4o/o3/o4-mini)
|
|
35
|
+
│ ├── openrouter.ts # OpenRouter provider(多模型聚合,16 个热门模型)
|
|
35
36
|
│ ├── deepseek.ts / zhipu.ts / kimi.ts # 继承 OpenAICompatibleProvider;deepseek/kimi 覆写 chatWithTools 实现虚假声明检测
|
|
36
37
|
├── config/
|
|
37
38
|
│ ├── schema.ts # Zod schema(含 timeouts / customBaseUrls / defaultModels)
|
|
@@ -165,6 +166,7 @@ AICLI_API_KEY_GEMINI Gemini API Key
|
|
|
165
166
|
AICLI_API_KEY_DEEPSEEK DeepSeek API Key
|
|
166
167
|
AICLI_API_KEY_ZHIPU 智谱 API Key
|
|
167
168
|
AICLI_API_KEY_KIMI Kimi API Key
|
|
169
|
+
AICLI_API_KEY_OPENROUTER OpenRouter API Key
|
|
168
170
|
AICLI_API_KEY_GOOGLESEARCH Google Custom Search API Key
|
|
169
171
|
AICLI_GOOGLE_CX Google Search Engine ID (cx)
|
|
170
172
|
AICLI_PROVIDER 默认 Provider ID
|
|
@@ -350,6 +352,44 @@ const stdinLines = Array.isArray(rawStdin) ? rawStdin.map(String)
|
|
|
350
352
|
- [x] **web_fetch DNS 解析时 SSRF 防护**(v0.1.25):新增 `resolveAndCheck()` 函数,用 `dns.promises.lookup()` 预解析域名,检查结果 IP 是否为私有地址。初始 URL 和 redirect 目标均校验。
|
|
351
353
|
- [ ] **`persistentCwd` 全局状态**:bash 工具的当前工作目录是模块级全局变量,多 session 并发时可能串扰。现阶段单 session REPL 无影响,GUI 多会话扩展时需重构为 per-session 状态。
|
|
352
354
|
|
|
355
|
+
## 本轮开发完成记录(2026-03-16,v0.1.82 → v0.1.83)
|
|
356
|
+
|
|
357
|
+
### 新增功能:OpenRouter 内置 Provider
|
|
358
|
+
|
|
359
|
+
**背景**:OpenRouter 是多模型聚合 API 平台,提供统一的 OpenAI 兼容接口访问数百个模型。用户可通过单个 API Key 使用来自 Anthropic、OpenAI、Google、Meta、DeepSeek、Qwen、Mistral 等厂商的模型。
|
|
360
|
+
|
|
361
|
+
**实现**:继承 `OpenAICompatibleProvider`,无需覆写任何方法(API 完全兼容)。
|
|
362
|
+
|
|
363
|
+
| 文件 | 变更类型 | 说明 |
|
|
364
|
+
|------|---------|------|
|
|
365
|
+
| `src/providers/openrouter.ts` | **新增** | OpenRouterProvider 类,16 个热门模型 |
|
|
366
|
+
| `src/providers/registry.ts` | 修改 | BUILT_IN_PROVIDERS 新增 OpenRouterProvider |
|
|
367
|
+
| `src/config/env-loader.ts` | 修改 | ENV_KEY_MAP 新增 `openrouter → AICLI_API_KEY_OPENROUTER` |
|
|
368
|
+
| `src/repl/setup-wizard.ts` | 修改 | PROVIDERS 列表新增 OpenRouter |
|
|
369
|
+
| `src/core/constants.ts` | 修改 | VERSION 0.1.82 → 0.1.83 |
|
|
370
|
+
| `package.json` | 修改 | version 0.1.82 → 0.1.83 |
|
|
371
|
+
|
|
372
|
+
**内置模型列表(16 个)**:
|
|
373
|
+
- Anthropic:Claude Opus 4 / Sonnet 4 / Haiku 4
|
|
374
|
+
- OpenAI:GPT-5.4 / GPT-4o / GPT-4o Mini
|
|
375
|
+
- Google:Gemini 2.5 Pro / Flash
|
|
376
|
+
- Meta:Llama 4 Maverick / Scout
|
|
377
|
+
- DeepSeek:V3 0324 / R1
|
|
378
|
+
- Qwen:Qwen3 Coder / Qwen 2.5 72B
|
|
379
|
+
- Mistral:Large / Small 3.1 24B
|
|
380
|
+
|
|
381
|
+
**Web UI 无需修改**:Web UI 采用动态注册架构,provider 列表通过 WebSocket S2C_Status 从后端 ProviderRegistry 动态获取,自动支持新 Provider。
|
|
382
|
+
|
|
383
|
+
**同步更新 CLAUDE.md**:项目简介、项目结构、环境变量、Web UI 路线图(P0 全部标记已完成)。
|
|
384
|
+
|
|
385
|
+
### 版本与收尾
|
|
386
|
+
- `src/core/constants.ts`:VERSION `0.1.82` → `0.1.83`
|
|
387
|
+
- `package.json`:version 同步
|
|
388
|
+
- 构建验证:`npm run build` 零错误(ESM + CJS 双产物)
|
|
389
|
+
- 发布:`npm publish` → `jinzd-ai-cli@0.1.83`
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
353
393
|
## 本轮开发完成记录(2026-03-10,v0.1.57 → v0.1.58)
|
|
354
394
|
|
|
355
395
|
### 代码质量修复:19 个低危问题修复 + 代码重构
|
|
@@ -1860,7 +1900,7 @@ const stdinLines = Array.isArray(rawStdin) ? rawStdin.map(String)
|
|
|
1860
1900
|
|
|
1861
1901
|
> 目标:将 `aicli web` 从"可用的聊天界面"升级为功能完备、体验出色的 AI 代码助手 Web 端。
|
|
1862
1902
|
|
|
1863
|
-
### 当前 Web UI 已实现功能(v0.1.
|
|
1903
|
+
### 当前 Web UI 已实现功能(v0.1.82 基线)
|
|
1864
1904
|
|
|
1865
1905
|
- 实时流式聊天(WebSocket)
|
|
1866
1906
|
- 完整 Agentic 循环(25 轮工具调用 + 流式工具调用)
|
|
@@ -1871,27 +1911,30 @@ const stdinLines = Array.isArray(rawStdin) ? rawStdin.map(String)
|
|
|
1871
1911
|
- Plan Mode 只读规划
|
|
1872
1912
|
- Markdown 渲染 + 代码高亮(marked.js + highlight.js)
|
|
1873
1913
|
- 代码块复制按钮
|
|
1874
|
-
- 图片上传协议支持(C2S `images` 字段)
|
|
1875
1914
|
- 用户纠偏(interjection)— 处理中可发送纠正指令
|
|
1876
|
-
-
|
|
1915
|
+
- Session 持久化与管理(侧边栏列表、新建/切换/恢复/删除会话)
|
|
1916
|
+
- `@文件` 引用(`@` 触发文件选择下拉、目录遍历、服务端文件读取 API)
|
|
1917
|
+
- 图片拖拽/粘贴上传(D&D + Ctrl+V + 预览缩略图 + 10MB 限制)
|
|
1918
|
+
- 工具卡片折叠(safe 默认折叠、write/destructive 展开、可手动 toggle)
|
|
1919
|
+
- /clear /compact /think /plan /status /provider /model /cost /session /help 命令
|
|
1877
1920
|
|
|
1878
|
-
### P0 —
|
|
1921
|
+
### P0 — 最痛问题(全部已完成 ✅)
|
|
1879
1922
|
|
|
1880
1923
|
| # | 功能 | 状态 | 说明 |
|
|
1881
1924
|
|---|------|------|------|
|
|
1882
|
-
| P0-1 | **Session 持久化与管理** | [
|
|
1883
|
-
| P0-2 | **`@文件` 引用** | [
|
|
1884
|
-
| P0-3 | **图片拖拽/粘贴上传** | [
|
|
1885
|
-
| P0-4 | **工具卡片折叠** | [
|
|
1886
|
-
| P0-5 | **`/help` 命令** | [
|
|
1925
|
+
| P0-1 | **Session 持久化与管理** | [x] | 侧边栏会话列表 + 新建/切换/恢复/删除 + JSON 持久化 |
|
|
1926
|
+
| P0-2 | **`@文件` 引用** | [x] | `@` 触发文件选择下拉 + `/api/file-content` 读取 + 路径穿越安全检查 |
|
|
1927
|
+
| P0-3 | **图片拖拽/粘贴上传** | [x] | D&D + Ctrl+V 粘贴 + 预览缩略图 + base64 传输 + 10MB 限制 |
|
|
1928
|
+
| P0-4 | **工具卡片折叠** | [x] | safe 默认折叠、write/destructive 展开、手动 toggle、结果 badge |
|
|
1929
|
+
| P0-5 | **`/help` 命令** | [x] | 显示所有支持的 Web 命令及用法说明 |
|
|
1887
1930
|
|
|
1888
1931
|
### P1 — 明显提升体验
|
|
1889
1932
|
|
|
1890
1933
|
| # | 功能 | 状态 | 说明 |
|
|
1891
1934
|
|---|------|------|------|
|
|
1892
|
-
| P1-1 |
|
|
1935
|
+
| P1-1 | **侧边栏增强** | [x] | Session 列表已实现;待增加 Skills + MCP 工具列表 + 搜索 |
|
|
1893
1936
|
| P1-2 | **Diff 渲染增强** | [ ] | confirm 对话框中的 diff 从纯文本升级为语法高亮的 diff 视图(绿/红增删行) |
|
|
1894
|
-
| P1-3 | **更多命令支持** | [
|
|
1937
|
+
| P1-3 | **更多命令支持** | [~] | `/cost`、`/session list\|load\|delete` 已实现;待增加 `/undo`、`/export [md\|json]`、`/tools`、`/memory` |
|
|
1895
1938
|
| P1-4 | **键盘快捷键** | [ ] | `Ctrl+L` 清屏、`Ctrl+K` 清空输入、`Esc` 停止生成、`↑` 历史消息回溯 |
|
|
1896
1939
|
| P1-5 | **Markdown 导出** | [ ] | 一键导出当前对话为 `.md` 文件下载 |
|
|
1897
1940
|
| P1-6 | **断线重连恢复** | [ ] | WebSocket 重连后恢复 session 状态(当前重连=全丢);心跳 ping/pong |
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
theme,
|
|
36
36
|
truncateOutput,
|
|
37
37
|
undoStack
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-L2PQET5S.js";
|
|
39
39
|
import {
|
|
40
40
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
41
41
|
AUTHOR,
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
REPO_URL,
|
|
56
56
|
SKILLS_DIR_NAME,
|
|
57
57
|
VERSION
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-YHB3S2KS.js";
|
|
59
59
|
|
|
60
60
|
// src/index.ts
|
|
61
61
|
import { program } from "commander";
|
|
@@ -1904,7 +1904,7 @@ ${hint}` : "")
|
|
|
1904
1904
|
description: "Run project tests and show structured report",
|
|
1905
1905
|
usage: "/test [command|filter]",
|
|
1906
1906
|
async execute(args, _ctx) {
|
|
1907
|
-
const { executeTests } = await import("./run-tests-
|
|
1907
|
+
const { executeTests } = await import("./run-tests-V2VE7ST5.js");
|
|
1908
1908
|
const argStr = args.join(" ").trim();
|
|
1909
1909
|
let testArgs = {};
|
|
1910
1910
|
if (argStr) {
|
|
@@ -5292,7 +5292,7 @@ program.command("web").description("Start Web UI server with browser-based chat
|
|
|
5292
5292
|
console.error("Error: Invalid port number. Must be between 1 and 65535.");
|
|
5293
5293
|
process.exit(1);
|
|
5294
5294
|
}
|
|
5295
|
-
const { startWebServer } = await import("./server-
|
|
5295
|
+
const { startWebServer } = await import("./server-XWSMOXVH.js");
|
|
5296
5296
|
await startWebServer({ port, host: options.host });
|
|
5297
5297
|
});
|
|
5298
5298
|
program.command("sessions").description("List recent conversation sessions").action(async () => {
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
setupProxy,
|
|
24
24
|
spawnAgentContext,
|
|
25
25
|
truncateOutput
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-L2PQET5S.js";
|
|
27
27
|
import {
|
|
28
28
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
29
29
|
CONTEXT_FILE_CANDIDATES,
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
SKILLS_DIR_NAME,
|
|
37
37
|
VERSION,
|
|
38
38
|
__require
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-YHB3S2KS.js";
|
|
40
40
|
|
|
41
41
|
// src/web/server.ts
|
|
42
42
|
import express from "express";
|
|
@@ -1322,7 +1322,7 @@ async function startWebServer(options = {}) {
|
|
|
1322
1322
|
process.on("SIGINT", () => {
|
|
1323
1323
|
console.log("\n Shutting down...");
|
|
1324
1324
|
if (activeHandler) activeHandler.onDisconnect();
|
|
1325
|
-
if (mcpManager) mcpManager.
|
|
1325
|
+
if (mcpManager) mcpManager.closeAll();
|
|
1326
1326
|
wss.close();
|
|
1327
1327
|
server.close();
|
|
1328
1328
|
process.exit(0);
|