vibe-coding-master 0.4.30 → 0.4.32

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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f2ea;color:#1c2024;line-height:1.5}html,body,#root{height:100%}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f2ea}button,input,select,textarea{font:inherit}button{border:1px solid #9ba6ad;background:#f8f7f2;color:#1d252b;border-radius:6px;min-height:34px;padding:6px 10px;cursor:pointer}button:hover:not(:disabled){background:#eef4f2;border-color:#607d74}button:disabled{cursor:not-allowed;opacity:.55}.danger-button{border-color:#b84a45;background:#fff1ee;color:#8d211d;font-weight:750}.danger-button:hover:not(:disabled){border-color:#8d211d;background:#ffe2dc}input,select,textarea:not(.xterm-helper-textarea){width:100%;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:8px 10px}textarea:not(.xterm-helper-textarea){min-height:240px;resize:vertical;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}h1,h2,p{margin-top:0}h1{margin-bottom:4px;font-size:26px;line-height:1.15}h2{margin-bottom:10px;font-size:14px;letter-spacing:0}.app-shell{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);height:100vh;min-height:0;overflow:hidden}.app-shell.is-sidebar-collapsed{grid-template-columns:46px minmax(0,1fr)}.app-sidebar{position:relative;display:flex;flex-direction:column;min-width:0;border-right:1px solid #d3c9b8;background:#fbfaf6;padding:14px;overflow:auto}.app-shell.is-sidebar-collapsed .app-sidebar{overflow:hidden;padding:8px}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:2;display:grid;place-items:center;width:28px;min-height:28px;padding:0;background:#fffdf8}.sidebar-toggle:before{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;content:"";transform:translate(2px) rotate(135deg)}.app-shell.is-sidebar-collapsed .sidebar-toggle{left:9px;right:auto}.app-shell.is-sidebar-collapsed .sidebar-toggle:before{transform:translate(-2px) rotate(-45deg)}.sidebar-content{display:flex;flex:1;min-width:0;min-height:0}.project-dashboard{display:flex;flex:1;flex-direction:column;width:100%;min-height:100%}.app-shell.is-sidebar-collapsed .sidebar-content{width:0;opacity:0;pointer-events:none}.app-main{min-width:0;height:100%;padding:14px 16px;overflow:auto}.brand-header{display:flex;gap:12px;align-items:baseline;margin-bottom:10px;padding-right:34px}.brand-header strong{font-size:18px}.brand-header span,.muted{color:#667071;font-size:13px}.sidebar-section{margin-bottom:8px;border:1px solid #e0d6c7;border-radius:8px;background:#fffdfa;overflow:hidden}.sidebar-section-toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-height:34px;border:0;border-radius:0;background:transparent;color:#1c2024;font-size:13px;font-weight:750;text-align:left}.sidebar-section-toggle:hover{background:#f5f1e8}.sidebar-section-toggle[aria-expanded=true]{border-bottom:1px solid #ece5d9}.sidebar-section-chevron{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;transform:rotate(45deg)}.sidebar-section-toggle[aria-expanded=true] .sidebar-section-chevron{transform:rotate(-135deg)}.sidebar-section-content{padding:8px}.repo-connect,.project-summary,.repository-panel,.gateway-panel,.harness-panel,.task-create{margin:0}.repository-panel{display:grid;gap:10px}.repository-panel .project-summary{padding-top:10px;border-top:1px solid #ece5d9}.inline-form{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.inline-form.has-recent-paths{grid-template-columns:minmax(0,1fr) auto}.inline-form>input{grid-column:1 / -1}.inline-form>button{justify-self:end}.inline-form.has-recent-paths>button{justify-self:auto}.repo-recent-select{min-width:0;max-width:none}.project-summary dl{display:grid;gap:8px;margin:0}.project-summary div{min-width:0}.project-summary dt{color:#6c6255;font-size:12px}.project-summary dd{margin:0;overflow-wrap:anywhere;font-size:13px}.connected-repo-actions{display:flex;align-items:center;gap:8px;margin-top:10px}.connected-repo-actions button{min-height:30px}.gateway-actions{display:grid;gap:8px;margin-top:10px}.gateway-actions button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.gateway-actions .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.gateway-panel .compact-field,.gateway-lark-settings{display:grid;gap:6px}.gateway-panel .compact-field{font-size:12px;color:#6c6255}.gateway-panel .compact-field input,.gateway-panel .compact-field select{width:100%;min-width:0}.gateway-lark-settings{margin-top:10px}.gateway-lark-settings button{width:100%}.gateway-qr{display:grid;gap:6px;margin-top:10px}.gateway-qr img{width:100%;max-width:180px;border:1px solid #d3c9b8;border-radius:6px;background:#fff;padding:6px}.gateway-qr code{overflow-wrap:anywhere;font-size:11px}.warnings{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.success-banner{border:1px solid #2ea043;background:#eefbf0;color:#165c26;border-radius:6px;padding:10px 12px}.flow-pause-alert-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:#1f242b85;padding:20px}.flow-pause-alert{display:grid;gap:12px;width:min(460px,100%);border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 28px 72px #1f242b47;padding:22px}.flow-pause-alert-kicker{margin:0;color:#2f6f73;font-size:12px;font-weight:700;text-transform:uppercase}.flow-pause-alert h2{margin:0;font-size:24px;line-height:1.15}.flow-pause-alert p{margin:0;font-size:14px;line-height:1.5}.flow-pause-alert-hint{color:#49666a}.flow-pause-alert button{justify-self:end;min-width:110px;border:1px solid #2f6f73;background:#2f6f73;color:#fffdf8}.flow-pause-alert button:hover{background:#245c60}.ui-error-center{position:fixed;top:14px;right:14px;z-index:95;display:grid;gap:8px;width:min(520px,calc(100vw - 28px));max-height:min(58vh,540px);border:1px solid #c87b54;border-radius:8px;background:#fff4ed;color:#6f3218;box-shadow:0 18px 50px #1f242b33;padding:10px}.ui-error-center-header{display:flex;align-items:center;justify-content:space-between;gap:10px}.ui-error-center-header h2{margin:0;font-size:14px;line-height:1.2}.ui-error-center-header p{margin:2px 0 0;color:#8b4a28;font-size:11px;font-weight:700}.ui-error-center button{border-color:#c87b54;color:#6f3218;min-height:28px;padding:4px 8px;font-size:12px}.ui-error-list{display:grid;gap:8px;margin:0;padding:0;overflow:auto;list-style:none}.ui-error-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border-top:1px solid rgba(200,123,84,.32);padding-top:8px}.ui-error-list p{margin:0;font-size:12px;font-weight:700;line-height:1.4;overflow-wrap:anywhere}.ui-error-list span{display:block;margin-top:4px;color:#8b4a28;font-size:11px;font-weight:700}.role-recovery-toast{position:fixed;left:50%;bottom:18px;z-index:90;display:flex;align-items:center;gap:12px;max-width:calc(100vw - 32px);border:1px solid #b7791f;border-radius:8px;background:#fff8e6;color:#5f3b00;box-shadow:0 14px 42px #1f242b2e;padding:10px 12px;transform:translate(-50%)}.role-recovery-toast span{font-size:13px;font-weight:700;white-space:nowrap}.role-recovery-toast button{border-color:#b7791f;color:#5f3b00}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:10px}.harness-stage{display:grid;gap:8px}.harness-panel-header{display:flex;justify-content:space-between;gap:8px;align-items:center}.harness-panel-header h2,.harness-panel-header p,.harness-result p{margin-bottom:0}.harness-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-review-diff-button{width:100%}.harness-file-list-title{margin:0;font-size:12px}.harness-file-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-file-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;border:1px solid #ece5d9;border-radius:6px;padding:6px 8px;background:#fffdfa}.harness-file-list span{overflow:hidden;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.harness-changes,.harness-result{border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-changes h3{margin:0 0 4px;font-size:12px}.harness-changes ul,.harness-result ul{margin:0;padding-left:18px}.harness-bootstrap-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);background:#1f242b94;padding:14px}.harness-bootstrap-modal-surface{min-width:0;min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;border:1px solid #b9b0a1;border-radius:8px;background:#fffdf8;box-shadow:0 22px 64px #1f242b47;padding:10px}.harness-bootstrap-modal-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-bootstrap-modal-header p{max-width:min(720px,70vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.harness-bootstrap-controls{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(180px,.9fr) minmax(140px,.7fr) auto;gap:8px;align-items:end;min-width:0}.harness-bootstrap-controls label{display:grid;gap:4px;min-width:0}.harness-bootstrap-controls label span{color:#5f6a6c;font-size:11px;font-weight:650}.harness-bootstrap-controls select{width:100%;min-width:0;min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:3px 8px;font-size:12px}.harness-bootstrap-control-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-bootstrap-control-actions button{min-height:30px;padding:4px 9px;font-size:12px}.harness-bootstrap-terminal{min-width:0;min-height:0;display:grid}.task-create form{display:grid;gap:8px}.task-panel{display:grid;gap:10px}.task-panel-actions{display:grid;gap:8px;padding-top:10px;border-top:1px solid #ece5d9}.task-panel-actions .danger-button{width:100%;text-align:center}.task-create-preview{display:grid;gap:2px;border:1px solid #e0d6c7;border-radius:6px;background:#f8f7f2;padding:6px 8px}.task-create-option{display:flex;align-items:center;gap:8px;color:#1f242b;font-size:13px;font-weight:700}.task-create-option input{width:16px;height:16px;margin:0}.task-create-preview span{color:#255f3d;font-size:12px;font-weight:700}.task-create-preview small{overflow:hidden;color:#687273;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.task-nav{display:grid;gap:8px}.task-nav-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left}.task-nav-item.is-active,.role-tab.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings{display:grid;gap:8px}.sidebar-settings button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.sidebar-settings .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.switch-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;min-height:34px;border:1px solid #b9c0c4;border-radius:7px;background:#fffefa;color:#3f474a;padding:5px 8px;text-align:left}.switch-control:hover:not(:disabled){border-color:#2f7e84;background:#f2faf8}.switch-control:disabled{opacity:.6;cursor:not-allowed}.switch-control-label{min-width:0;overflow:hidden;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.switch-control-track{position:relative;justify-self:end;width:38px;height:20px;border-radius:999px;background:#b9c0c4;transition:background .16s ease}.switch-control-thumb{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:999px;background:#fffefa;box-shadow:0 1px 3px #12161838;transition:transform .16s ease}.switch-control.is-on{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.switch-control.is-on .switch-control-track{background:#2f7e84}.switch-control.is-on .switch-control-thumb{transform:translate(18px)}.sidebar-settings .switch-control,.gateway-actions .switch-control{width:100%}.sidebar-settings .theme-mode-toggle span:last-child{font-weight:750}.settings-select-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;font-size:13px;color:#5f6a6c}.settings-select-row select{min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326}.settings-status-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;border:1px solid #d4cec3;border-radius:6px;background:#fffdf8;padding:6px 10px;color:#5f6a6c;font-size:13px}.settings-status-row strong{color:#202326;font-size:12px}.settings-help-text{margin:0;color:#7b5e00;font-size:12px;line-height:1.35}.task-status-dock{display:grid;gap:10px;margin-top:auto;border-top:1px solid #d3c9b8;padding-top:10px}.task-status-dock-title,.current-round-title{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.task-status-dock-title strong{overflow:hidden;font-size:13px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.task-status-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0}.task-status-stats div,.current-round-status{min-width:0;border:1px solid #e0d6c7;border-radius:6px;background:#fffdfa}.task-status-stats div{padding:6px 7px}.task-status-stats dt{color:#6c6255;font-size:10px;font-weight:700;text-transform:uppercase}.task-status-stats dd{margin:0;overflow:hidden;color:#1f242b;font-size:12px;font-weight:750;text-overflow:ellipsis;white-space:nowrap}.current-round-status{display:grid;gap:8px;padding:8px}.current-round-title span:first-child{color:#3a4647;font-size:12px;font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(120px,max-content) minmax(0,1fr);gap:10px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.role-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:6px;margin-bottom:8px;min-width:0}.workspace-header .role-tabs{margin-bottom:0}.role-tab{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:30px;padding:4px 8px;text-align:left}.workspace-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1;gap:10px;align-items:stretch;min-height:0}.workspace-main{min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px}.role-console-stack{min-width:0;min-height:0;flex:1;display:flex;flex-direction:column}.role-console-panel{min-width:0;min-height:0;flex:1;display:none}.role-console-panel.is-active{display:flex;flex-direction:column}.session-console,.message-panel,.event-log,.empty-workspace{border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:10px}.task-workspace{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0}.session-console{display:flex;flex-direction:column;flex:1;height:100%;min-height:0}.session-controls{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;justify-content:flex-start;min-width:0;margin:0;overflow:hidden}.session-option-field{display:grid;grid-template-columns:auto minmax(120px,1fr);flex:0 1 210px;gap:5px;align-items:center;min-width:0}.permission-mode-field{flex-basis:250px}.model-field{flex-basis:220px}.effort-field{grid-template-columns:auto minmax(92px,1fr);flex-basis:150px}.session-option-field span{color:#5f6a6c;font-size:11px;font-weight:650;line-height:1;white-space:nowrap}.session-option-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.session-option-field select{width:100%;min-width:0;min-height:26px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:2px 7px;font-size:12px}.session-toolbar{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:5px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:26px;padding:2px 8px;font-size:12px}.session-harness-notice{display:inline-flex;flex:0 0 auto;gap:6px;align-items:center;min-width:0;border:1px solid #c4a34e;border-radius:6px;background:#fff8dd;color:#604e16;padding:2px 5px;font-size:11px}.session-harness-notice span:not(.status-badge){white-space:nowrap}.session-harness-notice button{min-height:24px;padding:1px 7px;font-size:11px}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);flex:1;min-width:0;min-height:0;height:100%}.session-console-body.has-translation{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:stretch}.terminal-pane,.translation-pane{display:grid;min-width:0;min-height:0;height:100%}.terminal-pane{grid-template-rows:auto minmax(0,1fr);gap:8px}.translation-pane{grid-template-rows:minmax(0,1fr)}.terminal-frame,.terminal-empty{width:100%;height:100%;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.terminal-empty{display:grid;place-items:center;align-content:center;gap:8px;color:#d6d0c6;border:1px solid #292d31}.translation-panel{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0;border:1px solid #292d31;border-radius:6px;background:#0d1117;color:#d6deeb;padding:8px;min-width:0;width:100%;overflow:hidden;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-backdrop{background:#010409b8}.translation-file-browser-backdrop{z-index:24}.file-translation-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:95vw;height:95vh;min-height:0;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 28px 80px #0000008f;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-header{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;min-width:0}.file-translation-header h2,.file-translation-header p{margin-bottom:0}.file-translation-header h2{font-size:18px}.file-translation-header p{color:#8b949e;font-size:12px}.file-translation-toolbar{display:flex;flex-wrap:wrap;gap:6px}.file-translation-toolbar button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.file-translation-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.file-translation-list,.file-translation-preview{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:8px}.file-translation-list{display:grid;align-content:start;gap:6px}.file-translation-item{display:grid;gap:3px;width:100%;min-width:0;border:1px solid #292d31;border-radius:6px;background:#111820;color:#d6deeb;padding:6px;text-align:left}.file-translation-item strong,.file-translation-item span{overflow-wrap:anywhere}.file-translation-item span{color:#8b949e;font-size:11px}.file-translation-item.is-active{border-color:#58a6ff;background:#142033}.file-translation-preview header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-bottom:8px;color:#8b949e;font-size:12px}.file-translation-preview{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;padding:10px}.file-translation-preview .translation-markdown{min-height:0;overflow:auto;padding-right:4px;font-size:13px;line-height:1.62}.file-translation-preview>.muted{align-self:center;justify-self:center;text-align:center}.translation-file-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:min(880px,calc(100vw - 32px));max-height:min(760px,calc(100vh - 48px));min-height:520px;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 24px 70px #0000007a;font-family:Menlo,Monaco,Consolas,monospace}.translation-file-browser-modal header,.translation-file-browser-controls,.translation-file-browser-nav,.translation-file-browser-search{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.translation-file-browser-modal header{justify-content:space-between}.translation-file-browser-modal h2,.translation-file-browser-modal h3,.translation-file-browser-modal p{margin-bottom:0}.translation-file-browser-modal h2{font-size:17px}.translation-file-browser-modal h3{color:#8b949e;font-size:12px;font-weight:600}.translation-file-browser-modal p{color:#8b949e;font-size:12px;overflow-wrap:anywhere}.translation-file-browser-controls{justify-content:space-between}.translation-file-browser-search{flex:1 1 320px;justify-content:flex-end}.translation-file-browser-search input{flex:1 1 180px;min-width:0}.translation-file-browser-modal button,.translation-file-browser-modal input{border:1px solid #3a4149;border-radius:6px;background:#111820;color:#d6deeb;min-height:30px;padding:4px 8px;font:inherit;font-size:12px}.translation-file-browser-modal button:hover:not(:disabled){border-color:#58a6ff;background:#162235}.translation-file-browser-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.42fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.translation-file-browser-list,.translation-file-browser-selection{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:10px}.translation-file-browser-group{display:grid;align-content:start;gap:6px;margin-bottom:12px}.translation-file-browser-entry{display:grid;grid-template-columns:38px minmax(0,1fr);gap:3px 8px;width:100%;min-width:0;text-align:left}.translation-file-browser-entry span{grid-row:span 2;align-self:center;color:#8b949e;font-size:11px}.translation-file-browser-entry strong,.translation-file-browser-entry small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.translation-file-browser-entry small{color:#8b949e}.translation-file-browser-entry.is-selected{border-color:#58a6ff;background:#142033}.translation-file-browser-selection{display:grid;align-content:start;gap:12px}.translation-file-browser-selection label{display:grid;gap:5px}.translation-file-browser-selection span{color:#8b949e;font-size:12px}.translation-file-browser-selection input{width:100%;min-width:0}.translation-panel-header{display:grid;flex:0 0 auto;gap:3px}.translation-panel-titlebar,.translation-panel-actions,.translation-status-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:space-between}.translation-panel-header h2,.translation-panel-header p{margin-bottom:0}.translation-panel-titlebar h2{font-size:16px}.translation-panel-header p,.translation-composer span{color:#8b949e;font-size:12px}.translation-panel-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.translation-panel-actions button:hover:not(:disabled),.translation-composer-actions button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}.translation-panel-actions{justify-content:flex-end}.translation-entry-list{display:grid;flex:1 1 auto;align-content:start;gap:8px;min-height:0;min-width:0;overflow-x:hidden;overflow-y:auto;scrollbar-color:#4b5563 #0d1117}.translation-entry{border:0;border-radius:0;background:transparent;min-width:0;max-width:100%;padding:0}.translation-conversation-boundary{display:grid;grid-template-columns:minmax(18px,1fr) auto auto auto minmax(18px,1fr);gap:8px;align-items:center;color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.4;white-space:nowrap}.translation-boundary-dash{min-width:0;border-top:1px dashed #3a4149}.translation-entry.is-user-input{border-top:4px solid #3a4149;margin-top:14px;padding-top:14px}.translation-entry.is-user-input:first-child{margin-top:0}.translation-entry pre{box-sizing:border-box;margin:0;max-height:none;max-width:100%;min-width:0;overflow:visible;white-space:pre-wrap;overflow-wrap:anywhere;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.45;color:#d6deeb}.translation-markdown{max-width:100%;min-width:0;color:#d6deeb;font-size:12px;line-height:1.55;overflow-wrap:anywhere}.translation-markdown>:first-child{margin-top:0}.translation-markdown>:last-child{margin-bottom:0}.translation-markdown p,.translation-markdown ul,.translation-markdown ol,.translation-markdown blockquote,.translation-markdown pre,.translation-markdown table{margin:0 0 8px}.translation-markdown h1,.translation-markdown h2,.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{margin:10px 0 6px;color:#f0f6fc;font-weight:700;line-height:1.25}.translation-markdown h1{font-size:17px}.translation-markdown h2{font-size:15px}.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{font-size:13px}.translation-markdown ul,.translation-markdown ol{padding-left:22px}.translation-markdown li{margin:2px 0}.translation-markdown .task-list-item{list-style:none}.translation-markdown input[type=checkbox]{width:13px;height:13px;margin:0 6px 0 0;accent-color:#56d364}.translation-markdown blockquote{border-left:3px solid #3a4149;color:#b7c0ca;padding-left:10px}.translation-markdown a{color:#79c0ff}.translation-markdown code{border-radius:4px;background:#161b22;color:#f0f6fc;padding:1px 4px;font-family:Menlo,Monaco,Consolas,monospace;font-size:.95em}.translation-markdown pre{overflow-x:auto;border:1px solid #292d31;border-radius:6px;background:#111316;padding:8px;white-space:pre}.translation-markdown pre code{background:transparent;padding:0}.translation-markdown table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse}.translation-markdown img{max-width:100%;border-radius:4px}.translation-markdown th,.translation-markdown td{border:1px solid #30363d;padding:4px 6px;text-align:left;vertical-align:top}.translation-markdown hr{border:0;border-top:1px solid #292d31;margin:10px 0}.translation-entry.is-tool-output pre{display:block;overflow:hidden;color:#7d8590;text-overflow:ellipsis;white-space:nowrap;width:100%}.translation-entry-note{margin:2px 0 0;color:#6e7681;font-size:10px;line-height:1.35}.translation-entry-note.is-error{color:#a3715f}.translation-composer{display:grid;flex:0 0 auto;gap:6px;border-top:1px solid #292d31;padding-top:8px}.translation-composer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.translation-composer textarea{width:100%;min-height:38px;max-height:88px;border-color:#3a4149;background:#0d1117;color:#d6deeb;font-family:inherit;font-size:12px;line-height:1.35;resize:vertical}.translation-composer textarea::placeholder{color:#7d8590}.translation-composer textarea::selection{background:#8b949e59;color:#fff}.translation-composer textarea:focus,.translation-composer textarea:focus-visible{border-color:#4b5563;outline:none;box-shadow:none}.translation-composer-actions{display:grid;align-content:start;gap:6px;min-width:104px}.translation-composer-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;width:100%;min-height:38px;padding:4px 9px;font-size:12px}.translation-panel .muted{color:#8b949e}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#181c1f61;padding:18px}.translator-session-backdrop{background:#010409b8}.translator-session-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;width:95vw;height:92vh;min-width:0;min-height:0;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:10px}.translator-session-header{display:flex;gap:10px;align-items:center;justify-content:space-between;min-width:0}.translator-session-header h2,.translator-session-header p{margin-bottom:0}.translator-session-header p{color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translator-session-terminal{min-width:0;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.harness-studio-backdrop{background:#010409b8}.harness-studio-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:96vw;height:94vh;min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.harness-studio-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-studio-header h2,.harness-studio-header p{margin-bottom:0}.harness-studio-header p{color:#8b949e}.harness-studio-header-actions{display:flex;gap:8px;align-items:center}.harness-studio-layout{display:grid;grid-template-columns:minmax(340px,.85fr) minmax(640px,1.55fr);gap:12px;height:100%;min-width:0;min-height:0;overflow:hidden}.harness-studio-left{display:grid;align-content:start;gap:10px;min-width:0;min-height:0;overflow:auto;padding-right:2px}.harness-studio-left-preview{grid-template-rows:minmax(0,1fr);height:100%;align-content:stretch;overflow:hidden;padding-right:0}.harness-studio-section{min-width:0;border:1px solid #30363d;border-radius:6px;background:#0b1017;padding:10px}.harness-studio-section h3{margin-bottom:8px;font-size:14px}.harness-studio-collapsible-section{padding:0;overflow:hidden}.harness-studio-collapsible-section summary{display:flex;gap:8px;align-items:center;justify-content:space-between;padding:10px;cursor:pointer;list-style:none}.harness-studio-collapsible-section summary::-webkit-details-marker{display:none}.harness-studio-collapsible-section summary h3{margin:0}.harness-studio-collapsible-section summary span{color:#8b949e;font-size:11px}.harness-studio-collapsible-section[open] summary span{color:#d6deeb}.harness-studio-collapsible-content{padding:0 10px 10px}.harness-studio-engineer{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:8px;min-height:0}.harness-studio-engineer-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-studio-engineer-header p{margin-bottom:0}.harness-studio-file-preview{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:10px;height:100%;min-width:0;min-height:0;overflow:hidden}.harness-studio-file-editor-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-studio-file-editor-header p{margin-bottom:0}.harness-studio-file-editor-header h3,.harness-studio-file-editor-header p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-editor-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;align-items:center}.harness-studio-file-textarea{grid-row:4;align-self:stretch;height:100%;width:100%;min-width:0;min-height:0;overflow:auto;resize:none;border:1px solid #30363d;border-radius:6px;background:#090d13;color:#d6deeb;padding:10px;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.55}.harness-studio-file-textarea:read-only{background:#080c12;color:#8b949e;cursor:default}.harness-studio-file-textarea.is-editing{background:#090d13;color:#d6deeb;cursor:text}.harness-studio-file-textarea:disabled{opacity:.72}.harness-engineer-terminal{min-width:0;min-height:0;overflow:hidden;border-radius:6px;background:#111316}.harness-feedback-float{position:fixed;left:18px;bottom:18px;z-index:40;display:grid;gap:6px;width:min(360px,calc(100vw - 36px));border:1px solid #b7bec4;border-radius:8px;background:#fffefa;box-shadow:0 18px 42px #2023262e;padding:10px}.harness-feedback-float.needs-review{border-color:#2f7e84;background:#e8f4f2}.harness-feedback-float div:first-child{display:flex;gap:8px;align-items:center;justify-content:space-between;min-width:0}.harness-feedback-float strong,.harness-feedback-float p{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-feedback-float span{color:#5f6a6c;font-size:12px;white-space:nowrap}.harness-feedback-float p{margin:0;color:#3f474a;font-size:13px}.harness-feedback-float-actions{display:flex;gap:8px;justify-content:flex-end}.harness-feedback-float-actions button{min-height:28px;padding:3px 9px;font-size:12px}.harness-feedback-backdrop{z-index:55}.harness-feedback-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:10px;width:min(1100px,calc(100vw - 32px));height:min(820px,calc(100vh - 32px));min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.harness-feedback-modal header{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-feedback-modal h2,.harness-feedback-modal h3,.harness-feedback-modal p{margin-bottom:0}.harness-feedback-modal-body{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:10px;min-width:0;min-height:0;overflow:hidden}.harness-feedback-modal-body section{display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;min-width:0;min-height:0;border:1px solid #30363d;border-radius:6px;padding:10px}.harness-feedback-modal pre{min-width:0;min-height:0;margin:0;overflow:auto;white-space:pre-wrap;word-break:break-word;color:#d6deeb;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.55}.harness-feedback-review-actions{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:end;min-width:0}.harness-feedback-review-actions textarea{min-height:70px;resize:vertical}.harness-feedback-review-actions div{display:flex;gap:8px;align-items:center}.harness-studio-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.harness-studio-metric{display:grid;gap:4px;min-width:0;border:1px solid #30363d;border-radius:6px;padding:8px}.harness-studio-metric span{color:#8b949e;font-size:11px}.harness-studio-metric strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-list,.harness-studio-doc-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-studio-file-list li,.harness-studio-doc-list li{display:grid;gap:8px;align-items:center;min-width:0;border:1px solid #30363d;border-radius:6px;padding:8px}.harness-studio-file-list li{grid-template-columns:minmax(0,1fr) auto auto}.harness-studio-doc-list li{grid-template-columns:minmax(0,1fr) auto}.harness-studio-file-list li.selected{border-color:#58a6ff;background:#0f1b2d}.harness-studio-file-list button{min-width:0;overflow:hidden;border:0;background:transparent;color:inherit;padding:0;text-align:left;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-list .harness-studio-file-copy-button{border:1px solid #30363d;border-radius:5px;background:#161b22;color:#d6deeb;padding:4px 8px;text-align:center}.harness-studio-file-list .harness-studio-file-copy-button:hover{border-color:#58a6ff}.harness-studio-file-list span:first-child,.harness-studio-doc-list span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.repository-diff-backdrop{background:#010409b8}.repository-diff-modal{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:10px;width:96vw;height:94vh;min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.repository-diff-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.repository-diff-header h2,.repository-diff-header p,.repository-diff-file-header h3,.repository-diff-file-header p{margin-bottom:0}.repository-diff-header p,.repository-diff-file-header p{color:#8b949e}.repository-diff-header-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.repository-diff-commit-picker{display:inline-flex;gap:8px;align-items:center;min-width:280px}.repository-diff-commit-picker span{color:#8b949e;font-size:12px;font-weight:700}.repository-diff-commit-picker select{min-width:260px;max-width:520px}.repository-diff-warnings{margin-top:0}.repository-diff-body{display:grid;grid-template-columns:minmax(280px,.32fr) minmax(0,1fr);gap:10px;min-width:0;min-height:0}.repository-diff-sidebar,.repository-diff-main{min-width:0;min-height:0;border:1px solid #30363d;border-radius:6px;background:#0b1017}.repository-diff-sidebar{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden}.repository-diff-summary{display:grid;gap:4px;border-bottom:1px solid #30363d;padding:10px;font-size:12px}.repository-diff-summary span{color:#8b949e}.repository-diff-file-list{display:grid;align-content:start;gap:6px;min-width:0;margin:0;padding:10px;overflow:auto;list-style:none}.repository-diff-file-list li{min-width:0}.repository-diff-file-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:stretch;min-width:0}.repository-diff-file-list button{display:grid;gap:4px;width:100%;min-width:0;border:1px solid #30363d;border-radius:6px;background:transparent;color:inherit;padding:8px;text-align:left}.repository-diff-file-list li.selected .repository-diff-file-select,.repository-diff-file-list li.task-diff-selected .repository-diff-task-file-button{border-color:#58a6ff;background:#0f1b2d}.repository-diff-task-file-button{align-content:center;min-width:78px;font-size:12px;text-align:center}.repository-diff-file-list span,.repository-diff-file-list small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.repository-diff-file-list small{color:#8b949e}.repository-diff-empty{color:#8b949e;font-size:13px}.repository-diff-main{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:8px;overflow:hidden;padding:10px}.repository-diff-file-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.repository-diff-file-header h3{overflow-wrap:anywhere;font-size:15px}.repository-diff-stats{flex:0 0 auto;color:#7ee787;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.repository-diff-task-file-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.repository-diff-code{min-width:0;min-height:0;margin:0;overflow:auto;border:1px solid #30363d;border-radius:6px;background:#090d13;color:#d6deeb;padding:0;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre}.repository-diff-line{display:block;min-width:max-content;border-left:3px solid transparent;padding:0 12px}.repository-diff-line-context{color:#c9d1d9}.repository-diff-line-added{border-left-color:#3fb950;background:#2ea04333;color:#aff5b4}.repository-diff-line-deleted{border-left-color:#f85149;background:#f851492e;color:#ffdcd7}.repository-diff-line-hunk{border-left-color:#58a6ff;background:#388bfd29;color:#79c0ff}.repository-diff-placeholder{display:grid;place-items:center;min-height:240px;color:#8b949e}.gateway-qr-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:14px;width:min(520px,100%);max-height:min(720px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:16px}.message-modal,.event-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:hidden;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.gateway-qr-modal header,.message-modal header,.event-modal header,.gateway-qr-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.gateway-qr-modal h2,.gateway-qr-modal p{margin-bottom:0}.gateway-qr-modal-body{display:grid;gap:14px;justify-items:center}.gateway-qr-code-frame{display:grid;place-items:center;width:min(360px,100%);aspect-ratio:1;border:1px solid #d6d0c6;border-radius:8px;background:#fff;padding:18px}.gateway-qr-code-frame img{display:block;width:100%;height:auto}.gateway-qr-placeholder{color:#667071;text-align:center}.gateway-qr-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;width:100%;margin:0}.gateway-qr-meta div{min-width:0;border:1px solid #ece5d9;border-radius:6px;padding:8px}.gateway-qr-meta dt{color:#6c6255;font-size:11px;font-weight:700;text-transform:uppercase}.gateway-qr-meta dd{margin:0;overflow-wrap:anywhere;font-size:13px}.message-modal h2,.message-modal p,.event-modal h2,.event-modal p{margin-bottom:0}.translation-test-result{border-radius:6px;padding:8px;font-size:13px}.translation-test-result.is-ok{border:1px solid #6ea77e;background:#e6f3e9;color:#245334}.translation-test-result.is-error{border:1px solid #c46e5f;background:#fae9e6;color:#6f2b21}.message-panel{display:grid;gap:8px}.message-modal .message-panel,.event-modal .event-log{min-height:0;overflow:auto;border:0;background:transparent;padding:0}.message-panel-header{display:flex;justify-content:space-between;gap:12px;align-items:center}.message-panel-header h2,.message-panel-header p{margin-bottom:0}.message-controls,.message-mode-toggle,.modal-actions,.message-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.message-mode-toggle{width:auto;min-width:220px;font-size:13px}.message-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.message-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid #ece5d9;border-radius:6px;padding:8px;background:#fffdfa}.message-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:4px}.message-meta time,.message-meta span:not(.status-badge),.message-reason,.message-path{color:#667071;font-size:12px}.message-sequence{min-width:32px;color:#1f242b;font-weight:800}.message-actions button{min-height:30px;padding:4px 10px}.message-item p{display:-webkit-box;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.message-reason,.message-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log ol{margin:0;padding-left:22px;font-size:13px}.event-log{max-height:92px;overflow:auto}.event-log h2{margin-bottom:4px;font-size:13px}.event-log p{margin-bottom:0}.event-log li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:66px;min-height:20px;border-radius:999px;padding:2px 8px;border:1px solid #c7c1b8;background:#f2eee7;color:#4f5558;font-size:11px;white-space:nowrap}.status-active,.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-created,.status-idle,.status-disabled{border-color:#9aa3a8;background:#edf0f1;color:#465056}.status-blocked,.status-crashed,.status-missing,.status-empty,.status-delete{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-waiting,.status-starting,.status-incomplete,.status-outdated{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-exited,.status-done,.status-stopped,.status-resumable,.status-skipped,.status-overridden,.status-not_required{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.status-queued,.status-translating,.status-ready,.status-create,.status-insert,.status-update{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-rejected,.status-failed,.status-delivery_failed,.status-response_ready_missing_result,.status-cancelled,.status-blocked{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-pending{border-color:#c7c1b8;background:#f2eee7;color:#4f5558}.status-translated,.status-preserved{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.empty-workspace{max-width:680px}@media(max-width:980px){.app-shell,.workspace-grid{grid-template-columns:1fr}.app-sidebar{border-right:0;border-bottom:1px solid #d3c9b8}.role-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}.session-console-body.has-translation,.translation-file-browser-layout{grid-template-columns:1fr}.session-controls,.session-toolbar{flex-wrap:wrap;overflow:visible}.file-translation-modal{width:95vw;height:95vh;padding:10px}.file-translation-layout{grid-template-columns:minmax(180px,240px) minmax(0,1fr)}.translation-file-browser-modal{min-height:0}}@media(max-width:700px){.file-translation-layout{grid-template-columns:1fr;grid-template-rows:minmax(140px,28vh) minmax(0,1fr)}.file-translation-header{align-items:stretch}.file-translation-toolbar{width:100%}.file-translation-toolbar button{flex:1 1 auto}}@media(max-width:560px){.app-main,.app-sidebar{padding:12px}.workspace-header,.inline-form,.inline-form.has-recent-paths{grid-template-columns:1fr;display:grid}.role-tabs{grid-template-columns:1fr}.terminal-frame,.terminal-empty{min-height:300px;height:54vh}.session-option-field{grid-template-columns:1fr;width:100%}.translation-file-browser-modal{width:calc(100vw - 20px);max-height:calc(100vh - 20px);padding:10px}.file-translation-modal{width:calc(100vw - 12px);height:calc(100vh - 12px)}.translation-file-browser-controls,.translation-file-browser-search{display:grid;grid-template-columns:1fr}}.harness-bootstrap-terminal .terminal-frame{height:100%;min-height:0}:root[data-theme=dark]{color-scheme:dark;background:#0d1117;color:#e6edf3}:root[data-theme=dark] body,:root[data-theme=dark] .app-main{background:#0d1117;color:#e6edf3}:root[data-theme=dark] button{border-color:#3d4652;background:#161b22;color:#e6edf3}:root[data-theme=dark] button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}:root[data-theme=dark] input,:root[data-theme=dark] select,:root[data-theme=dark] textarea:not(.xterm-helper-textarea){border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] input::placeholder,:root[data-theme=dark] textarea::placeholder{color:#7d8590}:root[data-theme=dark] .danger-button{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .danger-button:hover:not(:disabled){border-color:#ffa198;background:#3d1f23}:root[data-theme=dark] .app-sidebar{border-color:#30363d;background:#0f141b}:root[data-theme=dark] .sidebar-toggle{background:#161b22}:root[data-theme=dark] .brand-header span,:root[data-theme=dark] .muted,:root[data-theme=dark] .message-meta time,:root[data-theme=dark] .message-meta span:not(.status-badge),:root[data-theme=dark] .message-reason,:root[data-theme=dark] .message-path{color:#8b949e}:root[data-theme=dark] .sidebar-section,:root[data-theme=dark] .session-console,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .gateway-qr-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .gateway-qr-code-frame,:root[data-theme=dark] .gateway-qr-meta div{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .gateway-qr-code-frame{background:#f6f8fa}:root[data-theme=dark] .gateway-qr-meta dt,:root[data-theme=dark] .gateway-qr-placeholder{color:#8b949e}:root[data-theme=dark] .sidebar-section-toggle{color:#e6edf3}:root[data-theme=dark] .sidebar-section-toggle:hover{background:#161b22}:root[data-theme=dark] .sidebar-section-toggle[aria-expanded=true]{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .session-option-field small,:root[data-theme=dark] .task-create-preview small{color:#8b949e}:root[data-theme=dark] .warnings{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .ui-error-center{border-color:#da7b72;background:#2d1518;color:#ffdcd7;box-shadow:0 18px 50px #0104098f}:root[data-theme=dark] .ui-error-center-header p,:root[data-theme=dark] .ui-error-list span{color:#ffb4ab}:root[data-theme=dark] .ui-error-center button{border-color:#da7b72;color:#ffdcd7}:root[data-theme=dark] .ui-error-list li{border-top-color:#da7b7257}:root[data-theme=dark] .success-banner{border-color:#3fb950;background:#112718;color:#aff5b4}:root[data-theme=dark] .flow-pause-alert-backdrop{background:#010409b8}:root[data-theme=dark] .flow-pause-alert{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 28px 72px #0104099e}:root[data-theme=dark] .flow-pause-alert-kicker,:root[data-theme=dark] .flow-pause-alert-hint{color:#9debf2}:root[data-theme=dark] .flow-pause-alert button{border-color:#56d4dd;background:#56d4dd;color:#061114}:root[data-theme=dark] .flow-pause-alert button:hover{background:#84f3fa}:root[data-theme=dark] .role-recovery-toast{border-color:#d29922;background:#2d230d;color:#ffdf8b;box-shadow:0 14px 42px #01040985}:root[data-theme=dark] .role-recovery-toast button{border-color:#d29922;color:#ffdf8b}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .gateway-qr img,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .task-status-stats div,:root[data-theme=dark] .current-round-status,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .harness-bootstrap-modal{background:#010409b8}:root[data-theme=dark] .harness-bootstrap-modal-surface{border-color:#30363d;background:#0d1117;box-shadow:0 22px 64px #0104099e}:root[data-theme=dark] .harness-bootstrap-controls label span{color:#b7c0ca}:root[data-theme=dark] .harness-bootstrap-controls select{border-color:#3a4149;background:#0d1117;color:#d6deeb}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-status-dock{border-color:#30363d}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .task-status-stats dt{color:#8b949e}:root[data-theme=dark] .task-status-stats dd,:root[data-theme=dark] .current-round-title span:first-child{color:#e6edf3}:root[data-theme=dark] .message-sequence{color:#f0f6fc}:root[data-theme=dark] .settings-help-text{color:#d29922}:root[data-theme=dark] .task-nav-item.is-active,:root[data-theme=dark] .role-tab.is-active,:root[data-theme=dark] .sidebar-settings .settings-toggle.is-active,:root[data-theme=dark] .gateway-actions .settings-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .switch-control{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .switch-control:hover:not(:disabled){border-color:#56d4dd;background:#1a2530}:root[data-theme=dark] .switch-control-track{background:#3d4652}:root[data-theme=dark] .switch-control-thumb{background:#e6edf3;box-shadow:0 1px 4px #0104097a}:root[data-theme=dark] .switch-control.is-on{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .switch-control.is-on .switch-control-track{background:#56d4dd}:root[data-theme=dark] .harness-feedback-float{border-color:#3d4652;background:#161b22;color:#d6deeb;box-shadow:0 18px 42px #0104097a}:root[data-theme=dark] .harness-feedback-float.needs-review{border-color:#56d4dd;background:#10262b}:root[data-theme=dark] .harness-feedback-float p{color:#d6deeb}:root[data-theme=dark] .harness-feedback-float span{color:#8b949e}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .settings-select-row{color:#b7c0ca}:root[data-theme=dark] .terminal-empty{border-color:#30363d}:root[data-theme=dark] .modal-backdrop{background:#010409b8}:root[data-theme=dark] .message-modal .message-panel,:root[data-theme=dark] .event-modal .event-log{background:transparent}:root[data-theme=dark] .status-badge{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-ok,:root[data-theme=dark] .status-active,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-created,:root[data-theme=dark] .status-idle,:root[data-theme=dark] .status-disabled{border-color:#69717d;background:#20262f;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-error,:root[data-theme=dark] .status-blocked,:root[data-theme=dark] .status-crashed,:root[data-theme=dark] .status-missing,:root[data-theme=dark] .status-empty,:root[data-theme=dark] .status-delete,:root[data-theme=dark] .status-rejected,:root[data-theme=dark] .status-failed,:root[data-theme=dark] .status-delivery_failed,:root[data-theme=dark] .status-response_ready_missing_result,:root[data-theme=dark] .status-cancelled{border-color:#f85149;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .status-waiting,:root[data-theme=dark] .status-starting,:root[data-theme=dark] .status-incomplete,:root[data-theme=dark] .status-queued,:root[data-theme=dark] .status-translating,:root[data-theme=dark] .status-ready,:root[data-theme=dark] .status-create,:root[data-theme=dark] .status-insert,:root[data-theme=dark] .status-update{border-color:#d29922;background:#2d2208;color:#f8e3a1}:root[data-theme=dark] .status-exited,:root[data-theme=dark] .status-done,:root[data-theme=dark] .status-stopped,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-skipped,:root[data-theme=dark] .status-overridden,:root[data-theme=dark] .status-not_required,:root[data-theme=dark] .status-translated,:root[data-theme=dark] .status-preserved{border-color:#388bfd;background:#10223a;color:#c9e2ff}:root[data-theme=dark] .status-pending{border-color:#3d4652;background:#161b22;color:#d6deeb}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>VibeCodingMaster</title>
7
- <script type="module" crossorigin src="/assets/index-DNh_JE6R.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-BV_K-1WH.css">
7
+ <script type="module" crossorigin src="/assets/index-CKX3RbCz.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CuNHDIFw.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -1,26 +1,31 @@
1
1
  # VCM Gateway Design
