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
Original file line number Diff line number Diff line change
Expand Up @@ -112033,127 +112033,127 @@
"en": {
"stringUnit": {
"state": "translated",
"value": "What a new chat may do without asking. Picking a mode in a chat sets it too, until you change this setting again."
"value": "What a new chat may do without asking. A mode you pick in a chat applies to that chat only."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "新しいチャットが確認なしで行えることです。チャットでモードを選んでも設定されます。この設定をもう一度変更するまで有効です。"
"value": "新しいチャットが確認なしで行えることです。チャットで選んだモードはそのチャットにだけ適用されます。"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "Was ein neuer Chat ohne Nachfrage tun darf. Auch die Wahl eines Modus in einem Chat legt ihn fest, bis du diese Einstellung erneut änderst."
"value": "Was ein neuer Chat ohne Nachfrage tun darf. Ein Modus, den du in einem Chat wählst, gilt nur für diesen Chat."
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "Ce qu’une nouvelle discussion peut faire sans demander. Choisir un mode dans une discussion le définit aussi, jusqu’à ce que vous modifiiez à nouveau ce réglage."
"value": "Ce qu’une nouvelle discussion peut faire sans demander. Un mode choisi dans une discussion ne s’applique qu’à cette discussion."
}
},
"ar": {
"stringUnit": {
"state": "translated",
"value": "ما يمكن للمحادثة الجديدة فعله دون أن تسأل. اختيار وضع في محادثة يضبطه أيضًا، إلى أن تغيّر هذا الإعداد مرة أخرى."
"value": "ما يمكن للمحادثة الجديدة فعله دون أن تسأل. الوضع الذي تختاره في محادثة ينطبق على تلك المحادثة فقط."
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "Lo que un chat nuevo puede hacer sin preguntar. Elegir un modo en un chat también lo establece, hasta que vuelvas a cambiar este ajuste."
"value": "Lo que un chat nuevo puede hacer sin preguntar. Un modo que elijas en un chat se aplica solo a ese chat."
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "新聊天不經詢問即可執行的操作。在聊天中選擇模式也會設定此項,直到你再次變更此設定。"
"value": "新聊天不經詢問即可執行的操作。在聊天中選擇的模式只套用於該聊天。"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "新聊天无需询问即可执行的操作。在聊天中选择模式也会设置此项,直到你再次更改此设置。"
"value": "新聊天无需询问即可执行的操作。在聊天中选择的模式只应用于该聊天。"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "새 채팅이 묻지 않고 할 수 있는 작업입니다. 채팅에서 모드를 고르면 이 설정을 다시 바꿀 때까지 그 모드가 적용됩니다."
"value": "새 채팅이 묻지 않고 할 수 있는 작업입니다. 채팅에서 고른 모드는 그 채팅에만 적용됩니다."
}
},
"bs": {
"stringUnit": {
"state": "translated",
"value": "Šta novi razgovor smije raditi bez pitanja. Odabir načina u razgovoru također ga postavlja, dok ponovo ne promijenite ovu postavku."
"value": "Šta novi razgovor smije raditi bez pitanja. Način koji odaberete u razgovoru važi samo za taj razgovor."
}
},
"da": {
"stringUnit": {
"state": "translated",
"value": "Hvad en ny chat må gøre uden at spørge. Når du vælger en tilstand i en chat, gælder den også, indtil du ændrer denne indstilling igen."
"value": "Hvad en ny chat må gøre uden at spørge. En tilstand, du vælger i en chat, gælder kun for den chat."
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "Cosa può fare una nuova chat senza chiedere. Anche scegliere una modalità in una chat la imposta, finché non modifichi di nuovo questa impostazione."
"value": "Cosa può fare una nuova chat senza chiedere. Una modalità scelta in una chat vale solo per quella chat."
}
},
"km": {
"stringUnit": {
"state": "translated",
"value": "អ្វីដែលការជជែកថ្មីអាចធ្វើបានដោយមិនសួរ។ ការជ្រើសរើសរបៀបក្នុងការជជែកក៏កំណត់វាដែរ រហូតដល់អ្នកផ្លាស់ប្ដូរការកំណត់នេះម្ដងទៀត។"
"value": "អ្វីដែលការជជែកថ្មីអាចធ្វើបានដោយមិនសួរ។ របៀបដែលអ្នកជ្រើសរើសក្នុងការជជែកមួយ អនុវត្តចំពោះតែការជជែកនោះប៉ុណ្ណោះ។"
}
},
"nb": {
"stringUnit": {
"state": "translated",
"value": "Hva en ny chat kan gjøre uten å spørre. Velger du en modus i en chat, gjelder den også, til du endrer denne innstillingen igjen."
"value": "Hva en ny chat kan gjøre uten å spørre. En modus du velger i en chat, gjelder bare for den chatten."
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "Co nowy czat może robić bez pytania. Wybranie trybu w czacie także go ustawia, dopóki ponownie nie zmienisz tego ustawienia."
"value": "Co nowy czat może robić bez pytania. Tryb wybrany w czacie dotyczy tylko tego czatu."
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "O que um novo chat pode fazer sem perguntar. Escolher um modo em um chat também o define, até você alterar este ajuste de novo."
"value": "O que um novo chat pode fazer sem perguntar. Um modo escolhido em um chat vale só para aquele chat."
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "Что новый чат может делать без вопросов. Выбор режима в чате тоже задаёт его, пока вы снова не измените этот параметр."
"value": "Что новый чат может делать без вопросов. Режим, выбранный в чате, действует только в этом чате."
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "สิ่งที่แชตใหม่ทำได้โดยไม่ต้องถาม การเลือกโหมดในแชตก็ตั้งค่านี้ด้วย จนกว่าคุณจะเปลี่ยนการตั้งค่านี้อีกครั้ง"
"value": "สิ่งที่แชตใหม่ทำได้โดยไม่ต้องถาม โหมดที่คุณเลือกในแชตจะใช้กับแชตนั้นเท่านั้น"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "Yeni bir sohbetin sormadan yapabilecekleri. Bir sohbette mod seçmek de bunu ayarlar; bu ayarı yeniden değiştirene kadar geçerlidir."
"value": "Yeni bir sohbetin sormadan yapabilecekleri. Bir sohbette seçtiğiniz mod yalnızca o sohbet için geçerlidir."
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "Що новий чат може робити без запитань. Вибір режиму в чаті теж задає його, доки ви знову не зміните це налаштування."
"value": "Що новий чат може робити без запитань. Режим, вибраний у чаті, діє лише в цьому чаті."
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "Những gì cuộc trò chuyện mới được làm mà không cần hỏi. Chọn chế độ trong cuộc trò chuyện cũng đặt giá trị này, cho đến khi bạn đổi lại cài đặt này."
"value": "Những gì cuộc trò chuyện mới được làm mà không cần hỏi. Chế độ bạn chọn trong một cuộc trò chuyện chỉ áp dụng cho cuộc trò chuyện đó."
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import CmuxNextDesign
/// The defaults a new agent chat starts with (Agents > Agent Chat). acpmux
/// reads `agents.defaultPermissionMode` at each new chat
/// (`cmux-tui/crates/acpmux/src/hub/start_mode.rs`): a mode picked in a chat
/// wins until this setting changes again. A value MDM or the team policy
/// forces reaches acpmux through the app's settings push (`ChatSettings`)
/// and wins over every pick.
/// applies to that chat only (Leo 2026-10-21). A value MDM or the team
/// policy forces reaches acpmux through the app's settings push
/// (`ChatSettings`) and wins over the settings file.
nonisolated enum AgentDefaultsSettingsSchema {
static let permissionModePath = ["agents", "defaultPermissionMode"]

Expand All @@ -15,7 +15,7 @@ nonisolated enum AgentDefaultsSettingsSchema {
group: SettingsText.keyed("settings.group.agentChat", "Agent Chat"),
title: SettingsText.keyed("settings.agents.defaultPermissionMode", "Permission Mode for New Chats"),
help: SettingsText.keyed("settings.agents.defaultPermissionMode.help",
"What a new chat may do without asking. Picking a mode in a chat sets it too, until you change this setting again."),
"What a new chat may do without asking. A mode you pick in a chat applies to that chat only."),
kind: .choice([
SettingChoice("fullAccess", SettingsText.keyed("settings.choice.permissionFullAccess", "Full Access")),
SettingChoice("standard", SettingsText.keyed("settings.choice.permissionStandard", "Harness Default")),
Expand Down
2 changes: 1 addition & 1 deletion cmux-tui/crates/acpmux/docs/acpmux-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"_acpmux/stats": {"params": {"days": "number? default 84, at most 366", "tzOffsetMinutes": "number? the caller's UTC offset (east positive), default 0"}, "result": {"since": "number", "until": "number", "tzOffsetMinutes": "number", "sessions": "number (sessions with a turn in range)", "turns": "number", "turnsCompleted": "number", "turnsCancelled": "number", "turnsFailed": "number", "prompts": "number", "steers": "number", "toolCalls": "number", "permissionRequests": "number", "permissionAuto": "number", "workingMs": "number (turn time summed over sessions)", "waitingMs": "number (time waiting on a permission answer)", "peakParallel": "number", "peakParallelAt": "number|null", "harnesses": "{harness, sessions, turns, workingMs}[] most working time first", "branches": "{cwd, branch, sessions, turns, workingMs, costUsd?, inputTokens?, outputTokens?, cacheReadTokens?, cacheWriteTokens?}[] per git branch each turn ended on (its turn_result gitBranch; a turn that recorded none, as in older logs, counts on the branch its session started on, session.json gitBranch) and the session's cwd as given (a subfolder of the same checkout is another row), most working time first, at most 50: the range's turns with the spend their turn_result records carry (never the session totals), a spend field absent when no counted turn reported it; a session whose turns ended on several branches is a session of each; turns with no branch either way are left out", "days": "{day: YYYY-MM-DD, turns, workingMs}[] oldest first, active days only", "hours": "number[24] working ms per hour of the caller's day", "streak": "{current, longest} days in a row with a finished turn, over the last 366 days whatever the range"}, "errors": "Method not found over any WebSocket (Web, LocalApp, Peer)", "note": "Local unix socket only (hq#1920): counts and times, never prompt or tool text. One offset applies to the whole range, so days before a DST change shift by an hour. A turn or wait the daemon lost when it died ends at the session's last record before the loss: at the restart's own record (turn_result detail outcome_unknown, or status idle detail restart, which a restart writes for a session it found waiting), or at the end of the log when this daemon does not hold the session running or waiting; older logs without the restart record end such a wait at the next status. A prompt ends a wait left after its turn at the prompt's time. A prompt that never got turn_started and never settled counts as a prompt, not a turn. A steer sent again as the next prompt (same promptId) counts once, as the prompt. A fork's log starts with copies of its parent's prompts, tool calls and turns before its forked record: they count only in the parent's log, in every total, day, hour, streak and peakParallel, and not at all once that log is gone. branches follows a session that switches branch: each turn counts on the branch its turn_result recorded it ended on, else on the branch the session started on."},
"_acpmux/wait": {"params": {"sessions": "string[]? (empty = every running or waiting session on every host)", "until": "('ready'|'permission'|'closed'|'done'|'running')[]? default ready+permission", "all": "boolean? default false (first to resolve)", "afterSeq": "{sessionId: number}?", "timeoutMs": "number?"}, "result": {"sessions": "SessionSummary[] with resolved: boolean and matched: string[]", "resolved": "SessionSummary[]", "timedOut": "boolean"}},
"_acpmux/warm": {"params": {"sessionIds": "string[]?", "limit": "number?"}, "result": {"warmed": "{sessionId,cwd}[]"}, "note": "Starts and initializes one live agent child for each of the most recent requested project sessions; it does not create or select sessions."},
"_acpmux/start_mode": {"params": {"harness": "string? (a family or profile; default the default harness)", "preset": "string?", "cwd": "string?"}, "result": {"harness": "string (the profile)", "modeId": "string|null (null: acpmux would set no start mode: a preset, folder-profile or remote-origin chat, a profile that pins its mode in argv, a level that keeps the harness's own mode, or modes not known yet)", "name": "string|null (the mode's display name)", "level": "\"fullAccess\"|\"standard\"|\"ask\"|null", "source": "\"managed\"|\"pick\"|\"config\"|\"settings\"|\"default\"|null"}, "note": "Read only. The mode a plain new chat on that harness would start in now, by the same rules session/new applies (hub/start_mode.rs). A remote-origin (Web, peer) connection gets the all-null answer before its cwd, preset or harness is resolved: its chats get no start mode. Local watchers get _acpmux/start_mode_changed {} when the answer may have changed (a saved pick, a config reload)."},
"_acpmux/start_mode": {"params": {"harness": "string? (a family or profile; default the default harness)", "preset": "string?", "cwd": "string?"}, "result": {"harness": "string (the profile)", "modeId": "string|null (null: acpmux would set no start mode: a preset, folder-profile or remote-origin chat, a profile that pins its mode in argv, a level that keeps the harness's own mode, or modes not known yet)", "name": "string|null (the mode's display name)", "level": "\"fullAccess\"|\"standard\"|\"ask\"|null", "source": "\"managed\"|\"policy\"|\"config\"|\"settings\"|\"default\"|null"}, "note": "Read only. The mode a plain new chat on that harness would start in now, by the same rules session/new applies (hub/start_mode.rs). A remote-origin (Web, peer) connection gets the all-null answer before its cwd, preset or harness is resolved: its chats get no start mode. Local watchers get _acpmux/start_mode_changed {} when the answer may have changed (the setting, a config reload)."},
"_acpmux/prewarm": {"params": {"harness": "string? (a family or profile; default the default harness)", "preset": "string?", "cwd": "string? (default the newest session's cwd)", "wait": "boolean? default false (answer once the hinted session is ready or failed)"}, "result": {"accepted": "boolean", "reason": "string? (accepted false: the pool is off)", "superseded": "boolean? (wait: a newer hint replaced this one)", "pool": "PoolStatus? (wait)"}, "errors": "invalid_params over a remote-origin connection (never pooled)", "note": "Hints the harness the pane is about to switch to. After the debounce (pool.debounceMs, default 150) only the newest hint counts: a hidden session for it starts in that cwd (agent host, initialize and the harness session done). Per cwd at most two are kept: the harness used before the current one and the hinted one. A session/new of exactly that shape (cwd, harness, preset, argv, system prompt, env and credentials, account) takes it at once. Hidden sessions never appear in _acpmux/sessions or liveAgents and leave nothing in the store unless taken; _acpmux/status pool lists them as {entries: [{harness, preset, cwd, roles, state}], rssBytes}. They exit after pool.idleMinutes (default 10) unused, under pool.maxRssMb (default 1024, oldest first) and at shutdown."},
"_acpmux/rename": {"params": {"sessionId": "string", "newName": "string"}, "result": "SessionSummary"},
"_acpmux/kill": {"params": {"sessionId": "string", "purge": "boolean?"}, "result": {"sessionId": "string", "purged": "boolean"}},
Expand Down
Loading
Loading