pi-web-ui 0.35.0 → 0.36.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/LICENSE +21 -21
- package/README.md +388 -388
- package/README.zh-CN.md +359 -359
- package/bin/pi-web-ui.mjs +1736 -1727
- package/deploy/com.xingshuyin.pi-web-ui.plist +48 -48
- package/deploy/nginx-subpath.conf +88 -88
- package/deploy/pi-web-ui-task.xml +71 -71
- package/deploy/pi-web-ui.service +31 -31
- package/dist/server/agent-service.js +34 -10
- package/dist/server/attachments.js +3 -3
- package/dist/server/index.js +4 -1
- package/dist/server/plugins.js +46 -4
- package/dist/server/protocol-version.js +1 -1
- package/dist/server/terminals.js +5 -5
- package/extensions/webui.ts +192 -192
- package/package.json +1 -1
- package/themes/md-preview.css +93 -0
- package/themes/white.css +93 -0
- package/web/dist/assets/{TerminalPanel-BIzzCNZ2.js → TerminalPanel-BxezvWth.js} +1 -1
- package/web/dist/assets/index-BP593LGC.js +19 -0
- package/web/dist/assets/index-DduTNQNx.css +10 -0
- package/web/dist/favicon.svg +8 -8
- package/web/dist/index.html +15 -15
- package/web/public/favicon.svg +8 -8
- package/web/dist/assets/index-CKIZpMV3.js +0 -19
- package/web/dist/assets/index-Diz_v1In.css +0 -10
package/themes/white.css
CHANGED
|
@@ -960,6 +960,29 @@ body.panel-resizing {
|
|
|
960
960
|
font-size: 14px;
|
|
961
961
|
}
|
|
962
962
|
|
|
963
|
+
/* 全窗口拖放提示(issue #19):拖入文件时覆盖整个视口,drop 任意位置即附加。
|
|
964
|
+
pointer-events:none 保证 drop 落在下面的元素上再冒泡到 .app 的 onDrop。 */
|
|
965
|
+
.app-drop-overlay {
|
|
966
|
+
position: fixed;
|
|
967
|
+
inset: 0;
|
|
968
|
+
z-index: 300;
|
|
969
|
+
display: flex;
|
|
970
|
+
align-items: center;
|
|
971
|
+
justify-content: center;
|
|
972
|
+
background: color-mix(in srgb, var(--bg-elev) 72%, transparent);
|
|
973
|
+
border: 2px dashed var(--accent);
|
|
974
|
+
pointer-events: none;
|
|
975
|
+
}
|
|
976
|
+
.app-drop-overlay span {
|
|
977
|
+
padding: 14px 26px;
|
|
978
|
+
border: 1px dashed var(--accent);
|
|
979
|
+
border-radius: 12px;
|
|
980
|
+
background: var(--bg-elev2);
|
|
981
|
+
color: var(--text);
|
|
982
|
+
font-size: 16px;
|
|
983
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.35);
|
|
984
|
+
}
|
|
985
|
+
|
|
963
986
|
.attach-range {
|
|
964
987
|
font-family: var(--mono);
|
|
965
988
|
font-size: 10.5px;
|
|
@@ -3339,11 +3362,81 @@ body.panel-resizing {
|
|
|
3339
3362
|
}
|
|
3340
3363
|
|
|
3341
3364
|
.msg-editor {
|
|
3365
|
+
position: relative;
|
|
3342
3366
|
display: flex;
|
|
3343
3367
|
flex-direction: column;
|
|
3344
3368
|
gap: 8px;
|
|
3345
3369
|
}
|
|
3346
3370
|
|
|
3371
|
+
/* 编辑重问的图片附件条:原图缩略图 + 新粘贴/拖入的图 */
|
|
3372
|
+
.msg-editor-images {
|
|
3373
|
+
display: flex;
|
|
3374
|
+
flex-wrap: wrap;
|
|
3375
|
+
gap: 6px;
|
|
3376
|
+
}
|
|
3377
|
+
.msg-editor-img {
|
|
3378
|
+
position: relative;
|
|
3379
|
+
display: inline-flex;
|
|
3380
|
+
width: 64px;
|
|
3381
|
+
height: 64px;
|
|
3382
|
+
border-radius: 8px;
|
|
3383
|
+
overflow: hidden;
|
|
3384
|
+
border: 1px solid var(--border);
|
|
3385
|
+
background: var(--bg-elev1);
|
|
3386
|
+
}
|
|
3387
|
+
.msg-editor-img img {
|
|
3388
|
+
width: 100%;
|
|
3389
|
+
height: 100%;
|
|
3390
|
+
object-fit: cover;
|
|
3391
|
+
display: block;
|
|
3392
|
+
}
|
|
3393
|
+
.msg-editor-img-remove {
|
|
3394
|
+
position: absolute;
|
|
3395
|
+
top: 2px;
|
|
3396
|
+
right: 2px;
|
|
3397
|
+
width: 18px;
|
|
3398
|
+
height: 18px;
|
|
3399
|
+
padding: 0;
|
|
3400
|
+
display: flex;
|
|
3401
|
+
align-items: center;
|
|
3402
|
+
justify-content: center;
|
|
3403
|
+
border: none;
|
|
3404
|
+
border-radius: 50%;
|
|
3405
|
+
cursor: pointer;
|
|
3406
|
+
font-size: 10px;
|
|
3407
|
+
line-height: 1;
|
|
3408
|
+
color: #fff;
|
|
3409
|
+
background: rgba(0, 0, 0, 0.55);
|
|
3410
|
+
}
|
|
3411
|
+
.msg-editor-img-remove:hover {
|
|
3412
|
+
background: rgba(220, 38, 38, 0.85);
|
|
3413
|
+
}
|
|
3414
|
+
.msg-editor-img-remove svg {
|
|
3415
|
+
width: 12px;
|
|
3416
|
+
height: 12px;
|
|
3417
|
+
}
|
|
3418
|
+
/* 拖拽悬停时整个编辑器高亮 */
|
|
3419
|
+
.msg-editor.drag-over .msg-editor-input {
|
|
3420
|
+
border-color: var(--accent);
|
|
3421
|
+
box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.25);
|
|
3422
|
+
}
|
|
3423
|
+
.msg-editor.drag-over::after {
|
|
3424
|
+
content: "📎";
|
|
3425
|
+
position: absolute;
|
|
3426
|
+
inset: 0;
|
|
3427
|
+
display: flex;
|
|
3428
|
+
align-items: center;
|
|
3429
|
+
justify-content: center;
|
|
3430
|
+
font-size: 28px;
|
|
3431
|
+
pointer-events: none;
|
|
3432
|
+
z-index: 2;
|
|
3433
|
+
}
|
|
3434
|
+
/* 提示文案里的内联图标与文字对齐 */
|
|
3435
|
+
span.msg-editor-hint svg {
|
|
3436
|
+
vertical-align: -2px;
|
|
3437
|
+
margin-right: 4px;
|
|
3438
|
+
}
|
|
3439
|
+
|
|
3347
3440
|
.msg-editor-input {
|
|
3348
3441
|
width: 100%;
|
|
3349
3442
|
min-height: 48px;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as d,j as n}from"./markdown-DRBrS2Nf.js";import{b as $,T as R,u as O,F as P,a as K,c as q,d as L,e as B,f as J,g as X,h as G,r as Q}from"./index-
|
|
1
|
+
import{a as d,j as n}from"./markdown-DRBrS2Nf.js";import{b as $,T as R,u as O,F as P,a as K,c as q,d as L,e as B,f as J,g as X,h as G,r as Q}from"./index-BP593LGC.js";import{D as U,o as V}from"./xterm-D1D2FVe3.js";import"./react-C9ovnpIm.js";function W({conversationId:s,terminalId:r,command:x,cwd:a,active:f,send:m,register:v}){const w=d.useRef(null),N=d.useRef(null),b=x?JSON.stringify(x):"";return d.useEffect(()=>{const p=w.current;if(!p)return;const t=new U({theme:$(),fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),c=new V;t.loadAddon(c),t.open(p),N.current={term:t,fit:c},f&&t.focus();const h=()=>{t.options.theme=$()};window.addEventListener(R,h),t.attachCustomKeyEventHandler(o=>{var F;if(o.type!=="keydown")return!0;const E=(F=o.key)==null?void 0:F.toLowerCase();if((o.ctrlKey||o.metaKey)&&E==="v")return!1;if(o.ctrlKey&&!o.shiftKey&&!o.altKey&&E==="c"&&t.hasSelection()){const T=t.textarea;return T&&(T.value=t.getSelection(),T.select()),!1}return!0});const g=v(s,r,{write:o=>t.write(o),dispose:()=>t.dispose()}),C=()=>{try{c.fit(),m({type:"terminal_resize",terminalId:r,conversationId:s,cols:t.cols,rows:t.rows})}catch{}},j=requestAnimationFrame(()=>{try{c.fit()}catch{}m(x?{type:"run_command",terminalId:r,conversationId:s,command:x,cols:t.cols,rows:t.rows}:{type:"terminal_create",terminalId:r,conversationId:s,cwd:a,cols:t.cols,rows:t.rows})}),k=t.onData(o=>{m({type:"terminal_input",terminalId:r,conversationId:s,data:o})});let y=null;return typeof ResizeObserver<"u"&&(y=new ResizeObserver(()=>{p.offsetWidth>0&&p.offsetHeight>0&&C()}),y.observe(p)),()=>{cancelAnimationFrame(j),k.dispose(),window.removeEventListener(R,h),y==null||y.disconnect(),g(),t.dispose(),N.current=null}},[s,r,b,m,v]),d.useEffect(()=>{if(!f)return;const p=requestAnimationFrame(()=>{const t=N.current;if(t){try{t.fit.fit(),m({type:"terminal_resize",terminalId:r,conversationId:s,cols:t.term.cols,rows:t.term.rows})}catch{}t.term.focus()}});return()=>cancelAnimationFrame(p)},[f]),n.jsx("div",{ref:w,className:`term-xterm ${f?"":"hidden"}`})}const A={name:"",command:"",cwd:"${pwd}"};function se({chat:s,send:r,terminal:x}){const a=O(),[f,m]=d.useState(null),[v,w]=d.useState(!1),[N,b]=d.useState(!1),[p,t]=d.useState(null),[c,h]=d.useState(A),[g,C]=d.useState(null),j=d.useRef(null);d.useEffect(()=>{s.terminals.length===0?m(null):s.terminals.some(e=>e.id===f)||m(s.terminals[s.terminals.length-1].id)},[s.terminals,f]),d.useEffect(()=>()=>{j.current&&clearTimeout(j.current)},[]);const k=e=>{var u;if(!s.ready)return;const i=Q(),l=s.activeConversationId||((u=s.state)==null?void 0:u.conversationId)||"";x.create({...e,id:i,conversationId:l,cols:e.cols??80,rows:e.rows??24,running:!0,exitCode:null}),m(i),w(!1)},y=()=>{var e;return k({title:a("terminalTitle",{n:s.terminals.length+1}),cwd:((e=s.state)==null?void 0:e.cwd)??""})},o=e=>{var u;const i=e.name||e.command,l=s.terminals.find(_=>_.title===i);if(l){x.restart(l.id),m(l.id),r({type:"run_command",terminalId:l.id,conversationId:l.conversationId,command:e,cols:80,rows:24});return}k({title:i,cwd:((u=s.state)==null?void 0:u.cwd)??"",command:e})},E=e=>{const i=s.terminals.find(l=>l.id===e);if(i&&r({type:"terminal_kill",terminalId:e,conversationId:i.conversationId}),x.close(e),f===e){const l=s.terminals.filter(u=>u.id!==e);m(l.length>0?l[l.length-1].id:null)}},F=()=>{b(!0),t(null),h(A)},T=e=>{const i=s.commands[e];i&&(b(!1),t(e),h({name:i.name,command:i.command,cwd:i.cwd??""}))},D=()=>{b(!1),t(null)},S=()=>{const e=c.name.trim(),i=c.command.trim();if(!e||!i)return;const l=c.cwd.trim(),u={name:e,command:i,cwd:l||void 0},_=N?[...s.commands,u]:p!==null?s.commands.map((z,H)=>H===p?u:z):s.commands;r({type:"save_commands",commands:_}),D()},I=e=>{if(g===e){const i=s.commands.filter((l,u)=>u!==e);r({type:"save_commands",commands:i}),C(null),j.current&&clearTimeout(j.current)}else C(e),j.current&&clearTimeout(j.current),j.current=setTimeout(()=>C(null),2500)},M=N||p!==null;return n.jsxs("div",{className:"terminal-view",children:[n.jsxs("aside",{className:`term-side term-commands ${v?"open":""}`,children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:a("commands")}),n.jsxs("div",{className:"panel-header-actions",children:[n.jsx("button",{type:"button",className:"panel-refresh",title:a("rerun"),onClick:()=>r({type:"list_commands"}),children:n.jsx(P,{})}),n.jsx("button",{type:"button",className:"panel-new",title:a("newCommand"),onClick:F,children:n.jsx(K,{})})]})]}),n.jsx("div",{className:"panel-body",children:M?n.jsxs("div",{className:"cmd-form",children:[n.jsx("label",{htmlFor:"cmd-name",children:a("name")}),n.jsx("input",{id:"cmd-name",className:"cmd-input",value:c.name,placeholder:a("exampleName"),autoFocus:!0,onChange:e=>h({...c,name:e.target.value})}),n.jsx("label",{htmlFor:"cmd-command",children:a("command")}),n.jsx("input",{id:"cmd-command",className:"cmd-input",value:c.command,placeholder:a("exampleCommand"),onChange:e=>h({...c,command:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&S()}}),n.jsxs("label",{htmlFor:"cmd-cwd",children:[a("directory")," ",n.jsx("span",{className:"cmd-hint",children:a("cwdHint")})]}),n.jsx("input",{id:"cmd-cwd",className:"cmd-input",value:c.cwd,placeholder:"${pwd}",onChange:e=>h({...c,cwd:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&S()}}),n.jsxs("div",{className:"cmd-form-actions",children:[n.jsx("button",{type:"button",className:"btn",onClick:D,children:a("cancel")}),n.jsx("button",{type:"button",className:"btn primary",disabled:!c.name.trim()||!c.command.trim(),onClick:S,children:a("save")})]})]}):n.jsxs(n.Fragment,{children:[s.commands.length===0&&n.jsx("div",{className:"panel-empty",children:a("noCommands")}),s.commands.map((e,i)=>n.jsxs("div",{className:"cmd-item",children:[n.jsx("button",{type:"button",className:"cmd-run",title:a("clickToRun"),onClick:()=>o(e),children:n.jsx(q,{})}),n.jsxs("button",{type:"button",className:"cmd-main",title:a("clickToRun"),onClick:()=>o(e),children:[n.jsx("span",{className:"cmd-name",children:e.name}),n.jsx("span",{className:"cmd-command",children:e.command}),e.cwd&&n.jsx("span",{className:"cmd-cwd",children:e.cwd})]}),n.jsx("button",{type:"button",className:"cmd-act",title:a("edit"),onClick:()=>T(i),children:n.jsx(L,{})}),n.jsx("button",{type:"button",className:`cmd-act del ${g===i?"confirm":""}`,title:a("delete"),onClick:()=>I(i),children:g===i?a("confirmQ"):n.jsx(B,{})})]},i))]})}),n.jsxs("div",{className:"term-tabs-block",children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:a("terminal")}),n.jsx("button",{type:"button",className:"panel-new",title:a("newTerminal"),onClick:y,children:n.jsx(K,{})})]}),n.jsxs("div",{className:"panel-body",children:[s.terminals.length===0&&n.jsx("div",{className:"panel-empty",children:a("noTerminal")}),s.terminals.map(e=>n.jsxs("div",{className:`term-tab ${e.id===f?"active":""}`,children:[n.jsxs("button",{type:"button",className:"term-tab-main",title:`${e.cwd}${e.command?`
|
|
2
2
|
> ${e.command.command}`:""}`,onClick:()=>{m(e.id),w(!1)},children:[n.jsx("span",{className:`term-tab-dot ${e.running?"run":"exit"}`}),n.jsxs("span",{className:"term-tab-title",children:[e.title,!e.running&&n.jsx("span",{className:"term-tab-exit",children:a("exited",{code:e.exitCode===null?"":` ${e.exitCode}`})})]})]}),n.jsx("button",{type:"button",className:"term-tab-close",title:a("closeTerminal"),onClick:()=>E(e.id),children:n.jsx(J,{})})]},e.id))]})]})]}),n.jsxs("div",{className:"term-main",children:[v&&n.jsx("div",{className:"drawer-backdrop",onClick:()=>w(!1)}),n.jsx("button",{type:"button",className:"term-side-toggle",title:a("commands"),onClick:()=>w(e=>!e),children:n.jsx(X,{})}),s.terminals.length===0?n.jsxs("div",{className:"term-empty",children:[n.jsx(G,{className:"term-empty-icon"}),n.jsx("div",{className:"term-empty-title",children:a("builtinTerminal")}),n.jsx("div",{className:"term-empty-sub",children:a("termEmptySub")})]}):s.terminals.map(e=>n.jsx(W,{conversationId:e.conversationId,terminalId:e.id,command:e.command,cwd:e.cwd,active:e.id===f,send:r,register:x.register},`${e.conversationId}:${e.id}`))]})]})}export{se as TerminalPanel};
|