2
2
 
3
- Last updated: 2026-06-10
3
+ Last updated: 2026-06-24
4
4
 
5
- This document defines the first VCM gateway product behavior and implementation
6
- plan. It is based on the local Tencent iLink smoke test at:
5
+ This document defines VCM gateway product behavior and implementation plan. The
6
+ first channel was based on the local Tencent iLink smoke test at:
7
7
 
8
8
  ```text
9
9
  /Users/sheldon/Documents/New project 3/weixin-ilink-gateway-test
10
10
  ```
11
11
 
12
- The first gateway channel is Tencent iLink Bot API / Weixin DM.
12
+ Supported gateway channels:
13
+
14
+ - Tencent iLink Bot API / Weixin DM
15
+ - Lark bot over WebSocket event delivery
13
16
 
14
17
  ## Product Definition
15
18
 
16
- VCM Gateway is a mobile conversation bridge between one Weixin DM and one
17
- desktop VCM instance. It is not a remote terminal, not a group-chat bot, and not
18
- a multi-user collaboration feature.
19
+ VCM Gateway is a mobile conversation bridge between one mobile chat identity and
20
+ one desktop VCM instance. It is not a remote terminal and not a multi-user
21
+ collaboration feature.
19
22
 
20
23
  Product rules:
21
24
 
