pi-web-ui 0.75.0 → 0.77.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.
@@ -0,0 +1,217 @@
1
+ /**
2
+ * tool-manager.ts — Agent 工具开关的唯一事实源 + 统一出入口(tool_manage)。
3
+ *
4
+ * 背景:工具启用散在 4 种写法里——applyToolGating 只会 terminal_* + edit_soft、
5
+ * “子代理系列”/delegate_task/ask_user_question/markers_list 注册即常驻(无开关)、
6
+ * skills/extensions 走 resourceLoader 过滤(要 reload)、terminalBash 等是行为
7
+ * 分支。本模块只收 **ActiveSet 层**(SDK customTools 经
8
+ * getActiveToolNames/setActiveToolsByName 的启用/禁用,live 生效、无需 reload);
9
+ * skills/extensions(资源过滤,另一生命周期)与行为开关不进此表。
10
+ *
11
+ * 持久化只有 `ClientSettings.disabledAgentTools: string[]`(禁用的工具名);
12
+ * 旧的 terminalToolsEnabled/editSoftEnabled/questionnaireEnabled 作为遗留别名
13
+ * 保留(协议兼容),由本模块的 legacy* helper 双向同步。
14
+ *
15
+ * 纯模块:零 node 依赖(不 import 任何 server 模块),前端可直接 import
16
+ * (vite 构建不断),单测零开销。
17
+ */
18
+ /** 持久终端工具(定义见 terminals.ts,工具名在此唯一登记)。 */
19
+ export const TERMINAL_TOOL_NAMES = [
20
+ "terminal_create",
21
+ "terminal_list",
22
+ "terminal_close",
23
+ "terminal_input",
24
+ "terminal_key",
25
+ "terminal_read",
26
+ "terminal_wait",
27
+ ];
28
+ /** 第一方子代理工具(定义见 subagents.ts,逐个可关)。 */
29
+ export const SUBAGENT_TOOL_NAMES = [
30
+ "subagent_spawn",
31
+ "subagent_get_result",
32
+ "subagent_steer",
33
+ "subagent_list",
34
+ "subagent_stop",
35
+ "subagent_wait_all",
36
+ "subagent_templates",
37
+ ];
38
+ /** 独立宽松编辑工具(定义见 edit-soft-tool.ts)。 */
39
+ export const EDIT_SOFT_TOOL_NAME = "edit_soft";
40
+ /** 结构化派单工具(定义见 delegate-task.ts,执行体复用子代理 spawn 通道)。 */
41
+ export const DELEGATE_TASK_TOOL_NAME = "delegate_task";
42
+ /** 问卷提问工具(定义见 agent-service.ts makeAskUserQuestionTool)。 */
43
+ export const ASK_USER_QUESTION_TOOL_NAME = "ask_user_question";
44
+ /** 任务列表只读查询工具(定义见 agent-service.ts makeMarkersListTool;只服务 todo)。
45
+ * 曾用名 markers_list(名过其实,已迁移,见 normalizeDisabledAgentTools)。 */
46
+ export const MARKERS_LIST_TOOL_NAME = "todo_list";
47
+ /** 旧工具名(持久化迁移用;新代码一律用 MARKERS_LIST_TOOL_NAME)。 */
48
+ export const LEGACY_MARKERS_LIST_TOOL_NAME = "markers_list";
49
+ /** 可开关的 Agent 工具总目录(共 18 个;bash 本体与 SDK 内置 edit/read
50
+ * 不进目录——关了 agent 就残了,不给关)。 */
51
+ export const AGENT_TOOL_CATALOG = [
52
+ ...TERMINAL_TOOL_NAMES.map((name) => ({
53
+ name,
54
+ group: "terminal",
55
+ defaultOn: false,
56
+ dshVisible: true,
57
+ })),
58
+ ...SUBAGENT_TOOL_NAMES.map((name) => ({
59
+ name,
60
+ group: "subagent",
61
+ defaultOn: true,
62
+ dshVisible: false,
63
+ })),
64
+ { name: EDIT_SOFT_TOOL_NAME, group: "other", defaultOn: false, dshVisible: false },
65
+ { name: DELEGATE_TASK_TOOL_NAME, group: "other", defaultOn: true, dshVisible: false },
66
+ { name: ASK_USER_QUESTION_TOOL_NAME, group: "other", defaultOn: true, dshVisible: true },
67
+ { name: MARKERS_LIST_TOOL_NAME, group: "other", defaultOn: true, dshVisible: true },
68
+ ];
69
+ const KNOWN_NAMES = new Set(AGENT_TOOL_CATALOG.map((t) => t.name));
70
+ /** 是否为本表登记的可开关工具(未知名一律 false,不抛错)。 */
71
+ export function isKnownAgentTool(name) {
72
+ return KNOWN_NAMES.has(name);
73
+ }
74
+ /** 归一化禁用名单:非数组回落默认(= 默认关的那些);数组则只保留已知工具名
75
+ * (去重;未知名丢弃,防旧文件/手写脏数据污染)。 */
76
+ export function normalizeDisabledAgentTools(v) {
77
+ if (!Array.isArray(v))
78
+ return defaultDisabledAgentTools();
79
+ const out = [];
80
+ for (const x of v) {
81
+ // 旧名迁移:markers_list → todo_list(改名前已关闭的用户保持关闭)。
82
+ const name = x === LEGACY_MARKERS_LIST_TOOL_NAME ? MARKERS_LIST_TOOL_NAME : x;
83
+ if (typeof name === "string" && KNOWN_NAMES.has(name) && !out.includes(name))
84
+ out.push(name);
85
+ }
86
+ return out;
87
+ }
88
+ /** 默认禁用名单(= 目录里 defaultOn=false 的那些)。 */
89
+ export function defaultDisabledAgentTools() {
90
+ return AGENT_TOOL_CATALOG.filter((t) => !t.defaultOn).map((t) => t.name);
91
+ }
92
+ /** 单个工具是否启用(禁用名单里没有 = 启用)。 */
93
+ export function isAgentToolEnabled(name, disabled) {
94
+ return !disabled.includes(name);
95
+ }
96
+ /**
97
+ * 统一出入口 tool_manage:开关任意一个已登记的工具(live 生效,无需 reload;
98
+ * 工具仍留在注册表,重开可直接加回)。未知工具名返回 false(不抛错,
99
+ * 调用方据此给 AI/用户报错);session 未就绪同样返回 false。
100
+ */
101
+ export function setAgentToolEnabled(session, name, on) {
102
+ if (!isKnownAgentTool(name))
103
+ return false;
104
+ try {
105
+ const names = new Set(session.getActiveToolNames());
106
+ if (on)
107
+ names.add(name);
108
+ else
109
+ names.delete(name);
110
+ session.setActiveToolsByName([...names]);
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ /** 批量版(组头全开/全关用;含未知名时照常处理已知部分,返回实际处理数)。 */
118
+ export function setAgentToolsEnabled(session, names, on) {
119
+ const known = names.filter(isKnownAgentTool);
120
+ if (known.length === 0)
121
+ return 0;
122
+ try {
123
+ const active = new Set(session.getActiveToolNames());
124
+ for (const n of known) {
125
+ if (on)
126
+ active.add(n);
127
+ else
128
+ active.delete(n);
129
+ }
130
+ session.setActiveToolsByName([...active]);
131
+ return known.length;
132
+ }
133
+ catch {
134
+ return 0;
135
+ }
136
+ }
137
+ /**
138
+ * 全量重放(创建会话 / reload 后 / 设置变更后调):按禁用名单把目录内工具
139
+ * 逐个加回或剔除;目录外的工具(bash/SDK 内置/插件工具)原样不动。
140
+ * Session 未就绪时静默跳过(下次创建/reload 会再应用)。
141
+ */
142
+ export function applyAgentToolsGating(session, disabled) {
143
+ try {
144
+ const off = new Set(disabled);
145
+ const names = new Set(session.getActiveToolNames());
146
+ for (const t of AGENT_TOOL_CATALOG) {
147
+ if (off.has(t.name))
148
+ names.delete(t.name);
149
+ else
150
+ names.add(t.name);
151
+ }
152
+ session.setActiveToolsByName([...names]);
153
+ }
154
+ catch {
155
+ // Session 未就绪——下次创建/reload 会再应用。
156
+ }
157
+ }
158
+ /**
159
+ * 旧存档迁移:已有新字段直接归一化;否则按遗留三开关折算
160
+ * (语义与改动前一致:terminal/edit 未设/关 = 禁用对应组;问卷未设/开 = 启用)。
161
+ */
162
+ export function legacyToDisabled(s) {
163
+ if (Array.isArray(s.disabledAgentTools))
164
+ return normalizeDisabledAgentTools(s.disabledAgentTools);
165
+ const off = [];
166
+ if (s.terminalToolsEnabled !== true)
167
+ off.push(...TERMINAL_TOOL_NAMES);
168
+ if (s.editSoftEnabled !== true)
169
+ off.push(EDIT_SOFT_TOOL_NAME);
170
+ if (s.questionnaireEnabled === false)
171
+ off.push(ASK_USER_QUESTION_TOOL_NAME);
172
+ return normalizeDisabledAgentTools(off);
173
+ }
174
+ /** 由禁用名单推导遗留三开关(协议兼容用;终端组按“全开才算开”的全有/全无视图)。 */
175
+ export function deriveLegacy(disabled) {
176
+ const off = new Set(disabled);
177
+ return {
178
+ terminalToolsEnabled: TERMINAL_TOOL_NAMES.every((n) => !off.has(n)),
179
+ editSoftEnabled: !off.has(EDIT_SOFT_TOOL_NAME),
180
+ questionnaireEnabled: !off.has(ASK_USER_QUESTION_TOOL_NAME),
181
+ };
182
+ }
183
+ /**
184
+ * 遗留单开关写入时折回新字段(只动开关覆盖的组,其余条目原样保留):
185
+ * 传 true = 把该组从禁用名单移除,false = 加入,未传 = 不动。
186
+ */
187
+ export function foldLegacyIntoDisabled(current, legacy) {
188
+ const next = new Set(normalizeDisabledAgentTools(current));
189
+ const applyGroup = (names, v) => {
190
+ if (v === undefined)
191
+ return;
192
+ for (const n of names) {
193
+ if (v)
194
+ next.delete(n);
195
+ else
196
+ next.add(n);
197
+ }
198
+ };
199
+ applyGroup(TERMINAL_TOOL_NAMES, legacy.terminalToolsEnabled);
200
+ applyGroup([EDIT_SOFT_TOOL_NAME], legacy.editSoftEnabled);
201
+ applyGroup([ASK_USER_QUESTION_TOOL_NAME], legacy.questionnaireEnabled);
202
+ return [...next];
203
+ }
204
+ /**
205
+ * 门控实效名单:新字段 + 问卷别名合并(问卷关 = ask 工具必关,双保险;
206
+ * 两处平时由 set() 同步一致,合并只防陈旧会话/旧客户端的半边状态)。
207
+ */
208
+ export function effectiveDisabledAgentTools(s) {
209
+ const next = new Set(legacyToDisabled({ ...s, disabledAgentTools: s.disabledAgentTools }));
210
+ if (s.questionnaireEnabled === false)
211
+ next.add(ASK_USER_QUESTION_TOOL_NAME);
212
+ return [...next];
213
+ }
214
+ /** 终端使用引导是否注入(组内有任一工具启用才教 AI 用,否则就是教不存在的工具)。 */
215
+ export function isTerminalGuidanceOn(disabled) {
216
+ return TERMINAL_TOOL_NAMES.some((n) => !disabled.includes(n));
217
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-web-ui",
3
- "version": "0.75.0",
3
+ "version": "0.77.0",
4
4
  "description": "Web chat interface for the pi coding agent, powered by the pi SDK (@earendil-works/pi-coding-agent) — one-command run, Docker/systemd/launchd deployable",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -0,0 +1,6 @@
1
+ import{a as l,j as n}from"./markdown-Cpo0pNcR.js";import{u as P,b as O,T as M,a as p,c as W,F as Y,d as z,e as Z,f as H,g as ee,h as ne,i as te,j as se,r as ae}from"./index-BsATrxLx.js";import{D as re,o as ie}from"./xterm-B96xOxS9.js";import"./react-CtudoG1_.js";function le(t){let c=null;return{clean:t.replace(/\r?\n?\[pi-term-exit:(-?\d+)\]\r?\n?/g,(h,u)=>(c=Number(u),`\r
2
+ `)).replace(/\r?\n?\x1b\[90m\[(?:进程已退出,退出码 |Process exited with code )-?\d+\]\x1b\[0m\r?\n?/g,`\r
3
+ `),exitCode:c}}function ce({conversationId:t,terminalId:c,command:s,cwd:h,title:u,active:w,running:f,exitCode:k,register:g}){const C=l.useRef(null),j=l.useRef(null),{locale:o}=P(),y=l.useRef(o);y.current=o;const E=s?JSON.stringify(s):"";l.useEffect(()=>{const m=C.current;if(!m)return;const r=new re({theme:O(),fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),v=new ie;r.loadAddon(v),r.open(m),j.current={term:r,fit:v},w&&r.focus();const b=()=>{r.options.theme=O()};window.addEventListener(M,b),r.attachCustomKeyEventHandler(d=>{if(d.type!=="keydown")return!0;const S=d.key?.toLowerCase();if((d.ctrlKey||d.metaKey)&&S==="v")return!1;if(d.ctrlKey&&!d.shiftKey&&!d.altKey&&S==="c"&&r.hasSelection()){const D=r.textarea;return D&&(D.value=r.getSelection(),D.select()),!1}return!0});const _=g(t,c,{write:d=>r.write(le(d).clean),dispose:()=>r.dispose()}),$=()=>{try{v.fit(),p({type:"terminal_resize",terminalId:c,conversationId:t,cols:r.cols,rows:r.rows})}catch{}},B=requestAnimationFrame(()=>{try{v.fit()}catch{}s?p({type:"run_command",terminalId:c,conversationId:t,command:s,cols:r.cols,rows:r.rows}):p({type:"terminal_create",terminalId:c,title:u,locale:y.current,conversationId:t,cwd:h,cols:r.cols,rows:r.rows})}),R=r.onData(d=>{p({type:"terminal_input",terminalId:c,conversationId:t,data:d})});let T=null;return typeof ResizeObserver<"u"&&(T=new ResizeObserver(()=>{m.offsetWidth>0&&m.offsetHeight>0&&$()}),T.observe(m)),()=>{cancelAnimationFrame(B),R.dispose(),window.removeEventListener(M,b),T?.disconnect(),_(),r.dispose(),j.current=null}},[t,c,E,g]),l.useEffect(()=>{if(!w)return;const m=requestAnimationFrame(()=>{const r=j.current;if(r){try{r.fit.fit(),p({type:"terminal_resize",terminalId:c,conversationId:t,cols:r.term.cols,rows:r.term.rows})}catch{}r.term.focus()}});return()=>cancelAnimationFrame(m)},[w]);const{t:F}=P(),x=l.useRef(void 0);return l.useEffect(()=>{if(f===x.current||(x.current=f,f!==!1))return;const m=j.current;m&&m.term.write(`\r
4
+ \x1B[90m${F("exitBanner",{code:k??""})}\x1B[0m\r
5
+ `)},[f,c,k]),n.jsx("div",{ref:C,className:`term-xterm ${w?"":"hidden"}`})}const q={name:"",command:"",cwd:"${pwd}"};function pe({chat:t,terminal:c}){const s=W(),[h,u]=l.useState(null),[w,f]=l.useState(!1),[k,g]=l.useState(!1),[C,j]=l.useState(null),[o,y]=l.useState(q),[E,F]=l.useState(null),x=l.useRef(null),[m,r]=l.useState(!0),[v,b]=l.useState(null),[_,$]=l.useState("");l.useEffect(()=>{t.terminals.length===0?u(null):t.terminals.some(e=>e.id===h)||u(t.terminals[t.terminals.length-1].id)},[t.terminals,h]),l.useEffect(()=>{t.terminalActiveId&&(u(t.terminalActiveId),f(!1))},[t.terminalActiveId]),l.useEffect(()=>()=>{x.current&&clearTimeout(x.current)},[]);const B=t.terminals.filter(e=>!e.agentBash),R=t.terminals.filter(e=>e.agentBash),T=e=>{if(!t.ready)return;const a=ae(),i=t.activeConversationId||t.state?.conversationId||"";c.create({...e,id:a,conversationId:i,cols:e.cols??80,rows:e.rows??24,running:!0,exitCode:null}),u(a),f(!1)},d=()=>T({title:s("terminalTitle",{n:B.length+1}),cwd:t.state?.cwd??""}),S=e=>{const a=e.name||e.command,i=t.terminals.find(N=>N.title===a);if(i){c.restart(i.id),u(i.id),p({type:"run_command",terminalId:i.id,conversationId:i.conversationId,command:e,cols:80,rows:24});return}T({title:a,cwd:t.state?.cwd??"",command:e})},D=e=>{const a=t.terminals.find(i=>i.id===e);if(a&&p({type:"terminal_kill",terminalId:e,conversationId:a.conversationId}),c.close(e),h===e){const i=t.terminals.filter(N=>N.id!==e);u(i.length>0?i[i.length-1].id:null)}},I=e=>n.jsxs("div",{className:`term-tab ${e.id===h?"active":""}`,children:[n.jsxs("button",{type:"button",className:"term-tab-main",title:`${e.cwd}${e.command?`
6
+ > ${e.command.command}`:""}`,onClick:()=>{v||(u(e.id),f(!1))},children:[n.jsx("span",{className:`term-tab-dot ${e.running?"run":"exit"}`}),n.jsxs("span",{className:"term-tab-title",children:[v===e.id?n.jsx("input",{autoFocus:!0,className:"term-tab-rename-input",value:_,placeholder:e.title,onClick:a=>a.stopPropagation(),onChange:a=>$(a.target.value),onKeyDown:a=>{if(a.stopPropagation(),a.key==="Enter"&&!a.nativeEvent.isComposing){const i=_.trim();i&&p({type:"rename_terminal",terminalId:e.id,conversationId:e.conversationId,title:i}),b(null)}else a.key==="Escape"&&b(null)},onBlur:()=>b(null)}):e.title,!e.running&&n.jsx("span",{className:"term-tab-exit",children:s("exited",{code:e.exitCode===null?"":` ${e.exitCode}`})})]})]}),n.jsx("button",{type:"button",className:"term-tab-close term-tab-rename",title:s("renameTerminal"),onClick:a=>{a.stopPropagation(),$(e.title),b(e.id)},children:n.jsx(H,{})}),n.jsx("button",{type:"button",className:"term-tab-close",title:s("closeTerminal"),onClick:()=>D(e.id),children:n.jsx(se,{})})]},e.id),G=()=>{g(!0),j(null),y(q)},L=e=>{const a=t.commands[e];a&&(g(!1),j(e),y({name:a.name,command:a.command,cwd:a.cwd??""}))},K=()=>{g(!1),j(null)},A=()=>{const e=o.name.trim(),a=o.command.trim();if(!e||!a)return;const i=o.cwd.trim(),N={name:e,command:a,cwd:i||void 0},Q=k?[...t.commands,N]:C!==null?t.commands.map((U,V)=>V===C?N:U):t.commands;p({type:"save_commands",commands:Q}),K()},J=e=>{if(E===e){const a=t.commands.filter((i,N)=>N!==e);p({type:"save_commands",commands:a}),F(null),x.current&&clearTimeout(x.current)}else F(e),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>F(null),2500)},X=k||C!==null;return n.jsxs("div",{className:"terminal-view",children:[n.jsxs("aside",{className:`term-side term-commands ${w?"open":""}`,children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:s("commands")}),n.jsxs("div",{className:"panel-header-actions",children:[n.jsx("button",{type:"button",className:"panel-refresh",title:s("rerun"),onClick:()=>p({type:"list_commands"}),children:n.jsx(Y,{})}),n.jsx("button",{type:"button",className:"panel-new",title:s("newCommand"),onClick:G,children:n.jsx(z,{})})]})]}),n.jsx("div",{className:"panel-body",children:X?n.jsxs("div",{className:"cmd-form",children:[n.jsx("label",{htmlFor:"cmd-name",children:s("name")}),n.jsx("input",{id:"cmd-name",className:"cmd-input",value:o.name,placeholder:s("exampleName"),autoFocus:!0,onChange:e=>y({...o,name:e.target.value})}),n.jsx("label",{htmlFor:"cmd-command",children:s("command")}),n.jsx("input",{id:"cmd-command",className:"cmd-input",value:o.command,placeholder:s("exampleCommand"),onChange:e=>y({...o,command:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&A()}}),n.jsxs("label",{htmlFor:"cmd-cwd",children:[s("directory")," ",n.jsx("span",{className:"cmd-hint",children:s("cwdHint")})]}),n.jsx("input",{id:"cmd-cwd",className:"cmd-input",value:o.cwd,placeholder:"${pwd}",onChange:e=>y({...o,cwd:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&A()}}),n.jsxs("div",{className:"cmd-form-actions",children:[n.jsx("button",{type:"button",className:"btn",onClick:K,children:s("cancel")}),n.jsx("button",{type:"button",className:"btn primary",disabled:!o.name.trim()||!o.command.trim(),onClick:A,children:s("save")})]})]}):n.jsxs(n.Fragment,{children:[t.commands.length===0&&n.jsx("div",{className:"panel-empty",children:s("noCommands")}),t.commands.map((e,a)=>n.jsxs("div",{className:"cmd-item",children:[n.jsx("button",{type:"button",className:"cmd-run",title:s("clickToRun"),onClick:()=>S(e),children:n.jsx(Z,{})}),n.jsxs("button",{type:"button",className:"cmd-main",title:s("clickToRun"),onClick:()=>S(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:s("edit"),onClick:()=>L(a),children:n.jsx(H,{})}),n.jsx("button",{type:"button",className:`cmd-act del ${E===a?"confirm":""}`,title:s("delete"),onClick:()=>J(a),children:E===a?s("confirmQ"):n.jsx(ee,{})})]},a))]})}),n.jsxs("div",{className:"term-tabs-block",children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:s("terminal")}),n.jsx("button",{type:"button",className:"panel-new",title:s("newTerminal"),onClick:d,children:n.jsx(z,{})})]}),n.jsxs("div",{className:"panel-body",children:[t.terminals.length===0&&n.jsx("div",{className:"panel-empty",children:s("noTerminal")}),B.map(I),R.length>0&&n.jsxs("div",{className:"term-folder",children:[n.jsxs("button",{type:"button",className:`term-folder-header ${m?"open":""}`,title:s("aiBashGroup"),onClick:()=>r(e=>!e),children:[n.jsx("span",{className:"term-folder-caret",children:m?"▾":"▸"}),n.jsx("span",{className:"term-folder-title",children:s("aiBashGroup")}),n.jsx("span",{className:"term-folder-count",children:R.length})]}),m&&n.jsx("div",{className:"term-folder-body",children:R.map(I)})]})]})]})]}),n.jsxs("div",{className:"term-main",children:[w&&n.jsx("div",{className:"drawer-backdrop",onClick:()=>f(!1)}),n.jsx("button",{type:"button",className:"term-side-toggle",title:s("commands"),onClick:()=>f(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:s("builtinTerminal")}),n.jsx("div",{className:"term-empty-sub",children:s("termEmptySub")})]}):t.terminals.map(e=>n.jsx(ce,{conversationId:e.conversationId,terminalId:e.id,command:e.command,cwd:e.cwd,title:e.title,active:e.id===h,running:e.running,exitCode:e.exitCode,register:c.register},`${e.conversationId}:${e.id}`))]})]})}export{pe as TerminalPanel};