clauderipple 0.9.4 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -0
- package/README.md +31 -0
- package/dist/app/package.json +1 -1
- package/dist/cli/src/hooks/agent-title.js +7 -4
- package/dist/cli/src/index.js +43 -0
- package/dist/cli/src/remote.js +263 -0
- package/dist/cli/src/schtasks.js +48 -40
- package/dist/cli/src/settings.js +2 -1
- package/dist/mod/hooks/i18n.ts +252 -6
- package/dist/mod/hooks/judge.ts +35 -17
- package/dist/mod/hooks/modes.ts +56 -1
- package/dist/mod/hooks/register.tsx +238 -32
- package/dist/mod/hooks/session.ts +98 -1
- package/dist/mod/hooks/settings.js +7 -3
- package/dist/mod/hooks/settings.ts +9 -4
- package/dist/mod/hooks/stats.ts +25 -1
- package/dist/mod/hooks/ui/agents.tsx +858 -79
- package/dist/mod/hooks/ui/alerts.tsx +20 -17
- package/dist/mod/hooks/ui/art.ts +33 -7
- package/dist/mod/hooks/ui/band.tsx +262 -81
- package/dist/mod/hooks/ui/flat.ts +265 -0
- package/dist/mod/hooks/ui/kit.tsx +70 -55
- package/dist/mod/hooks/ui/look.ts +129 -0
- package/dist/mod/hooks/ui/settings.tsx +71 -46
- package/dist/mod/hooks/ui/setup.tsx +15 -13
- package/dist/mod/hooks/ui/theme.ts +3 -0
- package/dist/mod/hooks/ui/tools.ts +124 -0
- package/dist/mod/hooks/ui/view.ts +116 -3
- package/dist/mod/hooks/workers.ts +33 -6
- package/dist/mod/tests/register.test.tsx +155 -11
- package/dist/mod/tests/ui.test.tsx +375 -27
- package/dist/mod/types/index.d.ts +68 -2
- package/dist/remote/package.json +28 -0
- package/dist/remote/src/away.js +85 -0
- package/dist/remote/src/bridge-client.js +295 -0
- package/dist/remote/src/composer-menu.js +11 -0
- package/dist/remote/src/config.js +102 -0
- package/dist/remote/src/desktop.js +1018 -0
- package/dist/remote/src/e2ee.js +126 -0
- package/dist/remote/src/e2ee.ts +126 -0
- package/dist/remote/src/eventlog.js +298 -0
- package/dist/remote/src/expo-push.js +127 -0
- package/dist/remote/src/folders.js +79 -0
- package/dist/remote/src/fsutil.js +39 -0
- package/dist/remote/src/handoff.js +38 -0
- package/dist/remote/src/host-service.js +168 -0
- package/dist/remote/src/images.js +215 -0
- package/dist/remote/src/local-control.js +138 -0
- package/dist/remote/src/main.js +264 -0
- package/dist/remote/src/permissions.js +124 -0
- package/dist/remote/src/power.js +76 -0
- package/dist/remote/src/processes.js +24 -0
- package/dist/remote/src/protocol.js +32 -0
- package/dist/remote/src/protocol.ts +284 -0
- package/dist/remote/src/push-content.js +32 -0
- package/dist/remote/src/push.js +134 -0
- package/dist/remote/src/receipts.js +111 -0
- package/dist/remote/src/relay.js +438 -0
- package/dist/remote/src/router.js +208 -0
- package/dist/remote/src/sdk-launcher.js +18 -0
- package/dist/remote/src/server.js +706 -0
- package/dist/remote/src/service.js +157 -0
- package/dist/remote/src/sessions.js +1800 -0
- package/dist/remote/src/sidebar-storage.js +211 -0
- package/dist/remote/src/sidebar.js +173 -0
- package/dist/remote/src/tool-details.js +205 -0
- package/dist/remote/src/tool-details.ts +153 -0
- package/dist/remote/src/worktree.js +99 -0
- package/dist/remote/web/app.ts +746 -0
- package/dist/remote/web/conn.ts +193 -0
- package/dist/remote/web/demo.ts +134 -0
- package/dist/remote/web/dom.ts +124 -0
- package/dist/remote/web/esc.ts +4 -0
- package/dist/remote/web/i18n.ts +374 -0
- package/dist/remote/web/icon.svg +1 -0
- package/dist/remote/web/index.html +24 -0
- package/dist/remote/web/manifest.webmanifest +10 -0
- package/dist/remote/web/mascot.ts +60 -0
- package/dist/remote/web/md.ts +78 -0
- package/dist/remote/web/notify.ts +55 -0
- package/dist/remote/web/pushstate.ts +27 -0
- package/dist/remote/web/secure.ts +109 -0
- package/dist/remote/web/sidebar.ts +106 -0
- package/dist/remote/web/style.css +311 -0
- package/dist/remote/web/sw.ts +48 -0
- package/dist/remote/web/timeline.ts +224 -0
- package/dist/remote/web/views.ts +323 -0
- package/dist/router/src/admin.js +227 -4
- package/dist/router/src/config.js +30 -0
- package/dist/router/src/index.js +39 -0
- package/dist/router/src/ingress/translate.js +6 -2
- package/dist/router/src/phone.js +82 -0
- package/dist/router/src/presets.js +3 -0
- package/dist/router/src/providers/anthropic-usage.js +33 -1
- package/dist/router/src/providers/chatgpt/index.js +41 -11
- package/dist/router/src/providers/chatgpt/translate.js +147 -7
- package/dist/router/src/providers/google/index.js +26 -0
- package/dist/router/src/providers/google/prompt-refusal.js +29 -0
- package/dist/router/src/providers/google/usage.js +257 -0
- package/dist/router/src/providers/grok/index.js +18 -0
- package/dist/router/src/providers/grok/usage.js +77 -0
- package/dist/router/src/providers/openai/index.js +29 -5
- package/dist/router/src/providers/openai/translate.js +260 -27
- package/dist/router/src/providers/opencode-usage.js +116 -0
- package/dist/router/src/proxy.js +339 -258
- package/dist/router/src/reasoning.js +157 -0
- package/dist/router/src/remote-host.js +320 -0
- package/dist/router/src/remote-tunnel.js +320 -0
- package/dist/router/src/requestlog.js +48 -39
- package/dist/router/src/thinking.js +20 -9
- package/dist/router/src/usage-history.js +227 -0
- package/dist/router/src/version.js +1 -1
- package/dist/ui/app.js +436 -59
- package/dist/ui/i18n.js +184 -0
- package/dist/ui/index.html +24 -5
- package/dist/ui/style.css +39 -0
- package/docs/ARCHITECTURE.md +164 -12
- package/package.json +7 -1
package/dist/mod/hooks/i18n.ts
CHANGED
|
@@ -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.
|
|
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.earlier': 'Show {count} earlier',
|
|
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',
|
|
@@ -501,6 +542,7 @@ 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': '초기화 중',
|
|
@@ -701,6 +743,10 @@ const KO: Record<Key, string> = {
|
|
|
701
743
|
'settings.appearance': '테마',
|
|
702
744
|
'settings.dark': '다크',
|
|
703
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': '설정',
|
|
@@ -744,6 +790,7 @@ const KO: Record<Key, string> = {
|
|
|
744
790
|
'agents.routerModel': '라우터 모델',
|
|
745
791
|
'agents.marker': '마커',
|
|
746
792
|
'agents.default': '기본값',
|
|
793
|
+
'agents.session': '세션 모델',
|
|
747
794
|
'agents.by': '{name} 배정',
|
|
748
795
|
'agents.thinking': '추론 중',
|
|
749
796
|
'agents.fallback': '▲ 대체 워커 실행: {reason}',
|
|
@@ -779,6 +826,7 @@ const KO: Record<Key, string> = {
|
|
|
779
826
|
'toasts.noVerdict': '판정 결과 없음',
|
|
780
827
|
'toasts.judgeUnavailable': '판정 모델 사용 불가',
|
|
781
828
|
'toasts.explicitMarker': '명시적 워커 마커',
|
|
829
|
+
'toasts.sessionTier': '메인 대화가 정한 등급: {tier}',
|
|
782
830
|
'toasts.workerFallback': 'ClaudeRipple: {reason}. {name} 워커로 대체 실행합니다.',
|
|
783
831
|
'toasts.modeEnded': '{name} 모드가 종료되었습니다.',
|
|
784
832
|
'toasts.yourPick': '사용자 직접 선택',
|
|
@@ -807,6 +855,7 @@ const KO: Record<Key, string> = {
|
|
|
807
855
|
'toasts.warmNoReply': '캐시 유지 중단: 포크 응답 없음',
|
|
808
856
|
'toasts.warmNoCache': '캐시 유지 중단: 캐시 미적중',
|
|
809
857
|
'toasts.providerQuota': 'ChatGPT 계정을 사용할 수 없거나 사용량 한도가 소진되었습니다.',
|
|
858
|
+
'toasts.logNotPlaced': '로그 창을 열 수 없습니다: {reason}',
|
|
810
859
|
'toasts.saveMode': '절약 모드',
|
|
811
860
|
'toasts.yourSettings': '사용자 설정',
|
|
812
861
|
'toasts.jevNetwork': 'Jev 네트워크 연결 불가',
|
|
@@ -902,7 +951,40 @@ const KO: Record<Key, string> = {
|
|
|
902
951
|
'settings.ladderWaiting': '라우터에서 모델 목록을 수신하는 중입니다.',
|
|
903
952
|
'jev.zenMissing': 'ClaudeRipple 설정에 OpenCode Zen 인증 키가 없습니다',
|
|
904
953
|
'agents.domainLevel': '{domain} / {level}',
|
|
905
|
-
'agents.
|
|
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.earlier': '이전 {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.
|
|
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.earlier': '显示更早的 {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.
|
|
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.earlier': '前の {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.
|
|
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.earlier': 'Ver {count} anteriores',
|
|
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.
|
|
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.earlier': 'Ver {count} anteriores',
|
|
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',
|
package/dist/mod/hooks/judge.ts
CHANGED
|
@@ -5,9 +5,15 @@ import type { Lang } from './i18n.ts'
|
|
|
5
5
|
|
|
6
6
|
const EFFORTS: readonly Effort[] = ['low', 'medium', 'high', 'xhigh', 'max']
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
// "xhigh for unusually difficult investigation, max only for the hardest open-ended problems" left
|
|
9
|
+
// a medium..max range at medium and high: 10-13..10-17 ran ~9,000 Opus requests with no max and 91
|
|
10
|
+
// xhigh, and Jev gave an architecture redesign 2% max (2026-10-19). Above high is now named by
|
|
11
|
+
// what hinges on judgment, so important plans and failed attempts can reach it.
|
|
12
|
+
export const EFFORT_JUDGE_SYSTEM = `Choose the reasoning effort this work deserves. This is a coding agent able to inspect files, run commands, and edit code, not merely answer a chat question.
|
|
13
|
+
Assess work volume, uncertainty, and the cost of mistakes, not message length. A short choice approving a build inherits the size of that build. Closing remarks need little effort. "Think hard" or thorough reasoning requires at least high; an explicit quick answer calls for low.
|
|
14
|
+
Low and medium are only for turns that need no judgment: low for chit-chat, thanks, or a direct answer needing no inspection; medium for one fully specified, low-risk step the user spelled out (run this command, rename this). Ordinary coding that asks the agent to decide, explain why, review, verify, debug with a known direction, delegate, or change more than one thing is high.
|
|
15
|
+
Go above high when the outcome hinges on judgment rather than labor. xhigh: debugging whose cause is unknown, changes across interacting modules, or planning a feature. max: decisions that shape the product or system (architecture, an important plan or strategy, a design meant to last), work where a wrong call risks security, money, or data loss, and problems that earlier attempts in this conversation failed to solve. Not every plan is max; a small or routine plan is high or xhigh.
|
|
16
|
+
When the user says the previous attempt failed, is wrong, or still does not work, choose at least one level above the running effort. Other corrections and steering keep at least the running effort. Consider the current model's strength.
|
|
11
17
|
Return only JSON {"effort":"low|medium|high|xhigh|max","sure":0.0,"why":"short reason"}. Confidence is between zero and one. The reason uses the user's language and at most six words.`
|
|
12
18
|
|
|
13
19
|
/** A terse continuation usually carries no new scope; answers to questions are handled separately. */
|
|
@@ -16,6 +22,11 @@ export function isShortFollowUp(text: string): boolean {
|
|
|
16
22
|
return trimmed.length > 0 && trimmed.length <= 12 && trimmed.split(/\s+/).length <= 2
|
|
17
23
|
}
|
|
18
24
|
|
|
25
|
+
/** "Still broken" is short but asks for more thought, so it is judged rather than inheriting the effort that failed. */
|
|
26
|
+
export function looksLikeRetry(text: string): boolean {
|
|
27
|
+
return /안\s*[돼되]|다시|틀렸|아직|여전|그대로|실패|\bstill\b|\bagain\b|\bwrong\b|\bbroken\b|n['’]?t work|\bfail/i.test(text)
|
|
28
|
+
}
|
|
29
|
+
|
|
19
30
|
export function looksLikeQuestion(assistantTail: string): boolean {
|
|
20
31
|
return assistantTail.slice(-400).includes('?')
|
|
21
32
|
}
|
|
@@ -28,7 +39,7 @@ export function shouldJudge(input: {
|
|
|
28
39
|
if (!input.auto || !['composer', 'bridge', 'sdk'].includes(input.origin) || (!input.text.trim() && !input.attachments?.length) || input.hostCommand) return false
|
|
29
40
|
if (input.modelId !== undefined && !isCacheSafeModel(input.modelId)) return false
|
|
30
41
|
const followup = input.current && input.current.by !== 'manual' && !input.text.trim().startsWith('/') &&
|
|
31
|
-
!input.attachments?.length && isShortFollowUp(input.text) && !looksLikeQuestion(input.assistantTail ?? '')
|
|
42
|
+
!input.attachments?.length && isShortFollowUp(input.text) && !looksLikeRetry(input.text) && !looksLikeQuestion(input.assistantTail ?? '')
|
|
32
43
|
return !followup
|
|
33
44
|
}
|
|
34
45
|
|
|
@@ -110,16 +121,19 @@ function looseVerdictObject(text: string): Record<string, unknown> | undefined {
|
|
|
110
121
|
}
|
|
111
122
|
|
|
112
123
|
const effortCriteria = {
|
|
113
|
-
low: '
|
|
114
|
-
medium: '
|
|
115
|
-
high: '
|
|
116
|
-
xhigh: '
|
|
117
|
-
max: '
|
|
118
|
-
}
|
|
124
|
+
low: 'Chit-chat, thanks, or a direct answer needing no inspection.',
|
|
125
|
+
medium: 'One fully specified, low-risk step the user spelled out.',
|
|
126
|
+
high: 'Ordinary coding: implement, fix, review, or debug with a known direction.',
|
|
127
|
+
xhigh: 'Debugging with an unknown cause, changes across interacting modules, or planning a feature.',
|
|
128
|
+
max: 'Product or architecture decisions, important plans or strategy, security or data-loss risk, or a problem earlier attempts failed to solve.',
|
|
129
|
+
}
|
|
130
|
+
// Read with the brief, the old wording sent 49 of 64 delegated tasks to deep, against 19 from their
|
|
131
|
+
// one-line descriptions alone: a brief's warnings ("do not restart", "read-only", "no guessing")
|
|
132
|
+
// read as high stakes. Re-judged with this wording the same briefs give 28 (2026-10-15, pick log).
|
|
119
133
|
const levelCriteria = {
|
|
120
|
-
light: 'Mechanical chores, repeated
|
|
121
|
-
standard: '
|
|
122
|
-
deep: '
|
|
134
|
+
light: 'Mechanical chores, repeated edits, simple lookups, or one small fix.',
|
|
135
|
+
standard: 'Carry out a designed change, even across several files; research, summarize, or review read-only.',
|
|
136
|
+
deep: 'Subtle debugging, security review, or architecture where a wrong call is costly. Size, file count, or warnings and prohibitions in the brief do not by themselves make work deep.',
|
|
123
137
|
}
|
|
124
138
|
const domainCriteria: Record<Domain, string> = {
|
|
125
139
|
design: 'Visual composition, branding, taste, look and voice of copy.',
|
|
@@ -188,10 +202,14 @@ export function parseJevWorker(json: unknown): WorkerVerdict | undefined {
|
|
|
188
202
|
const effortAnswer = record(reply?.effort)
|
|
189
203
|
const selectedEffort = effort(effortAnswer?.choice)
|
|
190
204
|
if (!domainAnswer || !DOMAINS.includes(domainAnswer.choice as Domain) || !levelAnswer || !LEVELS.includes(levelAnswer.choice as Level) || !effortAnswer || !selectedEffort) return undefined
|
|
191
|
-
// Confidence moves a task up the ladder, so it is the level's question that counts
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
205
|
+
// Confidence moves a task up the ladder, so it is the level's question that counts. The lowest of
|
|
206
|
+
// all three counted before: torn only between frontend and backend, or high and xhigh, a task
|
|
207
|
+
// judged standard was sent a rung up (4 of 16 standard verdicts, pick log 2026-10-12..15).
|
|
208
|
+
const kindAnswer = record(reply?.kind)
|
|
209
|
+
const kind = kindOf(kindAnswer?.choice) ?? 'do'
|
|
210
|
+
const odds = { domain: answerSure(domainAnswer), level: answerSure(levelAnswer), kind: kindAnswer ? answerSure(kindAnswer) : undefined, effort: answerSure(effortAnswer) }
|
|
211
|
+
const known = Object.fromEntries(Object.entries(odds).filter(([, score]) => score !== undefined)) as WorkerVerdict['odds']
|
|
212
|
+
return { domain: domainAnswer.choice as Domain, level: levelAnswer.choice as Level, kind, effort: selectedEffort, ...(odds.level !== undefined ? { sure: odds.level } : {}), ...(Object.keys(known!).length ? { odds: known } : {}), why: '' }
|
|
195
213
|
}
|
|
196
214
|
|
|
197
215
|
export function jevUsage(json: unknown): number {
|