22
- - Support DM only. Group chat is not a supported product mode.
23
- - Bind one mobile Weixin DM identity to one desktop VCM instance.
25
+ - Weixin supports DM only.
26
+ - Lark accepts direct messages and group messages only when the bot is
27
+ mentioned.
28
+ - Bind one mobile chat identity to one desktop VCM instance.
24
29
  - The binding is not project-specific and not task-specific.
25
30
  - The bound phone can manage every project and task available to that desktop
26
31
  VCM instance.
@@ -29,26 +34,27 @@ Product rules:
29
34
  - When the desktop UI has a current task selected, Gateway should adopt that
30
35
  project/task context automatically instead of requiring `/tasks` and
31
36
  `/use-task` first.
32
- - After QR binding succeeds, VCM keeps a long-polling Gateway connection even
33
- when Gateway is disabled. Disabled Gateway accepts only `/help`, `/start`,
34
- `/status`, `/projects`, and `/tasks`.
37
+ - After binding succeeds, VCM keeps a channel connection even when Gateway is
38
+ disabled. Disabled Gateway accepts only `/help`, `/start`, `/status`,
39
+ `/projects`, and `/tasks`.
35
40
  - VCM stores the latest PM reply for each task in local Gateway state. When
36
41
  `/start` enables Gateway and the current task has a cached PM reply, Gateway
