@liguoshuai/pi-web-chat 1.0.1 → 1.5.0
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/CHANGELOG.md +84 -18
- package/bin/pi-web-chat.js +2 -1
- package/package.json +1 -1
- package/public/app.js +831 -70
- package/public/index.html +43 -3
- package/public/style.css +674 -65
- package/server.js +282 -26
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,85 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
## [
|
|
10
|
+
## [1.5.0] - 2026-07-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Idle timeout & concurrency control (内存保护增强)**:
|
|
14
|
+
- 新增 `IDLE_TIMEOUT_MS` 环境变量,可配置浏览器断开后保留 pi RPC 子进程的时间(默认 300000ms = 5 分钟,设为 0 即关闭自动清理)。
|
|
15
|
+
- 新增 `MAX_CONCURRENT_AGENTS` 环境变量,限制并发 pi 代理进程数(默认 0 = 无限制)。超限时新 WebSocket 连接返回 1013 (capacity) 并在控制台警告,防止多标签页把小内存机器挤爆。
|
|
16
|
+
- 新增 `IDLE_DROP_HEAP=1` 环境变量,空闲时尝试调用 `global.gc()` 主动释放 V8 堆,配合 `--expose-gc` 让内存更快回收到 OS,而非被动 swap。
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- `bin/pi-web-chat.js` 启动 server 时加入 `--expose-gc` 标志,支持上述主动内存释放。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## [1.4.2] - 2026-07-26
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- **移动端顶栏常驻与布局优化 (Sticky Topbar & Mobile Layout)**:
|
|
27
|
+
- 顶栏 `.topbar` 设置 `position: sticky; top: 0; flex-shrink: 0; z-index: 20;`,确保在手机端滚动聊天、弹起软键盘或屏高变化时**始终常驻固定在屏幕最上方**,绝不随聊天区域滚动或被挤压。
|
|
28
|
+
- 采用 Dynamic Viewport Height(`100dvh`),解决 iOS Safari 与 Android 移动浏览器地址栏/底部导航栏显示隐藏时的页面抖动与错位。
|
|
29
|
+
- 优化移动端工作目录胶囊(CWD Pill)、模型胶囊(Model Pill)与会话标题的宽度挤压与弹性截断(`text-overflow: ellipsis`),小屏手机下依然精致美观。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## [1.4.1] - 2026-07-26
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- **切换/加载历史会话模型精准显示**:
|
|
37
|
+
- 修复加载历史会话时由于后台进程启动时与 `get_state` 异步竞态导致右上角模型 Pill 显示不准确的问题。
|
|
38
|
+
- REST `/api/session` 接口现在自动从该会话的 JSONL 历史链中精确提取最后使用的模型 (`model`)。
|
|
39
|
+
- 切换会话时,前端能够零延迟(Instant)同步并渲染该会话对应的正确模型,同时支持 `model_select` 事件实时联动。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## [1.4.0] - 2026-07-26
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
- **多端与多浏览器同步协同 (Multi-Device & Multi-Browser Session Sharing)**:
|
|
47
|
+
- **WebSocket 多连接池**:服务端 `PiAgent` 进程升级为多连接池(`Set<WebSocket>`),电脑、手机、平板可同时挂载到同一个正在运行的会话,所有端实时同步接收 AI 流式回答。
|
|
48
|
+
- **多端消息双向广播**:手机端发送 Prompt 或插入指导指令(Steer)时,电脑端无需刷新即可实时呈现用户消息并同步流式输出 AI 答复。
|
|
49
|
+
- **URL 参数关联与一键分享**:选择会话时自动更新浏览器 URL 参数(`?session=...`),分享 URL 或在手机侧边栏选中同个会话即可直接加入同一会话同步协同。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## [1.3.0] - 2026-07-26
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
- **运行时实时插入/拦截指令 (Steer Instructions During Agent Turns)**:
|
|
57
|
+
- AI 正在思考、读取文件或执行命令(`streaming`)时,可以在输入框输入补充或修正要求。
|
|
58
|
+
- 输入框右侧会自动展示 **`🧭 插入指令`** 按钮,按 Enter 或点击按钮可实时将指令发送给 `pi` 代理进程(发送 `steer` 消息)。
|
|
59
|
+
- 聊天界面中插入的指令会展示带 **`🧭 指导指令`** 徽章的突出气泡,`pi` 接收后能在当前轮次中即时调整执行方向。
|
|
60
|
+
- 未输入内容时,按钮保持原有的 `■` 停止按钮功能。
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## [1.2.0] - 2026-07-26
|
|
65
|
+
|
|
66
|
+
### Added
|
|
67
|
+
- **断线自动重连 (Auto Reconnect with Exponential Backoff)**:网页连接断开后前端启动指数退避自动重连(1s ~ 15s),并在侧边栏底部指示灯实时显示重连状态(`重连中 (x)`)。重连成功弹出“网络连接已恢复”提示。
|
|
68
|
+
- **双向心跳检测 (Heartbeat Ping/Pong)**:服务端每 30 秒发送 WS Protocol Ping 清理僵尸连接,前端每 15 秒发送应用层 Ping,超时 45 秒无响应自动切断重连。
|
|
69
|
+
- **重连会话状态同步 (State Restoration)**:重连后自动向服务端获取 `isStreaming` 状态。若生成已在后台完成则载入最新对话历史,若仍生成中则自动平滑接续流式输出。
|
|
70
|
+
- **一键复制功能 (Copy Buttons)**:
|
|
71
|
+
- **代码块/命令复制**:所有 Markdown 渲染的代码块顶部增加语言标签与“复制”按钮。
|
|
72
|
+
- **工具调用指令复制**:在工具调用(如 `bash` 命令执行)卡片标题栏增加“复制”按钮,方便快速复制命令。
|
|
73
|
+
- **回答全文复制**:在 `pi` 角色标签右侧新增“复制全文”按钮。
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## [1.1.0] - 2026-07-26
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
- **后台进程持久化 (Process Persistence)**:刷新或暂时离开 Web 页面时,`pi` Agent 进程继续在后台运行,重新打开/刷新网页会自动重挂载 (re-attach) 正在运行的进程,任务不会中断。
|
|
81
|
+
- **历史工具输出归折 (Clean Tool Results Rendering)**:从历史记录恢复会话时,将离散的 `toolResult` 输出与对应 `toolCall` 绑定,整洁收纳于工具调用的 `⚙` 折叠卡片内,避免原始日志/代码平铺乱穿于聊天框中。
|
|
82
|
+
|
|
83
|
+
### Fixed
|
|
84
|
+
- **历史会话加载异常**:修复 `/api/session` 接口中局部变量名遮蔽 Node.js `path` 模块导致的无法弹出会话历史问题。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## [1.0.1] - 2026-07-20
|
|
11
89
|
|
|
12
90
|
### Fixed
|
|
13
91
|
- **空内容 pi 气泡**:`message_start` 原本不区分角色,用户消息回显也建了一个空 pi 气泡 — 现在只对 `role:assistant` 开 streaming 块。
|
|
@@ -19,27 +97,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
19
97
|
- **工具调用参数显示不全**:新增 `toolcall_delta` / `toolcall_end` 处理,用 `toolcall_end` 的最终 `toolCall.arguments` 刷新头部 args 显示。
|
|
20
98
|
- **同一 agent 多轮 agent message 互相污染**:`message_start`(assistant) 重置本块的 text/thinking 累加器,避免上一轮工具调用与下一轮文本串到一起。
|
|
21
99
|
|
|
22
|
-
### Added
|
|
23
|
-
- 会话切换时右侧完整历史恢复(通过 REST `/api/session` 重建 parent 链)
|
|
24
|
-
- 模型切换器(顶栏 pill,支持所有 pi 配置的模型)
|
|
25
|
-
- Tool-call 折叠块(实时输出、可展开/折叠)
|
|
26
|
-
- Thinking 折叠块
|
|
27
|
-
- 发送按钮双态(发送/停止)+ 红色停止态
|
|
28
|
-
- 新会话后侧边栏在 `agent_settled` 立即刷新(无需手动刷新页面)
|
|
29
|
-
|
|
30
|
-
### Changed
|
|
31
|
-
- 侧边栏会话项去除无意义的 `●` 圆点,改为 tooltip 显示完整 jsonl 路径
|
|
32
|
-
- 发送按钮禁用逻辑:仅在 wsConnected=false 时禁用,而非 streaming 时
|
|
33
|
-
|
|
34
100
|
---
|
|
35
101
|
|
|
36
102
|
## [0.2.0] - 2026-07-19
|
|
37
103
|
|
|
38
104
|
### Added
|
|
39
|
-
- **新建会话流程修复**:`btnNew` 点击后刷新侧边栏、清理流式状态、生成新 ws
|
|
40
|
-
- **WebSocket 代次机制**:`wsGen` 防止旧 socket
|
|
41
|
-
- **输入框红边提示**:ws 未连时提交会有 350ms 红色 flash
|
|
42
|
-
-
|
|
105
|
+
- **新建会话流程修复**:`btnNew` 点击后刷新侧边栏、清理流式状态、生成新 ws 代次。
|
|
106
|
+
- **WebSocket 代次机制**:`wsGen` 防止旧 socket 消息污染新上下文。
|
|
107
|
+
- **输入框红边提示**:ws 未连时提交会有 350ms 红色 flash。
|
|
108
|
+
- **连接状态文本动态更新**:「连接中…」→「已连接」/「已断开」。
|
|
43
109
|
- **提交**:`5a8f036` "Fix new-session flow: ws generation guard + sidebar refresh + drop input"
|
|
44
110
|
|
|
45
111
|
### Fixed
|
|
@@ -85,4 +151,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
85
151
|
| **Deprecated** | 即将移除 |
|
|
86
152
|
| **Removed** | 已移除 |
|
|
87
153
|
| **Fixed** | Bug 修复 |
|
|
88
|
-
| **Security** | 安全相关修复 |
|
|
154
|
+
| **Security** | 安全相关修复 |
|
package/bin/pi-web-chat.js
CHANGED
|
@@ -52,7 +52,8 @@ function parseArgs(argv) {
|
|
|
52
52
|
const opts = parseArgs(process.argv.slice(2));
|
|
53
53
|
|
|
54
54
|
// Spawn server.js as a child so we can forward signals cleanly.
|
|
55
|
-
|
|
55
|
+
// Use --expose-gc so idle agents can call global.gc() to release heap (IDLE_DROP_HEAP=1).
|
|
56
|
+
const child = spawn("node", ["--expose-gc", SERVER], {
|
|
56
57
|
cwd: opts.cwd,
|
|
57
58
|
env: { ...process.env, PORT: String(opts.port) },
|
|
58
59
|
stdio: "inherit",
|