@agegr/pi-web 0.5.12 → 0.5.14
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/app/{page-d50a8ec206bfa1e1.js → page-2aa72ae1f38fc473.js} +1 -1
- package/.next/trace +3 -3
- package/.next/trace-build +1 -1
- package/README.md +46 -38
- package/bin/pi-web.js +26 -11
- package/package.json +1 -1
- /package/.next/static/{606GUFoCeonU7XrZXH_ZS → KVDvhkMG8O5_1B9Miys-I}/_buildManifest.js +0 -0
- /package/.next/static/{606GUFoCeonU7XrZXH_ZS → KVDvhkMG8O5_1B9Miys-I}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -1,67 +1,75 @@
|
|
|
1
1
|
# pi-web
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[pi 编程智能体](https://github.com/badlogic/pi-mono) 的网页界面。在浏览器中浏览会话、与智能体对话、分叉对话、切换消息分支。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
**无需安装,直接运行:**
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @agegr/pi-web@latest
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**或全局安装后使用:**
|
|
6
14
|
|
|
7
15
|
```bash
|
|
8
16
|
npm install -g @agegr/pi-web
|
|
9
17
|
pi-web
|
|
10
18
|
```
|
|
11
19
|
|
|
12
|
-
|
|
20
|
+
启动后打开 [http://localhost:30141](http://localhost:30141)。
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
**可选参数:**
|
|
15
23
|
|
|
16
24
|
```bash
|
|
17
|
-
pi-web --port 8080 #
|
|
18
|
-
pi-web --hostname 127.0.0.1 #
|
|
19
|
-
pi-web -p 8080 -H 127.0.0.1 #
|
|
25
|
+
pi-web --port 8080 # 自定义端口
|
|
26
|
+
pi-web --hostname 127.0.0.1 # 仅本机访问
|
|
27
|
+
pi-web -p 8080 -H 127.0.0.1 # 组合使用
|
|
20
28
|
|
|
21
|
-
PORT=8080 pi-web #
|
|
29
|
+
PORT=8080 pi-web # 也支持环境变量
|
|
22
30
|
```
|
|
23
31
|
|
|
24
|
-
##
|
|
32
|
+
## 功能介绍
|
|
25
33
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
- **会话浏览器** — 按工作目录分组展示所有 pi 会话
|
|
35
|
+
- **实时对话** — 通过 SSE 流式输出与智能体实时交互
|
|
36
|
+
- **会话分叉** — 从任意用户消息创建独立的新会话分支
|
|
37
|
+
- **会话内分支** — 回退到任意节点继续对话,在同一文件内创建分支
|
|
38
|
+
- **分支导航器** — 可视化切换同一会话内的各个分支
|
|
39
|
+
- **模型切换** — 对话中途随时切换模型
|
|
40
|
+
- **工具面板** — 控制智能体可使用的工具
|
|
41
|
+
- **压缩会话** — 对长会话进行摘要,节省上下文窗口
|
|
42
|
+
- **引导 / 追加** — 打断正在运行的智能体,或在其完成后追加消息
|
|
30
43
|
|
|
31
|
-
##
|
|
44
|
+
## 注意事项
|
|
32
45
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
- **In-session branching** — navigate back to any point and continue from there, creating a branch in the same session file
|
|
37
|
-
- **Branch navigator** — visual switcher for branch points within a session
|
|
38
|
-
- **Model selector** — switch models mid-session
|
|
39
|
-
- **Tool panel** — toggle which tools the agent can use
|
|
40
|
-
- **Compact** — summarize long sessions to save context window
|
|
41
|
-
- **Steer / Follow-up** — interrupt the agent mid-run or queue a message for after it finishes
|
|
46
|
+
- **数据目录** — 默认读取 `~/.pi/agent/sessions` 下的会话文件。可通过环境变量 `PI_CODING_AGENT_DIR` 指定其他目录。
|
|
47
|
+
- **模型配置** — 从智能体数据目录下的 `models.json` 读取可用模型,可在侧边栏的「Models」面板中编辑。
|
|
48
|
+
- **文件浏览** — 侧边栏内置文件浏览器,可在标签页中查看当前工作目录下的文件。
|
|
42
49
|
|
|
43
|
-
##
|
|
50
|
+
## 开发
|
|
44
51
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
```bash
|
|
53
|
+
npm install
|
|
54
|
+
npm run dev # 端口 30141
|
|
55
|
+
```
|
|
48
56
|
|
|
49
|
-
##
|
|
57
|
+
## 项目结构
|
|
50
58
|
|
|
51
59
|
```
|
|
52
60
|
app/
|
|
53
61
|
api/
|
|
54
|
-
sessions/ #
|
|
55
|
-
agent/ #
|
|
56
|
-
files/ #
|
|
57
|
-
models/ #
|
|
58
|
-
models-config/ #
|
|
59
|
-
components/ # UI
|
|
62
|
+
sessions/ # 读写会话文件
|
|
63
|
+
agent/ # 发送命令、SSE 事件流
|
|
64
|
+
files/ # 文件内容读取
|
|
65
|
+
models/ # 可用模型列表与默认模型
|
|
66
|
+
models-config/ # 读写 models.json
|
|
67
|
+
components/ # UI 组件
|
|
60
68
|
lib/
|
|
61
|
-
session-reader.ts #
|
|
62
|
-
rpc-manager.ts #
|
|
63
|
-
normalize.ts #
|
|
69
|
+
session-reader.ts # 解析 .jsonl 会话文件
|
|
70
|
+
rpc-manager.ts # 管理 AgentSession 生命周期
|
|
71
|
+
normalize.ts # 规范化 toolCall 字段名
|
|
64
72
|
types.ts
|
|
65
73
|
```
|
|
66
74
|
|
|
67
|
-
|
|
75
|
+
会话文件存储路径:`~/.pi/agent/sessions/<编码后的工作目录>/<时间戳>_<uuid>.jsonl`
|
package/bin/pi-web.js
CHANGED
|
@@ -11,7 +11,6 @@ const fs = require("fs");
|
|
|
11
11
|
const { parseArgs } = require("util");
|
|
12
12
|
|
|
13
13
|
const pkgDir = path.join(__dirname, "..");
|
|
14
|
-
const isWindows = process.platform === "win32";
|
|
15
14
|
const nextDir = path.join(pkgDir, ".next");
|
|
16
15
|
|
|
17
16
|
// Resolve next's CLI entry directly to avoid relying on .bin symlinks (which
|
|
@@ -20,8 +19,13 @@ let nextBin;
|
|
|
20
19
|
try {
|
|
21
20
|
nextBin = require.resolve("next/dist/bin/next", { paths: [pkgDir] });
|
|
22
21
|
} catch {
|
|
23
|
-
// Fallback
|
|
24
|
-
|
|
22
|
+
// Fallback: locate next package root and derive the bin path manually.
|
|
23
|
+
try {
|
|
24
|
+
const nextPkg = require.resolve("next/package.json", { paths: [pkgDir] });
|
|
25
|
+
nextBin = path.join(path.dirname(nextPkg), "dist", "bin", "next");
|
|
26
|
+
} catch {
|
|
27
|
+
nextBin = path.join(pkgDir, "node_modules", "next", "dist", "bin", "next");
|
|
28
|
+
}
|
|
25
29
|
}
|
|
26
30
|
|
|
27
31
|
const { values: cliArgs } = parseArgs({
|
|
@@ -43,16 +47,27 @@ if (!fs.existsSync(nextDir)) {
|
|
|
43
47
|
const nextArgs = ["start", "-p", port];
|
|
44
48
|
if (hostname) nextArgs.push("-H", hostname);
|
|
45
49
|
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
const spawnArgs = useNode ? [nextBin, ...nextArgs] : nextArgs;
|
|
50
|
-
|
|
51
|
-
const child = spawn(spawnCmd, spawnArgs, {
|
|
50
|
+
// Always run next's JS entry with node directly — avoids .bin symlink issues
|
|
51
|
+
// and path-with-spaces problems on Windows when shell: true is used.
|
|
52
|
+
const child = spawn(process.execPath, [nextBin, ...nextArgs], {
|
|
52
53
|
cwd: pkgDir,
|
|
53
|
-
stdio: "inherit",
|
|
54
|
+
stdio: ["inherit", "pipe", "inherit"],
|
|
54
55
|
env: { ...process.env },
|
|
55
|
-
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
let browserOpened = false;
|
|
59
|
+
const url = `http://${hostname ?? "localhost"}:${port}`;
|
|
60
|
+
|
|
61
|
+
child.stdout.on("data", (chunk) => {
|
|
62
|
+
const text = chunk.toString();
|
|
63
|
+
process.stdout.write(text);
|
|
64
|
+
if (!browserOpened && text.includes("Ready")) {
|
|
65
|
+
browserOpened = true;
|
|
66
|
+
const isWindows = process.platform === "win32";
|
|
67
|
+
const isMac = process.platform === "darwin";
|
|
68
|
+
const openCmd = isWindows ? "start" : isMac ? "open" : "xdg-open";
|
|
69
|
+
spawn(openCmd, [url], { shell: isWindows, stdio: "ignore", detached: true }).unref();
|
|
70
|
+
}
|
|
56
71
|
});
|
|
57
72
|
|
|
58
73
|
child.on("exit", (code) => process.exit(code ?? 0));
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|