37
42
  returns that reply immediately so the phone user sees the current task state.
38
43
  - Gateway does not change the desktop `Pause alert sound` preference. The
39
- desktop pause dialog remains a fixed local UI signal, and Weixin is the mobile
40
- notification path.
41
- - Gateway may push PM replies to Weixin whenever it is enabled, even when the PM
42
- turn was started from the desktop UI rather than from Weixin.
44
+ desktop pause dialog remains a fixed local UI signal, and Gateway is the
45
+ mobile notification path.
46
+ - Gateway may push PM replies to the bound mobile chat whenever it is enabled,
47
+ even when the PM turn was started from the desktop UI rather than from the
48
+ mobile chat.
43
49
  - When translation is enabled, Chinese input is translated to English before it
44
50
  is sent to PM.
45
51
  - The prompt sent to PM does not include the original Chinese text.
46
- - There is no allowed-user list. The security model is one bound DM identity.
52
+ - There is no allowed-user list. The security model is one bound mobile identity.
47
53
 
48
54
  The short product sentence is:
49
55
 
50
56
  ```text
51
- One phone DM binds to one desktop VCM; the phone can select project/task context,
57
+ One phone chat identity binds to one desktop VCM; the phone can select project/task context,
52
58
  pull the connected base repository, create and initialize a task through the
53
59
  saved launch template, send ordinary messages to the current task's PM, receive
54
60
  translated PM replies, and close completed tasks while gateway is enabled; when
@@ -61,15 +67,14 @@ commands.
61
67
  The binding target is the desktop VCM instance.
62
68
 
63
69
  ```text
64
- Weixin DM identity
70
+ Weixin DM or Lark identity
65
71
  <-> desktop VCM instance
66
72
  ```
67
73
 
68
- The gateway stores the iLink bot account token and the bound Weixin user identity
69
- in app-local state. If the QR login result provides a login user id, VCM stores
70
- that identity. If the channel cannot determine the bound user id at login time,
71
- VCM stores the first inbound DM user id after the user confirms binding from the
72
- desktop UI.
74
+ The gateway stores channel credentials and the bound mobile user identity in
75
+ app-local state. Weixin stores the iLink bot account token from QR login. Lark
76
+ stores App ID/App Secret and binds a user only after that user sends a valid
77
+ short-lived `/bind CODE` generated by desktop VCM.
73
78
 
74
79
  Messages from the bound identity are accepted. Messages from any other identity
75
80
  are ignored or receive a minimal "not bound" reply. They are not treated as
@@ -78,7 +83,7 @@ secondary users.
78
83
  Changing phones or Weixin accounts is a rebind operation:
79
84
 
80
85
  ```text
