pi-web-ui 0.64.0 → 0.64.2

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.
Files changed (45) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +504 -504
  3. package/README.zh-CN.md +427 -427
  4. package/bin/pi-web-ui.mjs +1809 -1809
  5. package/deploy/com.xingshuyin.pi-web-ui.plist +48 -48
  6. package/deploy/nginx-subpath.conf +88 -88
  7. package/deploy/pi-web-ui-task.xml +54 -54
  8. package/deploy/pi-web-ui.service +31 -31
  9. package/dist/server/agent-service.js +45 -22
  10. package/dist/server/attachments.js +16 -11
  11. package/dist/server/dsh/dsh-agent-service.js +27 -7
  12. package/dist/server/dsh/runtime/cordis.yml +1 -1
  13. package/dist/server/dsh/runtime/goal-rpc.mjs +645 -645
  14. package/dist/server/dsh/runtime/launcher.mjs +164 -164
  15. package/dist/server/dsh/runtime/override.patch.yml +71 -71
  16. package/dist/server/dsh/runtime/runtime-root.mjs +86 -86
  17. package/dist/server/files-service.js +235 -43
  18. package/dist/server/goal-service.js +4 -1
  19. package/dist/server/index.js +48 -13
  20. package/dist/server/marker-service.js +8 -3
  21. package/dist/server/markers/builtins/rename.js +3 -3
  22. package/dist/server/model-admin.js +12 -6
  23. package/dist/server/plugins.js +4 -4
  24. package/dist/server/slash-commands.js +3 -0
  25. package/dist/server/terminals.js +25 -15
  26. package/dist/server/vision-bridge.js +9 -9
  27. package/dist/server/webui-context.js +2 -2
  28. package/extensions/webui.ts +190 -190
  29. package/package.json +109 -109
  30. package/themes/cyberpunk.css +81 -81
  31. package/themes/dazzle.css +81 -81
  32. package/themes/md-preview.css +98 -98
  33. package/themes/white.css +160 -160
  34. package/web/dist/assets/TerminalPanel-BXISCcrQ.js +6 -0
  35. package/web/dist/assets/index-BxuvIAJQ.js +326 -0
  36. package/web/dist/assets/{index-CMgDryBL.css → index-DVnuQrK5.css} +1 -1
  37. package/web/dist/favicon.svg +8 -8
  38. package/web/dist/index.html +21 -21
  39. package/web/dist/manifest.webmanifest +50 -50
  40. package/web/dist/sw.js +126 -126
  41. package/web/public/favicon.svg +8 -8
  42. package/web/public/manifest.webmanifest +50 -50
  43. package/web/public/sw.js +126 -126
  44. package/web/dist/assets/TerminalPanel-DNkAT34Z.js +0 -2
  45. package/web/dist/assets/index-_1vyEugI.js +0 -326
