@agegr/pi-web 0.5.13 → 0.5.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/.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.js +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 +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- 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 +2 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js +2 -2
- 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-77890f82c9221e8d.js → page-3cd69146b5fe50b5.js} +1 -1
- package/.next/static/css/e199587d689bd73c.css +3 -0
- package/.next/trace +3 -3
- package/.next/trace-build +1 -1
- package/README.md +46 -38
- package/bin/pi-web.js +16 -1
- package/package.json +1 -1
- package/.next/static/css/853269141a061637.css +0 -3
- /package/.next/static/{cmvBkod5ZC4-qfLmHJaKK → M1pqIfbOPXZhmiH4s88Uz}/_buildManifest.js +0 -0
- /package/.next/static/{cmvBkod5ZC4-qfLmHJaKK → M1pqIfbOPXZhmiH4s88Uz}/_ssgManifest.js +0 -0
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-webpack","duration":
|
|
1
|
+
[{"name":"run-webpack","duration":3623238,"timestamp":878583640179,"id":14,"parentId":1,"tags":{},"startTime":1776928383464,"traceId":"4bcfded913d0351b"},{"name":"run-typescript","duration":2073770,"timestamp":878587266762,"id":354,"parentId":1,"tags":{},"startTime":1776928387091,"traceId":"4bcfded913d0351b"},{"name":"static-check","duration":822567,"timestamp":878589350022,"id":357,"parentId":1,"tags":{},"startTime":1776928389174,"traceId":"4bcfded913d0351b"},{"name":"static-generation","duration":849059,"timestamp":878590421674,"id":407,"parentId":1,"tags":{},"startTime":1776928390246,"traceId":"4bcfded913d0351b"},{"name":"collect-build-traces","duration":7096998,"timestamp":878590173294,"id":404,"parentId":1,"tags":{},"startTime":1776928389997,"traceId":"4bcfded913d0351b"},{"name":"telemetry-flush","duration":20,"timestamp":878597271762,"id":416,"parentId":1,"tags":{},"startTime":1776928397096,"traceId":"4bcfded913d0351b"},{"name":"next-build","duration":13696970,"timestamp":878583574817,"id":1,"tags":{"buildMode":"default","version":"16.2.1","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1776928383399,"traceId":"4bcfded913d0351b"}]
|
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
|
@@ -51,8 +51,23 @@ if (hostname) nextArgs.push("-H", hostname);
|
|
|
51
51
|
// and path-with-spaces problems on Windows when shell: true is used.
|
|
52
52
|
const child = spawn(process.execPath, [nextBin, ...nextArgs], {
|
|
53
53
|
cwd: pkgDir,
|
|
54
|
-
stdio: "inherit",
|
|
54
|
+
stdio: ["inherit", "pipe", "inherit"],
|
|
55
55
|
env: { ...process.env },
|
|
56
56
|
});
|
|
57
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
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
58
73
|
child.on("exit", (code) => process.exit(code ?? 0));
|
package/package.json
CHANGED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/1cdd02902f937a18-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/7deddc85b7ffd1dc-s.p.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/1a3dce5cfb5f7760-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/15605e25b523335c-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/641a7b8a5800ee0e-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/4c4b3b30b6bcb2be-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/ec14413c594b3356-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Noto Sans Mono Fallback;src:local("Arial");ascent-override:79.43%;descent-override:21.77%;line-gap-override:0.00%;size-adjust:134.59%}.__className_66b8ca{font-family:Noto Sans Mono,Noto Sans Mono Fallback;font-style:normal}.__variable_66b8ca{--font-noto-mono:"Noto Sans Mono","Noto Sans Mono Fallback"}
|
|
2
|
-
|
|
3
|
-
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--spacing:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-text-muted:var(--text-muted)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.h-\[720px\]{height:720px}.h-full{height:100%}.w-\[720px\]{width:720px}.max-w-\[820px\]{max-width:820px}.flex-1{flex:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[drop-ripple_2\.4s_ease-out_infinite_backwards\]{animation:drop-ripple 2.4s ease-out infinite backwards}.animate-\[drop-zone-in_0\.15s_ease_both\]{animation:drop-zone-in .15s both}.animate-\[pulse_1\.5s_infinite\]{animation:pulse 1.5s infinite}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e+38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-solid{--tw-border-style:solid;border-style:solid}.border-\[rgba\(37\,99\,235\,0\.5\)\]{border-color:#2563eb80}.bg-\[rgba\(37\,99\,235\,0\.06\)\]{background-color:#2563eb0f}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-\[13px\]{font-size:13px}.break-all{word-break:break-all}.text-red-400{color:var(--color-red-400)}.text-text-muted{color:var(--color-text-muted)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.drop-shadow-\[0_6px_18px_rgba\(37\,99\,235\,0\.18\)\]{--tw-drop-shadow-size:drop-shadow(0 6px 18px var(--tw-drop-shadow-color,#2563eb2e));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[scrollbar-width\:none\]{scrollbar-width:none}}:root{--bg:#fff;--bg-panel:#f5f5f5;--bg-hover:#eee;--bg-selected:#e8e8e8;--border:#e0e0e0;--text:#1a1a1a;--text-muted:#6b7280;--text-dim:#9ca3af;--accent:#2563eb;--accent-hover:#1d4ed8;--user-bg:#eff6ff;--assistant-bg:#fff;--tool-bg:#f9fafb}*{box-sizing:border-box}body,html{background:var(--bg);height:100%;color:var(--text);margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}::-webkit-scrollbar-thumb:hover{background:var(--text-dim)}:root{--font-mono:var(--font-noto-mono),"JetBrains Mono","Fira Code","Consolas",ui-monospace,"PingFang SC","Microsoft YaHei",monospace}code,pre{font-family:var(--font-mono)}.markdown-body{color:var(--text);word-break:break-word;font-size:14px;line-height:1.7}.markdown-body p{margin:0 0 8px}.markdown-body p:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{color:var(--text);margin:10px 0 4px;font-weight:600}.markdown-body h1{font-size:1.15em}.markdown-body h2{font-size:1.05em}.markdown-body h3{font-size:.95em}.markdown-body ol,.markdown-body ul{margin:4px 0 8px;padding-left:20px}.markdown-body li{margin:2px 0}.markdown-body a{color:var(--accent);text-decoration:underline}.markdown-body blockquote{border-left:3px solid var(--border);color:var(--text-muted);margin:4px 0;padding:2px 10px}.markdown-body table{border-collapse:collapse;width:100%;margin:8px 0;font-size:13px}.markdown-body td,.markdown-body th{border:1px solid var(--border);text-align:left;padding:5px 10px}.markdown-body th{background:var(--bg-panel);font-weight:600}.markdown-body hr{border:none;border-top:1px solid var(--border);margin:10px 0}.markdown-file-preview h1{font-size:1.8em}.markdown-file-preview h2{font-size:1.4em}.markdown-file-preview h3{font-size:1.15em}.markdown-file-preview p{margin:0 0 12px}.markdown-file-preview pre{border:1px solid var(--border);border-radius:6px;margin:12px 0;padding:12px 16px;font-size:13px;overflow-x:auto}.markdown-file-preview code,.markdown-file-preview pre{background:var(--bg-panel);font-family:var(--font-mono)}.markdown-file-preview code{border-radius:3px;padding:1px 5px;font-size:.9em}.markdown-file-preview pre code{background:0 0;padding:0}.markdown-body span.linenumber,span.linenumber{color:var(--text-dim)!important;font-style:normal!important}@keyframes drop-zone-in{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes drop-icon-float{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}@keyframes drop-ring-pulse{0%,to{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes drop-ripple{0%{opacity:.6;transform:scale(0)}to{opacity:0;transform:scale(1)}}@keyframes blink{0%,to{opacity:1}50%{opacity:.3}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes pulse{50%{opacity:.5}}@media (min-width:641px){.sidebar-overlay-backdrop{display:none!important}.sidebar-container{transition:width .2s,min-width .2s;position:relative;overflow:hidden}.sidebar-container.sidebar-open{width:260px;min-width:260px}.sidebar-container.sidebar-closed{width:0;min-width:0;border-right:none!important}.sidebar-container>*{width:260px;min-width:260px}.right-panel-container{flex-shrink:0;transition:width .2s,min-width .2s;overflow:hidden}.right-panel-container.right-panel-open{width:42%;min-width:300px}.right-panel-container.right-panel-closed{width:0;min-width:0;border-left:none!important}.right-panel-container>*{width:42vw;min-width:300px}}@media (max-width:640px){.chat-stats-center{display:none!important}.sidebar-container{width:280px;max-width:85vw;transition:transform .25s,box-shadow .25s;top:0;bottom:0;left:0;position:fixed!important}.sidebar-container.sidebar-open{transform:translate(0);box-shadow:4px 0 20px #00000026}.sidebar-container.sidebar-closed{box-shadow:none;transform:translate(-100%)}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
|
|
File without changes
|
|
File without changes
|