clauderipple 0.9.5 → 0.11.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.
Files changed (163) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.es.md +45 -0
  3. package/README.ja.md +17 -0
  4. package/README.ko.md +31 -0
  5. package/README.md +70 -0
  6. package/README.pt-BR.md +45 -0
  7. package/README.zh-CN.md +17 -0
  8. package/dist/app/assets/icon.icns +0 -0
  9. package/dist/app/assets/icon.ico +0 -0
  10. package/dist/app/assets/icon.png +0 -0
  11. package/dist/app/assets/trayDirectTemplate.png +0 -0
  12. package/dist/app/assets/trayDirectTemplate@2x.png +0 -0
  13. package/dist/app/assets/trayDownTemplate.png +0 -0
  14. package/dist/app/assets/trayDownTemplate@2x.png +0 -0
  15. package/dist/app/assets/trayTemplate.png +0 -0
  16. package/dist/app/assets/trayTemplate@2x.png +0 -0
  17. package/dist/app/assets/trayWarnTemplate.png +0 -0
  18. package/dist/app/assets/trayWarnTemplate@2x.png +0 -0
  19. package/dist/app/assets/trayWin.png +0 -0
  20. package/dist/app/assets/trayWin@2x.png +0 -0
  21. package/dist/app/assets/trayWinDirect.png +0 -0
  22. package/dist/app/assets/trayWinDirect@2x.png +0 -0
  23. package/dist/app/assets/trayWinDown.png +0 -0
  24. package/dist/app/assets/trayWinDown@2x.png +0 -0
  25. package/dist/app/assets/trayWinWarn.png +0 -0
  26. package/dist/app/assets/trayWinWarn@2x.png +0 -0
  27. package/dist/app/dist/claude-desktop.js +67 -0
  28. package/dist/app/dist/main.js +423 -110
  29. package/dist/app/dist/preload.js +21 -0
  30. package/dist/app/dist/protocol.js +121 -0
  31. package/dist/app/dist/status-model.js +87 -0
  32. package/dist/app/dist/window.js +133 -0
  33. package/dist/app/package.json +1 -1
  34. package/dist/cli/src/awake-setup.js +314 -0
  35. package/dist/cli/src/bundle.js +9 -5
  36. package/dist/cli/src/direct.js +159 -0
  37. package/dist/cli/src/doctor.js +205 -0
  38. package/dist/cli/src/hooks/agent-title.js +7 -4
  39. package/dist/cli/src/index.js +227 -31
  40. package/dist/cli/src/launchd.js +29 -20
  41. package/dist/cli/src/launcher.js +215 -0
  42. package/dist/cli/src/power.js +182 -0
  43. package/dist/cli/src/registration.js +157 -0
  44. package/dist/cli/src/remote.js +263 -0
  45. package/dist/cli/src/schtasks.js +50 -40
  46. package/dist/cli/src/settings.js +26 -1
  47. package/dist/cli/src/tray.js +5 -2
  48. package/dist/mod/hooks/i18n.ts +473 -227
  49. package/dist/mod/hooks/judge.ts +35 -17
  50. package/dist/mod/hooks/modes.ts +56 -1
  51. package/dist/mod/hooks/register.tsx +237 -32
  52. package/dist/mod/hooks/session.ts +102 -1
  53. package/dist/mod/hooks/settings.js +7 -3
  54. package/dist/mod/hooks/settings.ts +9 -4
  55. package/dist/mod/hooks/stats.ts +25 -1
  56. package/dist/mod/hooks/ui/agents.tsx +903 -79
  57. package/dist/mod/hooks/ui/alerts.tsx +20 -17
  58. package/dist/mod/hooks/ui/art.ts +33 -7
  59. package/dist/mod/hooks/ui/band.tsx +262 -81
  60. package/dist/mod/hooks/ui/flat.ts +265 -0
  61. package/dist/mod/hooks/ui/kit.tsx +70 -55
  62. package/dist/mod/hooks/ui/look.ts +129 -0
  63. package/dist/mod/hooks/ui/settings.tsx +71 -46
  64. package/dist/mod/hooks/ui/setup.tsx +15 -13
  65. package/dist/mod/hooks/ui/theme.ts +3 -0
  66. package/dist/mod/hooks/ui/tools.ts +124 -0
  67. package/dist/mod/hooks/ui/view.ts +120 -4
  68. package/dist/mod/hooks/workers.ts +33 -6
  69. package/dist/mod/tests/register.test.tsx +155 -11
  70. package/dist/mod/tests/ui.test.tsx +408 -27
  71. package/dist/mod/types/index.d.ts +66 -2
  72. package/dist/remote/package.json +28 -0
  73. package/dist/remote/src/away.js +85 -0
  74. package/dist/remote/src/bridge-client.js +336 -0
  75. package/dist/remote/src/composer-menu.js +11 -0
  76. package/dist/remote/src/config.js +102 -0
  77. package/dist/remote/src/desktop.js +1018 -0
  78. package/dist/remote/src/e2ee.js +126 -0
  79. package/dist/remote/src/e2ee.ts +126 -0
  80. package/dist/remote/src/eventlog.js +298 -0
  81. package/dist/remote/src/expo-push.js +127 -0
  82. package/dist/remote/src/folders.js +79 -0
  83. package/dist/remote/src/fsutil.js +39 -0
  84. package/dist/remote/src/handoff.js +38 -0
  85. package/dist/remote/src/host-service.js +168 -0
  86. package/dist/remote/src/images.js +215 -0
  87. package/dist/remote/src/local-control.js +138 -0
  88. package/dist/remote/src/main.js +264 -0
  89. package/dist/remote/src/permissions.js +124 -0
  90. package/dist/remote/src/power.js +76 -0
  91. package/dist/remote/src/processes.js +24 -0
  92. package/dist/remote/src/protocol.js +32 -0
  93. package/dist/remote/src/protocol.ts +284 -0
  94. package/dist/remote/src/push-content.js +32 -0
  95. package/dist/remote/src/push.js +134 -0
  96. package/dist/remote/src/receipts.js +111 -0
  97. package/dist/remote/src/relay.js +438 -0
  98. package/dist/remote/src/router.js +208 -0
  99. package/dist/remote/src/sdk-launcher.js +18 -0
  100. package/dist/remote/src/server.js +706 -0
  101. package/dist/remote/src/service.js +157 -0
  102. package/dist/remote/src/sessions.js +1800 -0
  103. package/dist/remote/src/sidebar-storage.js +211 -0
  104. package/dist/remote/src/sidebar.js +173 -0
  105. package/dist/remote/src/tool-details.js +205 -0
  106. package/dist/remote/src/tool-details.ts +153 -0
  107. package/dist/remote/src/worktree.js +99 -0
  108. package/dist/remote/web/app.ts +746 -0
  109. package/dist/remote/web/conn.ts +193 -0
  110. package/dist/remote/web/demo.ts +134 -0
  111. package/dist/remote/web/dom.ts +124 -0
  112. package/dist/remote/web/esc.ts +4 -0
  113. package/dist/remote/web/i18n.ts +374 -0
  114. package/dist/remote/web/icon.svg +1 -0
  115. package/dist/remote/web/index.html +24 -0
  116. package/dist/remote/web/manifest.webmanifest +10 -0
  117. package/dist/remote/web/mascot.ts +60 -0
  118. package/dist/remote/web/md.ts +78 -0
  119. package/dist/remote/web/notify.ts +55 -0
  120. package/dist/remote/web/pushstate.ts +27 -0
  121. package/dist/remote/web/secure.ts +109 -0
  122. package/dist/remote/web/sidebar.ts +106 -0
  123. package/dist/remote/web/style.css +311 -0
  124. package/dist/remote/web/sw.ts +48 -0
  125. package/dist/remote/web/timeline.ts +224 -0
  126. package/dist/remote/web/views.ts +323 -0
  127. package/dist/router/src/admin.js +331 -5
  128. package/dist/router/src/awake-win.js +590 -0
  129. package/dist/router/src/awake.js +432 -0
  130. package/dist/router/src/config.js +94 -0
  131. package/dist/router/src/health.js +86 -3
  132. package/dist/router/src/hold.js +107 -0
  133. package/dist/router/src/index.js +108 -6
  134. package/dist/router/src/ingress/server.js +26 -4
  135. package/dist/router/src/ingress/translate.js +6 -2
  136. package/dist/router/src/phone.js +82 -0
  137. package/dist/router/src/power.js +107 -0
  138. package/dist/router/src/providers/anthropic-usage.js +33 -1
  139. package/dist/router/src/providers/google/antigravity.js +73 -10
  140. package/dist/router/src/providers/google/index.js +191 -14
  141. package/dist/router/src/providers/google/prompt-refusal.js +29 -0
  142. package/dist/router/src/providers/google/thoughtSignatures.js +13 -0
  143. package/dist/router/src/providers/google/transport.js +1 -1
  144. package/dist/router/src/providers/google/usage.js +302 -0
  145. package/dist/router/src/providers/grok/index.js +18 -0
  146. package/dist/router/src/providers/grok/usage.js +77 -0
  147. package/dist/router/src/providers/openai/translate.js +13 -2
  148. package/dist/router/src/providers/opencode-usage.js +116 -0
  149. package/dist/router/src/providers/retry.js +4 -1
  150. package/dist/router/src/proxy.js +371 -261
  151. package/dist/router/src/remote-host.js +320 -0
  152. package/dist/router/src/remote-tunnel.js +320 -0
  153. package/dist/router/src/requestlog.js +48 -39
  154. package/dist/router/src/tether-win.js +211 -0
  155. package/dist/router/src/tether.js +712 -0
  156. package/dist/router/src/usage-history.js +227 -0
  157. package/dist/router/src/version.js +1 -1
  158. package/dist/ui/app.js +1083 -59
  159. package/dist/ui/i18n.js +670 -69
  160. package/dist/ui/index.html +33 -6
  161. package/dist/ui/style.css +177 -0
  162. package/docs/ARCHITECTURE.md +402 -14
  163. package/package.json +8 -2
