Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
826 changes: 709 additions & 117 deletions CLI/cmux.swift

Large diffs are not rendered by default.

20 changes: 20 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -60503,6 +60503,22 @@
}
}
},
"settings.automation.suppressSubagentNotifications": {
"extractionState": "manual",
"localizations": {"ar":{"stringUnit":{"state":"translated","value":"إخفاء إشعارات الوكلاء الفرعيين"}},"bs":{"stringUnit":{"state":"translated","value":"Sakrij obavještenja podagenata"}},"da":{"stringUnit":{"state":"translated","value":"Skjul underagent-notifikationer"}},"de":{"stringUnit":{"state":"translated","value":"Unteragent-Benachrichtigungen unterdrücken"}},"en":{"stringUnit":{"state":"translated","value":"Suppress Subagent Notifications"}},"es":{"stringUnit":{"state":"translated","value":"Suprimir notificaciones de subagentes"}},"fr":{"stringUnit":{"state":"translated","value":"Masquer les notifications des sous-agents"}},"it":{"stringUnit":{"state":"translated","value":"Nascondi notifiche dei sottoagenti"}},"ja":{"stringUnit":{"state":"translated","value":"サブエージェント通知を抑制"}},"ko":{"stringUnit":{"state":"translated","value":"하위 에이전트 알림 억제"}},"nb":{"stringUnit":{"state":"translated","value":"Undertrykk underagentvarsler"}},"pl":{"stringUnit":{"state":"translated","value":"Ukryj powiadomienia podagentów"}},"pt-BR":{"stringUnit":{"state":"translated","value":"Suprimir notificações de subagentes"}},"ru":{"stringUnit":{"state":"translated","value":"Подавлять уведомления подагентов"}},"th":{"stringUnit":{"state":"translated","value":"ซ่อนการแจ้งเตือนของเอเจนต์ย่อย"}},"tr":{"stringUnit":{"state":"translated","value":"Alt ajan bildirimlerini gizle"}},"uk":{"stringUnit":{"state":"translated","value":"Приховати сповіщення підлеглих агентів"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"隐藏子代理通知"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"隱藏子代理通知"}}}
},
"settings.automation.suppressSubagentNotifications.note": {
"extractionState": "manual",
"localizations": {"ar":{"stringUnit":{"state":"translated","value":"يستخدم تسلسل العمليات الأبوي من عمليات الخطافات. عطّله إذا كان يجب أن تطلق جلسات Codex أو Claude المتداخلة إشعارات الإكمال."}},"bs":{"stringUnit":{"state":"translated","value":"Koristi hijerarhiju procesa iz hook procesa. Isključite ako ugniježđene Codex ili Claude sesije trebaju slati obavještenja o završetku."}},"da":{"stringUnit":{"state":"translated","value":"Bruger proceshierarki fra hook-processer. Slå fra, hvis indlejrede Codex- eller Claude-sessioner skal udløse fuldførelsesnotifikationer."}},"de":{"stringUnit":{"state":"translated","value":"Verwendet die Prozessabstammung der Hook-Prozesse. Deaktivieren, wenn verschachtelte Codex- oder Claude-Sitzungen Abschlussbenachrichtigungen auslösen sollen."}},"en":{"stringUnit":{"state":"translated","value":"Uses process ancestry from hook processes. Disable if nested Codex or Claude sessions should trigger completion notifications."}},"es":{"stringUnit":{"state":"translated","value":"Usa la ascendencia de procesos de los hooks. Desactívalo si las sesiones anidadas de Codex o Claude deben generar notificaciones de finalización."}},"fr":{"stringUnit":{"state":"translated","value":"Utilise l’ascendance des processus de hooks. Désactivez cette option si les sessions Codex ou Claude imbriquées doivent déclencher des notifications de fin."}},"it":{"stringUnit":{"state":"translated","value":"Usa la gerarchia dei processi dei hook. Disattiva se le sessioni Codex o Claude annidate devono inviare notifiche di completamento."}},"ja":{"stringUnit":{"state":"translated","value":"フックプロセスの親子関係を使用します。ネストされた Codex または Claude セッションでも完了通知を出したい場合は無効にしてください。"}},"ko":{"stringUnit":{"state":"translated","value":"훅 프로세스의 상위 프로세스 관계를 사용합니다. 중첩된 Codex 또는 Claude 세션도 완료 알림을 보내야 한다면 비활성화하세요."}},"nb":{"stringUnit":{"state":"translated","value":"Bruker prosesshierarki fra hook-prosesser. Slå av hvis innebygde Codex- eller Claude-økter skal utløse fullføringsvarsler."}},"pl":{"stringUnit":{"state":"translated","value":"Używa hierarchii procesów hooków. Wyłącz, jeśli zagnieżdżone sesje Codex lub Claude mają wywoływać powiadomienia o zakończeniu."}},"pt-BR":{"stringUnit":{"state":"translated","value":"Usa a hierarquia de processos dos hooks. Desative se sessões aninhadas do Codex ou Claude devem disparar notificações de conclusão."}},"ru":{"stringUnit":{"state":"translated","value":"Использует иерархию процессов из hook-процессов. Отключите, если вложенные сеансы Codex или Claude должны отправлять уведомления о завершении."}},"th":{"stringUnit":{"state":"translated","value":"ใช้ลำดับชั้นของโปรเซสจากโปรเซส hook ปิดตัวเลือกนี้หากเซสชัน Codex หรือ Claude แบบซ้อนควรส่งการแจ้งเตือนเมื่อเสร็จ"}},"tr":{"stringUnit":{"state":"translated","value":"Hook süreçlerinin üst işlem zincirini kullanır. İç içe Codex veya Claude oturumları tamamlanma bildirimi göndermeliyse kapatın."}},"uk":{"stringUnit":{"state":"translated","value":"Використовує ієрархію процесів із hook-процесів. Вимкніть, якщо вкладені сеанси Codex або Claude мають надсилати сповіщення про завершення."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"使用 hook 进程的进程层级。若嵌套的 Codex 或 Claude 会话应触发完成通知,请将其关闭。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"使用 hook 程序的程序層級。若巢狀 Codex 或 Claude 工作階段應觸發完成通知,請將其關閉。"}}}
},
"settings.automation.suppressSubagentNotifications.subtitleOff": {
"extractionState": "manual",
"localizations": {"ar":{"stringUnit":{"state":"translated","value":"تُرسل إكمالات الوكلاء الفرعيين إشعارات مثل الوكلاء الأعلى مستوى."}},"bs":{"stringUnit":{"state":"translated","value":"Završeci dječijih agenata šalju obavještenja kao agenti najvišeg nivoa."}},"da":{"stringUnit":{"state":"translated","value":"Underagenters fuldførelser giver besked som topniveau-agenter."}},"de":{"stringUnit":{"state":"translated","value":"Abschlüsse von Unteragenten benachrichtigen wie Top-Level-Agenten."}},"en":{"stringUnit":{"state":"translated","value":"Child agent completions notify like top-level agents."}},"es":{"stringUnit":{"state":"translated","value":"Las finalizaciones de agentes secundarios notifican como agentes de nivel superior."}},"fr":{"stringUnit":{"state":"translated","value":"Les fins d’agents enfants notifient comme les agents de premier niveau."}},"it":{"stringUnit":{"state":"translated","value":"I completamenti degli agenti figli inviano notifiche come gli agenti di primo livello."}},"ja":{"stringUnit":{"state":"translated","value":"子エージェントの完了もトップレベルのエージェントと同様に通知します。"}},"ko":{"stringUnit":{"state":"translated","value":"하위 에이전트 완료도 최상위 에이전트처럼 알립니다."}},"nb":{"stringUnit":{"state":"translated","value":"Fullføringer fra underagenter varsler som toppnivåagenter."}},"pl":{"stringUnit":{"state":"translated","value":"Ukończenia agentów podrzędnych powiadamiają jak agenci najwyższego poziomu."}},"pt-BR":{"stringUnit":{"state":"translated","value":"Conclusões de agentes filhos notificam como agentes de nível superior."}},"ru":{"stringUnit":{"state":"translated","value":"Завершения дочерних агентов уведомляют как агенты верхнего уровня."}},"th":{"stringUnit":{"state":"translated","value":"การทำงานเสร็จของเอเจนต์ลูกจะแจ้งเตือนเหมือนเอเจนต์ระดับบนสุด"}},"tr":{"stringUnit":{"state":"translated","value":"Alt ajan tamamlanmaları üst düzey ajanlar gibi bildirim gönderir."}},"uk":{"stringUnit":{"state":"translated","value":"Завершення дочірніх агентів сповіщають як агенти верхнього рівня."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"子代理完成时会像顶层代理一样通知。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"子代理完成時會像頂層代理一樣通知。"}}}
},
"settings.automation.suppressSubagentNotifications.subtitleOn": {
"extractionState": "manual",
"localizations": {"ar":{"stringUnit":{"state":"translated","value":"تبقى إكمالات الوكلاء الفرعيين في Feed بدون إشعارات."}},"bs":{"stringUnit":{"state":"translated","value":"Završeci dječijih agenata ostaju u Feed-u bez obavještenja."}},"da":{"stringUnit":{"state":"translated","value":"Underagenters fuldførelser bliver i Feed uden notifikationer."}},"de":{"stringUnit":{"state":"translated","value":"Abschlüsse von Unteragenten bleiben ohne Benachrichtigungen im Feed."}},"en":{"stringUnit":{"state":"translated","value":"Child agent completions stay in Feed without notifications."}},"es":{"stringUnit":{"state":"translated","value":"Las finalizaciones de agentes secundarios permanecen en Feed sin notificaciones."}},"fr":{"stringUnit":{"state":"translated","value":"Les fins d’agents enfants restent dans Feed sans notifications."}},"it":{"stringUnit":{"state":"translated","value":"I completamenti degli agenti figli restano in Feed senza notifiche."}},"ja":{"stringUnit":{"state":"translated","value":"子エージェントの完了は通知せずFeedにのみ残ります。"}},"ko":{"stringUnit":{"state":"translated","value":"하위 에이전트 완료는 알림 없이 Feed에만 남습니다."}},"nb":{"stringUnit":{"state":"translated","value":"Fullføringer fra underagenter blir i Feed uten varsler."}},"pl":{"stringUnit":{"state":"translated","value":"Ukończenia agentów podrzędnych pozostają w Feed bez powiadomień."}},"pt-BR":{"stringUnit":{"state":"translated","value":"Conclusões de agentes filhos ficam no Feed sem notificações."}},"ru":{"stringUnit":{"state":"translated","value":"Завершения дочерних агентов остаются в Feed без уведомлений."}},"th":{"stringUnit":{"state":"translated","value":"การทำงานเสร็จของเอเจนต์ลูกจะอยู่ใน Feed โดยไม่มีการแจ้งเตือน"}},"tr":{"stringUnit":{"state":"translated","value":"Alt ajan tamamlanmaları bildirim olmadan Feed’de kalır."}},"uk":{"stringUnit":{"state":"translated","value":"Завершення дочірніх агентів залишаються у Feed без сповіщень."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"子代理完成事件会留在 Feed 中且不通知。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"子代理完成事件會留在 Feed 中且不通知。"}}}
},
"settings.automation.cursor": {
"extractionState": "manual",
"localizations": {
Expand Down Expand Up @@ -78566,6 +78582,10 @@
}
}
},
"settings.search.alias.setting.automation.subagent-notifications": {
"extractionState": "manual",
"localizations": {"ar":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications وكيل فرعي متداخل طفل codex claude hook إشعارات"}},"bs":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications podagent ugniježđen dječiji agent codex claude hook obavještenja"}},"da":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications underagent indlejret børneagent codex claude hooks notifikationer"}},"de":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications unteragent verschachtelt kindagent codex claude hooks benachrichtigungen"}},"en":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications subagent nested child agent codex claude hooks notifications"}},"es":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications subagente anidado agente secundario codex claude hooks notificaciones"}},"fr":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications sous-agent imbriqué agent enfant codex claude hooks notifications"}},"it":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications sottoagente annidato agente figlio codex claude hook notifiche"}},"ja":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications サブエージェント ネスト 子エージェント codex claude フック 通知"}},"ko":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications 하위 에이전트 중첩 자식 에이전트 codex claude 훅 알림"}},"nb":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications underagent innebygd barneagent codex claude hooks varsler"}},"pl":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications podagent zagnieżdżony agent podrzędny codex claude hooki powiadomienia"}},"pt-BR":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications subagente aninhado agente filho codex claude hooks notificações"}},"ru":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications подагент вложенный дочерний агент codex claude hooks уведомления"}},"th":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications เอเจนต์ย่อย ซ้อน เอเจนต์ลูก codex claude hook การแจ้งเตือน"}},"tr":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications alt ajan iç içe çocuk ajan codex claude hook bildirimler"}},"uk":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications підагент вкладений дочірній агент codex claude hooks сповіщення"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications 子代理 嵌套 子级代理 codex claude hooks 通知"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"automation.suppressSubagentNotifications 子代理 巢狀 子級代理 codex claude hooks 通知"}}}
},
"settings.search.alias.setting.automation.cursor": {
"extractionState": "manual",
"localizations": {
Expand Down
4 changes: 3 additions & 1 deletion Resources/bin/claude
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,9 @@ fi
# This is Claude Code's native blocking decision hook. It covers
# permissions, ExitPlanMode, and AskUserQuestion without using
# PreToolUse denial as a side channel.
HOOKS_JSON='{"preferredNotifChannel":"notifications_disabled","hooks":{"SessionStart":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude session-start","timeout":10}]}],"Stop":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude stop","timeout":10}]},{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks feed --source claude","timeout":10,"async":true}]}],"SessionEnd":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude session-end","timeout":1}]}],"Notification":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude notification","timeout":10}]}],"UserPromptSubmit":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude prompt-submit","timeout":10}]}],"PreToolUse":[{"matcher":"CronCreate","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude cron-create-guard","timeout":5}]},{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude pre-tool-use","timeout":5,"async":true}]}],"PermissionRequest":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks feed --source claude","timeout":125}]}]}}'
# - SubagentStop: feed telemetry only. It must not run the visible Stop
# hook because a subagent finishing should not notify like the parent.
HOOKS_JSON='{"preferredNotifChannel":"notifications_disabled","hooks":{"SessionStart":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude session-start","timeout":10}]}],"Stop":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude stop","timeout":10}]},{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks feed --source claude","timeout":10,"async":true}]}],"SubagentStop":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks feed --source claude","timeout":10,"async":true}]}],"SessionEnd":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude session-end","timeout":1}]}],"Notification":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude notification","timeout":10}]}],"UserPromptSubmit":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude prompt-submit","timeout":10}]}],"PreToolUse":[{"matcher":"CronCreate","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude cron-create-guard","timeout":5}]},{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks claude pre-tool-use","timeout":5,"async":true}]}],"PermissionRequest":[{"matcher":"","hooks":[{"type":"command","command":"\"${CMUX_CLAUDE_HOOK_CMUX_BIN:-cmux}\" hooks feed --source claude","timeout":125}]}]}}'

if [[ "$SKIP_SESSION_ID" == true ]]; then
exec "$REAL_CLAUDE" --settings "$HOOKS_JSON" "$@"
Expand Down
1 change: 1 addition & 0 deletions Sources/CmuxSettingsJSONPathSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ extension CmuxSettingsFileStore {
"automation.claudeCodeIntegration",
"automation.claudeBinaryPath",
"automation.ripgrepBinaryPath",
"automation.suppressSubagentNotifications",
"automation.cursorIntegration",
"automation.geminiIntegration",
"automation.portBase",
Expand Down
Loading
Loading