package/web/public/sw.js CHANGED
@@ -1,126 +1,126 @@
1
- /**
2
- * pi-web-ui — Progressive Web App service worker.
3
- *
4
- * Strategy overview
5
- * -----------------
6
- * pi-web-ui is a WebSocket-first app that needs a live backend, so we do NOT
7
- * try to make it fully offline. Instead the SW focuses on what makes it a
8
- * reliable *installable* PWA on mobile/desktop:
9
- *
10
- * - network-first for navigation requests (falls back to the cached app
11
- * shell when the network flaps), and
12
- * - cache-first for hashed static assets, which Vite fingerprints so a cache
13
- * hit is always the right version until a new deploy publishes new hashes.
14
- *
15
- * Real-time / dynamic / credential-bearing routes (/ws, /api, /themes,
16
- * /plugins) are always fetched from the network and never cached, so we never
17
- * risk serving stale theme/plugin code or caching anything sensitive.
18
- */
19
-
20
- const STATIC_CACHE = "pi-web-ui-static-v1";
21
- const SHELL_CACHE = "pi-web-ui-shell-v1";
22
-
23
- // App root within this origin — "/" for root deployments, "/pi/" behind an
24
- // nginx sub-path reverse proxy. All path checks below are relative to it, so
25
- // the worker behaves identically under either deployment layout.
26
- const SCOPE = new URL("./", self.registration.scope).pathname;
27
-
28
- /** Map a request pathname to an app-relative path ("/pi/ws" → "/ws"), or null
29
- * when the request lies outside the registration scope (shouldn't happen). */
30
- function appPath(pathname) {
31
- if (SCOPE === "/") return pathname;
32
- if (pathname.startsWith(SCOPE)) return "/" + pathname.slice(SCOPE.length);
33
- return null;
34
- }
35
-
36
- self.addEventListener("install", (event) => {
37
- // Take control as soon as this version activates so the current page is
38
- // served by the new worker without requiring a second reload.
39
- self.skipWaiting();
40
- event.waitUntil(caches.open(SHELL_CACHE));
41
- });
42
-
43
- self.addEventListener("activate", (event) => {
44
- event.waitUntil(
45
- caches
46
- .keys()
47
- .then((keys) =>
48
- Promise.all(keys.filter((k) => k !== STATIC_CACHE && k !== SHELL_CACHE).map((k) => caches.delete(k))),
49
- )
50
- // Apply to already-open pages immediately.
51
- .then(() => self.clients.claim()),
52
- );
53
- });
54
-
55
- // Only cache simple, safe GET requests. Everything else goes straight through.
56
- function isCachable(request) {
57
- const method = request.method;
58
- if (method !== "GET") return false;
59
-
60
- const url = new URL(request.url);
61
- if (url.origin !== self.location.origin) return false;
62
-
63
- // Never cache real-time, dynamic or credential/data endpoints.
64
- const path = appPath(url.pathname);
65
- if (
66
- path === null ||
67
- path.startsWith("/ws") ||
68
- path.startsWith("/api") ||
69
- path.startsWith("/themes") ||
70
- path.startsWith("/plugins")
71
- ) {
72
- return false;
73
- }
74
- return true;
75
- }
76
-
77
- self.addEventListener("fetch", (event) => {
78
- const { request } = event;
79
- if (!isCachable(request)) {
80
- // Let the browser/backend handle WebSockets, API calls and cross-origin
81
- // requests normally.
82
- return;
83
- }
84
-
85
- const requestUrl = new URL(request.url);
86
-
87
- // Navigation → app shell. Network-first with cached fallback: users get the
88
- // latest build when online but can still reopen the app while flaky.
89
- if (request.mode === "navigate") {
90
- event.respondWith(
91
- fetch(request)
92
- .then((response) => {
93
- const copy = response.clone();
94
- caches.open(SHELL_CACHE).then((cache) => cache.put(request, copy));
95
- return response;
96
- })
97
- .catch(() => caches.match(request).then((cached) => cached || caches.match(SCOPE) || Response.error())),
98
- );
99
- return;
100
- }
101
-
102
- // Static assets (hashed by Vite) → cache-first.
103
- const path = appPath(requestUrl.pathname);
104
- const isStatic =
105
- path !== null &&
106
- (path.startsWith("/assets/") ||
107
- path.startsWith("/icons/") ||
108
- path === "/favicon.svg" ||
109
- path === "/icon.ico" ||
110
- path === "/manifest.webmanifest");
111
-
112
- if (isStatic) {
113
- event.respondWith(
114
- caches.match(request).then((cached) => {
115
- if (cached) return cached;
116
- return fetch(request).then((response) => {
117
- if (response && response.ok) {
118
- const copy = response.clone();
119
- caches.open(STATIC_CACHE).then((cache) => cache.put(request, copy));
120
- }
121
- return response;
122
- });
123
- }),
124
- );
125
- }
126
- });
1
+ /**
2
+ * pi-web-ui — Progressive Web App service worker.
3
+ *
4
+ * Strategy overview
5
+ * -----------------
6
+ * pi-web-ui is a WebSocket-first app that needs a live backend, so we do NOT
7
+ * try to make it fully offline. Instead the SW focuses on what makes it a
8
+ * reliable *installable* PWA on mobile/desktop:
9
+ *
10
+ * - network-first for navigation requests (falls back to the cached app
11
+ * shell when the network flaps), and
12
+ * - cache-first for hashed static assets, which Vite fingerprints so a cache
13
+ * hit is always the right version until a new deploy publishes new hashes.
14
+ *
15
+ * Real-time / dynamic / credential-bearing routes (/ws, /api, /themes,
16
+ * /plugins) are always fetched from the network and never cached, so we never
17
+ * risk serving stale theme/plugin code or caching anything sensitive.
18
+ */
19
+
20
+ const STATIC_CACHE = "pi-web-ui-static-v1";
21
+ const SHELL_CACHE = "pi-web-ui-shell-v1";
22
+
23
+ // App root within this origin — "/" for root deployments, "/pi/" behind an
24
+ // nginx sub-path reverse proxy. All path checks below are relative to it, so
25
+ // the worker behaves identically under either deployment layout.
26
+ const SCOPE = new URL("./", self.registration.scope).pathname;
27
+
28
+ /** Map a request pathname to an app-relative path ("/pi/ws" → "/ws"), or null
29
+ * when the request lies outside the registration scope (shouldn't happen). */
30
+ function appPath(pathname) {
31
+ if (SCOPE === "/") return pathname;
32
+ if (pathname.startsWith(SCOPE)) return "/" + pathname.slice(SCOPE.length);
33
+ return null;
34
+ }
35
+
36
+ self.addEventListener("install", (event) => {
37
+ // Take control as soon as this version activates so the current page is
38
+ // served by the new worker without requiring a second reload.
39
+ self.skipWaiting();
40
+ event.waitUntil(caches.open(SHELL_CACHE));
41
+ });
42
+
43
+ self.addEventListener("activate", (event) => {
44
+ event.waitUntil(
45
+ caches
46
+ .keys()
47
+ .then((keys) =>
48
+ Promise.all(keys.filter((k) => k !== STATIC_CACHE && k !== SHELL_CACHE).map((k) => caches.delete(k))),
49
+ )
50
+ // Apply to already-open pages immediately.
51
+ .then(() => self.clients.claim()),
52
+ );
53
+ });
54
+
55
+ // Only cache simple, safe GET requests. Everything else goes straight through.
56
+ function isCachable(request) {
57
+ const method = request.method;
58
+ if (method !== "GET") return false;
59
+
60
+ const url = new URL(request.url);
61
+ if (url.origin !== self.location.origin) return false;
62
+
63
+ // Never cache real-time, dynamic or credential/data endpoints.
64
+ const path = appPath(url.pathname);
65
+ if (
66
+ path === null ||
67
+ path.startsWith("/ws") ||
68
+ path.startsWith("/api") ||
69
+ path.startsWith("/themes") ||
70
+ path.startsWith("/plugins")
71
+ ) {
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+
77
+ self.addEventListener("fetch", (event) => {
78
+ const { request } = event;
79
+ if (!isCachable(request)) {
80
+ // Let the browser/backend handle WebSockets, API calls and cross-origin
81
+ // requests normally.
82
+ return;
83
+ }
84
+
85
+ const requestUrl = new URL(request.url);
86
+
87
+ // Navigation → app shell. Network-first with cached fallback: users get the
88
+ // latest build when online but can still reopen the app while flaky.
89
+ if (request.mode === "navigate") {
90
+ event.respondWith(
91
+ fetch(request)
92
+ .then((response) => {
93
+ const copy = response.clone();
94
+ caches.open(SHELL_CACHE).then((cache) => cache.put(request, copy));
95
+ return response;
96
+ })
97
+ .catch(() => caches.match(request).then((cached) => cached || caches.match(SCOPE) || Response.error())),
98
+ );
99
+ return;
100
+ }
101
+
102
+ // Static assets (hashed by Vite) → cache-first.
103
+ const path = appPath(requestUrl.pathname);
104
+ const isStatic =
105
+ path !== null &&
106
+ (path.startsWith("/assets/") ||
107
+ path.startsWith("/icons/") ||
108
+ path === "/favicon.svg" ||
109
+ path === "/icon.ico" ||
110
+ path === "/manifest.webmanifest");
111
+
112
+ if (isStatic) {
113
+ event.respondWith(
114
+ caches.match(request).then((cached) => {
115
+ if (cached) return cached;
116
+ return fetch(request).then((response) => {
117
+ if (response && response.ok) {
118
+ const copy = response.clone();
119
+ caches.open(STATIC_CACHE).then((cache) => cache.put(request, copy));
120
+ }
121
+ return response;
122
+ });
123
+ }),
124
+ );
125
+ }
126
+ });
@@ -1,2 +0,0 @@
1
- import{a as r,j as n}from"./markdown-DRBrS2Nf.js";import{u as V,b as B,T as O,a as W,F as Y,c as P,d as Z,e as M,f as ee,g as ne,h as te,i as se,r as ae}from"./index-_1vyEugI.js";import{D as ie,o as le}from"./xterm-D1D2FVe3.js";import"./react-C9ovnpIm.js";function re({conversationId:t,terminalId:c,command:x,cwd:a,title:w,active:u,send:h,register:j}){const E=r.useRef(null),v=r.useRef(null),{locale:b}=V(),g=r.useRef(b);g.current=b;const m=x?JSON.stringify(x):"";return r.useEffect(()=>{const d=E.current;if(!d)return;const i=new ie({theme:B(),fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),y=new le;i.loadAddon(y),i.open(d),v.current={term:i,fit:y},u&&i.focus();const f=()=>{i.options.theme=B()};window.addEventListener(O,f),i.attachCustomKeyEventHandler(o=>{var T;if(o.type!=="keydown")return!0;const S=(T=o.key)==null?void 0:T.toLowerCase();if((o.ctrlKey||o.metaKey)&&S==="v")return!1;if(o.ctrlKey&&!o.shiftKey&&!o.altKey&&S==="c"&&i.hasSelection()){const k=i.textarea;return k&&(k.value=i.getSelection(),k.select()),!1}return!0});const F=j(t,c,{write:o=>i.write(o),dispose:()=>i.dispose()}),R=()=>{try{y.fit(),h({type:"terminal_resize",terminalId:c,conversationId:t,cols:i.cols,rows:i.rows})}catch{}},D=requestAnimationFrame(()=>{try{y.fit()}catch{}h(x?{type:"run_command",terminalId:c,conversationId:t,command:x,cols:i.cols,rows:i.rows}:{type:"terminal_create",terminalId:c,title:w,locale:g.current,conversationId:t,cwd:a,cols:i.cols,rows:i.rows})}),C=i.onData(o=>{h({type:"terminal_input",terminalId:c,conversationId:t,data:o})});let N=null;return typeof ResizeObserver<"u"&&(N=new ResizeObserver(()=>{d.offsetWidth>0&&d.offsetHeight>0&&R()}),N.observe(d)),()=>{cancelAnimationFrame(D),C.dispose(),window.removeEventListener(O,f),N==null||N.disconnect(),F(),i.dispose(),v.current=null}},[t,c,m,h,j]),r.useEffect(()=>{if(!u)return;const d=requestAnimationFrame(()=>{const i=v.current;if(i){try{i.fit.fit(),h({type:"terminal_resize",terminalId:c,conversationId:t,cols:i.term.cols,rows:i.term.rows})}catch{}i.term.focus()}});return()=>cancelAnimationFrame(d)},[u]),n.jsx("div",{ref:E,className:`term-xterm ${u?"":"hidden"}`})}const z={name:"",command:"",cwd:"${pwd}"};function ue({chat:t,send:c,terminal:x}){const a=W(),[w,u]=r.useState(null),[h,j]=r.useState(!1),[E,v]=r.useState(!1),[b,g]=r.useState(null),[m,d]=r.useState(z),[i,y]=r.useState(null),f=r.useRef(null),[F,R]=r.useState(!0),[D,C]=r.useState(null),[N,o]=r.useState("");r.useEffect(()=>{t.terminals.length===0?u(null):t.terminals.some(e=>e.id===w)||u(t.terminals[t.terminals.length-1].id)},[t.terminals,w]),r.useEffect(()=>{t.terminalActiveId&&(u(t.terminalActiveId),j(!1))},[t.terminalActiveId]),r.useEffect(()=>()=>{f.current&&clearTimeout(f.current)},[]);const S=t.terminals.filter(e=>!e.agentBash),T=t.terminals.filter(e=>e.agentBash),k=e=>{var p;if(!t.ready)return;const s=ae(),l=t.activeConversationId||((p=t.state)==null?void 0:p.conversationId)||"";x.create({...e,id:s,conversationId:l,cols:e.cols??80,rows:e.rows??24,running:!0,exitCode:null}),u(s),j(!1)},H=()=>{var e;return k({title:a("terminalTitle",{n:S.length+1}),cwd:((e=t.state)==null?void 0:e.cwd)??""})},I=e=>{var p;const s=e.name||e.command,l=t.terminals.find($=>$.title===s);if(l){x.restart(l.id),u(l.id),c({type:"run_command",terminalId:l.id,conversationId:l.conversationId,command:e,cols:80,rows:24});return}k({title:s,cwd:((p=t.state)==null?void 0:p.cwd)??"",command:e})},q=e=>{const s=t.terminals.find(l=>l.id===e);if(s&&c({type:"terminal_kill",terminalId:e,conversationId:s.conversationId}),x.close(e),w===e){const l=t.terminals.filter(p=>p.id!==e);u(l.length>0?l[l.length-1].id:null)}},A=e=>n.jsxs("div",{className:`term-tab ${e.id===w?"active":""}`,children:[n.jsxs("button",{type:"button",className:"term-tab-main",title:`${e.cwd}${e.command?`
2
- > ${e.command.command}`:""}`,onClick:()=>{D||(u(e.id),j(!1))},children:[n.jsx("span",{className:`term-tab-dot ${e.running?"run":"exit"}`}),n.jsxs("span",{className:"term-tab-title",children:[D===e.id?n.jsx("input",{autoFocus:!0,className:"term-tab-rename-input",value:N,placeholder:e.title,onClick:s=>s.stopPropagation(),onChange:s=>o(s.target.value),onKeyDown:s=>{if(s.stopPropagation(),s.key==="Enter"&&!s.nativeEvent.isComposing){const l=N.trim();l&&c({type:"rename_terminal",terminalId:e.id,conversationId:e.conversationId,title:l}),C(null)}else s.key==="Escape"&&C(null)},onBlur:()=>C(null)}):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 term-tab-rename",title:a("renameTerminal"),onClick:s=>{s.stopPropagation(),o(e.title),C(e.id)},children:n.jsx(M,{})}),n.jsx("button",{type:"button",className:"term-tab-close",title:a("closeTerminal"),onClick:()=>q(e.id),children:n.jsx(se,{})})]},e.id),G=()=>{v(!0),g(null),d(z)},L=e=>{const s=t.commands[e];s&&(v(!1),g(e),d({name:s.name,command:s.command,cwd:s.cwd??""}))},K=()=>{v(!1),g(null)},_=()=>{const e=m.name.trim(),s=m.command.trim();if(!e||!s)return;const l=m.cwd.trim(),p={name:e,command:s,cwd:l||void 0},$=E?[...t.commands,p]:b!==null?t.commands.map((Q,U)=>U===b?p:Q):t.commands;c({type:"save_commands",commands:$}),K()},J=e=>{if(i===e){const s=t.commands.filter((l,p)=>p!==e);c({type:"save_commands",commands:s}),y(null),f.current&&clearTimeout(f.current)}else y(e),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>y(null),2500)},X=E||b!==null;return n.jsxs("div",{className:"terminal-view",children:[n.jsxs("aside",{className:`term-side term-commands ${h?"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:()=>c({type:"list_commands"}),children:n.jsx(Y,{})}),n.jsx("button",{type:"button",className:"panel-new",title:a("newCommand"),onClick:G,children:n.jsx(P,{})})]})]}),n.jsx("div",{className:"panel-body",children:X?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:m.name,placeholder:a("exampleName"),autoFocus:!0,onChange:e=>d({...m,name:e.target.value})}),n.jsx("label",{htmlFor:"cmd-command",children:a("command")}),n.jsx("input",{id:"cmd-command",className:"cmd-input",value:m.command,placeholder:a("exampleCommand"),onChange:e=>d({...m,command:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&_()}}),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:m.cwd,placeholder:"${pwd}",onChange:e=>d({...m,cwd:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&_()}}),n.jsxs("div",{className:"cmd-form-actions",children:[n.jsx("button",{type:"button",className:"btn",onClick:K,children:a("cancel")}),n.jsx("button",{type:"button",className:"btn primary",disabled:!m.name.trim()||!m.command.trim(),onClick:_,children:a("save")})]})]}):n.jsxs(n.Fragment,{children:[t.commands.length===0&&n.jsx("div",{className:"panel-empty",children:a("noCommands")}),t.commands.map((e,s)=>n.jsxs("div",{className:"cmd-item",children:[n.jsx("button",{type:"button",className:"cmd-run",title:a("clickToRun"),onClick:()=>I(e),children:n.jsx(Z,{})}),n.jsxs("button",{type:"button",className:"cmd-main",title:a("clickToRun"),onClick:()=>I(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:()=>L(s),children:n.jsx(M,{})}),n.jsx("button",{type:"button",className:`cmd-act del ${i===s?"confirm":""}`,title:a("delete"),onClick:()=>J(s),children:i===s?a("confirmQ"):n.jsx(ee,{})})]},s))]})}),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:H,children:n.jsx(P,{})})]}),n.jsxs("div",{className:"panel-body",children:[t.terminals.length===0&&n.jsx("div",{className:"panel-empty",children:a("noTerminal")}),S.map(A),T.length>0&&n.jsxs("div",{className:"term-folder",children:[n.jsxs("button",{type:"button",className:`term-folder-header ${F?"open":""}`,title:a("aiBashGroup"),onClick:()=>R(e=>!e),children:[n.jsx("span",{className:"term-folder-caret",children:F?"▾":"▸"}),n.jsx("span",{className:"term-folder-title",children:a("aiBashGroup")}),n.jsx("span",{className:"term-folder-count",children:T.length})]}),F&&n.jsx("div",{className:"term-folder-body",children:T.map(A)})]})]})]})]}),n.jsxs("div",{className:"term-main",children:[h&&n.jsx("div",{className:"drawer-backdrop",onClick:()=>j(!1)}),n.jsx("button",{type:"button",className:"term-side-toggle",title:a("commands"),onClick:()=>j(e=>!e),children:n.jsx(ne,{})}),t.terminals.length===0?n.jsxs("div",{className:"term-empty",children:[n.jsx(te,{className:"term-empty-icon"}),n.jsx("div",{className:"term-empty-title",children:a("builtinTerminal")}),n.jsx("div",{className:"term-empty-sub",children:a("termEmptySub")})]}):t.terminals.map(e=>n.jsx(re,{conversationId:e.conversationId,terminalId:e.id,command:e.command,cwd:e.cwd,title:e.title,active:e.id===w,send:c,register:x.register},`${e.conversationId}:${e.id}`))]})]})}export{ue as TerminalPanel};