@@ -45,6 +45,7 @@ const EN = {
45
45
  'band.limitCaption': '{window} limit{save}',
46
46
  'band.saveCaption': ' · SAVE',
47
47
  'band.limitAlt': '{window} limit {value}{reset}',
48
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
48
49
  'band.fiveHour': '5-hour',
49
50
  'band.weekly': 'Weekly',
50
51
  'band.resetting': 'resetting',
@@ -245,6 +246,10 @@ const EN = {
245
246
  'settings.appearance': 'Appearance',
246
247
  'settings.dark': 'Dark',
247
248
  'settings.lightAppearance': 'Light',
249
+ 'settings.skin': 'Skin',
250
+ 'settings.skinLine': 'How the band and the cards are drawn.',
251
+ 'settings.skinDeep': 'Deep',
252
+ 'settings.skinFlat': 'Flat',
248
253
  'settings.show': 'Show',
249
254
  'settings.language': 'Language',
250
255
  'settings.title': 'settings',
@@ -288,6 +293,7 @@ const EN = {
288
293
  'agents.routerModel': 'router model',
289
294
  'agents.marker': 'marker',
290
295
  'agents.default': 'default',
296
+ 'agents.session': 'the session’s model',
291
297
  'agents.by': 'by {name}',
292
298
  'agents.thinking': 'thinking',
293
299
  'agents.fallback': '▲ ran the fallback: {reason}',
@@ -323,6 +329,7 @@ const EN = {
323
329
  'toasts.noVerdict': 'no verdict',
324
330
  'toasts.judgeUnavailable': 'judge unavailable',
325
331
  'toasts.explicitMarker': 'explicit worker marker',
332
+ 'toasts.sessionTier': 'tier named by the main chat: {tier}',
326
333
  'toasts.workerFallback': 'ClaudeRipple: {reason}; running {name}.',
327
334
  'toasts.modeEnded': 'The {name} mode has ended.',
328
335
  'toasts.yourPick': 'your pick',
@@ -351,6 +358,7 @@ const EN = {
351
358
  'toasts.warmNoReply': 'Keep warm stopped: no fork reply',
352
359
  'toasts.warmNoCache': 'Keep warm stopped: cache was not read',
353
360
  'toasts.providerQuota': 'ChatGPT accounts are unavailable or out of quota',
361
+ 'toasts.logNotPlaced': 'The log could not open here: {reason}',
354
362
  'toasts.saveMode': 'save mode',
355
363
  'toasts.yourSettings': 'your settings',
356
364
  'toasts.jevNetwork': 'Jev network unavailable',
@@ -446,7 +454,40 @@ const EN = {
446
454
  'settings.ladderWaiting': 'Waiting for the router\'s model list.',
447
455
  'jev.zenMissing': 'No OpenCode Zen authorization key in ClaudeRipple config',
448
456
  'agents.domainLevel': '{domain} / {level}',
449
- 'agents.tokens': '≈{tokens} tok',
457
+ 'agents.title': 'Agents',
458
+ 'agents.total': 'All agents',
459
+ 'agents.input': 'in',
460
+ 'agents.cache': 'cache',
461
+ 'agents.output': 'out',
462
+ 'agents.toolsLabel': 'tools',
463
+ 'agents.failed': 'failed',
464
+ 'agents.more': 'Show {count} more',
465
+ 'agents.less': 'Show fewer',
466
+ 'agents.open': 'Open',
467
+ 'agents.back': 'All agents',
468
+ 'agents.task': 'Task',
469
+ 'agents.answer': 'Final answer',
470
+ 'agents.dropped': '{count} earlier entries left out: too long to draw',
471
+ 'agents.act.command': 'Ran {count} commands',
472
+ 'agents.act.commandOne': 'Ran {count} command',
473
+ 'agents.act.read': 'Read {count} files',
474
+ 'agents.act.readOne': 'Read {count} file',
475
+ 'agents.act.edit': 'Edited {count} files',
476
+ 'agents.act.editOne': 'Edited {count} file',
477
+ 'agents.act.search': '{count} searches',
478
+ 'agents.act.searchOne': '{count} search',
479
+ 'agents.act.web': '{count} web requests',
480
+ 'agents.act.webOne': '{count} web request',
481
+ 'agents.act.agent': '{count} agents',
482
+ 'agents.act.agentOne': '{count} agent',
483
+ 'agents.act.other': 'Used {count} tools',
484
+ 'agents.act.otherOne': 'Used {count} tool',
485
+ 'agents.act.more': 'and {count} more actions',
486
+ 'agents.act.moreOne': 'and {count} more action',
487
+ 'agents.act.failed': '{count} failed',
488
+ 'agents.deny': 'This agent’s conversation can’t be read: {reason}',
489
+ 'agents.gone': 'This agent is no longer in the list.',
490
+ 'agents.nothingYet': 'Nothing in its conversation yet.',
450
491
  // Time units: countdowns, reset times, durations.
451
492
  'units.seconds': '{n}s',
452
493
  'units.minutes': '{n}m',
@@ -477,10 +518,10 @@ const KO: Record<Key, string> = {
477
518
  'band.high': '높음',
478
519
  'band.xhigh': '매우 높음',
479
520
  'band.max': '최대',
480
- 'band.pausedHint': '이 모델에서는 자동 선택이 일시 중지됩니다. 해당 모델에서 추론 강도를 변경할 때 캐시가 유지되는지 확인되지 않았습니다.',
481
- 'band.offHint': '자동 선택이 꺼져 있습니다. 추론 강도를 직접 설정하세요.',
482
- 'band.decidingHint': '판정 모델이 프롬프트의 추론 강도를 결정하는 중입니다.',
483
- 'band.effortTitle': '추론 강도 {value}{hint} · 클릭하여 강도 선택',
521
+ 'band.pausedHint': '이 모델은 추론 강도를 바꿔도 캐시가 유지되는지 확인하지 못했습니다. 자동 선택을 잠시 멈춥니다.',
522
+ 'band.offHint': '자동 선택이 꺼져 있습니다. 추론 강도를 직접 정합니다.',
523
+ 'band.decidingHint': '판정 모델이 이번 프롬프트에 맞는 추론 강도를 고르고 있습니다.',
524
+ 'band.effortTitle': '추론 강도 {value}{hint} · 눌러서 강도 선택',
484
525
  'band.effortAlt': '추론 강도 {value} ({mode}){why}',
485
526
  'band.context': '컨텍스트',
486
527
  'band.contextAlt': '컨텍스트 {value} / {window} ({tokens} 토큰)',
@@ -492,7 +533,7 @@ const KO: Record<Key, string> = {
492
533
  'band.warmFor': '{time} 후 만료',
493
534
  'band.expired': '만료됨',
494
535
  'band.warmStoppedTip': ' · 캐시 유지 중단: {reason}',
495
- 'band.warmOnTip': ' · 캐시 유지 켜짐, 핑 {count}회',
536
+ 'band.warmOnTip': ' · 캐시 유지 켜짐, 유지 요청 {count}회',
496
537
  'band.noReply': '아직 응답 없음',
497
538
  'band.cacheAlt': '캐시 {state}{warm}',
498
539
  'band.timeLeft': '{time} 남음',
@@ -501,18 +542,19 @@ const KO: Record<Key, string> = {
501
542
  'band.limitCaption': '{window} 한도{save}',
502
543
  'band.saveCaption': ' · 절약',
503
544
  'band.limitAlt': '{window} 한도 {value}{reset}',
545
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
504
546
  'band.fiveHour': '5시간',
505
547
  'band.weekly': '주간',
506
548
  'band.resetting': '초기화 중',
507
549
  'band.resetsIn': '{time} 뒤 초기화',
508
550
  'band.resetsAt': '{time} 초기화',
509
- 'band.router': '라우터',
510
- 'band.routerAlt': '라우터: {value}',
551
+ 'band.router': '리플',
552
+ 'band.routerAlt': '리플: {value}',
511
553
  'band.resentCaption': '재전송 · {status}',
512
554
  'band.failedCaption': '실패 · {status}',
513
- 'band.lastRoute': '최근 라우팅',
514
- 'band.logHint': '클릭하여 요청 로그 조회',
515
- 'band.routeAlt': '최근 라우팅: {model}({provider} 경유){effort}{cache}, {time}{status}',
555
+ 'band.lastRoute': '최근 경로',
556
+ 'band.logHint': '눌러서 요청 로그 보기',
557
+ 'band.routeAlt': '최근 경로: {provider}의 {model}{effort}{cache}, {time}{status}',
516
558
  'band.routeCache': ', 캐시 {percent}%',
517
559
  'band.routeResent': ', {status} 재전송',
518
560
  'band.routeFailed': ', {status} 실패',
@@ -520,8 +562,8 @@ const KO: Record<Key, string> = {
520
562
  'band.handoff': '인수인계',
521
563
  'band.compact': '압축',
522
564
  'band.clear': '새로 시작',
523
- 'band.compactAlt': '대화 압축 — 지금까지 대화를 요약해 컨텍스트를 줄입니다',
524
- 'band.clearAlt': '새로 시작 (/clear) — 대화 맥락을 비우고 새로 시작합니다',
565
+ 'band.compactAlt': '대화 압축 — 대화를 요약해 컨텍스트를 줄입니다',
566
+ 'band.clearAlt': '새로 시작 (/clear) — 대화 내용을 비우고 새로 시작합니다',
525
567
  'band.log': '로그',
526
568
  'band.agents': '에이전트',
527
569
  'band.settings': '설정',
@@ -529,12 +571,12 @@ const KO: Record<Key, string> = {
529
571
  'band.hit': '적중 {percent}%',
530
572
  'band.effortAutoAlt': '추론 강도 자동 {state}',
531
573
  'band.warmAlt': '캐시 유지 {state}',
532
- 'band.warmHere': '이 세션만 적용, 새 세션은 설정을 따릅니다',
533
- 'band.handoffAdvised': '인수인계 (권장: 지금은 새 대화가 더 효율적입니다)',
574
+ 'band.warmHere': '이 대화에만 적용합니다. 새 대화는 설정을 따릅니다',
575
+ 'band.handoffAdvised': '인수인계 (권장: 새 대화로 옮기는 편이 효율적입니다)',
534
576
  'band.closeLog': '요청 로그 닫기',
535
577
  'band.openLog': '요청 로그 열기',
536
578
  'band.agentsAlt': '에이전트: {count}개 실행 중',
537
- 'band.settingsAlt': 'Ripple 설정',
579
+ 'band.settingsAlt': '리플 설정',
538
580
  'band.warmStopped': '유지 중단',
539
581
  'band.warmText': '≈유지',
540
582
  'band.save': '절약',
@@ -544,196 +586,200 @@ const KO: Record<Key, string> = {
544
586
  'band.footerPaused': ' (일시 중지)',
545
587
  'band.footerOff': ' (자동 꺼짐)',
546
588
  'band.footerManual': ' (수동)',
547
- 'band.footerContext': 'ctx {percent}%',
548
- 'band.routerRestart': 'ClaudeRipple: 라우팅 경로를 표시하려면 라우터를 재시작하세요',
549
- 'band.routerDown': 'ClaudeRipple: 라우터가 응답하지 않습니다',
589
+ 'band.footerContext': '컨텍스트 {percent}%',
590
+ 'band.routerRestart': '리플: 다시 시작하면 최근 경로를 표시합니다',
591
+ 'band.routerDown': '리플: 응답이 없습니다',
550
592
  // Alerts.
551
593
  'alerts.coldTitle': '캐시가 만료되었습니다',
552
- 'alerts.coldBody': '{minutes}분 동안 대기하여 캐시가 만료되었습니다. 다음 프롬프트는 {tokens} 토큰 전체를 새로 읽어 비용이 발생합니다.',
594
+ 'alerts.coldBody': '{minutes}분 동안 대화가 없어 캐시가 만료되었습니다. 다음 프롬프트는 {tokens} 토큰 전체를 다시 읽고, 캐시 할인 없이 비용을 계산합니다.',
553
595
  'alerts.keptTitle': '자리를 비운 동안 캐시를 유지했습니다',
554
- 'alerts.keptBody': '핑 {pings}회로 {tokens} 토큰을 캐시에 붙잡아 두었습니다. 다음 프롬프트도 캐시로 읽습니다. 만료까지 {minutes}분 남았습니다.',
596
+ 'alerts.keptBody': '유지 요청 {pings}회로 {tokens} 토큰을 캐시에 남겨 두었습니다. 다음 프롬프트도 캐시 할인 요금으로 읽습니다. 만료까지 {minutes}분 남았습니다.',
555
597
  'alerts.gotIt': '확인',
556
598
  'alerts.swampTitle': '컨텍스트 {percent}% 사용',
557
- 'alerts.swampBody': '프롬프트마다 {tokens} 토큰이 함께 전송되어 응답 속도와 정확도, 비용에 영향을 줍니다.',
599
+ 'alerts.swampBody': '프롬프트마다 {tokens} 토큰을 함께 보냅니다. 응답이 느려지고 비용이 늘며, 답변도 덜 정확해집니다.',
558
600
  'alerts.hotTitle': '{window} 한도 {percent}% 도달',
559
- 'alerts.saveOnBody': '절약 모드 켜짐: 초기화까지 자동 강도는 중간 이하입니다.',
560
- 'alerts.saveBody': '절약 모드는 초기화까지 자동 강도를 중간 이하로 유지합니다.',
601
+ 'alerts.saveOnBody': '절약 모드가 켜져 있습니다. 한도가 초기화될 때까지 자동 추론 강도를 중간 이하로 유지합니다.',
602
+ 'alerts.saveBody': '절약 모드를 켜면 한도가 초기화될 때까지 자동 추론 강도를 중간 이하로 유지합니다.',
561
603
  'alerts.saveOff': '절약 모드 끄기',
562
604
  'alerts.save': '절약 모드',
563
605
  'alerts.notNow': '나중에',
564
606
  'alerts.judgeTitle': '추론 강도 판정 모델이 응답하지 않습니다',
565
- 'alerts.judgeNetworkTitle': '네트워크 연결이 불안정하여 임시로 Haiku가 판정합니다',
566
- 'alerts.routerModel': '라우터 모델',
607
+ 'alerts.judgeNetworkTitle': '연결이 불안정해 당분간 Haiku가 판정합니다',
608
+ 'alerts.routerModel': '리플 모델',
567
609
  'alerts.judgeBody': '{judge}: {reason}. {fallback}',
568
- 'alerts.keepEffort': '복구 전까지는 현재 강도를 유지합니다.',
569
- 'alerts.askHaiku': '복구 전까지는 Haiku가 판정합니다.',
610
+ 'alerts.keepEffort': '당분간 현재 추론 강도를 유지합니다.',
611
+ 'alerts.askHaiku': '당분간 Haiku가 판정합니다.',
570
612
  'alerts.openSettings': '설정 열기',
571
613
  'alerts.compactTitle': '대화 압축',
572
- 'alerts.compactBody': '요약에 꼭 남길 내용을 입력하세요. 비워 두면 자동으로 요약합니다.',
614
+ 'alerts.compactBody': '꼭 남길 내용을 적으면 요약에 반영합니다. 비워 두면 알아서 요약합니다.',
573
615
  'alerts.cancel': '취소',
574
616
  'alerts.handoffTitle': '새 대화로 인수인계',
575
- 'alerts.quickBody': '간단: 캐시로 요약을 생성해 새 대화에서 이어받습니다.',
576
- 'alerts.fullBody': '전체: 인수인계 스킬이 git을 확인하고 HANDOFF.md를 먼저 작성합니다.',
617
+ 'alerts.quickBody': '간단: 캐시에서 읽은 내용으로 요약을 만들어 새 대화에 넘깁니다.',
618
+ 'alerts.fullBody': '전체: 인수인계 스킬이 git을 확인하고 HANDOFF.md부터 작성합니다.',
577
619
  'alerts.go': '실행',
578
620
  'alerts.dismiss': '닫기',
579
621
  'alerts.handingOff': '인수인계 중…',
580
- 'alerts.fullProgress': '인수인계 실행 중: git을 확인하고 HANDOFF.md를 작성합니다.',
581
- 'alerts.quickProgress': '새 대화가 이어받을 요약을 작성하는 중입니다.',
622
+ 'alerts.fullProgress': 'git을 확인하고 HANDOFF.md를 작성하고 있습니다.',
623
+ 'alerts.quickProgress': '새 대화에서 이어갈 수 있도록 요약하고 있습니다.',
582
624
  'alerts.handoffDone': '인수인계 완료',
583
- 'alerts.summaryReady': '요약이 준비되었습니다.',
625
+ 'alerts.summaryReady': '요약을 준비했습니다.',
584
626
  'alerts.copyAgain': '다시 복사',
585
627
  'alerts.compacting': '압축 중…',
586
- 'alerts.compactingBody': '대화를 요약하는 중입니다. 이후에는 요약을 바탕으로 대화를 이어갑니다.',
628
+ 'alerts.compactingBody': '대화를 요약하고 있습니다. 요약이 끝나면 그 내용으로 대화를 이어갑니다.',
587
629
  'alerts.compacted': '압축 완료',
588
- 'alerts.compactedBody': '요약을 바탕으로 대화를 이어갑니다.',
589
- 'alerts.failed': '완료되지 않았습니다',
590
- 'alerts.unchanged': '아무것도 변경되지 않았습니다.',
630
+ 'alerts.compactedBody': '요약한 내용으로 대화를 이어갑니다.',
631
+ 'alerts.failed': '작업을 마치지 못했습니다',
632
+ 'alerts.unchanged': '아무것도 바꾸지 않았습니다.',
591
633
  'alerts.keep': '남길 내용',
592
- 'alerts.keepPlaceholder': '결정 사항, 남은 질문, 파일 이름… (선택)',
634
+ 'alerts.keepPlaceholder': '결정한 내용, 남은 질문, 파일 이름… (선택)',
593
635
  'alerts.compactSubmit': '압축',
594
636
  'alerts.quick': '간단',
595
637
  'alerts.full': '전체',
596
- 'alerts.continue': '새 세션에서 바로',
638
+ 'alerts.continue': '바로 새 대화 열기',
597
639
  'alerts.confirm': '확인 후 이동',
598
640
  'alerts.copy': '복사만',
599
- 'alerts.continueHint': '같은 폴더에 새 세션을 열고 인수인계를 입력창에 채워 둡니다. 거기서 Enter를 누르면 이어집니다. 지금 대화는 그대로 둡니다.',
600
- 'alerts.confirmHint': '요약까지만 만들고 멈춥니다. 새 세션으로 넘어갈지 직접 고릅니다. 지금 대화는 그대로 둡니다.',
601
- 'alerts.copyHint': '요약을 클립보드에 복사만 하고 다른 것은 바꾸지 않습니다.',
641
+ 'alerts.continueHint': '같은 폴더에서 새 대화를 열고 입력창에 인수인계 내용을 넣습니다. 새 대화에서 Enter를 누르면 이어갑니다. 현재 대화는 그대로 둡니다.',
642
+ 'alerts.confirmHint': '요약만 만든 뒤 새 대화로 옮길지 묻습니다. 현재 대화는 그대로 둡니다.',
643
+ 'alerts.copyHint': '요약만 클립보드에 복사합니다. 나머지는 그대로 둡니다.',
602
644
  'alerts.handoffReady': '인수인계 준비 완료',
603
- 'alerts.handoffReadyBody': '같은 폴더의 새 세션으로 넘어갈까요? 지금 대화는 그대로 둡니다.',
604
- 'alerts.openNew': '새 세션으로 넘어가기',
605
- 'alerts.openedBody': '새 세션을 열고 인수인계를 채워 두었습니다. 거기서 Enter를 누르면 이어집니다.',
606
- 'alerts.readHandoffFile': '{path}의 인수인계를 읽고 이어서 진행해 주세요.',
645
+ 'alerts.handoffReadyBody': '같은 폴더에서 새 대화를 열어 이어갈 수 있습니다. 현재 대화는 그대로 둡니다.',
646
+ 'alerts.openNew': '새 대화로 이동',
647
+ 'alerts.openedBody': '새 대화를 열고 입력창에 인수인계 내용을 넣었습니다. 새 대화에서 Enter를 누르면 이어갑니다.',
648
+ 'alerts.readHandoffFile': '{path}의 인수인계 내용을 읽고 이어서 진행해 주십시오.',
607
649
  'alerts.copyText': '복사',
608
- 'toasts.newSessionFallback': '새 세션을 열지 못해 인수인계를 대신 복사했습니다.',
609
- 'alerts.kind': '유형 ',
610
- 'alerts.then': '이후 동작 ',
650
+ 'toasts.newSessionFallback': '새 대화를 열지 못해 인수인계 내용을 대신 복사했습니다.',
651
+ 'alerts.kind': '방식 ',
652
+ 'alerts.then': '완료 후 ',
611
653
  'alerts.demoDown': 'Jev 크레딧 소진 (데모)',
612
- 'alerts.copied': '재개용 요약 메모를 복사했습니다. 현재 대화는 보존됩니다.',
654
+ 'alerts.copied': '이어서 대화할 요약을 복사했습니다. 현재 대화는 그대로 둡니다.',
613
655
  'alerts.compactFailed': '대화 압축을 마치지 못했습니다.',
614
- 'alerts.clearTitle': '대화를 새로 시작할까요?',
615
- 'alerts.clearBody': '지금 대화 맥락이 비워집니다. 새 대화가 아무것도 없는 상태에서 시작됩니다.',
656
+ 'alerts.clearTitle': '대화 새로 시작',
657
+ 'alerts.clearBody': '현재 대화의 컨텍스트를 모두 비웁니다. 이전 내용 없이 새로 시작합니다.',
616
658
  'alerts.clearGo': '새로 시작',
617
659
  // Settings.
618
- 'settings.effortBlurb': '전송하는 프롬프트마다 추론 강도를 자동으로 선택합니다.',
660
+ 'settings.effortBlurb': '프롬프트마다 추론 강도를 자동으로 고르는 방식을 정합니다.',
619
661
  'settings.workers': '워커',
620
662
  'settings.mode': '모드',
621
663
  'settings.modeNone': '기본',
622
664
  'band.mode': '모드',
623
- 'band.modeTip': '“{name}” 모드가 켜져 있습니다. 워커가 이 모드를 따릅니다. 빠른 설정에서 바꿀 수 있습니다.',
624
- 'settings.workersBlurb': '위임 작업 유형별로 실행할 워커를 설정합니다.',
665
+ 'band.modeTip': '“{name}” 모드에 따라 워커를 고릅니다. 빠른 설정에서 모드를 바꿀 수 있습니다.',
666
+ 'settings.workersBlurb': '맡기는 작업의 종류에 따라 워커를 정합니다.',
625
667
  'settings.judge': '판정 모델',
626
- 'settings.judgeBlurb': '프롬프트의 추론 강도와 위임 작업의 등급을 결정하는 모델입니다.',
668
+ 'settings.judgeBlurb': '프롬프트의 추론 강도와 맡긴 작업의 등급을 고르는 모델입니다.',
627
669
  'settings.cacheBlurb': '자리를 비운 동안에도 프롬프트 캐시를 유지합니다.',
628
670
  'settings.handoff': '압축·인수인계',
629
- 'settings.handoffBlurb': '컨텍스트가 큰 대화를 압축하거나 새 대화로 인수인계합니다.',
671
+ 'settings.handoffBlurb': '길어진 대화를 요약하거나 새 대화로 넘기는 방식을 정합니다.',
630
672
  'settings.look': '화면 표시',
631
- 'settings.lookBlurb': '상태 바에 표시할 항목과 형태를 설정합니다.',
632
- 'settings.light': '경량',
633
- 'settings.lightBlurb': '단순 반복 작업, 파일 조회',
673
+ 'settings.lookBlurb': '상태 바에 무엇을 어떻게 보여 줄지 정합니다.',
674
+ 'settings.light': '간단',
675
+ 'settings.lightBlurb': '단순 작업, 반복 작업, 자료 찾기',
634
676
  'settings.standard': '표준',
635
- 'settings.standardBlurb': '명세 기반 구현, 조사, 코드 리뷰',
636
- 'settings.deep': '심층',
637
- 'settings.deepBlurb': '신중한 판단, 고위험 작업, 복잡한 추론',
677
+ 'settings.standardBlurb': '설계에 따른 구현, 조사, 코드 검토',
678
+ 'settings.deep': '고난도',
679
+ 'settings.deepBlurb': '신중한 판단, 실수하면 위험한 작업, 어려운 추론',
638
680
  'settings.design': '디자인',
639
- 'settings.designBlurb': 'UI, 시각 디자인, 브랜드',
681
+ 'settings.designBlurb': '화면, 시각 디자인, 브랜드',
640
682
  'settings.tierAlt': '{name} 등급',
641
- 'settings.biasAlt': '성향 {value}{selected}',
683
+ 'settings.biasAlt': '선택 성향 {value}{selected}',
642
684
  'settings.selected': ' (선택됨)',
643
685
  'settings.onSuffix': ' (켜짐)',
644
686
  'settings.offSuffix': ' (꺼짐)',
645
687
  'settings.mixedSuffix': ' (일부 켜짐)',
646
- 'settings.cheaper': '저렴하게',
647
- 'settings.smarter': '똑똑하게',
648
- 'settings.autoHint': '프롬프트마다 자동 선택하며, 직접 변경 시 비활성화됩니다.',
649
- 'settings.lean': '성향',
650
- 'settings.leanHint': '판단이 모호할 때만 적용',
688
+ 'settings.cheaper': '비용 우선',
689
+ 'settings.smarter': '성능 우선',
690
+ 'settings.autoHint': '프롬프트마다 자동으로 고릅니다. 직접 바꾸면 자동 선택이 꺼집니다.',
691
+ 'settings.lean': '선택 성향',
692
+ 'settings.leanHint': '어느 쪽을 고를지 애매할 때만 적용',
651
693
  'settings.floor': '최저 강도',
652
694
  'settings.ceiling': '최고 강도',
653
- 'settings.floorWins': '최저 강도 미만이므로 최저 강도를 적용합니다.',
695
+ 'settings.floorWins': '최저 강도보다 낮아 최저 강도로 맞춥니다.',
654
696
  'settings.unavailable': ' (사용 불가)',
655
697
  'settings.takesOver': '적용 대상',
656
698
  'settings.autoAgent': 'ripple:auto',
657
699
  'settings.allSpawns': '모든 서브에이전트',
658
700
  'settings.fallback': '대체 워커',
659
- 'settings.fallbackHint': '해당 등급의 프로바이더 한도가 소진되었을 때',
701
+ 'settings.fallbackHint': '이 등급의 프로바이더 한도를 모두 썼을 때',
660
702
  'settings.haiku': 'Haiku',
661
703
  'settings.jev': 'Jev',
662
- 'settings.routerModel': '라우터 모델',
663
- 'settings.haikuHint': 'Claude 로그인으로 Haiku 5.5 사용 · 프롬프트당 약 1초',
664
- 'settings.keyEnv': 'TYPESAFE_API_KEY에서 읽음',
665
- 'settings.keyFile': '~/.config/jev/.env에 저장됨',
666
- 'settings.keySaved': '저장됨',
704
+ 'settings.routerModel': '리플 모델',
705
+ 'settings.haikuHint': 'Claude 계정으로 Haiku 5.5 사용 · 프롬프트당 약 1초',
706
+ 'settings.keyEnv': 'TYPESAFE_API_KEY의 키 사용',
707
+ 'settings.keyFile': '~/.config/jev/.env에 저장',
708
+ 'settings.keySaved': '저장 완료',
667
709
  'settings.keyPaste': 'TypeSafe API 키 붙여넣기',
668
710
  'settings.saveKey': '저장',
669
711
  'settings.testing': '확인 중…',
670
- 'settings.keyWorks': 'API 키 인증 성공',
712
+ 'settings.keyWorks': 'API 키 확인 완료',
671
713
  'settings.keyRejected': 'API 키 인증 실패',
672
714
  'settings.key': 'API 키',
673
- 'settings.test': '테스트',
674
- 'settings.noModels': '표시할 라우터 모델이 없습니다.',
675
- 'settings.haikuFallback': '실패 시 Haiku로 대체',
715
+ 'settings.test': '확인',
716
+ 'settings.noModels': '리플 모델 목록이 비어 있습니다.',
717
+ 'settings.haikuFallback': '실패하면 Haiku로 대체',
676
718
  'settings.keepWarm': '캐시 유지',
677
- 'settings.keepWarmHint': '만료 직전에 캐시 핑 전송',
719
+ 'settings.keepWarmHint': '캐시 만료 직전에 유지 요청 전송',
678
720
  'settings.for': '유지 시간',
679
- 'settings.afterReply': '마지막 응답 기준',
721
+ 'settings.afterReply': '마지막 응답부터',
680
722
  'settings.chatsFrom': '대상 대화',
681
723
  'settings.tokens': '토큰 이상',
682
- 'settings.warmCost': '핑을 보낼 때마다 캐시에서 대화 전체를 다시 읽습니다. 입력 비용의 약 1/10이며, 요금제 한도도 동일 비율로 소진합니다.',
683
- 'settings.noSkill': '스킬 없음: 1턴의 대화로 HANDOFF.md 작성',
724
+ 'settings.warmCost': '유지 요청마다 캐시에서 대화 전체를 다시 읽습니다. 비용은 일반 입력 비용의 약 1/10이며, 요금제 한도도 같은 비율로 사용합니다.',
725
+ 'settings.noSkill': '스킬 없음: 응답 1회로 HANDOFF.md 작성',
684
726
  'settings.compactWith': '압축 담당 모델',
685
- 'settings.sessionCompactor': '세션 기본',
727
+ 'settings.sessionCompactor': '현재 대화 기본',
686
728
  'settings.afterHandoff': '인수인계 후 동작',
687
729
  'settings.handoffButton': '인수인계 버튼 표시',
688
- 'settings.whenAdvised': '권장 시',
730
+ 'settings.whenAdvised': '권장할 때만',
689
731
  'settings.always': '항상',
690
732
  'settings.fullHandoff': '전체 인수인계',
691
733
  'settings.heavyAt': '대화 압축 기준',
692
734
  'settings.context': '컨텍스트',
693
- 'settings.cacheTimer': '캐시 타이머',
694
- 'settings.reason': '판정 사유',
695
- 'settings.route': '라우팅 경로',
735
+ 'settings.cacheTimer': '캐시 남은 시간',
736
+ 'settings.reason': '판정 이유',
737
+ 'settings.route': '요청 경로',
696
738
  'settings.limits': '한도',
697
- 'settings.layout': '레이아웃',
739
+ 'settings.layout': '배치',
698
740
  'settings.dashboard': '대시보드',
699
- 'settings.minimal': '최소화',
700
- 'settings.footerHint': '하단 한 줄 표시',
741
+ 'settings.minimal': '한 줄',
742
+ 'settings.footerHint': '입력창 아래 한 줄로 표시',
701
743
  'settings.appearance': '테마',
702
- 'settings.dark': '다크',
703
- 'settings.lightAppearance': '라이트',
744
+ 'settings.dark': '어두운 테마',
745
+ 'settings.lightAppearance': '밝은 테마',
746
+ 'settings.skin': '모양',
747
+ 'settings.skinLine': '상태 바와 카드의 모양을 정합니다.',
748
+ 'settings.skinDeep': '입체',
749
+ 'settings.skinFlat': '평면',
704
750
  'settings.show': '표시 항목',
705
751
  'settings.language': '언어',
706
752
  'settings.title': '설정',
707
753
  'settings.quick': '빠른 설정',
708
- 'settings.effortAuto': '자동 추론 강도',
754
+ 'settings.effortAuto': '추론 강도 자동 선택',
709
755
  'settings.openAll': '전체 설정 열기',
710
- 'setup.workersNote': '워커는 기본 사다리 규칙으로 시작하며, 대시보드에서 맞춤 설정할 수 있습니다.',
711
- 'setup.changeDashboard': '상태 바나 /ripple에서 빠르게 변경하고, 전체 설정 열기로 대시보드로 이동할 수 있습니다.',
756
+ 'setup.workersNote': '처음에는 기본 워커 단계에 따라 배정합니다. 대시보드에서 단계별 워커를 바꿀 수 있습니다.',
757
+ 'setup.changeDashboard': '상태 바나 /ripple에서 빠르게 바꿉니다. 세부 설정은 전체 설정을 열어 대시보드에서 바꿉니다.',
712
758
  'settings.save': '저장',
713
759
  'settings.discard': '변경 취소',
714
760
  'settings.close': '닫기',
715
- 'settings.autoLine': '프롬프트마다 알맞은 강도를 자동으로 고릅니다.',
716
- 'settings.autoOffNote': '앱의 강도 메뉴에서 고른 값을 그대로 씁니다.',
717
- 'settings.judgeLine': '추론 강도와 위임 작업 등급을 정합니다.',
718
- 'settings.modeLine': '위임 작업을 맡길 워커 묶음을 고릅니다.',
719
- 'settings.warmLine': '캐시가 식기 직전에 핑을 보내 데워 둡니다.',
720
- 'settings.warmCostShort': '핑마다 입력 비용의 약 1/10이 듭니다.',
721
- 'settings.sayAuto': '{judge} 판정으로 프롬프트마다 추론 강도를 골라요.',
722
- 'settings.sayManual': '추론 강도는 앱에서 고른 대로 둘게요.',
723
- 'settings.sayWarm': '캐시는 식기 전에 데워 둘게요.',
724
- 'band.hideBand': '띠 숨기기',
725
- 'settings.unsaved': '● 저장되지 않음',
761
+ 'settings.autoLine': '프롬프트마다 알맞은 추론 강도를 자동으로 고릅니다.',
762
+ 'settings.autoOffNote': '앱의 추론 강도 메뉴에서 고른 값을 그대로 씁니다.',
763
+ 'settings.judgeLine': '프롬프트의 추론 강도와 맡긴 작업의 등급을 정합니다.',
764
+ 'settings.modeLine': '맡긴 작업을 실행할 워커 묶음입니다.',
765
+ 'settings.warmLine': '캐시 만료 직전에 유지 요청을 보냅니다.',
766
+ 'settings.warmCostShort': '유지 요청마다 일반 입력 비용의 약 1/10이 듭니다.',
767
+ 'settings.sayAuto': '{judge} 모델이 프롬프트마다 추론 강도를 고릅니다.',
768
+ 'settings.sayManual': '추론 강도는 앱에서 고른 대로 유지합니다.',
769
+ 'settings.sayWarm': '캐시도 만료되지 않도록 유지합니다.',
770
+ 'band.hideBand': '상태 바 숨기기',
771
+ 'settings.unsaved': '● 저장 전',
726
772
  // Setup.
727
- 'setup.judgeTitle': '판정 방식 설정',
728
- 'setup.judgeBlurb': '작고 빠른 판정 모델이 프롬프트마다 강도를, 작업마다 워커를 결정합니다.',
729
- 'setup.workersTitle': '작업 실행 주체',
730
- 'setup.cacheTitle': '캐시를 유지할까요?',
731
- 'setup.cacheBlurb': '대화가 유휴 상태일 때 캐시가 만료됩니다. 자리를 비워도 Ripple이 핑을 보내 캐시를 유지할 수 있습니다.',
732
- 'setup.effortSummary': '자동 강도 {state}, 판정 모델: {judge}',
773
+ 'setup.judgeTitle': '판정 모델 선택',
774
+ 'setup.judgeBlurb': '작고 빠른 판정 모델이 프롬프트마다 추론 강도를, 작업마다 워커를 고릅니다.',
775
+ 'setup.workersTitle': '작업을 맡길 워커',
776
+ 'setup.cacheTitle': '캐시 유지 설정',
777
+ 'setup.cacheBlurb': '대화를 쉬면 캐시가 만료됩니다. 자리를 비운 동안 리플이 유지 요청을 보내 캐시를 유지합니다.',
778
+ 'setup.effortSummary': '추론 강도 자동 선택 {state}, 판정 모델: {judge}',
733
779
  'setup.cacheSummary': '응답 후 {hours}시간 동안 캐시 유지',
734
- 'setup.cacheOff': '캐시 유지 사용 안 함',
735
- 'setup.ready': 'ClaudeRipple 준비 완료',
736
- 'setup.welcome': 'ClaudeRipple을 시작합니다',
780
+ 'setup.cacheOff': '캐시 유지 꺼짐',
781
+ 'setup.ready': '리플 준비 완료',
782
+ 'setup.welcome': '리플을 시작합니다',
737
783
  'setup.start': '시작',
738
784
  'setup.finish': '완료',
739
785
  'setup.next': '다음',
@@ -741,14 +787,15 @@ const KO: Record<Key, string> = {
741
787
  'setup.skip': '설정 건너뛰기',
742
788
  // Agents.
743
789
  'agents.waiting': '대기 중',
744
- 'agents.routerModel': '라우터 모델',
745
- 'agents.marker': '마커',
790
+ 'agents.routerModel': '리플 모델',
791
+ 'agents.marker': '직접 지정',
746
792
  'agents.default': '기본값',
747
- 'agents.by': '{name} 배정',
793
+ 'agents.session': '현재 대화 모델',
794
+ 'agents.by': '{name} 기준',
748
795
  'agents.thinking': '추론 중',
749
796
  'agents.fallback': '▲ 대체 워커 실행: {reason}',
750
- 'agents.emptyTitle': '실행 중인 에이전트 없음',
751
- 'agents.emptyBody': 'Claude가 위임한 작업이 이곳에 표시되며, Ripple이 선정한 워커와 사유를 확인할 수 있습니다.',
797
+ 'agents.emptyTitle': '아직 에이전트가 없습니다',
798
+ 'agents.emptyBody': 'Claude가 맡긴 작업을 여기에 표시합니다. 리플이 고른 워커와 선택 이유도 함께 보여 줍니다.',
752
799
  'agents.liveCount': '{count}개 실행 중',
753
800
  'agents.noneRunning': '실행 중인 에이전트 없음',
754
801
  'agents.doneCount': '{count}개 완료',
@@ -756,112 +803,114 @@ const KO: Record<Key, string> = {
756
803
  'log.resent': '↻ {status} 재전송',
757
804
  'log.input': '입력 {tokens}',
758
805
  'log.output': '출력 {tokens}',
759
- 'log.thisSession': '현재 세션',
760
- 'log.allSessions': '전체 세션',
761
- 'log.showAll': '전체 세션 표시',
762
- 'log.onlySession': '현재 세션만 표시',
763
- 'log.legend': '● 현재 세션 ○ 다른 세션',
764
- 'log.empty': '아직 모델 요청 내역이 없습니다.',
765
- 'log.judge': '강도 판정',
806
+ 'log.thisSession': '현재 대화',
807
+ 'log.allSessions': '모든 대화',
808
+ 'log.showAll': '모든 대화 보기',
809
+ 'log.onlySession': '현재 대화만 보기',
810
+ 'log.legend': '● 현재 대화 ○ 다른 대화',
811
+ 'log.empty': '아직 모델에 보낸 요청이 없습니다.',
812
+ 'log.judge': '추론 강도 판정',
766
813
  'log.judgeWorker': '워커 판정',
767
814
  'log.judgeFell': '{asked} 실패 → {by}',
768
815
  'log.sure': '확신도 {percent}%',
769
816
  // Toasts and locally generated failure/reason text.
770
- 'toasts.keySingle': '단일 TypeSafe API 키를 입력하세요',
771
- 'toasts.keyPrivateFailed': 'Jev 키 파일 권한을 비공개로 변경하지 못했습니다 (chmod 600)',
772
- 'toasts.keySaved': 'ClaudeRipple: Jev 키를 안전하게 저장했습니다. 환경 변수 키가 우선 적용됩니다.',
773
- 'toasts.judgeDown': 'ClaudeRipple: {reason}. 현재 추론 강도를 유지하거나 Haiku에 판정을 요청합니다.',
774
- 'toasts.keyMissing': 'Jev 키 누락',
817
+ 'toasts.keySingle': 'TypeSafe API 키는 하나만 붙여 넣어야 합니다',
818
+ 'toasts.keyPrivateFailed': 'Jev 키 파일을 본인만 읽고 쓰도록 설정하지 못했습니다 (chmod 600)',
819
+ 'toasts.keySaved': '리플: Jev 키를 본인만 읽고 쓰도록 저장했습니다. 환경 변수의 키를 먼저 씁니다.',
820
+ 'toasts.judgeDown': '리플: {reason}. 현재 강도를 유지하거나 Haiku가 대신 판정합니다.',
821
+ 'toasts.keyMissing': 'Jev 키 없음',
775
822
  'toasts.jevNoVerdict': 'Jev 판정 결과 없음',
776
- 'judge.keptUnsure': '판정 결과가 모호하여 현재 강도 유지',
777
- 'toasts.routerNoVerdict': '라우터 판정 모델 결과 없음',
823
+ 'judge.keptUnsure': '판정이 애매해 현재 추론 강도 유지',
824
+ 'toasts.routerNoVerdict': '리플 판정 모델의 결과 없음',
778
825
  'toasts.haikuNoVerdict': 'Haiku 판정 결과 없음',
779
826
  'toasts.noVerdict': '판정 결과 없음',
780
827
  'toasts.judgeUnavailable': '판정 모델 사용 불가',
781
- 'toasts.explicitMarker': '명시적 워커 마커',
782
- 'toasts.workerFallback': 'ClaudeRipple: {reason}. {name} 워커로 대체 실행합니다.',
783
- 'toasts.modeEnded': '{name} 모드가 종료되었습니다.',
784
- 'toasts.yourPick': '사용자 직접 선택',
785
- 'toasts.effortEnter': 'ClaudeRipple: Enter를 누르면 앱의 추론 강도 설정도 선택한 값을 반영합니다.',
786
- 'toasts.settingsSaved': 'ClaudeRipple: 설정을 저장했습니다.',
787
- 'toasts.clipboardFallback': 'ClaudeRipple: 클립보드를 사용할 수 없어 재개 메모를 프롬프트에 삽입했습니다.',
788
- 'toasts.handoffFailed': 'ClaudeRipple: 인수인계에 실패했습니다. 기존 대화는 유지됩니다.',
789
- 'toasts.compactFailed': 'ClaudeRipple: 대화 압축에 실패했습니다. 기존 대화는 유지됩니다.',
790
- 'toasts.warmStopped': 'ClaudeRipple: {reason}',
791
- 'toasts.warmBoundReason': '캐시 유지 중단: 설정된 시간 한도 도달',
792
- 'toasts.warmBound': 'ClaudeRipple: 시간 한도에 도달하여 캐시 유지를 중단했습니다.',
828
+ 'toasts.explicitMarker': '워커 직접 지정',
829
+ 'toasts.sessionTier': '주 대화에서 정한 등급: {tier}',
830
+ 'toasts.workerFallback': '리플: {reason}. 대신 {name} 워커를 실행합니다.',
831
+ 'toasts.modeEnded': '{name} 모드가 끝났습니다.',
832
+ 'toasts.yourPick': '직접 선택',
833
+ 'toasts.effortEnter': '리플: Enter를 누르면 앱에도 같은 추론 강도를 적용합니다.',
834
+ 'toasts.settingsSaved': '리플: 설정을 저장했습니다.',
835
+ 'toasts.clipboardFallback': '리플: 클립보드를 쓸 수 없어 입력창에 인수인계 요약을 넣었습니다.',
836
+ 'toasts.handoffFailed': '리플: 인수인계에 실패했습니다. 대화는 그대로 둡니다.',
837
+ 'toasts.compactFailed': '리플: 대화 압축에 실패했습니다. 대화는 그대로 둡니다.',
838
+ 'toasts.warmStopped': '리플: {reason}',
839
+ 'toasts.warmBoundReason': '캐시 유지 중단: 유지 시간 종료',
840
+ 'toasts.warmBound': '리플: 설정한 시간이 지나 캐시 유지를 멈췄습니다.',
793
841
  'toasts.appEffort': '앱 추론 강도',
794
- 'toasts.appEffortChanged': '앱 추론 강도 변경됨',
795
- 'toasts.autoOff': 'ClaudeRipple: 앱에서 추론 강도를 변경하여 자동 선택이 비활성화되었습니다.',
796
- 'toasts.handoffEmpty': 'ClaudeRipple: 인수인계 결과가 비어 있어 작업을 취소했습니다.',
797
- 'toasts.ownModel': 'ClaudeRipple: {name} 에이전트는 "{model}" 대신 지정된 자체 모델로 실행됩니다.',
798
- 'toasts.transcriptEmpty': '대화 기록이 비어 있거나 압축 예산 한도를 초과했습니다.',
799
- 'toasts.summaryEmpty': 'Haiku에서 유효한 요약 결과를 수신하지 못했습니다.',
800
- 'toasts.compactFallback': 'ClaudeRipple: Haiku 압축 실패로 세션 기본 압축기를 사용합니다.',
801
- 'toasts.error': 'ClaudeRipple: {reason}',
802
- 'toasts.jevTimeout': 'Jev 요청 시간 초과',
803
- 'toasts.jevRejected': 'Jev 키 인증 거부됨',
804
- 'toasts.jevCredits': 'Jev 크레딧 소진됨',
805
- 'toasts.jevRateLimited': 'Jev 속도 제한 초과',
842
+ 'toasts.appEffortChanged': '앱에서 추론 강도 변경',
843
+ 'toasts.autoOff': '리플: 앱에서 추론 강도를 바꿔 자동 선택을 껐습니다.',
844
+ 'toasts.handoffEmpty': '리플: 인수인계 응답이 없습니다. 대화는 그대로 둡니다.',
845
+ 'toasts.ownModel': '리플: {name} 에이전트는 "{model}" 대신 자체 모델을 씁니다.',
846
+ 'toasts.transcriptEmpty': '대화 기록이 없거나 압축에 쓸 수 있는 토큰 한도를 넘었습니다.',
847
+ 'toasts.summaryEmpty': 'Haiku가 쓸 만한 요약을 보내지 않았습니다.',
848
+ 'toasts.compactFallback': '리플: Haiku 압축에 실패해 현재 대화의 기본 방식으로 압축합니다.',
849
+ 'toasts.error': '리플: {reason}',
850
+ 'toasts.jevTimeout': 'Jev 응답 대기 시간 초과',
851
+ 'toasts.jevRejected': 'Jev 키 인증 실패',
852
+ 'toasts.jevCredits': 'Jev 크레딧 소진',
853
+ 'toasts.jevRateLimited': 'Jev 요청 속도 한도 초과',
806
854
  'toasts.jevHttp': 'Jev 요청 실패 ({status})',
807
- 'toasts.warmNoReply': '캐시 유지 중단: 포크 응답 없음',
808
- 'toasts.warmNoCache': '캐시 유지 중단: 캐시 미적중',
809
- 'toasts.providerQuota': 'ChatGPT 계정을 사용할 수 없거나 사용량 한도가 소진되었습니다.',
855
+ 'toasts.warmNoReply': '캐시 유지 중단: 유지 요청에 응답 없음',
856
+ 'toasts.warmNoCache': '캐시 유지 중단: 캐시를 읽지 않음',
857
+ 'toasts.providerQuota': 'ChatGPT 계정을 사용할 수 없거나 한도를 모두 썼습니다.',
858
+ 'toasts.logNotPlaced': '여기서는 로그를 열 수 없습니다: {reason}',
810
859
  'toasts.saveMode': '절약 모드',
811
- 'toasts.yourSettings': '사용자 설정',
812
- 'toasts.jevNetwork': 'Jev 네트워크 연결 불가',
813
- 'toasts.workerMissing': '{name} 에이전트 미설치',
860
+ 'toasts.yourSettings': '직접 정한 설정',
861
+ 'toasts.jevNetwork': 'Jev 연결 불가',
862
+ 'toasts.workerMissing': '{name} 에이전트 설치 안 됨',
814
863
  // Commands (stats and debug labels included).
815
- 'commands.description': 'ClaudeRipple 추론 강도, 워커, 캐시 및 세션 도구',
864
+ 'commands.description': '리플 추론 강도, 워커, 캐시, 대화 관리',
816
865
  'commands.argumentHint': 'settings|setup|auto|warm|save|handoff [full]|stats|debug|agents|log|bar|cold|swamp|hot|down|kept',
817
- 'commands.logDescription': 'ClaudeRipple 요청 로그 열기/닫기',
818
- 'commands.barDescription': 'ClaudeRipple 상태 바 표시/숨기기',
866
+ 'commands.logDescription': '리플 요청 로그 열기/닫기',
867
+ 'commands.barDescription': '리플 상태 바 표시/숨기기',
819
868
  'commands.logTitle': 'ClaudeRipple',
820
- 'commands.agentsTitle': 'ClaudeRipple 에이전트',
821
- 'commands.help': 'ClaudeRipple 하위 명령: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down, kept.',
822
- 'commands.done': 'ClaudeRipple: {command} 완료.',
823
- 'commands.logOpened': 'ClaudeRipple 로그를 열었습니다.',
824
- 'commands.logClosed': 'ClaudeRipple 로그를 닫았습니다.',
825
- 'commands.barShown': '프롬프트 상단에 ClaudeRipple 상태 바를 표시합니다.',
826
- 'commands.barShownMinimal': '레이아웃이 최소화로 되어 있어 ClaudeRipple은 프롬프트 아래 한 줄로만 표시됩니다. 프롬프트 위에 상태 바를 띄우려면 /ripple settings에서 레이아웃을 대시보드로 바꾸십시오.',
827
- 'commands.barHidden': 'ClaudeRipple 상태 바를 숨겼습니다. /ripple-bar로 다시 표시할 수 있습니다.',
828
- 'commands.statsAuto': '자동: 프롬프트 {prompts}개, 요청 {requests}개, 가중 토큰 {total}',
869
+ 'commands.agentsTitle': '리플 에이전트',
870
+ 'commands.help': '리플 명령: settings, setup, auto, warm, save, handoff [full], stats, debug, agents, log, bar, cold, swamp, hot, down, kept.',
871
+ 'commands.done': '리플: {command} 완료.',
872
+ 'commands.logOpened': '리플 로그를 열었습니다.',
873
+ 'commands.logClosed': '리플 로그를 닫았습니다.',
874
+ 'commands.barShown': '입력창 위에 리플 상태 바를 표시합니다.',
875
+ 'commands.barShownMinimal': '배치가 한 줄로 설정되어 있어 입력창 아래에 리플을 표시합니다. 입력창 위에 상태 바를 보려면 /ripple settings에서 배치를 대시보드로 바꾸면 됩니다.',
876
+ 'commands.barHidden': '리플 상태 바를 숨겼습니다. /ripple-bar로 다시 표시합니다.',
877
+ 'commands.statsAuto': '자동: 프롬프트 {prompts}개, 요청 {requests}개, 환산 토큰 {total}',
829
878
  'commands.statsTokens': '토큰: 입력 {input}, 쓰기 {write}, 읽기 {read}, 출력 {output}',
830
- 'commands.statsEffort': '{effort} 프롬프트 {prompts}개 / 가중치 {cost}',
831
- 'commands.statsJudges': '판정 모델: haiku {haiku}, jev {jev}, 모델 {model}; 토큰 {tokens}, {ms} ms (평균 {avg} ms)',
879
+ 'commands.statsEffort': '{effort} 프롬프트 {prompts}개 / 환산 토큰 {cost}',
880
+ 'commands.statsJudges': '판정 모델: Haiku {haiku}, Jev {jev}, 모델 {model}; 토큰 {tokens}, {ms} ms (평균 {avg} ms)',
832
881
  'commands.statsWorkers': '워커: {workers}',
833
- 'commands.statsWarm': '캐시 유지: 핑 {pings}회, 가중 토큰 {cost}',
882
+ 'commands.statsWarm': '캐시 유지: 유지 요청 {pings}회, 환산 토큰 {cost}',
834
883
  'commands.debugJudge': '판정 모델',
835
- 'commands.debugJudgeModel': '판정용 라우터 모델',
884
+ 'commands.debugJudgeModel': '판정용 리플 모델',
836
885
  'commands.debugPick': '선택',
837
886
  'commands.debugPaused': '일시 중지',
838
887
  'commands.debugCache': '캐시',
839
888
  'commands.debugWarm': '캐시 유지',
840
- 'commands.debugLastSpawn': '최근 생성',
889
+ 'commands.debugLastSpawn': '최근 워커 실행',
841
890
  'commands.debugLastRequest': '최근 요청',
842
891
  'commands.debugEffort': '추론 강도',
843
- 'commands.debugWhy': '사유',
844
- 'commands.debugBy': '선택 주체',
892
+ 'commands.debugWhy': '이유',
893
+ 'commands.debugBy': '선택 기준',
845
894
  'commands.debugAt': '시각',
846
895
  'commands.debugSure': '확신도',
847
- 'commands.debugTtlMs': 'TTL(ms)',
896
+ 'commands.debugTtlMs': '유효 시간(ms)',
848
897
  'commands.debugLastReplyAt': '최근 응답 시각',
849
898
  'commands.debugExpiresAt': '만료 시각',
850
- 'commands.debugPings': '핑 횟수',
899
+ 'commands.debugPings': '유지 요청 횟수',
851
900
  'commands.debugCost': '비용',
852
- 'commands.debugStopped': '중단 사유',
853
- 'commands.debugLastPingAt': '최근 핑 시각',
901
+ 'commands.debugStopped': '중단 이유',
902
+ 'commands.debugLastPingAt': '최근 유지 요청 시각',
854
903
  'commands.debugTier': '등급',
855
904
  'commands.debugTarget': '대상',
856
905
  'commands.debugAgent': '에이전트',
857
906
  'commands.debugModel': '모델',
858
907
  'commands.debugMs': 'ms',
859
- 'commands.debugFallbackReason': '대체 사유',
860
- 'commands.debugAppEffort': '앱 강도',
861
- 'commands.debugSentEffort': '전송 강도',
862
- 'commands.debugLog': 'ClaudeRipple {where}: {reason}',
863
- 'commands.routerHttp': '라우터 HTTP {status}',
864
- 'commands.compactSkip': '압축이 필요할 때 ClaudeRipple이 Haiku로 요약합니다.',
908
+ 'commands.debugFallbackReason': '대체 이유',
909
+ 'commands.debugAppEffort': '앱 추론 강도',
910
+ 'commands.debugSentEffort': '요청에 쓴 추론 강도',
911
+ 'commands.debugLog': '리플 {where}: {reason}',
912
+ 'commands.routerHttp': '리플 HTTP {status}',
913
+ 'commands.compactSkip': '대화 압축이 필요하면 리플이 Haiku로 요약합니다.',
865
914
  // Workers card, Jev source, and worker picks in the Agents pane.
866
915
  'workers.previous': '이전',
867
916
  'workers.next': '다음',
@@ -876,33 +925,66 @@ const KO: Record<Key, string> = {
876
925
  'workers.docs': '문서',
877
926
  'workers.research': '조사',
878
927
  'workers.mode': '모드',
879
- 'workers.rung.light': '로우 워커',
880
- 'workers.rung.standard': '미디움 워커',
881
- 'workers.rung.hard': '하이 워커',
882
- 'workers.rung.plan': '맥스 워커',
883
- 'workers.rungHint.light': '파일 검색, 단건 조회, 로그 검토, 기계적 수정',
884
- 'workers.rungHint.standard': '명세 기반 구현, 리팩터링, 요약, 초안 작성',
885
- 'workers.rungHint.hard': '고난도 디버깅, 다중 파일 변경, 독립적 검토 및 반박',
886
- 'workers.rungHint.plan': '최상의 품질: 기획, 설계, 아키텍처 수립, 심층 의견 제시',
887
- 'workers.rungEmpty': '{rung}에 설정된 모델이 없습니다',
888
- 'workers.notCandidate': '이 분야 후보에 없는 모델입니다: {name}',
889
- 'workers.sessionModel': '세션 기본 모델',
890
- 'workers.offset': '추론 강도 보정',
891
- 'workers.anyEffort': '제한 없음',
892
- 'workers.noTarget': '상위 등급 또는 대체 워커 사용',
893
- 'workers.judgeBlurb': '프롬프트의 추론 강도와 작업 분야 및 등급을 결정하는 모델입니다.',
894
- 'workers.disabled': '{provider} 비활성화됨',
895
- 'workers.nested': '서브에이전트는 하위 서브에이전트를 생성할 수 없습니다. 이 부분은 직접 실행하고 결과를 보고하세요.',
896
- 'workers.none': '사용 가능한 활성 워커 없음',
897
- 'workers.loading': '라우터의 워커 목록을 불러오는 중…',
898
- 'workers.providerSub': '{count}개 중 {on}개 활성',
899
- 'workers.fallbackHint': '고정된 대상을 실행할 수 없을 때',
900
- 'workers.pinDetails': '추가 옵션',
901
- 'workers.back': '뒤로 가기',
902
- 'settings.ladderWaiting': '라우터에서 모델 목록을 수신하는 중입니다.',
903
- 'jev.zenMissing': 'ClaudeRipple 설정에 OpenCode Zen 인증 키가 없습니다',
928
+ 'workers.rung.light': '기본 워커',
929
+ 'workers.rung.standard': '표준 워커',
930
+ 'workers.rung.hard': '고급 워커',
931
+ 'workers.rung.plan': '최상위 워커',
932
+ 'workers.rungHint.light': '파일 찾기, 간단한 조회, 로그 훑기, 반복 수정',
933
+ 'workers.rungHint.standard': '요구사항에 따른 구현, 코드 정리, 요약, 초안 작성',
934
+ 'workers.rungHint.hard': '어려운 오류 해결, 여러 파일 수정, 별도 검토와 반박',
935
+ 'workers.rungHint.plan': '최상의 결과: 기획, 설계, 전체 구조 설계, 의견 제시',
936
+ 'workers.rungEmpty': '{rung}에 지정한 모델이 없습니다',
937
+ 'workers.notCandidate': '{name}: 이 분야의 후보 모델이 아닙니다',
938
+ 'workers.sessionModel': '현재 대화 모델',
939
+ 'workers.offset': '추론 강도 조정',
940
+ 'workers.anyEffort': '모든 추론 강도',
941
+ 'workers.noTarget': '다음 단계 / 대체 워커',
942
+ 'workers.judgeBlurb': '프롬프트의 추론 강도와 작업의 분야·등급을 고르는 모델입니다.',
943
+ 'workers.disabled': '{provider} 꺼짐',
944
+ 'workers.nested': '서브에이전트는 다른 서브에이전트를 띄울 수 없습니다. 이 작업은 직접 마친 뒤 결과를 보고해야 합니다.',
945
+ 'workers.none': '실행할 수 있는 워커 없음',
946
+ 'workers.loading': '리플의 워커 목록을 불러오는 중…',
947
+ 'workers.providerSub': '{count}개 중 {on}개 켜짐',
948
+ 'workers.fallbackHint': '지정한 워커를 실행할 수 없을 때',
949
+ 'workers.pinDetails': '추가 설정',
950
+ 'workers.back': '뒤로',
951
+ 'settings.ladderWaiting': '리플의 모델 목록을 기다리고 있습니다.',
952
+ 'jev.zenMissing': '리플 설정에 OpenCode Zen 인증 키가 없습니다',
904
953
  'agents.domainLevel': '{domain} / {level}',
905
- 'agents.tokens': '≈{tokens} 토큰',
954
+ 'agents.title': '에이전트',
955
+ 'agents.total': '전체 에이전트',
956
+ 'agents.input': '입력',
957
+ 'agents.cache': '캐시',
958
+ 'agents.output': '출력',
959
+ 'agents.toolsLabel': '도구',
960
+ 'agents.failed': '실패',
961
+ 'agents.more': '{count}개 더 보기',
962
+ 'agents.less': '접기',
963
+ 'agents.open': '대화 보기',
964
+ 'agents.back': '목록으로',
965
+ 'agents.task': '작업 지시',
966
+ 'agents.answer': '최종 답변',
967
+ 'agents.dropped': '너무 길어 앞의 {count}개는 생략했습니다',
968
+ 'agents.act.command': '명령어 {count}개 실행함',
969
+ 'agents.act.commandOne': '명령어 {count}개 실행함',
970
+ 'agents.act.read': '파일 {count}개 읽음',
971
+ 'agents.act.readOne': '파일 {count}개 읽음',
972
+ 'agents.act.edit': '파일 {count}개를 편집함',
973
+ 'agents.act.editOne': '파일 {count}개를 편집함',
974
+ 'agents.act.search': '검색 {count}회',
975
+ 'agents.act.searchOne': '검색 {count}회',
976
+ 'agents.act.web': '웹 요청 {count}회',
977
+ 'agents.act.webOne': '웹 요청 {count}회',
978
+ 'agents.act.agent': '에이전트 {count}개',
979
+ 'agents.act.agentOne': '에이전트 {count}개',
980
+ 'agents.act.other': '도구 {count}개 사용함',
981
+ 'agents.act.otherOne': '도구 {count}개 사용함',
982
+ 'agents.act.more': '그 외 작업 {count}개',
983
+ 'agents.act.moreOne': '그 외 작업 {count}개',
984
+ 'agents.act.failed': '{count}개 실패',
985
+ 'agents.deny': '이 에이전트의 대화를 읽을 수 없습니다: {reason}',
986
+ 'agents.gone': '이 에이전트는 더는 목록에 없습니다.',
987
+ 'agents.nothingYet': '아직 대화 내용이 없습니다.',
906
988
  // Time units: countdowns, reset times, durations.
907
989
  'units.seconds': '{n}초',
908
990
  'units.minutes': '{n}분',
@@ -955,6 +1037,7 @@ const ZH: Record<Key, string> = {
955
1037
  'band.limitCaption': '{window}限额{save}',
956
1038
  'band.saveCaption': ' · 节省',
957
1039
  'band.limitAlt': '{window}限额 {value}{reset}',
1040
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
958
1041
  'band.fiveHour': '5 小时',
959
1042
  'band.weekly': '每周',
960
1043
  'band.resetting': '重置中',
@@ -1155,6 +1238,10 @@ const ZH: Record<Key, string> = {
1155
1238
  'settings.appearance': '外观',
1156
1239
  'settings.dark': '深色',
1157
1240
  'settings.lightAppearance': '浅色',
1241
+ 'settings.skin': '皮肤',
1242
+ 'settings.skinLine': '设置状态栏和卡片的样式。',
1243
+ 'settings.skinDeep': '深海',
1244
+ 'settings.skinFlat': '平面',
1158
1245
  'settings.show': '显示',
1159
1246
  'settings.language': '语言',
1160
1247
  'settings.title': '设置',
@@ -1198,6 +1285,7 @@ const ZH: Record<Key, string> = {
1198
1285
  'agents.routerModel': '路由模型',
1199
1286
  'agents.marker': '标记',
1200
1287
  'agents.default': '默认',
1288
+ 'agents.session': '会话模型',
1201
1289
  'agents.by': '来源:{name}',
1202
1290
  'agents.thinking': '思考中',
1203
1291
  'agents.fallback': '▲ 已运行备用代理:{reason}',
@@ -1233,6 +1321,7 @@ const ZH: Record<Key, string> = {
1233
1321
  'toasts.noVerdict': '无判定',
1234
1322
  'toasts.judgeUnavailable': '判定模型不可用',
1235
1323
  'toasts.explicitMarker': '显式 Worker 标记',
1324
+ 'toasts.sessionTier': '主对话指定的等级:{tier}',
1236
1325
  'toasts.workerFallback': 'ClaudeRipple: {reason};改为运行 {name}。',
1237
1326
  'toasts.modeEnded': '{name} 模式已结束',
1238
1327
  'toasts.yourPick': '你的选择',
@@ -1261,6 +1350,7 @@ const ZH: Record<Key, string> = {
1261
1350
  'toasts.warmNoReply': '保温已停止:ping 无回复',
1262
1351
  'toasts.warmNoCache': '保温已停止:未读取缓存',
1263
1352
  'toasts.providerQuota': 'ChatGPT 账号不可用或额度已用尽',
1353
+ 'toasts.logNotPlaced': '无法在此打开日志:{reason}',
1264
1354
  'toasts.saveMode': '节省模式',
1265
1355
  'toasts.yourSettings': '你的设置',
1266
1356
  'toasts.jevNetwork': 'Jev 网络不可用',
@@ -1356,7 +1446,40 @@ const ZH: Record<Key, string> = {
1356
1446
  'settings.ladderWaiting': '正在等待路由器的模型列表。',
1357
1447
  'jev.zenMissing': 'ClaudeRipple 配置中没有 OpenCode Zen 授权密钥',
1358
1448
  'agents.domainLevel': '{domain} / {level}',
1359
- 'agents.tokens': '≈{tokens} token',
1449
+ 'agents.title': '代理',
1450
+ 'agents.total': '全部合计',
1451
+ 'agents.input': '输入',
1452
+ 'agents.cache': '缓存',
1453
+ 'agents.output': '输出',
1454
+ 'agents.toolsLabel': '工具',
1455
+ 'agents.failed': '失败',
1456
+ 'agents.more': '再显示 {count} 个',
1457
+ 'agents.less': '收起',
1458
+ 'agents.open': '查看对话',
1459
+ 'agents.back': '返回列表',
1460
+ 'agents.task': '任务',
1461
+ 'agents.answer': '最终回答',
1462
+ 'agents.dropped': '内容过长,已省略前面 {count} 条',
1463
+ 'agents.act.command': '运行了 {count} 条命令',
1464
+ 'agents.act.commandOne': '运行了 {count} 条命令',
1465
+ 'agents.act.read': '读取了 {count} 个文件',
1466
+ 'agents.act.readOne': '读取了 {count} 个文件',
1467
+ 'agents.act.edit': '编辑了 {count} 个文件',
1468
+ 'agents.act.editOne': '编辑了 {count} 个文件',
1469
+ 'agents.act.search': '搜索 {count} 次',
1470
+ 'agents.act.searchOne': '搜索 {count} 次',
1471
+ 'agents.act.web': '网络请求 {count} 次',
1472
+ 'agents.act.webOne': '网络请求 {count} 次',
1473
+ 'agents.act.agent': '{count} 个代理',
1474
+ 'agents.act.agentOne': '{count} 个代理',
1475
+ 'agents.act.other': '使用了 {count} 个工具',
1476
+ 'agents.act.otherOne': '使用了 {count} 个工具',
1477
+ 'agents.act.more': '另有 {count} 项操作',
1478
+ 'agents.act.moreOne': '另有 {count} 项操作',
1479
+ 'agents.act.failed': '{count} 个失败',
1480
+ 'agents.deny': '无法读取该代理的对话:{reason}',
1481
+ 'agents.gone': '该代理已不在列表中。',
1482
+ 'agents.nothingYet': '对话中还没有内容。',
1360
1483
  // Time units: countdowns, reset times, durations.
1361
1484
  'units.seconds': '{n}秒',
1362
1485
  'units.minutes': '{n}分钟',
@@ -1409,6 +1532,7 @@ const JA: Record<Key, string> = {
1409
1532
  'band.limitCaption': '{window}上限{save}',
1410
1533
  'band.saveCaption': ' · 節約',
1411
1534
  'band.limitAlt': '{window}上限 {value}{reset}',
1535
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
1412
1536
  'band.fiveHour': '5時間',
1413
1537
  'band.weekly': '週間',
1414
1538
  'band.resetting': 'リセット中',
@@ -1609,6 +1733,10 @@ const JA: Record<Key, string> = {
1609
1733
  'settings.appearance': 'テーマ',
1610
1734
  'settings.dark': 'ダーク',
1611
1735
  'settings.lightAppearance': 'ライト',
1736
+ 'settings.skin': 'スキン',
1737
+ 'settings.skinLine': 'バーとカードの見た目を設定します。',
1738
+ 'settings.skinDeep': 'ディープ',
1739
+ 'settings.skinFlat': 'フラット',
1612
1740
  'settings.show': '表示項目',
1613
1741
  'settings.language': '言語',
1614
1742
  'settings.title': '設定',
@@ -1652,6 +1780,7 @@ const JA: Record<Key, string> = {
1652
1780
  'agents.routerModel': 'ルーターのモデル',
1653
1781
  'agents.marker': 'マーカー',
1654
1782
  'agents.default': 'デフォルト',
1783
+ 'agents.session': 'セッションのモデル',
1655
1784
  'agents.by': '選択元: {name}',
1656
1785
  'agents.thinking': '思考中',
1657
1786
  'agents.fallback': '▲ 代替で実行: {reason}',
@@ -1687,6 +1816,7 @@ const JA: Record<Key, string> = {
1687
1816
  'toasts.noVerdict': '判定なし',
1688
1817
  'toasts.judgeUnavailable': '判定モデルを利用できません',
1689
1818
  'toasts.explicitMarker': '明示的なワーカーマーカー',
1819
+ 'toasts.sessionTier': 'メイン会話が指定した等級: {tier}',
1690
1820
  'toasts.workerFallback': 'ClaudeRipple: {reason}。{name} で実行します。',
1691
1821
  'toasts.modeEnded': '{name} モードが終了しました',
1692
1822
  'toasts.yourPick': 'ご自身の選択',
@@ -1715,6 +1845,7 @@ const JA: Record<Key, string> = {
1715
1845
  'toasts.warmNoReply': 'キャッシュ保持を停止: ping の応答なし',
1716
1846
  'toasts.warmNoCache': 'キャッシュ保持を停止: キャッシュが読まれませんでした',
1717
1847
  'toasts.providerQuota': 'ChatGPT アカウントが使えないか、上限に達しています',
1848
+ 'toasts.logNotPlaced': 'ここではログを開けません: {reason}',
1718
1849
  'toasts.saveMode': '節約モード',
1719
1850
  'toasts.yourSettings': 'ご自身の設定',
1720
1851
  'toasts.jevNetwork': 'Jev のネットワークに接続できません',
@@ -1810,7 +1941,40 @@ const JA: Record<Key, string> = {
1810
1941
  'settings.ladderWaiting': 'ルーターのモデル一覧を待っています。',
1811
1942
  'jev.zenMissing': 'ClaudeRipple の設定に OpenCode Zen の認証キーがありません',
1812
1943
  'agents.domainLevel': '{domain} / {level}',
1813
- 'agents.tokens': '≈{tokens} トークン',
1944
+ 'agents.title': 'エージェント',
1945
+ 'agents.total': '全体の合計',
1946
+ 'agents.input': '入力',
1947
+ 'agents.cache': 'キャッシュ',
1948
+ 'agents.output': '出力',
1949
+ 'agents.toolsLabel': 'ツール',
1950
+ 'agents.failed': '失敗',
1951
+ 'agents.more': 'さらに {count} 件表示',
1952
+ 'agents.less': '折りたたむ',
1953
+ 'agents.open': '会話を見る',
1954
+ 'agents.back': '一覧へ',
1955
+ 'agents.task': 'タスク',
1956
+ 'agents.answer': '最終回答',
1957
+ 'agents.dropped': '長すぎるため、前の {count} 件を省略しました',
1958
+ 'agents.act.command': '{count} 件のコマンドを実行',
1959
+ 'agents.act.commandOne': '{count} 件のコマンドを実行',
1960
+ 'agents.act.read': '{count} 件のファイルを読み取り',
1961
+ 'agents.act.readOne': '{count} 件のファイルを読み取り',
1962
+ 'agents.act.edit': '{count} 件のファイルを編集',
1963
+ 'agents.act.editOne': '{count} 件のファイルを編集',
1964
+ 'agents.act.search': '検索 {count} 回',
1965
+ 'agents.act.searchOne': '検索 {count} 回',
1966
+ 'agents.act.web': 'Web {count} 回',
1967
+ 'agents.act.webOne': 'Web {count} 回',
1968
+ 'agents.act.agent': 'エージェント {count} 件',
1969
+ 'agents.act.agentOne': 'エージェント {count} 件',
1970
+ 'agents.act.other': '{count} 件のツールを使用',
1971
+ 'agents.act.otherOne': '{count} 件のツールを使用',
1972
+ 'agents.act.more': 'ほか {count} 件の操作',
1973
+ 'agents.act.moreOne': 'ほか {count} 件の操作',
1974
+ 'agents.act.failed': '{count} 件失敗',
1975
+ 'agents.deny': 'このエージェントの会話は読めません: {reason}',
1976
+ 'agents.gone': 'このエージェントはもう一覧にありません。',
1977
+ 'agents.nothingYet': '会話はまだありません。',
1814
1978
  // Time units: countdowns, reset times, durations.
1815
1979
  'units.seconds': '{n}秒',
1816
1980
  'units.minutes': '{n}分',
@@ -1863,6 +2027,7 @@ const ES: Record<Key, string> = {
1863
2027
  'band.limitCaption': 'límite {window}{save}',
1864
2028
  'band.saveCaption': ' · AHORRO',
1865
2029
  'band.limitAlt': 'Límite {window}: {value}{reset}',
2030
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
1866
2031
  'band.fiveHour': '5 horas',
1867
2032
  'band.weekly': 'semanal',
1868
2033
  'band.resetting': 'restableciendo',
@@ -2063,6 +2228,10 @@ const ES: Record<Key, string> = {
2063
2228
  'settings.appearance': 'Apariencia',
2064
2229
  'settings.dark': 'Oscuro',
2065
2230
  'settings.lightAppearance': 'Claro',
2231
+ 'settings.skin': 'Estilo',
2232
+ 'settings.skinLine': 'Define el aspecto de la barra y las tarjetas.',
2233
+ 'settings.skinDeep': 'Profundo',
2234
+ 'settings.skinFlat': 'Plano',
2066
2235
  'settings.show': 'Mostrar',
2067
2236
  'settings.language': 'Idioma',
2068
2237
  'settings.title': 'configuración',
@@ -2106,6 +2275,7 @@ const ES: Record<Key, string> = {
2106
2275
  'agents.routerModel': 'modelo del router',
2107
2276
  'agents.marker': 'marcador',
2108
2277
  'agents.default': 'predeterminado',
2278
+ 'agents.session': 'el modelo de la sesión',
2109
2279
  'agents.by': 'origen: {name}',
2110
2280
  'agents.thinking': 'pensando',
2111
2281
  'agents.fallback': '▲ se usó el respaldo: {reason}',
@@ -2141,6 +2311,7 @@ const ES: Record<Key, string> = {
2141
2311
  'toasts.noVerdict': 'sin veredicto',
2142
2312
  'toasts.judgeUnavailable': 'juez no disponible',
2143
2313
  'toasts.explicitMarker': 'marcador de worker explícito',
2314
+ 'toasts.sessionTier': 'nivel elegido por el chat principal: {tier}',
2144
2315
  'toasts.workerFallback': 'ClaudeRipple: {reason}; se ejecuta {name}.',
2145
2316
  'toasts.modeEnded': 'El modo {name} ha terminado.',
2146
2317
  'toasts.yourPick': 'tu elección',
@@ -2169,6 +2340,7 @@ const ES: Record<Key, string> = {
2169
2340
  'toasts.warmNoReply': 'Se dejó de mantener caliente: el ping no obtuvo respuesta',
2170
2341
  'toasts.warmNoCache': 'Se dejó de mantener caliente: no se leyó la caché',
2171
2342
  'toasts.providerQuota': 'Las cuentas de ChatGPT no están disponibles o no tienen cuota',
2343
+ 'toasts.logNotPlaced': 'No se pudo abrir el registro aquí: {reason}',
2172
2344
  'toasts.saveMode': 'modo ahorro',
2173
2345
  'toasts.yourSettings': 'tu configuración',
2174
2346
  'toasts.jevNetwork': 'Red de Jev no disponible',
@@ -2264,7 +2436,40 @@ const ES: Record<Key, string> = {
2264
2436
  'settings.ladderWaiting': 'Esperando la lista de modelos del router.',
2265
2437
  'jev.zenMissing': 'No hay clave de autorización de OpenCode Zen en la configuración de ClaudeRipple',
2266
2438
  'agents.domainLevel': '{domain} / {level}',
2267
- 'agents.tokens': '≈{tokens} tok',
2439
+ 'agents.title': 'Agentes',
2440
+ 'agents.total': 'Total de agentes',
2441
+ 'agents.input': 'entrada',
2442
+ 'agents.cache': 'caché',
2443
+ 'agents.output': 'salida',
2444
+ 'agents.toolsLabel': 'herramientas',
2445
+ 'agents.failed': 'falló',
2446
+ 'agents.more': 'Ver {count} más',
2447
+ 'agents.less': 'Ver menos',
2448
+ 'agents.open': 'Ver conversación',
2449
+ 'agents.back': 'Todos los agentes',
2450
+ 'agents.task': 'Tarea',
2451
+ 'agents.answer': 'Respuesta final',
2452
+ 'agents.dropped': 'Se omiten {count} entradas anteriores: demasiado largo',
2453
+ 'agents.act.command': '{count} comandos ejecutados',
2454
+ 'agents.act.commandOne': '{count} comando ejecutado',
2455
+ 'agents.act.read': '{count} archivos leídos',
2456
+ 'agents.act.readOne': '{count} archivo leído',
2457
+ 'agents.act.edit': '{count} archivos editados',
2458
+ 'agents.act.editOne': '{count} archivo editado',
2459
+ 'agents.act.search': '{count} búsquedas',
2460
+ 'agents.act.searchOne': '{count} búsqueda',
2461
+ 'agents.act.web': '{count} consultas web',
2462
+ 'agents.act.webOne': '{count} consulta web',
2463
+ 'agents.act.agent': '{count} agentes',
2464
+ 'agents.act.agentOne': '{count} agente',
2465
+ 'agents.act.other': '{count} herramientas usadas',
2466
+ 'agents.act.otherOne': '{count} herramienta usada',
2467
+ 'agents.act.more': 'y {count} acciones más',
2468
+ 'agents.act.moreOne': 'y {count} acción más',
2469
+ 'agents.act.failed': '{count} con error',
2470
+ 'agents.deny': 'No se puede leer la conversación de este agente: {reason}',
2471
+ 'agents.gone': 'Este agente ya no está en la lista.',
2472
+ 'agents.nothingYet': 'Aún no hay nada en su conversación.',
2268
2473
  // Time units: countdowns, reset times, durations.
2269
2474
  'units.seconds': '{n} s',
2270
2475
  'units.minutes': '{n} min',
@@ -2317,6 +2522,7 @@ const PT: Record<Key, string> = {
2317
2522
  'band.limitCaption': 'limite {window}{save}',
2318
2523
  'band.saveCaption': ' · ECONOMIA',
2319
2524
  'band.limitAlt': 'Limite {window}: {value}{reset}',
2525
+ 'band.limitsTip': '{provider} {window} {value}{reset}',
2320
2526
  'band.fiveHour': '5 horas',
2321
2527
  'band.weekly': 'semanal',
2322
2528
  'band.resetting': 'renovando',
@@ -2517,6 +2723,10 @@ const PT: Record<Key, string> = {
2517
2723
  'settings.appearance': 'Aparência',
2518
2724
  'settings.dark': 'Escuro',
2519
2725
  'settings.lightAppearance': 'Claro',
2726
+ 'settings.skin': 'Estilo',
2727
+ 'settings.skinLine': 'Define o visual da barra e dos cartões.',
2728
+ 'settings.skinDeep': 'Profundo',
2729
+ 'settings.skinFlat': 'Plano',
2520
2730
  'settings.show': 'Mostrar',
2521
2731
  'settings.language': 'Idioma',
2522
2732
  'settings.title': 'configurações',
@@ -2560,6 +2770,7 @@ const PT: Record<Key, string> = {
2560
2770
  'agents.routerModel': 'modelo do roteador',
2561
2771
  'agents.marker': 'marcador',
2562
2772
  'agents.default': 'padrão',
2773
+ 'agents.session': 'o modelo da sessão',
2563
2774
  'agents.by': 'origem: {name}',
2564
2775
  'agents.thinking': 'pensando',
2565
2776
  'agents.fallback': '▲ executou o agente de reserva: {reason}',
@@ -2595,6 +2806,7 @@ const PT: Record<Key, string> = {
2595
2806
  'toasts.noVerdict': 'sem veredito',
2596
2807
  'toasts.judgeUnavailable': 'juiz indisponível',
2597
2808
  'toasts.explicitMarker': 'marcador de worker explícito',
2809
+ 'toasts.sessionTier': 'nível escolhido pelo chat principal: {tier}',
2598
2810
  'toasts.workerFallback': 'ClaudeRipple: {reason}; executando {name}.',
2599
2811
  'toasts.modeEnded': 'O modo {name} terminou.',
2600
2812
  'toasts.yourPick': 'sua escolha',
@@ -2623,6 +2835,7 @@ const PT: Record<Key, string> = {
2623
2835
  'toasts.warmNoReply': 'Parou de manter quente: o ping não teve resposta',
2624
2836
  'toasts.warmNoCache': 'Parou de manter quente: o cache não foi lido',
2625
2837
  'toasts.providerQuota': 'As contas do ChatGPT estão indisponíveis ou sem cota',
2838
+ 'toasts.logNotPlaced': 'Não foi possível abrir o registro aqui: {reason}',
2626
2839
  'toasts.saveMode': 'modo economia',
2627
2840
  'toasts.yourSettings': 'suas configurações',
2628
2841
  'toasts.jevNetwork': 'Rede do Jev indisponível',
@@ -2718,7 +2931,40 @@ const PT: Record<Key, string> = {
2718
2931
  'settings.ladderWaiting': 'Aguardando a lista de modelos do roteador.',
2719
2932
  'jev.zenMissing': 'Não há chave de autorização do OpenCode Zen na configuração do ClaudeRipple',
2720
2933
  'agents.domainLevel': '{domain} / {level}',
2721
- 'agents.tokens': '≈{tokens} tok',
2934
+ 'agents.title': 'Agentes',
2935
+ 'agents.total': 'Total dos agentes',
2936
+ 'agents.input': 'entrada',
2937
+ 'agents.cache': 'cache',
2938
+ 'agents.output': 'saída',
2939
+ 'agents.toolsLabel': 'ferramentas',
2940
+ 'agents.failed': 'falhou',
2941
+ 'agents.more': 'Ver mais {count}',
2942
+ 'agents.less': 'Ver menos',
2943
+ 'agents.open': 'Ver conversa',
2944
+ 'agents.back': 'Todos os agentes',
2945
+ 'agents.task': 'Tarefa',
2946
+ 'agents.answer': 'Resposta final',
2947
+ 'agents.dropped': '{count} entradas anteriores omitidas: longo demais',
2948
+ 'agents.act.command': '{count} comandos executados',
2949
+ 'agents.act.commandOne': '{count} comando executado',
2950
+ 'agents.act.read': '{count} arquivos lidos',
2951
+ 'agents.act.readOne': '{count} arquivo lido',
2952
+ 'agents.act.edit': '{count} arquivos editados',
2953
+ 'agents.act.editOne': '{count} arquivo editado',
2954
+ 'agents.act.search': '{count} buscas',
2955
+ 'agents.act.searchOne': '{count} busca',
2956
+ 'agents.act.web': '{count} consultas na web',
2957
+ 'agents.act.webOne': '{count} consulta na web',
2958
+ 'agents.act.agent': '{count} agentes',
2959
+ 'agents.act.agentOne': '{count} agente',
2960
+ 'agents.act.other': '{count} ferramentas usadas',
2961
+ 'agents.act.otherOne': '{count} ferramenta usada',
2962
+ 'agents.act.more': 'e mais {count} ações',
2963
+ 'agents.act.moreOne': 'e mais {count} ação',
2964
+ 'agents.act.failed': '{count} com erro',
2965
+ 'agents.deny': 'Não é possível ler a conversa deste agente: {reason}',
2966
+ 'agents.gone': 'Este agente não está mais na lista.',
2967
+ 'agents.nothingYet': 'Ainda não há nada na conversa.',
2722
2968
  // Time units: countdowns, reset times, durations.
2723
2969
  'units.seconds': '{n} s',
2724
2970
  'units.minutes': '{n} min',