ai-cli-online 2.1.3 → 2.2.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/README.md +3 -1
- package/README.zh-CN.md +5 -1
- package/package.json +1 -1
- package/server/dist/index.js +44 -0
- package/server/dist/pty.js +1 -1
- package/server/dist/tmux.js +9 -9
- package/server/package.json +1 -1
- package/shared/package.json +1 -1
- package/web/dist/assets/index-DpLQJExV.js +38 -0
- package/web/dist/index.html +1 -1
- package/web/package.json +1 -1
- package/web/dist/assets/index-BjydL1Uc.js +0 -38
package/README.md
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](https://nodejs.org/)
|
|
6
6
|
|
|
7
|
-
A lightweight web terminal for accessing Claude Code / Codex or any CLI from your browser.
|
|
7
|
+
A lightweight web terminal for accessing Claude Code / Codex or any CLI from your browser.
|
|
8
|
+
|
|
9
|
+
Ideal for **unstable networks** where SSH drops frequently, or as a **local stateful terminal** that preserves sessions, layouts, and drafts across refreshes.
|
|
8
10
|
|
|
9
11
|
**npm:** https://www.npmjs.com/package/ai-cli-online | **GitHub:** https://github.com/huacheng/ai-cli-online
|
|
10
12
|
|
package/README.zh-CN.md
CHANGED
|
@@ -4,12 +4,16 @@
|
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](https://nodejs.org/)
|
|
6
6
|
|
|
7
|
-
轻量级 Web
|
|
7
|
+
轻量级 Web 终端,在浏览器中访问 Claude Code / Codex 或任意 CLI。
|
|
8
|
+
|
|
9
|
+
适合**网络不稳定、SSH 经常断线**的场景,也可作为**本地有状态终端**使用 — 会话、布局和草稿在刷新后自动恢复。
|
|
8
10
|
|
|
9
11
|
**npm:** https://www.npmjs.com/package/ai-cli-online | **GitHub:** https://github.com/huacheng/ai-cli-online
|
|
10
12
|
|
|
11
13
|
[**English**](README.md)
|
|
12
14
|
|
|
15
|
+

|
|
16
|
+
|
|
13
17
|
## 功能特性
|
|
14
18
|
|
|
15
19
|
- **完整 Web 终端** — xterm.js + WebGL 渲染,二进制协议实现超低延迟
|
package/package.json
CHANGED
package/server/dist/index.js
CHANGED
|
@@ -327,6 +327,50 @@ async function main() {
|
|
|
327
327
|
saveSetting(tokenHash(token), 'font-size', String(fontSize));
|
|
328
328
|
res.json({ ok: true });
|
|
329
329
|
});
|
|
330
|
+
// --- Tabs layout persistence API ---
|
|
331
|
+
app.get('/api/settings/tabs-layout', (req, res) => {
|
|
332
|
+
if (!checkAuth(req, res))
|
|
333
|
+
return;
|
|
334
|
+
const token = extractToken(req) || 'default';
|
|
335
|
+
const value = getSetting(tokenHash(token), 'tabs-layout');
|
|
336
|
+
let layout = null;
|
|
337
|
+
if (value) {
|
|
338
|
+
try {
|
|
339
|
+
layout = JSON.parse(value);
|
|
340
|
+
}
|
|
341
|
+
catch { /* corrupt data */ }
|
|
342
|
+
}
|
|
343
|
+
res.json({ layout });
|
|
344
|
+
});
|
|
345
|
+
app.put('/api/settings/tabs-layout', (req, res) => {
|
|
346
|
+
const { layout, token: bodyToken } = req.body;
|
|
347
|
+
// Support both Authorization header and body token (for sendBeacon)
|
|
348
|
+
let token;
|
|
349
|
+
if (AUTH_TOKEN) {
|
|
350
|
+
token = extractToken(req);
|
|
351
|
+
if (!token && bodyToken) {
|
|
352
|
+
// sendBeacon path: validate token from body
|
|
353
|
+
if (!safeTokenCompare(bodyToken, AUTH_TOKEN)) {
|
|
354
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
token = bodyToken;
|
|
358
|
+
}
|
|
359
|
+
if (!token) {
|
|
360
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
token = extractToken(req) || bodyToken || 'default';
|
|
366
|
+
}
|
|
367
|
+
if (!layout || typeof layout !== 'object') {
|
|
368
|
+
res.status(400).json({ error: 'layout must be an object' });
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
saveSetting(tokenHash(token), 'tabs-layout', JSON.stringify(layout));
|
|
372
|
+
res.json({ ok: true });
|
|
373
|
+
});
|
|
330
374
|
// --- Document browser: file content API ---
|
|
331
375
|
const MAX_DOC_SIZE = 10 * 1024 * 1024; // 10MB
|
|
332
376
|
const PDF_EXTENSIONS = new Set(['.pdf']);
|
package/server/dist/pty.js
CHANGED
|
@@ -21,7 +21,7 @@ export class PtySession {
|
|
|
21
21
|
exitListeners = [];
|
|
22
22
|
alive = true;
|
|
23
23
|
constructor(sessionName, cols, rows) {
|
|
24
|
-
this.proc = pty.spawn('tmux', ['attach-session', '-t', sessionName], {
|
|
24
|
+
this.proc = pty.spawn('tmux', ['attach-session', '-t', `=${sessionName}`], {
|
|
25
25
|
name: 'xterm-256color',
|
|
26
26
|
cols,
|
|
27
27
|
rows,
|
package/server/dist/tmux.js
CHANGED
|
@@ -25,7 +25,7 @@ export function buildSessionName(token, sessionId) {
|
|
|
25
25
|
/** Check if a tmux session exists */
|
|
26
26
|
export async function hasSession(name) {
|
|
27
27
|
try {
|
|
28
|
-
await execFile('tmux', ['has-session', '-t', name]);
|
|
28
|
+
await execFile('tmux', ['has-session', '-t', `=${name}`]);
|
|
29
29
|
return true;
|
|
30
30
|
}
|
|
31
31
|
catch {
|
|
@@ -43,9 +43,9 @@ export async function createSession(name, cols, rows, cwd) {
|
|
|
43
43
|
], { cwd });
|
|
44
44
|
// Configure tmux for web terminal usage (parallel for faster session creation)
|
|
45
45
|
await Promise.all([
|
|
46
|
-
execFile('tmux', ['set-option', '-t', name
|
|
47
|
-
execFile('tmux', ['set-option', '-t', name
|
|
48
|
-
execFile('tmux', ['set-option', '-t', name
|
|
46
|
+
execFile('tmux', ['set-option', '-t', `=${name}`, 'history-limit', '50000']).catch(() => { }),
|
|
47
|
+
execFile('tmux', ['set-option', '-t', `=${name}`, 'status', 'off']).catch(() => { }),
|
|
48
|
+
execFile('tmux', ['set-option', '-t', `=${name}`, 'mouse', 'off']).catch(() => { }),
|
|
49
49
|
]);
|
|
50
50
|
console.log(`[tmux] Created session: ${name} (${cols}x${rows}) in ${cwd}`);
|
|
51
51
|
}
|
|
@@ -57,7 +57,7 @@ export async function captureScrollback(name) {
|
|
|
57
57
|
try {
|
|
58
58
|
const { stdout } = await execFile('tmux', [
|
|
59
59
|
'capture-pane',
|
|
60
|
-
'-t', name
|
|
60
|
+
'-t', `=${name}`,
|
|
61
61
|
'-p',
|
|
62
62
|
'-e',
|
|
63
63
|
'-S', '-10000',
|
|
@@ -74,7 +74,7 @@ export async function resizeSession(name, cols, rows) {
|
|
|
74
74
|
try {
|
|
75
75
|
await execFile('tmux', [
|
|
76
76
|
'resize-window',
|
|
77
|
-
'-t', name
|
|
77
|
+
'-t', `=${name}`,
|
|
78
78
|
'-x', String(cols),
|
|
79
79
|
'-y', String(rows),
|
|
80
80
|
]);
|
|
@@ -86,7 +86,7 @@ export async function resizeSession(name, cols, rows) {
|
|
|
86
86
|
/** Kill a tmux session */
|
|
87
87
|
export async function killSession(name) {
|
|
88
88
|
try {
|
|
89
|
-
await execFile('tmux', ['kill-session', '-t', name]);
|
|
89
|
+
await execFile('tmux', ['kill-session', '-t', `=${name}`]);
|
|
90
90
|
console.log(`[tmux] Killed session: ${name}`);
|
|
91
91
|
}
|
|
92
92
|
catch {
|
|
@@ -163,7 +163,7 @@ export async function cleanupStaleSessions(ttlHours) {
|
|
|
163
163
|
/** 获取 tmux session 当前活动 pane 的工作目录 */
|
|
164
164
|
export async function getCwd(sessionName) {
|
|
165
165
|
const { stdout } = await execFile('tmux', [
|
|
166
|
-
'display-message', '-p', '-t', sessionName
|
|
166
|
+
'display-message', '-p', '-t', `=${sessionName}`, '#{pane_current_path}',
|
|
167
167
|
], { encoding: 'utf-8' });
|
|
168
168
|
return stdout.trim();
|
|
169
169
|
}
|
|
@@ -171,7 +171,7 @@ export async function getCwd(sessionName) {
|
|
|
171
171
|
export async function getPaneCommand(sessionName) {
|
|
172
172
|
try {
|
|
173
173
|
const { stdout } = await execFile('tmux', [
|
|
174
|
-
'display-message', '-p', '-t', sessionName
|
|
174
|
+
'display-message', '-p', '-t', `=${sessionName}`, '#{pane_current_command}',
|
|
175
175
|
], { encoding: 'utf-8' });
|
|
176
176
|
return stdout.trim();
|
|
177
177
|
}
|
package/server/package.json
CHANGED
package/shared/package.json
CHANGED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var st=Object.defineProperty;var it=(t,e,n)=>e in t?st(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var Se=(t,e,n)=>it(t,typeof e!="symbol"?e+"":e,n);import{r as d,a as at,g as lt,R as ye}from"./react-vendor-BCIvbQoU.js";import{D as Pe,o as Fe,x as ct}from"./terminal-CFozNkMS.js";import{d as dt,p as ut}from"./markdown-BERZKN_L.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const c of a.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&r(c)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();var Be={exports:{}},ce={};/**
|
|
2
|
+
* @license React
|
|
3
|
+
* react-jsx-runtime.production.min.js
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/var ft=d,pt=Symbol.for("react.element"),mt=Symbol.for("react.fragment"),ht=Object.prototype.hasOwnProperty,xt=ft.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,bt={key:!0,ref:!0,__self:!0,__source:!0};function We(t,e,n){var r,o={},a=null,c=null;n!==void 0&&(a=""+n),e.key!==void 0&&(a=""+e.key),e.ref!==void 0&&(c=e.ref);for(r in e)ht.call(e,r)&&!bt.hasOwnProperty(r)&&(o[r]=e[r]);if(t&&t.defaultProps)for(r in e=t.defaultProps,e)o[r]===void 0&&(o[r]=e[r]);return{$$typeof:pt,type:t,key:a,ref:c,props:o,_owner:xt.current}}ce.Fragment=mt;ce.jsx=We;ce.jsxs=We;Be.exports=ce;var s=Be.exports,xe={},Te=at;xe.createRoot=Te.createRoot,xe.hydrateRoot=Te.hydrateRoot;const yt={},ke=t=>{let e;const n=new Set,r=(u,f)=>{const m=typeof u=="function"?u(e):u;if(!Object.is(m,e)){const h=e;e=f??(typeof m!="object"||m===null)?m:Object.assign({},e,m),n.forEach(x=>x(e,h))}},o=()=>e,l={setState:r,getState:o,getInitialState:()=>p,subscribe:u=>(n.add(u),()=>n.delete(u)),destroy:()=>{n.clear()}},p=e=t(r,o,l);return l},gt=t=>t?ke(t):ke;var Ue={exports:{}},He={},Ve={exports:{}},Ge={};/**
|
|
10
|
+
* @license React
|
|
11
|
+
* use-sync-external-store-shim.production.js
|
|
12
|
+
*
|
|
13
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*/var te=d;function wt(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var vt=typeof Object.is=="function"?Object.is:wt,St=te.useState,Tt=te.useEffect,kt=te.useLayoutEffect,It=te.useDebugValue;function Ct(t,e){var n=e(),r=St({inst:{value:n,getSnapshot:e}}),o=r[0].inst,a=r[1];return kt(function(){o.value=n,o.getSnapshot=e,me(o)&&a({inst:o})},[t,n,e]),Tt(function(){return me(o)&&a({inst:o}),t(function(){me(o)&&a({inst:o})})},[t]),It(n),n}function me(t){var e=t.getSnapshot;t=t.value;try{var n=e();return!vt(t,n)}catch{return!0}}function jt(t,e){return e()}var Et=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?jt:Ct;Ge.useSyncExternalStore=te.useSyncExternalStore!==void 0?te.useSyncExternalStore:Et;Ve.exports=Ge;var Rt=Ve.exports;/**
|
|
18
|
+
* @license React
|
|
19
|
+
* use-sync-external-store-shim/with-selector.production.js
|
|
20
|
+
*
|
|
21
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
22
|
+
*
|
|
23
|
+
* This source code is licensed under the MIT license found in the
|
|
24
|
+
* LICENSE file in the root directory of this source tree.
|
|
25
|
+
*/var de=d,Lt=Rt;function zt(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var Dt=typeof Object.is=="function"?Object.is:zt,Mt=Lt.useSyncExternalStore,Nt=de.useRef,_t=de.useEffect,At=de.useMemo,Ot=de.useDebugValue;He.useSyncExternalStoreWithSelector=function(t,e,n,r,o){var a=Nt(null);if(a.current===null){var c={hasValue:!1,value:null};a.current=c}else c=a.current;a=At(function(){function l(h){if(!p){if(p=!0,u=h,h=r(h),o!==void 0&&c.hasValue){var x=c.value;if(o(x,h))return f=x}return f=h}if(x=f,Dt(u,h))return x;var w=r(h);return o!==void 0&&o(x,w)?(u=h,x):(u=h,f=w)}var p=!1,u,f,m=n===void 0?null:n;return[function(){return l(e())},m===null?void 0:function(){return l(m())}]},[e,n,r,o]);var i=Mt(t,a[0],a[1]);return _t(function(){c.hasValue=!0,c.value=i},[i]),Ot(i),i};Ue.exports=He;var $t=Ue.exports;const Pt=lt($t),qe={},{useDebugValue:Ft}=ye,{useSyncExternalStoreWithSelector:Bt}=Pt;let Ie=!1;const Wt=t=>t;function Ut(t,e=Wt,n){(qe?"production":void 0)!=="production"&&n&&!Ie&&(Ie=!0);const r=Bt(t.subscribe,t.getState,t.getServerState||t.getInitialState,e,n);return Ft(r),r}const Ce=t=>{const e=typeof t=="function"?gt(t):t,n=(r,o)=>Ut(e,r,o);return Object.assign(n,e),n},Ht=t=>t?Ce(t):Ce,P="";function U(t){return{Authorization:`Bearer ${t}`}}async function Vt(t){try{const e=await fetch(`${P}/api/settings/font-size`,{headers:U(t)});return e.ok?(await e.json()).fontSize:14}catch{return 14}}async function Gt(t,e){try{await fetch(`${P}/api/settings/font-size`,{method:"PUT",headers:{...U(t),"Content-Type":"application/json"},body:JSON.stringify({fontSize:e})})}catch{}}async function qt(t){try{const e=await fetch(`${P}/api/settings/tabs-layout`,{headers:U(t)});return e.ok?(await e.json()).layout:null}catch{return null}}async function Jt(t,e){try{await fetch(`${P}/api/settings/tabs-layout`,{method:"PUT",headers:{...U(t),"Content-Type":"application/json"},body:JSON.stringify({layout:e})})}catch{}}function je(t,e){try{const n=`${P}/api/settings/tabs-layout`,r=JSON.stringify({layout:e,token:t});navigator.sendBeacon(n,new Blob([r],{type:"application/json"}))}catch{}}const le="ai-cli-online-tabs",Ee="ai-cli-online-layout",Re="ai-cli-online-session-names";function oe(t,e){if(t.type==="leaf")return t.terminalId===e?null:t;const n=[],r=[];for(let c=0;c<t.children.length;c++){const i=oe(t.children[c],e);i!==null&&(n.push(i),r.push(t.sizes[c]))}if(n.length===0)return null;if(n.length===1)return n[0];const o=r.reduce((c,i)=>c+i,0),a=r.map(c=>c/o*100);return{...t,children:n,sizes:a}}function Je(t,e,n,r,o){return t.type==="leaf"?t.terminalId===e?{id:o,type:"split",direction:n,children:[t,r],sizes:[50,50]}:t:{...t,children:t.children.map(a=>Je(a,e,n,r,o))}}function Ke(t,e,n){return t.type==="leaf"?t:t.id===e?{...t,sizes:n}:{...t,children:t.children.map(r=>Ke(r,e,n))}}function he(t){return t.tabs.find(e=>e.id===t.activeTabId)}function X(t,e,n){return t.map(r=>r.id===e?n(r):r)}function V(t){const e={version:2,activeTabId:t.activeTabId,nextId:t.nextId,nextSplitId:t.nextSplitId,nextTabId:t.nextTabId,tabs:t.tabs};try{localStorage.setItem(le,JSON.stringify(e))}catch{}Kt(e)}let se=null,ie=null,Z=null,ne=null;function Kt(t){ne=t,Z&&clearTimeout(Z),Z=setTimeout(()=>{Z=null,ne=null;const e=v.getState().token;e&&Jt(e,t)},2e3)}function Yt(t){se&&clearTimeout(se),se=setTimeout(()=>{se=null,V(t)},500)}function Xt(){try{const t=localStorage.getItem(le);if(t){const e=JSON.parse(t);if(e.version===2)return e}}catch{}try{const t=localStorage.getItem(Ee);if(t){const e=JSON.parse(t);let n="Default";try{const a=localStorage.getItem(Re);if(a){const c=JSON.parse(a),i=Object.values(c)[0];i&&(n=i)}}catch{}const r={id:"tab1",name:n,status:"open",terminalIds:e.terminalIds,layout:e.layout,createdAt:Date.now()},o={version:2,activeTabId:"tab1",nextId:e.nextId,nextSplitId:e.nextSplitId,nextTabId:2,tabs:[r]};try{localStorage.setItem(le,JSON.stringify(o))}catch{}return localStorage.removeItem(Ee),localStorage.removeItem(Re),o}}catch{}return null}function W(t){return{tabs:t.tabs,activeTabId:t.activeTabId,nextId:t.nextId,nextSplitId:t.nextSplitId,nextTabId:t.nextTabId}}function Zt(t,e){const n=new Set(e.map(c=>c.sessionId)),r=[];for(const c of t.tabs){if(c.status!=="open"){const p=c.terminalIds.filter(u=>n.has(u));if(p.length>0){let u=c.layout;for(const f of c.terminalIds)!n.has(f)&&u&&(u=oe(u,f));r.push({...c,terminalIds:p,layout:u})}continue}const i=c.terminalIds.filter(p=>n.has(p));if(i.length===0)continue;let l=c.layout;for(const p of c.terminalIds)!n.has(p)&&l&&(l=oe(l,p));r.push({...c,terminalIds:i,layout:l})}if(r.filter(c=>c.status==="open").length===0)return null;let o=t.activeTabId;if(!r.find(c=>c.id===o&&c.status==="open")){const c=r.find(i=>i.status==="open");o=(c==null?void 0:c.id)||""}return{...t,activeTabId:o,tabs:r}}typeof window<"u"&&window.addEventListener("beforeunload",()=>{var e,n;const t=(n=(e=v==null?void 0:v.getState)==null?void 0:e.call(v))==null?void 0:n.token;if(t)if(ne)Z&&(clearTimeout(Z),Z=null),je(t,ne),ne=null;else{const r=v.getState();r.tabs.length>0&&je(t,W(r))}});const v=Ht((t,e)=>({token:null,tabsLoading:!1,setToken:n=>{if(n){try{localStorage.setItem("ai-cli-online-token",n)}catch{}Vt(n).then(o=>{e().token===n&&t({fontSize:o})});const r=Xt();if(r&&r.tabs.length>0){const o={};for(const i of r.tabs)if(i.status==="open")for(const l of i.terminalIds)o[l]={id:l,connected:!1,sessionResumed:!1,error:null};const a=r.tabs.find(i=>i.id===r.activeTabId&&i.status==="open")||r.tabs.find(i=>i.status==="open"),c=(a==null?void 0:a.id)||"";t({token:n,tabsLoading:!0,terminalsMap:o,tabs:r.tabs,activeTabId:c,nextId:r.nextId,nextSplitId:r.nextSplitId,nextTabId:r.nextTabId,terminalIds:(a==null?void 0:a.terminalIds)||[],layout:(a==null?void 0:a.layout)||null})}else t({token:n,tabsLoading:!0,terminalsMap:{},tabs:[],activeTabId:"",nextId:1,nextSplitId:1,nextTabId:1,terminalIds:[],layout:null});Qt(n,r);return}localStorage.removeItem("ai-cli-online-token"),localStorage.removeItem(le),t({token:n,tabsLoading:!1,terminalsMap:{},tabs:[],activeTabId:"",nextId:1,nextSplitId:1,nextTabId:1,terminalIds:[],layout:null})},terminalsMap:{},terminalIds:[],layout:null,nextId:1,nextSplitId:1,tabs:[],activeTabId:"",nextTabId:1,addTab:n=>{const r=e(),o=`tab${r.nextTabId}`,a=`t${r.nextId}`,c={id:a,connected:!1,sessionResumed:!1,error:null},i={type:"leaf",terminalId:a},l={id:o,name:n||`Tab ${r.nextTabId}`,status:"open",terminalIds:[a],layout:i,createdAt:Date.now()};return t({tabs:[...r.tabs,l],activeTabId:o,nextTabId:r.nextTabId+1,nextId:r.nextId+1,terminalsMap:{...r.terminalsMap,[a]:c},terminalIds:l.terminalIds,layout:l.layout}),V(W(e())),o},switchTab:n=>{const o=e().tabs.find(a=>a.id===n);!o||o.status!=="open"||(t({activeTabId:n,terminalIds:o.terminalIds,layout:o.layout}),V(W(e())))},closeTab:n=>{const r=e(),o=r.tabs.find(f=>f.id===n);if(!o||o.status!=="open"||r.tabs.filter(f=>f.status==="open").length<=1)return;const c={...r.terminalsMap};for(const f of o.terminalIds)delete c[f];const i=X(r.tabs,n,f=>({...f,status:"closed"}));let l=r.activeTabId,p=r.terminalIds,u=r.layout;if(r.activeTabId===n){const f=r.tabs.findIndex(x=>x.id===n),m=i.filter(x=>x.status==="open"),h=m.find(x=>i.findIndex(k=>k.id===x.id)>f)||m[m.length-1];h&&(l=h.id,p=h.terminalIds,u=h.layout)}t({tabs:i,activeTabId:l,terminalsMap:c,terminalIds:p,layout:u}),V(W(e()))},reopenTab:n=>{const r=e(),o=r.tabs.find(i=>i.id===n);if(!o||o.status!=="closed")return;const a={...r.terminalsMap};for(const i of o.terminalIds)a[i]={id:i,connected:!1,sessionResumed:!1,error:null};const c=X(r.tabs,n,i=>({...i,status:"open"}));t({tabs:c,activeTabId:n,terminalsMap:a,terminalIds:o.terminalIds,layout:o.layout}),V(W(e()))},deleteTab:async n=>{const r=e(),o=r.tabs.find(h=>h.id===n);if(!o)return;const a=r.token;a&&await Promise.all(o.terminalIds.map(h=>fetch(`${P}/api/sessions/${encodeURIComponent(h)}`,{method:"DELETE",headers:U(a)}).catch(()=>{})));const c=e(),i=c.tabs.find(h=>h.id===n);if(!i)return;const l={...c.terminalsMap};for(const h of i.terminalIds)delete l[h];const p=c.tabs.filter(h=>h.id!==n);let u=c.activeTabId,f=c.terminalIds,m=c.layout;if(c.activeTabId===n){const h=p.find(x=>x.status==="open");h?(u=h.id,f=h.terminalIds,m=h.layout):(u="",f=[],m=null)}t({tabs:p,activeTabId:u,terminalsMap:l,terminalIds:f,layout:m}),V(W(e())),setTimeout(()=>e().fetchSessions(),500)},renameTab:(n,r)=>{const o=X(e().tabs,n,a=>({...a,name:r}));t({tabs:o}),V(W(e()))},addTerminal:(n,r)=>{const o=e();if(r&&o.terminalsMap[r])return r;const a=he(o);if(!a){const I=`tab${o.nextTabId}`,R=r||`t${o.nextId}`;let z=o.nextId;const E=R.match(/^t(\d+)$/);E&&(z=Math.max(z,parseInt(E[1],10)+1));const b=r?z:z+1,L={id:R,connected:!1,sessionResumed:!1,error:null},D={type:"leaf",terminalId:R},O={id:I,name:`Tab ${o.nextTabId}`,status:"open",terminalIds:[R],layout:D,createdAt:Date.now()};return t({tabs:[...o.tabs,O],activeTabId:I,nextTabId:o.nextTabId+1,nextId:b,terminalsMap:{...o.terminalsMap,[R]:L},terminalIds:[R],layout:D}),V(W(e())),R}const{nextId:c,nextSplitId:i,terminalsMap:l}=o,{terminalIds:p,layout:u}=a,f=r||`t${c}`;let m=c;const h=f.match(/^t(\d+)$/);h&&(m=Math.max(m,parseInt(h[1],10)+1));const x={id:f,connected:!1,sessionResumed:!1,error:null},w={type:"leaf",terminalId:f};let k,S=i;if(!u)k=w;else if(u.type==="leaf"){const I=n||"horizontal";k={id:`s${S}`,type:"split",direction:I,children:[u,w],sizes:[50,50]},S++}else if(u.direction===(n||"horizontal")){const R=100/(u.children.length+1),z=(100-R)/100,E=[...u.sizes.map(b=>b*z),R];k={...u,children:[...u.children,w],sizes:E}}else{const I=n||"horizontal";k={id:`s${S}`,type:"split",direction:I,children:[u,w],sizes:[50,50]},S++}const M=[...p,f],j=r?m:m+1,y=X(o.tabs,a.id,I=>({...I,terminalIds:M,layout:k}));return t({terminalsMap:{...l,[f]:x},terminalIds:M,layout:k,tabs:y,nextId:j,nextSplitId:S}),V(W(e())),f},splitTerminal:(n,r)=>{const o=e(),a=he(o);if(!a||!a.layout)return"";const{nextId:c,nextSplitId:i,terminalsMap:l}=o,p=`t${c}`,u={id:p,connected:!1,sessionResumed:!1,error:null},f={type:"leaf",terminalId:p},m=`s${i}`,h=Je(a.layout,n,r,f,m),x=[...a.terminalIds,p],w=c+1,k=i+1,S=X(o.tabs,a.id,M=>({...M,terminalIds:x,layout:h}));return t({terminalsMap:{...l,[p]:u},terminalIds:x,layout:h,tabs:S,nextId:w,nextSplitId:k}),V(W(e())),p},removeTerminal:n=>{const r=e(),o=r.tabs.find(u=>u.terminalIds.includes(n));if(!o){const{[n]:u,...f}=r.terminalsMap;t({terminalsMap:f});return}const a=o.terminalIds.filter(u=>u!==n),c=o.layout?oe(o.layout,n):null,i=X(r.tabs,o.id,u=>({...u,terminalIds:a,layout:c})),{[n]:l,...p}=r.terminalsMap;o.id===r.activeTabId?t({terminalsMap:p,terminalIds:a,layout:c,tabs:i}):t({terminalsMap:p,tabs:i}),V(W(e()))},setTerminalConnected:(n,r)=>{t(o=>{const a=o.terminalsMap[n];return!a||a.connected===r?o:{terminalsMap:{...o.terminalsMap,[n]:{...a,connected:r}}}})},setTerminalResumed:(n,r)=>{t(o=>{const a=o.terminalsMap[n];return!a||a.sessionResumed===r?o:{terminalsMap:{...o.terminalsMap,[n]:{...a,sessionResumed:r}}}})},setTerminalError:(n,r)=>{t(o=>{const a=o.terminalsMap[n];return!a||a.error===r?o:{terminalsMap:{...o.terminalsMap,[n]:{...a,error:r}}}})},setSplitSizes:(n,r)=>{const o=e(),a=he(o);if(!a||!a.layout)return;const c=Ke(a.layout,n,r),i=X(o.tabs,a.id,l=>({...l,layout:c}));t({layout:c,tabs:i}),Yt(W(e()))},fontSize:14,setFontSize:n=>{const r=Math.max(10,Math.min(24,n));t({fontSize:r}),ie&&clearTimeout(ie),ie=setTimeout(()=>{ie=null;const o=e().token;o&&Gt(o,r)},500)},latency:null,setLatency:n=>t({latency:n}),sidebarOpen:!1,toggleSidebar:()=>t(n=>({sidebarOpen:!n.sidebarOpen})),serverSessions:[],fetchSessions:async()=>{const n=e().token;if(n)try{const r=await fetch(`${P}/api/sessions`,{headers:U(n)});if(!r.ok)return;const o=await r.json();t({serverSessions:o})}catch{}},killServerSession:async n=>{const r=e().token;if(!r)return;try{await fetch(`${P}/api/sessions/${encodeURIComponent(n)}`,{method:"DELETE",headers:U(r)})}catch{}const o=e(),a=o.tabs.find(c=>c.terminalIds.includes(n));if(a){const c=a.terminalIds.filter(f=>f!==n),i=a.layout?oe(a.layout,n):null,l=X(o.tabs,a.id,f=>({...f,terminalIds:c,layout:i})),{[n]:p,...u}=o.terminalsMap;a.id===o.activeTabId?t({terminalsMap:u,terminalIds:c,layout:i,tabs:l}):t({terminalsMap:u,tabs:l}),V(W(e()))}else{const{[n]:c,...i}=o.terminalsMap;t({terminalsMap:i})}setTimeout(()=>e().fetchSessions(),500)}}));async function Qt(t,e){var o;const{setState:n,getState:r}=v;try{const[a,c]=await Promise.all([qt(t),fetch(`${P}/api/sessions`,{headers:U(t)}).then(m=>m.ok?m.json():[]).catch(()=>[])]);if(r().token!==t)return;const i=a&&((o=a.tabs)==null?void 0:o.length)>0?a:e;if(!i||i.tabs.length===0){n({tabsLoading:!1});return}const l=Zt(i,c);if(!l){n({tabsLoading:!1,terminalsMap:{},tabs:[],activeTabId:"",nextId:i.nextId,nextSplitId:i.nextSplitId,nextTabId:i.nextTabId,terminalIds:[],layout:null});return}const p={};for(const m of l.tabs)if(m.status==="open")for(const h of m.terminalIds)p[h]={id:h,connected:!1,sessionResumed:!1,error:null};const u=l.tabs.find(m=>m.id===l.activeTabId&&m.status==="open")||l.tabs.find(m=>m.status==="open"),f=(u==null?void 0:u.id)||"";n({tabsLoading:!1,terminalsMap:p,tabs:l.tabs,activeTabId:f,nextId:l.nextId,nextSplitId:l.nextSplitId,nextTabId:l.nextTabId,terminalIds:(u==null?void 0:u.terminalIds)||[],layout:(u==null?void 0:u.layout)||null}),V(W(r()))}catch{r().token===t&&n({tabsLoading:!1})}}function en(){const[t,e]=d.useState(""),n=v(o=>o.setToken),r=o=>{o.preventDefault(),t.trim()&&n(t.trim())};return s.jsx("div",{style:{minHeight:"100vh",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",padding:"16px",background:"radial-gradient(ellipse at 50% 0%, rgba(122, 162, 247, 0.08) 0%, #1a1b26 70%)"},children:s.jsxs("div",{className:"login-card",style:{backgroundColor:"#24283b",borderRadius:"12px",padding:"40px 36px",width:"100%",maxWidth:"400px",border:"1px solid #292e42"},children:[s.jsxs("div",{style:{textAlign:"center",marginBottom:"36px"},children:[s.jsx("div",{style:{width:"56px",height:"56px",margin:"0 auto 16px",borderRadius:"14px",background:"linear-gradient(135deg, #7aa2f7 0%, #bb9af7 100%)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"24px",color:"#1a1b26",fontWeight:"bold",boxShadow:"0 4px 16px rgba(122, 162, 247, 0.3)"},children:">_"}),s.jsx("h1",{style:{fontSize:"22px",fontWeight:"bold",color:"#c0caf5",marginBottom:"6px",letterSpacing:"0.5px"},children:"AI-Cli Online"}),s.jsx("p",{style:{color:"#565f89",fontSize:"13px"},children:"Terminal in your browser"})]}),s.jsxs("form",{onSubmit:r,children:[s.jsxs("div",{style:{marginBottom:"20px"},children:[s.jsx("label",{htmlFor:"token",style:{display:"block",fontSize:"12px",color:"#7aa2f7",marginBottom:"8px",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.5px"},children:"Auth Token"}),s.jsx("input",{type:"password",id:"token",className:"login-input",value:t,onChange:o=>e(o.target.value),placeholder:"Enter your AUTH_TOKEN",autoFocus:!0,autoComplete:"current-password",style:{width:"100%",padding:"11px 14px",backgroundColor:"#1a1b26",color:"#c0caf5",border:"1px solid #292e42",borderRadius:"8px",fontSize:"14px",outline:"none"}})]}),s.jsx("button",{type:"submit",className:"login-submit",disabled:!t.trim(),style:{width:"100%",padding:"11px",background:t.trim()?"linear-gradient(135deg, #7aa2f7 0%, #7dcfff 100%)":"#292e42",color:t.trim()?"#1a1b26":"#565f89",border:"none",borderRadius:"8px",fontSize:"14px",fontWeight:600,cursor:t.trim()?"pointer":"not-allowed",letterSpacing:"0.3px"},children:"Connect"})]}),s.jsx("div",{style:{marginTop:"28px",textAlign:"center",color:"#414868",fontSize:"11px"},children:s.jsxs("p",{children:["Token is configured in"," ",s.jsx("code",{style:{backgroundColor:"#1a1b26",padding:"2px 6px",borderRadius:"4px",border:"1px solid #292e42",fontSize:"11px"},children:"server/.env"})]})})]})})}/**
|
|
26
|
+
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
|
27
|
+
* @license MIT
|
|
28
|
+
*
|
|
29
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
30
|
+
* @license MIT
|
|
31
|
+
*
|
|
32
|
+
* Originally forked from (with the author's permission):
|
|
33
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
34
|
+
* http://bellard.org/jslinux/
|
|
35
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
36
|
+
*/var tn=class{constructor(t,e,n,r={}){this._terminal=t,this._regex=e,this._handler=n,this._options=r}provideLinks(t,e){let n=rn.computeLink(t,this._regex,this._terminal,this._handler);e(this._addCallbacks(n))}_addCallbacks(t){return t.map(e=>(e.leave=this._options.leave,e.hover=(n,r)=>{if(this._options.hover){let{range:o}=e;this._options.hover(n,r,o)}},e))}};function nn(t){try{let e=new URL(t),n=e.password&&e.username?`${e.protocol}//${e.username}:${e.password}@${e.host}`:e.username?`${e.protocol}//${e.username}@${e.host}`:`${e.protocol}//${e.host}`;return t.toLocaleLowerCase().startsWith(n.toLocaleLowerCase())}catch{return!1}}var rn=class ae{static computeLink(e,n,r,o){let a=new RegExp(n.source,(n.flags||"")+"g"),[c,i]=ae._getWindowedLineStrings(e-1,r),l=c.join(""),p,u=[];for(;p=a.exec(l);){let f=p[0];if(!nn(f))continue;let[m,h]=ae._mapStrIdx(r,i,0,p.index),[x,w]=ae._mapStrIdx(r,m,h,f.length);if(m===-1||h===-1||x===-1||w===-1)continue;let k={start:{x:h+1,y:m+1},end:{x:w,y:x+1}};u.push({range:k,text:f,activate:o})}return u}static _getWindowedLineStrings(e,n){let r,o=e,a=e,c=0,i="",l=[];if(r=n.buffer.active.getLine(e)){let p=r.translateToString(!0);if(r.isWrapped&&p[0]!==" "){for(c=0;(r=n.buffer.active.getLine(--o))&&c<2048&&(i=r.translateToString(!0),c+=i.length,l.push(i),!(!r.isWrapped||i.indexOf(" ")!==-1)););l.reverse()}for(l.push(p),c=0;(r=n.buffer.active.getLine(++a))&&r.isWrapped&&c<2048&&(i=r.translateToString(!0),c+=i.length,l.push(i),i.indexOf(" ")===-1););}return[l,o]}static _mapStrIdx(e,n,r,o){let a=e.buffer.active,c=a.getNullCell(),i=r;for(;o;){let l=a.getLine(n);if(!l)return[-1,-1];for(let p=i;p<l.length;++p){l.getCell(p,c);let u=c.getChars();if(c.getWidth()&&(o-=u.length||1,p===l.length-1&&u==="")){let f=a.getLine(n+1);f&&f.isWrapped&&(f.getCell(0,c),c.getWidth()===2&&(o+=1))}if(o<0)return[n,p]}n++,i=0}return[n,i]}},on=/(https?|HTTPS?):[/]{2}[^\s"'!*(){}|\\\^<>`]*[^\s"':,.!?{}|\\\^~\[\]`()<>]/;function sn(t,e){let n=window.open();if(n){try{n.opener=null}catch{}n.location.href=e}}var an=class{constructor(t=sn,e={}){this._handler=t,this._options=e}activate(t){this._terminal=t;let e=this._options,n=e.urlRegex||on;this._linkProvider=this._terminal.registerLinkProvider(new tn(this._terminal,n,this._handler,e))}dispose(){var t;(t=this._linkProvider)==null||t.dispose()}};const ln=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`,Le=500,cn=15e3,dn=15e3,un=5e3,fn=1e4,pn=5,mn=64*1024,hn=1,ze=2,xn=3,bn=4,yn=new TextDecoder,gn=new TextEncoder;function De(t,e){const n=gn.encode(e),r=new Uint8Array(1+n.length);return r[0]=t,r.set(n,1),r.buffer}function wn(t,e,n){const r=d.useRef(null),o=d.useRef(Le),a=d.useRef(null),c=d.useRef(null),i=d.useRef(null),l=d.useRef(null),p=d.useRef(!1),u=d.useRef(n),f=d.useRef(!1),m=d.useRef(0),h=d.useRef(""),x=d.useRef(null),w=d.useRef("");u.current=n;const k=d.useCallback(()=>{c.current&&(clearInterval(c.current),c.current=null),i.current&&(clearTimeout(i.current),i.current=null),a.current&&(clearTimeout(a.current),a.current=null),l.current&&(clearTimeout(l.current),l.current=null),x.current&&(clearTimeout(x.current),x.current=null)},[]),S=d.useCallback(()=>{const{token:I,setTerminalError:R}=v.getState();if(!I||p.current)return;if(r.current){const L=r.current.readyState;if(L===WebSocket.OPEN||L===WebSocket.CONNECTING)return}f.current=!1;const z=`${ln}?sessionId=${encodeURIComponent(e)}`,E=new WebSocket(z);E.binaryType="arraybuffer",l.current=window.setTimeout(()=>{E.readyState===WebSocket.CONNECTING&&E.close()},fn);const b=()=>{E.readyState===WebSocket.OPEN&&(m.current=performance.now(),E.send(JSON.stringify({type:"ping"})),i.current=window.setTimeout(()=>{m.current>0&&(m.current=0,E.close())},un))};E.onopen=()=>{l.current&&(clearTimeout(l.current),l.current=null),E.send(JSON.stringify({type:"auth",token:I})),R(e,null),o.current=Le},E.onclose=L=>{const{setTerminalConnected:D,setTerminalError:O,setToken:F}=v.getState();if(D(e,!1),k(),f.current)return;if(L.code===4001){p.current=!0,O(e,"Authentication failed"),F(null),localStorage.removeItem("ai-cli-online-token");return}if(L.code===4002)return;if(L.code===4005){O(e,"Connection limit reached");return}const N=o.current;o.current=Math.min(N*2,cn);const C=Math.round(N*(.5+Math.random()));a.current=window.setTimeout(()=>{S()},C)},E.onerror=()=>{},E.onmessage=L=>{var D;try{const O=t.current;if(L.data instanceof ArrayBuffer){const N=new Uint8Array(L.data);if(N.length<1)return;const C=N[0],A=N.subarray(1);switch(C){case hn:O==null||O.write(A);break;case xn:O==null||O.write(A);break;case bn:{(D=u.current)==null||D.call(u,yn.decode(A));break}}return}const F=JSON.parse(L.data);switch(F.type){case"connected":{const N=v.getState();N.setTerminalConnected(e,!0),N.setTerminalResumed(e,F.resumed);const C=t.current;C&&E.readyState===WebSocket.OPEN&&E.send(JSON.stringify({type:"resize",cols:C.cols,rows:C.rows})),w.current&&(E.send(De(ze,w.current)),w.current=""),b(),c.current=window.setInterval(b,dn);break}case"error":v.getState().setTerminalError(e,F.error);break;case"pong":{if(i.current&&(clearTimeout(i.current),i.current=null),m.current>0){const N=Math.round(performance.now()-m.current),C=v.getState();(C.terminalIds.length===0||C.terminalIds[0]===e)&&C.setLatency(N),m.current=0}break}}}catch{}},r.current=E},[e,t,k]),M=d.useCallback(I=>{const R=r.current;if(!R||R.readyState!==WebSocket.OPEN){w.current.length<mn&&(w.current+=I);return}h.current+=I,x.current||(x.current=window.setTimeout(()=>{const z=h.current;h.current="",x.current=null,z&&R.readyState===WebSocket.OPEN&&R.send(De(ze,z))},pn))},[]),j=d.useCallback((I,R)=>{var z;((z=r.current)==null?void 0:z.readyState)===WebSocket.OPEN&&r.current.send(JSON.stringify({type:"resize",cols:I,rows:R}))},[]),y=d.useCallback(()=>{var I;((I=r.current)==null?void 0:I.readyState)===WebSocket.OPEN&&r.current.send(JSON.stringify({type:"capture-scrollback"}))},[]);return d.useEffect(()=>(v.getState().token&&(p.current=!1,S()),()=>{f.current=!0,k(),r.current&&(r.current.close(),r.current=null)}),[S,k]),{sendInput:M,sendResize:j,requestScrollback:y}}const Ye={background:"#1a1b26",foreground:"#a9b1d6",cursor:"#c0caf5",selectionBackground:"#33467c",black:"#15161e",red:"#f7768e",green:"#9ece6a",yellow:"#e0af68",blue:"#7aa2f7",magenta:"#bb9af7",cyan:"#7dcfff",white:"#a9b1d6",brightBlack:"#414868",brightRed:"#f7768e",brightGreen:"#9ece6a",brightYellow:"#e0af68",brightBlue:"#7aa2f7",brightMagenta:"#bb9af7",brightCyan:"#7dcfff",brightWhite:"#c0caf5"},Xe="'Maple Mono CN', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace",vn=d.forwardRef(function({sessionId:e},n){const r=d.useRef(null),o=d.useRef(null),a=d.useRef(null),[c,i]=d.useState(!1),[l,p]=d.useState(""),u=v(S=>S.fontSize),f=d.useCallback(S=>{p(S),i(!0)},[]),{sendInput:m,sendResize:h,requestScrollback:x}=wn(o,e,f);d.useImperativeHandle(n,()=>({sendInput:m}),[m]);const w=d.useRef(m),k=d.useRef(h);return w.current=m,k.current=h,d.useEffect(()=>{if(!r.current)return;let S=!1,M=null,j=null,y=null,I=null;const R=()=>{if(S||!r.current)return;const z=new Pe({cursorBlink:!0,scrollback:1e4,fontSize:v.getState().fontSize,fontFamily:Xe,theme:Ye,allowProposedApi:!0}),E=new Fe;z.loadAddon(E),z.loadAddon(new an((D,O)=>{window.open(O,"_blank","noopener,noreferrer")})),z.open(r.current);try{const D=new ct;D.onContextLoss(()=>{D.dispose()}),z.loadAddon(D)}catch{}o.current=z,a.current=E;const b=()=>{try{const D=r.current;if(D&&D.clientWidth>0&&D.clientHeight>0)return E.fit(),k.current(z.cols,z.rows),!0}catch{}return!1};requestAnimationFrame(()=>b());let L=0;M=setInterval(()=>{L++,(b()||L>=10)&&(clearInterval(M),M=null)},100),z.onData(D=>{w.current(D)}),I=new ResizeObserver(()=>{j||(j=requestAnimationFrame(()=>{j=null;try{E.fit(),y&&clearTimeout(y),y=setTimeout(()=>{y=null,k.current(z.cols,z.rows)},50)}catch{}}))}),I.observe(r.current)};return document.fonts.ready.then(R),()=>{S=!0,M&&clearInterval(M),j&&cancelAnimationFrame(j),y&&clearTimeout(y),I&&I.disconnect(),o.current&&(o.current.dispose(),o.current=null),a.current=null}},[e]),d.useEffect(()=>{const S=o.current,M=a.current;if(!(!S||!M)&&S.options.fontSize!==u){S.options.fontSize=u;try{M.fit()}catch{}k.current(S.cols,S.rows)}},[u]),s.jsxs("div",{style:{width:"100%",height:"100%",position:"relative"},children:[s.jsx("div",{ref:r,style:{width:"100%",height:"100%",backgroundColor:"#1a1b26",contain:"strict",willChange:"transform",isolation:"isolate"}}),s.jsx("button",{onClick:()=>{c?(i(!1),p("")):x()},title:"Toggle scrollback history",style:{position:"absolute",top:4,right:4,zIndex:10,background:c?"#7aa2f7":"rgba(65, 72, 104, 0.7)",color:"#c0caf5",border:"none",borderRadius:4,padding:"2px 8px",fontSize:12,cursor:"pointer",opacity:.8,lineHeight:"20px"},onMouseEnter:S=>{S.currentTarget.style.opacity="1"},onMouseLeave:S=>{S.currentTarget.style.opacity="0.8"},children:c?"✕":"↑"}),c&&s.jsx(Sn,{data:l,onClose:()=>{i(!1),p("")}})]})});function Sn({data:t,onClose:e}){const n=d.useRef(null),r=d.useRef(e);r.current=e;const o=v(i=>i.fontSize),a=d.useRef(null),c=d.useRef(null);return d.useEffect(()=>{if(!n.current)return;const i=new Pe({cursorBlink:!1,disableStdin:!0,scrollback:5e4,fontSize:o,fontFamily:Xe,theme:Ye});a.current=i;const l=new Fe;c.current=l,i.loadAddon(l),i.open(n.current),requestAnimationFrame(()=>{try{l.fit()}catch{}i.write(t,()=>{i.scrollToBottom()})});let p=null;const u=new ResizeObserver(()=>{p||(p=requestAnimationFrame(()=>{p=null;try{l.fit()}catch{}}))});u.observe(n.current);const f=m=>{m.key==="Escape"&&r.current()};return document.addEventListener("keydown",f),()=>{p&&cancelAnimationFrame(p),document.removeEventListener("keydown",f),u.disconnect(),i.dispose(),a.current=null,c.current=null}},[t]),d.useEffect(()=>{var i;if(a.current){a.current.options.fontSize=o;try{(i=c.current)==null||i.fit()}catch{}}},[o]),s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column"},children:[s.jsx("div",{style:{padding:"4px 12px",background:"#24283b",color:"#7aa2f7",fontSize:12,borderBottom:"1px solid #414868",flexShrink:0,display:"flex",justifyContent:"space-between",alignItems:"center"},children:s.jsx("span",{children:"Scrollback History (mouse wheel to scroll, ESC to close)"})}),s.jsx("div",{ref:n,style:{flex:1,overflow:"hidden"}})]})}async function re(t,e,n){const r=n?`?path=${encodeURIComponent(n)}`:"",o=await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/files${r}`,{headers:U(t)});if(!o.ok)throw new Error("Failed to list files");return o.json()}function Tn(t,e,n,r){return new Promise((o,a)=>{const c=new FormData;for(const l of n)c.append("files",l);const i=new XMLHttpRequest;i.open("POST",`${P}/api/sessions/${encodeURIComponent(e)}/upload`),i.setRequestHeader("Authorization",`Bearer ${t}`),i.upload.addEventListener("progress",l=>{l.lengthComputable&&r&&r(Math.round(l.loaded/l.total*100))}),i.addEventListener("load",()=>{i.status>=200&&i.status<300?o():a(new Error(`Upload failed: ${i.status}`))}),i.addEventListener("error",()=>a(new Error("Upload network error"))),i.addEventListener("abort",()=>a(new Error("Upload aborted"))),i.send(c)})}async function kn(t,e){const n=await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/cwd`,{headers:U(t)});if(!n.ok)throw new Error("Failed to fetch cwd");return(await n.json()).cwd}async function In(t,e,n){const r=await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/download?path=${encodeURIComponent(n)}`,{headers:U(t)});if(!r.ok)throw new Error("Download failed");const o=await r.blob(),a=URL.createObjectURL(o),c=document.createElement("a");c.href=a,c.download=n.split("/").pop()||"download",document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(a)}function ge({sessionId:t,onClose:e,filter:n,pollCwd:r}){const o=v(j=>j.token),[a,c]=d.useState(""),[i,l]=d.useState([]),[p,u]=d.useState(!0),[f,m]=d.useState(null),h=d.useRef(""),x=d.useCallback(async j=>{if(o){u(!0),m(null);try{const y=await re(o,t,j);j||(h.current=y.cwd),c(y.cwd),l(n?n(y.files):y.files)}catch(y){m(y instanceof Error?y.message:"Failed to load files")}finally{u(!1)}}},[o,t,n]);d.useEffect(()=>{x()},[x]),d.useEffect(()=>{if(!r||!o)return;let j=!1;const y=setInterval(async()=>{if(!j)try{const I=await kn(o,t);if(j)return;if(I!==h.current){h.current=I;const R=await re(o,t);if(j)return;c(R.cwd),l(n?n(R.files):R.files)}}catch{}},r);return()=>{j=!0,clearInterval(y)}},[r,o,t,n]);const w=d.useRef(e);w.current=e,d.useEffect(()=>{const j=y=>{y.key==="Escape"&&w.current()};return document.addEventListener("keydown",j),()=>document.removeEventListener("keydown",j)},[]);const k=d.useCallback(j=>{x(a+"/"+j)},[x,a]),S=d.useCallback(()=>{const j=a.replace(/\/[^/]+$/,"")||"/";x(j)},[x,a]),M=d.useCallback(()=>{x(a)},[x,a]);return{cwd:a,files:i,loading:p,error:f,setError:m,handleNavigate:k,handleGoUp:S,handleRefresh:M}}function Cn(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(1)} GB`}function Ze(t){const e=new Date(t*1e3),n=r=>String(r).padStart(2,"0");return`${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}`}function we({cwd:t,onGoUp:e,onRefresh:n,onClose:r}){return s.jsxs("div",{style:{padding:"6px 12px",background:"#24283b",borderBottom:"1px solid #414868",flexShrink:0,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",minWidth:0},children:[s.jsx("button",{onClick:e,style:{background:"none",border:"1px solid #414868",color:"#7aa2f7",borderRadius:3,padding:"1px 8px",fontSize:12,cursor:"pointer",flexShrink:0},title:"Go to parent directory",children:".."}),s.jsx("span",{style:{color:"#7aa2f7",fontSize:12,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t||"..."})]}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[s.jsx("button",{onClick:n,style:{background:"none",border:"none",color:"#565f89",fontSize:14,cursor:"pointer",padding:"0 4px"},title:"Refresh",children:"↻"}),s.jsx("button",{onClick:r,style:{background:"none",border:"none",color:"#565f89",fontSize:14,cursor:"pointer",padding:"0 4px"},title:"Close (ESC)",children:"✕"})]})]})}function ve({loading:t,error:e,empty:n,emptyText:r="Empty directory"}){return t?s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:"Loading..."}):e?s.jsx("div",{style:{padding:"12px",color:"#f7768e",fontSize:12},children:e}):n?s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:r}):null}function jn({sessionId:t,onClose:e}){const n=v(x=>x.token),{cwd:r,files:o,loading:a,error:c,setError:i,handleNavigate:l,handleGoUp:p,handleRefresh:u}=ge({sessionId:t,onClose:e}),[f,m]=d.useState(null),h=async x=>{if(n){m(x);try{await In(n,t,r+"/"+x)}catch(w){i(w instanceof Error?w.message:"Download failed")}finally{m(null)}}};return s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column",fontFamily:"inherit"},children:[s.jsx(we,{cwd:r,onGoUp:p,onRefresh:u,onClose:e}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ve,{loading:a,error:c,empty:o.length===0,emptyText:"Empty directory"}),!a&&!c&&o.map(x=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:x.type==="directory"?"pointer":"default",borderBottom:"1px solid #1e2030"},onMouseEnter:w=>{w.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:w=>{w.currentTarget.style.backgroundColor="transparent"},onClick:()=>{x.type==="directory"&&l(x.name)},children:[x.type==="file"?s.jsx("button",{onClick:w=>{w.stopPropagation(),h(x.name)},disabled:f===x.name,style:{background:"none",border:"1px solid #414868",color:f===x.name?"#565f89":"#9ece6a",borderRadius:3,padding:"1px 8px",fontSize:11,cursor:f===x.name?"wait":"pointer",flexShrink:0,marginRight:6},children:f===x.name?"...":"↓"}):s.jsx("span",{style:{width:26,flexShrink:0,marginRight:6}}),s.jsx("span",{style:{width:20,flexShrink:0,color:x.type==="directory"?"#7aa2f7":"#565f89"},children:x.type==="directory"?"📁":"📄"}),s.jsx("span",{style:{flex:1,color:x.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:x.name}),s.jsx("span",{style:{width:80,textAlign:"right",color:"#565f89",fontSize:11,flexShrink:0},children:x.type==="file"?Cn(x.size):""})]},x.name))]})]})}function En({content:t}){const e=v(r=>r.fontSize),n=d.useMemo(()=>{if(!t)return"";const r=dt.parse(t,{async:!1});return ut.sanitize(r,{ADD_TAGS:["img"],ADD_ATTR:["src","alt","title","width","height"]})},[t]);return t?s.jsx("div",{className:"md-preview",style:{height:"100%",overflowY:"auto",userSelect:"text",padding:"12px 16px",fontSize:`${e}px`},dangerouslySetInnerHTML:{__html:n}}):s.jsx("div",{className:"md-preview",style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#414868",fontStyle:"italic",fontSize:"13px"},children:"Waiting for plan output..."})}async function Rn(t,e){const n=await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/draft`,{headers:U(t)});return n.ok?(await n.json()).content??"":""}async function Me(t,e,n){await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/draft`,{method:"PUT",headers:{...U(t),"Content-Type":"application/json"},body:JSON.stringify({content:n})})}const Ne=[{cmd:"/plan",desc:"Enter plan mode"},{cmd:"/help",desc:"Get help"},{cmd:"/compact",desc:"Compact conversation"},{cmd:"/clear",desc:"Clear conversation"},{cmd:"/model",desc:"Switch model"},{cmd:"/cost",desc:"Show token usage"},{cmd:"/status",desc:"Show status"},{cmd:"/init",desc:"Initialize project CLAUDE.md"},{cmd:"/memory",desc:"Edit memory files"},{cmd:"/review",desc:"Review code"},{cmd:"/bug",desc:"Report a bug"},{cmd:"/login",desc:"Login to Anthropic"},{cmd:"/doctor",desc:"Run diagnostics"},{cmd:"/permissions",desc:"Manage permissions"},{cmd:"/mcp",desc:"MCP server management"},{cmd:"/terminal-setup",desc:"Configure terminal"},{cmd:"/vim",desc:"Toggle vim mode"},{cmd:"/oh-my-claudecode:autopilot",desc:"Full autonomous execution"},{cmd:"/oh-my-claudecode:ralph",desc:"Persistence loop until done"},{cmd:"/oh-my-claudecode:ultrawork",desc:"Max parallel execution"},{cmd:"/oh-my-claudecode:ecomode",desc:"Token-efficient execution"},{cmd:"/oh-my-claudecode:plan",desc:"Strategic planning session"},{cmd:"/oh-my-claudecode:ralplan",desc:"Iterative planning consensus"},{cmd:"/oh-my-claudecode:ultrapilot",desc:"Parallel autopilot (3-5x faster)"},{cmd:"/oh-my-claudecode:analyze",desc:"Deep analysis/investigation"},{cmd:"/oh-my-claudecode:deepsearch",desc:"Thorough codebase search"},{cmd:"/oh-my-claudecode:deepinit",desc:"Generate AGENTS.md hierarchy"},{cmd:"/oh-my-claudecode:ultraqa",desc:"QA cycling: test/fix/repeat"},{cmd:"/oh-my-claudecode:tdd",desc:"Test-driven development"},{cmd:"/oh-my-claudecode:code-review",desc:"Comprehensive code review"},{cmd:"/oh-my-claudecode:security-review",desc:"Security vulnerability review"},{cmd:"/oh-my-claudecode:build-fix",desc:"Fix build/TypeScript errors"},{cmd:"/oh-my-claudecode:research",desc:"Parallel research orchestration"},{cmd:"/oh-my-claudecode:swarm",desc:"N coordinated agents"},{cmd:"/oh-my-claudecode:pipeline",desc:"Sequential agent chaining"},{cmd:"/oh-my-claudecode:learner",desc:"Extract skill from session"},{cmd:"/oh-my-claudecode:note",desc:"Save notes to notepad"},{cmd:"/oh-my-claudecode:cancel",desc:"Cancel active OMC mode"},{cmd:"/oh-my-claudecode:help",desc:"OMC usage guide"},{cmd:"/oh-my-claudecode:doctor",desc:"Diagnose OMC issues"},{cmd:"/oh-my-claudecode:omc-setup",desc:"One-time OMC setup"},{cmd:"/oh-my-claudecode:hud",desc:"Configure HUD statusline"},{cmd:"/oh-my-claudecode:release",desc:"Automated release workflow"},{cmd:"/oh-my-claudecode:ralph-init",desc:"Initialize PRD for ralph"},{cmd:"/oh-my-claudecode:review",desc:"Review plan with Critic"},{cmd:"/oh-my-claudecode:git-master",desc:"Git expert for commits"},{cmd:"/oh-my-claudecode:mcp-setup",desc:"Configure MCP servers"},{cmd:"/oh-my-claudecode:skill",desc:"Manage local skills"},{cmd:"/oh-my-claudecode:writer-memory",desc:"Writer memory system"},{cmd:"/oh-my-claudecode:psm",desc:"Project session manager"},{cmd:"/oh-my-claudecode:trace",desc:"Agent flow trace timeline"}],Ln=d.forwardRef(function({onSend:e,onContentChange:n,sessionId:r,token:o},a){const c=v(g=>g.fontSize),[i,l]=d.useState(""),p=d.useRef(null),u=d.useRef(),f=d.useRef(!1),[m,h]=d.useState(!1),[x,w]=d.useState(""),[k,S]=d.useState(0),[M,j]=d.useState(!1),[y,I]=d.useState(""),[R,z]=d.useState(""),[E,b]=d.useState(0),[L,D]=d.useState([]),[O,F]=d.useState(!1),N=d.useRef(""),C=d.useRef(null),A=d.useMemo(()=>{if(!x)return Ne;const g=x.toLowerCase();return Ne.filter(T=>T.cmd.toLowerCase().includes(g)||T.desc.toLowerCase().includes(g))},[x]),$=d.useMemo(()=>{let g=L;if(y){const T=y.toLowerCase();g=g.filter(_=>_.name.toLowerCase().includes(T))}return[...g].sort((T,_)=>T.type==="directory"&&_.type!=="directory"?-1:T.type!=="directory"&&_.type==="directory"?1:T.name.localeCompare(_.name))},[L,y]);d.useEffect(()=>{let g=!1;return Rn(o,r).then(T=>{!g&&T&&l(T),f.current=!0}).catch(()=>{f.current=!0}),()=>{g=!0}},[o,r]),d.useEffect(()=>{if(f.current)return u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{Me(o,r,i).catch(()=>{})},500),()=>{u.current&&clearTimeout(u.current)}},[i,o,r]),d.useEffect(()=>{var g;(g=p.current)==null||g.focus()},[]),d.useEffect(()=>{if(!M)return;let g=!1;return F(!0),(async()=>{try{if(R){if(!N.current){const B=await re(o,r);if(g)return;N.current=B.cwd}const T=`${N.current}/${R.replace(/\/$/,"")}`,_=await re(o,r,T);if(g)return;D(_.files)}else{const T=await re(o,r);if(g)return;N.current=T.cwd,D(T.files)}F(!1)}catch{if(g)return;D([]),F(!1)}})(),()=>{g=!0}},[M,R,o,r]),d.useEffect(()=>{if(!M||!C.current)return;const g=C.current.querySelector(".file-item--active");g==null||g.scrollIntoView({block:"nearest"})},[E,M]);const Y=d.useCallback(()=>{const g=i.trim();g&&(e(g),l(""),Me(o,r,"").catch(()=>{}))},[i,e,o,r]);d.useImperativeHandle(a,()=>({send:Y}),[Y]),d.useEffect(()=>{n==null||n(i.trim().length>0)},[i,n]);const ue=d.useCallback(g=>{const T=p.current;if(!T)return;const _=T.selectionStart,B=i.slice(0,_),J=i.slice(_),q=B.lastIndexOf(`
|
|
37
|
+
`)+1,G=B.slice(q).match(/\/[a-zA-Z-]*$/);if(G){const H=q+(G.index??0),ee=g+" ",pe=i.slice(0,H)+ee+J;l(pe);const ot=H+ee.length;requestAnimationFrame(()=>{T.selectionStart=T.selectionEnd=ot,T.focus()})}else{const H=B+g+J;l(H);const ee=_+g.length;requestAnimationFrame(()=>{T.selectionStart=T.selectionEnd=ee,T.focus()})}h(!1),w(""),S(0)},[i]),fe=d.useCallback(g=>{const T=p.current;if(!T)return;const _=T.selectionStart,B=i.slice(0,_),J=i.slice(_),Q=B.match(/@([a-zA-Z0-9_.\-/]*)$/);if(!Q)return;const q=B.length-Q[0].length;if(g.type==="directory"){const K="@"+R+g.name+"/",G=i.slice(0,q)+K+J;l(G);const H=q+K.length;z(R+g.name+"/"),I(""),b(0),requestAnimationFrame(()=>{T.selectionStart=T.selectionEnd=H,T.focus()})}else{const K=g.name+" ",G=i.slice(0,q)+K+J;l(G);const H=q+K.length;j(!1),I(""),z(""),b(0),D([]),N.current="",requestAnimationFrame(()=>{T.selectionStart=T.selectionEnd=H,T.focus()})}},[i,R]),nt=d.useCallback(g=>{const T=g.target.value;l(T);const _=g.target.selectionStart,B=T.slice(0,_),J=B.lastIndexOf(`
|
|
38
|
+
`),q=B.slice(J+1).match(/^\/([a-zA-Z-]*)$/);if(q)h(!0),w(q[1]),S(0),j(!1);else{h(!1);const K=B.match(/@([a-zA-Z0-9_.\-/]*)$/);if(K){const G=K[1],H=G.lastIndexOf("/"),ee=H>=0?G.slice(0,H+1):"",pe=H>=0?G.slice(H+1):G;I(pe),b(0),z(ee),j(!0)}else j(!1)}},[]),rt=d.useCallback(g=>{if(m&&A.length>0){if(g.key==="ArrowDown"){g.preventDefault(),S(T=>(T+1)%A.length);return}if(g.key==="ArrowUp"){g.preventDefault(),S(T=>(T-1+A.length)%A.length);return}if(g.key==="Enter"||g.key==="Tab"){g.preventDefault(),ue(A[k].cmd);return}if(g.key==="Escape"){g.preventDefault(),h(!1);return}}if(M&&$.length>0){if(g.key==="ArrowDown"){g.preventDefault(),b(T=>(T+1)%$.length);return}if(g.key==="ArrowUp"){g.preventDefault(),b(T=>(T-1+$.length)%$.length);return}if(g.key==="Tab"||g.key==="Enter"){g.preventDefault(),fe($[E]);return}if(g.key==="Escape"){g.preventDefault(),j(!1);return}}if(g.key==="Tab"){g.preventDefault();const T=p.current;if(T){const _=T.selectionStart,B=T.selectionEnd,J=i.slice(0,_)+" "+i.slice(B);l(J);const Q=_+2;requestAnimationFrame(()=>{T.selectionStart=T.selectionEnd=Q})}return}g.key==="Enter"&&(g.ctrlKey||g.metaKey)&&(g.preventDefault(),Y())},[Y,m,A,k,ue,i,M,$,E,fe]);return s.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",backgroundColor:"#1a1b26",overflow:"hidden"},children:[m&&A.length>0&&s.jsx("div",{className:"slash-dropdown",children:A.map((g,T)=>s.jsxs("div",{className:`slash-item${T===k?" slash-item--active":""}`,onMouseDown:_=>{_.preventDefault(),ue(g.cmd)},onMouseEnter:()=>S(T),children:[s.jsx("span",{className:"slash-cmd",children:g.cmd}),s.jsx("span",{className:"slash-desc",children:g.desc})]},g.cmd))}),M&&(O||$.length>0)&&s.jsx("div",{className:"file-dropdown",ref:C,children:O?s.jsx("div",{className:"file-item file-loading",children:"Loading..."}):$.map((g,T)=>s.jsxs("div",{className:`file-item${T===E?" file-item--active":""}`,onMouseDown:_=>{_.preventDefault(),fe(g)},onMouseEnter:()=>b(T),children:[s.jsx("span",{className:"file-icon",children:g.type==="directory"?"📁":"📄"}),s.jsx("span",{className:"file-name",children:g.name})]},g.name))}),s.jsx("textarea",{ref:p,className:"md-editor-textarea",value:i,onChange:nt,onKeyDown:rt,placeholder:"Type / for commands, @ for files, Ctrl+Enter to send",spellCheck:!1,style:{flex:1,fontSize:`${c}px`}})]})});function zn(t,e){if(e==="directory")return"📁";const n=t.slice(t.lastIndexOf(".")).toLowerCase();return n===".pdf"?"📕":n===".html"||n===".htm"?"🌐":n===".md"?"📝":"📄"}function Dn({sessionId:t,onSelect:e,onClose:n}){const{cwd:r,files:o,loading:a,error:c,handleNavigate:i,handleGoUp:l,handleRefresh:p}=ge({sessionId:t,onClose:n}),u=f=>{e(r+"/"+f)};return s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column",fontFamily:"inherit"},children:[s.jsx(we,{cwd:r,onGoUp:l,onRefresh:p,onClose:n}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ve,{loading:a,error:c,empty:o.length===0,emptyText:"No files found"}),!a&&!c&&o.map(f=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:"pointer",borderBottom:"1px solid #1e2030"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor="transparent"},onClick:()=>{f.type==="directory"?i(f.name):u(f.name)},children:[s.jsx("span",{style:{width:20,flexShrink:0,marginRight:6,color:f.type==="directory"?"#7aa2f7":"#565f89"},children:zn(f.name,f.type)}),s.jsx("span",{style:{flex:1,color:f.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:f.name}),f.type==="file"&&s.jsx("span",{style:{fontSize:10,color:"#565f89",background:"#24283b",padding:"1px 5px",borderRadius:3,marginLeft:6,flexShrink:0},children:f.name.slice(f.name.lastIndexOf(".")).toLowerCase()})]},f.name))]})]})}const Mn="modulepreload",Nn=function(t){return"/"+t},_e={},_n=function(e,n,r){let o=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),i=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));o=Promise.allSettled(n.map(l=>{if(l=Nn(l),l in _e)return;_e[l]=!0;const p=l.endsWith(".css"),u=p?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const f=document.createElement("link");if(f.rel=p?"stylesheet":Mn,p||(f.as="script"),f.crossOrigin="",f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),p)return new Promise((m,h)=>{f.addEventListener("load",m),f.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${l}`)))})}))}function a(c){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=c,window.dispatchEvent(i),!i.defaultPrevented)throw c}return o.then(c=>{for(const i of c||[])i.status==="rejected"&&a(i.reason);return e().catch(a)})};let be=null;const An=_n(()=>import("./pdf-Tk4_4Bu3.js"),[]).then(t=>(be=t,t.GlobalWorkerOptions.workerSrc=new URL("/assets/pdf.worker-BA9kU3Pw.mjs",import.meta.url).toString(),t));function On({data:t,scrollRef:e}){const n=d.useRef(null),[r,o]=d.useState(null),[a,c]=d.useState(!0),i=d.useRef(0),l=p=>{n.current=p,e==null||e(p)};return d.useEffect(()=>{if(!t)return;const p=++i.current;return c(!0),o(null),(async()=>{try{if(await An,!be||p!==i.current)return;const u=atob(t),f=new Uint8Array(u.length);for(let w=0;w<u.length;w++)f[w]=u.charCodeAt(w);const m=await be.getDocument({data:f}).promise;if(p!==i.current)return;const h=n.current;if(!h)return;for(;h.firstChild;)h.removeChild(h.firstChild);const x=h.clientWidth-24;for(let w=1;w<=m.numPages;w++){const k=await m.getPage(w);if(p!==i.current)return;const S=k.getViewport({scale:1}),M=Math.min(x/S.width,2),j=k.getViewport({scale:M}),y=document.createElement("canvas");y.width=j.width,y.height=j.height,y.style.display="block",y.style.margin="0 auto 8px",y.style.maxWidth="100%";const I=y.getContext("2d");if(I){if(await k.render({canvasContext:I,viewport:j,canvas:y}).promise,p!==i.current)return;h.appendChild(y)}}c(!1)}catch(u){if(p!==i.current)return;o(u instanceof Error?u.message:"Failed to render PDF"),c(!1)}})(),()=>{i.current++}},[t]),s.jsxs("div",{ref:l,className:"pdf-renderer",children:[a&&s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:"Loading PDF..."}),r&&s.jsxs("div",{style:{padding:"12px",color:"#f7768e",fontSize:12},children:["PDF Error: ",r]})]})}async function Ae(t,e,n,r){const o=new URLSearchParams({path:n});r&&o.set("since",String(r));const a=await fetch(`${P}/api/sessions/${encodeURIComponent(e)}/file-content?${o}`,{headers:U(t)});if(a.status===304)return null;if(!a.ok)throw new Error("Failed to fetch file content");return a.json()}function $n(t=50,e=20,n=80){const[r,o]=d.useState(t),a=d.useRef(null),c=d.useCallback(i=>{i.preventDefault();const l=a.current;if(!l)return;const p=l.getBoundingClientRect(),u=p.width;document.body.classList.add("resizing-panes-h");let f=null;const m=x=>{f||(f=requestAnimationFrame(()=>{f=null;const w=x.clientX-p.left,k=Math.min(n,Math.max(e,w/u*100));o(k)}))},h=()=>{f&&cancelAnimationFrame(f),document.body.classList.remove("resizing-panes-h"),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",h)};document.addEventListener("mousemove",m),document.addEventListener("mouseup",h)},[e,n]);return{leftWidthPercent:r,containerRef:a,onDividerMouseDown:c}}const Pn=3e3;function Fn(t){const e=t.slice(t.lastIndexOf(".")).toLowerCase();return e===".md"?"md":e===".html"||e===".htm"?"html":e===".pdf"?"pdf":"text"}function Oe(t){return t.split("/").pop()||t}function Bn(t){if(t.type==="directory")return"📁";const e=t.name.slice(t.name.lastIndexOf(".")).toLowerCase();return e===".pdf"?"📕":e===".html"||e===".htm"?"🌐":e===".md"?"📝":"📄"}const Wn=3e3;function Un({sessionId:t,onSelect:e}){const n=d.useCallback(()=>{},[]),{cwd:r,files:o,loading:a,error:c,handleNavigate:i,handleGoUp:l,handleRefresh:p}=ge({sessionId:t,onClose:n,pollCwd:Wn});return s.jsxs("div",{style:{height:"100%",display:"flex",flexDirection:"column",overflow:"hidden"},children:[s.jsx(we,{cwd:r,onGoUp:l,onRefresh:p,onClose:n}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ve,{loading:a,error:c,empty:o.length===0,emptyText:"No files found"}),!a&&!c&&o.map(u=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:"pointer",borderBottom:"1px solid #1e2030"},onMouseEnter:f=>{f.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:f=>{f.currentTarget.style.backgroundColor="transparent"},onClick:()=>{u.type==="directory"?i(u.name):e(r+"/"+u.name)},children:[s.jsx("span",{style:{width:20,flexShrink:0,marginRight:6,color:u.type==="directory"?"#7aa2f7":"#565f89"},children:Bn(u)}),s.jsx("span",{style:{flex:1,color:u.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:u.name}),u.type==="file"&&s.jsx("span",{style:{fontSize:10,color:"#565f89",background:"#24283b",padding:"1px 5px",borderRadius:3,marginLeft:6,flexShrink:0},children:u.name.slice(u.name.lastIndexOf(".")).toLowerCase()})]},u.name))]})]})}function Hn({sessionId:t,token:e,onClose:n,onSend:r}){const[o,a]=d.useState(null),[c,i]=d.useState(""),[l,p]=d.useState(null),u=d.useRef(0),[f,m]=d.useState(!1),[h,x]=d.useState(!1),[w,k]=d.useState(!1),{leftWidthPercent:S,containerRef:M,onDividerMouseDown:j}=$n(50),y=d.useRef(null),[I,R]=d.useState(!1),z=d.useRef(new Map),E=d.useRef(null),b=d.useRef(null),L=d.useCallback(()=>{if(!o)return;const C=h?b.current:E.current;C&&z.current.set(o,C.scrollTop)},[o,h]),D=d.useCallback(C=>{const A=z.current.get(C);A!=null&&requestAnimationFrame(()=>{const $=h?b.current:E.current;$&&($.scrollTop=A)})},[h]),O=d.useCallback(C=>{L();const A=Fn(C);a(C),p(A),i(""),u.current=0,m(!1),Ae(e,t,C).then($=>{$&&(i($.content),u.current=$.mtime,requestAnimationFrame(()=>D(C)))}).catch(()=>{})},[e,t,L,D]);d.useEffect(()=>{if(!o)return;let C=!1;const $=setInterval(async()=>{if(!C)try{const Y=await Ae(e,t,o,u.current);if(C)return;Y&&(i(Y.content),u.current=Y.mtime)}catch{}},Pn);return()=>{C=!0,clearInterval($)}},[e,t,o]);const F=d.useCallback(()=>{o&&navigator.clipboard.writeText(o).then(()=>{k(!0),setTimeout(()=>k(!1),1500)}).catch(()=>{})},[o]);d.useEffect(()=>{if(!h)return;const C=A=>{A.key==="Escape"&&(L(),x(!1))};return document.addEventListener("keydown",C),()=>document.removeEventListener("keydown",C)},[h,L]),d.useEffect(()=>{o&&D(o)},[h,o,D]);const N=C=>o?!c&&l!=="pdf"?s.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#565f89",fontSize:"13px"},children:"Loading..."}):l==="md"?s.jsx("div",{ref:C,style:{height:"100%",overflow:"auto"},children:s.jsx(En,{content:c})}):l==="html"?s.jsx("div",{ref:C,style:{height:"100%",overflow:"auto"},children:s.jsx("iframe",{srcDoc:c,sandbox:"allow-same-origin",style:{width:"100%",height:"100%",border:"none",backgroundColor:"#fff"},title:"HTML Preview"})}):l==="pdf"?s.jsx(On,{data:c,scrollRef:C}):s.jsx("div",{ref:C,style:{height:"100%",overflow:"auto"},children:s.jsx("pre",{style:{margin:0,padding:"12px",fontFamily:'"Cascadia Code", "Fira Code", "JetBrains Mono", Consolas, monospace',fontSize:"13px",color:"#a9b1d6",whiteSpace:"pre-wrap",wordBreak:"break-all",lineHeight:1.5},children:c})}):s.jsx(Un,{sessionId:t,onSelect:O});return s.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",backgroundColor:"#1a1b26",overflow:"hidden"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",height:"28px",flexShrink:0,backgroundColor:"#16161e",borderBottom:"1px solid #292e42"},children:[s.jsxs("div",{style:{width:`${S}%`,flexShrink:0,display:"flex",alignItems:"center",gap:"4px",padding:"0 8px",minWidth:0},children:[s.jsx("button",{className:"pane-btn",onClick:()=>m(C=>!C),title:"Open document",style:{color:"#7aa2f7"},children:"Open"}),o&&s.jsxs(s.Fragment,{children:[s.jsx("span",{style:{fontSize:"11px",color:"#565f89",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0,cursor:"pointer"},onClick:F,title:w?"Copied!":`Click to copy: ${o}`,children:w?"Copied!":Oe(o)}),s.jsx("button",{className:"pane-btn",onClick:()=>{L(),x(!0)},title:"Expand document view",style:{fontSize:"12px"},children:"⛶"})]})]}),s.jsx("div",{style:{width:"4px",flexShrink:0}}),s.jsxs("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 8px",minWidth:0},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px"},children:[s.jsx("button",{className:"pane-btn",onClick:()=>{var C;return(C=y.current)==null?void 0:C.send()},disabled:!I,title:"Send to terminal (Ctrl+Enter)",style:I?{color:"#9ece6a"}:{opacity:.4,cursor:"default"},children:"Send"}),s.jsx("span",{style:{fontSize:"10px",color:"#414868"},children:"Ctrl+Enter"})]}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:n,title:"Close Doc panel",children:"×"})]})]}),s.jsxs("div",{ref:M,className:"plan-panel-body",style:{position:"relative"},children:[s.jsxs("div",{className:"plan-renderer",style:{width:`${S}%`,flexShrink:0},children:[N(C=>{E.current=C}),f&&s.jsx(Dn,{sessionId:t,onSelect:O,onClose:()=>m(!1)})]}),s.jsx("div",{className:"plan-divider-h",onMouseDown:j}),s.jsx("div",{className:"plan-editor-wrap",children:s.jsx(Ln,{ref:y,onSend:r,onContentChange:R,sessionId:t,token:e})})]}),h&&s.jsxs("div",{className:"doc-expanded-overlay",children:[s.jsxs("div",{className:"doc-expanded-header",children:[s.jsx("span",{style:{fontSize:"12px",color:"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:o?Oe(o):""}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:()=>{L(),x(!1)},title:"Close expanded view (ESC)",children:"×"})]}),s.jsx("div",{style:{flex:1,overflow:"hidden"},children:N(C=>{b.current=C})})]})]})}const Vn=100,Gn=600;function qn(){return d.useSyncExternalStore(t=>(window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)),()=>window.innerWidth)}const Jn=d.memo(function({terminal:e,canClose:n}){const o=qn()<Gn,a=v(b=>b.killServerSession),c=v(b=>b.splitTerminal),i=v(b=>b.token),l=d.useRef(null),p=d.useRef(null),[u,f]=d.useState(!1),[m,h]=d.useState(!1),[x,w]=d.useState(0),[k,S]=d.useState(!1),[M,j]=d.useState(50),y=d.useRef(null),I=async b=>{const L=b.target.files;if(!(!L||L.length===0||!i)){h(!0),w(0);try{await Tn(i,e.id,L,D=>{w(D)})}catch(D){alert(`Upload failed: ${D instanceof Error?D.message:"Unknown error"}`)}finally{h(!1),w(0),l.current&&(l.current.value="")}}},R=d.useRef(),z=d.useCallback(b=>{if(p.current){const L=b.replace(/\r?\n/g," ").trimEnd();p.current.sendInput(L),R.current=window.setTimeout(()=>{var D;return(D=p.current)==null?void 0:D.sendInput("\r")},50)}},[]);d.useEffect(()=>()=>{R.current&&clearTimeout(R.current)},[]);const E=d.useCallback(b=>{b.preventDefault();const L=y.current;if(!L)return;const D=L.getBoundingClientRect(),O=D.height;document.body.classList.add("resizing-panes-v");const F=C=>{const A=(C.clientY-D.top)/O*100,$=Math.min(80,Math.max(20,A));j(100-$)},N=()=>{document.body.classList.remove("resizing-panes-v"),document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",N)};document.addEventListener("mousemove",F),document.addEventListener("mouseup",N)},[]);return s.jsxs("div",{ref:y,style:{display:"flex",flexDirection:"column",height:"100%",minWidth:0,minHeight:0},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"2px 8px",backgroundColor:"#16161e",borderBottom:"1px solid #292e42",flexShrink:0,height:"24px"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px"},children:[s.jsx("span",{style:{display:"inline-block",width:"6px",height:"6px",borderRadius:"50%",backgroundColor:e.connected?"#9ece6a":"#f7768e"}}),s.jsxs("span",{style:{fontSize:"11px",color:"#565f89"},children:[e.id,e.connected?e.sessionResumed?" (resumed)":"":" (disconnected)"]})]}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px"},children:[s.jsx("input",{ref:l,type:"file",multiple:!0,style:{display:"none"},onChange:I}),s.jsx("button",{className:"pane-btn",onClick:()=>{var b;return(b=l.current)==null?void 0:b.click()},disabled:m,style:m?{color:"#e0af68"}:void 0,title:m?`Uploading ${x}%`:"Upload files","aria-label":"Upload files",children:m?`${x}%`:"↑"}),s.jsx("button",{className:"pane-btn",onClick:()=>f(b=>!b),style:u?{color:"#7aa2f7"}:void 0,title:"Browse files","aria-label":"Browse files",children:"↓"}),s.jsx("button",{className:`pane-btn${k?" pane-btn--active":""}`,onClick:()=>S(b=>!b),title:"Toggle Document browser","aria-label":"Toggle Document browser",children:"Doc"}),s.jsx("button",{className:"pane-btn",onClick:()=>c(e.id,o?"vertical":"horizontal"),title:o?"Split vertical (screen too narrow for horizontal)":"Split horizontal (left/right)","aria-label":"Split horizontal",children:"|"}),s.jsx("button",{className:"pane-btn",onClick:()=>c(e.id,"vertical"),title:"Split vertical (top/bottom)","aria-label":"Split vertical",children:"─"}),n&&s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:()=>a(e.id),title:"Close terminal","aria-label":"Close terminal",children:"×"})]})]}),s.jsxs("div",{style:{flex:1,overflow:"hidden",position:"relative",minHeight:"80px"},children:[s.jsx(vn,{ref:p,sessionId:e.id}),!e.connected&&s.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(26, 27, 38, 0.85)",zIndex:2,pointerEvents:"none"},children:s.jsx("span",{style:{color:"#565f89",fontSize:"13px",fontStyle:"italic"},children:"Connecting..."})}),u&&s.jsx(jn,{sessionId:e.id,onClose:()=>f(!1)})]}),k&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"md-editor-divider",onMouseDown:E}),s.jsx("div",{style:{height:`${M}%`,minHeight:Vn,flexShrink:0,overflow:"hidden"},children:s.jsx(Hn,{onSend:z,onClose:()=>S(!1),sessionId:e.id,token:i||""})})]}),e.error&&s.jsx("div",{style:{padding:"2px 8px",backgroundColor:"#3b2029",borderTop:"1px solid #f7768e",color:"#f7768e",fontSize:"11px",flexShrink:0},children:e.error})]})});class Qe extends d.Component{constructor(){super(...arguments);Se(this,"state",{hasError:!1,error:null})}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,r){}render(){var n,r;return this.state.hasError?this.props.inline?s.jsxs("div",{style:{height:"100%",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:"8px",color:"#c0caf5",fontFamily:"monospace",padding:"16px"},children:[s.jsx("div",{style:{fontSize:"14px",color:"#f7768e"},children:"Pane crashed"}),s.jsx("div",{style:{fontSize:"12px",color:"#565f89",textAlign:"center"},children:((n=this.state.error)==null?void 0:n.message)||"An unexpected error occurred"}),s.jsx("button",{onClick:()=>this.setState({hasError:!1,error:null}),style:{background:"#292e42",border:"1px solid #414868",color:"#c0caf5",padding:"4px 12px",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Retry"})]}):s.jsxs("div",{style:{minHeight:"100vh",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:"16px",color:"#c0caf5",fontFamily:"monospace"},children:[s.jsx("div",{style:{fontSize:"18px",color:"#f7768e"},children:"Something went wrong"}),s.jsx("div",{style:{fontSize:"13px",color:"#565f89",maxWidth:"500px",textAlign:"center"},children:((r=this.state.error)==null?void 0:r.message)||"An unexpected error occurred"}),s.jsx("button",{onClick:()=>window.location.reload(),style:{background:"linear-gradient(135deg, #7aa2f7 0%, #bb9af7 100%)",border:"none",color:"#1a1b26",padding:"8px 24px",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:"bold"},children:"Reload"})]}):this.props.children}}const Kn=4,$e=10;function Yn(){const t=v(o=>o.layout),e=v(o=>o.terminalIds.length),n=v(o=>o.addTerminal);if(!t)return s.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",backgroundColor:"#1a1b26"},children:s.jsx("button",{onClick:()=>n(),style:{background:"none",border:"1px dashed #292e42",color:"#565f89",padding:"16px 32px",borderRadius:"8px",cursor:"pointer",fontSize:"14px"},children:"+ Add Terminal"})});const r=e>1;return s.jsx("div",{style:{height:"100%",width:"100%",overflow:"hidden"},children:s.jsx(et,{node:t,canClose:r})})}const et=d.memo(function({node:e,canClose:n}){return e.type==="leaf"?s.jsx(Xn,{terminalId:e.terminalId,canClose:n}):s.jsx(Zn,{node:e,canClose:n})}),Xn=d.memo(function({terminalId:e,canClose:n}){const r=v(o=>o.terminalsMap[e]);return r?s.jsx(Qe,{inline:!0,children:s.jsx(Jn,{terminal:r,canClose:n})}):null}),Zn=d.memo(function({node:e,canClose:n}){const r=v(p=>p.setSplitSizes),o=d.useRef(null),a=e.direction==="horizontal",c=d.useRef(e.sizes);c.current=e.sizes;const i=d.useCallback((p,u)=>{u.preventDefault();const f=a?"resizing-panes":"resizing-panes-v";document.body.classList.add(f);const m=a?u.clientX:u.clientY,h=[...c.current],x=o.current,w=a?(x==null?void 0:x.clientWidth)||1:(x==null?void 0:x.clientHeight)||1;let k=null;const S=j=>{k||(k=requestAnimationFrame(()=>{k=null;const R=((a?j.clientX:j.clientY)-m)/w*100,z=h[p]+R,E=h[p+1]-R;if(z>=$e&&E>=$e){const b=[...h];b[p]=z,b[p+1]=E,r(e.id,b)}}))},M=()=>{k&&cancelAnimationFrame(k),document.body.classList.remove(f),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",M)};document.addEventListener("mousemove",S),document.addEventListener("mouseup",M)},[a,e.id,r]),l=[];return e.children.forEach((p,u)=>{const f=p.type==="leaf"?p.terminalId:p.id;l.push(s.jsx("div",{style:{flex:`${e.sizes[u]} 0 0`,minWidth:0,minHeight:0,overflow:"hidden"},children:s.jsx(et,{node:p,canClose:n})},f)),u<e.children.length-1&&l.push(s.jsx("div",{onMouseDown:m=>i(u,m),style:{flex:`0 0 ${Kn}px`,cursor:a?"col-resize":"row-resize",backgroundColor:"#292e42",transition:"background-color 0.15s"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor="#7aa2f7"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor="#292e42"}},`divider-${e.id}-${u}`))}),s.jsx("div",{ref:o,style:{display:"flex",flexDirection:a?"row":"column",height:"100%",width:"100%",overflow:"hidden"},children:l})});function Qn({tabId:t}){const e=v(b=>b.tabs.find(L=>L.id===t)),n=v(b=>b.activeTabId),r=v(b=>b.switchTab),o=v(b=>b.closeTab),a=v(b=>b.reopenTab),c=v(b=>b.deleteTab),i=v(b=>b.renameTab),l=v(b=>e?e.terminalIds.map(L=>{const D=b.terminalsMap[L];return D?{id:L,connected:D.connected}:{id:L,connected:!1}}):[]),[p,u]=d.useState(!1),[f,m]=d.useState(""),[h,x]=d.useState(!1),w=d.useRef(null);if(!e)return null;const k=n===t,S=e.status==="open",M=()=>{S&&r(t)},j=b=>{S&&(b.stopPropagation(),m(e.name),u(!0),setTimeout(()=>{var L;return(L=w.current)==null?void 0:L.focus()},0))},y=()=>{const b=f.trim();b&&i(t,b),u(!1)},I=b=>{b.stopPropagation(),a(t)},R=b=>{b.stopPropagation(),o(t)},z=async b=>{b.stopPropagation(),window.confirm(`Delete tab "${e.name}"? This will kill all tmux sessions in this tab.`)&&await c(t)},E=b=>{b.stopPropagation(),x(!h)};return s.jsxs("div",{children:[s.jsxs("div",{onClick:M,style:{padding:"8px 12px",cursor:S?"pointer":"default",borderLeft:k?"3px solid #7aa2f7":"3px solid transparent",backgroundColor:k?"rgba(122, 162, 247, 0.08)":"transparent",display:"flex",alignItems:"center",gap:"8px",borderBottom:"1px solid #292e42",transition:"background-color 0.15s",opacity:S?1:.5},onMouseEnter:b=>{S&&!k&&(b.currentTarget.style.backgroundColor="rgba(122, 162, 247, 0.05)")},onMouseLeave:b=>{k||(b.currentTarget.style.backgroundColor="transparent")},children:[S&&e.terminalIds.length>0&&s.jsx("button",{onClick:E,style:{background:"none",border:"none",color:"#565f89",cursor:"pointer",fontSize:"10px",padding:0,width:14,height:14,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:h?"▼":"▶"}),s.jsxs("div",{style:{flex:1,minWidth:0},children:[p?s.jsx("input",{ref:w,value:f,onChange:b=>m(b.target.value),onBlur:y,onKeyDown:b=>{b.key==="Enter"&&y(),b.key==="Escape"&&u(!1)},style:{width:"100%",background:"#1a1b26",border:"1px solid #7aa2f7",color:"#c0caf5",borderRadius:"3px",padding:"1px 4px",fontSize:"13px",outline:"none"}}):s.jsx("div",{onDoubleClick:j,style:{color:"#c0caf5",fontSize:"13px",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:S?"Double-click to rename":e.name,children:e.name}),s.jsxs("div",{style:{color:"#565f89",fontSize:"11px",marginTop:"2px"},children:[e.terminalIds.length," terminal",e.terminalIds.length!==1?"s":""," · ",Ze(Math.floor(e.createdAt/1e3))]})]}),S?s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:R,style:{flexShrink:0},title:"Close tab",children:"×"}):s.jsxs("div",{style:{display:"flex",gap:"4px",flexShrink:0},children:[s.jsx("button",{className:"pane-btn",onClick:I,title:"Reopen tab",style:{fontSize:"11px",padding:"2px 6px"},children:"↻"}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:z,title:"Delete tab",children:"×"})]})]}),S&&h&&l.length>0&&s.jsx("div",{style:{paddingLeft:"28px",backgroundColor:"rgba(0, 0, 0, 0.2)"},children:l.map(b=>s.jsxs("div",{style:{padding:"4px 8px",fontSize:"11px",color:"#565f89",borderBottom:"1px solid rgba(41, 46, 66, 0.5)"},title:`Connected: ${b.connected}`,children:[s.jsx("span",{style:{fontFamily:"monospace"},children:b.id}),s.jsx("span",{style:{marginLeft:"8px",color:b.connected?"#9ece6a":"#f7768e"},children:b.connected?"●":"○"})]},b.id))})]})}function er({sessionId:t,active:e,createdAt:n}){const r=v(i=>i.addTerminal),o=v(i=>i.killServerSession),a=()=>{r("horizontal",t)},c=i=>{i.stopPropagation(),window.confirm(`Delete orphaned session "${t}"? This will kill the tmux session.`)&&o(t)};return s.jsxs("div",{onClick:a,style:{padding:"8px 12px",cursor:"pointer",display:"flex",alignItems:"center",gap:"8px",borderBottom:"1px solid #292e42",transition:"background-color 0.15s"},onMouseEnter:i=>{i.currentTarget.style.backgroundColor="rgba(122, 162, 247, 0.05)"},onMouseLeave:i=>{i.currentTarget.style.backgroundColor="transparent"},children:[s.jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:e?"#9ece6a":"#565f89",flexShrink:0}}),s.jsxs("div",{style:{flex:1,minWidth:0},children:[s.jsx("div",{style:{color:"#c0caf5",fontSize:"13px",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t}),s.jsx("div",{style:{color:"#565f89",fontSize:"11px",marginTop:"2px"},children:Ze(n)})]}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:c,style:{flexShrink:0},title:"Delete session",children:"×"})]})}function tr(){const t=v(l=>l.sidebarOpen),e=v(l=>l.toggleSidebar),n=v(l=>l.serverSessions),r=v(l=>l.fetchSessions),o=v(l=>l.tabs),a=v(l=>l.terminalIds),c=new Set(o.flatMap(l=>l.terminalIds)),i=n.filter(l=>!c.has(l.sessionId));return d.useEffect(()=>{if(!t)return;r();let l=setInterval(r,5e3);const p=()=>{document.hidden?l&&(clearInterval(l),l=null):(r(),l||(l=setInterval(r,5e3)))};return document.addEventListener("visibilitychange",p),()=>{l&&clearInterval(l),document.removeEventListener("visibilitychange",p)}},[t,r]),d.useEffect(()=>{if(!t)return;const l=setTimeout(r,800);return()=>clearTimeout(l)},[a.length,t,r]),s.jsxs("div",{className:"session-sidebar",style:{width:t?280:0,height:"100%",backgroundColor:"#16161e",borderLeft:t?"1px solid #292e42":"none",display:"flex",flexDirection:"column",flexShrink:0,overflow:"hidden",transition:"width 0.2s ease"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 12px",borderBottom:"1px solid #292e42",flexShrink:0},children:[s.jsx("span",{style:{color:"#7aa2f7",fontSize:"14px",fontWeight:"bold"},children:"Tabs & Sessions"}),s.jsx("button",{onClick:e,style:{background:"none",border:"none",color:"#565f89",cursor:"pointer",fontSize:"16px",padding:"0 4px",lineHeight:1},title:"Close sidebar",children:"×"})]}),s.jsxs("div",{style:{flex:1,overflowY:"auto"},children:[s.jsxs("div",{children:[s.jsx("div",{style:{padding:"8px 12px",color:"#7aa2f7",fontSize:"12px",fontWeight:"bold",backgroundColor:"rgba(122, 162, 247, 0.05)",borderBottom:"1px solid #292e42"},children:"TABS"}),o.length===0?s.jsx("div",{style:{color:"#565f89",fontSize:"13px",textAlign:"center",padding:"12px"},children:"No tabs"}):o.map(l=>s.jsx(Qn,{tabId:l.id},l.id))]}),i.length>0&&s.jsxs("div",{style:{marginTop:"16px"},children:[s.jsx("div",{style:{padding:"8px 12px",color:"#e0af68",fontSize:"12px",fontWeight:"bold",backgroundColor:"rgba(224, 175, 104, 0.05)",borderBottom:"1px solid #292e42"},children:"ORPHANED SESSIONS"}),i.map(l=>s.jsx(er,{sessionId:l.sessionId,active:l.active,createdAt:l.createdAt},l.sessionId))]})]})]})}const tt=ye.memo(()=>{const t=v(y=>y.tabs),e=v(y=>y.activeTabId),n=v(y=>y.addTab),r=v(y=>y.switchTab),o=v(y=>y.closeTab),a=v(y=>y.renameTab),[c,i]=d.useState(null),[l,p]=d.useState(""),u=d.useRef(null),f=t.filter(y=>y.status==="open");d.useEffect(()=>{c&&u.current&&(u.current.focus(),u.current.select())},[c]);const m=y=>{i(y.id),p(y.name)},h=()=>{c&&l.trim()&&a(c,l.trim()),i(null),p("")},x=()=>{i(null),p("")},w=y=>{y.key==="Enter"?h():y.key==="Escape"&&x()},k=y=>{c||r(y)},S=(y,I)=>{y.stopPropagation(),o(I)},M=(y,I)=>{y.button===1&&(y.preventDefault(),o(I))},j=f.length>1;return s.jsxs("div",{className:"tab-bar",children:[f.map(y=>{const I=y.id===e,R=c===y.id,z=y.terminalIds.length;return s.jsx("div",{className:`tab-item ${I?"tab-item--active":""}`,onClick:()=>k(y.id),onDoubleClick:()=>m(y),onMouseDown:E=>M(E,y.id),children:R?s.jsx("input",{ref:u,type:"text",value:l,onChange:E=>p(E.target.value),onBlur:h,onKeyDown:w,className:"tab-item__rename-input"}):s.jsxs(s.Fragment,{children:[s.jsxs("span",{className:"tab-item__name",children:[y.name," ",z>0&&`(${z})`]}),j&&s.jsx("button",{className:"tab-item__close",onClick:E=>S(E,y.id),title:"Close tab","aria-label":"Close tab",children:"×"})]})},y.id)}),s.jsx("button",{className:"tab-bar-add",onClick:()=>n(),title:"New tab","aria-label":"Add new tab",children:"+"})]})});tt.displayName="TabBar";function nr(){return localStorage.getItem("ai-cli-online-token")}function rr(){const t=v(l=>l.token),e=v(l=>l.setToken),n=v(l=>l.tabs),r=v(l=>l.addTab),o=v(l=>l.toggleSidebar),a=v(l=>l.fontSize),c=v(l=>l.setFontSize),i=v(l=>l.tabsLoading);return d.useEffect(()=>{const l=nr();l&&!t&&e(l)},[]),d.useEffect(()=>{t&&!i&&n.filter(l=>l.status==="open").length===0&&r("Default")},[t,i]),t?s.jsxs("div",{style:{height:"100vh",display:"flex",flexDirection:"column",backgroundColor:"#1a1b26"},children:[s.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"6px 16px",backgroundColor:"#16161e",borderBottom:"1px solid #292e42",flexShrink:0},children:[s.jsx("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:s.jsx("span",{style:{fontSize:"15px",fontWeight:"bold",color:"#7aa2f7",letterSpacing:"0.5px"},children:"AI-Cli Online"})}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[s.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"2px",padding:"1px 4px",borderRadius:"6px",backgroundColor:"rgba(0,0,0,0.2)"},children:[s.jsx("button",{className:"header-btn",onClick:()=>c(a-1),disabled:a<=10,title:"Decrease font size",style:{fontSize:"11px",padding:"1px 5px",minWidth:0},children:"A−"}),s.jsx("span",{style:{fontSize:"11px",color:"#a9b1d6",minWidth:"20px",textAlign:"center"},children:a}),s.jsx("button",{className:"header-btn",onClick:()=>c(a+1),disabled:a>=24,title:"Increase font size",style:{fontSize:"11px",padding:"1px 5px",minWidth:0},children:"A+"})]}),s.jsx(sr,{}),s.jsx("button",{className:"header-btn",onClick:o,title:"Toggle Tabs & Sessions Sidebar","aria-label":"Toggle sidebar",children:"☰"}),s.jsx("button",{className:"header-btn header-btn--muted",onClick:()=>{window.confirm("Logout will close all terminals. Continue?")&&e(null)},children:"Logout"})]})]}),s.jsxs("div",{style:{flex:1,display:"flex",overflow:"hidden"},children:[s.jsx("main",{style:{flex:1,overflow:"hidden"},children:s.jsx(Yn,{})}),s.jsx(tr,{})]}),s.jsx(tt,{})]}):s.jsx(en,{})}const or=[1,2,3,4];function sr(){const t=v(r=>r.latency);if(t===null)return s.jsx("span",{style:{fontSize:"10px",color:"#414868"},title:"Measuring latency...",children:"--ms"});let e,n;return t<50?(e="#9ece6a",n=4):t<150?(e="#e0af68",n=3):t<300?(e="#ff9e64",n=2):(e="#f7768e",n=1),s.jsxs("span",{style:{display:"inline-flex",alignItems:"end",gap:"1.5px",padding:"2px 8px",borderRadius:"10px",backgroundColor:"rgba(0,0,0,0.2)"},title:`Latency: ${t}ms`,children:[or.map(r=>s.jsx("span",{style:{display:"inline-block",width:"2.5px",height:`${3+r*2}px`,backgroundColor:r<=n?e:"#292e42",borderRadius:"1px",transition:"background-color 0.3s ease"}},r)),s.jsxs("span",{style:{fontSize:"10px",color:e,marginLeft:"4px",fontWeight:500},children:[t,"ms"]})]})}xe.createRoot(document.getElementById("root")).render(s.jsx(ye.StrictMode,{children:s.jsx(Qe,{children:s.jsx(rr,{})})}));
|
package/web/dist/index.html
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<title>AI-Cli Online</title>
|
|
9
9
|
<link rel="preload" href="/fonts/MapleMono-CN-Regular.woff2" as="font" type="font/woff2" crossorigin />
|
|
10
10
|
<link rel="preload" href="/fonts/JetBrainsMono-Regular.woff2" as="font" type="font/woff2" crossorigin />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-DpLQJExV.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/react-vendor-BCIvbQoU.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/terminal-CFozNkMS.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/markdown-BERZKN_L.js">
|
package/web/package.json
CHANGED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
var nt=Object.defineProperty;var rt=(t,e,o)=>e in t?nt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var we=(t,e,o)=>rt(t,typeof e!="symbol"?e+"":e,o);import{r as d,a as ot,g as st,R as xe}from"./react-vendor-BCIvbQoU.js";import{D as _e,o as Ae,x as it}from"./terminal-CFozNkMS.js";import{d as at,p as lt}from"./markdown-BERZKN_L.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const a of r)if(a.type==="childList")for(const l of a.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&n(l)}).observe(document,{childList:!0,subtree:!0});function o(r){const a={};return r.integrity&&(a.integrity=r.integrity),r.referrerPolicy&&(a.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?a.credentials="include":r.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function n(r){if(r.ep)return;r.ep=!0;const a=o(r);fetch(r.href,a)}})();var $e={exports:{}},ie={};/**
|
|
2
|
-
* @license React
|
|
3
|
-
* react-jsx-runtime.production.min.js
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
6
|
-
*
|
|
7
|
-
* This source code is licensed under the MIT license found in the
|
|
8
|
-
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var ct=d,dt=Symbol.for("react.element"),ut=Symbol.for("react.fragment"),ft=Object.prototype.hasOwnProperty,pt=ct.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,mt={key:!0,ref:!0,__self:!0,__source:!0};function Pe(t,e,o){var n,r={},a=null,l=null;o!==void 0&&(a=""+o),e.key!==void 0&&(a=""+e.key),e.ref!==void 0&&(l=e.ref);for(n in e)ft.call(e,n)&&!mt.hasOwnProperty(n)&&(r[n]=e[n]);if(t&&t.defaultProps)for(n in e=t.defaultProps,e)r[n]===void 0&&(r[n]=e[n]);return{$$typeof:dt,type:t,key:a,ref:l,props:r,_owner:pt.current}}ie.Fragment=ut;ie.jsx=Pe;ie.jsxs=Pe;$e.exports=ie;var s=$e.exports,pe={},ve=ot;pe.createRoot=ve.createRoot,pe.hydrateRoot=ve.hydrateRoot;const ht={},Se=t=>{let e;const o=new Set,n=(p,u)=>{const m=typeof p=="function"?p(e):p;if(!Object.is(m,e)){const h=e;e=u??(typeof m!="object"||m===null)?m:Object.assign({},e,m),o.forEach(b=>b(e,h))}},r=()=>e,c={setState:n,getState:r,getInitialState:()=>f,subscribe:p=>(o.add(p),()=>o.delete(p)),destroy:()=>{o.clear()}},f=e=t(n,r,c);return c},xt=t=>t?Se(t):Se;var Fe={exports:{}},We={},Be={exports:{}},Ue={};/**
|
|
10
|
-
* @license React
|
|
11
|
-
* use-sync-external-store-shim.production.js
|
|
12
|
-
*
|
|
13
|
-
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
14
|
-
*
|
|
15
|
-
* This source code is licensed under the MIT license found in the
|
|
16
|
-
* LICENSE file in the root directory of this source tree.
|
|
17
|
-
*/var ee=d;function bt(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var yt=typeof Object.is=="function"?Object.is:bt,gt=ee.useState,wt=ee.useEffect,vt=ee.useLayoutEffect,St=ee.useDebugValue;function Tt(t,e){var o=e(),n=gt({inst:{value:o,getSnapshot:e}}),r=n[0].inst,a=n[1];return vt(function(){r.value=o,r.getSnapshot=e,ue(r)&&a({inst:r})},[t,o,e]),wt(function(){return ue(r)&&a({inst:r}),t(function(){ue(r)&&a({inst:r})})},[t]),St(o),o}function ue(t){var e=t.getSnapshot;t=t.value;try{var o=e();return!yt(t,o)}catch{return!0}}function kt(t,e){return e()}var Ct=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?kt:Tt;Ue.useSyncExternalStore=ee.useSyncExternalStore!==void 0?ee.useSyncExternalStore:Ct;Be.exports=Ue;var It=Be.exports;/**
|
|
18
|
-
* @license React
|
|
19
|
-
* use-sync-external-store-shim/with-selector.production.js
|
|
20
|
-
*
|
|
21
|
-
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
22
|
-
*
|
|
23
|
-
* This source code is licensed under the MIT license found in the
|
|
24
|
-
* LICENSE file in the root directory of this source tree.
|
|
25
|
-
*/var ae=d,jt=It;function Et(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var Rt=typeof Object.is=="function"?Object.is:Et,zt=jt.useSyncExternalStore,Lt=ae.useRef,Dt=ae.useEffect,Nt=ae.useMemo,Mt=ae.useDebugValue;We.useSyncExternalStoreWithSelector=function(t,e,o,n,r){var a=Lt(null);if(a.current===null){var l={hasValue:!1,value:null};a.current=l}else l=a.current;a=Nt(function(){function c(h){if(!f){if(f=!0,p=h,h=n(h),r!==void 0&&l.hasValue){var b=l.value;if(r(b,h))return u=b}return u=h}if(b=u,Rt(p,h))return b;var v=n(h);return r!==void 0&&r(b,v)?(p=h,b):(p=h,u=v)}var f=!1,p,u,m=o===void 0?null:o;return[function(){return c(e())},m===null?void 0:function(){return c(m())}]},[e,o,n,r]);var i=zt(t,a[0],a[1]);return Dt(function(){l.hasValue=!0,l.value=i},[i]),Mt(i),i};Fe.exports=We;var Ot=Fe.exports;const _t=st(Ot),He={},{useDebugValue:At}=xe,{useSyncExternalStoreWithSelector:$t}=_t;let Te=!1;const Pt=t=>t;function Ft(t,e=Pt,o){(He?"production":void 0)!=="production"&&o&&!Te&&(Te=!0);const n=$t(t.subscribe,t.getState,t.getServerState||t.getInitialState,e,o);return At(n),n}const ke=t=>{const e=typeof t=="function"?xt(t):t,o=(n,r)=>Ft(e,n,r);return Object.assign(o,e),o},Wt=t=>t?ke(t):ke,V="";function q(t){return{Authorization:`Bearer ${t}`}}async function Bt(t){try{const e=await fetch(`${V}/api/settings/font-size`,{headers:q(t)});return e.ok?(await e.json()).fontSize:14}catch{return 14}}async function Ut(t,e){try{await fetch(`${V}/api/settings/font-size`,{method:"PUT",headers:{...q(t),"Content-Type":"application/json"},body:JSON.stringify({fontSize:e})})}catch{}}const se="ai-cli-online-tabs",Ce="ai-cli-online-layout",Ie="ai-cli-online-session-names";function me(t,e){if(t.type==="leaf")return t.terminalId===e?null:t;const o=[],n=[];for(let l=0;l<t.children.length;l++){const i=me(t.children[l],e);i!==null&&(o.push(i),n.push(t.sizes[l]))}if(o.length===0)return null;if(o.length===1)return o[0];const r=n.reduce((l,i)=>l+i,0),a=n.map(l=>l/r*100);return{...t,children:o,sizes:a}}function Ve(t,e,o,n,r){return t.type==="leaf"?t.terminalId===e?{id:r,type:"split",direction:o,children:[t,n],sizes:[50,50]}:t:{...t,children:t.children.map(a=>Ve(a,e,o,n,r))}}function Ge(t,e,o){return t.type==="leaf"?t:t.id===e?{...t,sizes:o}:{...t,children:t.children.map(n=>Ge(n,e,o))}}function fe(t){return t.tabs.find(e=>e.id===t.activeTabId)}function X(t,e,o){return t.map(n=>n.id===e?o(n):n)}function U(t){const e={version:2,activeTabId:t.activeTabId,nextId:t.nextId,nextSplitId:t.nextSplitId,nextTabId:t.nextTabId,tabs:t.tabs};try{localStorage.setItem(se,JSON.stringify(e))}catch{}}let te=null,ne=null;function Ht(t){te&&clearTimeout(te),te=setTimeout(()=>{te=null,U(t)},500)}function Vt(){try{const t=localStorage.getItem(se);if(t){const e=JSON.parse(t);if(e.version===2)return e}}catch{}try{const t=localStorage.getItem(Ce);if(t){const e=JSON.parse(t);let o="Default";try{const a=localStorage.getItem(Ie);if(a){const l=JSON.parse(a),i=Object.values(l)[0];i&&(o=i)}}catch{}const n={id:"tab1",name:o,status:"open",terminalIds:e.terminalIds,layout:e.layout,createdAt:Date.now()},r={version:2,activeTabId:"tab1",nextId:e.nextId,nextSplitId:e.nextSplitId,nextTabId:2,tabs:[n]};try{localStorage.setItem(se,JSON.stringify(r))}catch{}return localStorage.removeItem(Ce),localStorage.removeItem(Ie),r}}catch{}return null}function B(t){return{tabs:t.tabs,activeTabId:t.activeTabId,nextId:t.nextId,nextSplitId:t.nextSplitId,nextTabId:t.nextTabId}}const k=Wt((t,e)=>({token:null,setToken:o=>{if(o){try{localStorage.setItem("ai-cli-online-token",o)}catch{}Bt(o).then(r=>{e().token===o&&t({fontSize:r})});const n=Vt();if(n&&n.tabs.length>0){const r={};for(const i of n.tabs)if(i.status==="open")for(const c of i.terminalIds)r[c]={id:c,connected:!1,sessionResumed:!1,error:null};const a=n.tabs.find(i=>i.id===n.activeTabId&&i.status==="open")||n.tabs.find(i=>i.status==="open"),l=(a==null?void 0:a.id)||"";t({token:o,terminalsMap:r,tabs:n.tabs,activeTabId:l,nextId:n.nextId,nextSplitId:n.nextSplitId,nextTabId:n.nextTabId,terminalIds:(a==null?void 0:a.terminalIds)||[],layout:(a==null?void 0:a.layout)||null});return}}else localStorage.removeItem("ai-cli-online-token"),localStorage.removeItem(se);t({token:o,terminalsMap:{},tabs:[],activeTabId:"",nextId:1,nextSplitId:1,nextTabId:1,terminalIds:[],layout:null})},terminalsMap:{},terminalIds:[],layout:null,nextId:1,nextSplitId:1,tabs:[],activeTabId:"",nextTabId:1,addTab:o=>{const n=e(),r=`tab${n.nextTabId}`,a=`t${n.nextId}`,l={id:a,connected:!1,sessionResumed:!1,error:null},i={type:"leaf",terminalId:a},c={id:r,name:o||`Tab ${n.nextTabId}`,status:"open",terminalIds:[a],layout:i,createdAt:Date.now()};return t({tabs:[...n.tabs,c],activeTabId:r,nextTabId:n.nextTabId+1,nextId:n.nextId+1,terminalsMap:{...n.terminalsMap,[a]:l},terminalIds:c.terminalIds,layout:c.layout}),U(B(e())),r},switchTab:o=>{const r=e().tabs.find(a=>a.id===o);!r||r.status!=="open"||(t({activeTabId:o,terminalIds:r.terminalIds,layout:r.layout}),U(B(e())))},closeTab:o=>{const n=e(),r=n.tabs.find(u=>u.id===o);if(!r||r.status!=="open"||n.tabs.filter(u=>u.status==="open").length<=1)return;const l={...n.terminalsMap};for(const u of r.terminalIds)delete l[u];const i=X(n.tabs,o,u=>({...u,status:"closed"}));let c=n.activeTabId,f=n.terminalIds,p=n.layout;if(n.activeTabId===o){const u=n.tabs.findIndex(b=>b.id===o),m=i.filter(b=>b.status==="open"),h=m.find(b=>i.findIndex(T=>T.id===b.id)>u)||m[m.length-1];h&&(c=h.id,f=h.terminalIds,p=h.layout)}t({tabs:i,activeTabId:c,terminalsMap:l,terminalIds:f,layout:p}),U(B(e()))},reopenTab:o=>{const n=e(),r=n.tabs.find(i=>i.id===o);if(!r||r.status!=="closed")return;const a={...n.terminalsMap};for(const i of r.terminalIds)a[i]={id:i,connected:!1,sessionResumed:!1,error:null};const l=X(n.tabs,o,i=>({...i,status:"open"}));t({tabs:l,activeTabId:o,terminalsMap:a,terminalIds:r.terminalIds,layout:r.layout}),U(B(e()))},deleteTab:async o=>{const n=e(),r=n.tabs.find(h=>h.id===o);if(!r)return;const a=n.token;a&&await Promise.all(r.terminalIds.map(h=>fetch(`${V}/api/sessions/${encodeURIComponent(h)}`,{method:"DELETE",headers:q(a)}).catch(()=>{})));const l=e(),i=l.tabs.find(h=>h.id===o);if(!i)return;const c={...l.terminalsMap};for(const h of i.terminalIds)delete c[h];const f=l.tabs.filter(h=>h.id!==o);let p=l.activeTabId,u=l.terminalIds,m=l.layout;if(l.activeTabId===o){const h=f.find(b=>b.status==="open");h?(p=h.id,u=h.terminalIds,m=h.layout):(p="",u=[],m=null)}t({tabs:f,activeTabId:p,terminalsMap:c,terminalIds:u,layout:m}),U(B(e())),setTimeout(()=>e().fetchSessions(),500)},renameTab:(o,n)=>{const r=X(e().tabs,o,a=>({...a,name:n}));t({tabs:r}),U(B(e()))},addTerminal:(o,n)=>{const r=e();if(n&&r.terminalsMap[n])return n;const a=fe(r);if(!a){const C=`tab${r.nextTabId}`,D=n||`t${r.nextId}`;let z=r.nextId;const I=D.match(/^t(\d+)$/);I&&(z=Math.max(z,parseInt(I[1],10)+1));const x=n?z:z+1,R={id:D,connected:!1,sessionResumed:!1,error:null},L={type:"leaf",terminalId:D},A={id:C,name:`Tab ${r.nextTabId}`,status:"open",terminalIds:[D],layout:L,createdAt:Date.now()};return t({tabs:[...r.tabs,A],activeTabId:C,nextTabId:r.nextTabId+1,nextId:x,terminalsMap:{...r.terminalsMap,[D]:R},terminalIds:[D],layout:L}),U(B(e())),D}const{nextId:l,nextSplitId:i,terminalsMap:c}=r,{terminalIds:f,layout:p}=a,u=n||`t${l}`;let m=l;const h=u.match(/^t(\d+)$/);h&&(m=Math.max(m,parseInt(h[1],10)+1));const b={id:u,connected:!1,sessionResumed:!1,error:null},v={type:"leaf",terminalId:u};let T,w=i;if(!p)T=v;else if(p.type==="leaf"){const C=o||"horizontal";T={id:`s${w}`,type:"split",direction:C,children:[p,v],sizes:[50,50]},w++}else if(p.direction===(o||"horizontal")){const D=100/(p.children.length+1),z=(100-D)/100,I=[...p.sizes.map(x=>x*z),D];T={...p,children:[...p.children,v],sizes:I}}else{const C=o||"horizontal";T={id:`s${w}`,type:"split",direction:C,children:[p,v],sizes:[50,50]},w++}const E=[...f,u],N=n?m:m+1,g=X(r.tabs,a.id,C=>({...C,terminalIds:E,layout:T}));return t({terminalsMap:{...c,[u]:b},terminalIds:E,layout:T,tabs:g,nextId:N,nextSplitId:w}),U(B(e())),u},splitTerminal:(o,n)=>{const r=e(),a=fe(r);if(!a||!a.layout)return"";const{nextId:l,nextSplitId:i,terminalsMap:c}=r,f=`t${l}`,p={id:f,connected:!1,sessionResumed:!1,error:null},u={type:"leaf",terminalId:f},m=`s${i}`,h=Ve(a.layout,o,n,u,m),b=[...a.terminalIds,f],v=l+1,T=i+1,w=X(r.tabs,a.id,E=>({...E,terminalIds:b,layout:h}));return t({terminalsMap:{...c,[f]:p},terminalIds:b,layout:h,tabs:w,nextId:v,nextSplitId:T}),U(B(e())),f},removeTerminal:o=>{const n=e(),r=n.tabs.find(p=>p.terminalIds.includes(o));if(!r){const{[o]:p,...u}=n.terminalsMap;t({terminalsMap:u});return}const a=r.terminalIds.filter(p=>p!==o),l=r.layout?me(r.layout,o):null,i=X(n.tabs,r.id,p=>({...p,terminalIds:a,layout:l})),{[o]:c,...f}=n.terminalsMap;r.id===n.activeTabId?t({terminalsMap:f,terminalIds:a,layout:l,tabs:i}):t({terminalsMap:f,tabs:i}),U(B(e()))},setTerminalConnected:(o,n)=>{t(r=>{const a=r.terminalsMap[o];return!a||a.connected===n?r:{terminalsMap:{...r.terminalsMap,[o]:{...a,connected:n}}}})},setTerminalResumed:(o,n)=>{t(r=>{const a=r.terminalsMap[o];return!a||a.sessionResumed===n?r:{terminalsMap:{...r.terminalsMap,[o]:{...a,sessionResumed:n}}}})},setTerminalError:(o,n)=>{t(r=>{const a=r.terminalsMap[o];return!a||a.error===n?r:{terminalsMap:{...r.terminalsMap,[o]:{...a,error:n}}}})},setSplitSizes:(o,n)=>{const r=e(),a=fe(r);if(!a||!a.layout)return;const l=Ge(a.layout,o,n),i=X(r.tabs,a.id,c=>({...c,layout:l}));t({layout:l,tabs:i}),Ht(B(e()))},fontSize:14,setFontSize:o=>{const n=Math.max(10,Math.min(24,o));t({fontSize:n}),ne&&clearTimeout(ne),ne=setTimeout(()=>{ne=null;const r=e().token;r&&Ut(r,n)},500)},latency:null,setLatency:o=>t({latency:o}),sidebarOpen:!1,toggleSidebar:()=>t(o=>({sidebarOpen:!o.sidebarOpen})),serverSessions:[],fetchSessions:async()=>{const o=e().token;if(o)try{const n=await fetch(`${V}/api/sessions`,{headers:q(o)});if(!n.ok)return;const r=await n.json();t({serverSessions:r})}catch{}},killServerSession:async o=>{const n=e().token;if(!n)return;try{await fetch(`${V}/api/sessions/${encodeURIComponent(o)}`,{method:"DELETE",headers:q(n)})}catch{}const r=e(),a=r.tabs.find(l=>l.terminalIds.includes(o));if(a){const l=a.terminalIds.filter(u=>u!==o),i=a.layout?me(a.layout,o):null,c=X(r.tabs,a.id,u=>({...u,terminalIds:l,layout:i})),{[o]:f,...p}=r.terminalsMap;a.id===r.activeTabId?t({terminalsMap:p,terminalIds:l,layout:i,tabs:c}):t({terminalsMap:p,tabs:c}),U(B(e()))}else{const{[o]:l,...i}=r.terminalsMap;t({terminalsMap:i})}setTimeout(()=>e().fetchSessions(),500)}}));function Gt(){const[t,e]=d.useState(""),o=k(r=>r.setToken),n=r=>{r.preventDefault(),t.trim()&&o(t.trim())};return s.jsx("div",{style:{minHeight:"100vh",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",padding:"16px",background:"radial-gradient(ellipse at 50% 0%, rgba(122, 162, 247, 0.08) 0%, #1a1b26 70%)"},children:s.jsxs("div",{className:"login-card",style:{backgroundColor:"#24283b",borderRadius:"12px",padding:"40px 36px",width:"100%",maxWidth:"400px",border:"1px solid #292e42"},children:[s.jsxs("div",{style:{textAlign:"center",marginBottom:"36px"},children:[s.jsx("div",{style:{width:"56px",height:"56px",margin:"0 auto 16px",borderRadius:"14px",background:"linear-gradient(135deg, #7aa2f7 0%, #bb9af7 100%)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"24px",color:"#1a1b26",fontWeight:"bold",boxShadow:"0 4px 16px rgba(122, 162, 247, 0.3)"},children:">_"}),s.jsx("h1",{style:{fontSize:"22px",fontWeight:"bold",color:"#c0caf5",marginBottom:"6px",letterSpacing:"0.5px"},children:"AI-Cli Online"}),s.jsx("p",{style:{color:"#565f89",fontSize:"13px"},children:"Terminal in your browser"})]}),s.jsxs("form",{onSubmit:n,children:[s.jsxs("div",{style:{marginBottom:"20px"},children:[s.jsx("label",{htmlFor:"token",style:{display:"block",fontSize:"12px",color:"#7aa2f7",marginBottom:"8px",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.5px"},children:"Auth Token"}),s.jsx("input",{type:"password",id:"token",className:"login-input",value:t,onChange:r=>e(r.target.value),placeholder:"Enter your AUTH_TOKEN",autoFocus:!0,autoComplete:"current-password",style:{width:"100%",padding:"11px 14px",backgroundColor:"#1a1b26",color:"#c0caf5",border:"1px solid #292e42",borderRadius:"8px",fontSize:"14px",outline:"none"}})]}),s.jsx("button",{type:"submit",className:"login-submit",disabled:!t.trim(),style:{width:"100%",padding:"11px",background:t.trim()?"linear-gradient(135deg, #7aa2f7 0%, #7dcfff 100%)":"#292e42",color:t.trim()?"#1a1b26":"#565f89",border:"none",borderRadius:"8px",fontSize:"14px",fontWeight:600,cursor:t.trim()?"pointer":"not-allowed",letterSpacing:"0.3px"},children:"Connect"})]}),s.jsx("div",{style:{marginTop:"28px",textAlign:"center",color:"#414868",fontSize:"11px"},children:s.jsxs("p",{children:["Token is configured in"," ",s.jsx("code",{style:{backgroundColor:"#1a1b26",padding:"2px 6px",borderRadius:"4px",border:"1px solid #292e42",fontSize:"11px"},children:"server/.env"})]})})]})})}/**
|
|
26
|
-
* Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
|
|
27
|
-
* @license MIT
|
|
28
|
-
*
|
|
29
|
-
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
30
|
-
* @license MIT
|
|
31
|
-
*
|
|
32
|
-
* Originally forked from (with the author's permission):
|
|
33
|
-
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
34
|
-
* http://bellard.org/jslinux/
|
|
35
|
-
* Copyright (c) 2011 Fabrice Bellard
|
|
36
|
-
*/var qt=class{constructor(t,e,o,n={}){this._terminal=t,this._regex=e,this._handler=o,this._options=n}provideLinks(t,e){let o=Yt.computeLink(t,this._regex,this._terminal,this._handler);e(this._addCallbacks(o))}_addCallbacks(t){return t.map(e=>(e.leave=this._options.leave,e.hover=(o,n)=>{if(this._options.hover){let{range:r}=e;this._options.hover(o,n,r)}},e))}};function Kt(t){try{let e=new URL(t),o=e.password&&e.username?`${e.protocol}//${e.username}:${e.password}@${e.host}`:e.username?`${e.protocol}//${e.username}@${e.host}`:`${e.protocol}//${e.host}`;return t.toLocaleLowerCase().startsWith(o.toLocaleLowerCase())}catch{return!1}}var Yt=class re{static computeLink(e,o,n,r){let a=new RegExp(o.source,(o.flags||"")+"g"),[l,i]=re._getWindowedLineStrings(e-1,n),c=l.join(""),f,p=[];for(;f=a.exec(c);){let u=f[0];if(!Kt(u))continue;let[m,h]=re._mapStrIdx(n,i,0,f.index),[b,v]=re._mapStrIdx(n,m,h,u.length);if(m===-1||h===-1||b===-1||v===-1)continue;let T={start:{x:h+1,y:m+1},end:{x:v,y:b+1}};p.push({range:T,text:u,activate:r})}return p}static _getWindowedLineStrings(e,o){let n,r=e,a=e,l=0,i="",c=[];if(n=o.buffer.active.getLine(e)){let f=n.translateToString(!0);if(n.isWrapped&&f[0]!==" "){for(l=0;(n=o.buffer.active.getLine(--r))&&l<2048&&(i=n.translateToString(!0),l+=i.length,c.push(i),!(!n.isWrapped||i.indexOf(" ")!==-1)););c.reverse()}for(c.push(f),l=0;(n=o.buffer.active.getLine(++a))&&n.isWrapped&&l<2048&&(i=n.translateToString(!0),l+=i.length,c.push(i),i.indexOf(" ")===-1););}return[c,r]}static _mapStrIdx(e,o,n,r){let a=e.buffer.active,l=a.getNullCell(),i=n;for(;r;){let c=a.getLine(o);if(!c)return[-1,-1];for(let f=i;f<c.length;++f){c.getCell(f,l);let p=l.getChars();if(l.getWidth()&&(r-=p.length||1,f===c.length-1&&p==="")){let u=a.getLine(o+1);u&&u.isWrapped&&(u.getCell(0,l),l.getWidth()===2&&(r+=1))}if(r<0)return[o,f]}o++,i=0}return[o,i]}},Jt=/(https?|HTTPS?):[/]{2}[^\s"'!*(){}|\\\^<>`]*[^\s"':,.!?{}|\\\^~\[\]`()<>]/;function Xt(t,e){let o=window.open();if(o){try{o.opener=null}catch{}o.location.href=e}}var Zt=class{constructor(t=Xt,e={}){this._handler=t,this._options=e}activate(t){this._terminal=t;let e=this._options,o=e.urlRegex||Jt;this._linkProvider=this._terminal.registerLinkProvider(new qt(this._terminal,o,this._handler,e))}dispose(){var t;(t=this._linkProvider)==null||t.dispose()}};const Qt=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`,je=500,en=15e3,tn=15e3,nn=5e3,rn=1e4,on=5,sn=64*1024,an=1,Ee=2,ln=3,cn=4,dn=new TextDecoder,un=new TextEncoder;function Re(t,e){const o=un.encode(e),n=new Uint8Array(1+o.length);return n[0]=t,n.set(o,1),n.buffer}function fn(t,e,o){const n=d.useRef(null),r=d.useRef(je),a=d.useRef(null),l=d.useRef(null),i=d.useRef(null),c=d.useRef(null),f=d.useRef(!1),p=d.useRef(o),u=d.useRef(!1),m=d.useRef(0),h=d.useRef(""),b=d.useRef(null),v=d.useRef("");p.current=o;const T=d.useCallback(()=>{l.current&&(clearInterval(l.current),l.current=null),i.current&&(clearTimeout(i.current),i.current=null),a.current&&(clearTimeout(a.current),a.current=null),c.current&&(clearTimeout(c.current),c.current=null),b.current&&(clearTimeout(b.current),b.current=null)},[]),w=d.useCallback(()=>{const{token:C,setTerminalError:D}=k.getState();if(!C||f.current)return;if(n.current){const R=n.current.readyState;if(R===WebSocket.OPEN||R===WebSocket.CONNECTING)return}u.current=!1;const z=`${Qt}?sessionId=${encodeURIComponent(e)}`,I=new WebSocket(z);I.binaryType="arraybuffer",c.current=window.setTimeout(()=>{I.readyState===WebSocket.CONNECTING&&I.close()},rn);const x=()=>{I.readyState===WebSocket.OPEN&&(m.current=performance.now(),I.send(JSON.stringify({type:"ping"})),i.current=window.setTimeout(()=>{m.current>0&&(m.current=0,I.close())},nn))};I.onopen=()=>{c.current&&(clearTimeout(c.current),c.current=null),I.send(JSON.stringify({type:"auth",token:C})),D(e,null),r.current=je},I.onclose=R=>{const{setTerminalConnected:L,setTerminalError:A,setToken:P}=k.getState();if(L(e,!1),T(),u.current)return;if(R.code===4001){f.current=!0,A(e,"Authentication failed"),P(null),localStorage.removeItem("ai-cli-online-token");return}if(R.code===4002)return;if(R.code===4005){A(e,"Connection limit reached");return}const M=r.current;r.current=Math.min(M*2,en);const j=Math.round(M*(.5+Math.random()));a.current=window.setTimeout(()=>{w()},j)},I.onerror=()=>{},I.onmessage=R=>{var L;try{const A=t.current;if(R.data instanceof ArrayBuffer){const M=new Uint8Array(R.data);if(M.length<1)return;const j=M[0],_=M.subarray(1);switch(j){case an:A==null||A.write(_);break;case ln:A==null||A.write(_);break;case cn:{(L=p.current)==null||L.call(p,dn.decode(_));break}}return}const P=JSON.parse(R.data);switch(P.type){case"connected":{const M=k.getState();M.setTerminalConnected(e,!0),M.setTerminalResumed(e,P.resumed);const j=t.current;j&&I.readyState===WebSocket.OPEN&&I.send(JSON.stringify({type:"resize",cols:j.cols,rows:j.rows})),v.current&&(I.send(Re(Ee,v.current)),v.current=""),x(),l.current=window.setInterval(x,tn);break}case"error":k.getState().setTerminalError(e,P.error);break;case"pong":{if(i.current&&(clearTimeout(i.current),i.current=null),m.current>0){const M=Math.round(performance.now()-m.current),j=k.getState();(j.terminalIds.length===0||j.terminalIds[0]===e)&&j.setLatency(M),m.current=0}break}}}catch{}},n.current=I},[e,t,T]),E=d.useCallback(C=>{const D=n.current;if(!D||D.readyState!==WebSocket.OPEN){v.current.length<sn&&(v.current+=C);return}h.current+=C,b.current||(b.current=window.setTimeout(()=>{const z=h.current;h.current="",b.current=null,z&&D.readyState===WebSocket.OPEN&&D.send(Re(Ee,z))},on))},[]),N=d.useCallback((C,D)=>{var z;((z=n.current)==null?void 0:z.readyState)===WebSocket.OPEN&&n.current.send(JSON.stringify({type:"resize",cols:C,rows:D}))},[]),g=d.useCallback(()=>{var C;((C=n.current)==null?void 0:C.readyState)===WebSocket.OPEN&&n.current.send(JSON.stringify({type:"capture-scrollback"}))},[]);return d.useEffect(()=>(k.getState().token&&(f.current=!1,w()),()=>{u.current=!0,T(),n.current&&(n.current.close(),n.current=null)}),[w,T]),{sendInput:E,sendResize:N,requestScrollback:g}}const qe={background:"#1a1b26",foreground:"#a9b1d6",cursor:"#c0caf5",selectionBackground:"#33467c",black:"#15161e",red:"#f7768e",green:"#9ece6a",yellow:"#e0af68",blue:"#7aa2f7",magenta:"#bb9af7",cyan:"#7dcfff",white:"#a9b1d6",brightBlack:"#414868",brightRed:"#f7768e",brightGreen:"#9ece6a",brightYellow:"#e0af68",brightBlue:"#7aa2f7",brightMagenta:"#bb9af7",brightCyan:"#7dcfff",brightWhite:"#c0caf5"},Ke="'Maple Mono CN', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace",pn=d.forwardRef(function({sessionId:e},o){const n=d.useRef(null),r=d.useRef(null),a=d.useRef(null),[l,i]=d.useState(!1),[c,f]=d.useState(""),p=k(w=>w.fontSize),u=d.useCallback(w=>{f(w),i(!0)},[]),{sendInput:m,sendResize:h,requestScrollback:b}=fn(r,e,u);d.useImperativeHandle(o,()=>({sendInput:m}),[m]);const v=d.useRef(m),T=d.useRef(h);return v.current=m,T.current=h,d.useEffect(()=>{if(!n.current)return;let w=!1,E=null,N=null,g=null,C=null;const D=()=>{if(w||!n.current)return;const z=new _e({cursorBlink:!0,scrollback:1e4,fontSize:k.getState().fontSize,fontFamily:Ke,theme:qe,allowProposedApi:!0}),I=new Ae;z.loadAddon(I),z.loadAddon(new Zt((L,A)=>{window.open(A,"_blank","noopener,noreferrer")})),z.open(n.current);try{const L=new it;L.onContextLoss(()=>{L.dispose()}),z.loadAddon(L)}catch{}r.current=z,a.current=I;const x=()=>{try{const L=n.current;if(L&&L.clientWidth>0&&L.clientHeight>0)return I.fit(),T.current(z.cols,z.rows),!0}catch{}return!1};requestAnimationFrame(()=>x());let R=0;E=setInterval(()=>{R++,(x()||R>=10)&&(clearInterval(E),E=null)},100),z.onData(L=>{v.current(L)}),C=new ResizeObserver(()=>{N||(N=requestAnimationFrame(()=>{N=null;try{I.fit(),g&&clearTimeout(g),g=setTimeout(()=>{g=null,T.current(z.cols,z.rows)},50)}catch{}}))}),C.observe(n.current)};return document.fonts.ready.then(D),()=>{w=!0,E&&clearInterval(E),N&&cancelAnimationFrame(N),g&&clearTimeout(g),C&&C.disconnect(),r.current&&(r.current.dispose(),r.current=null),a.current=null}},[e]),d.useEffect(()=>{const w=r.current,E=a.current;if(!(!w||!E)&&w.options.fontSize!==p){w.options.fontSize=p;try{E.fit()}catch{}T.current(w.cols,w.rows)}},[p]),s.jsxs("div",{style:{width:"100%",height:"100%",position:"relative"},children:[s.jsx("div",{ref:n,style:{width:"100%",height:"100%",backgroundColor:"#1a1b26",contain:"strict",willChange:"transform",isolation:"isolate"}}),s.jsx("button",{onClick:()=>{l?(i(!1),f("")):b()},title:"Toggle scrollback history",style:{position:"absolute",top:4,right:4,zIndex:10,background:l?"#7aa2f7":"rgba(65, 72, 104, 0.7)",color:"#c0caf5",border:"none",borderRadius:4,padding:"2px 8px",fontSize:12,cursor:"pointer",opacity:.8,lineHeight:"20px"},onMouseEnter:w=>{w.currentTarget.style.opacity="1"},onMouseLeave:w=>{w.currentTarget.style.opacity="0.8"},children:l?"✕":"↑"}),l&&s.jsx(mn,{data:c,onClose:()=>{i(!1),f("")}})]})});function mn({data:t,onClose:e}){const o=d.useRef(null),n=d.useRef(e);n.current=e;const r=k(i=>i.fontSize),a=d.useRef(null),l=d.useRef(null);return d.useEffect(()=>{if(!o.current)return;const i=new _e({cursorBlink:!1,disableStdin:!0,scrollback:5e4,fontSize:r,fontFamily:Ke,theme:qe});a.current=i;const c=new Ae;l.current=c,i.loadAddon(c),i.open(o.current),requestAnimationFrame(()=>{try{c.fit()}catch{}i.write(t,()=>{i.scrollToBottom()})});let f=null;const p=new ResizeObserver(()=>{f||(f=requestAnimationFrame(()=>{f=null;try{c.fit()}catch{}}))});p.observe(o.current);const u=m=>{m.key==="Escape"&&n.current()};return document.addEventListener("keydown",u),()=>{f&&cancelAnimationFrame(f),document.removeEventListener("keydown",u),p.disconnect(),i.dispose(),a.current=null,l.current=null}},[t]),d.useEffect(()=>{var i;if(a.current){a.current.options.fontSize=r;try{(i=l.current)==null||i.fit()}catch{}}},[r]),s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column"},children:[s.jsx("div",{style:{padding:"4px 12px",background:"#24283b",color:"#7aa2f7",fontSize:12,borderBottom:"1px solid #414868",flexShrink:0,display:"flex",justifyContent:"space-between",alignItems:"center"},children:s.jsx("span",{children:"Scrollback History (mouse wheel to scroll, ESC to close)"})}),s.jsx("div",{ref:o,style:{flex:1,overflow:"hidden"}})]})}async function oe(t,e,o){const n=o?`?path=${encodeURIComponent(o)}`:"",r=await fetch(`${V}/api/sessions/${encodeURIComponent(e)}/files${n}`,{headers:q(t)});if(!r.ok)throw new Error("Failed to list files");return r.json()}function hn(t,e,o,n){return new Promise((r,a)=>{const l=new FormData;for(const c of o)l.append("files",c);const i=new XMLHttpRequest;i.open("POST",`${V}/api/sessions/${encodeURIComponent(e)}/upload`),i.setRequestHeader("Authorization",`Bearer ${t}`),i.upload.addEventListener("progress",c=>{c.lengthComputable&&n&&n(Math.round(c.loaded/c.total*100))}),i.addEventListener("load",()=>{i.status>=200&&i.status<300?r():a(new Error(`Upload failed: ${i.status}`))}),i.addEventListener("error",()=>a(new Error("Upload network error"))),i.addEventListener("abort",()=>a(new Error("Upload aborted"))),i.send(l)})}async function xn(t,e,o){const n=await fetch(`${V}/api/sessions/${encodeURIComponent(e)}/download?path=${encodeURIComponent(o)}`,{headers:q(t)});if(!n.ok)throw new Error("Download failed");const r=await n.blob(),a=URL.createObjectURL(r),l=document.createElement("a");l.href=a,l.download=o.split("/").pop()||"download",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(a)}function be({sessionId:t,onClose:e,filter:o}){const n=k(w=>w.token),[r,a]=d.useState(""),[l,i]=d.useState([]),[c,f]=d.useState(!0),[p,u]=d.useState(null),m=d.useCallback(async w=>{if(n){f(!0),u(null);try{const E=await oe(n,t,w);a(E.cwd),i(o?o(E.files):E.files)}catch(E){u(E instanceof Error?E.message:"Failed to load files")}finally{f(!1)}}},[n,t,o]);d.useEffect(()=>{m()},[m]);const h=d.useRef(e);h.current=e,d.useEffect(()=>{const w=E=>{E.key==="Escape"&&h.current()};return document.addEventListener("keydown",w),()=>document.removeEventListener("keydown",w)},[]);const b=d.useCallback(w=>{m(r+"/"+w)},[m,r]),v=d.useCallback(()=>{const w=r.replace(/\/[^/]+$/,"")||"/";m(w)},[m,r]),T=d.useCallback(()=>{m(r)},[m,r]);return{cwd:r,files:l,loading:c,error:p,setError:u,handleNavigate:b,handleGoUp:v,handleRefresh:T}}function bn(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(1)} GB`}function Ye(t){const e=new Date(t*1e3),o=n=>String(n).padStart(2,"0");return`${o(e.getMonth()+1)}-${o(e.getDate())} ${o(e.getHours())}:${o(e.getMinutes())}`}function ye({cwd:t,onGoUp:e,onRefresh:o,onClose:n}){return s.jsxs("div",{style:{padding:"6px 12px",background:"#24283b",borderBottom:"1px solid #414868",flexShrink:0,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",minWidth:0},children:[s.jsx("button",{onClick:e,style:{background:"none",border:"1px solid #414868",color:"#7aa2f7",borderRadius:3,padding:"1px 8px",fontSize:12,cursor:"pointer",flexShrink:0},title:"Go to parent directory",children:".."}),s.jsx("span",{style:{color:"#7aa2f7",fontSize:12,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t||"..."})]}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[s.jsx("button",{onClick:o,style:{background:"none",border:"none",color:"#565f89",fontSize:14,cursor:"pointer",padding:"0 4px"},title:"Refresh",children:"↻"}),s.jsx("button",{onClick:n,style:{background:"none",border:"none",color:"#565f89",fontSize:14,cursor:"pointer",padding:"0 4px"},title:"Close (ESC)",children:"✕"})]})]})}function ge({loading:t,error:e,empty:o,emptyText:n="Empty directory"}){return t?s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:"Loading..."}):e?s.jsx("div",{style:{padding:"12px",color:"#f7768e",fontSize:12},children:e}):o?s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:n}):null}function yn({sessionId:t,onClose:e}){const o=k(b=>b.token),{cwd:n,files:r,loading:a,error:l,setError:i,handleNavigate:c,handleGoUp:f,handleRefresh:p}=be({sessionId:t,onClose:e}),[u,m]=d.useState(null),h=async b=>{if(o){m(b);try{await xn(o,t,n+"/"+b)}catch(v){i(v instanceof Error?v.message:"Download failed")}finally{m(null)}}};return s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column",fontFamily:"inherit"},children:[s.jsx(ye,{cwd:n,onGoUp:f,onRefresh:p,onClose:e}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ge,{loading:a,error:l,empty:r.length===0,emptyText:"Empty directory"}),!a&&!l&&r.map(b=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:b.type==="directory"?"pointer":"default",borderBottom:"1px solid #1e2030"},onMouseEnter:v=>{v.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:v=>{v.currentTarget.style.backgroundColor="transparent"},onClick:()=>{b.type==="directory"&&c(b.name)},children:[b.type==="file"?s.jsx("button",{onClick:v=>{v.stopPropagation(),h(b.name)},disabled:u===b.name,style:{background:"none",border:"1px solid #414868",color:u===b.name?"#565f89":"#9ece6a",borderRadius:3,padding:"1px 8px",fontSize:11,cursor:u===b.name?"wait":"pointer",flexShrink:0,marginRight:6},children:u===b.name?"...":"↓"}):s.jsx("span",{style:{width:26,flexShrink:0,marginRight:6}}),s.jsx("span",{style:{width:20,flexShrink:0,color:b.type==="directory"?"#7aa2f7":"#565f89"},children:b.type==="directory"?"📁":"📄"}),s.jsx("span",{style:{flex:1,color:b.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:b.name}),s.jsx("span",{style:{width:80,textAlign:"right",color:"#565f89",fontSize:11,flexShrink:0},children:b.type==="file"?bn(b.size):""})]},b.name))]})]})}function gn({content:t}){const e=k(n=>n.fontSize),o=d.useMemo(()=>{if(!t)return"";const n=at.parse(t,{async:!1});return lt.sanitize(n,{ADD_TAGS:["img"],ADD_ATTR:["src","alt","title","width","height"]})},[t]);return t?s.jsx("div",{className:"md-preview",style:{height:"100%",overflowY:"auto",userSelect:"text",padding:"12px 16px",fontSize:`${e}px`},dangerouslySetInnerHTML:{__html:o}}):s.jsx("div",{className:"md-preview",style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#414868",fontStyle:"italic",fontSize:"13px"},children:"Waiting for plan output..."})}async function wn(t,e){const o=await fetch(`${V}/api/sessions/${encodeURIComponent(e)}/draft`,{headers:q(t)});return o.ok?(await o.json()).content??"":""}async function ze(t,e,o){await fetch(`${V}/api/sessions/${encodeURIComponent(e)}/draft`,{method:"PUT",headers:{...q(t),"Content-Type":"application/json"},body:JSON.stringify({content:o})})}const Le=[{cmd:"/plan",desc:"Enter plan mode"},{cmd:"/help",desc:"Get help"},{cmd:"/compact",desc:"Compact conversation"},{cmd:"/clear",desc:"Clear conversation"},{cmd:"/model",desc:"Switch model"},{cmd:"/cost",desc:"Show token usage"},{cmd:"/status",desc:"Show status"},{cmd:"/init",desc:"Initialize project CLAUDE.md"},{cmd:"/memory",desc:"Edit memory files"},{cmd:"/review",desc:"Review code"},{cmd:"/bug",desc:"Report a bug"},{cmd:"/login",desc:"Login to Anthropic"},{cmd:"/doctor",desc:"Run diagnostics"},{cmd:"/permissions",desc:"Manage permissions"},{cmd:"/mcp",desc:"MCP server management"},{cmd:"/terminal-setup",desc:"Configure terminal"},{cmd:"/vim",desc:"Toggle vim mode"},{cmd:"/oh-my-claudecode:autopilot",desc:"Full autonomous execution"},{cmd:"/oh-my-claudecode:ralph",desc:"Persistence loop until done"},{cmd:"/oh-my-claudecode:ultrawork",desc:"Max parallel execution"},{cmd:"/oh-my-claudecode:ecomode",desc:"Token-efficient execution"},{cmd:"/oh-my-claudecode:plan",desc:"Strategic planning session"},{cmd:"/oh-my-claudecode:ralplan",desc:"Iterative planning consensus"},{cmd:"/oh-my-claudecode:ultrapilot",desc:"Parallel autopilot (3-5x faster)"},{cmd:"/oh-my-claudecode:analyze",desc:"Deep analysis/investigation"},{cmd:"/oh-my-claudecode:deepsearch",desc:"Thorough codebase search"},{cmd:"/oh-my-claudecode:deepinit",desc:"Generate AGENTS.md hierarchy"},{cmd:"/oh-my-claudecode:ultraqa",desc:"QA cycling: test/fix/repeat"},{cmd:"/oh-my-claudecode:tdd",desc:"Test-driven development"},{cmd:"/oh-my-claudecode:code-review",desc:"Comprehensive code review"},{cmd:"/oh-my-claudecode:security-review",desc:"Security vulnerability review"},{cmd:"/oh-my-claudecode:build-fix",desc:"Fix build/TypeScript errors"},{cmd:"/oh-my-claudecode:research",desc:"Parallel research orchestration"},{cmd:"/oh-my-claudecode:swarm",desc:"N coordinated agents"},{cmd:"/oh-my-claudecode:pipeline",desc:"Sequential agent chaining"},{cmd:"/oh-my-claudecode:learner",desc:"Extract skill from session"},{cmd:"/oh-my-claudecode:note",desc:"Save notes to notepad"},{cmd:"/oh-my-claudecode:cancel",desc:"Cancel active OMC mode"},{cmd:"/oh-my-claudecode:help",desc:"OMC usage guide"},{cmd:"/oh-my-claudecode:doctor",desc:"Diagnose OMC issues"},{cmd:"/oh-my-claudecode:omc-setup",desc:"One-time OMC setup"},{cmd:"/oh-my-claudecode:hud",desc:"Configure HUD statusline"},{cmd:"/oh-my-claudecode:release",desc:"Automated release workflow"},{cmd:"/oh-my-claudecode:ralph-init",desc:"Initialize PRD for ralph"},{cmd:"/oh-my-claudecode:review",desc:"Review plan with Critic"},{cmd:"/oh-my-claudecode:git-master",desc:"Git expert for commits"},{cmd:"/oh-my-claudecode:mcp-setup",desc:"Configure MCP servers"},{cmd:"/oh-my-claudecode:skill",desc:"Manage local skills"},{cmd:"/oh-my-claudecode:writer-memory",desc:"Writer memory system"},{cmd:"/oh-my-claudecode:psm",desc:"Project session manager"},{cmd:"/oh-my-claudecode:trace",desc:"Agent flow trace timeline"}],vn=d.forwardRef(function({onSend:e,onContentChange:o,sessionId:n,token:r},a){const l=k(y=>y.fontSize),[i,c]=d.useState(""),f=d.useRef(null),p=d.useRef(),u=d.useRef(!1),[m,h]=d.useState(!1),[b,v]=d.useState(""),[T,w]=d.useState(0),[E,N]=d.useState(!1),[g,C]=d.useState(""),[D,z]=d.useState(""),[I,x]=d.useState(0),[R,L]=d.useState([]),[A,P]=d.useState(!1),M=d.useRef(""),j=d.useRef(null),_=d.useMemo(()=>{if(!b)return Le;const y=b.toLowerCase();return Le.filter(S=>S.cmd.toLowerCase().includes(y)||S.desc.toLowerCase().includes(y))},[b]),$=d.useMemo(()=>{let y=R;if(g){const S=g.toLowerCase();y=y.filter(O=>O.name.toLowerCase().includes(S))}return[...y].sort((S,O)=>S.type==="directory"&&O.type!=="directory"?-1:S.type!=="directory"&&O.type==="directory"?1:S.name.localeCompare(O.name))},[R,g]);d.useEffect(()=>{let y=!1;return wn(r,n).then(S=>{!y&&S&&c(S),u.current=!0}).catch(()=>{u.current=!0}),()=>{y=!0}},[r,n]),d.useEffect(()=>{if(u.current)return p.current&&clearTimeout(p.current),p.current=setTimeout(()=>{ze(r,n,i).catch(()=>{})},500),()=>{p.current&&clearTimeout(p.current)}},[i,r,n]),d.useEffect(()=>{var y;(y=f.current)==null||y.focus()},[]),d.useEffect(()=>{if(!E)return;let y=!1;return P(!0),(async()=>{try{if(D){if(!M.current){const F=await oe(r,n);if(y)return;M.current=F.cwd}const S=`${M.current}/${D.replace(/\/$/,"")}`,O=await oe(r,n,S);if(y)return;L(O.files)}else{const S=await oe(r,n);if(y)return;M.current=S.cwd,L(S.files)}P(!1)}catch{if(y)return;L([]),P(!1)}})(),()=>{y=!0}},[E,D,r,n]),d.useEffect(()=>{if(!E||!j.current)return;const y=j.current.querySelector(".file-item--active");y==null||y.scrollIntoView({block:"nearest"})},[I,E]);const J=d.useCallback(()=>{const y=i.trim();y&&(e(y),c(""),ze(r,n,"").catch(()=>{}))},[i,e,r,n]);d.useImperativeHandle(a,()=>({send:J}),[J]),d.useEffect(()=>{o==null||o(i.trim().length>0)},[i,o]);const le=d.useCallback(y=>{const S=f.current;if(!S)return;const O=S.selectionStart,F=i.slice(0,O),K=i.slice(O),G=F.lastIndexOf(`
|
|
37
|
-
`)+1,H=F.slice(G).match(/\/[a-zA-Z-]*$/);if(H){const W=G+(H.index??0),Q=y+" ",de=i.slice(0,W)+Q+K;c(de);const tt=W+Q.length;requestAnimationFrame(()=>{S.selectionStart=S.selectionEnd=tt,S.focus()})}else{const W=F+y+K;c(W);const Q=O+y.length;requestAnimationFrame(()=>{S.selectionStart=S.selectionEnd=Q,S.focus()})}h(!1),v(""),w(0)},[i]),ce=d.useCallback(y=>{const S=f.current;if(!S)return;const O=S.selectionStart,F=i.slice(0,O),K=i.slice(O),Z=F.match(/@([a-zA-Z0-9_.\-/]*)$/);if(!Z)return;const G=F.length-Z[0].length;if(y.type==="directory"){const Y="@"+D+y.name+"/",H=i.slice(0,G)+Y+K;c(H);const W=G+Y.length;z(D+y.name+"/"),C(""),x(0),requestAnimationFrame(()=>{S.selectionStart=S.selectionEnd=W,S.focus()})}else{const Y=y.name+" ",H=i.slice(0,G)+Y+K;c(H);const W=G+Y.length;N(!1),C(""),z(""),x(0),L([]),M.current="",requestAnimationFrame(()=>{S.selectionStart=S.selectionEnd=W,S.focus()})}},[i,D]),Qe=d.useCallback(y=>{const S=y.target.value;c(S);const O=y.target.selectionStart,F=S.slice(0,O),K=F.lastIndexOf(`
|
|
38
|
-
`),G=F.slice(K+1).match(/^\/([a-zA-Z-]*)$/);if(G)h(!0),v(G[1]),w(0),N(!1);else{h(!1);const Y=F.match(/@([a-zA-Z0-9_.\-/]*)$/);if(Y){const H=Y[1],W=H.lastIndexOf("/"),Q=W>=0?H.slice(0,W+1):"",de=W>=0?H.slice(W+1):H;C(de),x(0),z(Q),N(!0)}else N(!1)}},[]),et=d.useCallback(y=>{if(m&&_.length>0){if(y.key==="ArrowDown"){y.preventDefault(),w(S=>(S+1)%_.length);return}if(y.key==="ArrowUp"){y.preventDefault(),w(S=>(S-1+_.length)%_.length);return}if(y.key==="Enter"||y.key==="Tab"){y.preventDefault(),le(_[T].cmd);return}if(y.key==="Escape"){y.preventDefault(),h(!1);return}}if(E&&$.length>0){if(y.key==="ArrowDown"){y.preventDefault(),x(S=>(S+1)%$.length);return}if(y.key==="ArrowUp"){y.preventDefault(),x(S=>(S-1+$.length)%$.length);return}if(y.key==="Tab"||y.key==="Enter"){y.preventDefault(),ce($[I]);return}if(y.key==="Escape"){y.preventDefault(),N(!1);return}}if(y.key==="Tab"){y.preventDefault();const S=f.current;if(S){const O=S.selectionStart,F=S.selectionEnd,K=i.slice(0,O)+" "+i.slice(F);c(K);const Z=O+2;requestAnimationFrame(()=>{S.selectionStart=S.selectionEnd=Z})}return}y.key==="Enter"&&(y.ctrlKey||y.metaKey)&&(y.preventDefault(),J())},[J,m,_,T,le,i,E,$,I,ce]);return s.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",backgroundColor:"#1a1b26",overflow:"hidden"},children:[m&&_.length>0&&s.jsx("div",{className:"slash-dropdown",children:_.map((y,S)=>s.jsxs("div",{className:`slash-item${S===T?" slash-item--active":""}`,onMouseDown:O=>{O.preventDefault(),le(y.cmd)},onMouseEnter:()=>w(S),children:[s.jsx("span",{className:"slash-cmd",children:y.cmd}),s.jsx("span",{className:"slash-desc",children:y.desc})]},y.cmd))}),E&&(A||$.length>0)&&s.jsx("div",{className:"file-dropdown",ref:j,children:A?s.jsx("div",{className:"file-item file-loading",children:"Loading..."}):$.map((y,S)=>s.jsxs("div",{className:`file-item${S===I?" file-item--active":""}`,onMouseDown:O=>{O.preventDefault(),ce(y)},onMouseEnter:()=>x(S),children:[s.jsx("span",{className:"file-icon",children:y.type==="directory"?"📁":"📄"}),s.jsx("span",{className:"file-name",children:y.name})]},y.name))}),s.jsx("textarea",{ref:f,className:"md-editor-textarea",value:i,onChange:Qe,onKeyDown:et,placeholder:"Type / for commands, @ for files, Ctrl+Enter to send",spellCheck:!1,style:{flex:1,fontSize:`${l}px`}})]})}),Sn=new Set([".md",".html",".htm",".pdf"]);function Tn(t){const e=t.lastIndexOf(".");return e===-1?!1:Sn.has(t.slice(e).toLowerCase())}function kn(t){const e=t.slice(t.lastIndexOf(".")).toLowerCase();return e===".pdf"?"📕":e===".html"||e===".htm"?"🌐":"📝"}const Cn=t=>t.filter(e=>e.type==="directory"||Tn(e.name));function In({sessionId:t,onSelect:e,onClose:o}){const n=d.useCallback(Cn,[]),{cwd:r,files:a,loading:l,error:i,handleNavigate:c,handleGoUp:f,handleRefresh:p}=be({sessionId:t,onClose:o,filter:n}),u=m=>{e(r+"/"+m)};return s.jsxs("div",{style:{position:"absolute",inset:0,zIndex:5,backgroundColor:"#1a1b26",display:"flex",flexDirection:"column",fontFamily:"inherit"},children:[s.jsx(ye,{cwd:r,onGoUp:f,onRefresh:p,onClose:o}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ge,{loading:l,error:i,empty:a.length===0,emptyText:"No documents found"}),!l&&!i&&a.map(m=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:"pointer",borderBottom:"1px solid #1e2030"},onMouseEnter:h=>{h.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:h=>{h.currentTarget.style.backgroundColor="transparent"},onClick:()=>{m.type==="directory"?c(m.name):u(m.name)},children:[s.jsx("span",{style:{width:20,flexShrink:0,marginRight:6,color:m.type==="directory"?"#7aa2f7":"#565f89"},children:m.type==="directory"?"📁":kn(m.name)}),s.jsx("span",{style:{flex:1,color:m.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:m.name}),m.type==="file"&&s.jsx("span",{style:{fontSize:10,color:"#565f89",background:"#24283b",padding:"1px 5px",borderRadius:3,marginLeft:6,flexShrink:0},children:m.name.slice(m.name.lastIndexOf(".")).toLowerCase()})]},m.name))]})]})}const jn="modulepreload",En=function(t){return"/"+t},De={},Rn=function(e,o,n){let r=Promise.resolve();if(o&&o.length>0){document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),i=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=Promise.allSettled(o.map(c=>{if(c=En(c),c in De)return;De[c]=!0;const f=c.endsWith(".css"),p=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${p}`))return;const u=document.createElement("link");if(u.rel=f?"stylesheet":jn,f||(u.as="script"),u.crossOrigin="",u.href=c,i&&u.setAttribute("nonce",i),document.head.appendChild(u),f)return new Promise((m,h)=>{u.addEventListener("load",m),u.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${c}`)))})}))}function a(l){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=l,window.dispatchEvent(i),!i.defaultPrevented)throw l}return r.then(l=>{for(const i of l||[])i.status==="rejected"&&a(i.reason);return e().catch(a)})};let he=null;const zn=Rn(()=>import("./pdf-Tk4_4Bu3.js"),[]).then(t=>(he=t,t.GlobalWorkerOptions.workerSrc=new URL("/assets/pdf.worker-BA9kU3Pw.mjs",import.meta.url).toString(),t));function Ln({data:t,scrollRef:e}){const o=d.useRef(null),[n,r]=d.useState(null),[a,l]=d.useState(!0),i=d.useRef(0),c=f=>{o.current=f,e==null||e(f)};return d.useEffect(()=>{if(!t)return;const f=++i.current;return l(!0),r(null),(async()=>{try{if(await zn,!he||f!==i.current)return;const p=atob(t),u=new Uint8Array(p.length);for(let v=0;v<p.length;v++)u[v]=p.charCodeAt(v);const m=await he.getDocument({data:u}).promise;if(f!==i.current)return;const h=o.current;if(!h)return;for(;h.firstChild;)h.removeChild(h.firstChild);const b=h.clientWidth-24;for(let v=1;v<=m.numPages;v++){const T=await m.getPage(v);if(f!==i.current)return;const w=T.getViewport({scale:1}),E=Math.min(b/w.width,2),N=T.getViewport({scale:E}),g=document.createElement("canvas");g.width=N.width,g.height=N.height,g.style.display="block",g.style.margin="0 auto 8px",g.style.maxWidth="100%";const C=g.getContext("2d");if(C){if(await T.render({canvasContext:C,viewport:N,canvas:g}).promise,f!==i.current)return;h.appendChild(g)}}l(!1)}catch(p){if(f!==i.current)return;r(p instanceof Error?p.message:"Failed to render PDF"),l(!1)}})(),()=>{i.current++}},[t]),s.jsxs("div",{ref:c,className:"pdf-renderer",children:[a&&s.jsx("div",{style:{padding:"20px",textAlign:"center",color:"#565f89",fontSize:13},children:"Loading PDF..."}),n&&s.jsxs("div",{style:{padding:"12px",color:"#f7768e",fontSize:12},children:["PDF Error: ",n]})]})}async function Ne(t,e,o,n){const r=new URLSearchParams({path:o});n&&r.set("since",String(n));const a=await fetch(`${V}/api/sessions/${encodeURIComponent(e)}/file-content?${r}`,{headers:q(t)});if(a.status===304)return null;if(!a.ok)throw new Error("Failed to fetch file content");return a.json()}function Dn(t=50,e=20,o=80){const[n,r]=d.useState(t),a=d.useRef(null),l=d.useCallback(i=>{i.preventDefault();const c=a.current;if(!c)return;const f=c.getBoundingClientRect(),p=f.width;document.body.classList.add("resizing-panes-h");let u=null;const m=b=>{u||(u=requestAnimationFrame(()=>{u=null;const v=b.clientX-f.left,T=Math.min(o,Math.max(e,v/p*100));r(T)}))},h=()=>{u&&cancelAnimationFrame(u),document.body.classList.remove("resizing-panes-h"),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",h)};document.addEventListener("mousemove",m),document.addEventListener("mouseup",h)},[e,o]);return{leftWidthPercent:n,containerRef:a,onDividerMouseDown:l}}const Nn=3e3;function Mn(t){const e=t.slice(t.lastIndexOf(".")).toLowerCase();return e===".md"?"md":e===".html"||e===".htm"?"html":e===".pdf"?"pdf":null}function Me(t){return t.split("/").pop()||t}const On=new Set([".md",".html",".htm",".pdf"]);function _n(t){if(t.type==="directory")return!0;const e=t.name.lastIndexOf(".");return e===-1?!1:On.has(t.name.slice(e).toLowerCase())}function An(t){if(t.type==="directory")return"📁";const e=t.name.slice(t.name.lastIndexOf(".")).toLowerCase();return e===".pdf"?"📕":e===".html"||e===".htm"?"🌐":"📝"}const $n=t=>t.filter(_n);function Pn({sessionId:t,onSelect:e}){const o=d.useCallback(()=>{},[]),n=d.useCallback($n,[]),{cwd:r,files:a,loading:l,error:i,handleNavigate:c,handleGoUp:f,handleRefresh:p}=be({sessionId:t,onClose:o,filter:n});return s.jsxs("div",{style:{height:"100%",display:"flex",flexDirection:"column",overflow:"hidden"},children:[s.jsx(ye,{cwd:r,onGoUp:f,onRefresh:p,onClose:o}),s.jsxs("div",{style:{flex:1,overflow:"auto",padding:"4px 0"},children:[s.jsx(ge,{loading:l,error:i,empty:a.length===0,emptyText:"No documents found"}),!l&&!i&&a.map(u=>s.jsxs("div",{style:{display:"flex",alignItems:"center",padding:"3px 12px",fontSize:13,cursor:"pointer",borderBottom:"1px solid #1e2030"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor="#24283b"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor="transparent"},onClick:()=>{u.type==="directory"?c(u.name):e(r+"/"+u.name)},children:[s.jsx("span",{style:{width:20,flexShrink:0,marginRight:6,color:u.type==="directory"?"#7aa2f7":"#565f89"},children:An(u)}),s.jsx("span",{style:{flex:1,color:u.type==="directory"?"#7aa2f7":"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},children:u.name}),u.type==="file"&&s.jsx("span",{style:{fontSize:10,color:"#565f89",background:"#24283b",padding:"1px 5px",borderRadius:3,marginLeft:6,flexShrink:0},children:u.name.slice(u.name.lastIndexOf(".")).toLowerCase()})]},u.name))]})]})}function Fn({sessionId:t,token:e,onClose:o,onSend:n}){const[r,a]=d.useState(null),[l,i]=d.useState(""),[c,f]=d.useState(null),p=d.useRef(0),[u,m]=d.useState(!1),[h,b]=d.useState(!1),[v,T]=d.useState(!1),{leftWidthPercent:w,containerRef:E,onDividerMouseDown:N}=Dn(50),g=d.useRef(null),[C,D]=d.useState(!1),z=d.useRef(new Map),I=d.useRef(null),x=d.useRef(null),R=d.useCallback(()=>{if(!r)return;const j=h?x.current:I.current;j&&z.current.set(r,j.scrollTop)},[r,h]),L=d.useCallback(j=>{const _=z.current.get(j);_!=null&&requestAnimationFrame(()=>{const $=h?x.current:I.current;$&&($.scrollTop=_)})},[h]),A=d.useCallback(j=>{R();const _=Mn(j);a(j),f(_),i(""),p.current=0,m(!1),Ne(e,t,j).then($=>{$&&(i($.content),p.current=$.mtime,requestAnimationFrame(()=>L(j)))}).catch(()=>{})},[e,t,R,L]);d.useEffect(()=>{if(!r)return;let j=!1;const $=setInterval(async()=>{if(!j)try{const J=await Ne(e,t,r,p.current);if(j)return;J&&(i(J.content),p.current=J.mtime)}catch{}},Nn);return()=>{j=!0,clearInterval($)}},[e,t,r]);const P=d.useCallback(()=>{r&&navigator.clipboard.writeText(r).then(()=>{T(!0),setTimeout(()=>T(!1),1500)}).catch(()=>{})},[r]);d.useEffect(()=>{if(!h)return;const j=_=>{_.key==="Escape"&&(R(),b(!1))};return document.addEventListener("keydown",j),()=>document.removeEventListener("keydown",j)},[h,R]),d.useEffect(()=>{r&&L(r)},[h,r,L]);const M=j=>!r||!c?s.jsx(Pn,{sessionId:t,onSelect:A}):!l&&c!=="pdf"?s.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"#565f89",fontSize:"13px"},children:"Loading..."}):c==="md"?s.jsx("div",{ref:j,style:{height:"100%",overflow:"auto"},children:s.jsx(gn,{content:l})}):c==="html"?s.jsx("div",{ref:j,style:{height:"100%",overflow:"auto"},children:s.jsx("iframe",{srcDoc:l,sandbox:"allow-same-origin",style:{width:"100%",height:"100%",border:"none",backgroundColor:"#fff"},title:"HTML Preview"})}):c==="pdf"?s.jsx(Ln,{data:l,scrollRef:j}):null;return s.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",backgroundColor:"#1a1b26",overflow:"hidden"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",height:"28px",flexShrink:0,backgroundColor:"#16161e",borderBottom:"1px solid #292e42"},children:[s.jsxs("div",{style:{width:`${w}%`,flexShrink:0,display:"flex",alignItems:"center",gap:"4px",padding:"0 8px",minWidth:0},children:[s.jsx("button",{className:"pane-btn",onClick:()=>m(j=>!j),title:"Open document",style:{color:"#7aa2f7"},children:"Open"}),r&&s.jsxs(s.Fragment,{children:[s.jsx("span",{style:{fontSize:"11px",color:"#565f89",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0,cursor:"pointer"},onClick:P,title:v?"Copied!":`Click to copy: ${r}`,children:v?"Copied!":Me(r)}),s.jsx("button",{className:"pane-btn",onClick:()=>{R(),b(!0)},title:"Expand document view",style:{fontSize:"12px"},children:"⛶"})]})]}),s.jsx("div",{style:{width:"4px",flexShrink:0}}),s.jsxs("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 8px",minWidth:0},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px"},children:[s.jsx("button",{className:"pane-btn",onClick:()=>{var j;return(j=g.current)==null?void 0:j.send()},disabled:!C,title:"Send to terminal (Ctrl+Enter)",style:C?{color:"#9ece6a"}:{opacity:.4,cursor:"default"},children:"Send"}),s.jsx("span",{style:{fontSize:"10px",color:"#414868"},children:"Ctrl+Enter"})]}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:o,title:"Close Doc panel",children:"×"})]})]}),s.jsxs("div",{ref:E,className:"plan-panel-body",style:{position:"relative"},children:[s.jsxs("div",{className:"plan-renderer",style:{width:`${w}%`,flexShrink:0},children:[M(j=>{I.current=j}),u&&s.jsx(In,{sessionId:t,onSelect:A,onClose:()=>m(!1)})]}),s.jsx("div",{className:"plan-divider-h",onMouseDown:N}),s.jsx("div",{className:"plan-editor-wrap",children:s.jsx(vn,{ref:g,onSend:n,onContentChange:D,sessionId:t,token:e})})]}),h&&s.jsxs("div",{className:"doc-expanded-overlay",children:[s.jsxs("div",{className:"doc-expanded-header",children:[s.jsx("span",{style:{fontSize:"12px",color:"#a9b1d6",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r?Me(r):""}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:()=>{R(),b(!1)},title:"Close expanded view (ESC)",children:"×"})]}),s.jsx("div",{style:{flex:1,overflow:"hidden"},children:M(j=>{x.current=j})})]})]})}const Wn=100,Bn=600;function Un(){return d.useSyncExternalStore(t=>(window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)),()=>window.innerWidth)}const Hn=d.memo(function({terminal:e,canClose:o}){const r=Un()<Bn,a=k(x=>x.killServerSession),l=k(x=>x.splitTerminal),i=k(x=>x.token),c=d.useRef(null),f=d.useRef(null),[p,u]=d.useState(!1),[m,h]=d.useState(!1),[b,v]=d.useState(0),[T,w]=d.useState(!1),[E,N]=d.useState(50),g=d.useRef(null),C=async x=>{const R=x.target.files;if(!(!R||R.length===0||!i)){h(!0),v(0);try{await hn(i,e.id,R,L=>{v(L)})}catch(L){alert(`Upload failed: ${L instanceof Error?L.message:"Unknown error"}`)}finally{h(!1),v(0),c.current&&(c.current.value="")}}},D=d.useRef(),z=d.useCallback(x=>{if(f.current){const R=x.replace(/\r?\n/g," ").trimEnd();f.current.sendInput(R),D.current=window.setTimeout(()=>{var L;return(L=f.current)==null?void 0:L.sendInput("\r")},50)}},[]);d.useEffect(()=>()=>{D.current&&clearTimeout(D.current)},[]);const I=d.useCallback(x=>{x.preventDefault();const R=g.current;if(!R)return;const L=R.getBoundingClientRect(),A=L.height;document.body.classList.add("resizing-panes-v");const P=j=>{const _=(j.clientY-L.top)/A*100,$=Math.min(80,Math.max(20,_));N(100-$)},M=()=>{document.body.classList.remove("resizing-panes-v"),document.removeEventListener("mousemove",P),document.removeEventListener("mouseup",M)};document.addEventListener("mousemove",P),document.addEventListener("mouseup",M)},[]);return s.jsxs("div",{ref:g,style:{display:"flex",flexDirection:"column",height:"100%",minWidth:0,minHeight:0},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"2px 8px",backgroundColor:"#16161e",borderBottom:"1px solid #292e42",flexShrink:0,height:"24px"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px"},children:[s.jsx("span",{style:{display:"inline-block",width:"6px",height:"6px",borderRadius:"50%",backgroundColor:e.connected?"#9ece6a":"#f7768e"}}),s.jsxs("span",{style:{fontSize:"11px",color:"#565f89"},children:[e.id,e.connected?e.sessionResumed?" (resumed)":"":" (disconnected)"]})]}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px"},children:[s.jsx("input",{ref:c,type:"file",multiple:!0,style:{display:"none"},onChange:C}),s.jsx("button",{className:"pane-btn",onClick:()=>{var x;return(x=c.current)==null?void 0:x.click()},disabled:m,style:m?{color:"#e0af68"}:void 0,title:m?`Uploading ${b}%`:"Upload files","aria-label":"Upload files",children:m?`${b}%`:"↑"}),s.jsx("button",{className:"pane-btn",onClick:()=>u(x=>!x),style:p?{color:"#7aa2f7"}:void 0,title:"Browse files","aria-label":"Browse files",children:"↓"}),s.jsx("button",{className:`pane-btn${T?" pane-btn--active":""}`,onClick:()=>w(x=>!x),title:"Toggle Document browser","aria-label":"Toggle Document browser",children:"Doc"}),s.jsx("button",{className:"pane-btn",onClick:()=>l(e.id,r?"vertical":"horizontal"),title:r?"Split vertical (screen too narrow for horizontal)":"Split horizontal (left/right)","aria-label":"Split horizontal",children:"|"}),s.jsx("button",{className:"pane-btn",onClick:()=>l(e.id,"vertical"),title:"Split vertical (top/bottom)","aria-label":"Split vertical",children:"─"}),o&&s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:()=>a(e.id),title:"Close terminal","aria-label":"Close terminal",children:"×"})]})]}),s.jsxs("div",{style:{flex:1,overflow:"hidden",position:"relative",minHeight:"80px"},children:[s.jsx(pn,{ref:f,sessionId:e.id}),!e.connected&&s.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(26, 27, 38, 0.85)",zIndex:2,pointerEvents:"none"},children:s.jsx("span",{style:{color:"#565f89",fontSize:"13px",fontStyle:"italic"},children:"Connecting..."})}),p&&s.jsx(yn,{sessionId:e.id,onClose:()=>u(!1)})]}),T&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"md-editor-divider",onMouseDown:I}),s.jsx("div",{style:{height:`${E}%`,minHeight:Wn,flexShrink:0,overflow:"hidden"},children:s.jsx(Fn,{onSend:z,onClose:()=>w(!1),sessionId:e.id,token:i||""})})]}),e.error&&s.jsx("div",{style:{padding:"2px 8px",backgroundColor:"#3b2029",borderTop:"1px solid #f7768e",color:"#f7768e",fontSize:"11px",flexShrink:0},children:e.error})]})});class Je extends d.Component{constructor(){super(...arguments);we(this,"state",{hasError:!1,error:null})}static getDerivedStateFromError(o){return{hasError:!0,error:o}}componentDidCatch(o,n){}render(){var o,n;return this.state.hasError?this.props.inline?s.jsxs("div",{style:{height:"100%",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:"8px",color:"#c0caf5",fontFamily:"monospace",padding:"16px"},children:[s.jsx("div",{style:{fontSize:"14px",color:"#f7768e"},children:"Pane crashed"}),s.jsx("div",{style:{fontSize:"12px",color:"#565f89",textAlign:"center"},children:((o=this.state.error)==null?void 0:o.message)||"An unexpected error occurred"}),s.jsx("button",{onClick:()=>this.setState({hasError:!1,error:null}),style:{background:"#292e42",border:"1px solid #414868",color:"#c0caf5",padding:"4px 12px",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Retry"})]}):s.jsxs("div",{style:{minHeight:"100vh",backgroundColor:"#1a1b26",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:"16px",color:"#c0caf5",fontFamily:"monospace"},children:[s.jsx("div",{style:{fontSize:"18px",color:"#f7768e"},children:"Something went wrong"}),s.jsx("div",{style:{fontSize:"13px",color:"#565f89",maxWidth:"500px",textAlign:"center"},children:((n=this.state.error)==null?void 0:n.message)||"An unexpected error occurred"}),s.jsx("button",{onClick:()=>window.location.reload(),style:{background:"linear-gradient(135deg, #7aa2f7 0%, #bb9af7 100%)",border:"none",color:"#1a1b26",padding:"8px 24px",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:"bold"},children:"Reload"})]}):this.props.children}}const Vn=4,Oe=10;function Gn(){const t=k(r=>r.layout),e=k(r=>r.terminalIds.length),o=k(r=>r.addTerminal);if(!t)return s.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",backgroundColor:"#1a1b26"},children:s.jsx("button",{onClick:()=>o(),style:{background:"none",border:"1px dashed #292e42",color:"#565f89",padding:"16px 32px",borderRadius:"8px",cursor:"pointer",fontSize:"14px"},children:"+ Add Terminal"})});const n=e>1;return s.jsx("div",{style:{height:"100%",width:"100%",overflow:"hidden"},children:s.jsx(Xe,{node:t,canClose:n})})}const Xe=d.memo(function({node:e,canClose:o}){return e.type==="leaf"?s.jsx(qn,{terminalId:e.terminalId,canClose:o}):s.jsx(Kn,{node:e,canClose:o})}),qn=d.memo(function({terminalId:e,canClose:o}){const n=k(r=>r.terminalsMap[e]);return n?s.jsx(Je,{inline:!0,children:s.jsx(Hn,{terminal:n,canClose:o})}):null}),Kn=d.memo(function({node:e,canClose:o}){const n=k(f=>f.setSplitSizes),r=d.useRef(null),a=e.direction==="horizontal",l=d.useRef(e.sizes);l.current=e.sizes;const i=d.useCallback((f,p)=>{p.preventDefault();const u=a?"resizing-panes":"resizing-panes-v";document.body.classList.add(u);const m=a?p.clientX:p.clientY,h=[...l.current],b=r.current,v=a?(b==null?void 0:b.clientWidth)||1:(b==null?void 0:b.clientHeight)||1;let T=null;const w=N=>{T||(T=requestAnimationFrame(()=>{T=null;const D=((a?N.clientX:N.clientY)-m)/v*100,z=h[f]+D,I=h[f+1]-D;if(z>=Oe&&I>=Oe){const x=[...h];x[f]=z,x[f+1]=I,n(e.id,x)}}))},E=()=>{T&&cancelAnimationFrame(T),document.body.classList.remove(u),document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",E)};document.addEventListener("mousemove",w),document.addEventListener("mouseup",E)},[a,e.id,n]),c=[];return e.children.forEach((f,p)=>{const u=f.type==="leaf"?f.terminalId:f.id;c.push(s.jsx("div",{style:{flex:`${e.sizes[p]} 0 0`,minWidth:0,minHeight:0,overflow:"hidden"},children:s.jsx(Xe,{node:f,canClose:o})},u)),p<e.children.length-1&&c.push(s.jsx("div",{onMouseDown:m=>i(p,m),style:{flex:`0 0 ${Vn}px`,cursor:a?"col-resize":"row-resize",backgroundColor:"#292e42",transition:"background-color 0.15s"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor="#7aa2f7"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor="#292e42"}},`divider-${e.id}-${p}`))}),s.jsx("div",{ref:r,style:{display:"flex",flexDirection:a?"row":"column",height:"100%",width:"100%",overflow:"hidden"},children:c})});function Yn({tabId:t}){const e=k(x=>x.tabs.find(R=>R.id===t)),o=k(x=>x.activeTabId),n=k(x=>x.switchTab),r=k(x=>x.closeTab),a=k(x=>x.reopenTab),l=k(x=>x.deleteTab),i=k(x=>x.renameTab),c=k(x=>e?e.terminalIds.map(R=>{const L=x.terminalsMap[R];return L?{id:R,connected:L.connected}:{id:R,connected:!1}}):[]),[f,p]=d.useState(!1),[u,m]=d.useState(""),[h,b]=d.useState(!1),v=d.useRef(null);if(!e)return null;const T=o===t,w=e.status==="open",E=()=>{w&&n(t)},N=x=>{w&&(x.stopPropagation(),m(e.name),p(!0),setTimeout(()=>{var R;return(R=v.current)==null?void 0:R.focus()},0))},g=()=>{const x=u.trim();x&&i(t,x),p(!1)},C=x=>{x.stopPropagation(),a(t)},D=x=>{x.stopPropagation(),r(t)},z=async x=>{x.stopPropagation(),window.confirm(`Delete tab "${e.name}"? This will kill all tmux sessions in this tab.`)&&await l(t)},I=x=>{x.stopPropagation(),b(!h)};return s.jsxs("div",{children:[s.jsxs("div",{onClick:E,style:{padding:"8px 12px",cursor:w?"pointer":"default",borderLeft:T?"3px solid #7aa2f7":"3px solid transparent",backgroundColor:T?"rgba(122, 162, 247, 0.08)":"transparent",display:"flex",alignItems:"center",gap:"8px",borderBottom:"1px solid #292e42",transition:"background-color 0.15s",opacity:w?1:.5},onMouseEnter:x=>{w&&!T&&(x.currentTarget.style.backgroundColor="rgba(122, 162, 247, 0.05)")},onMouseLeave:x=>{T||(x.currentTarget.style.backgroundColor="transparent")},children:[w&&e.terminalIds.length>0&&s.jsx("button",{onClick:I,style:{background:"none",border:"none",color:"#565f89",cursor:"pointer",fontSize:"10px",padding:0,width:14,height:14,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:h?"▼":"▶"}),s.jsxs("div",{style:{flex:1,minWidth:0},children:[f?s.jsx("input",{ref:v,value:u,onChange:x=>m(x.target.value),onBlur:g,onKeyDown:x=>{x.key==="Enter"&&g(),x.key==="Escape"&&p(!1)},style:{width:"100%",background:"#1a1b26",border:"1px solid #7aa2f7",color:"#c0caf5",borderRadius:"3px",padding:"1px 4px",fontSize:"13px",outline:"none"}}):s.jsx("div",{onDoubleClick:N,style:{color:"#c0caf5",fontSize:"13px",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:w?"Double-click to rename":e.name,children:e.name}),s.jsxs("div",{style:{color:"#565f89",fontSize:"11px",marginTop:"2px"},children:[e.terminalIds.length," terminal",e.terminalIds.length!==1?"s":""," · ",Ye(Math.floor(e.createdAt/1e3))]})]}),w?s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:D,style:{flexShrink:0},title:"Close tab",children:"×"}):s.jsxs("div",{style:{display:"flex",gap:"4px",flexShrink:0},children:[s.jsx("button",{className:"pane-btn",onClick:C,title:"Reopen tab",style:{fontSize:"11px",padding:"2px 6px"},children:"↻"}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:z,title:"Delete tab",children:"×"})]})]}),w&&h&&c.length>0&&s.jsx("div",{style:{paddingLeft:"28px",backgroundColor:"rgba(0, 0, 0, 0.2)"},children:c.map(x=>s.jsxs("div",{style:{padding:"4px 8px",fontSize:"11px",color:"#565f89",borderBottom:"1px solid rgba(41, 46, 66, 0.5)"},title:`Connected: ${x.connected}`,children:[s.jsx("span",{style:{fontFamily:"monospace"},children:x.id}),s.jsx("span",{style:{marginLeft:"8px",color:x.connected?"#9ece6a":"#f7768e"},children:x.connected?"●":"○"})]},x.id))})]})}function Jn({sessionId:t,active:e,createdAt:o}){const n=k(i=>i.addTerminal),r=k(i=>i.killServerSession),a=()=>{n("horizontal",t)},l=i=>{i.stopPropagation(),window.confirm(`Delete orphaned session "${t}"? This will kill the tmux session.`)&&r(t)};return s.jsxs("div",{onClick:a,style:{padding:"8px 12px",cursor:"pointer",display:"flex",alignItems:"center",gap:"8px",borderBottom:"1px solid #292e42",transition:"background-color 0.15s"},onMouseEnter:i=>{i.currentTarget.style.backgroundColor="rgba(122, 162, 247, 0.05)"},onMouseLeave:i=>{i.currentTarget.style.backgroundColor="transparent"},children:[s.jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:e?"#9ece6a":"#565f89",flexShrink:0}}),s.jsxs("div",{style:{flex:1,minWidth:0},children:[s.jsx("div",{style:{color:"#c0caf5",fontSize:"13px",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t}),s.jsx("div",{style:{color:"#565f89",fontSize:"11px",marginTop:"2px"},children:Ye(o)})]}),s.jsx("button",{className:"pane-btn pane-btn--danger",onClick:l,style:{flexShrink:0},title:"Delete session",children:"×"})]})}function Xn(){const t=k(c=>c.sidebarOpen),e=k(c=>c.toggleSidebar),o=k(c=>c.serverSessions),n=k(c=>c.fetchSessions),r=k(c=>c.tabs),a=k(c=>c.terminalIds),l=new Set(r.flatMap(c=>c.terminalIds)),i=o.filter(c=>!l.has(c.sessionId));return d.useEffect(()=>{if(!t)return;n();let c=setInterval(n,5e3);const f=()=>{document.hidden?c&&(clearInterval(c),c=null):(n(),c||(c=setInterval(n,5e3)))};return document.addEventListener("visibilitychange",f),()=>{c&&clearInterval(c),document.removeEventListener("visibilitychange",f)}},[t,n]),d.useEffect(()=>{if(!t)return;const c=setTimeout(n,800);return()=>clearTimeout(c)},[a.length,t,n]),s.jsxs("div",{className:"session-sidebar",style:{width:t?280:0,height:"100%",backgroundColor:"#16161e",borderLeft:t?"1px solid #292e42":"none",display:"flex",flexDirection:"column",flexShrink:0,overflow:"hidden",transition:"width 0.2s ease"},children:[s.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 12px",borderBottom:"1px solid #292e42",flexShrink:0},children:[s.jsx("span",{style:{color:"#7aa2f7",fontSize:"14px",fontWeight:"bold"},children:"Tabs & Sessions"}),s.jsx("button",{onClick:e,style:{background:"none",border:"none",color:"#565f89",cursor:"pointer",fontSize:"16px",padding:"0 4px",lineHeight:1},title:"Close sidebar",children:"×"})]}),s.jsxs("div",{style:{flex:1,overflowY:"auto"},children:[s.jsxs("div",{children:[s.jsx("div",{style:{padding:"8px 12px",color:"#7aa2f7",fontSize:"12px",fontWeight:"bold",backgroundColor:"rgba(122, 162, 247, 0.05)",borderBottom:"1px solid #292e42"},children:"TABS"}),r.length===0?s.jsx("div",{style:{color:"#565f89",fontSize:"13px",textAlign:"center",padding:"12px"},children:"No tabs"}):r.map(c=>s.jsx(Yn,{tabId:c.id},c.id))]}),i.length>0&&s.jsxs("div",{style:{marginTop:"16px"},children:[s.jsx("div",{style:{padding:"8px 12px",color:"#e0af68",fontSize:"12px",fontWeight:"bold",backgroundColor:"rgba(224, 175, 104, 0.05)",borderBottom:"1px solid #292e42"},children:"ORPHANED SESSIONS"}),i.map(c=>s.jsx(Jn,{sessionId:c.sessionId,active:c.active,createdAt:c.createdAt},c.sessionId))]})]})]})}const Ze=xe.memo(()=>{const t=k(g=>g.tabs),e=k(g=>g.activeTabId),o=k(g=>g.addTab),n=k(g=>g.switchTab),r=k(g=>g.closeTab),a=k(g=>g.renameTab),[l,i]=d.useState(null),[c,f]=d.useState(""),p=d.useRef(null),u=t.filter(g=>g.status==="open");d.useEffect(()=>{l&&p.current&&(p.current.focus(),p.current.select())},[l]);const m=g=>{i(g.id),f(g.name)},h=()=>{l&&c.trim()&&a(l,c.trim()),i(null),f("")},b=()=>{i(null),f("")},v=g=>{g.key==="Enter"?h():g.key==="Escape"&&b()},T=g=>{l||n(g)},w=(g,C)=>{g.stopPropagation(),r(C)},E=(g,C)=>{g.button===1&&(g.preventDefault(),r(C))},N=u.length>1;return s.jsxs("div",{className:"tab-bar",children:[u.map(g=>{const C=g.id===e,D=l===g.id,z=g.terminalIds.length;return s.jsx("div",{className:`tab-item ${C?"tab-item--active":""}`,onClick:()=>T(g.id),onDoubleClick:()=>m(g),onMouseDown:I=>E(I,g.id),children:D?s.jsx("input",{ref:p,type:"text",value:c,onChange:I=>f(I.target.value),onBlur:h,onKeyDown:v,className:"tab-item__rename-input"}):s.jsxs(s.Fragment,{children:[s.jsxs("span",{className:"tab-item__name",children:[g.name," ",z>0&&`(${z})`]}),N&&s.jsx("button",{className:"tab-item__close",onClick:I=>w(I,g.id),title:"Close tab","aria-label":"Close tab",children:"×"})]})},g.id)}),s.jsx("button",{className:"tab-bar-add",onClick:()=>o(),title:"New tab","aria-label":"Add new tab",children:"+"})]})});Ze.displayName="TabBar";function Zn(){return localStorage.getItem("ai-cli-online-token")}function Qn(){const t=k(i=>i.token),e=k(i=>i.setToken),o=k(i=>i.tabs),n=k(i=>i.addTab),r=k(i=>i.toggleSidebar),a=k(i=>i.fontSize),l=k(i=>i.setFontSize);return d.useEffect(()=>{const i=Zn();i&&!t&&e(i)},[]),d.useEffect(()=>{t&&o.filter(i=>i.status==="open").length===0&&n("Default")},[t]),t?s.jsxs("div",{style:{height:"100vh",display:"flex",flexDirection:"column",backgroundColor:"#1a1b26"},children:[s.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"6px 16px",backgroundColor:"#16161e",borderBottom:"1px solid #292e42",flexShrink:0},children:[s.jsx("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:s.jsx("span",{style:{fontSize:"15px",fontWeight:"bold",color:"#7aa2f7",letterSpacing:"0.5px"},children:"AI-Cli Online"})}),s.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[s.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:"2px",padding:"1px 4px",borderRadius:"6px",backgroundColor:"rgba(0,0,0,0.2)"},children:[s.jsx("button",{className:"header-btn",onClick:()=>l(a-1),disabled:a<=10,title:"Decrease font size",style:{fontSize:"11px",padding:"1px 5px",minWidth:0},children:"A−"}),s.jsx("span",{style:{fontSize:"11px",color:"#a9b1d6",minWidth:"20px",textAlign:"center"},children:a}),s.jsx("button",{className:"header-btn",onClick:()=>l(a+1),disabled:a>=24,title:"Increase font size",style:{fontSize:"11px",padding:"1px 5px",minWidth:0},children:"A+"})]}),s.jsx(tr,{}),s.jsx("button",{className:"header-btn",onClick:r,title:"Toggle Tabs & Sessions Sidebar","aria-label":"Toggle sidebar",children:"☰"}),s.jsx("button",{className:"header-btn header-btn--muted",onClick:()=>{window.confirm("Logout will close all terminals. Continue?")&&e(null)},children:"Logout"})]})]}),s.jsxs("div",{style:{flex:1,display:"flex",overflow:"hidden"},children:[s.jsx("main",{style:{flex:1,overflow:"hidden"},children:s.jsx(Gn,{})}),s.jsx(Xn,{})]}),s.jsx(Ze,{})]}):s.jsx(Gt,{})}const er=[1,2,3,4];function tr(){const t=k(n=>n.latency);if(t===null)return s.jsx("span",{style:{fontSize:"10px",color:"#414868"},title:"Measuring latency...",children:"--ms"});let e,o;return t<50?(e="#9ece6a",o=4):t<150?(e="#e0af68",o=3):t<300?(e="#ff9e64",o=2):(e="#f7768e",o=1),s.jsxs("span",{style:{display:"inline-flex",alignItems:"end",gap:"1.5px",padding:"2px 8px",borderRadius:"10px",backgroundColor:"rgba(0,0,0,0.2)"},title:`Latency: ${t}ms`,children:[er.map(n=>s.jsx("span",{style:{display:"inline-block",width:"2.5px",height:`${3+n*2}px`,backgroundColor:n<=o?e:"#292e42",borderRadius:"1px",transition:"background-color 0.3s ease"}},n)),s.jsxs("span",{style:{fontSize:"10px",color:e,marginLeft:"4px",fontWeight:500},children:[t,"ms"]})]})}pe.createRoot(document.getElementById("root")).render(s.jsx(xe.StrictMode,{children:s.jsx(Je,{children:s.jsx(Qn,{})})}));
|