81
- desktop settings -> disable gateway or reset binding -> QR login / bind again
86
+ desktop settings -> disable gateway or reset binding -> QR login or pair again
82
87
  ```
83
88
 
84
89
  ## Mobile Context
@@ -551,11 +556,13 @@ Implemented files:
551
556
  src/shared/types/gateway.ts
552
557
 
553
558
  src/backend/gateway/
559
+ gateway-channel.ts
554
560
  gateway-service.ts
555
561
  gateway-settings-service.ts
556
562
  gateway-command-parser.ts
557
563
  gateway-audit-log.ts
558
564
  channels/
565
+ lark-channel.ts
559
566
  weixin-ilink-channel.ts
560
567
 
561
568
  src/backend/api/gateway-routes.ts
@@ -564,15 +571,21 @@ src/backend/api/gateway-routes.ts
564
571
  Responsibilities:
565
572
 
566
573
  - `gateway-settings-service`: load/save app-local gateway settings and secrets.
567
- - `weixin-ilink-channel`: QR login, long polling, send text, token expiration.
574
+ - `gateway-channel`: define the generic channel adapter contract and registry.
575
+ - `weixin-ilink-channel`: implement the generic adapter with Weixin iLink QR
576
+ login, long polling, send text, and token expiration detection.
577
+ - `lark-channel`: implement the generic adapter with Lark WebSocket event
578
+ delivery, text send, chat id routing, mention filtering for groups, and
579
+ pairing-code binding.
568
580
  - `gateway-command-parser`: parse `/help`, `/status`, `/projects`,
569
581
  `/use-project`, `/pull-current`, `/tasks`, `/use-task`, `/create-task`,
570
582
  `/close-task`, and `/translate`.
571
583
  - `gateway-audit-log`: append redacted JSONL audit entries.
572
584
  - `gateway-service`: lifecycle, poll loop, command dispatch, PM terminal
573
- submission, PM Stop reply push, and error backoff.
574
- - `gateway-routes`: desktop UI settings, QR login start/status, enable/disable,
575
- rebind, and gateway status.
585
+ submission, PM Stop reply push, and error backoff. It must depend on the
586
+ channel registry and generic adapter types, not Weixin/iLink-specific types.
587
+ - `gateway-routes`: desktop UI settings, QR login start/status, Lark pairing
588
+ code creation, enable/disable, rebind, and gateway status.
576
589
 
577
590
  Service dependencies:
578
591
 
@@ -599,12 +612,12 @@ Add a Gateway section to the sidebar settings area or a dedicated modal:
599
612
 
600
613
  ```text
601
614
  Gateway: off / on
602
- Channel: Weixin iLink
615
+ Channel: Weixin iLink / Lark
603
616
  Binding: not bound / bound
604
617
  Translation: off / on
605
618
  Current project
606
619
  Current task
607
- QR login / Rebind
620
+ QR login / Lark pairing code / Rebind
608
621
  Last poll status
609
622
  Last message status
