tabby-agentdeck 0.2.0 → 0.3.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 +193 -178
- package/dist/alert.service.d.ts +87 -0
- package/dist/api.d.ts +16 -2
- package/dist/bind.d.ts +23 -0
- package/dist/claudeHooks.d.ts +2 -1
- package/dist/config.d.ts +47 -0
- package/dist/deck.service.d.ts +58 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1403 -62
- package/dist/index.js.map +1 -1
- package/dist/notify.service.d.ts +92 -5
- package/dist/order.d.ts +26 -0
- package/dist/reason.d.ts +16 -0
- package/dist/recovery.service.d.ts +32 -0
- package/dist/settings.component.d.ts +4 -2
- package/dist/status.service.d.ts +14 -2
- package/dist/tabenv.d.ts +26 -0
- package/hooks/agentdeck-notify.ps1 +126 -6
- package/hooks/agentdeck-status.ps1 +2 -2
- package/install.ps1 +2 -31
- package/package.json +2 -2
package/dist/config.d.ts
CHANGED
|
@@ -48,12 +48,26 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
|
|
|
48
48
|
* 설정 창의 설치 버튼은 이 값과 무관하게 언제든 쓸 수 있다.
|
|
49
49
|
*/
|
|
50
50
|
hookPromptDismissed: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* 기동 시 지난 탭을 복원하지 않는다 (Tabby `recoverTabs` 를 false 로 강제).
|
|
53
|
+
*
|
|
54
|
+
* 복원되는 건 셸뿐이고 그 안의 Claude Code 세션은 이미 죽어 있어 의미가 없다.
|
|
55
|
+
* 켜면 항상 빈 상태(기본 프로필 새 탭)로 시작하고, 끄면 Tabby 순정 동작으로 돌아간다.
|
|
56
|
+
* 설정 창에서 토글한다 (recovery.service.ts).
|
|
57
|
+
*/
|
|
58
|
+
noTabRecovery: boolean;
|
|
51
59
|
/** PTY 출력이 이 시간(ms) 이상 없으면 running -> idle */
|
|
52
60
|
idleAfterMs: number;
|
|
53
61
|
/** 출력 패턴으로 상태를 자동 추론할지 */
|
|
54
62
|
autoDetect: boolean;
|
|
55
63
|
/** 사이드바에 경과 시간 표시 */
|
|
56
64
|
showElapsed: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* 사이드바 탭을 상태 우선순위(waiting → error → running → done → idle)로 정렬한다.
|
|
67
|
+
* 같은 상태끼리는 탭 순서를 지킨다. 기본은 끔 — 순정 탭바와 같은 탭 순서로 보인다.
|
|
68
|
+
* 헤더의 상태별 집계는 이 값과 무관하게 항상 보인다.
|
|
69
|
+
*/
|
|
70
|
+
sortByStatus: boolean;
|
|
57
71
|
/**
|
|
58
72
|
* 창이 가려져 있어도 사이드바를 계속 갱신한다 (Electron backgroundThrottling 해제).
|
|
59
73
|
*
|
|
@@ -80,6 +94,22 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
|
|
|
80
94
|
* false 로 두면 터미널 앱에 리터럴 Ctrl+V(0x16, quoted-insert)를 보낼 수 있다
|
|
81
95
|
*/
|
|
82
96
|
claimCtrlV: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Shift+Enter / Ctrl+Enter 를 캡처 단계에서 직접 줄바꿈으로 처리한다.
|
|
99
|
+
*
|
|
100
|
+
* 핫키(agentdeck-newline)에만 맡기면 한글 조합 중에 눌렀을 때 Shift 가 실리지
|
|
101
|
+
* 않은 Enter 로 도착해 전송돼 버린다 (deck.service.ts `claimShiftEnterKey` 주석).
|
|
102
|
+
* false 로 두면 예전처럼 핫키 경로만 쓴다.
|
|
103
|
+
*/
|
|
104
|
+
claimShiftEnter: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Home / End 를 Tabby 핫키에서 걷어내 xterm 순정 경로로 돌려준다.
|
|
107
|
+
*
|
|
108
|
+
* 핫키로 두면 한글 조합 중에 눌렀을 때 조합 음절이 커서를 따라간다
|
|
109
|
+
* (deck.service.ts `releaseHomeEndHotkey` 주석에 원인). 방향키가 멀쩡한 이유도 같다 —
|
|
110
|
+
* 방향키는 핫키가 아니라서 xterm 이 조합을 먼저 확정하고 키를 보낸다.
|
|
111
|
+
*/
|
|
112
|
+
releaseHomeEnd: boolean;
|
|
83
113
|
/**
|
|
84
114
|
* 클립보드에 이미지만 있으면 Ctrl+V 로도 이미지가 들어가게 한다.
|
|
85
115
|
*
|
|
@@ -258,6 +288,23 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
|
|
|
258
288
|
};
|
|
259
289
|
/** 기본 프로필 지정을 이미 했는지 — 사용자 선택을 매번 덮어쓰지 않기 위한 플래그 */
|
|
260
290
|
rootProfileClaimed: boolean;
|
|
291
|
+
/**
|
|
292
|
+
* 창이 뒤에 있을 때(포커스 없음) 탭이 `승인대기`/`오류` 로 넘어가면 OS 쪽에 알린다.
|
|
293
|
+
* 창이 앞에 있으면 세 항목 모두 아무 일도 하지 않는다 — 사이드바가 이미 보이고 있다.
|
|
294
|
+
* 작업표시줄 아이콘을 깜빡인다(`flashFrame`). 창이 포커스를 받으면 멈춘다
|
|
295
|
+
*/
|
|
296
|
+
alertFlash: boolean;
|
|
297
|
+
/**
|
|
298
|
+
* 작업표시줄 아이콘 위에 `승인대기`+`오류` 탭 개수를 뱃지로 얹는다.
|
|
299
|
+
* Windows 는 `setBadgeCount` 가 없어 오버레이 아이콘(원+숫자)으로 그린다.
|
|
300
|
+
* 이 값은 전이 순간이 아니라 상태가 바뀔 때마다 실제 개수로 갱신되고, 0 이면 지운다
|
|
301
|
+
*/
|
|
302
|
+
alertBadge: boolean;
|
|
303
|
+
/**
|
|
304
|
+
* OS 토스트(`Notification`)까지 띄운다. 기본은 끔 — 탭이 여럿이면 시끄럽다.
|
|
305
|
+
* 토스트를 누르면 창을 앞으로 가져오고 그 탭을 고른다
|
|
306
|
+
*/
|
|
307
|
+
alertToast: boolean;
|
|
261
308
|
/**
|
|
262
309
|
* 사이드바가 붙는 방향. 헤더를 잡고 창 가장자리로 끌어다 놓으면 바뀐다.
|
|
263
310
|
* 'left' | 'right' | 'top' | 'bottom'
|
package/dist/deck.service.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export declare class AgentDeckService {
|
|
|
27
27
|
private observer;
|
|
28
28
|
private editing;
|
|
29
29
|
private renderQueued;
|
|
30
|
+
/** Shift 물리 키가 눌려 있나 — IME 조합을 거친 Enter 는 shiftKey 가 지워져 온다 */
|
|
31
|
+
private shiftDownAt;
|
|
30
32
|
/** rAF 가 멈춘 상황(창 가려짐)을 대비한 렌더 폴백 타이머 */
|
|
31
33
|
private renderTimer;
|
|
32
34
|
/** 직전에 적용한 폭 — 같은 값이면 DOM 을 다시 건드리지 않는다 */
|
|
@@ -213,6 +215,56 @@ export declare class AgentDeckService {
|
|
|
213
215
|
* 브라우저 기본 붙여넣기여야 하고, 우리가 가로채면 아예 못 붙여넣게 된다.
|
|
214
216
|
*/
|
|
215
217
|
private claimCtrlVKey;
|
|
218
|
+
/**
|
|
219
|
+
* Home / End 를 Tabby 핫키 테이블에서 걷어내 xterm 순정 경로로 돌려준다.
|
|
220
|
+
*
|
|
221
|
+
* 증상: 한글 마지막 음절이 조합 중일 때 Home/End 를 누르면 그 음절이 **커서를 따라간다**
|
|
222
|
+
* (2026-09-08 사용자 보고). 방향키는 멀쩡하다 — 그 차이가 곧 원인이다.
|
|
223
|
+
*
|
|
224
|
+
* 방향키는 핫키가 아니라서 xterm 의 키 경로를 그대로 탄다. 거기서는 조합 중에 아무 키나
|
|
225
|
+
* 들어오면 `CompositionHelper.keydown` 이 `_finalizeComposition(false)` 로 조합을
|
|
226
|
+
* **동기 전송**하고(`tabby-terminal/dist/index.js:44098`, `:44120` triggerDataEvent) 그다음
|
|
227
|
+
* 방향키를 보낸다 — 글자 먼저, 이동 나중이라 순서가 맞는다.
|
|
228
|
+
*
|
|
229
|
+
* Home/End 는 그 경로를 못 탄다. Tabby 가 `hotkeys.home` / `hotkeys.end` 로 선점해서
|
|
230
|
+
* `tabby-local/dist/index.js:613` 이 `sendInput('[H')` 를 **즉시** 쏘기 때문이다.
|
|
231
|
+
* xterm 을 거치지 않으니 조합 확정은 `compositionend` 경로로 밀리는데, 그쪽
|
|
232
|
+
* `_finalizeComposition(true)` 는 `setTimeout(..., 0)` 로 **비동기 전송**이다
|
|
233
|
+
* (`tabby-terminal/dist/index.js:44110`). 결국 커서 이동이 먼저 나가고 음절이 한 틱 뒤에
|
|
234
|
+
* 도착한다 — 앱은 옮겨간 자리에 글자를 찍는다.
|
|
235
|
+
*
|
|
236
|
+
* 그래서 고치는 방법은 핸들러를 더 얹는 게 아니라 **핫키를 놓아주는 것**이다. 비워두면
|
|
237
|
+
* xterm 이 Home/End 를 방향키와 똑같이 처리한다(조합 확정 → 키 전송). 되돌리려면
|
|
238
|
+
* `agentDeck.releaseHomeEnd: false` 후 설정에서 다시 지정하면 된다.
|
|
239
|
+
*/
|
|
240
|
+
private releaseHomeEndHotkey;
|
|
241
|
+
/**
|
|
242
|
+
* Shift+Enter / Ctrl+Enter 를 document **캡처 단계**에서 직접 줄바꿈으로 바꾼다.
|
|
243
|
+
*
|
|
244
|
+
* 핫키(`agentdeck-newline`)에만 맡겼더니 한글을 치다 누르면 절반쯤 줄바꿈이 아니라
|
|
245
|
+
* **전송**이 됐다 (2026-09-08 사용자 보고: "50% 정도는 그냥 enter 로 들어간다").
|
|
246
|
+
* 진단로그에 증거가 남아 있다 — 오발신 순간 `enter-label` 이 발화했는데
|
|
247
|
+
* (`.agentdeck-diag.log` 00:54:59 `enter-label text="지금도 그랬"`), 그 핸들러는
|
|
248
|
+
* 수식키가 하나라도 눌려 있으면 맨 앞에서 빠져나간다. 즉 그 Enter 는 **shiftKey 가
|
|
249
|
+
* 지워진 채** 도착했다. 한글 IME 가 조합을 확정하며 Enter 를 한 번 삼키고, 뒤이어
|
|
250
|
+
* 내보내는 이벤트에는 Shift 상태를 싣지 않는 것이다. Shift 가 없으니 `Shift-Enter`
|
|
251
|
+
* 핫키에 매칭될 리 없고, xterm 은 평범한 Enter 로 0x0D 를 PTY 에 흘린다 —
|
|
252
|
+
* 쓰다 만 문장이 그대로 전송된다.
|
|
253
|
+
*
|
|
254
|
+
* 그래서 이벤트가 알려주는 수식키를 믿지 않고 **Shift 눌림을 우리가 따로 센다**.
|
|
255
|
+
* Shift 자체의 keydown/keyup 은 조합과 무관하게 그대로 오므로 IME 를 타지 않는다.
|
|
256
|
+
* 세어 둔 값이 썩는 것(키업 유실)을 막으려고 창 포커스가 나가거나, Shift 없이 평범한
|
|
257
|
+
* 글자가 들어오거나, 오래 묵으면(STALE_MS) 스스로 잊는다.
|
|
258
|
+
*
|
|
259
|
+
* 조합 중(`isComposing`/keyCode 229)인 Enter 는 손대지 않는다. 그건 "이 음절을
|
|
260
|
+
* 확정해라" 는 신호고 여기서 막으면 마지막 글자가 확정되지 못한 채 줄만 넘어간다.
|
|
261
|
+
* 확정이 끝나면 Enter 가 한 번 더 오니 그때 잡으면 글자 순서도 어긋나지 않는다.
|
|
262
|
+
*
|
|
263
|
+
* 캡처에서 전파를 끊는 이유는 claimCtrlVKey 와 같다 — 뒤에 걸린 경로(xterm 커스텀 키
|
|
264
|
+
* 핸들러 → pushKeyEvent, core 의 document 리스너, xterm 이 Enter 를 0x0D 로 흘리는
|
|
265
|
+
* 기본 동작)를 통째로 죽여야 줄바꿈이 정확히 한 번이 된다.
|
|
266
|
+
*/
|
|
267
|
+
private claimShiftEnterKey;
|
|
216
268
|
/**
|
|
217
269
|
* Enter 를 눌러 프롬프트를 보낼 때, 그 프롬프트 원문을 작업 라벨로 삼는다.
|
|
218
270
|
*
|
|
@@ -433,6 +485,12 @@ export declare class AgentDeckService {
|
|
|
433
485
|
private disableBackgroundThrottling;
|
|
434
486
|
private tick;
|
|
435
487
|
private render;
|
|
488
|
+
/**
|
|
489
|
+
* 헤더 오른쪽의 상태별 집계 — `⏸ 2 ● 3 ○ 1` 처럼 0 이 아닌 상태만 급한 순서로 놓는다.
|
|
490
|
+
* 총 개수만 보이던 자리다. 세션을 여럿 띄우면 "몇 개가 나를 기다리나" 가 먼저 보여야 한다.
|
|
491
|
+
* 동적 텍스트는 textContent 로만 넣는다 (innerHTML 금지).
|
|
492
|
+
*/
|
|
493
|
+
private renderHeadCount;
|
|
436
494
|
private renderTab;
|
|
437
495
|
/** 더블클릭 -> 작업 이름 인라인 편집 */
|
|
438
496
|
private startLabelEdit;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { AgentDeckService } from './deck.service';
|
|
2
2
|
import { AgentDeckProfileService } from './profile.service';
|
|
3
3
|
import { WorkNotifyService } from './notify.service';
|
|
4
|
+
import { AgentDeckAlertService } from './alert.service';
|
|
5
|
+
import { AgentDeckRecoveryService } from './recovery.service';
|
|
4
6
|
import './styles.scss';
|
|
5
7
|
export * from './api';
|
|
6
8
|
export default class AgentDeckModule {
|
|
7
|
-
constructor(deck: AgentDeckService, profiles: AgentDeckProfileService, notify: WorkNotifyService);
|
|
9
|
+
constructor(deck: AgentDeckService, profiles: AgentDeckProfileService, notify: WorkNotifyService, alert: AgentDeckAlertService, recovery: AgentDeckRecoveryService);
|
|
8
10
|
}
|