tabby-agentdeck 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +167 -150
  2. package/LICENSE +21 -21
  3. package/README.ko.md +52 -42
  4. package/README.md +52 -42
  5. package/dist/accountBrowser.d.ts +4 -0
  6. package/dist/accountSession.d.ts +22 -0
  7. package/dist/accounts.d.ts +55 -0
  8. package/dist/agents.d.ts +29 -0
  9. package/dist/codexKeys.d.ts +3 -0
  10. package/dist/config.d.ts +12 -20
  11. package/dist/deck.service.d.ts +32 -10
  12. package/dist/i18n/sidebar/af.d.ts +95 -0
  13. package/dist/i18n/sidebar/bg.d.ts +95 -0
  14. package/dist/i18n/sidebar/cs.d.ts +95 -0
  15. package/dist/i18n/sidebar/da.d.ts +95 -0
  16. package/dist/i18n/sidebar/de.d.ts +95 -0
  17. package/dist/i18n/sidebar/es.d.ts +95 -0
  18. package/dist/i18n/sidebar/fr.d.ts +95 -0
  19. package/dist/i18n/sidebar/hr.d.ts +95 -0
  20. package/dist/i18n/sidebar/id.d.ts +95 -0
  21. package/dist/i18n/sidebar/it.d.ts +95 -0
  22. package/dist/i18n/sidebar/ja.d.ts +95 -0
  23. package/dist/i18n/sidebar/pl.d.ts +95 -0
  24. package/dist/i18n/sidebar/pt.d.ts +95 -0
  25. package/dist/i18n/sidebar/ru.d.ts +95 -0
  26. package/dist/i18n/sidebar/sr.d.ts +95 -0
  27. package/dist/i18n/sidebar/sv.d.ts +95 -0
  28. package/dist/i18n/sidebar/tr.d.ts +95 -0
  29. package/dist/i18n/sidebar/uk.d.ts +95 -0
  30. package/dist/i18n/sidebar/zh-CN.d.ts +95 -0
  31. package/dist/i18n/sidebar/zh-TW.d.ts +95 -0
  32. package/dist/i18n.d.ts +20 -4
  33. package/dist/index.d.ts +2 -1
  34. package/dist/index.js +109 -1
  35. package/dist/notify.service.d.ts +16 -0
  36. package/dist/performance.d.ts +13 -0
  37. package/dist/profile.service.d.ts +2 -0
  38. package/dist/runtimeMigration.d.ts +3 -0
  39. package/dist/sessionLedger.service.d.ts +6 -3
  40. package/dist/sessionMailbox.d.ts +31 -0
  41. package/dist/sessionSearch.d.ts +41 -0
  42. package/dist/sessionSearchPanel.d.ts +36 -0
  43. package/dist/sessionSlots.d.ts +9 -0
  44. package/dist/settings.component.d.ts +14 -1
  45. package/dist/sidebarI18n.d.ts +9 -0
  46. package/dist/sidebarLocales.d.ts +1 -0
  47. package/dist/storageEnvironment.d.ts +6 -0
  48. package/dist/storageI18n.d.ts +1 -0
  49. package/dist/storagePaths.d.ts +19 -0
  50. package/dist/storageSettings.d.ts +28 -0
  51. package/dist/viewer.d.ts +2 -0
  52. package/hooks/agentdeck-codex-notify.ps1 +69 -28
  53. package/hooks/agentdeck-hook-trace.ps1 +57 -0
  54. package/hooks/agentdeck-label.js +53 -53
  55. package/hooks/agentdeck-mailbox.mjs +143 -0
  56. package/hooks/agentdeck-notify.ps1 +87 -8
  57. package/hooks/agentdeck-runtime.cjs +20 -0
  58. package/hooks/agentdeck-status.ps1 +33 -33
  59. package/hooks/agentdeck-statusline.mjs +349 -351
  60. package/package.json +75 -70
  61. package/updater/agentdeck-update.ps1 +153 -153
@@ -0,0 +1,55 @@
1
+ /// <reference types="node" />
2
+ export type AccountProvider = 'claude' | 'codex';
3
+ export interface SavedAccount {
4
+ provider: AccountProvider;
5
+ key: string;
6
+ name: string;
7
+ id: string;
8
+ }
9
+ export interface AccountQuota {
10
+ label: string;
11
+ remaining?: number;
12
+ status?: string;
13
+ resetsAt?: number;
14
+ }
15
+ export declare class AccountRequestError extends Error {
16
+ kind: 'auth' | 'temporary';
17
+ status: number;
18
+ retryAfterMs: number;
19
+ constructor(kind: 'auth' | 'temporary', message: string, status?: number, retryAfterMs?: number);
20
+ }
21
+ export declare const ACCOUNTS_FILE: string;
22
+ /** Do not let JSON parser errors (which can contain passwords) escape this boundary. */
23
+ export declare function readAccounts(file?: string): SavedAccount[];
24
+ /** Add one local plaintext entry without replacing other accounts or their encrypted auth snapshots. */
25
+ export declare function addAccount(provider: AccountProvider, id: string, password: string, file?: string, name?: string): void;
26
+ /** Remove the saved entry only. Running sessions may still use its native credential directory. */
27
+ export declare function removeAccount(account: SavedAccount, file?: string): void;
28
+ export declare function accountHome(account: SavedAccount): string;
29
+ export declare function accountEnv(account: SavedAccount): NodeJS.ProcessEnv;
30
+ export declare function accountEmail(provider: AccountProvider, home: string): string;
31
+ /** Windows encrypts the snapshot for the current OS user; secrets travel over stdin, never argv. */
32
+ export declare function protectAccountAuth(value: string, decrypt?: boolean): Promise<string>;
33
+ export declare function saveAccountAuth(account: SavedAccount): Promise<void>;
34
+ export declare function restoreAccountAuth(account: SavedAccount): Promise<void>;
35
+ /** Clone settings, share only conversation/instruction directories, keep auth private per account. */
36
+ export declare function prepareAccount(account: SavedAccount, sourceHome?: string): void;
37
+ /** In-flight marketplace seeding for an account home (tests and callers that must wait). */
38
+ export declare function pendingMarketplaceSeed(dest: string): Promise<void>;
39
+ /**
40
+ * Codex keeps git marketplace clones in `<CODEX_HOME>/.tmp/marketplaces/<name>`. An account home starts
41
+ * without them, so Codex clones each configured marketplace itself; a large one hits Codex's 30s clone
42
+ * timeout, the half-cloned `.staging/marketplace-upgrade-*` is never removed, and the retry repeats about
43
+ * once a minute (~370MB each, 130GB observed 2026-09-18). Copy the clones the source home already has.
44
+ * Async so the account picker does not freeze; a partial copy never takes the final name.
45
+ */
46
+ export declare function seedCodexMarketplaces(source: string, dest: string): Promise<void>;
47
+ export declare function accountCliRoots(): string[];
48
+ export declare function parseQuotas(provider: AccountProvider, body: any): AccountQuota[];
49
+ /** The app-server snapshot omits model_usage, which currently reports Astra availability, not a percentage. */
50
+ export declare function parseCodexUsage(body: any): AccountQuota[];
51
+ export declare function authenticateAccount(account: SavedAccount): Promise<void>;
52
+ export declare function fetchAccountQuotas(account: SavedAccount): Promise<AccountQuota[]>;
53
+ export type LoginBrowser = (url: string, account: SavedAccount, cancel: () => void) => Promise<() => void>;
54
+ /** First login is completed by the user; the saved authentication is reused afterwards. */
55
+ export declare function loginAccount(account: SavedAccount, browser: LoginBrowser): Promise<void>;
package/dist/agents.d.ts CHANGED
@@ -108,6 +108,35 @@ export interface AgentProfile {
108
108
  */
109
109
  patternsProven: boolean;
110
110
  }