610
623
  ```
@@ -612,7 +625,10 @@ Last message status
612
625
  The user should be able to:
613
626
 
614
627
  - enable or disable gateway
615
- - start QR login
628
+ - select the gateway channel
629
+ - start Weixin QR login
630
+ - save Lark App ID/App Secret
631
+ - generate a short-lived Lark pairing code
616
632
  - see whether the phone is bound
617
633
  - reset binding
618
634
  - inspect the current gateway project/task context
@@ -734,37 +734,42 @@ switching roles keeps the same global translation setting.
734
734
 
735
735
  ## 14. Mobile Gateway
736
736
 
737
- VCM Gateway is a mobile Weixin DM bridge to the local desktop VCM instance.
737
+ VCM Gateway is a mobile chat bridge to the local desktop VCM instance. Supported
738
+ channels are Weixin iLink and Lark.
738
739
 
739
740
  Gateway product rules:
740
741
 
741
- - DM only; group chat is not supported.
742
- - One mobile Weixin DM identity binds to one desktop VCM instance.
742
+ - Weixin is DM only; Lark can receive group messages only when the bot is
743
+ mentioned.
744
+ - One mobile chat identity binds to one desktop VCM instance.
743
745
  - Binding is not tied to one project or one task.
744
746
  - The bound phone can select among the projects and tasks available to the
745
747
  desktop VCM instance.
746
- - After QR binding succeeds, VCM keeps a Gateway long-polling connection even
747
- when Gateway is off; only `/help`, `/start`, `/status`, `/projects`, and
748
- `/tasks` are accepted in that state. `/start` turns Gateway on from Weixin.
748
+ - After binding succeeds, VCM keeps a Gateway channel connection even when
749
+ Gateway is off; only `/help`, `/start`, `/status`, `/projects`, and `/tasks`
750
+ are accepted in that state. `/start` turns Gateway on from the bound mobile
751
+ chat identity.
749
752
  - VCM caches the latest PM reply per task locally. When `/start` turns Gateway
750
753
  on and the current task has a cached PM reply, the response includes that
751
754
  latest PM reply so the mobile user can resume with context.
752
755
  - Plain mobile text is sent only to the current task's `project-manager`.
753
756
  - Gateway never sends directly to `architect`, `coder`, or `reviewer`.
754
- - Gateway can push PM assistant replies to Weixin whenever gateway is enabled,
755
- even if that PM turn was started from desktop VCM.
756
- - When gateway translation is enabled, mobile Chinese input is translated to
757
- English before PM receives it, and PM English replies are translated to
758
- Chinese before Weixin receives them.
757
+ - Gateway can push PM assistant replies to the bound mobile chat whenever
758
+ gateway is enabled, even if that PM turn was started from desktop VCM.
759
+ - When gateway translation is enabled, mobile input is translated to English
760
+ before PM receives it, and PM English replies are translated before the mobile
761
+ chat receives them.
759
762
  - If PM reply translation fails or times out, Gateway sends a translation
760
763
  failure notice instead of the English source. The bound phone can send
761
764
  `/retry` to retry the latest failed output translation kept in memory.
762
765
  - The PM prompt does not include the original Chinese text.
763
- - There is no multi-user allowlist. The security model is one bound DM identity.
766
+ - There is no multi-user allowlist. The security model is one bound mobile
767
+ identity.
764
768
 
765
- The first channel is Tencent iLink Bot API / Weixin DM. VCM uses QR login,
766
- `getupdates` long polling, and `sendmessage` text replies. Gateway details and
767
- implementation plan live in `docs/gateway-design.md`.
769
+ The Weixin channel uses Tencent iLink QR login, `getupdates` long polling, and
770
+ `sendmessage` text replies. The Lark channel uses Lark bot App ID/App Secret,
771
+ WebSocket event delivery, and a short-lived `/bind CODE` pairing flow. Gateway
772
+ details and implementation plan live in `docs/gateway-design.md`.
768
773
 
769
774
  ## 15. Local State
770
775
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-coding-master",
3
- "version": "0.4.30",
3
+ "version": "0.4.32",
4
4
  "description": "Local GUI session cockpit for Claude Code role sessions.",
5
5
  "type": "module",
6
6
  "files": [
@@ -37,6 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@fastify/static": "^9.1.3",
40
+ "@larksuiteoapi/node-sdk": "^1.67.0",
40
41
  "@xterm/addon-fit": "^0.10.0",
41
42
  "@xterm/addon-web-links": "^0.11.0",
42
43
  "@xterm/xterm": "^5.5.0",
@@ -1,32 +0,0 @@
1
- /**
2
- * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
- * https://github.com/chjj/term.js
5
- * @license MIT
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in
15
- * all copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- * THE SOFTWARE.
24
- *
25
- * Originally forked from (with the author's permission):
26
- * Fabrice Bellard's javascript vt100 for jslinux:
27
- * http://bellard.org/jslinux/
28
- * Copyright (c) 2011 Fabrice Bellard
29
- * The original design remains. The terminal itself
30
- * has been extended to include xterm CSI codes, among
31
- * other features.
32
- */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f2ea;color:#1c2024;line-height:1.5}html,body,#root{height:100%}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f2ea}button,input,select,textarea{font:inherit}button{border:1px solid #9ba6ad;background:#f8f7f2;color:#1d252b;border-radius:6px;min-height:34px;padding:6px 10px;cursor:pointer}button:hover:not(:disabled){background:#eef4f2;border-color:#607d74}button:disabled{cursor:not-allowed;opacity:.55}.danger-button{border-color:#b84a45;background:#fff1ee;color:#8d211d;font-weight:750}.danger-button:hover:not(:disabled){border-color:#8d211d;background:#ffe2dc}input,select,textarea:not(.xterm-helper-textarea){width:100%;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:8px 10px}textarea:not(.xterm-helper-textarea){min-height:240px;resize:vertical;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}h1,h2,p{margin-top:0}h1{margin-bottom:4px;font-size:26px;line-height:1.15}h2{margin-bottom:10px;font-size:14px;letter-spacing:0}.app-shell{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);height:100vh;min-height:0;overflow:hidden}.app-shell.is-sidebar-collapsed{grid-template-columns:46px minmax(0,1fr)}.app-sidebar{position:relative;display:flex;flex-direction:column;min-width:0;border-right:1px solid #d3c9b8;background:#fbfaf6;padding:14px;overflow:auto}.app-shell.is-sidebar-collapsed .app-sidebar{overflow:hidden;padding:8px}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:2;display:grid;place-items:center;width:28px;min-height:28px;padding:0;background:#fffdf8}.sidebar-toggle:before{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;content:"";transform:translate(2px) rotate(135deg)}.app-shell.is-sidebar-collapsed .sidebar-toggle{left:9px;right:auto}.app-shell.is-sidebar-collapsed .sidebar-toggle:before{transform:translate(-2px) rotate(-45deg)}.sidebar-content{display:flex;flex:1;min-width:0;min-height:0}.project-dashboard{display:flex;flex:1;flex-direction:column;width:100%;min-height:100%}.app-shell.is-sidebar-collapsed .sidebar-content{width:0;opacity:0;pointer-events:none}.app-main{min-width:0;height:100%;padding:14px 16px;overflow:auto}.brand-header{display:flex;gap:12px;align-items:baseline;margin-bottom:10px;padding-right:34px}.brand-header strong{font-size:18px}.brand-header span,.muted{color:#667071;font-size:13px}.sidebar-section{margin-bottom:8px;border:1px solid #e0d6c7;border-radius:8px;background:#fffdfa;overflow:hidden}.sidebar-section-toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-height:34px;border:0;border-radius:0;background:transparent;color:#1c2024;font-size:13px;font-weight:750;text-align:left}.sidebar-section-toggle:hover{background:#f5f1e8}.sidebar-section-toggle[aria-expanded=true]{border-bottom:1px solid #ece5d9}.sidebar-section-chevron{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;transform:rotate(45deg)}.sidebar-section-toggle[aria-expanded=true] .sidebar-section-chevron{transform:rotate(-135deg)}.sidebar-section-content{padding:8px}.repo-connect,.project-summary,.repository-panel,.gateway-panel,.harness-panel,.task-create{margin:0}.repository-panel{display:grid;gap:10px}.repository-panel .project-summary{padding-top:10px;border-top:1px solid #ece5d9}.inline-form{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.inline-form.has-recent-paths{grid-template-columns:minmax(0,1fr) auto}.inline-form>input{grid-column:1 / -1}.inline-form>button{justify-self:end}.inline-form.has-recent-paths>button{justify-self:auto}.repo-recent-select{min-width:0;max-width:none}.project-summary dl{display:grid;gap:8px;margin:0}.project-summary div{min-width:0}.project-summary dt{color:#6c6255;font-size:12px}.project-summary dd{margin:0;overflow-wrap:anywhere;font-size:13px}.connected-repo-actions{display:flex;align-items:center;gap:8px;margin-top:10px}.connected-repo-actions button{min-height:30px}.gateway-actions{display:grid;gap:8px;margin-top:10px}.gateway-actions button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.gateway-actions .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.gateway-qr{display:grid;gap:6px;margin-top:10px}.gateway-qr img{width:100%;max-width:180px;border:1px solid #d3c9b8;border-radius:6px;background:#fff;padding:6px}.gateway-qr code{overflow-wrap:anywhere;font-size:11px}.warnings{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.success-banner{border:1px solid #2ea043;background:#eefbf0;color:#165c26;border-radius:6px;padding:10px 12px}.flow-pause-alert-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:#1f242b85;padding:20px}.flow-pause-alert{display:grid;gap:12px;width:min(460px,100%);border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 28px 72px #1f242b47;padding:22px}.flow-pause-alert-kicker{margin:0;color:#2f6f73;font-size:12px;font-weight:700;text-transform:uppercase}.flow-pause-alert h2{margin:0;font-size:24px;line-height:1.15}.flow-pause-alert p{margin:0;font-size:14px;line-height:1.5}.flow-pause-alert-hint{color:#49666a}.flow-pause-alert button{justify-self:end;min-width:110px;border:1px solid #2f6f73;background:#2f6f73;color:#fffdf8}.flow-pause-alert button:hover{background:#245c60}.ui-error-center{position:fixed;top:14px;right:14px;z-index:95;display:grid;gap:8px;width:min(520px,calc(100vw - 28px));max-height:min(58vh,540px);border:1px solid #c87b54;border-radius:8px;background:#fff4ed;color:#6f3218;box-shadow:0 18px 50px #1f242b33;padding:10px}.ui-error-center-header{display:flex;align-items:center;justify-content:space-between;gap:10px}.ui-error-center-header h2{margin:0;font-size:14px;line-height:1.2}.ui-error-center-header p{margin:2px 0 0;color:#8b4a28;font-size:11px;font-weight:700}.ui-error-center button{border-color:#c87b54;color:#6f3218;min-height:28px;padding:4px 8px;font-size:12px}.ui-error-list{display:grid;gap:8px;margin:0;padding:0;overflow:auto;list-style:none}.ui-error-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border-top:1px solid rgba(200,123,84,.32);padding-top:8px}.ui-error-list p{margin:0;font-size:12px;font-weight:700;line-height:1.4;overflow-wrap:anywhere}.ui-error-list span{display:block;margin-top:4px;color:#8b4a28;font-size:11px;font-weight:700}.role-recovery-toast{position:fixed;left:50%;bottom:18px;z-index:90;display:flex;align-items:center;gap:12px;max-width:calc(100vw - 32px);border:1px solid #b7791f;border-radius:8px;background:#fff8e6;color:#5f3b00;box-shadow:0 14px 42px #1f242b2e;padding:10px 12px;transform:translate(-50%)}.role-recovery-toast span{font-size:13px;font-weight:700;white-space:nowrap}.role-recovery-toast button{border-color:#b7791f;color:#5f3b00}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:10px}.harness-stage{display:grid;gap:8px}.harness-panel-header{display:flex;justify-content:space-between;gap:8px;align-items:center}.harness-panel-header h2,.harness-panel-header p,.harness-result p{margin-bottom:0}.harness-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-review-diff-button{width:100%}.harness-file-list-title{margin:0;font-size:12px}.harness-file-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-file-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;border:1px solid #ece5d9;border-radius:6px;padding:6px 8px;background:#fffdfa}.harness-file-list span{overflow:hidden;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.harness-changes,.harness-result{border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-changes h3{margin:0 0 4px;font-size:12px}.harness-changes ul,.harness-result ul{margin:0;padding-left:18px}.harness-bootstrap-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);background:#1f242b94;padding:14px}.harness-bootstrap-modal-surface{min-width:0;min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;border:1px solid #b9b0a1;border-radius:8px;background:#fffdf8;box-shadow:0 22px 64px #1f242b47;padding:10px}.harness-bootstrap-modal-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-bootstrap-modal-header p{max-width:min(720px,70vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.harness-bootstrap-controls{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(180px,.9fr) minmax(140px,.7fr) auto;gap:8px;align-items:end;min-width:0}.harness-bootstrap-controls label{display:grid;gap:4px;min-width:0}.harness-bootstrap-controls label span{color:#5f6a6c;font-size:11px;font-weight:650}.harness-bootstrap-controls select{width:100%;min-width:0;min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:3px 8px;font-size:12px}.harness-bootstrap-control-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-bootstrap-control-actions button{min-height:30px;padding:4px 9px;font-size:12px}.harness-bootstrap-terminal{min-width:0;min-height:0;display:grid}.task-create form{display:grid;gap:8px}.task-panel{display:grid;gap:10px}.task-panel-actions{display:grid;gap:8px;padding-top:10px;border-top:1px solid #ece5d9}.task-panel-actions .danger-button{width:100%;text-align:center}.task-create-preview{display:grid;gap:2px;border:1px solid #e0d6c7;border-radius:6px;background:#f8f7f2;padding:6px 8px}.task-create-option{display:flex;align-items:center;gap:8px;color:#1f242b;font-size:13px;font-weight:700}.task-create-option input{width:16px;height:16px;margin:0}.task-create-preview span{color:#255f3d;font-size:12px;font-weight:700}.task-create-preview small{overflow:hidden;color:#687273;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.task-nav{display:grid;gap:8px}.task-nav-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left}.task-nav-item.is-active,.role-tab.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings{display:grid;gap:8px}.sidebar-settings button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.sidebar-settings .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.switch-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;min-height:34px;border:1px solid #b9c0c4;border-radius:7px;background:#fffefa;color:#3f474a;padding:5px 8px;text-align:left}.switch-control:hover:not(:disabled){border-color:#2f7e84;background:#f2faf8}.switch-control:disabled{opacity:.6;cursor:not-allowed}.switch-control-label{min-width:0;overflow:hidden;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.switch-control-track{position:relative;justify-self:end;width:38px;height:20px;border-radius:999px;background:#b9c0c4;transition:background .16s ease}.switch-control-thumb{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:999px;background:#fffefa;box-shadow:0 1px 3px #12161838;transition:transform .16s ease}.switch-control.is-on{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.switch-control.is-on .switch-control-track{background:#2f7e84}.switch-control.is-on .switch-control-thumb{transform:translate(18px)}.sidebar-settings .switch-control,.gateway-actions .switch-control{width:100%}.sidebar-settings .theme-mode-toggle span:last-child{font-weight:750}.settings-select-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;font-size:13px;color:#5f6a6c}.settings-select-row select{min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326}.settings-status-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;border:1px solid #d4cec3;border-radius:6px;background:#fffdf8;padding:6px 10px;color:#5f6a6c;font-size:13px}.settings-status-row strong{color:#202326;font-size:12px}.settings-help-text{margin:0;color:#7b5e00;font-size:12px;line-height:1.35}.task-status-dock{display:grid;gap:10px;margin-top:auto;border-top:1px solid #d3c9b8;padding-top:10px}.task-status-dock-title,.current-round-title{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.task-status-dock-title strong{overflow:hidden;font-size:13px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.task-status-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0}.task-status-stats div,.current-round-status{min-width:0;border:1px solid #e0d6c7;border-radius:6px;background:#fffdfa}.task-status-stats div{padding:6px 7px}.task-status-stats dt{color:#6c6255;font-size:10px;font-weight:700;text-transform:uppercase}.task-status-stats dd{margin:0;overflow:hidden;color:#1f242b;font-size:12px;font-weight:750;text-overflow:ellipsis;white-space:nowrap}.current-round-status{display:grid;gap:8px;padding:8px}.current-round-title span:first-child{color:#3a4647;font-size:12px;font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(120px,max-content) minmax(0,1fr);gap:10px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.role-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:6px;margin-bottom:8px;min-width:0}.workspace-header .role-tabs{margin-bottom:0}.role-tab{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:30px;padding:4px 8px;text-align:left}.workspace-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1;gap:10px;align-items:stretch;min-height:0}.workspace-main{min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px}.role-console-stack{min-width:0;min-height:0;flex:1;display:flex;flex-direction:column}.role-console-panel{min-width:0;min-height:0;flex:1;display:none}.role-console-panel.is-active{display:flex;flex-direction:column}.session-console,.message-panel,.event-log,.empty-workspace{border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:10px}.task-workspace{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0}.session-console{display:flex;flex-direction:column;flex:1;height:100%;min-height:0}.session-controls{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;justify-content:flex-start;min-width:0;margin:0;overflow:hidden}.session-option-field{display:grid;grid-template-columns:auto minmax(120px,1fr);flex:0 1 210px;gap:5px;align-items:center;min-width:0}.permission-mode-field{flex-basis:250px}.model-field{flex-basis:220px}.effort-field{grid-template-columns:auto minmax(92px,1fr);flex-basis:150px}.session-option-field span{color:#5f6a6c;font-size:11px;font-weight:650;line-height:1;white-space:nowrap}.session-option-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.session-option-field select{width:100%;min-width:0;min-height:26px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:2px 7px;font-size:12px}.session-toolbar{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:5px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:26px;padding:2px 8px;font-size:12px}.session-harness-notice{display:inline-flex;flex:0 0 auto;gap:6px;align-items:center;min-width:0;border:1px solid #c4a34e;border-radius:6px;background:#fff8dd;color:#604e16;padding:2px 5px;font-size:11px}.session-harness-notice span:not(.status-badge){white-space:nowrap}.session-harness-notice button{min-height:24px;padding:1px 7px;font-size:11px}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);flex:1;min-width:0;min-height:0;height:100%}.session-console-body.has-translation{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:stretch}.terminal-pane,.translation-pane{display:grid;min-width:0;min-height:0;height:100%}.terminal-pane{grid-template-rows:auto minmax(0,1fr);gap:8px}.translation-pane{grid-template-rows:minmax(0,1fr)}.terminal-frame,.terminal-empty{width:100%;height:100%;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.terminal-empty{display:grid;place-items:center;align-content:center;gap:8px;color:#d6d0c6;border:1px solid #292d31}.translation-panel{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0;border:1px solid #292d31;border-radius:6px;background:#0d1117;color:#d6deeb;padding:8px;min-width:0;width:100%;overflow:hidden;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-backdrop{background:#010409b8}.translation-file-browser-backdrop{z-index:24}.file-translation-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:95vw;height:95vh;min-height:0;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 28px 80px #0000008f;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-header{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;min-width:0}.file-translation-header h2,.file-translation-header p{margin-bottom:0}.file-translation-header h2{font-size:18px}.file-translation-header p{color:#8b949e;font-size:12px}.file-translation-toolbar{display:flex;flex-wrap:wrap;gap:6px}.file-translation-toolbar button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.file-translation-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.file-translation-list,.file-translation-preview{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:8px}.file-translation-list{display:grid;align-content:start;gap:6px}.file-translation-item{display:grid;gap:3px;width:100%;min-width:0;border:1px solid #292d31;border-radius:6px;background:#111820;color:#d6deeb;padding:6px;text-align:left}.file-translation-item strong,.file-translation-item span{overflow-wrap:anywhere}.file-translation-item span{color:#8b949e;font-size:11px}.file-translation-item.is-active{border-color:#58a6ff;background:#142033}.file-translation-preview header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-bottom:8px;color:#8b949e;font-size:12px}.file-translation-preview{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;padding:10px}.file-translation-preview .translation-markdown{min-height:0;overflow:auto;padding-right:4px;font-size:13px;line-height:1.62}.file-translation-preview>.muted{align-self:center;justify-self:center;text-align:center}.translation-file-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:min(880px,calc(100vw - 32px));max-height:min(760px,calc(100vh - 48px));min-height:520px;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 24px 70px #0000007a;font-family:Menlo,Monaco,Consolas,monospace}.translation-file-browser-modal header,.translation-file-browser-controls,.translation-file-browser-nav,.translation-file-browser-search{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.translation-file-browser-modal header{justify-content:space-between}.translation-file-browser-modal h2,.translation-file-browser-modal h3,.translation-file-browser-modal p{margin-bottom:0}.translation-file-browser-modal h2{font-size:17px}.translation-file-browser-modal h3{color:#8b949e;font-size:12px;font-weight:600}.translation-file-browser-modal p{color:#8b949e;font-size:12px;overflow-wrap:anywhere}.translation-file-browser-controls{justify-content:space-between}.translation-file-browser-search{flex:1 1 320px;justify-content:flex-end}.translation-file-browser-search input{flex:1 1 180px;min-width:0}.translation-file-browser-modal button,.translation-file-browser-modal input{border:1px solid #3a4149;border-radius:6px;background:#111820;color:#d6deeb;min-height:30px;padding:4px 8px;font:inherit;font-size:12px}.translation-file-browser-modal button:hover:not(:disabled){border-color:#58a6ff;background:#162235}.translation-file-browser-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.42fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.translation-file-browser-list,.translation-file-browser-selection{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:10px}.translation-file-browser-group{display:grid;align-content:start;gap:6px;margin-bottom:12px}.translation-file-browser-entry{display:grid;grid-template-columns:38px minmax(0,1fr);gap:3px 8px;width:100%;min-width:0;text-align:left}.translation-file-browser-entry span{grid-row:span 2;align-self:center;color:#8b949e;font-size:11px}.translation-file-browser-entry strong,.translation-file-browser-entry small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.translation-file-browser-entry small{color:#8b949e}.translation-file-browser-entry.is-selected{border-color:#58a6ff;background:#142033}.translation-file-browser-selection{display:grid;align-content:start;gap:12px}.translation-file-browser-selection label{display:grid;gap:5px}.translation-file-browser-selection span{color:#8b949e;font-size:12px}.translation-file-browser-selection input{width:100%;min-width:0}.translation-panel-header{display:grid;flex:0 0 auto;gap:3px}.translation-panel-titlebar,.translation-panel-actions,.translation-status-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:space-between}.translation-panel-header h2,.translation-panel-header p{margin-bottom:0}.translation-panel-titlebar h2{font-size:16px}.translation-panel-header p,.translation-composer span{color:#8b949e;font-size:12px}.translation-panel-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.translation-panel-actions button:hover:not(:disabled),.translation-composer-actions button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}.translation-panel-actions{justify-content:flex-end}.translation-entry-list{display:grid;flex:1 1 auto;align-content:start;gap:8px;min-height:0;min-width:0;overflow-x:hidden;overflow-y:auto;scrollbar-color:#4b5563 #0d1117}.translation-entry{border:0;border-radius:0;background:transparent;min-width:0;max-width:100%;padding:0}.translation-conversation-boundary{display:grid;grid-template-columns:minmax(18px,1fr) auto auto auto minmax(18px,1fr);gap:8px;align-items:center;color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.4;white-space:nowrap}.translation-boundary-dash{min-width:0;border-top:1px dashed #3a4149}.translation-entry.is-user-input{border-top:4px solid #3a4149;margin-top:14px;padding-top:14px}.translation-entry.is-user-input:first-child{margin-top:0}.translation-entry pre{box-sizing:border-box;margin:0;max-height:none;max-width:100%;min-width:0;overflow:visible;white-space:pre-wrap;overflow-wrap:anywhere;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.45;color:#d6deeb}.translation-markdown{max-width:100%;min-width:0;color:#d6deeb;font-size:12px;line-height:1.55;overflow-wrap:anywhere}.translation-markdown>:first-child{margin-top:0}.translation-markdown>:last-child{margin-bottom:0}.translation-markdown p,.translation-markdown ul,.translation-markdown ol,.translation-markdown blockquote,.translation-markdown pre,.translation-markdown table{margin:0 0 8px}.translation-markdown h1,.translation-markdown h2,.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{margin:10px 0 6px;color:#f0f6fc;font-weight:700;line-height:1.25}.translation-markdown h1{font-size:17px}.translation-markdown h2{font-size:15px}.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{font-size:13px}.translation-markdown ul,.translation-markdown ol{padding-left:22px}.translation-markdown li{margin:2px 0}.translation-markdown .task-list-item{list-style:none}.translation-markdown input[type=checkbox]{width:13px;height:13px;margin:0 6px 0 0;accent-color:#56d364}.translation-markdown blockquote{border-left:3px solid #3a4149;color:#b7c0ca;padding-left:10px}.translation-markdown a{color:#79c0ff}.translation-markdown code{border-radius:4px;background:#161b22;color:#f0f6fc;padding:1px 4px;font-family:Menlo,Monaco,Consolas,monospace;font-size:.95em}.translation-markdown pre{overflow-x:auto;border:1px solid #292d31;border-radius:6px;background:#111316;padding:8px;white-space:pre}.translation-markdown pre code{background:transparent;padding:0}.translation-markdown table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse}.translation-markdown img{max-width:100%;border-radius:4px}.translation-markdown th,.translation-markdown td{border:1px solid #30363d;padding:4px 6px;text-align:left;vertical-align:top}.translation-markdown hr{border:0;border-top:1px solid #292d31;margin:10px 0}.translation-entry.is-tool-output pre{display:block;overflow:hidden;color:#7d8590;text-overflow:ellipsis;white-space:nowrap;width:100%}.translation-entry-note{margin:2px 0 0;color:#6e7681;font-size:10px;line-height:1.35}.translation-entry-note.is-error{color:#a3715f}.translation-composer{display:grid;flex:0 0 auto;gap:6px;border-top:1px solid #292d31;padding-top:8px}.translation-composer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.translation-composer textarea{width:100%;min-height:38px;max-height:88px;border-color:#3a4149;background:#0d1117;color:#d6deeb;font-family:inherit;font-size:12px;line-height:1.35;resize:vertical}.translation-composer textarea::placeholder{color:#7d8590}.translation-composer textarea::selection{background:#8b949e59;color:#fff}.translation-composer textarea:focus,.translation-composer textarea:focus-visible{border-color:#4b5563;outline:none;box-shadow:none}.translation-composer-actions{display:grid;align-content:start;gap:6px;min-width:104px}.translation-composer-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;width:100%;min-height:38px;padding:4px 9px;font-size:12px}.translation-panel .muted{color:#8b949e}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#181c1f61;padding:18px}.translator-session-backdrop{background:#010409b8}.translator-session-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;width:95vw;height:92vh;min-width:0;min-height:0;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:10px}.translator-session-header{display:flex;gap:10px;align-items:center;justify-content:space-between;min-width:0}.translator-session-header h2,.translator-session-header p{margin-bottom:0}.translator-session-header p{color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translator-session-terminal{min-width:0;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.harness-studio-backdrop{background:#010409b8}.harness-studio-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:96vw;height:94vh;min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.harness-studio-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-studio-header h2,.harness-studio-header p{margin-bottom:0}.harness-studio-header p{color:#8b949e}.harness-studio-header-actions{display:flex;gap:8px;align-items:center}.harness-studio-layout{display:grid;grid-template-columns:minmax(340px,.85fr) minmax(640px,1.55fr);gap:12px;height:100%;min-width:0;min-height:0;overflow:hidden}.harness-studio-left{display:grid;align-content:start;gap:10px;min-width:0;min-height:0;overflow:auto;padding-right:2px}.harness-studio-left-preview{grid-template-rows:minmax(0,1fr);height:100%;align-content:stretch;overflow:hidden;padding-right:0}.harness-studio-section{min-width:0;border:1px solid #30363d;border-radius:6px;background:#0b1017;padding:10px}.harness-studio-section h3{margin-bottom:8px;font-size:14px}.harness-studio-collapsible-section{padding:0;overflow:hidden}.harness-studio-collapsible-section summary{display:flex;gap:8px;align-items:center;justify-content:space-between;padding:10px;cursor:pointer;list-style:none}.harness-studio-collapsible-section summary::-webkit-details-marker{display:none}.harness-studio-collapsible-section summary h3{margin:0}.harness-studio-collapsible-section summary span{color:#8b949e;font-size:11px}.harness-studio-collapsible-section[open] summary span{color:#d6deeb}.harness-studio-collapsible-content{padding:0 10px 10px}.harness-studio-engineer{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:8px;min-height:0}.harness-studio-engineer-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-studio-engineer-header p{margin-bottom:0}.harness-studio-file-preview{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:10px;height:100%;min-width:0;min-height:0;overflow:hidden}.harness-studio-file-editor-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-studio-file-editor-header p{margin-bottom:0}.harness-studio-file-editor-header h3,.harness-studio-file-editor-header p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-editor-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;align-items:center}.harness-studio-file-textarea{grid-row:4;align-self:stretch;height:100%;width:100%;min-width:0;min-height:0;overflow:auto;resize:none;border:1px solid #30363d;border-radius:6px;background:#090d13;color:#d6deeb;padding:10px;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.55}.harness-studio-file-textarea:read-only{background:#080c12;color:#8b949e;cursor:default}.harness-studio-file-textarea.is-editing{background:#090d13;color:#d6deeb;cursor:text}.harness-studio-file-textarea:disabled{opacity:.72}.harness-engineer-terminal{min-width:0;min-height:0;overflow:hidden;border-radius:6px;background:#111316}.harness-feedback-float{position:fixed;left:18px;bottom:18px;z-index:40;display:grid;gap:6px;width:min(360px,calc(100vw - 36px));border:1px solid #b7bec4;border-radius:8px;background:#fffefa;box-shadow:0 18px 42px #2023262e;padding:10px}.harness-feedback-float.needs-review{border-color:#2f7e84;background:#e8f4f2}.harness-feedback-float div:first-child{display:flex;gap:8px;align-items:center;justify-content:space-between;min-width:0}.harness-feedback-float strong,.harness-feedback-float p{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-feedback-float span{color:#5f6a6c;font-size:12px;white-space:nowrap}.harness-feedback-float p{margin:0;color:#3f474a;font-size:13px}.harness-feedback-float-actions{display:flex;gap:8px;justify-content:flex-end}.harness-feedback-float-actions button{min-height:28px;padding:3px 9px;font-size:12px}.harness-feedback-backdrop{z-index:55}.harness-feedback-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:10px;width:min(1100px,calc(100vw - 32px));height:min(820px,calc(100vh - 32px));min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.harness-feedback-modal header{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;min-width:0}.harness-feedback-modal h2,.harness-feedback-modal h3,.harness-feedback-modal p{margin-bottom:0}.harness-feedback-modal-body{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:10px;min-width:0;min-height:0;overflow:hidden}.harness-feedback-modal-body section{display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;min-width:0;min-height:0;border:1px solid #30363d;border-radius:6px;padding:10px}.harness-feedback-modal pre{min-width:0;min-height:0;margin:0;overflow:auto;white-space:pre-wrap;word-break:break-word;color:#d6deeb;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.55}.harness-feedback-review-actions{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:end;min-width:0}.harness-feedback-review-actions textarea{min-height:70px;resize:vertical}.harness-feedback-review-actions div{display:flex;gap:8px;align-items:center}.harness-studio-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}.harness-studio-metric{display:grid;gap:4px;min-width:0;border:1px solid #30363d;border-radius:6px;padding:8px}.harness-studio-metric span{color:#8b949e;font-size:11px}.harness-studio-metric strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-list,.harness-studio-doc-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-studio-file-list li,.harness-studio-doc-list li{display:grid;gap:8px;align-items:center;min-width:0;border:1px solid #30363d;border-radius:6px;padding:8px}.harness-studio-file-list li{grid-template-columns:minmax(0,1fr) auto auto}.harness-studio-doc-list li{grid-template-columns:minmax(0,1fr) auto}.harness-studio-file-list li.selected{border-color:#58a6ff;background:#0f1b2d}.harness-studio-file-list button{min-width:0;overflow:hidden;border:0;background:transparent;color:inherit;padding:0;text-align:left;text-overflow:ellipsis;white-space:nowrap}.harness-studio-file-list .harness-studio-file-copy-button{border:1px solid #30363d;border-radius:5px;background:#161b22;color:#d6deeb;padding:4px 8px;text-align:center}.harness-studio-file-list .harness-studio-file-copy-button:hover{border-color:#58a6ff}.harness-studio-file-list span:first-child,.harness-studio-doc-list span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.repository-diff-backdrop{background:#010409b8}.repository-diff-modal{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:10px;width:96vw;height:94vh;min-width:0;min-height:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:12px}.repository-diff-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.repository-diff-header h2,.repository-diff-header p,.repository-diff-file-header h3,.repository-diff-file-header p{margin-bottom:0}.repository-diff-header p,.repository-diff-file-header p{color:#8b949e}.repository-diff-header-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.repository-diff-commit-picker{display:inline-flex;gap:8px;align-items:center;min-width:280px}.repository-diff-commit-picker span{color:#8b949e;font-size:12px;font-weight:700}.repository-diff-commit-picker select{min-width:260px;max-width:520px}.repository-diff-warnings{margin-top:0}.repository-diff-body{display:grid;grid-template-columns:minmax(280px,.32fr) minmax(0,1fr);gap:10px;min-width:0;min-height:0}.repository-diff-sidebar,.repository-diff-main{min-width:0;min-height:0;border:1px solid #30363d;border-radius:6px;background:#0b1017}.repository-diff-sidebar{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden}.repository-diff-summary{display:grid;gap:4px;border-bottom:1px solid #30363d;padding:10px;font-size:12px}.repository-diff-summary span{color:#8b949e}.repository-diff-file-list{display:grid;align-content:start;gap:6px;min-width:0;margin:0;padding:10px;overflow:auto;list-style:none}.repository-diff-file-list li{min-width:0}.repository-diff-file-list button{display:grid;gap:4px;width:100%;min-width:0;border:1px solid #30363d;border-radius:6px;background:transparent;color:inherit;padding:8px;text-align:left}.repository-diff-file-list li.selected button{border-color:#58a6ff;background:#0f1b2d}.repository-diff-file-list span,.repository-diff-file-list small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.repository-diff-file-list small{color:#8b949e}.repository-diff-empty{color:#8b949e;font-size:13px}.repository-diff-main{display:grid;grid-template-rows:auto auto auto minmax(0,1fr);gap:8px;overflow:hidden;padding:10px}.repository-diff-file-header{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;min-width:0}.repository-diff-file-header h3{overflow-wrap:anywhere;font-size:15px}.repository-diff-stats{flex:0 0 auto;color:#7ee787;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.repository-diff-code{min-width:0;min-height:0;margin:0;overflow:auto;border:1px solid #30363d;border-radius:6px;background:#090d13;color:#d6deeb;padding:0;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre}.repository-diff-line{display:block;min-width:max-content;border-left:3px solid transparent;padding:0 12px}.repository-diff-line-context{color:#c9d1d9}.repository-diff-line-added{border-left-color:#3fb950;background:#2ea04333;color:#aff5b4}.repository-diff-line-deleted{border-left-color:#f85149;background:#f851492e;color:#ffdcd7}.repository-diff-line-hunk{border-left-color:#58a6ff;background:#388bfd29;color:#79c0ff}.repository-diff-placeholder{display:grid;place-items:center;min-height:240px;color:#8b949e}.gateway-qr-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:14px;width:min(520px,100%);max-height:min(720px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:16px}.message-modal,.event-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:hidden;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.gateway-qr-modal header,.message-modal header,.event-modal header,.gateway-qr-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.gateway-qr-modal h2,.gateway-qr-modal p{margin-bottom:0}.gateway-qr-modal-body{display:grid;gap:14px;justify-items:center}.gateway-qr-code-frame{display:grid;place-items:center;width:min(360px,100%);aspect-ratio:1;border:1px solid #d6d0c6;border-radius:8px;background:#fff;padding:18px}.gateway-qr-code-frame img{display:block;width:100%;height:auto}.gateway-qr-placeholder{color:#667071;text-align:center}.gateway-qr-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;width:100%;margin:0}.gateway-qr-meta div{min-width:0;border:1px solid #ece5d9;border-radius:6px;padding:8px}.gateway-qr-meta dt{color:#6c6255;font-size:11px;font-weight:700;text-transform:uppercase}.gateway-qr-meta dd{margin:0;overflow-wrap:anywhere;font-size:13px}.message-modal h2,.message-modal p,.event-modal h2,.event-modal p{margin-bottom:0}.translation-test-result{border-radius:6px;padding:8px;font-size:13px}.translation-test-result.is-ok{border:1px solid #6ea77e;background:#e6f3e9;color:#245334}.translation-test-result.is-error{border:1px solid #c46e5f;background:#fae9e6;color:#6f2b21}.message-panel{display:grid;gap:8px}.message-modal .message-panel,.event-modal .event-log{min-height:0;overflow:auto;border:0;background:transparent;padding:0}.message-panel-header{display:flex;justify-content:space-between;gap:12px;align-items:center}.message-panel-header h2,.message-panel-header p{margin-bottom:0}.message-controls,.message-mode-toggle,.modal-actions,.message-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.message-mode-toggle{width:auto;min-width:220px;font-size:13px}.message-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.message-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid #ece5d9;border-radius:6px;padding:8px;background:#fffdfa}.message-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:4px}.message-meta time,.message-meta span:not(.status-badge),.message-reason,.message-path{color:#667071;font-size:12px}.message-sequence{min-width:32px;color:#1f242b;font-weight:800}.message-actions button{min-height:30px;padding:4px 10px}.message-item p{display:-webkit-box;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.message-reason,.message-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log ol{margin:0;padding-left:22px;font-size:13px}.event-log{max-height:92px;overflow:auto}.event-log h2{margin-bottom:4px;font-size:13px}.event-log p{margin-bottom:0}.event-log li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:66px;min-height:20px;border-radius:999px;padding:2px 8px;border:1px solid #c7c1b8;background:#f2eee7;color:#4f5558;font-size:11px;white-space:nowrap}.status-active,.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-created,.status-idle,.status-disabled{border-color:#9aa3a8;background:#edf0f1;color:#465056}.status-blocked,.status-crashed,.status-missing,.status-empty,.status-delete{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-waiting,.status-starting,.status-incomplete,.status-outdated{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-exited,.status-done,.status-stopped,.status-resumable,.status-skipped,.status-overridden,.status-not_required{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.status-queued,.status-translating,.status-ready,.status-create,.status-insert,.status-update{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-rejected,.status-failed,.status-delivery_failed,.status-response_ready_missing_result,.status-cancelled,.status-blocked{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-pending{border-color:#c7c1b8;background:#f2eee7;color:#4f5558}.status-translated,.status-preserved{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.empty-workspace{max-width:680px}@media(max-width:980px){.app-shell,.workspace-grid{grid-template-columns:1fr}.app-sidebar{border-right:0;border-bottom:1px solid #d3c9b8}.role-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}.session-console-body.has-translation,.translation-file-browser-layout{grid-template-columns:1fr}.session-controls,.session-toolbar{flex-wrap:wrap;overflow:visible}.file-translation-modal{width:95vw;height:95vh;padding:10px}.file-translation-layout{grid-template-columns:minmax(180px,240px) minmax(0,1fr)}.translation-file-browser-modal{min-height:0}}@media(max-width:700px){.file-translation-layout{grid-template-columns:1fr;grid-template-rows:minmax(140px,28vh) minmax(0,1fr)}.file-translation-header{align-items:stretch}.file-translation-toolbar{width:100%}.file-translation-toolbar button{flex:1 1 auto}}@media(max-width:560px){.app-main,.app-sidebar{padding:12px}.workspace-header,.inline-form,.inline-form.has-recent-paths{grid-template-columns:1fr;display:grid}.role-tabs{grid-template-columns:1fr}.terminal-frame,.terminal-empty{min-height:300px;height:54vh}.session-option-field{grid-template-columns:1fr;width:100%}.translation-file-browser-modal{width:calc(100vw - 20px);max-height:calc(100vh - 20px);padding:10px}.file-translation-modal{width:calc(100vw - 12px);height:calc(100vh - 12px)}.translation-file-browser-controls,.translation-file-browser-search{display:grid;grid-template-columns:1fr}}.harness-bootstrap-terminal .terminal-frame{height:100%;min-height:0}:root[data-theme=dark]{color-scheme:dark;background:#0d1117;color:#e6edf3}:root[data-theme=dark] body,:root[data-theme=dark] .app-main{background:#0d1117;color:#e6edf3}:root[data-theme=dark] button{border-color:#3d4652;background:#161b22;color:#e6edf3}:root[data-theme=dark] button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}:root[data-theme=dark] input,:root[data-theme=dark] select,:root[data-theme=dark] textarea:not(.xterm-helper-textarea){border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] input::placeholder,:root[data-theme=dark] textarea::placeholder{color:#7d8590}:root[data-theme=dark] .danger-button{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .danger-button:hover:not(:disabled){border-color:#ffa198;background:#3d1f23}:root[data-theme=dark] .app-sidebar{border-color:#30363d;background:#0f141b}:root[data-theme=dark] .sidebar-toggle{background:#161b22}:root[data-theme=dark] .brand-header span,:root[data-theme=dark] .muted,:root[data-theme=dark] .message-meta time,:root[data-theme=dark] .message-meta span:not(.status-badge),:root[data-theme=dark] .message-reason,:root[data-theme=dark] .message-path{color:#8b949e}:root[data-theme=dark] .sidebar-section,:root[data-theme=dark] .session-console,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .gateway-qr-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .gateway-qr-code-frame,:root[data-theme=dark] .gateway-qr-meta div{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .gateway-qr-code-frame{background:#f6f8fa}:root[data-theme=dark] .gateway-qr-meta dt,:root[data-theme=dark] .gateway-qr-placeholder{color:#8b949e}:root[data-theme=dark] .sidebar-section-toggle{color:#e6edf3}:root[data-theme=dark] .sidebar-section-toggle:hover{background:#161b22}:root[data-theme=dark] .sidebar-section-toggle[aria-expanded=true]{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .session-option-field small,:root[data-theme=dark] .task-create-preview small{color:#8b949e}:root[data-theme=dark] .warnings{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .ui-error-center{border-color:#da7b72;background:#2d1518;color:#ffdcd7;box-shadow:0 18px 50px #0104098f}:root[data-theme=dark] .ui-error-center-header p,:root[data-theme=dark] .ui-error-list span{color:#ffb4ab}:root[data-theme=dark] .ui-error-center button{border-color:#da7b72;color:#ffdcd7}:root[data-theme=dark] .ui-error-list li{border-top-color:#da7b7257}:root[data-theme=dark] .success-banner{border-color:#3fb950;background:#112718;color:#aff5b4}:root[data-theme=dark] .flow-pause-alert-backdrop{background:#010409b8}:root[data-theme=dark] .flow-pause-alert{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 28px 72px #0104099e}:root[data-theme=dark] .flow-pause-alert-kicker,:root[data-theme=dark] .flow-pause-alert-hint{color:#9debf2}:root[data-theme=dark] .flow-pause-alert button{border-color:#56d4dd;background:#56d4dd;color:#061114}:root[data-theme=dark] .flow-pause-alert button:hover{background:#84f3fa}:root[data-theme=dark] .role-recovery-toast{border-color:#d29922;background:#2d230d;color:#ffdf8b;box-shadow:0 14px 42px #01040985}:root[data-theme=dark] .role-recovery-toast button{border-color:#d29922;color:#ffdf8b}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .gateway-qr img,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .task-status-stats div,:root[data-theme=dark] .current-round-status,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .harness-bootstrap-modal{background:#010409b8}:root[data-theme=dark] .harness-bootstrap-modal-surface{border-color:#30363d;background:#0d1117;box-shadow:0 22px 64px #0104099e}:root[data-theme=dark] .harness-bootstrap-controls label span{color:#b7c0ca}:root[data-theme=dark] .harness-bootstrap-controls select{border-color:#3a4149;background:#0d1117;color:#d6deeb}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-status-dock{border-color:#30363d}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .task-status-stats dt{color:#8b949e}:root[data-theme=dark] .task-status-stats dd,:root[data-theme=dark] .current-round-title span:first-child{color:#e6edf3}:root[data-theme=dark] .message-sequence{color:#f0f6fc}:root[data-theme=dark] .settings-help-text{color:#d29922}:root[data-theme=dark] .task-nav-item.is-active,:root[data-theme=dark] .role-tab.is-active,:root[data-theme=dark] .sidebar-settings .settings-toggle.is-active,:root[data-theme=dark] .gateway-actions .settings-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .switch-control{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .switch-control:hover:not(:disabled){border-color:#56d4dd;background:#1a2530}:root[data-theme=dark] .switch-control-track{background:#3d4652}:root[data-theme=dark] .switch-control-thumb{background:#e6edf3;box-shadow:0 1px 4px #0104097a}:root[data-theme=dark] .switch-control.is-on{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .switch-control.is-on .switch-control-track{background:#56d4dd}:root[data-theme=dark] .harness-feedback-float{border-color:#3d4652;background:#161b22;color:#d6deeb;box-shadow:0 18px 42px #0104097a}:root[data-theme=dark] .harness-feedback-float.needs-review{border-color:#56d4dd;background:#10262b}:root[data-theme=dark] .harness-feedback-float p{color:#d6deeb}:root[data-theme=dark] .harness-feedback-float span{color:#8b949e}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .settings-select-row{color:#b7c0ca}:root[data-theme=dark] .terminal-empty{border-color:#30363d}:root[data-theme=dark] .modal-backdrop{background:#010409b8}:root[data-theme=dark] .message-modal .message-panel,:root[data-theme=dark] .event-modal .event-log{background:transparent}:root[data-theme=dark] .status-badge{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-ok,:root[data-theme=dark] .status-active,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-created,:root[data-theme=dark] .status-idle,:root[data-theme=dark] .status-disabled{border-color:#69717d;background:#20262f;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-error,:root[data-theme=dark] .status-blocked,:root[data-theme=dark] .status-crashed,:root[data-theme=dark] .status-missing,:root[data-theme=dark] .status-empty,:root[data-theme=dark] .status-delete,:root[data-theme=dark] .status-rejected,:root[data-theme=dark] .status-failed,:root[data-theme=dark] .status-delivery_failed,:root[data-theme=dark] .status-response_ready_missing_result,:root[data-theme=dark] .status-cancelled{border-color:#f85149;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .status-waiting,:root[data-theme=dark] .status-starting,:root[data-theme=dark] .status-incomplete,:root[data-theme=dark] .status-queued,:root[data-theme=dark] .status-translating,:root[data-theme=dark] .status-ready,:root[data-theme=dark] .status-create,:root[data-theme=dark] .status-insert,:root[data-theme=dark] .status-update{border-color:#d29922;background:#2d2208;color:#f8e3a1}:root[data-theme=dark] .status-exited,:root[data-theme=dark] .status-done,:root[data-theme=dark] .status-stopped,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-skipped,:root[data-theme=dark] .status-overridden,:root[data-theme=dark] .status-not_required,:root[data-theme=dark] .status-translated,:root[data-theme=dark] .status-preserved{border-color:#388bfd;background:#10223a;color:#c9e2ff}:root[data-theme=dark] .status-pending{border-color:#3d4652;background:#161b22;color:#d6deeb}