coxpit 5.26.0 → 5.26.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/cockpit.ts +19 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coxpit",
|
|
3
|
-
"version": "5.26.
|
|
3
|
+
"version": "5.26.2",
|
|
4
4
|
"description": "Self-hosted cockpit for running a fleet of AI coding agents across your own machines — parallel worktree runs, live board, compare & merge, web terminal, design capture.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
package/src/cockpit.ts
CHANGED
|
@@ -30,6 +30,15 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
|
|
|
30
30
|
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:14px;line-height:1.5;
|
|
31
31
|
-webkit-font-smoothing:antialiased;overflow:hidden;overscroll-behavior:none;touch-action:manipulation}
|
|
32
32
|
.term-host .xterm-viewport{overscroll-behavior:contain} /* 터미널 스크롤이 페이지로 안 번지게 */
|
|
33
|
+
/* 전역 스크롤바 테마 — 흰 네이티브 바를 어디서든 제거(얇은 다크 바 + 투명 트랙).
|
|
34
|
+
개별 overflow 영역마다 재선언할 필요 없이 여기서 한 번에. 특정 스트립(트리·탭·팔레트)은
|
|
35
|
+
아래에서 scrollbar-width:none 으로 바 자체를 숨긴다. */
|
|
36
|
+
*{scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
|
|
37
|
+
::-webkit-scrollbar{width:8px;height:8px}
|
|
38
|
+
::-webkit-scrollbar-track{background:transparent}
|
|
39
|
+
::-webkit-scrollbar-thumb{background:var(--line-hi);border-radius:4px}
|
|
40
|
+
::-webkit-scrollbar-thumb:hover{background:var(--faint)}
|
|
41
|
+
::-webkit-scrollbar-corner{background:transparent}
|
|
33
42
|
button{font-family:var(--sans)}
|
|
34
43
|
:focus-visible{outline:2px solid rgba(78,201,176,.5);outline-offset:1px;border-radius:4px}
|
|
35
44
|
|
|
@@ -96,7 +105,8 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
|
|
|
96
105
|
.term-find button{font-family:var(--mono);font-size:13px;color:var(--muted);background:none;border:none;cursor:pointer;padding:2px 5px;border-radius:5px}
|
|
97
106
|
.term-find button:hover{color:var(--ink);background:var(--surface2)}
|
|
98
107
|
.tabbar{display:flex;align-items:stretch;height:38px;border-bottom:1px solid var(--line);background:var(--panel);font-family:var(--mono)}
|
|
99
|
-
.tabs{flex:1;display:flex;align-items:stretch;overflow-x:auto;overflow-y:hidden}
|
|
108
|
+
.tabs{flex:1;display:flex;align-items:stretch;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
|
|
109
|
+
.tabs::-webkit-scrollbar{width:0;height:0;display:none} /* 탭이 넘쳐도 흰 스크롤바 없이 스크롤만 */
|
|
100
110
|
.tab{display:inline-flex;align-items:center;gap:7px;padding:0 10px 0 12px;border-right:1px solid var(--line);font-size:12px;color:var(--muted);cursor:pointer;white-space:nowrap;max-width:220px;user-select:none;flex:none}
|
|
101
111
|
.tab:hover{background:var(--surface)}
|
|
102
112
|
.tab.shown{color:var(--ink);background:var(--bg);box-shadow:inset 0 -2px 0 var(--brand)}
|
|
@@ -1361,8 +1371,11 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
|
|
|
1361
1371
|
function openSession(){ $('pickModal').classList.add('on'); $('pickName').value=''; browseTo(''); }
|
|
1362
1372
|
function closePicker(){ $('pickModal').classList.remove('on'); }
|
|
1363
1373
|
async function browseTo(p){
|
|
1374
|
+
$('pickList').innerHTML = '<div class="pick-row" style="cursor:default;color:var(--faint)">불러오는 중…</div>';
|
|
1364
1375
|
try{
|
|
1365
|
-
var
|
|
1376
|
+
var res = await fetch('/api/browse'+(p?('?path='+encodeURIComponent(p)):''));
|
|
1377
|
+
if(!res.ok){ $('pickList').innerHTML = '<div class="pick-row" style="color:var(--failed)">'+(res.status===401?'인증이 만료됐어요 — 새로고침 후 다시 로그인':'폴더를 읽을 수 없습니다 (HTTP '+res.status+')')+'</div>'; return; }
|
|
1378
|
+
var d = await res.json();
|
|
1366
1379
|
pickPathCur = d.path; $('pickPath').textContent = d.path;
|
|
1367
1380
|
var html = '';
|
|
1368
1381
|
if (d.parent && d.parent!==d.path) html += '<div class="pick-row up" data-go="'+esc(d.parent)+'"><span class="ic">↑</span><span>..</span></div>';
|
|
@@ -1402,8 +1415,11 @@ export const COCKPIT_HTML = /* html */ `<!doctype html>
|
|
|
1402
1415
|
function closeFilePicker(){ $('fpickModal').classList.remove('on'); }
|
|
1403
1416
|
function fpIcon(kind){ return kind==='md'?'M':kind==='html'?'H':kind==='pdf'?'P':kind==='image'?'I':kind==='binary'?'·':'T'; }
|
|
1404
1417
|
async function fpTo(p){
|
|
1418
|
+
$('fpList').innerHTML = '<div class="pick-row" style="cursor:default;color:var(--faint)">불러오는 중…</div>';
|
|
1405
1419
|
try{
|
|
1406
|
-
var
|
|
1420
|
+
var res = await fetch('/api/fs/list'+(p?('?path='+encodeURIComponent(p)):''));
|
|
1421
|
+
if(!res.ok){ $('fpList').innerHTML = '<div class="pick-row" style="color:var(--failed)">'+(res.status===401?'인증이 만료됐어요 — 새로고침':'읽을 수 없습니다 (HTTP '+res.status+')')+'</div>'; return; }
|
|
1422
|
+
var d = await res.json();
|
|
1407
1423
|
fpDirCur = d.path; $('fpPath').textContent = d.path; if($('fpHint')) $('fpHint').textContent='폴더=이동 · 파일=뷰어로 열기';
|
|
1408
1424
|
var html='';
|
|
1409
1425
|
if (d.parent && d.parent!==d.path) html += '<div class="pick-row up" data-dir="'+esc(d.parent)+'"><span class="ic">↑</span><span>..</span></div>';
|