111
+ /**
112
+ * Codex CLI 프로필.
113
+ *
114
+ * 실측된 것 —
115
+ * - 이미지 붙여넣기: 0x16(ctrl-v) 를 자기 붙여넣기로 받고 ESC v 는 모른다 (2026-08-28 실측)
116
+ * - 입력창 머리글자는 `›`(U+203A) 다 — `› Ask Codex to do anything` (2026-09-08, 국면① 채집).
117
+ * 기본 `promptHeads` 에 이미 있는 문자라 `promptShape` 가 필요 없다.
118
+ * - 배너 테두리는 박스 문자(`╭─╮│╰╯`)지만 **입력창에는 테두리가 없다** — 그래서
119
+ * `screenShape` 도 넣지 않는다 (없는 테두리를 찾게 만들면 상시 "깨짐" 이 된다).
120
+ * - 프로세스 **이름**으로는 안 잡힌다(자식이 `node.exe` 뿐). 제목도 `junggon` 이라 근거가 없다.
121
+ * 잡히는 자리는 pid 의 명령줄이고, `deck.service.ts` 의 `commandLinesOf` 폴백이 읽어 준다.
122
+ *
123
+ * 화면 문구(대기·작업중)는 **여전히 관측하지 못했다.** 2026-09-08 시도가 국면②③ 을 못 만든
124
+ * 이유는 두 단계였다 —
125
+ * ① 기본 모델 `gpt-5.4` 가 이 계정에서 거부됐다
126
+ * (`invalid_request_error … not supported when using Codex with a ChatGPT account`)
127
+ * ② `/model` 로 `gpt-6-astra low` 로 바꿔 그 벽은 넘었는데, 그 다음이 계정 사용량 한도였다
128
+ * (`■ Usage limit reached. You've reached your usage limit.`)
129
+ * 둘 다 우리 코드와 무관한 계정 상태다. 그래서 `patternsProven` 은 false 를 유지한다 —
130
+ * 합집합이 받쳐 주므로 프로필을 주지 않으면 예전과 똑같이 판정된다.
131
+ *
132
+ * 덧붙여 그 실패 화면이 **한도 도달 문구**를 하나 실측으로 남겼다(위 ②). 그 값은 이제
133
+ * `limitedPatterns` 에 들어 있다 — 화면 문구로 `limited` 를 판정하는 경로가 생겼기 때문이다
134
+ * (`detect.ts`). 대기·작업중이 여전히 미관측이라 `patternsProven` 은 false 그대로지만,
135
+ * 합집합이 이 한도 문구를 품으므로(`buildUnion`) codex 탭도 그 문구로 판정된다.
136
+ */
137
+ export declare const CODEX_APPROVAL_PATTERNS: RegExp[];
138
+ export declare const CODEX_WAITING_TITLE: RegExp;
139
+ export declare const CODEX_BUSY_TITLE: RegExp;
111
140
  /** 지원하는 에이전트 목록 — 새 CLI 는 여기에 한 덩이 추가하면 된다 */
112
141
  export declare const AGENT_PROFILES: AgentProfile[];
113
142
  export declare const UNKNOWN_PROFILE: AgentProfile;
@@ -0,0 +1,3 @@
1
+ /** xterm's Windows Alt+Up mapping emits Ctrl+Up. Codex uses Alt+Up
2
+ * to open queued questions; preserve the modifier for that CLI only. */
3
+ export declare function installCodexKeys(frontend: any, enabled: () => boolean, send: (data: string) => void): void;
package/dist/config.d.ts CHANGED
@@ -231,7 +231,7 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
231
231
  */
232
232
  searchBox: boolean;
233
233
  /**
234
- * 사이드바를 **키보드로** 다룬다 — 핫키(`agentdeck-focus-list`, 기본 `Ctrl-Shift-L`)로
234
+ * 사이드바를 **키보드로** 다룬다 — 핫키(`agentdeck-focus-list`, 기본 `Ctrl-L`)로
235
235
  * 목록에 들어가 ↑↓ 로 훑고, Enter 로 그 탭으로 전환, Esc 로 터미널에 돌아온다.
236
236
  * 검색창에서 ↓ 를 누르면 결과 목록으로 내려가고, 첫 줄에서 ↑ 면 검색창으로 돌아온다.
237
237
  * 그룹 헤더도 지나가며 Enter 로 접었다 펼 수 있다.
@@ -356,20 +356,20 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
356
356
  */
357
357
  claimCtrlV: boolean;
358
358
  /**
359
- * `Ctrl+Shift+T`(⌘+T) 를 agentdeck 새 탭이 받는다 — 순정 `new-tab` 에서 그 키를 뗀다.
359
+ * `Ctrl+T`(⌘+T) 를 새 탭이 받는다. 순정 `new-tab`에 겹치는 키만 뗀다.
360
360
  * false 면 떼지 않고 우리 핫키도 무시한다(순정 그대로). 순정 새 탭은 기본 프로필로 열어
361
361
  * 훅이 탭을 못 찾으므로, 이 플러그인을 쓰는 동안은 켜 두는 것이 맞다
362
362
  */
363
363
  claimNewTabKey: boolean;
364
364
  /**
365
- * `Ctrl+Shift+R` 을 agentdeck 화면 복구가 받는다 — 순정 `rename-tab` 에서 그 키를 뗀다.
365
+ * `Ctrl+R`을 화면 복구가 받는다. 순정 `rename-tab`에 겹치는 키만 뗀다.
366
366
  * false 면 떼지 않고 우리 핫키도 무시한다(순정 그대로). 탭 이름은 사이드바 더블클릭으로 바꾼다
367
367
  */
368
368
  claimRepairKey: boolean;
369
369
  /**
370
370
  * 순정 `close-pane`(포커스된 분할 패널 닫기)이 **비어 있으면** 이 키를 채운다.
371
371
  * Tabby 기본표는 이 항목이 빈 채로 오고, agentdeck 은 짧은 우클릭을 복사/붙여넣기로
372
- * 쓰기 때문에 컨텍스트 메뉴로 패널을 닫기가 번거롭다. `Ctrl-Shift-Q` 는 순정 네 패키지
372
+ * 쓰기 때문에 컨텍스트 메뉴로 패널을 닫기가 번거롭다. `Ctrl-Q` 는 순정 네 패키지
373
373
  * 기본표·agentdeck 어디에도 없는 키(2026-09-16 grep 0건).
374
374
  * 이미 사람이 채워 둔 표는 건드리지 않는다. 빈 문자열이면 아무것도 하지 않는다.
375
375
  */
@@ -658,6 +658,10 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
658
658
  viewerDock: string;
659
659
  /** 미리보기 패널 폭 (px). 경계선 드래그로 바뀐다 */
660
660
  viewerWidth: number;
661
+ /** Empty uses the CLI/environment default. Applied at app startup. */
662
+ accountStorageDir: string;
663
+ claudeStorageDir: string;
664
+ codexStorageDir: string;
661
665
  /** 레이아웃/사이드바 전체 on-off */
662
666
  enabled: boolean;
663
667
  /** 터미널 뷰포트 가로:세로 비율 */
@@ -688,7 +692,7 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
688
692
  *
689
693
  * 기본값을 비워 두지 않은 이유 — 이것이 사이드바를 마우스 없이 만지는 **유일한
690
694
  * 진입점**이라(목록은 tabindex=-1, `wireListKeys`) 안 묶여 있으면 기능이 없는 것과
691
- * 같다. `Ctrl-Shift-L` 은 Tabby 순정 기본 핫키와 겹치지 않는다 — core·terminal·
695
+ * 같다. `Ctrl-L` 은 Tabby 순정 기본 핫키와 겹치지 않는다 — core·terminal·
692
696
  * local·settings 네 패키지의 기본 조합을 훑어 확인했다(2026-09-09):
693
697
  * 그쪽이 쓰는 것은 `Ctrl-Shift-{A,C,D,E,F,I,P,R,S,T,V,W,Z}`·방향키·Tab·PageUp/Down·
694
698
  * Backspace·`-` 이다. 다른 플러그인과 부딪히면 설정 창에서 바꾼다.
@@ -707,7 +711,7 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
707
711
  * 없다.
708
712
  *
709
713
  * 9 까지만 두는 이유 — 열 번째부터는 눈으로 세는 것이 키를 누르는 것보다 느리다.
710
- * 그 위는 `Ctrl-Shift-L` 로 목록에 들어가 ↑↓ 로 간다
714
+ * 그 위는 `Ctrl-L` 로 목록에 들어가 ↑↓ 로 간다
711
715
  */
712
716
  'agentdeck-jump-1': string[];
713
717
  'agentdeck-jump-2': string[];
@@ -719,20 +723,8 @@ export declare class AgentDeckConfigProvider extends ConfigProvider {
719
723
  'agentdeck-jump-8': string[];
720
724
  'agentdeck-jump-9': string[];
721
725
  /**
722
- * 사이드바 하단 버튼 세 개의 키.
723
- *
724
- * **새 탭은 순정 `new-tab`(Ctrl+Shift+T · macOS ⌘+T)을 대체한다.** 순정은 `terminal.openTab()`
725
- * 으로 기본 프로필을 열어서 `AGENTDECK_TAB` 이 안 심기고 훅이 탭을 못 찾는다. 같은 키에
726
- * 우리 것을 얹고 순정 표에서 그 키를 뗀다(`ensureNewTabHotkey`, `claimNewTabKey`) —
727
- * 안 떼면 한 번 눌러 탭이 둘 열린다. `Ctrl+V` 를 가져온 방식(`ensurePasteHotkey`)과 같다.
728
- *
729
- * `Ctrl-Shift-O` 는 순정 네 패키지(core·terminal·local·settings) 기본표에 없다
730
- * (2026-09-16 grep 0건 — 순정이 쓰는 것은 `Ctrl-Shift-{A,C,D,E,F,I,P,R,S,T,V,W,Z}`).
731
- *
732
- * **화면 복구는 순정 `rename-tab`(Ctrl+Shift+R)을 대체한다** (2026-09-17). 이름 바꾸기는
733
- * 사이드바 더블클릭이 주 경로라 키를 잃어도 아쉽지 않고, R(repair)이 외우기 쉽다.
734
- * 새 탭과 같은 방식 — 우리 것을 얹고 순정 표에서 뗀다(`ensureRepairHotkey`, `claimRepairKey`).
735
- * 옛 기본값 `Ctrl-Shift-U` 가 config 에 그대로 저장돼 있으면(사람이 안 바꾼 것) R 로 옮긴다.
726
+ * Common actions use Ctrl without Shift. Existing custom shortcuts remain saved.
727
+ * Stock new-tab/rename-tab bindings are removed only when they overlap ours.
736
728
  */
737
729
  'agentdeck-new-tab': string[];
738
730
  'agentdeck-view': string[];
@@ -1,4 +1,5 @@
1
1
  import { NgZone } from '@angular/core';
2
+ import { LocaleService } from 'tabby-core';
2
3
  import { AppService, ConfigService, HostWindowService, HotkeysService, PlatformService, ProfilesService } from 'tabby-core';
3
4
  import { WorkStatusService } from './status.service';
4
5
  import { WorkNotifyService } from './notify.service';
@@ -60,12 +61,20 @@ export declare class AgentDeckService {
60
61
  private notify;
61
62
  private ledger;
62
63
  private zone;
64
+ private locale;
65
+ private readonly sessionSlots;
66
+ private pendingSessionOpens;
67
+ private syncSessionSlots;
63
68
  private sidebar;
64
69
  private listEl;
65
70
  /** 사이드바 하단 "지금 이 탭" 줄 (모델·계정·한도). 목록과 버튼 줄 사이에 고정된다 */
66
71
  private nowEl;
72
+ private accountPopup;
73
+ private accountPopupTab;
74
+ private accountSwitchBusy;
67
75
  /** 지난 세션 서랍 — 목록 **밖**, "지금 이 탭" 줄 바로 위. 펼치면 위로 자란다 */
68
76
  private resumeEl;
77
+ private historySearchPanel;
69
78
  private windowEl;
70
79
  private mainEl;
71
80
  private observer;
@@ -187,6 +196,10 @@ export declare class AgentDeckService {
187
196
  * 매 렌더마다 `liveSessionIds()` 가 다시 채운다(탭이 닫히면 그 줄은 이어받기로 돌아간다).
188
197
  */
189
198
  private resumeTabs;
199
+ private resumeOpening;
200
+ private resumeStarting;
201
+ private repairInProgress;
202
+ private ptyResizeGeneration;
190
203
  /**
191
204
  * 이 서비스의 출력 구독이 실제로 몇 번 돌았나 (진단용).
192
205
  *
@@ -231,7 +244,11 @@ export declare class AgentDeckService {
231
244
  private lastPasteAt;
232
245
  /** 이 시각까지는 PTY 로 나가는 입력을 진단 로그에 남긴다 (붙여넣기가 두 번 들어가는지 보려고) */
233
246
  private pasteProbeUntil;
234
- constructor(app: AppService, config: ConfigService, status: WorkStatusService, hotkeys: HotkeysService, profiles: ProfilesService, hostWindow: HostWindowService, platform: PlatformService, notify: WorkNotifyService, ledger: SessionLedgerService, zone: NgZone);
247
+ constructor(app: AppService, config: ConfigService, status: WorkStatusService, hotkeys: HotkeysService, profiles: ProfilesService, hostWindow: HostWindowService, platform: PlatformService, notify: WorkNotifyService, ledger: SessionLedgerService, zone: NgZone, locale?: LocaleService | null);
248
+ private get sidebarLang();
249
+ private ui;
250
+ private uiMarkup;
251
+ private refreshSidebarLanguage;
235
252
  init(): void;
236
253
  /**
237
254
  * 같은 키로는 한 번만 남기는 진단.
@@ -252,8 +269,8 @@ export declare class AgentDeckService {
252
269
  * 커널은 SIGWINCH 를 내지 않고, 앱은 다시 그릴 이유를 영영 못 받는다. 증상은
253
270
  * "statusline 이 사라지고 입력창 구분선이 중간에서 끊긴다" (2026-09-01 실측).
254
271
  *
255
- * 그래서 복구는 크기를 맞추는 것으로 끝내지 않고 **항상 한 번 흔든다**(`nudgePtyRedraw`).
256
- * 어긋남이 없어도 무해하다 — 폭이 한 칸 줄었다 돌아올 뿐이고 xterm 은 건드리지 않는다.
272
+ * 복구는 크기 정합 후 한 번의 재그리기를 요청한다. Windows Codex는 열 재배치를
273
+ * 피하도록 높이를 바꾼다. 완료 전의 반복 요청은 추가 작업으로 예약하지 않는다.
257
274
  *
258
275
  * @param scope `active` = 지금 보고 있는 탭만, `all` = 열려 있는 모든 탭
259
276
  */
@@ -369,7 +386,7 @@ export declare class AgentDeckService {
369
386
  */
370
387
  private announceSizeOnOpen;
371
388
  /**
372
- * `Ctrl+Shift+T`(⌘+T) 를 순정 `new-tab` 에서 **걷어내** 우리 `agentdeck-new-tab` 만 남긴다.
389
+ * 우리 새 탭 키와 겹치는 순정 `new-tab` 키만 걷어낸다. 기본은 Ctrl+T / ⌘+T다.
373
390
  *
374
391
  * 순정 처리자(`tabby-local` LocalTerminalModule → `terminal.openTab()`)는 같은 `hotkey$` 를
375
392
  * 구독하고 있어서, 두 id 에 같은 키가 매여 있으면 HotkeysService 가 하나만 고르긴 하지만
@@ -381,6 +398,7 @@ export declare class AgentDeckService {
381
398
  * 다시 덮는 것이 더 나쁘고, 설정 창에서 한 줄이면 복구된다.
382
399
  */
383
400
  private ensureNewTabHotkey;
401
+ private ensureSplitHotkeys;
384
402
  /**
385
403
  * 순정 `close-pane`(포커스된 분할 패널 닫기)이 비어 있으면 `closePaneKey` 로 채운다.
386
404
  *
@@ -394,7 +412,7 @@ export declare class AgentDeckService {
394
412
  */
395
413
  private ensureClosePaneHotkey;
396
414
  /**
397
- * `Ctrl+Shift+R` 을 순정 `rename-tab` 에서 **걷어내** 우리 `agentdeck-repair` 만 남긴다.
415
+ * 우리 복구 키와 겹치는 순정 `rename-tab` 키만 걷어낸다. 기본은 Ctrl+R이다.
398
416
  *
399
417
  * 방식과 이유는 `ensureNewTabHotkey` 와 같다 — 같은 키가 두 id 에 매여 있으면 어느 쪽이
400
418
  * 발화할지 저장 순서에 달리므로 표에서 떼는 것만이 확실하다. 탭 이름 바꾸기는 사이드바
@@ -880,7 +898,8 @@ export declare class AgentDeckService {
880
898
  */
881
899
  private syncPtySize;
882
900
  /**
883
- * pty 크기만 한 칸 줄였다 되돌려 TUI 가 화면을 다시 그리게 한다. **수동 복구 전용.**
901
+ * pty 크기를 한 칸 줄였다 되돌려 TUI가 다시 그리게 한다. Windows Codex는 높이를,
902
+ * 다른 TUI는 너비를 바꾼다. 수동 복구 전용이며 세션 교체 후에는 타이머를 적용하지 않는다.
884
903
  *
885
904
  * 자동 경로에서는 전부 걷어냈다 — 이 흔들기가 순정 수렴과 경쟁하며 깨진 화면을
886
905
  * 만들어 왔다(2026-09-02). 남겨 둔 이유는 `repairPane`(사이드바 `↻` / `agentdeck-repair`)
@@ -1016,7 +1035,10 @@ export declare class AgentDeckService {
1016
1035
  * 값이 없으면 **줄을 통째로 접는다**(`hidden`). "알 수 없음" 을 그려 두면 자리만 차지하면서
1017
1036
  * "statusLine 래퍼가 안 걸렸다" 와 "걸렸는데 아직 첫 보고가 안 왔다" 가 화면에서 같아진다.
1018
1037
  */
1038
+ private showAccountPicker;
1039
+ private switchAccountInTab;
1019
1040
  private renderNow;
1041
+ private renderMetaGauges;
1020
1042
  /**
1021
1043
  * 사이드바 바닥의 **지난 세션** 서랍 — `⟲ 지난 세션 128` 한 줄(기본 접힘)과, 펴면 그 목록.
1022
1044
  *
@@ -1034,8 +1056,6 @@ export declare class AgentDeckService {
1034
1056
  * 이제는 늘 보이는 자리라 감추면 "검색하면 지난 세션이 사라진다" 가 된다.
1035
1057
  */
1036
1058
  private renderResumeDrawer;
1037
- /** 검색어가 지난 세션 줄에 걸리나 — 탭과 같은 자리(제목·작업 폴더)를 본다 */
1038
- private resumeMatchesQuery;
1039
1059
  /** 지금 탭이 들고 있는 세션 — `세션id -> 탭 식별용 문자열`. 되돌아올 탭은 `resumeTabs` 가 들고 있다 */
1040
1060
  private liveSessionIds;
1041
1061
  /** 지난 세션 서랍이 펴져 있나. `collapsedGroups` 와 **반대로 펼침을 적는다** — 기본이 접힘이라서 */
@@ -1200,11 +1220,11 @@ export declare class AgentDeckService {
1200
1220
  *
1201
1221
  * ↑↓ 와 달리 훑어보기가 아니라 **바로 전환**이다. 사람이 번호를 누르는 것은 이미 어디로
1202
1222
  * 갈지 정했다는 뜻이고, 포커스만 옮기면 Enter 를 한 번 더 눌러야 해서 키 두 번짜리
1203
- * `Ctrl-Shift-L` + ↑↓ 와 다를 것이 없어진다.
1223
+ * `Ctrl-L` + ↑↓ 와 다를 것이 없어진다.
1204
1224
  *
1205
1225
  * **키보드 내비게이션 모드에 들어가지 않는다.** 목록에 포커스를 주면 그 다음 타이핑이
1206
1226
  * 터미널로 안 가고(`navMode === 'list'`) 사람은 방금 연 세션에 곧바로 치려던 참이다.
1207
- * 그래서 `navFocus` 만 그 줄로 맞춰 둔다 — 이어서 `Ctrl-Shift-L` 을 누르면 방금 간 줄에서
1227
+ * 그래서 `navFocus` 만 그 줄로 맞춰 둔다 — 이어서 `Ctrl-L` 을 누르면 방금 간 줄에서
1208
1228
  * 훑기가 시작된다.
1209
1229
  *
1210
1230
  * 사이드바를 껐거나(`enabled: false`) 키보드 조작을 끈 사람(`keyboardNav: false`)에게는
@@ -1406,6 +1426,8 @@ export declare class AgentDeckService {
1406
1426
  * 세션↔탭 매핑은 `notify` 가 이미 들고 있어 판정에 드는 비용이 없으니 막는다.
1407
1427
  */
1408
1428
  private activateResume;
1429
+ /** Cover the gap between tab creation and the first CLI hook. */
1430
+ private trackResumeStart;
1409
1431
  /**
1410
1432
  * 이어받기용 새 탭.
1411
1433
  *
@@ -0,0 +1,95 @@
1
+ declare const _default: {
2
+ "\uACC4\uC815 \uC774\uB984 (\uC120\uD0DD)": string;
3
+ "\uBAA9\uB85D\uC5D0\uC11C \uC0AD\uC81C": string;
4
+ "\uC774\uBA54\uC77C \uC8FC\uC18C \uC804\uCCB4\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
5
+ "\uACC4\uC815 \uCD94\uAC00": string;
6
+ "\uACC4\uC815 (\uC774\uBA54\uC77C)": string;
7
+ 비밀번호: string;
8
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uAC00 \uC774 PC\uC5D0 \uD3C9\uBB38\uC73C\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
9
+ 저장: string;
10
+ 취소: string;
11
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
12
+ "\uC774\uBBF8 \uB4F1\uB85D\uB41C \uACC4\uC815\uC785\uB2C8\uB2E4.": string;
13
+ "\uACC4\uC815\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.": string;
14
+ "\uACC4\uC815 \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. JSON \uD615\uC2DD\uC744 \uD655\uC778\uD558\uC138\uC694.": string;
15
+ "+ \uBC84\uD2BC\uC73C\uB85C \uACC4\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694.": string;
16
+ "\uD604\uC7AC \uD0ED\uC5D0\uC11C \uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC804\uD658\uD569\uB2C8\uB2E4.": string;
17
+ "\uC138\uC158 \uAC80\uC0C9 (\uC81C\uBAA9 \u00B7 \uC791\uC5C5\uC774\uB984 \u00B7 \uD3F4\uB354)": string;
18
+ "\uAC80\uC0C9\u00B7\uD544\uD130 \uC9C0\uC6B0\uAE30 (Esc)": string;
19
+ "\uACC4\uC815 \uC120\uD0DD": string;
20
+ "\uC0C8 \uD0ED": string;
21
+ "+ \uC0C8 \uD0ED": string;
22
+ 설정: string;
23
+ "\uD654\uBA74 \uBCF5\uAD6C (\uBAA8\uB4E0 \uD0ED \uB2E4\uC2DC \uADF8\uB9AC\uAE30)": string;
24
+ "\uBBF8\uB9AC\uBCF4\uAE30 \uD328\uB110 (md \u00B7 \uC774\uBBF8\uC9C0 \u00B7 \uD45C)": string;
25
+ 진행중: string;
26
+ 승인대기: string;
27
+ "\uD55C\uB3C4 \uB3C4\uB2EC": string;
28
+ 완료: string;
29
+ 오류: string;
30
+ 대기: string;
31
+ 기타: string;
32
+ "\uC9C0\uB09C \uC138\uC158": string;
33
+ 어제: string;
34
+ "\u25CF \uC5F4\uB9BC": string;
35
+ "\uD0ED \uB2EB\uAE30": string;
36
+ "(\uC81C\uBAA9 \uC5C6\uC74C)": string;
37
+ "\uC791\uC5C5 \uC774\uB984": string;
38
+ 닫기: string;
39
+ 모름: string;
40
+ "\uB2EB\uD78C Claude Code \u00B7 Codex \uC138\uC158 \u2014 \uB204\uB974\uBA74 \uADF8 \uB300\uD654\uB97C \uC774\uC5B4\uBC1B\uB294\uB2E4": string;
41
+ "\uAC80\uC0C9\uC5B4\uC640 \uB9DE\uB294 \uC9C0\uB09C \uC138\uC158\uC774 \uC5C6\uB2E4": string;
42
+ "Esc \uB610\uB294 \u2715 \uB85C \uC804\uCCB4 \uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC04\uB2E4": string;
43
+ "\uC0C1\uD0DC\uC21C \uC815\uB82C\uC774 \uCF1C\uC838 \uC788\uC5B4 \uC21C\uC11C\uB97C \uBC14\uAFC0 \uC218 \uC5C6\uB2E4 \u2014 \uC124\uC815\uC5D0\uC11C \uB044\uBA74 \uB04C\uC5B4\uC11C \uC62E\uAE38 \uC218 \uC788\uB2E4": string;
44
+ "\uC774 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
45
+ "\uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
46
+ "\uBD84\uAE30\uD574\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
47
+ "\uC138\uC158 ID \uBCF5\uC0AC": string;
48
+ "\uBAA9\uB85D\uC5D0\uC11C \uC228\uAE30\uAE30": string;
49
+ "\u21BA \uC790\uB3D9 \uAC10\uC9C0\uB85C": string;
50
+ "\u21BB \uD654\uBA74 \uBCF5\uAD6C": string;
51
+ "\uD328\uB110\uC5D0 \uB744\uC6B0\uAE30": string;
52
+ "\uACBD\uB85C \uBD99\uC5EC\uB123\uAE30": string;
53
+ "\uC544\uBB34\uAC83\uB3C4 \uD558\uC9C0 \uC54A\uB294\uB2E4": string;
54
+ "\uB2E4\uC2DC \uBB3B\uC9C0 \uC54A\uAE30": string;
55
+ "{name} \uC744 \uC5B4\uB5BB\uAC8C \uD560\uAE4C\uC694?": string;
56
+ "{provider} \uACC4\uC815 \uC120\uD0DD": string;
57
+ "{provider} \uACC4\uC815": string;
58
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC774 \uB300\uD654\uB97C \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uAC11\uB2C8\uB2E4.": string;
59
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC0C8 \uB300\uD654\uB97C \uC5FD\uB2C8\uB2E4.": string;
60
+ "\uB4F1\uB85D\uB41C \uACC4\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. accounts.json\uC744 \uCC44\uC6CC\uC8FC\uC138\uC694.": string;
61
+ " \u00B7 \uD604\uC7AC \uACC4\uC815": string;
62
+ "\uC794\uB7C9 \uC870\uD68C \uC911\u2026": string;
63
+ "\uACC4\uC815 \uC800\uC7A5 \uD3F4\uB354\uB97C \uC900\uBE44\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
64
+ "\uC0AC\uC6A9\uB7C9 \uC815\uBCF4 \uC5C6\uC74C": string;
65
+ "\uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD614\uC2B5\uB2C8\uB2E4. \uACC4\uC815 \uBAA9\uB85D\uC744 \uB2E4\uC2DC \uC5EC\uC138\uC694.": string;
66
+ "{name} \uC778\uC99D \uD655\uC778 \uC911\u2026": string;
67
+ "{name}: \uC5F4\uB9B0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778\uD558\uC138\uC694. \uC778\uC99D\uC815\uBCF4\uB294 \uC790\uB3D9 \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
68
+ "\uC778\uC99D\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4. \uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD600 \uC0C8 \uB300\uD654\uC5D0\uC11C \uACC4\uC815\uC744 \uC120\uD0DD\uD574\uC57C \uD569\uB2C8\uB2E4.": string;
69
+ "\uACC4\uC815 \uC804\uD658\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC120\uD0DD\uD558\uC138\uC694.": string;
70
+ "\uC0C8 \uACC4\uC815 \uD0ED\uC744 \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
71
+ "\uC138\uC158 {id}": string;
72
+ "\uC774\uBBF8 \uC5F4\uB824 \uC788\uB2E4 \u2014 \uB204\uB974\uBA74 \uADF8 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
73
+ "\uB204\uB974\uBA74 \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uB294\uB2E4 ({id})": string;
74
+ "\uC791\uC5C5 \uD3F4\uB354: {cwd}": string;
75
+ "\u203B \uB300\uD654\uB9CC \uB3CC\uC544\uC628\uB2E4 \u2014 \uADF8\uB54C \uB744\uC6CC \uB454 \uC11C\uBC84\u00B7\uBC31\uADF8\uB77C\uC6B4\uB4DC \uD504\uB85C\uC138\uC2A4\uB294 \uB418\uC0B4\uC544\uB098\uC9C0 \uC54A\uB294\uB2E4": string;
76
+ "{filter}\uC5D0 \uAC78\uB9AC\uB294 \uC138\uC158\uC774 \uC5C6\uB2E4 (\uC804\uCCB4 {total}\uAC1C)": string;
77
+ " \u00B7 \uAC80\uC0C9\uC5D0 \uAC78\uB9B0 \uC138\uC158\uC774 \uC788\uC5B4 \uC784\uC2DC\uB85C \uD3B4 \uB460 (\uAC80\uC0C9\uC744 \uC9C0\uC6B0\uBA74 \uB2E4\uC2DC \uC811\uD78C\uB2E4)": string;
78
+ "{folder} (\uD0ED {count}\uAC1C) \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
79
+ "\uC791\uC5C5 \uD3F4\uB354\uB97C \uC544\uC9C1 \uBAA8\uB974\uB294 \uD0ED {count}\uAC1C \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
80
+ "\uD0ED {count}\uAC1C": string;
81
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uD544\uD130 \uD574\uC81C": string;
82
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uC774 \uC0C1\uD0DC\uB9CC": string;
83
+ "{n}\uCD08": string;
84
+ "{n}\uBD84": string;
85
+ "{h}\uC2DC\uAC04 {m}\uBD84": string;
86
+ "\uACC4\uC815: {value}": string;
87
+ "\uBC84\uC804: {value}": string;
88
+ "\uD3F4\uB354: {value}": string;
89
+ "{tool} \uAD8C\uD55C": string;
90
+ "\uC785\uB825 \uB300\uAE30": string;
91
+ "\uD50C\uB79C \uC2B9\uC778": string;
92
+ "\uC9C8\uBB38 \uC751\uB2F5": string;
93
+ "{time} \uB9AC\uC14B": string;
94
+ };
95
+ export default _default;
@@ -0,0 +1,95 @@
1
+ declare const _default: {
2
+ "\uACC4\uC815 \uC774\uB984 (\uC120\uD0DD)": string;
3
+ "\uBAA9\uB85D\uC5D0\uC11C \uC0AD\uC81C": string;
4
+ "\uC774\uBA54\uC77C \uC8FC\uC18C \uC804\uCCB4\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
5
+ "\uACC4\uC815 \uCD94\uAC00": string;
6
+ "\uACC4\uC815 (\uC774\uBA54\uC77C)": string;
7
+ 비밀번호: string;
8
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uAC00 \uC774 PC\uC5D0 \uD3C9\uBB38\uC73C\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
9
+ 저장: string;
10
+ 취소: string;
11
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
12
+ "\uC774\uBBF8 \uB4F1\uB85D\uB41C \uACC4\uC815\uC785\uB2C8\uB2E4.": string;
13
+ "\uACC4\uC815\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.": string;
14
+ "\uACC4\uC815 \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. JSON \uD615\uC2DD\uC744 \uD655\uC778\uD558\uC138\uC694.": string;
15
+ "+ \uBC84\uD2BC\uC73C\uB85C \uACC4\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694.": string;
16
+ "\uD604\uC7AC \uD0ED\uC5D0\uC11C \uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC804\uD658\uD569\uB2C8\uB2E4.": string;
17
+ "\uC138\uC158 \uAC80\uC0C9 (\uC81C\uBAA9 \u00B7 \uC791\uC5C5\uC774\uB984 \u00B7 \uD3F4\uB354)": string;
18
+ "\uAC80\uC0C9\u00B7\uD544\uD130 \uC9C0\uC6B0\uAE30 (Esc)": string;
19
+ "\uACC4\uC815 \uC120\uD0DD": string;
20
+ "\uC0C8 \uD0ED": string;
21
+ "+ \uC0C8 \uD0ED": string;
22
+ 설정: string;
23
+ "\uD654\uBA74 \uBCF5\uAD6C (\uBAA8\uB4E0 \uD0ED \uB2E4\uC2DC \uADF8\uB9AC\uAE30)": string;
24
+ "\uBBF8\uB9AC\uBCF4\uAE30 \uD328\uB110 (md \u00B7 \uC774\uBBF8\uC9C0 \u00B7 \uD45C)": string;
25
+ 진행중: string;
26
+ 승인대기: string;
27
+ "\uD55C\uB3C4 \uB3C4\uB2EC": string;
28
+ 완료: string;
29
+ 오류: string;
30
+ 대기: string;
31
+ 기타: string;
32
+ "\uC9C0\uB09C \uC138\uC158": string;
33
+ 어제: string;
34
+ "\u25CF \uC5F4\uB9BC": string;
35
+ "\uD0ED \uB2EB\uAE30": string;
36
+ "(\uC81C\uBAA9 \uC5C6\uC74C)": string;
37
+ "\uC791\uC5C5 \uC774\uB984": string;
38
+ 닫기: string;
39
+ 모름: string;
40
+ "\uB2EB\uD78C Claude Code \u00B7 Codex \uC138\uC158 \u2014 \uB204\uB974\uBA74 \uADF8 \uB300\uD654\uB97C \uC774\uC5B4\uBC1B\uB294\uB2E4": string;
41
+ "\uAC80\uC0C9\uC5B4\uC640 \uB9DE\uB294 \uC9C0\uB09C \uC138\uC158\uC774 \uC5C6\uB2E4": string;
42
+ "Esc \uB610\uB294 \u2715 \uB85C \uC804\uCCB4 \uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC04\uB2E4": string;
43
+ "\uC0C1\uD0DC\uC21C \uC815\uB82C\uC774 \uCF1C\uC838 \uC788\uC5B4 \uC21C\uC11C\uB97C \uBC14\uAFC0 \uC218 \uC5C6\uB2E4 \u2014 \uC124\uC815\uC5D0\uC11C \uB044\uBA74 \uB04C\uC5B4\uC11C \uC62E\uAE38 \uC218 \uC788\uB2E4": string;
44
+ "\uC774 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
45
+ "\uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
46
+ "\uBD84\uAE30\uD574\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
47
+ "\uC138\uC158 ID \uBCF5\uC0AC": string;
48
+ "\uBAA9\uB85D\uC5D0\uC11C \uC228\uAE30\uAE30": string;
49
+ "\u21BA \uC790\uB3D9 \uAC10\uC9C0\uB85C": string;
50
+ "\u21BB \uD654\uBA74 \uBCF5\uAD6C": string;
51
+ "\uD328\uB110\uC5D0 \uB744\uC6B0\uAE30": string;
52
+ "\uACBD\uB85C \uBD99\uC5EC\uB123\uAE30": string;
53
+ "\uC544\uBB34\uAC83\uB3C4 \uD558\uC9C0 \uC54A\uB294\uB2E4": string;
54
+ "\uB2E4\uC2DC \uBB3B\uC9C0 \uC54A\uAE30": string;
55
+ "{name} \uC744 \uC5B4\uB5BB\uAC8C \uD560\uAE4C\uC694?": string;
56
+ "{provider} \uACC4\uC815 \uC120\uD0DD": string;
57
+ "{provider} \uACC4\uC815": string;
58
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC774 \uB300\uD654\uB97C \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uAC11\uB2C8\uB2E4.": string;
59
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC0C8 \uB300\uD654\uB97C \uC5FD\uB2C8\uB2E4.": string;
60
+ "\uB4F1\uB85D\uB41C \uACC4\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. accounts.json\uC744 \uCC44\uC6CC\uC8FC\uC138\uC694.": string;
61
+ " \u00B7 \uD604\uC7AC \uACC4\uC815": string;
62
+ "\uC794\uB7C9 \uC870\uD68C \uC911\u2026": string;
63
+ "\uACC4\uC815 \uC800\uC7A5 \uD3F4\uB354\uB97C \uC900\uBE44\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
64
+ "\uC0AC\uC6A9\uB7C9 \uC815\uBCF4 \uC5C6\uC74C": string;
65
+ "\uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD614\uC2B5\uB2C8\uB2E4. \uACC4\uC815 \uBAA9\uB85D\uC744 \uB2E4\uC2DC \uC5EC\uC138\uC694.": string;
66
+ "{name} \uC778\uC99D \uD655\uC778 \uC911\u2026": string;
67
+ "{name}: \uC5F4\uB9B0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778\uD558\uC138\uC694. \uC778\uC99D\uC815\uBCF4\uB294 \uC790\uB3D9 \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
68
+ "\uC778\uC99D\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4. \uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD600 \uC0C8 \uB300\uD654\uC5D0\uC11C \uACC4\uC815\uC744 \uC120\uD0DD\uD574\uC57C \uD569\uB2C8\uB2E4.": string;
69
+ "\uACC4\uC815 \uC804\uD658\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC120\uD0DD\uD558\uC138\uC694.": string;
70
+ "\uC0C8 \uACC4\uC815 \uD0ED\uC744 \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
71
+ "\uC138\uC158 {id}": string;
72
+ "\uC774\uBBF8 \uC5F4\uB824 \uC788\uB2E4 \u2014 \uB204\uB974\uBA74 \uADF8 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
73
+ "\uB204\uB974\uBA74 \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uB294\uB2E4 ({id})": string;
74
+ "\uC791\uC5C5 \uD3F4\uB354: {cwd}": string;
75
+ "\u203B \uB300\uD654\uB9CC \uB3CC\uC544\uC628\uB2E4 \u2014 \uADF8\uB54C \uB744\uC6CC \uB454 \uC11C\uBC84\u00B7\uBC31\uADF8\uB77C\uC6B4\uB4DC \uD504\uB85C\uC138\uC2A4\uB294 \uB418\uC0B4\uC544\uB098\uC9C0 \uC54A\uB294\uB2E4": string;
76
+ "{filter}\uC5D0 \uAC78\uB9AC\uB294 \uC138\uC158\uC774 \uC5C6\uB2E4 (\uC804\uCCB4 {total}\uAC1C)": string;
77
+ " \u00B7 \uAC80\uC0C9\uC5D0 \uAC78\uB9B0 \uC138\uC158\uC774 \uC788\uC5B4 \uC784\uC2DC\uB85C \uD3B4 \uB460 (\uAC80\uC0C9\uC744 \uC9C0\uC6B0\uBA74 \uB2E4\uC2DC \uC811\uD78C\uB2E4)": string;
78
+ "{folder} (\uD0ED {count}\uAC1C) \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
79
+ "\uC791\uC5C5 \uD3F4\uB354\uB97C \uC544\uC9C1 \uBAA8\uB974\uB294 \uD0ED {count}\uAC1C \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
80
+ "\uD0ED {count}\uAC1C": string;
81
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uD544\uD130 \uD574\uC81C": string;
82
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uC774 \uC0C1\uD0DC\uB9CC": string;
83
+ "{n}\uCD08": string;
84
+ "{n}\uBD84": string;
85
+ "{h}\uC2DC\uAC04 {m}\uBD84": string;
86
+ "\uACC4\uC815: {value}": string;
87
+ "\uBC84\uC804: {value}": string;
88
+ "\uD3F4\uB354: {value}": string;
89
+ "{tool} \uAD8C\uD55C": string;
90
+ "\uC785\uB825 \uB300\uAE30": string;
91
+ "\uD50C\uB79C \uC2B9\uC778": string;
92
+ "\uC9C8\uBB38 \uC751\uB2F5": string;
93
+ "{time} \uB9AC\uC14B": string;
94
+ };
95
+ export default _default;
@@ -0,0 +1,95 @@
1
+ declare const _default: {
2
+ "\uACC4\uC815 \uC774\uB984 (\uC120\uD0DD)": string;
3
+ "\uBAA9\uB85D\uC5D0\uC11C \uC0AD\uC81C": string;
4
+ "\uC774\uBA54\uC77C \uC8FC\uC18C \uC804\uCCB4\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
5
+ "\uACC4\uC815 \uCD94\uAC00": string;
6
+ "\uACC4\uC815 (\uC774\uBA54\uC77C)": string;
7
+ 비밀번호: string;
8
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uAC00 \uC774 PC\uC5D0 \uD3C9\uBB38\uC73C\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
9
+ 저장: string;
10
+ 취소: string;
11
+ "\uACC4\uC815\uACFC \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694.": string;
12
+ "\uC774\uBBF8 \uB4F1\uB85D\uB41C \uACC4\uC815\uC785\uB2C8\uB2E4.": string;
13
+ "\uACC4\uC815\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.": string;
14
+ "\uACC4\uC815 \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. JSON \uD615\uC2DD\uC744 \uD655\uC778\uD558\uC138\uC694.": string;
15
+ "+ \uBC84\uD2BC\uC73C\uB85C \uACC4\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694.": string;
16
+ "\uD604\uC7AC \uD0ED\uC5D0\uC11C \uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC804\uD658\uD569\uB2C8\uB2E4.": string;
17
+ "\uC138\uC158 \uAC80\uC0C9 (\uC81C\uBAA9 \u00B7 \uC791\uC5C5\uC774\uB984 \u00B7 \uD3F4\uB354)": string;
18
+ "\uAC80\uC0C9\u00B7\uD544\uD130 \uC9C0\uC6B0\uAE30 (Esc)": string;
19
+ "\uACC4\uC815 \uC120\uD0DD": string;
20
+ "\uC0C8 \uD0ED": string;
21
+ "+ \uC0C8 \uD0ED": string;
22
+ 설정: string;
23
+ "\uD654\uBA74 \uBCF5\uAD6C (\uBAA8\uB4E0 \uD0ED \uB2E4\uC2DC \uADF8\uB9AC\uAE30)": string;
24
+ "\uBBF8\uB9AC\uBCF4\uAE30 \uD328\uB110 (md \u00B7 \uC774\uBBF8\uC9C0 \u00B7 \uD45C)": string;
25
+ 진행중: string;
26
+ 승인대기: string;
27
+ "\uD55C\uB3C4 \uB3C4\uB2EC": string;
28
+ 완료: string;
29
+ 오류: string;
30
+ 대기: string;
31
+ 기타: string;
32
+ "\uC9C0\uB09C \uC138\uC158": string;
33
+ 어제: string;
34
+ "\u25CF \uC5F4\uB9BC": string;
35
+ "\uD0ED \uB2EB\uAE30": string;
36
+ "(\uC81C\uBAA9 \uC5C6\uC74C)": string;
37
+ "\uC791\uC5C5 \uC774\uB984": string;
38
+ 닫기: string;
39
+ 모름: string;
40
+ "\uB2EB\uD78C Claude Code \u00B7 Codex \uC138\uC158 \u2014 \uB204\uB974\uBA74 \uADF8 \uB300\uD654\uB97C \uC774\uC5B4\uBC1B\uB294\uB2E4": string;
41
+ "\uAC80\uC0C9\uC5B4\uC640 \uB9DE\uB294 \uC9C0\uB09C \uC138\uC158\uC774 \uC5C6\uB2E4": string;
42
+ "Esc \uB610\uB294 \u2715 \uB85C \uC804\uCCB4 \uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC04\uB2E4": string;
43
+ "\uC0C1\uD0DC\uC21C \uC815\uB82C\uC774 \uCF1C\uC838 \uC788\uC5B4 \uC21C\uC11C\uB97C \uBC14\uAFC0 \uC218 \uC5C6\uB2E4 \u2014 \uC124\uC815\uC5D0\uC11C \uB044\uBA74 \uB04C\uC5B4\uC11C \uC62E\uAE38 \uC218 \uC788\uB2E4": string;
44
+ "\uC774 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
45
+ "\uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
46
+ "\uBD84\uAE30\uD574\uC11C \uC774\uC5B4\uBC1B\uAE30": string;
47
+ "\uC138\uC158 ID \uBCF5\uC0AC": string;
48
+ "\uBAA9\uB85D\uC5D0\uC11C \uC228\uAE30\uAE30": string;
49
+ "\u21BA \uC790\uB3D9 \uAC10\uC9C0\uB85C": string;
50
+ "\u21BB \uD654\uBA74 \uBCF5\uAD6C": string;
51
+ "\uD328\uB110\uC5D0 \uB744\uC6B0\uAE30": string;
52
+ "\uACBD\uB85C \uBD99\uC5EC\uB123\uAE30": string;
53
+ "\uC544\uBB34\uAC83\uB3C4 \uD558\uC9C0 \uC54A\uB294\uB2E4": string;
54
+ "\uB2E4\uC2DC \uBB3B\uC9C0 \uC54A\uAE30": string;
55
+ "{name} \uC744 \uC5B4\uB5BB\uAC8C \uD560\uAE4C\uC694?": string;
56
+ "{provider} \uACC4\uC815 \uC120\uD0DD": string;
57
+ "{provider} \uACC4\uC815": string;
58
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC774 \uB300\uD654\uB97C \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uAC11\uB2C8\uB2E4.": string;
59
+ "\uC120\uD0DD\uD55C \uACC4\uC815\uC73C\uB85C \uC0C8 \uB300\uD654\uB97C \uC5FD\uB2C8\uB2E4.": string;
60
+ "\uB4F1\uB85D\uB41C \uACC4\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. accounts.json\uC744 \uCC44\uC6CC\uC8FC\uC138\uC694.": string;
61
+ " \u00B7 \uD604\uC7AC \uACC4\uC815": string;
62
+ "\uC794\uB7C9 \uC870\uD68C \uC911\u2026": string;
63
+ "\uACC4\uC815 \uC800\uC7A5 \uD3F4\uB354\uB97C \uC900\uBE44\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
64
+ "\uC0AC\uC6A9\uB7C9 \uC815\uBCF4 \uC5C6\uC74C": string;
65
+ "\uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD614\uC2B5\uB2C8\uB2E4. \uACC4\uC815 \uBAA9\uB85D\uC744 \uB2E4\uC2DC \uC5EC\uC138\uC694.": string;
66
+ "{name} \uC778\uC99D \uD655\uC778 \uC911\u2026": string;
67
+ "{name}: \uC5F4\uB9B0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778\uD558\uC138\uC694. \uC778\uC99D\uC815\uBCF4\uB294 \uC790\uB3D9 \uC800\uC7A5\uB429\uB2C8\uB2E4.": string;
68
+ "\uC778\uC99D\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4. \uC6D0\uB798 \uD0ED\uC774 \uB2EB\uD600 \uC0C8 \uB300\uD654\uC5D0\uC11C \uACC4\uC815\uC744 \uC120\uD0DD\uD574\uC57C \uD569\uB2C8\uB2E4.": string;
69
+ "\uACC4\uC815 \uC804\uD658\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC120\uD0DD\uD558\uC138\uC694.": string;
70
+ "\uC0C8 \uACC4\uC815 \uD0ED\uC744 \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.": string;
71
+ "\uC138\uC158 {id}": string;
72
+ "\uC774\uBBF8 \uC5F4\uB824 \uC788\uB2E4 \u2014 \uB204\uB974\uBA74 \uADF8 \uD0ED\uC73C\uB85C \uC774\uB3D9": string;
73
+ "\uB204\uB974\uBA74 \uC0C8 \uD0ED\uC5D0\uC11C \uC774\uC5B4\uBC1B\uB294\uB2E4 ({id})": string;
74
+ "\uC791\uC5C5 \uD3F4\uB354: {cwd}": string;
75
+ "\u203B \uB300\uD654\uB9CC \uB3CC\uC544\uC628\uB2E4 \u2014 \uADF8\uB54C \uB744\uC6CC \uB454 \uC11C\uBC84\u00B7\uBC31\uADF8\uB77C\uC6B4\uB4DC \uD504\uB85C\uC138\uC2A4\uB294 \uB418\uC0B4\uC544\uB098\uC9C0 \uC54A\uB294\uB2E4": string;
76
+ "{filter}\uC5D0 \uAC78\uB9AC\uB294 \uC138\uC158\uC774 \uC5C6\uB2E4 (\uC804\uCCB4 {total}\uAC1C)": string;
77
+ " \u00B7 \uAC80\uC0C9\uC5D0 \uAC78\uB9B0 \uC138\uC158\uC774 \uC788\uC5B4 \uC784\uC2DC\uB85C \uD3B4 \uB460 (\uAC80\uC0C9\uC744 \uC9C0\uC6B0\uBA74 \uB2E4\uC2DC \uC811\uD78C\uB2E4)": string;
78
+ "{folder} (\uD0ED {count}\uAC1C) \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
79
+ "\uC791\uC5C5 \uD3F4\uB354\uB97C \uC544\uC9C1 \uBAA8\uB974\uB294 \uD0ED {count}\uAC1C \u2014 \uD074\uB9AD\uD558\uBA74 \uC811\uAE30/\uD3B4\uAE30": string;
80
+ "\uD0ED {count}\uAC1C": string;
81
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uD544\uD130 \uD574\uC81C": string;
82
+ "{status} {count} \u2014 \uD074\uB9AD\uD558\uBA74 \uC774 \uC0C1\uD0DC\uB9CC": string;
83
+ "{n}\uCD08": string;
84
+ "{n}\uBD84": string;
85
+ "{h}\uC2DC\uAC04 {m}\uBD84": string;
86
+ "\uACC4\uC815: {value}": string;
87
+ "\uBC84\uC804: {value}": string;
88
+ "\uD3F4\uB354: {value}": string;
89
+ "{tool} \uAD8C\uD55C": string;
90
+ "\uC785\uB825 \uB300\uAE30": string;
91
+ "\uD50C\uB79C \uC2B9\uC778": string;
92
+ "\uC9C8\uBB38 \uC751\uB2F5": string;
93
+ "{time} \uB9AC\uC14B": string;
94
+ };
95
+ export default _default;