diff --git a/crates/webcodex-core/src/runner_protocol.rs b/crates/webcodex-core/src/runner_protocol.rs index 9d5eba2a..9a593b7a 100644 --- a/crates/webcodex-core/src/runner_protocol.rs +++ b/crates/webcodex-core/src/runner_protocol.rs @@ -4837,6 +4837,7 @@ mod envelope_tests { "apply_text_edit_line_scope", "apply_patch", "apply_patch_match_metadata", + "apply_patch_matching_mode", "apply_patch_strict_matching", "git", "jobs", @@ -4876,6 +4877,7 @@ mod envelope_tests { "coding_agent_runs", "native_tool_plugins", "managed_ssh_resources", + "runner_config_control", "computer_control", "computer_scroll_to_element", "computer_key_input", diff --git a/crates/webcodex-tool-contracts/src/tool_catalog.rs b/crates/webcodex-tool-contracts/src/tool_catalog.rs index 15f2de48..6f204083 100644 --- a/crates/webcodex-tool-contracts/src/tool_catalog.rs +++ b/crates/webcodex-tool-contracts/src/tool_catalog.rs @@ -241,6 +241,8 @@ pub const TOOL_DISCOVERY_GROUPS: &[ToolDiscoveryGroup] = &[ "list_projects", "list_runners", "runtime_status", + "runner_config_check", + "runner_config_reload", "tool_manifest", "plugin_tool", ], diff --git a/crates/webcodex-tool-runtime-contracts/src/tool_call_test_support.rs b/crates/webcodex-tool-runtime-contracts/src/tool_call_test_support.rs index 6c203906..92baa687 100644 --- a/crates/webcodex-tool-runtime-contracts/src/tool_call_test_support.rs +++ b/crates/webcodex-tool-runtime-contracts/src/tool_call_test_support.rs @@ -126,6 +126,7 @@ fn sample_field_value(field: &str) -> Value { "base_commit" => json!("a".repeat(40)), "head_commit" => json!("b".repeat(40)), "expected_head" => json!("a".repeat(40)), + "expected_generation" => json!(1), "expected_revision" => json!(format!("sha256:{}", "a".repeat(64))), "expected_generation" => json!(1), "name" => json!("Private Drop"), diff --git a/docs/runtime-console.md b/docs/runtime-console.md index deabb6ce..d56c079c 100644 --- a/docs/runtime-console.md +++ b/docs/runtime-console.md @@ -22,3 +22,25 @@ Mobile operation navigation closes after selection and focuses the destination. These are presentation changes. Workflow Session and durable Agent identities, credential scopes, refresh behavior, and mutation handling keep their existing contracts. Model-reported progress remains informational. + +Each selected Project/workspace has its own keyboard-accessible disclosure below +its Runner. Closing it hides that workspace's Sessions without clearing the +selected Session or composer; its preference survives refresh. Selecting another +workspace opens its Session list. + +At widths of 1280px and above, Context docks beside a narrower conversation, with +more room for readable status and progress. Its Overview starts with the latest +retained Agent-authored message. Resolution text is also visible directly below +the original message, rather than only in a tooltip. + +Project search continues to query authorized Projects by name, id, Runner, or +workspace path. Separate searches filter the loaded Sessions by title/id/lifecycle +and retained messages by body, resolution, id, or author Session. Match counts +refer only to loaded results; these controls do not search unretained history or +host transcripts and do not change the selected Session. + +The Session board is not a mirrored host chat transcript. An observed ACK records +an explicit model-context acknowledgement, not a reply, read receipt, or completed +work. Model replies appear only when explicitly posted to the Session; reported +progress is separately labeled as informational. An empty latest-message card +means no Agent message exists in the currently retained window. diff --git a/frontend/dist/runtime.css b/frontend/dist/runtime.css index 0cdbcec9..adc82b6e 100644 --- a/frontend/dist/runtime.css +++ b/frontend/dist/runtime.css @@ -1 +1 @@ -:root{font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","PingFang SC","Microsoft YaHei",Inter,ui-sans-serif,system-ui,"Segoe UI",sans-serif;color-scheme:dark;--page:#090a0d;--page-end:#090a0d;--page-surface:#0c0e12;--sidebar:#111318;--sidebar-drawer:#111318;--topbar:rgba(12,14,18,.84);--sidebar-hover:rgba(255,255,255,.048);--sidebar-selected:rgba(117,126,232,.13);--composer:rgba(20,22,28,.9);--surface:rgba(22,24,30,.97);--surface-solid:#16181e;--surface-soft:rgba(255,255,255,.05);--surface-raised:#181a20;--surface-inset:rgba(255,255,255,.035);--input:rgba(255,255,255,.052);--text:#f2f3f5;--muted:#91969f;--muted-strong:#c7cad0;--placeholder:#737984;--border:rgba(255,255,255,.105);--border-soft:rgba(255,255,255,.065);--glass-highlight:transparent;--glass-sheen:transparent;--glass-glow:transparent;--glass-edge:var(--border);--message-incoming-bg:rgba(255,255,255,.055);--message-incoming-border:rgba(255,255,255,.075);--message-outgoing-bg:#285487;--message-outgoing-border:rgba(132,178,235,.2);--message-outgoing-text:#f8faff;--message-bubble-radius:22px;--accent:#9ba4ff;--accent-soft:rgba(112,122,225,.16);--accent-border:rgba(143,152,244,.46);--accent-solid:#6571d6;--accent-hover:#7681e4;--pass:#4bd38a;--warn:#f0ae5c;--fail:#ff7e82;--danger-bg:rgba(255,104,110,.1);--danger-border:rgba(255,118,123,.34);--overlay:rgba(5,7,11,.58);--scrollbar:rgba(184,193,207,.28);--avatar:rgba(255,255,255,.15);--send-bg:#f6f8fc;--send-text:#151922;--ambient-one:transparent;--ambient-two:transparent;--ambient-three:transparent;--layout-major:61.8%;--layout-minor:38.2%;--layout-tertiary:23.6%;--sidebar-width:clamp(300px,21vw,356px);--context-rail-width:clamp(320px,18vw,360px);--header-height:68px;--content-width:1120px;--content-gutter:clamp(20px,3vw,56px);--ease-out:cubic-bezier(.23,1,.32,1);--ease-drawer:cubic-bezier(.32,.72,0,1);--glass-blur:blur(14px) saturate(120%);--shadow-window:none;--shadow-raised:0 20px 60px rgba(0,0,0,.42)}:root[data-resolved-theme="light"]{color-scheme:light;--page:#f4f4f1;--page-end:#f4f4f1;--page-surface:#fafaf8;--sidebar:#efefec;--sidebar-drawer:#f4f4f1;--topbar:rgba(250,250,248,.86);--sidebar-hover:rgba(30,31,35,.045);--sidebar-selected:rgba(83,96,189,.095);--composer:rgba(255,255,253,.92);--surface:rgba(255,255,253,.97);--surface-solid:#fffffd;--surface-soft:rgba(27,29,35,.045);--surface-raised:#fffffd;--surface-inset:rgba(27,29,35,.035);--input:rgba(27,29,35,.045);--text:#202126;--muted:#737780;--muted-strong:#4e525b;--placeholder:#90949c;--border:rgba(30,31,35,.115);--border-soft:rgba(30,31,35,.07);--glass-highlight:transparent;--glass-sheen:transparent;--glass-glow:transparent;--glass-edge:var(--border);--message-incoming-bg:rgba(25,32,45,.055);--message-incoming-border:rgba(25,32,45,.065);--message-outgoing-bg:#2866a8;--message-outgoing-border:rgba(24,73,135,.2);--message-outgoing-text:#ffffff;--accent:#4f5eba;--accent-soft:rgba(83,96,189,.105);--accent-border:rgba(83,96,189,.34);--accent-solid:#5967c4;--accent-hover:#4d5bb6;--pass:#188659;--warn:#af680e;--fail:#d84d53;--danger-bg:rgba(216,77,83,.08);--danger-border:rgba(216,77,83,.26);--overlay:rgba(37,45,59,.24);--scrollbar:rgba(74,86,105,.25);--avatar:rgba(45,60,83,.12);--send-bg:#2875e5;--send-text:#fff;--ambient-one:transparent;--ambient-two:transparent;--ambient-three:transparent;--glass-blur:blur(14px) saturate(115%);--shadow-window:none;--shadow-raised:0 22px 60px rgba(45,52,68,.18)}*{box-sizing:border-box}[hidden]{display:none !important}html,body{width:100%;height:100%;background:var(--page)}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;overflow:hidden;overscroll-behavior:none;background:var(--page);color:var(--text);font-feature-settings:"kern" 1,"liga" 1;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button,input,select,textarea{font:inherit}button,summary,[role="option"]{-webkit-tap-highlight-color:transparent}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,[role="option"]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::selection{background:var(--accent-border);color:var(--text)}svg{display:block;fill:none;stroke:currentColor;stroke-width:1.65;stroke-linecap:round;stroke-linejoin:round}h1,h2,h3,h4,p{margin-top:0}h1{margin-bottom:3px;font-size:1.35rem}h2{margin-bottom:0;font-size:.95rem}h3{margin-bottom:8px;font-size:.86rem}h4{margin-bottom:5px;color:var(--muted);font-size:.7rem;letter-spacing:.065em;text-transform:uppercase}.muted{color:var(--muted)}.small{font-size:.78rem;line-height:1.45}.error{color:var(--fail)}.eyebrow{margin-bottom:3px;color:var(--muted);font-size:.69rem;font-weight:700;letter-spacing:.075em;text-transform:uppercase}.visually-hidden{position:absolute !important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}#runtime-page{width:100%;height:100%}.runtime-shell{position:relative;width:100%;height:100dvh;display:grid;grid-template-columns:var(--sidebar-width) minmax(0,1fr);gap:0;padding:0;background:transparent}.auth-topbar{position:relative;z-index:40;width:min(760px,calc(100% - 40px));margin:0 auto;padding-top:max(40px,8vh);display:flex;justify-content:space-between;gap:20px;align-items:center}.runtime-connected .auth-topbar{display:none}.auth-preferences{display:flex;flex:0 0 auto;gap:7px;align-items:center}.brand-lockup{display:flex;align-items:center;gap:13px}.brand-lockup p{margin-bottom:0}.brand-mark{display:grid;width:40px;height:40px;place-items:center;border:1px solid var(--border);border-radius:11px;background:var(--surface-raised);color:var(--text);font-weight:800;box-shadow:none}.gate{width:min(660px,calc(100% - 40px));margin:32px auto 0;padding:30px;border:1px solid var(--border);border-radius:18px;background:var(--surface);box-shadow:var(--shadow-raised)}.gate h2{margin-bottom:9px;font-size:1.15rem}.gate>form>.muted{margin-bottom:20px;line-height:1.55}.gate-icon{display:grid;width:42px;height:42px;margin-bottom:18px;place-items:center;border:1px solid var(--border);border-radius:12px;background:var(--surface-soft);color:var(--muted-strong)}.gate-icon svg{width:21px;height:21px}.field-row{display:flex;gap:9px;align-items:center}.field-row input{flex:1;min-width:0;height:46px;border:1px solid var(--border);border-radius:10px;padding:0 14px;background:var(--input);color:var(--text);box-shadow:none}.remember-credential{display:flex;gap:7px;align-items:center;margin-top:11px;color:var(--muted);font-size:.72rem}.remember-credential input{accent-color:var(--accent-solid)}#runtime-token-error{min-height:1.2em;margin:9px 0 0;font-size:.8rem}.btn,.icon-btn,.send-btn{border:1px solid var(--border);background:var(--surface-soft);color:var(--text);cursor:pointer;box-shadow:none}.btn,.icon-btn,.send-btn,.mobile-nav-control,.text-button{transition:color 150ms ease,background-color 150ms ease,border-color 150ms ease,opacity 150ms ease,transform 150ms var(--ease-out)}.btn{min-height:36px;border-radius:9px;padding:6px 12px}.btn.primary{border-color:var(--accent-solid);background:var(--accent-solid);color:#fff;box-shadow:none}.btn.subtle{color:var(--muted-strong)}.btn:disabled,.icon-btn:disabled,.send-btn:disabled{cursor:not-allowed;opacity:.5}.icon-btn{display:grid;width:36px;height:36px;place-items:center;border-radius:9px}.icon-btn svg{width:17px;height:17px}.icon-btn.is-busy svg{animation:runtime-spin .8s linear infinite}.send-btn{display:grid;width:36px;height:36px;flex:0 0 auto;place-items:center;border:1px solid transparent;border-radius:999px;background:var(--surface-soft);color:var(--muted);box-shadow:none}.send-btn.is-ready{background:var(--send-bg);color:var(--send-text);animation:send-ready 180ms var(--ease-out)}.send-btn svg{width:17px;height:17px}.text-button{appearance:none;border:0;padding:2px 4px;background:transparent;color:var(--accent);cursor:pointer;font:inherit}.lock-button{display:inline-flex;gap:6px;align-items:center}.lock-button svg{display:none;width:17px;height:17px}@keyframes runtime-spin{to{transform:rotate(360deg)}}@keyframes send-ready{from{transform:scale(.88)}}@media (hover:hover){.btn:hover,.icon-btn:hover,.mobile-nav-control:hover{background:var(--sidebar-hover)}.btn.primary:hover{background:var(--accent-hover)}.send-btn.is-ready:hover{filter:brightness(1.06);transform:scale(1.04)}.text-button:hover{color:var(--accent-hover)}}.btn:active,.icon-btn:active,.send-btn:active,.mobile-nav-control:active,.text-button:active{transform:scale(.97)}.send-btn.is-ready:active{transform:scale(.94)}.topbar-controls,.chips,.summary-facts,.section-head,.timeline-controls{display:flex;gap:7px;align-items:center}.chips,.summary-facts{flex-wrap:wrap}.chip,.count-badge{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:999px;color:var(--muted-strong);font-size:.67rem;line-height:1}.chip{padding:4px 8px}.count-badge{min-width:22px;justify-content:center;padding:4px 6px;background:var(--surface-soft)}.tone-runtime{border-color:rgba(132,174,248,.55);color:var(--accent)}.tone-pass{border-color:rgba(71,199,125,.55);color:var(--pass)}.tone-warn{border-color:rgba(239,169,85,.55);color:var(--warn)}.tone-fail{border-color:rgba(242,115,115,.55);color:var(--fail)}.theme-menu{position:relative;z-index:70;flex:0 0 auto}.theme-menu>summary{list-style:none}.theme-menu>summary::-webkit-details-marker{display:none}.theme-trigger{color:var(--muted-strong)}.theme-menu[open] .theme-trigger{border-color:var(--accent-border);background:var(--accent-soft);color:var(--accent)}.theme-icon{display:none}:root[data-theme="system"] .theme-icon-system,:root[data-theme="light"] .theme-icon-light,:root[data-theme="dark"] .theme-icon-dark{display:block}.theme-popover{position:absolute;z-index:90;top:calc(100% + 9px);right:0;width:184px;padding:8px;border:1px solid var(--border);border-radius:13px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:top right;animation:theme-menu-enter 160ms var(--ease-out);pointer-events:auto}.theme-popover-label{display:block;padding:5px 9px 7px;color:var(--muted);font-size:.62rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.theme-option{appearance:none;width:100%;min-height:38px;display:grid;grid-template-columns:18px minmax(0,1fr) 8px;gap:9px;align-items:center;border:0;border-radius:10px;padding:0 9px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer}.theme-option svg{width:17px;height:17px}.theme-option span{font-size:.76rem;font-weight:590}.theme-option i{width:7px;height:7px;border-radius:50%;background:transparent;box-shadow:0 0 0 3px transparent}.language-toggle{flex:0 0 auto;color:var(--muted-strong)}.language-toggle span{display:block;min-width:1.35em;font-size:.68rem;font-weight:760;letter-spacing:.015em;line-height:1}:root[data-language="zh-CN"] .language-toggle span{font-size:.64rem;letter-spacing:.035em}.theme-option[aria-pressed="true"]{background:var(--accent-soft);color:var(--text)}.theme-option[aria-pressed="true"] i{background:var(--accent-solid);box-shadow:0 0 0 3px var(--accent-soft)}@media (hover:hover){.theme-option:hover{background:var(--sidebar-hover);color:var(--text)}}@keyframes theme-menu-enter{from{opacity:0;transform:translateY(-5px) scale(.97)}}.workspace-sidebar{min-width:0;min-height:0;display:grid;grid-template-rows:var(--header-height) auto minmax(0,1fr) 60px;overflow:hidden;border:0;border-right:1px solid var(--border-soft);border-radius:0;background:var(--sidebar);box-shadow:none}.sidebar-brand{display:flex;justify-content:space-between;align-items:center;padding:0 16px}.sidebar-brand-lockup,.sidebar-brand-tools,.sidebar-runtime-status{display:flex;align-items:center}.sidebar-brand-lockup{min-width:0;gap:10px}.sidebar-brand-lockup strong{overflow:hidden;font-size:.96rem;font-weight:650;letter-spacing:-.025em;text-overflow:ellipsis;white-space:nowrap}.sidebar-logo{display:grid;width:30px;height:30px;flex:0 0 auto;place-items:center;border:1px solid color-mix(in srgb,var(--text) 10%,transparent);border-radius:9px;background:var(--text);color:var(--page);font-size:.7rem;font-weight:760;box-shadow:0 1px 1px rgba(0,0,0,.12)}.sidebar-brand-tools{gap:8px}.sidebar-runtime-status{gap:5px;color:var(--muted);font-size:.7rem}.sidebar-runtime-status i{width:6px;height:6px;border-radius:50%;background:var(--pass);box-shadow:0 0 0 3px color-mix(in srgb,var(--pass) 13%,transparent)}.sidebar-runtime-status[data-connection="connecting"] i,.sidebar-connection[data-connection="connecting"] i,.operations-live[data-connection="connecting"] i{background:var(--warn)}.sidebar-runtime-status[data-connection="stale"] i,.sidebar-connection[data-connection="stale"] i,.operations-live[data-connection="stale"] i{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb,var(--warn) 13%,transparent)}.sidebar-runtime-status[data-connection="disconnected"] i,.sidebar-connection[data-connection="disconnected"] i,.operations-live[data-connection="disconnected"] i{background:var(--fail);box-shadow:0 0 0 3px color-mix(in srgb,var(--fail) 13%,transparent)}.mobile-nav-control{display:none;width:40px;height:40px;flex:0 0 auto;place-items:center;border:1px solid transparent;border-radius:12px;background:transparent;color:var(--muted-strong);cursor:pointer}.mobile-nav-control svg{width:19px;height:19px}.mobile-nav-backdrop{position:fixed;z-index:39;inset:0;visibility:hidden;border:0;padding:0;background:var(--overlay);opacity:0;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:opacity 220ms var(--ease-out),visibility 220ms}.sidebar-view-switch{display:grid;gap:3px;padding:0 10px 10px;border-bottom:1px solid var(--border-soft)}.sidebar-view-item{appearance:none;min-width:0;min-height:42px;display:grid;grid-template-columns:20px minmax(0,1fr) auto;gap:9px;align-items:center;border:0;border-radius:10px;padding:0 10px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.sidebar-view-item>svg{width:18px;height:18px;color:var(--muted)}.sidebar-view-item>span:nth-child(2){overflow:hidden;font-size:.82rem;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.sidebar-view-item.selected{background:var(--sidebar-selected);color:var(--text)}.sidebar-view-item.selected>svg{color:var(--accent)}.sidebar-view-item:active{transform:scale(.985)}.sidebar-view-meta,.sidebar-connection{display:flex;gap:5px;align-items:center;color:var(--muted);font-size:.68rem;font-weight:450;white-space:nowrap}.sidebar-connection i,.live-pill i,.operations-live i{width:6px;height:6px;border-radius:50%;background:var(--pass)}.sidebar-scroll{min-height:0;overflow-y:auto;padding:14px 10px 16px;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.sidebar-view-panel{min-width:0}.operations-navigation-copy{margin:9px 11px 15px}.operations-nav-item{appearance:none;width:100%;min-height:54px;display:grid;grid-template-columns:30px minmax(0,1fr);gap:9px;align-items:center;border:0;border-radius:10px;padding:7px 9px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer}.operations-nav-item>svg{width:17px;height:17px;justify-self:center;color:var(--muted)}.operations-nav-item>span{min-width:0;display:grid;gap:2px}.operations-nav-item strong{font-size:.8rem;font-weight:600}.operations-nav-item small{overflow:hidden;color:var(--muted);font-size:.7rem;text-overflow:ellipsis;white-space:nowrap}.operations-nav-item:hover{background:var(--sidebar-hover)}.operations-nav-item.selected{background:var(--sidebar-selected);color:var(--text)}.operations-nav-item.selected>svg{color:var(--accent)}.sidebar-section{min-height:0;padding:0 0 14px}.sidebar-section-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline;padding:0 11px}.sidebar-section-head h2{color:var(--muted);font-size:.74rem;font-weight:600;letter-spacing:.01em;text-transform:none}.sidebar-section-head #runtime-project-status{max-width:58%;overflow:hidden;color:var(--placeholder);font-size:.67rem;text-align:right;text-overflow:ellipsis;white-space:nowrap}.sidebar-filter-row{display:flex;gap:8px;align-items:center;margin:10px 2px 8px}.runner-filter{position:relative;min-width:0;flex:1;display:flex;align-items:center}.runner-filter>svg{position:absolute;z-index:1;left:9px;width:14px;height:14px;color:var(--muted);pointer-events:none}.runner-filter select{appearance:none;width:100%;height:36px;min-width:0;border:1px solid var(--border-soft);border-radius:9px;padding:0 28px 0 30px;background:var(--surface-soft);color:var(--muted-strong);font-size:.74rem;cursor:pointer}.runner-filter::after{content:"⌄";position:absolute;right:9px;color:var(--placeholder);font-size:.65rem;pointer-events:none}.sidebar-status{display:none}.selected-project{display:none}.sidebar-search{position:relative;margin:0 2px 14px}.sidebar-search svg{position:absolute;top:9px;left:9px;width:14px;height:14px;color:var(--placeholder);pointer-events:none}.sidebar-search input{width:100%;height:36px;min-width:0;border:1px solid var(--border-soft);border-radius:9px;padding:0 9px 0 31px;background:var(--surface-soft);color:var(--text);font-size:.75rem;transition:background-color 140ms ease,border-color 140ms ease}.sidebar-search input:hover,.sidebar-search input:focus{border-color:var(--border);background:var(--sidebar-selected);box-shadow:none}.sidebar-search input::placeholder{color:var(--placeholder)}.project-list,.session-list,.recent-session-list,.fleet-list,.communication-list{display:grid;align-content:start;grid-auto-rows:max-content;gap:2px;min-height:0;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.project-list{gap:8px;overflow:visible}.device-group{min-width:0;display:grid;gap:4px;padding:0;border:0}.device-group>summary::-webkit-details-marker{display:none}.device-group:last-child{padding-bottom:0;border-bottom:0}.device-group-head{display:grid;grid-template-columns:28px minmax(0,1fr) 8px 12px;gap:8px;align-items:center;min-height:40px;padding:2px 8px;border:0;border-radius:9px;background:transparent;box-shadow:none;cursor:pointer;list-style:none}.device-group-head::after{content:"›";color:var(--placeholder);font-size:1rem;transform:rotate(0deg);transition:transform 140ms var(--ease-out)}.device-group[open]>.device-group-head::after{transform:rotate(90deg)}.device-group-head:hover{background:var(--sidebar-hover)}.device-group-icon{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--border-soft);border-radius:8px;background:var(--surface-soft);color:var(--muted-strong)}.device-group-icon svg{width:14px;height:14px}.device-group-identity{display:grid;gap:1px;align-items:center}.device-group-identity strong{min-width:0;overflow:hidden;color:var(--muted-strong);font-size:.78rem;font-weight:620;letter-spacing:0;text-overflow:ellipsis;white-space:nowrap}.device-group-identity .small{overflow:hidden;color:var(--placeholder);font-size:.68rem;text-overflow:ellipsis;white-space:nowrap}.device-group-dot{width:6px;height:6px;border-radius:50%;background:var(--pass)}.device-group.offline .device-group-dot{background:var(--fail)}.device-project-list{display:grid;gap:2px;margin:0;padding:0;border-left:0}.device-project-empty{margin:4px 10px 8px}.project-row{appearance:none;position:relative;width:100%;min-width:0;display:grid;grid-template-columns:28px minmax(0,1fr);gap:0 9px;align-items:start;padding:8px;border:0;border-radius:9px;background:transparent;color:inherit;text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.project-row::before{content:none}.project-row::after{content:none}.project-row:hover{background:var(--sidebar-hover)}.project-row.selected{background:var(--sidebar-selected);box-shadow:inset 2px 0 0 var(--accent-solid)}.project-row-icon{display:grid;width:28px;height:28px;place-items:center;border-radius:8px;background:var(--surface-soft);color:var(--muted-strong)}.project-row-icon svg{width:15px;height:15px}.project-row.selected .project-row-icon{background:var(--accent-soft);color:var(--accent)}.project-row-main{min-width:0;display:grid;gap:3px;padding-top:1px}.project-row-heading{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px;align-items:center}.project-row-title{overflow:hidden;font-size:.8rem;font-weight:620;letter-spacing:-.005em;text-overflow:ellipsis;white-space:nowrap}.project-row.selected .project-row-title{color:var(--text)}.project-row-id,.project-row-runner{display:none}.project-row-signals{min-width:0;display:flex;gap:4px;align-items:center}.project-row-signals:empty{display:none}.project-row-state{display:inline-flex;gap:4px;align-items:center;border-radius:999px;padding:3px 6px;background:var(--surface-soft);color:var(--muted-strong);font-size:.66rem;font-weight:650;line-height:1;white-space:nowrap}.project-row-state::before{content:"";width:5px;height:5px;flex:0 0 auto;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 12%,transparent)}.project-row-state.tone-runtime{background:var(--accent-soft);color:var(--accent)}.project-row-state.tone-warn{background:color-mix(in srgb,var(--warn) 10%,transparent);color:var(--warn)}.project-row-state.tone-fail{background:var(--danger-bg);color:var(--fail)}.project-row-meta{overflow:hidden;color:var(--muted);font-size:.7rem;line-height:1.4;text-overflow:ellipsis;white-space:nowrap}.workspace-path,.workspace-identity{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow-wrap:anywhere}.sessions-panel{margin:4px 4px 10px 36px;padding:5px 0 2px 8px;border:0;border-left:1px solid var(--border-soft)}.sessions-panel .sidebar-section-head{margin:2px 0 5px;padding:0 8px}.sessions-panel .sidebar-section-head h2{font-size:.72rem}.session-list{overflow:visible;list-style:none;margin:0;padding:0}.session-list>li{margin:0;padding:0}.session-card{position:relative;min-width:0;display:grid;grid-template-columns:22px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.session-card::before{content:none}.session-card::after{content:none}.session-card:hover{background:var(--sidebar-hover)}.session-card.selected{background:var(--sidebar-selected);box-shadow:none}.session-card-icon{display:grid;width:22px;height:22px;place-items:center;color:var(--placeholder)}.session-card-icon svg{width:14px;height:14px}.session-card.selected .session-card-icon{color:var(--accent)}.session-card-main{min-width:0}.session-title{display:-webkit-box;margin:0;overflow:hidden;font-size:.82rem;font-weight:500;line-height:1.35;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:4}.session-card .session-title{font-size:.78rem;line-height:1.42;-webkit-line-clamp:2}.session-card.selected .session-title{color:var(--text);font-weight:590}.session-card .chips{display:flex;gap:0;margin-top:4px}.session-card .chips .chip{border:0;padding:0;background:transparent;color:var(--muted);font-size:.68rem}.session-card .chips .chip + .chip::before{content:"·";margin:0 5px;color:var(--placeholder)}.summary-facts{margin-top:5px}.activity-preview{display:flex;gap:5px;margin-top:5px;overflow-wrap:anywhere}.activity-preview-label{flex:0 0 auto;font-weight:700}.empty-copy{margin:8px 40px}.recent-panel{margin:14px 4px 6px;padding:10px 4px 0;border-top:1px solid var(--border-soft)}.recent-panel-summary{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;color:var(--muted-strong);font-size:.74rem;font-weight:600;cursor:pointer;list-style:none;user-select:none;transition:background-color 140ms ease,color 140ms ease}.recent-panel-summary::-webkit-details-marker{display:none}.recent-panel-summary:hover{background:var(--sidebar-hover);color:var(--text)}.recent-panel-title{font-size:.74rem;font-weight:600;color:var(--muted-strong)}.recent-panel-meta{margin-left:auto;color:var(--placeholder);font-size:.68rem;font-weight:400}.recent-panel-summary::after{content:"›";display:inline-block;color:var(--placeholder);font-size:.95rem;line-height:1;transform:rotate(0deg);transition:transform 140ms var(--ease-out)}.recent-panel[open]>.recent-panel-summary::after{transform:rotate(90deg)}.recent-session-list{max-height:250px}.recent-session-row{appearance:none;width:100%;min-width:0;display:grid;gap:4px;padding:8px 10px;border:1px solid transparent;border-radius:11px;background:transparent;color:inherit;text-align:left;cursor:pointer}.recent-session-row:hover,.recent-session-row.selected{background:var(--sidebar-selected)}@media (hover:hover){.sidebar-view-item:hover,.project-row:hover,.session-card:hover,.recent-session-row:hover{background:var(--sidebar-hover)}}.project-row:active,.session-card:active,.recent-session-row:active{transform:scale(.985)}.recent-session-location{overflow-wrap:anywhere}.recent-session-signals{display:flex;flex-wrap:wrap;gap:5px}.sidebar-footer{display:flex;gap:10px;align-items:center;padding:0 18px;border-top:1px solid var(--border-soft);background:transparent;box-shadow:none}.local-avatar{display:grid;width:30px;height:30px;place-items:center;border:1px solid var(--border);border-radius:9px;background:var(--avatar);font-size:.72rem;font-weight:700;box-shadow:none}.sidebar-footer>span:last-child{display:grid;gap:1px;font-size:.72rem}.sidebar-footer small{color:var(--placeholder);font-size:.61rem}.workspace-main{position:relative;min-width:0;min-height:0;display:grid;grid-template-rows:var(--header-height) minmax(0,1fr);overflow:hidden;border:0;border-radius:0;background:var(--page-surface);box-shadow:none}.workspace-topbar{position:relative;z-index:40;min-width:0;display:flex;justify-content:space-between;gap:12px;align-items:center;overflow:visible;padding:0 18px 0 22px;border-bottom:1px solid var(--border-soft);background:var(--topbar);box-shadow:0 1px 0 color-mix(in srgb,var(--text) 2%,transparent);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur)}.workspace-heading{min-width:0;flex:1 1 auto;display:flex;gap:10px;align-items:center}.workspace-heading>svg{width:17px;height:17px;flex:0 0 auto;color:var(--muted-strong)}.workspace-heading-copy{min-width:0;display:grid;gap:2px}.workspace-breadcrumb{min-width:0;display:flex;gap:5px;align-items:center;overflow:hidden;color:var(--placeholder);font-size:.68rem;line-height:1}.workspace-breadcrumb span{min-width:0;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-breadcrumb i{color:var(--border);font-style:normal}.workspace-heading strong{max-width:min(760px,54vw);overflow:hidden;font-size:.94rem;font-weight:620;letter-spacing:-.012em;text-overflow:ellipsis;white-space:nowrap}.topbar-controls{min-width:0;display:flex;justify-content:flex-end;gap:7px;align-items:center;padding-right:42px}.topbar-more{position:relative;z-index:72}.topbar-more>summary{display:none;list-style:none}.topbar-more>summary::-webkit-details-marker{display:none}.topbar-more-popover{display:flex;gap:7px;align-items:center}.topbar-action-label{display:none}.session-state-chips{display:none}.runtime-has-session .session-state-chips{display:flex}.session-state-chips .chip:not(:last-child){display:none}.session-state-chips .chip{min-height:24px;border-color:var(--border-soft);background:var(--surface-soft);color:var(--muted)}.session-state-chips .chip:last-child{color:var(--muted-strong)}.banner{position:absolute;z-index:4;top:calc(var(--header-height) + 8px);right:18px;left:18px;margin:0;border:1px solid var(--danger-border);border-radius:12px;padding:9px 11px;background:var(--danger-bg);box-shadow:inset 0 1px 0 var(--glass-highlight);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);font-size:.78rem}.conversation-stage{grid-row:2;min-height:0;position:relative;overflow:hidden}.conversation-empty{width:min(520px,calc(100% - 44px));height:100%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding-top:clamp(88px,23.6dvh,220px);text-align:center}.conversation-empty h2{margin:17px 0 8px;font-size:1rem}.conversation-empty p{max-width:390px;margin-bottom:0;color:var(--muted);font-size:.82rem;line-height:1.55;text-wrap:balance}.empty-orbit{display:grid;width:56px;height:56px;place-items:center;border:1px solid var(--border);border-radius:16px;background:var(--surface-raised);color:var(--muted-strong);box-shadow:0 10px 28px rgba(0,0,0,.08)}.empty-orbit svg{width:24px;height:24px}.conversation-empty h2{margin-top:22px;font-size:clamp(1.35rem,3vw,1.8rem);font-weight:560;letter-spacing:-.03em}.conversation-empty p{max-width:470px;margin-top:4px;font-size:.84rem}.session-conversation{position:absolute;inset:0;min-height:0;display:grid;grid-template-rows:minmax(0,1fr) auto}.session-chat{position:relative;min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr) auto}.chat-section-head,.unavailable-note,.collaboration-board,.chat-empty,.collaboration-composer{width:min(var(--content-width),calc(100% - var(--content-gutter) - var(--content-gutter)))}.chat-section-head{min-height:24px;margin:0 auto;display:flex;justify-content:flex-end;align-items:end;padding-top:8px}.chat-section-head>span{color:var(--placeholder);font-size:.68rem}#runtime-collaboration-status{display:none}.unavailable-note{margin:5px auto;padding:9px 11px;border:1px solid var(--border-soft);border-radius:12px;background:var(--surface-soft);box-shadow:inset 0 1px 0 var(--glass-highlight)}.chat-scroll{min-height:0;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.collaboration-board{min-height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-end;gap:0;padding:clamp(28px,3.8vh,44px) 0 clamp(44px,6vh,68px)}.chat-empty{min-height:100%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:clamp(72px,23.6dvh,190px) 0 48px;text-align:center}.chat-empty>span{margin-bottom:10px;color:var(--accent);font-size:1.2rem}.chat-empty strong{font-size:1rem;letter-spacing:-.01em}.chat-empty p{max-width:520px;margin:6px 0 0;line-height:1.55;text-wrap:balance}.chat-retention{display:none}.message-card{position:relative;min-width:0;max-width:100%;align-self:flex-start;display:grid;grid-template-columns:minmax(0,1fr);align-items:start;border:0;border-radius:0;padding:0;background:transparent}.message-card + .message-card{margin-top:28px}.message-card.message-incoming + .message-card.message-incoming{margin-top:17px}.message-card.message-neutral + .message-card.message-neutral{margin-top:17px}.message-card.message-outgoing + .message-card.message-outgoing{margin-top:13px}.message-card + .message-card.message-thread{margin-top:16px}.message-card.message-entering{animation:message-enter 240ms var(--ease-out)}@keyframes message-enter{from{opacity:0;transform:translateY(7px) scale(.992)}}.message-card.message-incoming{width:fit-content;max-width:min(82%,880px);align-self:flex-start}.message-card.message-neutral{width:fit-content;max-width:min(82%,880px);align-self:flex-start}.message-card.message-outgoing{width:fit-content;max-width:min(68%,680px);align-self:flex-end}.message-content{min-width:0;display:flex;flex-direction:column;align-items:flex-start}.message-card.message-outgoing .message-content{align-items:flex-end}.message-author{min-height:18px;display:flex;align-items:center;margin:0 2px 4px;color:var(--muted);font-size:.72rem}.message-author-name{font-weight:600}.message-card.message-outgoing .message-author{justify-content:flex-end}.message-card.message-group-continuation .message-author{display:none}.message-reply-context{max-width:100%;display:flex;gap:6px;align-items:center;margin:0 4px 7px;color:var(--placeholder);font-size:.7rem;line-height:1.4}.message-reply-context svg{width:12px;height:12px;flex:0 0 auto}.message-reply-context span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-card.message-outgoing .message-reply-context{justify-content:flex-end}.message-bubble{min-width:0;max-width:100%}.message-card.message-incoming .message-bubble{width:fit-content;border:0;border-radius:var(--message-bubble-radius);padding:clamp(11px,1.1vw,13px) clamp(16px,1.5vw,19px);background:var(--message-incoming-bg);color:var(--text);box-shadow:0 1px 1px rgba(0,0,0,.025)}.message-card.message-neutral .message-bubble{width:fit-content;border:0;border-radius:var(--message-bubble-radius);padding:clamp(11px,1.1vw,13px) clamp(16px,1.5vw,19px);background:var(--message-incoming-bg);color:var(--text);box-shadow:0 1px 1px rgba(0,0,0,.025)}.message-card.message-outgoing .message-bubble{align-self:flex-end;border:0;border-radius:var(--message-bubble-radius);padding:clamp(10px,1.1vw,12px) clamp(15px,1.5vw,18px);background:var(--message-outgoing-bg);color:var(--message-outgoing-text);box-shadow:0 1px 1px rgba(0,0,0,.055)}.message-footer{min-width:0;display:flex;flex-wrap:wrap;gap:5px 9px;align-items:center;margin-top:7px;color:var(--muted)}.message-card.message-outgoing .message-footer{width:100%;align-self:flex-end;justify-content:flex-end;padding:0 2px}.message-card.message-incoming .message-footer{justify-content:flex-start;padding:0 2px}.message-card.message-neutral .message-footer{justify-content:flex-start;padding:0 2px}.message-head{min-width:0;display:flex;flex:0 1 auto;justify-content:flex-start;gap:7px;align-items:center;color:var(--muted)}.message-card.message-outgoing .message-head{justify-content:flex-end}.message-kind{display:inline-flex;min-height:20px;align-items:center;border:1px solid var(--border-soft);border-radius:999px;padding:0 7px;background:var(--surface-soft);color:var(--muted);font-size:.68rem;font-weight:560}.message-head>.small{font-size:.7rem}.message-meta{display:none}.message-resolution{color:var(--muted);font-size:.7rem}.message-ack,.message-resolution{flex-basis:100%}.message-card.message-outgoing .message-ack,.message-card.message-outgoing .message-resolution{text-align:right}.message-card.message-outgoing .muted,.message-card.message-outgoing .message-resolution{color:var(--muted)}.message-body{position:relative;max-height:none;margin:0;overflow:visible;overflow-wrap:anywhere;font-size:.92rem;line-height:1.62}.message-body.is-collapsed{max-height:31rem;overflow:hidden;mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 64px),transparent 100%)}.message-body.is-expanded{max-height:none;mask-image:none}.message-paragraph{margin:0;white-space:pre-wrap}.message-paragraph + .message-paragraph,.message-body>:not(:first-child){margin-top:.8em}.message-body ul,.message-body ol{margin-bottom:0;padding-left:1.4em}.message-body li + li{margin-top:.28em}.message-body blockquote{margin-right:0;margin-bottom:0;margin-left:0;padding-left:12px;border-left:2px solid color-mix(in srgb,currentColor 24%,transparent);color:var(--muted-strong)}.message-body blockquote .message-paragraph{margin:0}.message-heading{margin-bottom:0;color:inherit;font-size:1em;font-weight:680;letter-spacing:-.01em;text-transform:none}.message-body a{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 46%,transparent);text-underline-offset:2px}.message-code{overflow:hidden;border:1px solid color-mix(in srgb,currentColor 11%,transparent);border-radius:13px;background:color-mix(in srgb,var(--page) 84%,transparent);color:var(--text)}.message-code>header{min-height:34px;display:flex;justify-content:space-between;gap:12px;align-items:center;padding:0 10px 0 12px;border-bottom:1px solid var(--border-soft);color:var(--muted);font:500 .7rem/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.message-code-copy{appearance:none;display:inline-flex;gap:6px;align-items:center;border:0;border-radius:7px;padding:5px 7px;background:transparent;color:var(--muted-strong);cursor:pointer;font:inherit}.message-code-copy:hover{background:var(--surface-soft);color:var(--text)}.message-code-copy svg{width:13px;height:13px}.message-code pre{max-width:100%;margin:0;overflow:auto;padding:13px 14px;scrollbar-width:thin}.message-code code{white-space:pre;font:500 .78rem/1.58 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.message-expand{appearance:none;margin-top:8px;border:0;border-radius:8px;padding:5px 8px;background:color-mix(in srgb,currentColor 8%,transparent);color:inherit;cursor:pointer;font-size:.72rem;font-weight:600}.message-ack{color:var(--warn);font-size:.7rem}.message-ack.observed{color:var(--muted)}.message-actions{display:flex;justify-content:flex-start;gap:2px;margin-left:auto;opacity:.58;transition:opacity 140ms ease}.message-card.message-outgoing .message-actions{justify-content:flex-end}.message-action{appearance:none;display:grid;width:26px;height:26px;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer;transition:color 120ms ease,background-color 120ms ease,transform 120ms var(--ease-out)}.message-action svg{width:13px;height:13px}.message-action:hover{background:var(--surface-soft);color:var(--text)}.message-action.danger:hover{color:var(--fail)}.message-action:active{transform:scale(.94)}.message-card:hover .message-actions,.message-card:focus-within .message-actions{opacity:1}.message-thread{margin-left:0}.message-date-separator{width:100%;display:flex;align-items:center;gap:12px;margin:30px 0 22px;color:var(--placeholder);font-size:.7rem}.message-date-separator::before,.message-date-separator::after{content:"";height:1px;flex:1;background:var(--border-soft)}.new-messages-button{position:absolute;z-index:8;right:50%;bottom:12px;display:inline-flex;gap:7px;align-items:center;border:1px solid var(--border);border-radius:999px;padding:8px 12px;background:var(--surface);color:var(--muted-strong);box-shadow:var(--shadow-raised);cursor:pointer;transform:translateX(50%);animation:new-messages-enter 180ms var(--ease-out)}.new-messages-button svg{width:14px;height:14px}@keyframes new-messages-enter{from{opacity:0;transform:translate(50%,7px) scale(.96)}}.collaboration-composer{position:relative;isolation:isolate;margin:10px auto max(16px,env(safe-area-inset-bottom));padding:8px 9px 8px;border:1px solid var(--border);border-radius:24px;background:var(--composer);box-shadow:0 12px 34px rgba(5,7,12,.13),inset 0 1px 0 color-mix(in srgb,white 5%,transparent);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transition:border-color 220ms ease,background-color 220ms ease,box-shadow 260ms var(--ease-out),transform 260ms var(--ease-out);animation:composer-enter 280ms var(--ease-out)}.collaboration-composer:focus-within{border-color:color-mix(in srgb,var(--accent) 34%,var(--border));box-shadow:0 18px 42px rgba(5,7,12,.17),0 0 0 3px color-mix(in srgb,var(--accent-soft) 72%,transparent);transform:translateY(-1px)}.collaboration-composer textarea{width:100%;height:44px;min-height:44px;max-height:180px;resize:none;overflow-y:hidden;border:0;outline:0;padding:10px 9px 7px;background:transparent;color:var(--text);font-size:.88rem;line-height:1.5}.collaboration-composer textarea::placeholder{color:var(--placeholder)}.collaboration-composer.is-unavailable{opacity:.7}.collaboration-composer.is-unavailable textarea{cursor:not-allowed}.composer-toolbar{min-height:38px;display:flex;justify-content:space-between;gap:10px;align-items:center}.composer-fields{min-width:0;display:flex;gap:8px;align-items:center}.composer-options{position:relative;z-index:12}.composer-options>summary{list-style:none}.composer-options>summary::-webkit-details-marker{display:none}.composer-tools-trigger{min-width:38px;height:36px;display:inline-flex;gap:7px;align-items:center;border-radius:999px;padding:0 11px 0 9px;color:var(--muted-strong);cursor:pointer;transition:color 160ms ease,background-color 160ms ease,transform 140ms var(--ease-out)}.composer-tools-trigger svg{width:18px;height:18px;transition:transform 190ms var(--ease-out)}.composer-tools-trigger span{max-width:210px;overflow:hidden;font-size:.67rem;font-weight:570;text-overflow:ellipsis;white-space:nowrap}.composer-options[open] .composer-tools-trigger,.composer-options.has-selection .composer-tools-trigger{background:var(--surface-soft);color:var(--text)}.composer-options.has-selection .composer-tools-trigger{color:var(--accent)}.composer-options[open] .composer-tools-trigger svg{transform:rotate(45deg)}.composer-options-popover{position:absolute;z-index:30;bottom:calc(100% + 12px);left:0;width:min(350px,calc(100vw - 40px));padding:12px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:bottom left;animation:composer-options-enter 180ms var(--ease-out)}.composer-options-head{display:grid;gap:2px;margin-bottom:10px;padding:0 2px}.composer-options-head strong{font-size:.76rem}.composer-options-head .small{font-size:.61rem}.composer-option-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.composer-control{min-width:0;display:grid;gap:5px;border:0;border-radius:10px;padding:8px 9px;background:var(--surface-soft);color:var(--placeholder);font-size:.61rem}.composer-control select{width:100%;height:28px;min-width:0;border:0;outline:0;padding:0;background:transparent;color:var(--text);font-size:.72rem;cursor:pointer}.composer-control:focus-within{box-shadow:0 0 0 2px var(--accent-soft)}.composer-check{grid-column:1 / -1;min-height:38px;display:flex;gap:8px;align-items:center;border-radius:10px;padding:0 10px;background:var(--surface-soft);color:var(--muted-strong);font-size:.68rem}.composer-fields input[type="checkbox"]{accent-color:var(--accent-solid)}.composer-actions{min-width:0;display:flex;justify-content:flex-end;align-items:center;gap:8px}.composer-actions>span{max-width:360px;overflow:hidden;text-align:right;line-height:1.3}.reply-target,.edit-target{display:flex;justify-content:space-between;gap:8px;align-items:center;margin:3px 3px 4px;padding:7px 9px;border:0;border-left:2px solid var(--accent);border-radius:0 9px 9px 0;background:var(--surface-soft);animation:composer-context-enter 180ms var(--ease-out)}.edit-target{border-left:3px solid var(--warn)}@keyframes composer-enter{from{opacity:0;transform:translateY(10px) scale(.992)}}@keyframes composer-options-enter{from{opacity:0;transform:translateY(6px) scale(.97)}}@keyframes composer-context-enter{from{opacity:0;transform:translateY(4px)}}.operations-stage{grid-row:2;min-width:0;min-height:0;overflow:hidden;background:var(--page-surface)}.operations-scroll{width:100%;height:100%;overflow-y:auto;padding:clamp(24px,3vw,44px) var(--content-gutter) 64px;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.operations-heading{width:min(1440px,100%);margin:0 auto 22px;display:flex;justify-content:space-between;gap:24px;align-items:flex-start}.operations-heading h2{margin:1px 0 7px;font-size:clamp(1.35rem,2vw,1.75rem);font-weight:620;letter-spacing:-.035em}.operations-heading p:last-child{max-width:680px;margin-bottom:0;line-height:1.55}.operations-live{display:inline-flex;gap:7px;align-items:center;border:1px solid var(--border-soft);border-radius:999px;padding:7px 10px;background:var(--surface-soft);color:var(--muted-strong);font-size:.74rem;white-space:nowrap}.operations-layout{width:min(1440px,100%);margin:0 auto;display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}.operations-card{min-width:0;scroll-margin-top:20px;border:1px solid var(--border-soft);border-radius:16px;padding:18px;background:color-mix(in srgb,var(--surface) 72%,transparent);box-shadow:0 1px 0 color-mix(in srgb,var(--text) 3%,transparent)}.operations-card:focus{outline:none}.operations-card:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.operations-card-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;margin-bottom:13px}.operations-card-head h3{margin:2px 0 0;font-size:.98rem;font-weight:630;letter-spacing:-.015em}.operations-card-head>.small{max-width:48%;text-align:right}.operations-agents{grid-column:1 / -1}.operations-metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:0}.operations-metrics .metric{min-height:78px;grid-template-columns:1fr;gap:4px;align-content:center;border:0;border-radius:12px;padding:12px 13px;background:var(--surface-inset)}.operations-metrics .metric>.small{grid-column:1}.operations-metrics .metric strong{font-size:.88rem}.operations-runners .fleet-list{max-height:none;margin-top:0}.operations-agents .communication-grid{grid-template-columns:minmax(300px,.85fr) minmax(360px,1.15fr);gap:12px}.operations-agents .communication-agents,.operations-agents .communication-conversations{align-content:start}.operations-agents .communication-section{border-radius:12px;padding:13px}.operations-agents .communication-list{max-height:320px}.operations-agents .conversation-list{max-height:280px}.operations-agents .conversation-transcript{max-height:520px}.runtime-shell[data-workspace-view="operations"] .runtime-inspector{display:none}.runtime-shell[data-workspace-view="operations"].context-docked{grid-template-columns:var(--sidebar-width) minmax(0,1fr)}.runtime-shell[data-workspace-view="operations"] .session-state-chips{display:none}.runtime-inspector{position:absolute;z-index:50;top:0;right:0}.runtime-inspector{display:none}.runtime-has-session .runtime-inspector{display:block}.runtime-operations-view .runtime-inspector{display:none}.runtime-shell[data-workspace-view="operations"] .topbar-controls,body:not(.runtime-has-session) .topbar-controls{padding-right:0}.context-trigger{position:absolute;z-index:23;top:16px;right:18px;display:grid;width:36px;height:36px;place-items:center;border:1px solid transparent;border-radius:9px;color:var(--muted);cursor:pointer;list-style:none;transition:color 140ms ease,background-color 140ms ease,border-color 140ms ease,transform 120ms var(--ease-out)}.context-trigger::-webkit-details-marker{display:none}.context-trigger:hover,.runtime-inspector[open] .context-trigger{border-color:var(--border);background:var(--sidebar-hover);color:var(--text);box-shadow:inset 0 1px 0 var(--glass-highlight)}.context-trigger svg{width:17px;height:17px}.inspector-backdrop{position:fixed;z-index:20;inset:0;border:0;background:color-mix(in srgb,var(--overlay) 78%,transparent);cursor:default}.inspector-popover{position:fixed;z-index:21;top:calc(var(--header-height) + 10px);right:10px;width:clamp(380px,var(--layout-minor),460px);max-width:calc(100vw - 20px);height:min(780px,calc(100dvh - var(--header-height) - 20px));display:grid;grid-template-rows:58px minmax(0,1fr);overflow:hidden;border:1px solid var(--border);border-radius:14px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:top right;animation:inspector-enter 170ms var(--ease-out)}.inspector-backdrop{animation:inspector-backdrop-enter 160ms ease-out}@keyframes inspector-enter{from{opacity:0;transform:translateY(-4px) scale(.985)}}@keyframes inspector-backdrop-enter{from{opacity:0}}.inspector-header{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:0 17px;border-bottom:1px solid var(--border-soft);background:transparent;box-shadow:none}.inspector-header>div:first-child{display:grid}.inspector-header strong{font-size:.86rem}.inspector-header-actions{display:flex;align-items:center;gap:8px}.inspector-close{display:grid;width:32px;height:32px;place-items:center;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--muted-strong);cursor:pointer;transition:color 140ms ease,background-color 140ms ease,border-color 140ms ease}.inspector-close:hover{border-color:var(--border-soft);background:var(--sidebar-hover);color:var(--text)}.inspector-close svg{width:16px;height:16px}.live-pill{display:inline-flex;gap:6px;align-items:center;padding:5px 7px;border:1px solid var(--border);border-radius:999px;color:var(--muted-strong);font-size:.65rem}.inspector-scroll{min-height:0;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.inspector-card{display:block;margin:0;padding:14px 16px;border:0;border-bottom:1px solid var(--border-soft);background:transparent}.inspector-card>summary{display:flex;justify-content:space-between;gap:9px;align-items:baseline;color:var(--muted-strong);font-size:.77rem;font-weight:680;cursor:pointer;list-style:none}.inspector-card>summary::-webkit-details-marker{display:none}.inspector-card>summary::before{content:"›";color:var(--muted)}.inspector-card[open]>summary::before{transform:rotate(90deg)}.inspector-card>summary>:nth-child(2){max-width:48%;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.inspector-card-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline;margin-bottom:9px}.context-navigation{position:sticky;top:-15px;z-index:1;display:flex;gap:4px;margin:-1px 0 16px;padding:5px;border:1px solid var(--border-soft);border-radius:12px;background:var(--surface-solid)}.context-navigation button{flex:1;min-width:0;min-height:40px;border:0;border-radius:8px;background:transparent;color:var(--muted-strong);font:inherit;font-size:.78rem;cursor:pointer}.context-navigation button:hover{background:var(--sidebar-hover);color:var(--text)}.context-navigation button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent);font-weight:650}.context-navigation button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.session-identity{display:grid;grid-template-columns:1fr;gap:7px;margin:8px 0;padding:10px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset);box-shadow:none}.session-identity-fact{min-width:0;display:grid;gap:2px}.session-identity-value{overflow-wrap:anywhere}.session-identity code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.69rem;user-select:all}.workspace-identity{margin:8px 0;font-size:.68rem}.overview{display:grid;grid-template-columns:1fr;gap:6px;margin:11px 0}.context-primary-overview{margin-bottom:0}.context-secondary-overview{margin-top:8px}.overview-card{min-width:0;padding:9px 10px;border:1px solid var(--border-soft);border-left:3px solid var(--border);border-radius:9px;background:var(--surface-inset);box-shadow:none}.overview-card p{margin-bottom:0;overflow-wrap:anywhere;font-size:.75rem;line-height:1.4}.runtime-fact{border-left-color:var(--accent)}.reported-card{border-left-color:var(--muted);opacity:.84}.tone-card-pass{border-left-color:var(--pass)}.tone-card-warn{border-left-color:var(--warn)}.tone-card-fail{border-left-color:var(--fail)}.tone-card-muted{border-left-color:var(--muted)}.activity-section{margin-top:13px;padding-top:12px;border-top:1px solid var(--border-soft)}.timeline-controls{justify-content:space-between;margin-bottom:7px;font-size:.78rem}.timeline{display:grid;gap:6px;max-height:300px;overflow:auto;list-style:none;margin:0;padding:0}.timeline-event{padding:8px 9px;border:1px solid var(--border-soft);border-left:3px solid var(--border);border-radius:10px;background:var(--surface-inset)}.timeline-event.failed{border-left-color:var(--fail)}.timeline-event.reported-progress{border-left-color:var(--muted);opacity:.82}.timeline-head{display:flex;justify-content:space-between;gap:8px;align-items:baseline}.timeline-kind{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.7rem}.timeline-body{margin-top:4px;overflow-wrap:anywhere}.metric-grid{display:grid;grid-template-columns:1fr;gap:5px;margin-top:11px}.metric{min-width:0;display:grid;grid-template-columns:minmax(72px,.7fr) minmax(0,1.3fr);gap:3px 7px;align-items:baseline;padding:8px 9px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset)}.metric strong,.metric span{overflow-wrap:anywhere}.metric strong{font-size:.74rem}.metric>.small{grid-column:2}.metric-label{color:var(--muted);font-size:.63rem;letter-spacing:.05em;text-transform:uppercase}.fleet-list{max-height:330px;margin-top:10px}.fleet-row{appearance:none;width:100%;min-width:0;display:grid;gap:6px;padding:10px;border:1px solid var(--border-soft);border-radius:11px;background:var(--surface-inset);color:inherit;text-align:left;cursor:pointer}.fleet-row.selected{border-color:var(--accent-border);background:var(--accent-soft)}.fleet-row-main,.fleet-row-signals,.fleet-row-facts{min-width:0}.fleet-row-title{overflow-wrap:anywhere;font-size:.76rem;font-weight:700}.fleet-row-meta,.fleet-row-facts{overflow-wrap:anywhere}.fleet-row-signals{display:flex;flex-wrap:wrap;gap:5px}.retention-note{margin:9px 0 0}.communication-grid{display:grid;grid-template-columns:1fr;gap:9px;margin-top:10px}.communication-agents,.communication-conversations{min-width:0;display:grid;gap:9px}.communication-section{min-width:0;padding:10px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset);box-shadow:none}.communication-section h3{margin-bottom:8px;font-size:.76rem}.stack-form{display:grid;gap:7px;margin-bottom:9px}.stack-form>label,.compact-field-grid>label{display:grid;gap:3px;color:var(--muted);font-size:.68rem}.stack-form input,.stack-form textarea{width:100%;min-width:0;padding:8px 9px;border:1px solid var(--border);border-radius:10px;resize:vertical;background:var(--input);color:var(--text)}.stack-form>label.inline-choice{display:flex;grid-template-columns:none;flex-direction:row;align-items:center;gap:7px}.stack-form>label.inline-choice input{width:auto}.compact-field-grid{display:grid;grid-template-columns:1fr;gap:7px}.form-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:7px}.form-actions .muted{margin-right:auto}.communication-list{max-height:260px}.communication-row{appearance:none;width:100%;min-width:0;padding:9px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface);color:var(--text);text-align:left;cursor:pointer}.communication-row.selected{border-color:var(--accent);box-shadow:inset 2px 0 0 var(--accent)}.communication-row-head,.conversation-message-head{display:flex;justify-content:space-between;gap:7px;align-items:baseline}.communication-row-title,.conversation-message-author{overflow-wrap:anywhere;font-size:.74rem;font-weight:680}.communication-row-meta,.communication-id,.conversation-message-meta,.conversation-message-deliveries{display:block;color:var(--muted);font-size:.66rem;overflow-wrap:anywhere}.communication-id{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;user-select:all}.communication-description{margin:8px 0;white-space:pre-wrap;overflow-wrap:anywhere}.card-edit-form{border-top:1px solid var(--border);padding-top:9px;margin-top:9px}.communication-participants{margin:8px 0}.conversation-list{max-height:220px}.conversation-transcript{min-height:120px;max-height:430px;display:grid;gap:7px;overflow:auto;margin:9px 0}.conversation-message{min-width:0;padding:9px;border:1px solid var(--border-soft);border-left:3px solid var(--accent);border-radius:10px;background:var(--surface)}.conversation-message.agent-authored{border-left-color:var(--pass)}.conversation-message-body,.inbox-message-preview{margin-top:5px;white-space:pre-wrap;overflow-wrap:anywhere}.inbox-message-preview{max-height:6rem;overflow:auto}.inbox-delivery{cursor:default}.conversation-composer{margin:9px 0 0;padding-top:9px;border-top:1px solid var(--border-soft)}.section-head{justify-content:space-between}@media (min-width:1600px){.runtime-shell.context-docked{--content-width:1160px;grid-template-columns:var(--sidebar-width) minmax(0,1fr) var(--context-rail-width)}.runtime-shell.context-docked .runtime-inspector{position:relative;z-index:10;top:auto;right:auto;grid-column:3;grid-row:1;min-width:0;height:100dvh;overflow:hidden;border-left:1px solid var(--border-soft);background:var(--sidebar)}.runtime-shell.context-docked .context-trigger,.runtime-shell.context-docked .inspector-backdrop{display:none !important}.runtime-shell.context-docked .topbar-controls{padding-right:0}.runtime-shell.context-docked .inspector-popover{position:relative;top:auto;right:auto;width:100%;max-width:none;height:100dvh;border:0;border-radius:0;background:transparent;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;animation:none}.runtime-shell.context-docked .inspector-header{min-height:var(--header-height);padding:0 18px}}@media (max-width:1180px){.workspace-heading strong{max-width:min(620px,44vw)}.runtime-has-session .session-state-chips{display:flex}.operations-layout{grid-template-columns:1fr}.operations-agents{grid-column:1}}@media (hover:hover) and (pointer:fine){.message-actions{opacity:0}}@media (max-width:900px){:root{--header-height:calc(58px + env(safe-area-inset-top));--content-gutter:clamp(16px,3vw,24px)}.runtime-shell{grid-template-columns:minmax(0,1fr);gap:0;padding:0}.workspace-sidebar{position:fixed;z-index:60;inset:0 auto 0 0;width:min(88vw,360px);height:100dvh;visibility:hidden;border-width:0 1px 0 0;border-radius:0;background:var(--sidebar-drawer);box-shadow:20px 0 54px rgba(6,11,20,.28);transform:translateX(-102%);transition:transform 240ms var(--ease-drawer),visibility 240ms}.mobile-nav-backdrop{z-index:59}.runtime-shell.mobile-nav-open .workspace-sidebar{visibility:visible;transform:translateX(0)}.runtime-shell.mobile-nav-open .mobile-nav-backdrop{visibility:visible;opacity:1;pointer-events:auto}.mobile-nav-control{display:grid}.mobile-nav-toggle{margin-left:-5px}.sidebar-brand{padding-top:env(safe-area-inset-top)}.workspace-main{width:100%;height:100dvh;border:0;border-radius:0;box-shadow:none}.workspace-topbar{padding:env(safe-area-inset-top) max(12px,env(safe-area-inset-right)) 0 max(12px,env(safe-area-inset-left))}.workspace-heading strong{max-width:min(600px,58vw)}.topbar-controls{flex:0 0 auto;padding-right:46px}#runtime-refresh-status{display:none}.sidebar-scroll{padding-bottom:max(18px,env(safe-area-inset-bottom));overscroll-behavior:contain}.sidebar-footer{padding-bottom:env(safe-area-inset-bottom)}.runtime-inspector{z-index:50}.context-trigger{z-index:53;top:calc(9px + env(safe-area-inset-top));right:max(9px,env(safe-area-inset-right));width:40px;height:40px;border-radius:12px}.inspector-backdrop{z-index:49;background:var(--overlay)}.inspector-close{width:36px;height:36px}.inspector-close svg{width:18px;height:18px}.inspector-popover{z-index:51;top:var(--header-height);right:0;width:100vw;height:calc(100dvh - var(--header-height));border-right:0;border-bottom:0;border-left:0;border-radius:16px 16px 0 0;transform-origin:bottom center;animation-name:inspector-sheet-enter}.inspector-scroll{padding-bottom:env(safe-area-inset-bottom)}.operations-scroll{padding:24px max(18px,env(safe-area-inset-right)) max(48px,env(safe-area-inset-bottom)) max(18px,env(safe-area-inset-left))}.operations-agents .communication-grid{grid-template-columns:1fr}@keyframes inspector-sheet-enter{from{opacity:0;transform:translateY(14px)}}}@media (max-width:600px){:root{--header-height:calc(56px + env(safe-area-inset-top))}.auth-topbar{width:calc(100% - 28px);padding-top:max(24px,5vh)}.auth-topbar{gap:10px}.brand-lockup{align-items:flex-start}.brand-lockup h1{font-size:1.08rem}.brand-lockup p{font-size:.75rem;line-height:1.4}.gate{width:calc(100% - 28px);margin-top:20px;padding:21px;border-radius:20px}.gate h2{font-size:1.05rem}.gate>form>.muted{margin-bottom:16px;font-size:.79rem}.field-row{align-items:stretch;flex-direction:column}.field-row input,.field-row .btn{width:100%;min-height:44px}.workspace-sidebar{width:min(94vw,360px);grid-template-rows:var(--header-height) auto minmax(0,1fr) 58px}.sidebar-brand{padding:0 14px 0 16px}.sidebar-primary-row{padding:0 16px}.sidebar-scroll{padding-top:18px}.workspace-topbar{gap:6px;padding:env(safe-area-inset-top) max(8px,env(safe-area-inset-right)) 0 max(8px,env(safe-area-inset-left))}.workspace-heading{gap:7px}.workspace-heading>svg{display:none}.workspace-breadcrumb{display:none}.workspace-heading strong{max-width:none;font-size:.82rem}.topbar-controls{gap:3px;padding-right:43px}.session-state-chips{display:none !important}.topbar-more>summary{display:grid;width:40px;height:40px;place-items:center}.topbar-more:not([open])>.topbar-more-popover{display:none}.topbar-more-popover{position:absolute;z-index:95;top:calc(100% + 8px);right:0;width:210px;display:grid;gap:3px;padding:8px;border:1px solid var(--border);border-radius:14px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);animation:theme-menu-enter 160ms var(--ease-out)}.topbar-more-popover>.icon-btn,.topbar-more-popover>.lock-button,.topbar-more-popover>.theme-menu>.theme-trigger{width:100%;height:40px;min-height:40px;display:grid;grid-template-columns:22px minmax(0,1fr);gap:9px;place-items:center start;border:0;padding:0 10px;background:transparent}.topbar-more-popover>.language-toggle{grid-template-columns:22px minmax(0,1fr)}.topbar-more-popover>.language-toggle>span:first-child{min-width:0;justify-self:center}.topbar-more-popover .topbar-action-label,.topbar-more-popover .lock-button span{display:block;color:var(--muted-strong);font-size:.78rem;font-weight:550}.topbar-more-popover .lock-button svg{display:block;width:17px;height:17px}.topbar-more-popover>.theme-menu{width:100%}.topbar-more-popover>.theme-menu .theme-popover{position:static;width:100%;margin-top:3px;border-color:var(--border-soft);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}.banner{top:calc(var(--header-height) + 7px);right:12px;left:12px;font-size:.72rem}.chat-section-head{min-height:28px;padding-top:6px}.chat-section-head,.collaboration-board,.chat-empty,.unavailable-note,.collaboration-composer{width:calc(100% - 24px)}.unavailable-note{margin-top:8px;padding:7px 9px;font-size:.68rem;line-height:1.4}.collaboration-board{gap:0;padding:26px 0 30px}.chat-empty{padding:0 14px 8vh}.chat-empty strong{font-size:.95rem}.chat-empty p{max-width:330px;font-size:.72rem}.message-card + .message-card{margin-top:21px}.message-card.message-incoming + .message-card.message-incoming{margin-top:13px}.message-card.message-neutral + .message-card.message-neutral{margin-top:13px}.message-card.message-outgoing + .message-card.message-outgoing{margin-top:10px}.message-card + .message-card.message-thread{margin-top:9px}.message-card.message-incoming,.message-card.message-neutral,.message-card.message-outgoing{max-width:90%}.message-card.message-incoming .message-bubble,.message-card.message-neutral .message-bubble,.message-card.message-outgoing .message-bubble{padding:10px 14px}.message-footer{gap:3px 8px;margin-top:6px}.message-body{font-size:.9rem}.collaboration-composer{margin:7px auto max(10px,env(safe-area-inset-bottom));padding:7px 8px;border-radius:22px}.collaboration-composer textarea{min-height:44px;padding:10px 8px 7px;font-size:.85rem}.composer-toolbar{gap:6px;align-items:center}.composer-fields{gap:3px}.composer-tools-trigger{padding-right:9px}.composer-options-popover{width:min(340px,calc(100vw - 32px))}.composer-control{padding:8px}.composer-check{font-size:.64rem}.composer-actions{gap:5px}.composer-actions>span{max-width:140px;font-size:.7rem;text-align:right}.send-btn{width:38px;height:38px}.conversation-empty{width:calc(100% - 32px)}.conversation-empty{padding-top:clamp(72px,18vh,150px)}.conversation-empty p{margin-bottom:0;font-size:.76rem}.empty-orbit{width:44px;height:44px}.inspector-header{height:58px;padding:0 16px}.inspector-card{padding:15px 16px}.communication-section{padding:10px}.compact-field-grid{grid-template-columns:1fr}.operations-heading{align-items:flex-start;flex-direction:column;margin-bottom:17px}.operations-live{align-self:flex-start}.operations-card{padding:15px;border-radius:14px}.operations-card-head{gap:10px}.operations-metrics{grid-template-columns:1fr}}@media (max-width:380px){.workspace-sidebar{width:100vw;border-radius:0}.sidebar-runtime-status span{display:none}.workspace-heading strong{font-size:.78rem}.topbar-controls{padding-right:41px}.topbar-controls .language-toggle{width:36px;min-width:36px}.collaboration-composer{width:calc(100% - 16px)}.unavailable-note,.chat-section-head,.collaboration-board,.chat-empty{width:calc(100% - 20px)}.composer-actions>span{max-width:72px}.message-card.message-incoming,.message-card.message-neutral,.message-card.message-outgoing{max-width:94%}.message-thread{margin-left:16px}}.context-trigger{display:flex;justify-content:center;gap:6px;width:88px;font-size:.74rem}.topbar-controls{padding-right:96px}@media (max-width:760px){.context-trigger{width:76px;gap:4px;font-size:.7rem}.topbar-controls{padding-right:82px}}@media (max-height:620px){.auth-topbar{padding-top:18px}.gate{margin-top:14px;padding-top:18px;padding-bottom:18px}.gate-icon{width:36px;height:36px;margin-bottom:12px}.chat-section-head{min-height:22px;padding-top:2px}.collaboration-composer textarea{min-height:40px}.chat-empty{padding-bottom:3vh}}@media (pointer:coarse){.project-row,.session-card,.recent-session-row{min-height:44px}.context-trigger,.icon-btn,.send-btn,.mobile-nav-control,.inspector-close{min-width:44px;min-height:44px}.runner-filter select,.sidebar-search input,.sidebar-view-item,.operations-nav-item{min-height:44px}.message-action{width:44px;height:44px}.recent-panel-summary{min-height:44px;align-items:center}.message-actions{opacity:1}}@media (prefers-reduced-transparency:reduce){.workspace-topbar,.collaboration-composer,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid);backdrop-filter:none;-webkit-backdrop-filter:none}}@media (prefers-contrast:more){:root{--border:color-mix(in srgb,var(--text) 34%,transparent);--border-soft:color-mix(in srgb,var(--text) 20%,transparent)}.workspace-topbar,.collaboration-composer,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid)}}@supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){.workspace-sidebar,.workspace-main,.gate,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid)}.collaboration-composer{background:var(--surface-solid)}}@media (forced-colors:active){body{background:Canvas}.workspace-sidebar,.workspace-main,.gate,.composer-options-popover,.inspector-popover,.theme-popover,.collaboration-composer{background:Canvas;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}.project-row.selected,.session-card.selected,.theme-option[aria-pressed="true"]{outline:2px solid Highlight;outline-offset:-2px}}@media (prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto !important;animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}} +:root{font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","PingFang SC","Microsoft YaHei",Inter,ui-sans-serif,system-ui,"Segoe UI",sans-serif;color-scheme:dark;--page:#090a0d;--page-end:#090a0d;--page-surface:#0c0e12;--sidebar:#111318;--sidebar-drawer:#111318;--topbar:rgba(12,14,18,.84);--sidebar-hover:rgba(255,255,255,.048);--sidebar-selected:rgba(117,126,232,.13);--composer:rgba(20,22,28,.9);--surface:rgba(22,24,30,.97);--surface-solid:#16181e;--surface-soft:rgba(255,255,255,.05);--surface-raised:#181a20;--surface-inset:rgba(255,255,255,.035);--input:rgba(255,255,255,.052);--text:#f2f3f5;--muted:#91969f;--muted-strong:#c7cad0;--placeholder:#737984;--border:rgba(255,255,255,.105);--border-soft:rgba(255,255,255,.065);--glass-highlight:transparent;--glass-sheen:transparent;--glass-glow:transparent;--glass-edge:var(--border);--message-incoming-bg:rgba(255,255,255,.055);--message-incoming-border:rgba(255,255,255,.075);--message-outgoing-bg:#285487;--message-outgoing-border:rgba(132,178,235,.2);--message-outgoing-text:#f8faff;--message-bubble-radius:22px;--accent:#9ba4ff;--accent-soft:rgba(112,122,225,.16);--accent-border:rgba(143,152,244,.46);--accent-solid:#6571d6;--accent-hover:#7681e4;--pass:#4bd38a;--warn:#f0ae5c;--fail:#ff7e82;--danger-bg:rgba(255,104,110,.1);--danger-border:rgba(255,118,123,.34);--overlay:rgba(5,7,11,.58);--scrollbar:rgba(184,193,207,.28);--avatar:rgba(255,255,255,.15);--send-bg:#f6f8fc;--send-text:#151922;--ambient-one:transparent;--ambient-two:transparent;--ambient-three:transparent;--layout-major:61.8%;--layout-minor:38.2%;--layout-tertiary:23.6%;--sidebar-width:clamp(300px,21vw,356px);--context-rail-width:clamp(360px,30vw,560px);--header-height:68px;--content-width:760px;--content-gutter:clamp(20px,3vw,56px);--ease-out:cubic-bezier(.23,1,.32,1);--ease-drawer:cubic-bezier(.32,.72,0,1);--glass-blur:blur(14px) saturate(120%);--shadow-window:none;--shadow-raised:0 20px 60px rgba(0,0,0,.42)}:root[data-resolved-theme="light"]{color-scheme:light;--page:#f4f4f1;--page-end:#f4f4f1;--page-surface:#fafaf8;--sidebar:#efefec;--sidebar-drawer:#f4f4f1;--topbar:rgba(250,250,248,.86);--sidebar-hover:rgba(30,31,35,.045);--sidebar-selected:rgba(83,96,189,.095);--composer:rgba(255,255,253,.92);--surface:rgba(255,255,253,.97);--surface-solid:#fffffd;--surface-soft:rgba(27,29,35,.045);--surface-raised:#fffffd;--surface-inset:rgba(27,29,35,.035);--input:rgba(27,29,35,.045);--text:#202126;--muted:#737780;--muted-strong:#4e525b;--placeholder:#90949c;--border:rgba(30,31,35,.115);--border-soft:rgba(30,31,35,.07);--glass-highlight:transparent;--glass-sheen:transparent;--glass-glow:transparent;--glass-edge:var(--border);--message-incoming-bg:rgba(25,32,45,.055);--message-incoming-border:rgba(25,32,45,.065);--message-outgoing-bg:#2866a8;--message-outgoing-border:rgba(24,73,135,.2);--message-outgoing-text:#ffffff;--accent:#4f5eba;--accent-soft:rgba(83,96,189,.105);--accent-border:rgba(83,96,189,.34);--accent-solid:#5967c4;--accent-hover:#4d5bb6;--pass:#188659;--warn:#af680e;--fail:#d84d53;--danger-bg:rgba(216,77,83,.08);--danger-border:rgba(216,77,83,.26);--overlay:rgba(37,45,59,.24);--scrollbar:rgba(74,86,105,.25);--avatar:rgba(45,60,83,.12);--send-bg:#2875e5;--send-text:#fff;--ambient-one:transparent;--ambient-two:transparent;--ambient-three:transparent;--glass-blur:blur(14px) saturate(115%);--shadow-window:none;--shadow-raised:0 22px 60px rgba(45,52,68,.18)}*{box-sizing:border-box}[hidden]{display:none !important}html,body{width:100%;height:100%;background:var(--page)}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;overflow:hidden;overscroll-behavior:none;background:var(--page);color:var(--text);font-feature-settings:"kern" 1,"liga" 1;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}button,input,select,textarea{font:inherit}button,summary,[role="option"]{-webkit-tap-highlight-color:transparent}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,[role="option"]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::selection{background:var(--accent-border);color:var(--text)}svg{display:block;fill:none;stroke:currentColor;stroke-width:1.65;stroke-linecap:round;stroke-linejoin:round}h1,h2,h3,h4,p{margin-top:0}h1{margin-bottom:3px;font-size:1.35rem}h2{margin-bottom:0;font-size:.95rem}h3{margin-bottom:8px;font-size:.86rem}h4{margin-bottom:5px;color:var(--muted);font-size:.7rem;letter-spacing:.065em;text-transform:uppercase}.muted{color:var(--muted)}.small{font-size:.78rem;line-height:1.45}.error{color:var(--fail)}.eyebrow{margin-bottom:3px;color:var(--muted);font-size:.69rem;font-weight:700;letter-spacing:.075em;text-transform:uppercase}.visually-hidden{position:absolute !important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}#runtime-page{width:100%;height:100%}.runtime-shell{position:relative;width:100%;height:100dvh;display:grid;grid-template-columns:var(--sidebar-width) minmax(0,1fr);gap:0;padding:0;background:transparent}.auth-topbar{position:relative;z-index:40;width:min(760px,calc(100% - 40px));margin:0 auto;padding-top:max(40px,8vh);display:flex;justify-content:space-between;gap:20px;align-items:center}.runtime-connected .auth-topbar{display:none}.auth-preferences{display:flex;flex:0 0 auto;gap:7px;align-items:center}.brand-lockup{display:flex;align-items:center;gap:13px}.brand-lockup p{margin-bottom:0}.brand-mark{display:grid;width:40px;height:40px;place-items:center;border:1px solid var(--border);border-radius:11px;background:var(--surface-raised);color:var(--text);font-weight:800;box-shadow:none}.gate{width:min(660px,calc(100% - 40px));margin:32px auto 0;padding:30px;border:1px solid var(--border);border-radius:18px;background:var(--surface);box-shadow:var(--shadow-raised)}.gate h2{margin-bottom:9px;font-size:1.15rem}.gate>form>.muted{margin-bottom:20px;line-height:1.55}.gate-icon{display:grid;width:42px;height:42px;margin-bottom:18px;place-items:center;border:1px solid var(--border);border-radius:12px;background:var(--surface-soft);color:var(--muted-strong)}.gate-icon svg{width:21px;height:21px}.field-row{display:flex;gap:9px;align-items:center}.field-row input{flex:1;min-width:0;height:46px;border:1px solid var(--border);border-radius:10px;padding:0 14px;background:var(--input);color:var(--text);box-shadow:none}.remember-credential{display:flex;gap:7px;align-items:center;margin-top:11px;color:var(--muted);font-size:.72rem}.remember-credential input{accent-color:var(--accent-solid)}#runtime-token-error{min-height:1.2em;margin:9px 0 0;font-size:.8rem}.btn,.icon-btn,.send-btn{border:1px solid var(--border);background:var(--surface-soft);color:var(--text);cursor:pointer;box-shadow:none}.btn,.icon-btn,.send-btn,.mobile-nav-control,.text-button{transition:color 150ms ease,background-color 150ms ease,border-color 150ms ease,opacity 150ms ease,transform 150ms var(--ease-out)}.btn{min-height:36px;border-radius:9px;padding:6px 12px}.btn.primary{border-color:var(--accent-solid);background:var(--accent-solid);color:#fff;box-shadow:none}.btn.subtle{color:var(--muted-strong)}.btn:disabled,.icon-btn:disabled,.send-btn:disabled{cursor:not-allowed;opacity:.5}.icon-btn{display:grid;width:36px;height:36px;place-items:center;border-radius:9px}.icon-btn svg{width:17px;height:17px}.icon-btn.is-busy svg{animation:runtime-spin .8s linear infinite}.send-btn{display:grid;width:36px;height:36px;flex:0 0 auto;place-items:center;border:1px solid transparent;border-radius:999px;background:var(--surface-soft);color:var(--muted);box-shadow:none}.send-btn.is-ready{background:var(--send-bg);color:var(--send-text);animation:send-ready 180ms var(--ease-out)}.send-btn svg{width:17px;height:17px}.text-button{appearance:none;border:0;padding:2px 4px;background:transparent;color:var(--accent);cursor:pointer;font:inherit}.lock-button{display:inline-flex;gap:6px;align-items:center}.lock-button svg{display:none;width:17px;height:17px}@keyframes runtime-spin{to{transform:rotate(360deg)}}@keyframes send-ready{from{transform:scale(.88)}}@media (hover:hover){.btn:hover,.icon-btn:hover,.mobile-nav-control:hover{background:var(--sidebar-hover)}.btn.primary:hover{background:var(--accent-hover)}.send-btn.is-ready:hover{filter:brightness(1.06);transform:scale(1.04)}.text-button:hover{color:var(--accent-hover)}}.btn:active,.icon-btn:active,.send-btn:active,.mobile-nav-control:active,.text-button:active{transform:scale(.97)}.send-btn.is-ready:active{transform:scale(.94)}.topbar-controls,.chips,.summary-facts,.section-head,.timeline-controls{display:flex;gap:7px;align-items:center}.chips,.summary-facts{flex-wrap:wrap}.chip,.count-badge{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:999px;color:var(--muted-strong);font-size:.67rem;line-height:1}.chip{padding:4px 8px}.count-badge{min-width:22px;justify-content:center;padding:4px 6px;background:var(--surface-soft)}.tone-runtime{border-color:rgba(132,174,248,.55);color:var(--accent)}.tone-pass{border-color:rgba(71,199,125,.55);color:var(--pass)}.tone-warn{border-color:rgba(239,169,85,.55);color:var(--warn)}.tone-fail{border-color:rgba(242,115,115,.55);color:var(--fail)}.theme-menu{position:relative;z-index:70;flex:0 0 auto}.theme-menu>summary{list-style:none}.theme-menu>summary::-webkit-details-marker{display:none}.theme-trigger{color:var(--muted-strong)}.theme-menu[open] .theme-trigger{border-color:var(--accent-border);background:var(--accent-soft);color:var(--accent)}.theme-icon{display:none}:root[data-theme="system"] .theme-icon-system,:root[data-theme="light"] .theme-icon-light,:root[data-theme="dark"] .theme-icon-dark{display:block}.theme-popover{position:absolute;z-index:90;top:calc(100% + 9px);right:0;width:184px;padding:8px;border:1px solid var(--border);border-radius:13px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:top right;animation:theme-menu-enter 160ms var(--ease-out);pointer-events:auto}.theme-popover-label{display:block;padding:5px 9px 7px;color:var(--muted);font-size:.62rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.theme-option{appearance:none;width:100%;min-height:38px;display:grid;grid-template-columns:18px minmax(0,1fr) 8px;gap:9px;align-items:center;border:0;border-radius:10px;padding:0 9px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer}.theme-option svg{width:17px;height:17px}.theme-option span{font-size:.76rem;font-weight:590}.theme-option i{width:7px;height:7px;border-radius:50%;background:transparent;box-shadow:0 0 0 3px transparent}.language-toggle{flex:0 0 auto;color:var(--muted-strong)}.language-toggle span{display:block;min-width:1.35em;font-size:.68rem;font-weight:760;letter-spacing:.015em;line-height:1}:root[data-language="zh-CN"] .language-toggle span{font-size:.64rem;letter-spacing:.035em}.theme-option[aria-pressed="true"]{background:var(--accent-soft);color:var(--text)}.theme-option[aria-pressed="true"] i{background:var(--accent-solid);box-shadow:0 0 0 3px var(--accent-soft)}@media (hover:hover){.theme-option:hover{background:var(--sidebar-hover);color:var(--text)}}@keyframes theme-menu-enter{from{opacity:0;transform:translateY(-5px) scale(.97)}}.workspace-sidebar{min-width:0;min-height:0;display:grid;grid-template-rows:var(--header-height) auto minmax(0,1fr) 60px;overflow:hidden;border:0;border-right:1px solid var(--border-soft);border-radius:0;background:var(--sidebar);box-shadow:none}.sidebar-brand{display:flex;justify-content:space-between;align-items:center;padding:0 16px}.sidebar-brand-lockup,.sidebar-brand-tools,.sidebar-runtime-status{display:flex;align-items:center}.sidebar-brand-lockup{min-width:0;gap:10px}.sidebar-brand-lockup strong{overflow:hidden;font-size:.96rem;font-weight:650;letter-spacing:-.025em;text-overflow:ellipsis;white-space:nowrap}.sidebar-logo{display:grid;width:30px;height:30px;flex:0 0 auto;place-items:center;border:1px solid color-mix(in srgb,var(--text) 10%,transparent);border-radius:9px;background:var(--text);color:var(--page);font-size:.7rem;font-weight:760;box-shadow:0 1px 1px rgba(0,0,0,.12)}.sidebar-brand-tools{gap:8px}.sidebar-runtime-status{gap:5px;color:var(--muted);font-size:.7rem}.sidebar-runtime-status i{width:6px;height:6px;border-radius:50%;background:var(--pass);box-shadow:0 0 0 3px color-mix(in srgb,var(--pass) 13%,transparent)}.sidebar-runtime-status[data-connection="connecting"] i,.sidebar-connection[data-connection="connecting"] i,.operations-live[data-connection="connecting"] i{background:var(--warn)}.sidebar-runtime-status[data-connection="stale"] i,.sidebar-connection[data-connection="stale"] i,.operations-live[data-connection="stale"] i{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb,var(--warn) 13%,transparent)}.sidebar-runtime-status[data-connection="disconnected"] i,.sidebar-connection[data-connection="disconnected"] i,.operations-live[data-connection="disconnected"] i{background:var(--fail);box-shadow:0 0 0 3px color-mix(in srgb,var(--fail) 13%,transparent)}.mobile-nav-control{display:none;width:40px;height:40px;flex:0 0 auto;place-items:center;border:1px solid transparent;border-radius:12px;background:transparent;color:var(--muted-strong);cursor:pointer}.mobile-nav-control svg{width:19px;height:19px}.mobile-nav-backdrop{position:fixed;z-index:39;inset:0;visibility:hidden;border:0;padding:0;background:var(--overlay);opacity:0;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:opacity 220ms var(--ease-out),visibility 220ms}.sidebar-view-switch{display:grid;gap:3px;padding:0 10px 10px;border-bottom:1px solid var(--border-soft)}.sidebar-view-item{appearance:none;min-width:0;min-height:42px;display:grid;grid-template-columns:20px minmax(0,1fr) auto;gap:9px;align-items:center;border:0;border-radius:10px;padding:0 10px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.sidebar-view-item>svg{width:18px;height:18px;color:var(--muted)}.sidebar-view-item>span:nth-child(2){overflow:hidden;font-size:.82rem;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.sidebar-view-item.selected{background:var(--sidebar-selected);color:var(--text)}.sidebar-view-item.selected>svg{color:var(--accent)}.sidebar-view-item:active{transform:scale(.985)}.sidebar-view-meta,.sidebar-connection{display:flex;gap:5px;align-items:center;color:var(--muted);font-size:.68rem;font-weight:450;white-space:nowrap}.sidebar-connection i,.live-pill i,.operations-live i{width:6px;height:6px;border-radius:50%;background:var(--pass)}.sidebar-scroll{min-height:0;overflow-y:auto;padding:14px 10px 16px;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.sidebar-view-panel{min-width:0}.operations-navigation-copy{margin:9px 11px 15px}.operations-nav-item{appearance:none;width:100%;min-height:54px;display:grid;grid-template-columns:30px minmax(0,1fr);gap:9px;align-items:center;border:0;border-radius:10px;padding:7px 9px;background:transparent;color:var(--muted-strong);text-align:left;cursor:pointer}.operations-nav-item>svg{width:17px;height:17px;justify-self:center;color:var(--muted)}.operations-nav-item>span{min-width:0;display:grid;gap:2px}.operations-nav-item strong{font-size:.8rem;font-weight:600}.operations-nav-item small{overflow:hidden;color:var(--muted);font-size:.7rem;text-overflow:ellipsis;white-space:nowrap}.operations-nav-item:hover{background:var(--sidebar-hover)}.operations-nav-item.selected{background:var(--sidebar-selected);color:var(--text)}.operations-nav-item.selected>svg{color:var(--accent)}.sidebar-section{min-height:0;padding:0 0 14px}.sidebar-section-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline;padding:0 11px}.sidebar-section-head h2{color:var(--muted);font-size:.74rem;font-weight:600;letter-spacing:.01em;text-transform:none}.sidebar-section-head #runtime-project-status{max-width:58%;overflow:hidden;color:var(--placeholder);font-size:.67rem;text-align:right;text-overflow:ellipsis;white-space:nowrap}.sidebar-filter-row{display:flex;gap:8px;align-items:center;margin:10px 2px 8px}.runner-filter{position:relative;min-width:0;flex:1;display:flex;align-items:center}.runner-filter>svg{position:absolute;z-index:1;left:9px;width:14px;height:14px;color:var(--muted);pointer-events:none}.runner-filter select{appearance:none;width:100%;height:36px;min-width:0;border:1px solid var(--border-soft);border-radius:9px;padding:0 28px 0 30px;background:var(--surface-soft);color:var(--muted-strong);font-size:.74rem;cursor:pointer}.runner-filter::after{content:"⌄";position:absolute;right:9px;color:var(--placeholder);font-size:.65rem;pointer-events:none}.sidebar-status{display:none}.selected-project{display:none}.sidebar-search{position:relative;margin:0 2px 14px}.sidebar-search svg{position:absolute;top:9px;left:9px;width:14px;height:14px;color:var(--placeholder);pointer-events:none}.sidebar-search input{width:100%;height:36px;min-width:0;border:1px solid var(--border-soft);border-radius:9px;padding:0 9px 0 31px;background:var(--surface-soft);color:var(--text);font-size:.75rem;transition:background-color 140ms ease,border-color 140ms ease}.sidebar-search input:hover,.sidebar-search input:focus{border-color:var(--border);background:var(--sidebar-selected);box-shadow:none}.sidebar-search input::placeholder{color:var(--placeholder)}.project-list,.session-list,.recent-session-list,.fleet-list,.communication-list{display:grid;align-content:start;grid-auto-rows:max-content;gap:2px;min-height:0;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.project-list{gap:8px;overflow:visible}.device-group{min-width:0;display:grid;gap:4px;padding:0;border:0}.device-group>summary::-webkit-details-marker{display:none}.device-group:last-child{padding-bottom:0;border-bottom:0}.device-group-head{display:grid;grid-template-columns:28px minmax(0,1fr) 8px 12px;gap:8px;align-items:center;min-height:40px;padding:2px 8px;border:0;border-radius:9px;background:transparent;box-shadow:none;cursor:pointer;list-style:none}.device-group-head::after{content:"›";color:var(--placeholder);font-size:1rem;transform:rotate(0deg);transition:transform 140ms var(--ease-out)}.device-group[open]>.device-group-head::after{transform:rotate(90deg)}.device-group-head:hover{background:var(--sidebar-hover)}.device-group-icon{display:grid;width:28px;height:28px;place-items:center;border:1px solid var(--border-soft);border-radius:8px;background:var(--surface-soft);color:var(--muted-strong)}.device-group-icon svg{width:14px;height:14px}.device-group-identity{display:grid;gap:1px;align-items:center}.device-group-identity strong{min-width:0;overflow:hidden;color:var(--muted-strong);font-size:.78rem;font-weight:620;letter-spacing:0;text-overflow:ellipsis;white-space:nowrap}.device-group-identity .small{overflow:hidden;color:var(--placeholder);font-size:.68rem;text-overflow:ellipsis;white-space:nowrap}.device-group-dot{width:6px;height:6px;border-radius:50%;background:var(--pass)}.device-group.offline .device-group-dot{background:var(--fail)}.device-project-list{display:grid;gap:2px;margin:0;padding:0;border-left:0}.device-project-empty{margin:4px 10px 8px}.project-row{appearance:none;position:relative;width:100%;min-width:0;display:grid;grid-template-columns:28px minmax(0,1fr);gap:0 9px;align-items:start;padding:8px;border:0;border-radius:9px;background:transparent;color:inherit;text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.project-row::before{content:none}.project-row::after{content:none}.project-row:hover{background:var(--sidebar-hover)}.project-row.selected{background:var(--sidebar-selected);box-shadow:inset 2px 0 0 var(--accent-solid)}.project-row-icon{display:grid;width:28px;height:28px;place-items:center;border-radius:8px;background:var(--surface-soft);color:var(--muted-strong)}.project-row-icon svg{width:15px;height:15px}.project-row.selected .project-row-icon{background:var(--accent-soft);color:var(--accent)}.project-row-main{min-width:0;display:grid;gap:3px;padding-top:1px}.project-row-heading{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px;align-items:center}.project-row-title{overflow:hidden;font-size:.8rem;font-weight:620;letter-spacing:-.005em;text-overflow:ellipsis;white-space:nowrap}.project-row.selected .project-row-title{color:var(--text)}.project-row-id,.project-row-runner{display:none}.project-row-signals{min-width:0;display:flex;gap:4px;align-items:center}.project-row-signals:empty{display:none}.project-row-state{display:inline-flex;gap:4px;align-items:center;border-radius:999px;padding:3px 6px;background:var(--surface-soft);color:var(--muted-strong);font-size:.66rem;font-weight:650;line-height:1;white-space:nowrap}.project-row-state::before{content:"";width:5px;height:5px;flex:0 0 auto;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 12%,transparent)}.project-row-state.tone-runtime{background:var(--accent-soft);color:var(--accent)}.project-row-state.tone-warn{background:color-mix(in srgb,var(--warn) 10%,transparent);color:var(--warn)}.project-row-state.tone-fail{background:var(--danger-bg);color:var(--fail)}.project-row-meta{overflow:hidden;color:var(--muted);font-size:.7rem;line-height:1.4;text-overflow:ellipsis;white-space:nowrap}.workspace-path,.workspace-identity{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow-wrap:anywhere}.sessions-panel{margin:4px 4px 10px 36px;padding:5px 0 2px 8px;border:0;border-left:1px solid var(--border-soft)}.sessions-panel .sidebar-section-head{margin:2px 0 5px;padding:0 8px}.sessions-panel .sidebar-section-head h2{font-size:.72rem}.session-list{overflow:visible;list-style:none;margin:0;padding:0}.session-list>li{margin:0;padding:0}.session-card{position:relative;min-width:0;display:grid;grid-template-columns:22px minmax(0,1fr);gap:8px;align-items:start;padding:8px;border:0;border-radius:8px;background:transparent;color:inherit;text-align:left;cursor:pointer;transition:background-color 140ms ease,color 140ms ease,transform 120ms var(--ease-out)}.session-card::before{content:none}.session-card::after{content:none}.session-card:hover{background:var(--sidebar-hover)}.session-card.selected{background:var(--sidebar-selected);box-shadow:none}.session-card-icon{display:grid;width:22px;height:22px;place-items:center;color:var(--placeholder)}.session-card-icon svg{width:14px;height:14px}.session-card.selected .session-card-icon{color:var(--accent)}.session-card-main{min-width:0}.session-title{display:-webkit-box;margin:0;overflow:hidden;font-size:.82rem;font-weight:500;line-height:1.35;overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:4}.session-card .session-title{font-size:.78rem;line-height:1.42;-webkit-line-clamp:2}.session-card.selected .session-title{color:var(--text);font-weight:590}.session-card .chips{display:flex;gap:0;margin-top:4px}.session-card .chips .chip{border:0;padding:0;background:transparent;color:var(--muted);font-size:.68rem}.session-card .chips .chip + .chip::before{content:"·";margin:0 5px;color:var(--placeholder)}.summary-facts{margin-top:5px}.activity-preview{display:flex;gap:5px;margin-top:5px;overflow-wrap:anywhere}.activity-preview-label{flex:0 0 auto;font-weight:700}.empty-copy{margin:8px 40px}.recent-panel{margin:14px 4px 6px;padding:10px 4px 0;border-top:1px solid var(--border-soft)}.recent-panel-summary{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;color:var(--muted-strong);font-size:.74rem;font-weight:600;cursor:pointer;list-style:none;user-select:none;transition:background-color 140ms ease,color 140ms ease}.recent-panel-summary::-webkit-details-marker{display:none}.recent-panel-summary:hover{background:var(--sidebar-hover);color:var(--text)}.recent-panel-title{font-size:.74rem;font-weight:600;color:var(--muted-strong)}.recent-panel-meta{margin-left:auto;color:var(--placeholder);font-size:.68rem;font-weight:400}.recent-panel-summary::after{content:"›";display:inline-block;color:var(--placeholder);font-size:.95rem;line-height:1;transform:rotate(0deg);transition:transform 140ms var(--ease-out)}.recent-panel[open]>.recent-panel-summary::after{transform:rotate(90deg)}.recent-session-list{max-height:250px}.recent-session-row{appearance:none;width:100%;min-width:0;display:grid;gap:4px;padding:8px 10px;border:1px solid transparent;border-radius:11px;background:transparent;color:inherit;text-align:left;cursor:pointer}.recent-session-row:hover,.recent-session-row.selected{background:var(--sidebar-selected)}@media (hover:hover){.sidebar-view-item:hover,.project-row:hover,.session-card:hover,.recent-session-row:hover{background:var(--sidebar-hover)}}.project-row:active,.session-card:active,.recent-session-row:active{transform:scale(.985)}.recent-session-location{overflow-wrap:anywhere}.recent-session-signals{display:flex;flex-wrap:wrap;gap:5px}.sidebar-footer{display:flex;gap:10px;align-items:center;padding:0 18px;border-top:1px solid var(--border-soft);background:transparent;box-shadow:none}.local-avatar{display:grid;width:30px;height:30px;place-items:center;border:1px solid var(--border);border-radius:9px;background:var(--avatar);font-size:.72rem;font-weight:700;box-shadow:none}.sidebar-footer>span:last-child{display:grid;gap:1px;font-size:.72rem}.sidebar-footer small{color:var(--placeholder);font-size:.61rem}.workspace-main{position:relative;min-width:0;min-height:0;display:grid;grid-template-rows:var(--header-height) minmax(0,1fr);overflow:hidden;border:0;border-radius:0;background:var(--page-surface);box-shadow:none}.workspace-topbar{position:relative;z-index:40;min-width:0;display:flex;justify-content:space-between;gap:12px;align-items:center;overflow:visible;padding:0 18px 0 22px;border-bottom:1px solid var(--border-soft);background:var(--topbar);box-shadow:0 1px 0 color-mix(in srgb,var(--text) 2%,transparent);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur)}.workspace-heading{min-width:0;flex:1 1 auto;display:flex;gap:10px;align-items:center}.workspace-heading>svg{width:17px;height:17px;flex:0 0 auto;color:var(--muted-strong)}.workspace-heading-copy{min-width:0;display:grid;gap:2px}.workspace-breadcrumb{min-width:0;display:flex;gap:5px;align-items:center;overflow:hidden;color:var(--placeholder);font-size:.68rem;line-height:1}.workspace-breadcrumb span{min-width:0;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-breadcrumb i{color:var(--border);font-style:normal}.workspace-heading strong{max-width:min(760px,54vw);overflow:hidden;font-size:.94rem;font-weight:620;letter-spacing:-.012em;text-overflow:ellipsis;white-space:nowrap}.topbar-controls{min-width:0;display:flex;justify-content:flex-end;gap:7px;align-items:center;padding-right:42px}.topbar-more{position:relative;z-index:72}.topbar-more>summary{display:none;list-style:none}.topbar-more>summary::-webkit-details-marker{display:none}.topbar-more-popover{display:flex;gap:7px;align-items:center}.topbar-action-label{display:none}.session-state-chips{display:none}.runtime-has-session .session-state-chips{display:flex}.session-state-chips .chip:not(:last-child){display:none}.session-state-chips .chip{min-height:24px;border-color:var(--border-soft);background:var(--surface-soft);color:var(--muted)}.session-state-chips .chip:last-child{color:var(--muted-strong)}.banner{position:absolute;z-index:4;top:calc(var(--header-height) + 8px);right:18px;left:18px;margin:0;border:1px solid var(--danger-border);border-radius:12px;padding:9px 11px;background:var(--danger-bg);box-shadow:inset 0 1px 0 var(--glass-highlight);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);font-size:.78rem}.conversation-stage{grid-row:2;min-height:0;position:relative;overflow:hidden}.conversation-empty{width:min(520px,calc(100% - 44px));height:100%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding-top:clamp(88px,23.6dvh,220px);text-align:center}.conversation-empty h2{margin:17px 0 8px;font-size:1rem}.conversation-empty p{max-width:390px;margin-bottom:0;color:var(--muted);font-size:.82rem;line-height:1.55;text-wrap:balance}.empty-orbit{display:grid;width:56px;height:56px;place-items:center;border:1px solid var(--border);border-radius:16px;background:var(--surface-raised);color:var(--muted-strong);box-shadow:0 10px 28px rgba(0,0,0,.08)}.empty-orbit svg{width:24px;height:24px}.conversation-empty h2{margin-top:22px;font-size:clamp(1.35rem,3vw,1.8rem);font-weight:560;letter-spacing:-.03em}.conversation-empty p{max-width:470px;margin-top:4px;font-size:.84rem}.session-conversation{position:absolute;inset:0;min-height:0;display:grid;grid-template-rows:minmax(0,1fr) auto}.session-chat{position:relative;min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr) auto}.chat-section-head,.unavailable-note,.collaboration-board,.chat-empty,.collaboration-composer{width:min(var(--content-width),calc(100% - var(--content-gutter) - var(--content-gutter)))}.chat-section-head{min-height:24px;margin:0 auto;display:flex;justify-content:flex-end;align-items:end;padding-top:8px}.chat-section-head>span{color:var(--placeholder);font-size:.68rem}#runtime-collaboration-status{display:none}.unavailable-note{margin:5px auto;padding:9px 11px;border:1px solid var(--border-soft);border-radius:12px;background:var(--surface-soft);box-shadow:inset 0 1px 0 var(--glass-highlight)}.chat-scroll{min-height:0;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.collaboration-board{min-height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-end;gap:0;padding:clamp(28px,3.8vh,44px) 0 clamp(44px,6vh,68px)}.chat-empty{min-height:100%;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:clamp(72px,23.6dvh,190px) 0 48px;text-align:center}.chat-empty>span{margin-bottom:10px;color:var(--accent);font-size:1.2rem}.chat-empty strong{font-size:1rem;letter-spacing:-.01em}.chat-empty p{max-width:520px;margin:6px 0 0;line-height:1.55;text-wrap:balance}.chat-retention{display:none}.message-card{position:relative;min-width:0;max-width:100%;align-self:flex-start;display:grid;grid-template-columns:minmax(0,1fr);align-items:start;border:0;border-radius:0;padding:0;background:transparent}.message-card + .message-card{margin-top:28px}.message-card.message-incoming + .message-card.message-incoming{margin-top:17px}.message-card.message-neutral + .message-card.message-neutral{margin-top:17px}.message-card.message-outgoing + .message-card.message-outgoing{margin-top:13px}.message-card + .message-card.message-thread{margin-top:16px}.message-card.message-entering{animation:message-enter 240ms var(--ease-out)}@keyframes message-enter{from{opacity:0;transform:translateY(7px) scale(.992)}}.message-card.message-incoming{width:fit-content;max-width:min(82%,880px);align-self:flex-start}.message-card.message-neutral{width:fit-content;max-width:min(82%,880px);align-self:flex-start}.message-card.message-outgoing{width:fit-content;max-width:min(68%,680px);align-self:flex-end}.message-content{min-width:0;display:flex;flex-direction:column;align-items:flex-start}.message-card.message-outgoing .message-content{align-items:flex-end}.message-author{min-height:18px;display:flex;align-items:center;margin:0 2px 4px;color:var(--muted);font-size:.72rem}.message-author-name{font-weight:600}.message-card.message-outgoing .message-author{justify-content:flex-end}.message-card.message-group-continuation .message-author{display:none}.message-reply-context{max-width:100%;display:flex;gap:6px;align-items:center;margin:0 4px 7px;color:var(--placeholder);font-size:.7rem;line-height:1.4}.message-reply-context svg{width:12px;height:12px;flex:0 0 auto}.message-reply-context span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-card.message-outgoing .message-reply-context{justify-content:flex-end}.message-bubble{min-width:0;max-width:100%}.message-card.message-incoming .message-bubble{width:fit-content;border:0;border-radius:var(--message-bubble-radius);padding:clamp(11px,1.1vw,13px) clamp(16px,1.5vw,19px);background:var(--message-incoming-bg);color:var(--text);box-shadow:0 1px 1px rgba(0,0,0,.025)}.message-card.message-neutral .message-bubble{width:fit-content;border:0;border-radius:var(--message-bubble-radius);padding:clamp(11px,1.1vw,13px) clamp(16px,1.5vw,19px);background:var(--message-incoming-bg);color:var(--text);box-shadow:0 1px 1px rgba(0,0,0,.025)}.message-card.message-outgoing .message-bubble{align-self:flex-end;border:0;border-radius:var(--message-bubble-radius);padding:clamp(10px,1.1vw,12px) clamp(15px,1.5vw,18px);background:var(--message-outgoing-bg);color:var(--message-outgoing-text);box-shadow:0 1px 1px rgba(0,0,0,.055)}.message-footer{min-width:0;display:flex;flex-wrap:wrap;gap:5px 9px;align-items:center;margin-top:7px;color:var(--muted)}.message-card.message-outgoing .message-footer{width:100%;align-self:flex-end;justify-content:flex-end;padding:0 2px}.message-card.message-incoming .message-footer{justify-content:flex-start;padding:0 2px}.message-card.message-neutral .message-footer{justify-content:flex-start;padding:0 2px}.message-head{min-width:0;display:flex;flex:0 1 auto;justify-content:flex-start;gap:7px;align-items:center;color:var(--muted)}.message-card.message-outgoing .message-head{justify-content:flex-end}.message-kind{display:inline-flex;min-height:20px;align-items:center;border:1px solid var(--border-soft);border-radius:999px;padding:0 7px;background:var(--surface-soft);color:var(--muted);font-size:.68rem;font-weight:560}.message-head>.small{font-size:.7rem}.message-meta{display:none}.message-resolution{color:var(--muted);font-size:.7rem}.message-ack,.message-resolution{flex-basis:100%}.message-card.message-outgoing .message-ack,.message-card.message-outgoing .message-resolution{text-align:right}.message-card.message-outgoing .muted,.message-card.message-outgoing .message-resolution{color:var(--muted)}.message-body{position:relative;max-height:none;margin:0;overflow:visible;overflow-wrap:anywhere;font-size:.92rem;line-height:1.62}.message-body.is-collapsed{max-height:31rem;overflow:hidden;mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 64px),transparent 100%)}.message-body.is-expanded{max-height:none;mask-image:none}.message-paragraph{margin:0;white-space:pre-wrap}.message-paragraph + .message-paragraph,.message-body>:not(:first-child){margin-top:.8em}.message-body ul,.message-body ol{margin-bottom:0;padding-left:1.4em}.message-body li + li{margin-top:.28em}.message-body blockquote{margin-right:0;margin-bottom:0;margin-left:0;padding-left:12px;border-left:2px solid color-mix(in srgb,currentColor 24%,transparent);color:var(--muted-strong)}.message-body blockquote .message-paragraph{margin:0}.message-heading{margin-bottom:0;color:inherit;font-size:1em;font-weight:680;letter-spacing:-.01em;text-transform:none}.message-body a{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 46%,transparent);text-underline-offset:2px}.message-code{overflow:hidden;border:1px solid color-mix(in srgb,currentColor 11%,transparent);border-radius:13px;background:color-mix(in srgb,var(--page) 84%,transparent);color:var(--text)}.message-code>header{min-height:34px;display:flex;justify-content:space-between;gap:12px;align-items:center;padding:0 10px 0 12px;border-bottom:1px solid var(--border-soft);color:var(--muted);font:500 .7rem/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.message-code-copy{appearance:none;display:inline-flex;gap:6px;align-items:center;border:0;border-radius:7px;padding:5px 7px;background:transparent;color:var(--muted-strong);cursor:pointer;font:inherit}.message-code-copy:hover{background:var(--surface-soft);color:var(--text)}.message-code-copy svg{width:13px;height:13px}.message-code pre{max-width:100%;margin:0;overflow:auto;padding:13px 14px;scrollbar-width:thin}.message-code code{white-space:pre;font:500 .78rem/1.58 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.message-expand{appearance:none;margin-top:8px;border:0;border-radius:8px;padding:5px 8px;background:color-mix(in srgb,currentColor 8%,transparent);color:inherit;cursor:pointer;font-size:.72rem;font-weight:600}.message-ack{color:var(--warn);font-size:.7rem}.message-ack.observed{color:var(--muted)}.message-actions{display:flex;justify-content:flex-start;gap:2px;margin-left:auto;opacity:.58;transition:opacity 140ms ease}.message-card.message-outgoing .message-actions{justify-content:flex-end}.message-action{appearance:none;display:grid;width:26px;height:26px;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer;transition:color 120ms ease,background-color 120ms ease,transform 120ms var(--ease-out)}.message-action svg{width:13px;height:13px}.message-action:hover{background:var(--surface-soft);color:var(--text)}.message-action.danger:hover{color:var(--fail)}.message-action:active{transform:scale(.94)}.message-card:hover .message-actions,.message-card:focus-within .message-actions{opacity:1}.message-thread{margin-left:0}.message-date-separator{width:100%;display:flex;align-items:center;gap:12px;margin:30px 0 22px;color:var(--placeholder);font-size:.7rem}.message-date-separator::before,.message-date-separator::after{content:"";height:1px;flex:1;background:var(--border-soft)}.new-messages-button{position:absolute;z-index:8;right:50%;bottom:12px;display:inline-flex;gap:7px;align-items:center;border:1px solid var(--border);border-radius:999px;padding:8px 12px;background:var(--surface);color:var(--muted-strong);box-shadow:var(--shadow-raised);cursor:pointer;transform:translateX(50%);animation:new-messages-enter 180ms var(--ease-out)}.new-messages-button svg{width:14px;height:14px}@keyframes new-messages-enter{from{opacity:0;transform:translate(50%,7px) scale(.96)}}.collaboration-composer{position:relative;isolation:isolate;margin:10px auto max(16px,env(safe-area-inset-bottom));padding:8px 9px 8px;border:1px solid var(--border);border-radius:24px;background:var(--composer);box-shadow:0 12px 34px rgba(5,7,12,.13),inset 0 1px 0 color-mix(in srgb,white 5%,transparent);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transition:border-color 220ms ease,background-color 220ms ease,box-shadow 260ms var(--ease-out),transform 260ms var(--ease-out);animation:composer-enter 280ms var(--ease-out)}.collaboration-composer:focus-within{border-color:color-mix(in srgb,var(--accent) 34%,var(--border));box-shadow:0 18px 42px rgba(5,7,12,.17),0 0 0 3px color-mix(in srgb,var(--accent-soft) 72%,transparent);transform:translateY(-1px)}.collaboration-composer textarea{width:100%;height:44px;min-height:44px;max-height:180px;resize:none;overflow-y:hidden;border:0;outline:0;padding:10px 9px 7px;background:transparent;color:var(--text);font-size:.88rem;line-height:1.5}.collaboration-composer textarea::placeholder{color:var(--placeholder)}.collaboration-composer.is-unavailable{opacity:.7}.collaboration-composer.is-unavailable textarea{cursor:not-allowed}.composer-toolbar{min-height:38px;display:flex;justify-content:space-between;gap:10px;align-items:center}.composer-fields{min-width:0;display:flex;gap:8px;align-items:center}.composer-options{position:relative;z-index:12}.composer-options>summary{list-style:none}.composer-options>summary::-webkit-details-marker{display:none}.composer-tools-trigger{min-width:38px;height:36px;display:inline-flex;gap:7px;align-items:center;border-radius:999px;padding:0 11px 0 9px;color:var(--muted-strong);cursor:pointer;transition:color 160ms ease,background-color 160ms ease,transform 140ms var(--ease-out)}.composer-tools-trigger svg{width:18px;height:18px;transition:transform 190ms var(--ease-out)}.composer-tools-trigger span{max-width:210px;overflow:hidden;font-size:.67rem;font-weight:570;text-overflow:ellipsis;white-space:nowrap}.composer-options[open] .composer-tools-trigger,.composer-options.has-selection .composer-tools-trigger{background:var(--surface-soft);color:var(--text)}.composer-options.has-selection .composer-tools-trigger{color:var(--accent)}.composer-options[open] .composer-tools-trigger svg{transform:rotate(45deg)}.composer-options-popover{position:absolute;z-index:30;bottom:calc(100% + 12px);left:0;width:min(350px,calc(100vw - 40px));padding:12px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:bottom left;animation:composer-options-enter 180ms var(--ease-out)}.composer-options-head{display:grid;gap:2px;margin-bottom:10px;padding:0 2px}.composer-options-head strong{font-size:.76rem}.composer-options-head .small{font-size:.61rem}.composer-option-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.composer-control{min-width:0;display:grid;gap:5px;border:0;border-radius:10px;padding:8px 9px;background:var(--surface-soft);color:var(--placeholder);font-size:.61rem}.composer-control select{width:100%;height:28px;min-width:0;border:0;outline:0;padding:0;background:transparent;color:var(--text);font-size:.72rem;cursor:pointer}.composer-control:focus-within{box-shadow:0 0 0 2px var(--accent-soft)}.composer-check{grid-column:1 / -1;min-height:38px;display:flex;gap:8px;align-items:center;border-radius:10px;padding:0 10px;background:var(--surface-soft);color:var(--muted-strong);font-size:.68rem}.composer-fields input[type="checkbox"]{accent-color:var(--accent-solid)}.composer-actions{min-width:0;display:flex;justify-content:flex-end;align-items:center;gap:8px}.composer-actions>span{max-width:360px;overflow:hidden;text-align:right;line-height:1.3}.reply-target,.edit-target{display:flex;justify-content:space-between;gap:8px;align-items:center;margin:3px 3px 4px;padding:7px 9px;border:0;border-left:2px solid var(--accent);border-radius:0 9px 9px 0;background:var(--surface-soft);animation:composer-context-enter 180ms var(--ease-out)}.edit-target{border-left:3px solid var(--warn)}@keyframes composer-enter{from{opacity:0;transform:translateY(10px) scale(.992)}}@keyframes composer-options-enter{from{opacity:0;transform:translateY(6px) scale(.97)}}@keyframes composer-context-enter{from{opacity:0;transform:translateY(4px)}}.operations-stage{grid-row:2;min-width:0;min-height:0;overflow:hidden;background:var(--page-surface)}.operations-scroll{width:100%;height:100%;overflow-y:auto;padding:clamp(24px,3vw,44px) var(--content-gutter) 64px;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.operations-heading{width:min(1440px,100%);margin:0 auto 22px;display:flex;justify-content:space-between;gap:24px;align-items:flex-start}.operations-heading h2{margin:1px 0 7px;font-size:clamp(1.35rem,2vw,1.75rem);font-weight:620;letter-spacing:-.035em}.operations-heading p:last-child{max-width:680px;margin-bottom:0;line-height:1.55}.operations-live{display:inline-flex;gap:7px;align-items:center;border:1px solid var(--border-soft);border-radius:999px;padding:7px 10px;background:var(--surface-soft);color:var(--muted-strong);font-size:.74rem;white-space:nowrap}.operations-layout{width:min(1440px,100%);margin:0 auto;display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}.operations-card{min-width:0;scroll-margin-top:20px;border:1px solid var(--border-soft);border-radius:16px;padding:18px;background:color-mix(in srgb,var(--surface) 72%,transparent);box-shadow:0 1px 0 color-mix(in srgb,var(--text) 3%,transparent)}.operations-card:focus{outline:none}.operations-card:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.operations-card-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;margin-bottom:13px}.operations-card-head h3{margin:2px 0 0;font-size:.98rem;font-weight:630;letter-spacing:-.015em}.operations-card-head>.small{max-width:48%;text-align:right}.operations-agents{grid-column:1 / -1}.operations-metrics{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:0}.operations-metrics .metric{min-height:78px;grid-template-columns:1fr;gap:4px;align-content:center;border:0;border-radius:12px;padding:12px 13px;background:var(--surface-inset)}.operations-metrics .metric>.small{grid-column:1}.operations-metrics .metric strong{font-size:.88rem}.operations-runners .fleet-list{max-height:none;margin-top:0}.operations-agents .communication-grid{grid-template-columns:minmax(300px,.85fr) minmax(360px,1.15fr);gap:12px}.operations-agents .communication-agents,.operations-agents .communication-conversations{align-content:start}.operations-agents .communication-section{border-radius:12px;padding:13px}.operations-agents .communication-list{max-height:320px}.operations-agents .conversation-list{max-height:280px}.operations-agents .conversation-transcript{max-height:520px}.runtime-shell[data-workspace-view="operations"] .runtime-inspector{display:none}.runtime-shell[data-workspace-view="operations"].context-docked{grid-template-columns:var(--sidebar-width) minmax(0,1fr)}.runtime-shell[data-workspace-view="operations"] .session-state-chips{display:none}.runtime-inspector{position:absolute;z-index:50;top:0;right:0}.runtime-inspector{display:none}.runtime-has-session .runtime-inspector{display:block}.runtime-operations-view .runtime-inspector{display:none}.runtime-shell[data-workspace-view="operations"] .topbar-controls,body:not(.runtime-has-session) .topbar-controls{padding-right:0}.context-trigger{position:absolute;z-index:23;top:16px;right:18px;display:grid;width:36px;height:36px;place-items:center;border:1px solid transparent;border-radius:9px;color:var(--muted);cursor:pointer;list-style:none;transition:color 140ms ease,background-color 140ms ease,border-color 140ms ease,transform 120ms var(--ease-out)}.context-trigger::-webkit-details-marker{display:none}.context-trigger:hover,.runtime-inspector[open] .context-trigger{border-color:var(--border);background:var(--sidebar-hover);color:var(--text);box-shadow:inset 0 1px 0 var(--glass-highlight)}.context-trigger svg{width:17px;height:17px}.inspector-backdrop{position:fixed;z-index:20;inset:0;border:0;background:color-mix(in srgb,var(--overlay) 78%,transparent);cursor:default}.inspector-popover{position:fixed;z-index:21;top:calc(var(--header-height) + 10px);right:10px;width:clamp(380px,var(--layout-minor),460px);max-width:calc(100vw - 20px);height:min(780px,calc(100dvh - var(--header-height) - 20px));display:grid;grid-template-rows:58px minmax(0,1fr);overflow:hidden;border:1px solid var(--border);border-radius:14px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);transform-origin:top right;animation:inspector-enter 170ms var(--ease-out)}.inspector-backdrop{animation:inspector-backdrop-enter 160ms ease-out}@keyframes inspector-enter{from{opacity:0;transform:translateY(-4px) scale(.985)}}@keyframes inspector-backdrop-enter{from{opacity:0}}.inspector-header{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:0 17px;border-bottom:1px solid var(--border-soft);background:transparent;box-shadow:none}.inspector-header>div:first-child{display:grid}.inspector-header strong{font-size:.86rem}.inspector-header-actions{display:flex;align-items:center;gap:8px}.inspector-close{display:grid;width:32px;height:32px;place-items:center;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--muted-strong);cursor:pointer;transition:color 140ms ease,background-color 140ms ease,border-color 140ms ease}.inspector-close:hover{border-color:var(--border-soft);background:var(--sidebar-hover);color:var(--text)}.inspector-close svg{width:16px;height:16px}.live-pill{display:inline-flex;gap:6px;align-items:center;padding:5px 7px;border:1px solid var(--border);border-radius:999px;color:var(--muted-strong);font-size:.65rem}.inspector-scroll{min-height:0;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}.inspector-card{display:block;margin:0;padding:14px 16px;border:0;border-bottom:1px solid var(--border-soft);background:transparent}.inspector-card>summary{display:flex;justify-content:space-between;gap:9px;align-items:baseline;color:var(--muted-strong);font-size:.77rem;font-weight:680;cursor:pointer;list-style:none}.inspector-card>summary::-webkit-details-marker{display:none}.inspector-card>summary::before{content:"›";color:var(--muted)}.inspector-card[open]>summary::before{transform:rotate(90deg)}.inspector-card>summary>:nth-child(2){max-width:48%;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.inspector-card-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline;margin-bottom:9px}.context-navigation{position:sticky;top:-15px;z-index:1;display:flex;gap:4px;margin:-1px 0 16px;padding:5px;border:1px solid var(--border-soft);border-radius:12px;background:var(--surface-solid)}.context-navigation button{flex:1;min-width:0;min-height:40px;border:0;border-radius:8px;background:transparent;color:var(--muted-strong);font:inherit;font-size:.78rem;cursor:pointer}.context-navigation button:hover{background:var(--sidebar-hover);color:var(--text)}.context-navigation button[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent);font-weight:650}.context-navigation button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.session-identity{display:grid;grid-template-columns:1fr;gap:7px;margin:8px 0;padding:10px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset);box-shadow:none}.session-identity-fact{min-width:0;display:grid;gap:2px}.session-identity-value{overflow-wrap:anywhere}.session-identity code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.69rem;user-select:all}.workspace-identity{margin:8px 0;font-size:.68rem}.overview{display:grid;grid-template-columns:1fr;gap:6px;margin:11px 0}.context-primary-overview{margin-bottom:0}.context-secondary-overview{margin-top:8px}.overview-card{min-width:0;padding:9px 10px;border:1px solid var(--border-soft);border-left:3px solid var(--border);border-radius:9px;background:var(--surface-inset);box-shadow:none}.overview-card p{margin-bottom:0;overflow-wrap:anywhere;font-size:.75rem;line-height:1.4}.runtime-fact{border-left-color:var(--accent)}.reported-card{border-left-color:var(--muted);opacity:.84}.tone-card-pass{border-left-color:var(--pass)}.tone-card-warn{border-left-color:var(--warn)}.tone-card-fail{border-left-color:var(--fail)}.tone-card-muted{border-left-color:var(--muted)}.activity-section{margin-top:13px;padding-top:12px;border-top:1px solid var(--border-soft)}.timeline-controls{justify-content:space-between;margin-bottom:7px;font-size:.78rem}.timeline{display:grid;gap:6px;max-height:300px;overflow:auto;list-style:none;margin:0;padding:0}.timeline-event{padding:8px 9px;border:1px solid var(--border-soft);border-left:3px solid var(--border);border-radius:10px;background:var(--surface-inset)}.timeline-event.failed{border-left-color:var(--fail)}.timeline-event.reported-progress{border-left-color:var(--muted);opacity:.82}.timeline-head{display:flex;justify-content:space-between;gap:8px;align-items:baseline}.timeline-kind{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.7rem}.timeline-body{margin-top:4px;overflow-wrap:anywhere}.metric-grid{display:grid;grid-template-columns:1fr;gap:5px;margin-top:11px}.metric{min-width:0;display:grid;grid-template-columns:minmax(72px,.7fr) minmax(0,1.3fr);gap:3px 7px;align-items:baseline;padding:8px 9px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset)}.metric strong,.metric span{overflow-wrap:anywhere}.metric strong{font-size:.74rem}.metric>.small{grid-column:2}.metric-label{color:var(--muted);font-size:.63rem;letter-spacing:.05em;text-transform:uppercase}.fleet-list{max-height:330px;margin-top:10px}.fleet-row{appearance:none;width:100%;min-width:0;display:grid;gap:6px;padding:10px;border:1px solid var(--border-soft);border-radius:11px;background:var(--surface-inset);color:inherit;text-align:left;cursor:pointer}.fleet-row.selected{border-color:var(--accent-border);background:var(--accent-soft)}.fleet-row-main,.fleet-row-signals,.fleet-row-facts{min-width:0}.fleet-row-title{overflow-wrap:anywhere;font-size:.76rem;font-weight:700}.fleet-row-meta,.fleet-row-facts{overflow-wrap:anywhere}.fleet-row-signals{display:flex;flex-wrap:wrap;gap:5px}.retention-note{margin:9px 0 0}.communication-grid{display:grid;grid-template-columns:1fr;gap:9px;margin-top:10px}.communication-agents,.communication-conversations{min-width:0;display:grid;gap:9px}.communication-section{min-width:0;padding:10px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface-inset);box-shadow:none}.communication-section h3{margin-bottom:8px;font-size:.76rem}.stack-form{display:grid;gap:7px;margin-bottom:9px}.stack-form>label,.compact-field-grid>label{display:grid;gap:3px;color:var(--muted);font-size:.68rem}.stack-form input,.stack-form textarea{width:100%;min-width:0;padding:8px 9px;border:1px solid var(--border);border-radius:10px;resize:vertical;background:var(--input);color:var(--text)}.stack-form>label.inline-choice{display:flex;grid-template-columns:none;flex-direction:row;align-items:center;gap:7px}.stack-form>label.inline-choice input{width:auto}.compact-field-grid{display:grid;grid-template-columns:1fr;gap:7px}.form-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:7px}.form-actions .muted{margin-right:auto}.communication-list{max-height:260px}.communication-row{appearance:none;width:100%;min-width:0;padding:9px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface);color:var(--text);text-align:left;cursor:pointer}.communication-row.selected{border-color:var(--accent);box-shadow:inset 2px 0 0 var(--accent)}.communication-row-head,.conversation-message-head{display:flex;justify-content:space-between;gap:7px;align-items:baseline}.communication-row-title,.conversation-message-author{overflow-wrap:anywhere;font-size:.74rem;font-weight:680}.communication-row-meta,.communication-id,.conversation-message-meta,.conversation-message-deliveries{display:block;color:var(--muted);font-size:.66rem;overflow-wrap:anywhere}.communication-id{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;user-select:all}.communication-description{margin:8px 0;white-space:pre-wrap;overflow-wrap:anywhere}.card-edit-form{border-top:1px solid var(--border);padding-top:9px;margin-top:9px}.communication-participants{margin:8px 0}.conversation-list{max-height:220px}.conversation-transcript{min-height:120px;max-height:430px;display:grid;gap:7px;overflow:auto;margin:9px 0}.conversation-message{min-width:0;padding:9px;border:1px solid var(--border-soft);border-left:3px solid var(--accent);border-radius:10px;background:var(--surface)}.conversation-message.agent-authored{border-left-color:var(--pass)}.conversation-message-body,.inbox-message-preview{margin-top:5px;white-space:pre-wrap;overflow-wrap:anywhere}.inbox-message-preview{max-height:6rem;overflow:auto}.inbox-delivery{cursor:default}.conversation-composer{margin:9px 0 0;padding-top:9px;border-top:1px solid var(--border-soft)}.section-head{justify-content:space-between}@media (min-width:1280px){.runtime-shell.context-docked{--content-width:760px;grid-template-columns:var(--sidebar-width) minmax(0,1fr) var(--context-rail-width)}.runtime-shell.context-docked .runtime-inspector{position:relative;z-index:10;top:auto;right:auto;grid-column:3;grid-row:1;min-width:0;height:100dvh;overflow:hidden;border-left:1px solid var(--border-soft);background:var(--sidebar)}.runtime-shell.context-docked .context-trigger,.runtime-shell.context-docked .inspector-backdrop{display:none !important}.runtime-shell.context-docked .topbar-controls{padding-right:0}.runtime-shell.context-docked .inspector-popover{position:relative;top:auto;right:auto;width:100%;max-width:none;height:100dvh;border:0;border-radius:0;background:transparent;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;animation:none}.runtime-shell.context-docked .inspector-header{min-height:var(--header-height);padding:0 18px}}@media (max-width:1180px){.workspace-heading strong{max-width:min(620px,44vw)}.runtime-has-session .session-state-chips{display:flex}.operations-layout{grid-template-columns:1fr}.operations-agents{grid-column:1}}@media (hover:hover) and (pointer:fine){.message-actions{opacity:0}}@media (max-width:900px){:root{--header-height:calc(58px + env(safe-area-inset-top));--content-gutter:clamp(16px,3vw,24px)}.runtime-shell{grid-template-columns:minmax(0,1fr);gap:0;padding:0}.workspace-sidebar{position:fixed;z-index:60;inset:0 auto 0 0;width:min(88vw,360px);height:100dvh;visibility:hidden;border-width:0 1px 0 0;border-radius:0;background:var(--sidebar-drawer);box-shadow:20px 0 54px rgba(6,11,20,.28);transform:translateX(-102%);transition:transform 240ms var(--ease-drawer),visibility 240ms}.mobile-nav-backdrop{z-index:59}.runtime-shell.mobile-nav-open .workspace-sidebar{visibility:visible;transform:translateX(0)}.runtime-shell.mobile-nav-open .mobile-nav-backdrop{visibility:visible;opacity:1;pointer-events:auto}.mobile-nav-control{display:grid}.mobile-nav-toggle{margin-left:-5px}.sidebar-brand{padding-top:env(safe-area-inset-top)}.workspace-main{width:100%;height:100dvh;border:0;border-radius:0;box-shadow:none}.workspace-topbar{padding:env(safe-area-inset-top) max(12px,env(safe-area-inset-right)) 0 max(12px,env(safe-area-inset-left))}.workspace-heading strong{max-width:min(600px,58vw)}.topbar-controls{flex:0 0 auto;padding-right:46px}#runtime-refresh-status{display:none}.sidebar-scroll{padding-bottom:max(18px,env(safe-area-inset-bottom));overscroll-behavior:contain}.sidebar-footer{padding-bottom:env(safe-area-inset-bottom)}.runtime-inspector{z-index:50}.context-trigger{z-index:53;top:calc(9px + env(safe-area-inset-top));right:max(9px,env(safe-area-inset-right));width:40px;height:40px;border-radius:12px}.inspector-backdrop{z-index:49;background:var(--overlay)}.inspector-close{width:36px;height:36px}.inspector-close svg{width:18px;height:18px}.inspector-popover{z-index:51;top:var(--header-height);right:0;width:100vw;height:calc(100dvh - var(--header-height));border-right:0;border-bottom:0;border-left:0;border-radius:16px 16px 0 0;transform-origin:bottom center;animation-name:inspector-sheet-enter}.inspector-scroll{padding-bottom:env(safe-area-inset-bottom)}.operations-scroll{padding:24px max(18px,env(safe-area-inset-right)) max(48px,env(safe-area-inset-bottom)) max(18px,env(safe-area-inset-left))}.operations-agents .communication-grid{grid-template-columns:1fr}@keyframes inspector-sheet-enter{from{opacity:0;transform:translateY(14px)}}}@media (max-width:600px){:root{--header-height:calc(56px + env(safe-area-inset-top))}.auth-topbar{width:calc(100% - 28px);padding-top:max(24px,5vh)}.auth-topbar{gap:10px}.brand-lockup{align-items:flex-start}.brand-lockup h1{font-size:1.08rem}.brand-lockup p{font-size:.75rem;line-height:1.4}.gate{width:calc(100% - 28px);margin-top:20px;padding:21px;border-radius:20px}.gate h2{font-size:1.05rem}.gate>form>.muted{margin-bottom:16px;font-size:.79rem}.field-row{align-items:stretch;flex-direction:column}.field-row input,.field-row .btn{width:100%;min-height:44px}.workspace-sidebar{width:min(94vw,360px);grid-template-rows:var(--header-height) auto minmax(0,1fr) 58px}.sidebar-brand{padding:0 14px 0 16px}.sidebar-primary-row{padding:0 16px}.sidebar-scroll{padding-top:18px}.workspace-topbar{gap:6px;padding:env(safe-area-inset-top) max(8px,env(safe-area-inset-right)) 0 max(8px,env(safe-area-inset-left))}.workspace-heading{gap:7px}.workspace-heading>svg{display:none}.workspace-breadcrumb{display:none}.workspace-heading strong{max-width:none;font-size:.82rem}.topbar-controls{gap:3px;padding-right:43px}.session-state-chips{display:none !important}.topbar-more>summary{display:grid;width:40px;height:40px;place-items:center}.topbar-more:not([open])>.topbar-more-popover{display:none}.topbar-more-popover{position:absolute;z-index:95;top:calc(100% + 8px);right:0;width:210px;display:grid;gap:3px;padding:8px;border:1px solid var(--border);border-radius:14px;background:var(--surface);box-shadow:var(--shadow-raised);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);animation:theme-menu-enter 160ms var(--ease-out)}.topbar-more-popover>.icon-btn,.topbar-more-popover>.lock-button,.topbar-more-popover>.theme-menu>.theme-trigger{width:100%;height:40px;min-height:40px;display:grid;grid-template-columns:22px minmax(0,1fr);gap:9px;place-items:center start;border:0;padding:0 10px;background:transparent}.topbar-more-popover>.language-toggle{grid-template-columns:22px minmax(0,1fr)}.topbar-more-popover>.language-toggle>span:first-child{min-width:0;justify-self:center}.topbar-more-popover .topbar-action-label,.topbar-more-popover .lock-button span{display:block;color:var(--muted-strong);font-size:.78rem;font-weight:550}.topbar-more-popover .lock-button svg{display:block;width:17px;height:17px}.topbar-more-popover>.theme-menu{width:100%}.topbar-more-popover>.theme-menu .theme-popover{position:static;width:100%;margin-top:3px;border-color:var(--border-soft);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}.banner{top:calc(var(--header-height) + 7px);right:12px;left:12px;font-size:.72rem}.chat-section-head{min-height:28px;padding-top:6px}.chat-section-head,.collaboration-board,.chat-empty,.unavailable-note,.collaboration-composer{width:calc(100% - 24px)}.unavailable-note{margin-top:8px;padding:7px 9px;font-size:.68rem;line-height:1.4}.collaboration-board{gap:0;padding:26px 0 30px}.chat-empty{padding:0 14px 8vh}.chat-empty strong{font-size:.95rem}.chat-empty p{max-width:330px;font-size:.72rem}.message-card + .message-card{margin-top:21px}.message-card.message-incoming + .message-card.message-incoming{margin-top:13px}.message-card.message-neutral + .message-card.message-neutral{margin-top:13px}.message-card.message-outgoing + .message-card.message-outgoing{margin-top:10px}.message-card + .message-card.message-thread{margin-top:9px}.message-card.message-incoming,.message-card.message-neutral,.message-card.message-outgoing{max-width:90%}.message-card.message-incoming .message-bubble,.message-card.message-neutral .message-bubble,.message-card.message-outgoing .message-bubble{padding:10px 14px}.message-footer{gap:3px 8px;margin-top:6px}.message-body{font-size:.9rem}.collaboration-composer{margin:7px auto max(10px,env(safe-area-inset-bottom));padding:7px 8px;border-radius:22px}.collaboration-composer textarea{min-height:44px;padding:10px 8px 7px;font-size:.85rem}.composer-toolbar{gap:6px;align-items:center}.composer-fields{gap:3px}.composer-tools-trigger{padding-right:9px}.composer-options-popover{width:min(340px,calc(100vw - 32px))}.composer-control{padding:8px}.composer-check{font-size:.64rem}.composer-actions{gap:5px}.composer-actions>span{max-width:140px;font-size:.7rem;text-align:right}.send-btn{width:38px;height:38px}.conversation-empty{width:calc(100% - 32px)}.conversation-empty{padding-top:clamp(72px,18vh,150px)}.conversation-empty p{margin-bottom:0;font-size:.76rem}.empty-orbit{width:44px;height:44px}.inspector-header{height:58px;padding:0 16px}.inspector-card{padding:15px 16px}.communication-section{padding:10px}.compact-field-grid{grid-template-columns:1fr}.operations-heading{align-items:flex-start;flex-direction:column;margin-bottom:17px}.operations-live{align-self:flex-start}.operations-card{padding:15px;border-radius:14px}.operations-card-head{gap:10px}.operations-metrics{grid-template-columns:1fr}}@media (max-width:380px){.workspace-sidebar{width:100vw;border-radius:0}.sidebar-runtime-status span{display:none}.workspace-heading strong{font-size:.78rem}.topbar-controls{padding-right:41px}.topbar-controls .language-toggle{width:36px;min-width:36px}.collaboration-composer{width:calc(100% - 16px)}.unavailable-note,.chat-section-head,.collaboration-board,.chat-empty{width:calc(100% - 20px)}.composer-actions>span{max-width:72px}.message-card.message-incoming,.message-card.message-neutral,.message-card.message-outgoing{max-width:94%}.message-thread{margin-left:16px}}.context-trigger{display:flex;justify-content:center;gap:6px;width:88px;font-size:.74rem}.topbar-controls{padding-right:96px}@media (max-width:760px){.context-trigger{width:76px;gap:4px;font-size:.7rem}.topbar-controls{padding-right:82px}}@media (max-height:620px){.auth-topbar{padding-top:18px}.gate{margin-top:14px;padding-top:18px;padding-bottom:18px}.gate-icon{width:36px;height:36px;margin-bottom:12px}.chat-section-head{min-height:22px;padding-top:2px}.collaboration-composer textarea{min-height:40px}.chat-empty{padding-bottom:3vh}}@media (pointer:coarse){.project-row,.session-card,.recent-session-row{min-height:44px}.context-trigger,.icon-btn,.send-btn,.mobile-nav-control,.inspector-close{min-width:44px;min-height:44px}.runner-filter select,.sidebar-search input,.sidebar-view-item,.operations-nav-item{min-height:44px}.message-action{width:44px;height:44px}.recent-panel-summary{min-height:44px;align-items:center}.message-actions{opacity:1}}@media (prefers-reduced-transparency:reduce){.workspace-topbar,.collaboration-composer,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid);backdrop-filter:none;-webkit-backdrop-filter:none}}@media (prefers-contrast:more){:root{--border:color-mix(in srgb,var(--text) 34%,transparent);--border-soft:color-mix(in srgb,var(--text) 20%,transparent)}.workspace-topbar,.collaboration-composer,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid)}}@supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){.workspace-sidebar,.workspace-main,.gate,.composer-options-popover,.inspector-popover,.theme-popover{background:var(--surface-solid)}.collaboration-composer{background:var(--surface-solid)}}@media (forced-colors:active){body{background:Canvas}.workspace-sidebar,.workspace-main,.gate,.composer-options-popover,.inspector-popover,.theme-popover,.collaboration-composer{background:Canvas;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}.project-row.selected,.session-card.selected,.theme-option[aria-pressed="true"]{outline:2px solid Highlight;outline-offset:-2px}}@media (prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto !important;animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}}.workspace-group>summary{list-style:none;grid-template-columns:28px minmax(0,1fr) 14px}.workspace-group>summary::-webkit-details-marker{display:none}.workspace-group>summary::after{content:"›";align-self:center}.workspace-group[open]>summary::after{transform:rotate(90deg)}.runtime-search-field{display:grid;gap:5px;margin:8px 0;font-size:.75rem;color:var(--muted-strong)}.runtime-search-field input{width:100%;min-width:0}.collaboration-explanation{line-height:1.6}.message-resolution-body{margin-top:8px;padding:10px;border-left:3px solid var(--accent);background:var(--surface-inset);overflow-wrap:anywhere}.overview-card p{font-size:.84rem;line-height:1.6;white-space:pre-wrap}.reported-card{opacity:1}.chat-scroll>.runtime-search-field,.chat-scroll>.collaboration-explanation,.chat-scroll>#runtime-message-search-status{display:block;margin:12px var(--content-gutter)}.chat-scroll>.runtime-search-field input{margin-top:6px} diff --git a/frontend/dist/runtime.html b/frontend/dist/runtime.html index c6bd3216..044d8645 100644 --- a/frontend/dist/runtime.html +++ b/frontend/dist/runtime.html @@ -132,6 +132,8 @@

Projects

Sessions

0 + + @@ -252,6 +254,9 @@

Select a Session

+

This board shows retained Session messages. ACK is not a reply or completion. Host chat replies appear here only when explicitly posted to this Session.

+ +
+

Latest Agent message

Work

Attention

diff --git a/frontend/dist/runtime.js b/frontend/dist/runtime.js index 528e46de..033f8b05 100644 --- a/frontend/dist/runtime.js +++ b/frontend/dist/runtime.js @@ -808,7 +808,7 @@ const DRAFT_STORAGE_PREFIX = "webcodex.runtime.draft.v1."; const DEVICE_DISCLOSURE_STORAGE_PREFIX = "webcodex.runtime.runner-open.v1."; const APPEARANCE_MEDIA_QUERY = "(prefers-color-scheme: light)"; const MOBILE_NAVIGATION_MEDIA = "(max-width: 900px)"; -const WIDE_CONTEXT_MEDIA = "(min-width: 1600px)"; +const WIDE_CONTEXT_MEDIA = "(min-width: 1280px)"; let contextUserIntent = null; const RUNTIME_ZH_TEXT = { "WebCodex — Runtime Console": "WebCodex — 运行控制台", @@ -861,6 +861,12 @@ const RUNTIME_ZH_TEXT = { "connected": "已连接", "Projects": "项目", "Runner": "运行器", + "Latest Agent message": "最近的 Agent 留言", + "Search loaded Sessions": "搜索已加载会话", + "Title, id, or lifecycle": "标题、ID 或生命周期", + "Search retained messages": "搜索已保留消息", + "Message, resolution, or id": "消息内容、处理说明或 ID", + "This board shows retained Session messages. ACK is not a reply or completion. Host chat replies appear here only when explicitly posted to this Session.": "这里展示会话中保留的协作消息。ACK 不代表回复或完成;宿主聊天中的回复只有明确发布到此会话后才会显示。", "All Runners": "全部运行器", "Filter by Project name, id, Runner, or workspace path": "按项目名称、ID、运行器或工作空间路径筛选", "No project selected": "尚未选择项目", @@ -1203,6 +1209,7 @@ let projectRowsTruncated = false; let knownProjectDevices = []; let selectedProjectSnapshot = null; let sessionRows = []; +let sessionListMetaSnapshot = { total: 0, truncated: false }; const state = initialRuntimeConsoleState(); let renderedProjectSelectorsSignature = ""; let renderedRunnerFleetSignature = ""; @@ -1294,7 +1301,7 @@ function renderLanguageSensitiveUi() { renderRunnerFleet(runnerRows); renderRecentSessions(recentSessionRows, recentSessionMetaSnapshot); if (state.selectedProject) - renderSessionList(sessionRows, { total: sessionRows.length, truncated: false }); + renderSessionList(sessionRows, sessionListMetaSnapshot); const snapshot = state.workflow?.snapshot; if (snapshot) renderDetail(snapshot, false); @@ -1996,6 +2003,10 @@ async function api(path, payload, signal) { } } function hideDetail() { + const messageSearch = el("runtime-message-search"); + if (messageSearch) + messageSearch.value = ""; + setText("runtime-message-search-status", ""); document.body.classList.remove("runtime-has-session"); renderWorkspaceHeading(); show("runtime-session-detail", false); @@ -2014,6 +2025,10 @@ function hideDetail() { function clearSessionSurface() { saveCurrentDraft(); sessionRows = []; + sessionListMetaSnapshot = { total: 0, truncated: false }; + const sessionSearch = el("runtime-session-search"); + if (sessionSearch) + sessionSearch.value = ""; renderedSessionListSignature = ""; renderedCollaborationSignature = ""; clearNode(el("runtime-session-list")); @@ -2067,6 +2082,10 @@ function lock(message = "", clearRemembered = true) { clearNode(el("runtime-recent-session-list")); clearNode(el("runtime-runner-list")); document.body.classList.remove("runtime-connected"); + const messageSearch = el("runtime-message-search"); + if (messageSearch) + messageSearch.value = ""; + setText("runtime-message-search-status", ""); document.body.classList.remove("runtime-has-session"); show("runtime-token-gate", true); show("runtime-console", false); @@ -2355,7 +2374,11 @@ function renderSessionWorkspaceIdentity() { } } function revealWorkflowSessionDetail() { - el("runtime-workflow-sessions-panel")?.scrollIntoView({ block: "start", inline: "nearest" }); + const panel = el("runtime-workflow-sessions-panel"); + const workspace = panel?.closest("details.workspace-group"); + if (workspace) + workspace.open = true; + panel?.scrollIntoView({ block: "start", inline: "nearest" }); } function renderProjectSelectors(projects, truncated) { const deviceSelect = el("runtime-device-select"); @@ -2449,8 +2472,23 @@ function renderProjectSelectors(projects, truncated) { deviceProjectList.appendChild(empty); } for (const project of deviceProjects) { - const row = document.createElement("button"); - row.type = "button"; + const workspace = document.createElement("details"); + workspace.className = "workspace-group"; + const disclosureKey = "webcodex.runtime.workspace-disclosure.v1." + encodeURIComponent(JSON.stringify([clientId, project.id])); + workspace.open = project.id === state.selectedProject; + try { + workspace.open = workspace.open && window.localStorage.getItem(disclosureKey) !== "closed"; + } + catch { } + workspace.addEventListener("toggle", () => { + if (!workspace.isConnected || project.id !== state.selectedProject) + return; + try { + window.localStorage.setItem(disclosureKey, workspace.open ? "open" : "closed"); + } + catch { } + }); + const row = document.createElement("summary"); row.className = "project-row" + (project.id === state.selectedProject ? " selected" : ""); if (project.id === state.selectedProject) row.setAttribute("aria-current", "true"); @@ -2515,11 +2553,21 @@ function renderProjectSelectors(projects, truncated) { row.appendChild(projectIcon); row.appendChild(main); const select = () => switchProject(String(project.client_id || ""), String(project.id || "")); - row.addEventListener("click", select); - deviceProjectList.appendChild(row); + row.addEventListener("click", (event) => { + if (project.id === state.selectedProject) + return; + event.preventDefault(); + try { + window.localStorage.setItem(disclosureKey, "open"); + } + catch { } + select(); + }); + workspace.appendChild(row); + deviceProjectList.appendChild(workspace); if (project.id === state.selectedProject && sessionsPanel) { sessionsPanel.hidden = false; - deviceProjectList.appendChild(sessionsPanel); + workspace.appendChild(sessionsPanel); sessionsAttached = true; } } @@ -2803,7 +2851,11 @@ async function fetchSessions(request) { ? sessionRows.find((row) => String(row?.session_id || "") === selected) : null; sessionRows = Array.isArray(response.data.sessions) ? response.data.sessions : []; - renderSessionList(sessionRows, response.data); + sessionListMetaSnapshot = { + total: typeof response.data.total === "number" ? Math.max(sessionRows.length, response.data.total) : sessionRows.length, + truncated: !!response.data.truncated, + }; + renderSessionList(sessionRows, sessionListMetaSnapshot); showError(""); const nextSelected = selected ? sessionRows.find((row) => String(row?.session_id || "") === selected) @@ -2953,14 +3005,17 @@ function renderSessionList(sessions, payload) { return; const total = typeof payload.total === "number" ? payload.total : sessions.length; const selected = String(state.workflow.selectedSessionId || ""); - const signature = renderFingerprint([runtimeLanguage, selected, total, !!payload.truncated, sessions]); + const query = el("runtime-session-search")?.value || ""; + const visible = sessions.filter((session) => runtimeSearchMatches(query, [session.title, session.session_id, session.lifecycle])); + const signature = renderFingerprint([runtimeLanguage, selected, total, !!payload.truncated, sessions, query]); if (signature === renderedSessionListSignature) return; renderedSessionListSignature = signature; clearNode(node); - show("runtime-sessions-empty", sessions.length === 0); + show("runtime-sessions-empty", visible.length === 0); + setText("runtime-session-search-status", query ? visible.length + " / " + sessions.length : ""); setText("runtime-sessions-count", total ? sessions.length + (payload.truncated ? " of " + total : "") : "0"); - for (const session of sessions) { + for (const session of visible) { const id = String(session && session.session_id || ""); if (!id) continue; @@ -3009,7 +3064,7 @@ function selectSession(sessionId) { locallyAuthoredCollaborationMessageIds = new Set(); resetCollaborationComposerUi(); restoreCurrentDraft(); - renderSessionList(sessionRows, { total: sessionRows.length, truncated: false }); + renderSessionList(sessionRows, sessionListMetaSnapshot); revealWorkflowSessionDetail(); if (request) void fetchSessionDetail(request); @@ -3262,6 +3317,24 @@ function resetCollaborationComposerUi() { closeComposerOptions(false); syncCollaborationComposer(); } +function runtimeSearchMatches(query, values) { + const text = values.filter((value) => typeof value === "string").join(" ").toLocaleLowerCase(); + return query.trim().toLocaleLowerCase().split(/\s+/).every((term) => text.includes(term)); +} +function filterCollaborationMessages() { + const query = el("runtime-message-search")?.value || ""; + let matches = 0; + const cards = document.querySelectorAll("#runtime-collaboration-board .message-card"); + for (const card of Array.from(cards)) { + const message = state.collaboration.messages.find((entry) => entry.message_id === card.dataset.messageId); + const visible = runtimeSearchMatches(query, [message?.message, message?.resolution, message?.message_id, message?.author_session_id]); + card.hidden = !visible; + if (visible) + matches++; + } + document.querySelectorAll("#runtime-collaboration-board .message-date-separator").forEach((node) => { node.hidden = !!query.trim(); }); + setText("runtime-message-search-status", query.trim() ? matches + " / " + cards.length : ""); +} function renderCollaboration(statusText, consumeMutationNotice = true) { const mutationNotice = consumeMutationNotice ? takeRuntimeCollaborationMutationNotice(state) : ""; if (mutationNotice) { @@ -3328,6 +3401,23 @@ function renderCollaboration(statusText, consumeMutationNotice = true) { renderedCollaborationMessageIds = nextRenderedMessageIds; return; } + const latestAgent = el("runtime-latest-agent-message"); + if (latestAgent) { + const sides = runtimeCollaborationMessageSides(messages, locallyAuthoredCollaborationMessageIds); + const latest = [...messages].reverse().find((message) => sides.get(String(message.message_id)) === "incoming" && !message.superseded_by_message_id && message.closure_kind !== "withdrawn"); + clearNode(latestAgent); + if (latest) { + appendRichMessage(latestAgent, latest.message); + const time = document.createElement("p"); + time.className = "muted small"; + time.textContent = updatedLabel(latest.created_at); + latestAgent.appendChild(time); + } + else + latestAgent.textContent = runtimeLanguage === "zh-CN" + ? "当前保留范围内暂无 Agent 留言。ACK 不包含回复正文;下方可查看模型报告的进度。" + : "No Agent message in the retained window. ACK contains no reply text; model-reported progress appears below."; + } renderedCollaborationSignature = signature; clearNode(node); if (!available) { @@ -3359,6 +3449,7 @@ function renderCollaboration(statusText, consumeMutationNotice = true) { return; visited.add(id); const card = document.createElement("article"); + card.dataset.messageId = id; card.className = "message-card " + String(message?.kind || "note") + (String(message?.status || "") === "resolved" ? " resolved" : "") + (parentUnavailable ? " retained-reply" : ""); const messageSide = messageSides.get(id) || "neutral"; card.classList.add(messageSide === "incoming" ? "agent-authored" : messageSide === "outgoing" ? "human-authored" : "provenance-unknown"); @@ -3466,7 +3557,7 @@ function renderCollaboration(statusText, consumeMutationNotice = true) { const acknowledged = typeof message?.first_ack_observed_at === "number"; ack.classList.toggle("observed", acknowledged); ack.textContent = acknowledged - ? tr("Acknowledged") + " · " + updatedLabel(message.first_ack_observed_at) + ? (runtimeLanguage === "zh-CN" ? "已观察到 ACK(不代表回复或完成)" : "ACK observed (not a reply or completion)") + " · " + updatedLabel(message.first_ack_observed_at) : tr("Acknowledgement required"); ack.title = acknowledged ? "ACK required · First ACK observed " + updatedLabel(message.first_ack_observed_at) @@ -3495,6 +3586,15 @@ function renderCollaboration(statusText, consumeMutationNotice = true) { resolution.textContent = resolutionLabel + (message.resolved_at ? " · " + updatedLabel(message.resolved_at) : ""); resolution.title = parts.join(" · "); footer.appendChild(resolution); + if (message.resolution) { + const explanation = document.createElement("section"); + explanation.className = "message-resolution-body"; + const label = document.createElement("strong"); + label.textContent = runtimeLanguage === "zh-CN" ? "处理说明" : "Resolution"; + explanation.appendChild(label); + appendRichMessage(explanation, message.resolution); + content.appendChild(explanation); + } } const actions = document.createElement("div"); actions.className = "message-actions"; @@ -3520,6 +3620,7 @@ function renderCollaboration(statusText, consumeMutationNotice = true) { for (const message of messages) appendMessage(message, 0, false); renderedCollaborationMessageIds = nextRenderedMessageIds; + filterCollaborationMessages(); if (hasNewMessages && !firstRetainedRender) announceNewCollaborationMessages(newMessageIds.length); if (firstRetainedRender || (hasNewMessages && shouldFollowNewMessages)) { @@ -4981,6 +5082,8 @@ el("runtime-device-select")?.addEventListener("change", () => { return; applyRunnerFilter(select.value); }); +el("runtime-session-search")?.addEventListener("input", () => renderSessionList(sessionRows, sessionListMetaSnapshot)); +el("runtime-message-search")?.addEventListener("input", filterCollaborationMessages); el("runtime-project-search")?.addEventListener("input", () => { const input = el("runtime-project-search"); projectSearch = input?.value || ""; diff --git a/frontend/src/runtime.css b/frontend/src/runtime.css index dd0ceecd..a3d79428 100644 --- a/frontend/src/runtime.css +++ b/frontend/src/runtime.css @@ -56,9 +56,9 @@ --layout-minor: 38.2%; --layout-tertiary: 23.6%; --sidebar-width: clamp(300px, 21vw, 356px); - --context-rail-width: clamp(320px, 18vw, 360px); + --context-rail-width: clamp(360px, 30vw, 560px); --header-height: 68px; - --content-width: 1120px; + --content-width: 760px; --content-gutter: clamp(20px, 3vw, 56px); --ease-out: cubic-bezier(.23, 1, .32, 1); --ease-drawer: cubic-bezier(.32, .72, 0, 1); @@ -694,9 +694,9 @@ body:not(.runtime-has-session) .topbar-controls { padding-right: 0; } .section-head { justify-content: space-between; } /* Wide displays spend the right-side remainder on live context instead of dead canvas. */ -@media (min-width: 1600px) { +@media (min-width: 1280px) { .runtime-shell.context-docked { - --content-width: 1160px; + --content-width: 760px; grid-template-columns: var(--sidebar-width) minmax(0, 1fr) var(--context-rail-width); } .runtime-shell.context-docked .runtime-inspector { @@ -949,3 +949,17 @@ body:not(.runtime-has-session) .topbar-controls { padding-right: 0; } transition-duration: .01ms !important; } } + +.workspace-group > summary { list-style: none; grid-template-columns: 28px minmax(0, 1fr) 14px; } +.workspace-group > summary::-webkit-details-marker { display: none; } +.workspace-group > summary::after { content: "›"; align-self: center; } +.workspace-group[open] > summary::after { transform: rotate(90deg); } +.runtime-search-field { display: grid; gap: 5px; margin: 8px 0; font-size: .75rem; color: var(--muted-strong); } +.runtime-search-field input { width: 100%; min-width: 0; } +.collaboration-explanation { line-height: 1.6; } +.message-resolution-body { margin-top: 8px; padding: 10px; border-left: 3px solid var(--accent); background: var(--surface-inset); overflow-wrap: anywhere; } +.overview-card p { font-size: .84rem; line-height: 1.6; white-space: pre-wrap; } +.reported-card { opacity: 1; } + +.chat-scroll > .runtime-search-field, .chat-scroll > .collaboration-explanation, .chat-scroll > #runtime-message-search-status { display: block; margin: 12px var(--content-gutter); } +.chat-scroll > .runtime-search-field input { margin-top: 6px; } diff --git a/frontend/src/runtime.html b/frontend/src/runtime.html index c6bd3216..044d8645 100644 --- a/frontend/src/runtime.html +++ b/frontend/src/runtime.html @@ -132,6 +132,8 @@

Projects

Sessions

0
+ +
@@ -252,6 +254,9 @@

Select a Session

+

This board shows retained Session messages. ACK is not a reply or completion. Host chat replies appear here only when explicitly posted to this Session.

+ +
+

Latest Agent message

Work

Attention

diff --git a/frontend/src/runtime.ts b/frontend/src/runtime.ts index 462af980..01faaf26 100644 --- a/frontend/src/runtime.ts +++ b/frontend/src/runtime.ts @@ -68,7 +68,7 @@ const DRAFT_STORAGE_PREFIX = "webcodex.runtime.draft.v1."; const DEVICE_DISCLOSURE_STORAGE_PREFIX = "webcodex.runtime.runner-open.v1."; const APPEARANCE_MEDIA_QUERY = "(prefers-color-scheme: light)"; const MOBILE_NAVIGATION_MEDIA = "(max-width: 900px)"; -const WIDE_CONTEXT_MEDIA = "(min-width: 1600px)"; +const WIDE_CONTEXT_MEDIA = "(min-width: 1280px)"; let contextUserIntent: boolean | null = null; @@ -127,6 +127,12 @@ const RUNTIME_ZH_TEXT: Record = { "connected": "已连接", "Projects": "项目", "Runner": "运行器", + "Latest Agent message": "最近的 Agent 留言", + "Search loaded Sessions": "搜索已加载会话", + "Title, id, or lifecycle": "标题、ID 或生命周期", + "Search retained messages": "搜索已保留消息", + "Message, resolution, or id": "消息内容、处理说明或 ID", + "This board shows retained Session messages. ACK is not a reply or completion. Host chat replies appear here only when explicitly posted to this Session.": "这里展示会话中保留的协作消息。ACK 不代表回复或完成;宿主聊天中的回复只有明确发布到此会话后才会显示。", "All Runners": "全部运行器", "Filter by Project name, id, Runner, or workspace path": "按项目名称、ID、运行器或工作空间路径筛选", "No project selected": "尚未选择项目", @@ -475,6 +481,7 @@ let projectRowsTruncated = false; let knownProjectDevices: string[] = []; let selectedProjectSnapshot: any | null = null; let sessionRows: any[] = []; +let sessionListMetaSnapshot = { total: 0, truncated: false }; const state = initialRuntimeConsoleState(); let renderedProjectSelectorsSignature = ""; let renderedRunnerFleetSignature = ""; @@ -578,7 +585,7 @@ function renderLanguageSensitiveUi(): void { } renderRunnerFleet(runnerRows); renderRecentSessions(recentSessionRows, recentSessionMetaSnapshot); - if (state.selectedProject) renderSessionList(sessionRows, { total: sessionRows.length, truncated: false }); + if (state.selectedProject) renderSessionList(sessionRows, sessionListMetaSnapshot); const snapshot = state.workflow?.snapshot; if (snapshot) renderDetail(snapshot, false); else if (!state.workflow?.selectedSessionId) hideDetail(); @@ -1245,6 +1252,9 @@ async function api(path: string, payload: any, signal?: AbortSignal): Promise { + if (!workspace.isConnected || project.id !== state.selectedProject) return; + try { window.localStorage.setItem(disclosureKey, workspace.open ? "open" : "closed"); } catch {} + }); + const row = document.createElement("summary"); row.className = "project-row" + (project.id === state.selectedProject ? " selected" : ""); if (project.id === state.selectedProject) row.setAttribute("aria-current", "true"); const projectName = String(project.name || project.id || ""); @@ -1744,11 +1771,17 @@ function renderProjectSelectors(projects: any[], truncated: boolean): void { if (metaParts.length) main.appendChild(meta); row.appendChild(projectIcon); row.appendChild(main); const select = (): void => switchProject(String(project.client_id || ""), String(project.id || "")); - row.addEventListener("click", select); - deviceProjectList.appendChild(row); + row.addEventListener("click", (event) => { + if (project.id === state.selectedProject) return; + event.preventDefault(); + try { window.localStorage.setItem(disclosureKey, "open"); } catch {} + select(); + }); + workspace.appendChild(row); + deviceProjectList.appendChild(workspace); if (project.id === state.selectedProject && sessionsPanel) { sessionsPanel.hidden = false; - deviceProjectList.appendChild(sessionsPanel); + workspace.appendChild(sessionsPanel); sessionsAttached = true; } } @@ -1989,7 +2022,11 @@ async function fetchSessions(request: any): Promise { ? sessionRows.find((row) => String(row?.session_id || "") === selected) : null; sessionRows = Array.isArray(response.data.sessions) ? response.data.sessions : []; - renderSessionList(sessionRows, response.data); + sessionListMetaSnapshot = { + total: typeof response.data.total === "number" ? Math.max(sessionRows.length, response.data.total) : sessionRows.length, + truncated: !!response.data.truncated, + }; + renderSessionList(sessionRows, sessionListMetaSnapshot); showError(""); const nextSelected = selected ? sessionRows.find((row) => String(row?.session_id || "") === selected) @@ -2118,12 +2155,15 @@ function renderSessionList(sessions: any[], payload: any): void { if (!node) return; const total = typeof payload.total === "number" ? payload.total : sessions.length; const selected = String(state.workflow.selectedSessionId || ""); - const signature = renderFingerprint([runtimeLanguage, selected, total, !!payload.truncated, sessions]); + const query = (el("runtime-session-search") as HTMLInputElement | null)?.value || ""; + const visible = sessions.filter((session) => runtimeSearchMatches(query, [session.title, session.session_id, session.lifecycle])); + const signature = renderFingerprint([runtimeLanguage, selected, total, !!payload.truncated, sessions, query]); if (signature === renderedSessionListSignature) return; renderedSessionListSignature = signature; - clearNode(node); show("runtime-sessions-empty", sessions.length === 0); + clearNode(node); show("runtime-sessions-empty", visible.length === 0); + setText("runtime-session-search-status", query ? visible.length + " / " + sessions.length : ""); setText("runtime-sessions-count", total ? sessions.length + (payload.truncated ? " of " + total : "") : "0"); - for (const session of sessions) { + for (const session of visible) { const id = String(session && session.session_id || ""); if (!id) continue; const wrapper = document.createElement("li"); @@ -2158,7 +2198,7 @@ function selectSession(sessionId: string): void { locallyAuthoredCollaborationMessageIds = new Set(); resetCollaborationComposerUi(); restoreCurrentDraft(); - renderSessionList(sessionRows, { total: sessionRows.length, truncated: false }); + renderSessionList(sessionRows, sessionListMetaSnapshot); revealWorkflowSessionDetail(); if (request) void fetchSessionDetail(request); const collaborationRequest = runtimeCollaborationRequest(state); @@ -2364,6 +2404,25 @@ function resetCollaborationComposerUi(): void { syncCollaborationComposer(); } +function runtimeSearchMatches(query: string, values: unknown[]): boolean { + const text = values.filter((value) => typeof value === "string").join(" ").toLocaleLowerCase(); + return query.trim().toLocaleLowerCase().split(/\s+/).every((term) => text.includes(term)); +} + +function filterCollaborationMessages(): void { + const query = (el("runtime-message-search") as HTMLInputElement | null)?.value || ""; + let matches = 0; + const cards = document.querySelectorAll("#runtime-collaboration-board .message-card"); + for (const card of Array.from(cards)) { + const message = state.collaboration.messages.find((entry: any) => entry.message_id === card.dataset.messageId); + const visible = runtimeSearchMatches(query, [message?.message, message?.resolution, message?.message_id, message?.author_session_id]); + card.hidden = !visible; + if (visible) matches++; + } + document.querySelectorAll("#runtime-collaboration-board .message-date-separator").forEach((node) => { node.hidden = !!query.trim(); }); + setText("runtime-message-search-status", query.trim() ? matches + " / " + cards.length : ""); +} + function renderCollaboration(statusText?: string, consumeMutationNotice = true): void { const mutationNotice = consumeMutationNotice ? takeRuntimeCollaborationMutationNotice(state) : ""; if (mutationNotice) { @@ -2432,6 +2491,19 @@ function renderCollaboration(statusText?: string, consumeMutationNotice = true): renderedCollaborationMessageIds = nextRenderedMessageIds; return; } + const latestAgent = el("runtime-latest-agent-message"); + if (latestAgent) { + const sides = runtimeCollaborationMessageSides(messages, locallyAuthoredCollaborationMessageIds); + const latest = [...messages].reverse().find((message: any) => sides.get(String(message.message_id)) === "incoming" && !message.superseded_by_message_id && message.closure_kind !== "withdrawn"); + clearNode(latestAgent); + if (latest) { + appendRichMessage(latestAgent, latest.message); + const time = document.createElement("p"); time.className = "muted small"; time.textContent = updatedLabel(latest.created_at); + latestAgent.appendChild(time); + } else latestAgent.textContent = runtimeLanguage === "zh-CN" + ? "当前保留范围内暂无 Agent 留言。ACK 不包含回复正文;下方可查看模型报告的进度。" + : "No Agent message in the retained window. ACK contains no reply text; model-reported progress appears below."; + } renderedCollaborationSignature = signature; clearNode(node); if (!available) { @@ -2456,6 +2528,7 @@ function renderCollaboration(statusText?: string, consumeMutationNotice = true): const appendMessage = (message: any, depth: number, parentUnavailable: boolean): void => { const id = String(message?.message_id || ""); if (!id || visited.has(id)) return; visited.add(id); const card = document.createElement("article"); + card.dataset.messageId = id; card.className = "message-card " + String(message?.kind || "note") + (String(message?.status || "") === "resolved" ? " resolved" : "") + (parentUnavailable ? " retained-reply" : ""); const messageSide = messageSides.get(id) || "neutral"; card.classList.add(messageSide === "incoming" ? "agent-authored" : messageSide === "outgoing" ? "human-authored" : "provenance-unknown"); @@ -2532,7 +2605,7 @@ function renderCollaboration(statusText?: string, consumeMutationNotice = true): const acknowledged = typeof message?.first_ack_observed_at === "number"; ack.classList.toggle("observed", acknowledged); ack.textContent = acknowledged - ? tr("Acknowledged") + " · " + updatedLabel(message.first_ack_observed_at) + ? (runtimeLanguage === "zh-CN" ? "已观察到 ACK(不代表回复或完成)" : "ACK observed (not a reply or completion)") + " · " + updatedLabel(message.first_ack_observed_at) : tr("Acknowledgement required"); ack.title = acknowledged ? "ACK required · First ACK observed " + updatedLabel(message.first_ack_observed_at) @@ -2554,6 +2627,13 @@ function renderCollaboration(statusText?: string, consumeMutationNotice = true): : tr("Resolved"); resolution.textContent = resolutionLabel + (message.resolved_at ? " · " + updatedLabel(message.resolved_at) : ""); resolution.title = parts.join(" · "); footer.appendChild(resolution); + if (message.resolution) { + const explanation = document.createElement("section"); explanation.className = "message-resolution-body"; + const label = document.createElement("strong"); label.textContent = runtimeLanguage === "zh-CN" ? "处理说明" : "Resolution"; + explanation.appendChild(label); + appendRichMessage(explanation, message.resolution); + content.appendChild(explanation); + } } const actions = document.createElement("div"); actions.className = "message-actions"; actions.appendChild(createMessageAction(tr("Reply"), "reply", () => setCollaborationReplyTarget(id))); @@ -2575,6 +2655,7 @@ function renderCollaboration(statusText?: string, consumeMutationNotice = true): } for (const message of messages) appendMessage(message, 0, false); renderedCollaborationMessageIds = nextRenderedMessageIds; + filterCollaborationMessages(); if (hasNewMessages && !firstRetainedRender) announceNewCollaborationMessages(newMessageIds.length); if (firstRetainedRender || (hasNewMessages && shouldFollowNewMessages)) { scrollCollaborationToLatest(!firstRetainedRender); @@ -3889,6 +3970,8 @@ el("runtime-device-select")?.addEventListener("change", () => { const select = el("runtime-device-select") as HTMLSelectElement | null; if (!select) return; applyRunnerFilter(select.value); }); +el("runtime-session-search")?.addEventListener("input", () => renderSessionList(sessionRows, sessionListMetaSnapshot)); +el("runtime-message-search")?.addEventListener("input", filterCollaborationMessages); el("runtime-project-search")?.addEventListener("input", () => { const input = el("runtime-project-search") as HTMLInputElement | null; projectSearch = input?.value || ""; diff --git a/frontend/test/build.test.mjs b/frontend/test/build.test.mjs index 69e13032..1c3261fe 100644 --- a/frontend/test/build.test.mjs +++ b/frontend/test/build.test.mjs @@ -176,7 +176,7 @@ async function assertRequiredAssets(outputDirectory) { assert.match(styles, /workflow-session-summary-runtime/); const runtimeStyles = await readFile(resolve(outputDirectory, "runtime.css"), "utf8"); assert.match(runtimeStyles, /max-width:\s*900px/); - assert.match(runtimeStyles, /min-width:\s*1600px/); + assert.match(runtimeStyles, /min-width:\s*1280px/); assert.match(runtimeStyles, /safe-area-inset-bottom/); assert.match(runtimeStyles, /safe-area-inset-top/); assert.match(runtimeStyles, /prefers-reduced-motion/); @@ -191,9 +191,9 @@ async function assertRequiredAssets(outputDirectory) { assert.match(runtimeStyles, /--layout-major:61\.8%/); assert.match(runtimeStyles, /--layout-minor:38\.2%/); assert.match(runtimeStyles, /--sidebar-width:clamp\(300px,21vw,356px\)/); - assert.match(runtimeStyles, /--content-width:1120px/); - assert.match(runtimeStyles, /--context-rail-width:clamp\(320px,18vw,360px\)/); - assert.match(runtimeStyles, /runtime-shell\.context-docked\{--content-width:1160px;grid-template-columns:var\(--sidebar-width\) minmax\(0,1fr\) var\(--context-rail-width\)/); + assert.match(runtimeStyles, /--content-width:760px/); + assert.match(runtimeStyles, /--context-rail-width:clamp\(360px,30vw,560px\)/); + assert.match(runtimeStyles, /runtime-shell\.context-docked\{--content-width:760px;grid-template-columns:var\(--sidebar-width\) minmax\(0,1fr\) var\(--context-rail-width\)/); assert.match(runtimeStyles, /message-card\.message-incoming\{[^}]*width:fit-content[^}]*max-width:min\(82%,880px\)/); assert.match(runtimeStyles, /message-card\.message-outgoing\{[^}]*max-width:min\(68%,680px\)[^}]*align-self:flex-end/); assert.match(runtimeStyles, /--message-bubble-radius:22px/); diff --git a/frontend/test/runtime_console_state.test.mjs b/frontend/test/runtime_console_state.test.mjs index 041d10ab..94d2405f 100644 --- a/frontend/test/runtime_console_state.test.mjs +++ b/frontend/test/runtime_console_state.test.mjs @@ -575,9 +575,9 @@ test("runtime collaboration rendering uses textContent and explicitly reloads on assert.match(css, /\.fleet-row/); assert.match(css, /\.device-group/); assert.match(css, /@media \(max-width: 900px\)/); - assert.match(css, /@media \(min-width: 1600px\)/); - assert.match(css, /--context-rail-width:\s*clamp\(320px,\s*18vw,\s*360px\)/); - assert.match(css, /\.runtime-shell\.context-docked\s*\{[^}]*--content-width:\s*1160px[^}]*grid-template-columns:\s*var\(--sidebar-width\)\s+minmax\(0,\s*1fr\)\s+var\(--context-rail-width\)/); + assert.match(css, /@media \(min-width: 1280px\)/); + assert.match(css, /--context-rail-width:\s*clamp\(360px,\s*30vw,\s*560px\)/); + assert.match(css, /\.runtime-shell\.context-docked\s*\{[^}]*--content-width:\s*760px[^}]*grid-template-columns:\s*var\(--sidebar-width\)\s+minmax\(0,\s*1fr\)\s+var\(--context-rail-width\)/); assert.match(css, /translateX\(-102%\)/); assert.match(css, /env\(safe-area-inset-bottom\)/); assert.match(css, /env\(safe-area-inset-top\)/); @@ -592,7 +592,7 @@ test("runtime collaboration rendering uses textContent and explicitly reloads on assert.match(css, /--layout-major:\s*61\.8%/); assert.match(css, /--layout-minor:\s*38\.2%/); assert.match(css, /--sidebar-width:\s*clamp\(300px,\s*21vw,\s*356px\)/); - assert.match(css, /--content-width:\s*1120px/); + assert.match(css, /--content-width:\s*760px/); assert.match(css, /\.message-card\.message-incoming\s*\{[^}]*width:\s*fit-content[^}]*max-width:\s*min\(82%,\s*880px\)/); assert.match(css, /\.message-card\.message-neutral\s*\{[^}]*width:\s*fit-content[^}]*max-width:\s*min\(82%,\s*880px\)/); assert.match(css, /\.message-card\.message-outgoing\s*\{[^}]*max-width:\s*min\(68%,\s*680px\)[^}]*align-self:\s*flex-end/); @@ -630,6 +630,8 @@ test("runtime collaboration rendering uses textContent and explicitly reloads on assert.match(source, /runtimeProjectIdentityText\(project\)/); assert.match(source, /runtimeCollaborationMessageSides\(messages, locallyAuthoredCollaborationMessageIds\)/); assert.match(source, /provenance-unknown/); + assert.match(source, /sessionListMetaSnapshot = \{\s*total: typeof response\.data\.total === "number" \? Math\.max\(sessionRows\.length, response\.data\.total\) : sessionRows\.length,\s*truncated: !!response\.data\.truncated,\s*\}/); + assert.match(source, /runtime-session-search"\)\?\.addEventListener\("input", \(\) => renderSessionList\(sessionRows, sessionListMetaSnapshot\)\)/); assert.match(source, /rememberLocalCollaborationMessage/); assert.match(source, /message-group-continuation/); assert.match(source, /syncCollaborationComposerLayout/); @@ -725,9 +727,9 @@ test("runtime collaboration rendering uses textContent and explicitly reloads on const renderProjectsStart = source.indexOf("function renderProjectSelectors"); const renderProjectsEnd = source.indexOf("function switchProject", renderProjectsStart); const renderProjects = source.slice(renderProjectsStart, renderProjectsEnd); - assert.match(renderProjects, /document\.createElement\("button"\)/); + assert.match(renderProjects, /document\.createElement\("summary"\)/); assert.match(renderProjects, /signature === renderedProjectSelectorsSignature/); - assert.match(renderProjects, /row\.type = "button"/); + assert.match(renderProjects, /workspace\.addEventListener\("toggle"/); assert.doesNotMatch(renderProjects, /addEventListener\("keydown"/); assert.match(renderProjects, /all\.textContent = tr\("All Runners"\)/); assert.match(renderProjects, /switchProject\(String\(project\.client_id \|\| ""\), String\(project\.id \|\| ""\)\)/); @@ -737,7 +739,7 @@ test("runtime collaboration rendering uses textContent and explicitly reloads on assert.match(renderProjects, /row\.title = \[projectName, projectId/); assert.match(renderProjects, /projectsByDevice/); assert.match(renderProjects, /projectDeviceFilter/); - assert.match(renderProjects, /deviceProjectList\.appendChild\(sessionsPanel\)/); + assert.match(renderProjects, /workspace\.appendChild\(sessionsPanel\)/); assert.match(renderProjects, /deviceMeta\.textContent = tr\(status\) \+ " · " \+ countLabel\(deviceProjects\.length, "Project"\)/); assert.match(source, /appendRichMessage\(bubble, message\?\.message\);\s*content\.appendChild\(bubble\)/); assert.match(source, /footer\.appendChild\(actions\);\s*content\.appendChild\(footer\);\s*card\.appendChild\(content\)/); @@ -1072,33 +1074,33 @@ test("context user intent reducer and lifecycle transitions ensure programmatic const toggledOpen = reduceRuntimeContextUserIntent(null, { type: "toggle_trigger", currentVisible: false }); assert.equal(toggledOpen, true); - // 1599 <-> 1600 transitions with explicit open intent preserve intent and only switch presentation mode. + // 1279 <-> 1280 transitions with explicit open intent preserve intent and only switch presentation mode. userIntent = true; - const at1599 = resolveRuntimeContextState({ + const at1279 = resolveRuntimeContextState({ userIntent, isWideViewport: false, isMobileViewport: false, hasSelectedSession: true, workspaceView: "sessions", }); - assert.equal(at1599.visible, true); - assert.equal(at1599.presentationMode, "popover"); - assert.equal(at1599.isDocked, false); + assert.equal(at1279.visible, true); + assert.equal(at1279.presentationMode, "popover"); + assert.equal(at1279.isDocked, false); - const at1600 = resolveRuntimeContextState({ + const at1280 = resolveRuntimeContextState({ userIntent, isWideViewport: true, isMobileViewport: false, hasSelectedSession: true, workspaceView: "sessions", }); - assert.equal(at1600.visible, true); - assert.equal(at1600.presentationMode, "docked"); - assert.equal(at1600.isDocked, true); + assert.equal(at1280.visible, true); + assert.equal(at1280.presentationMode, "docked"); + assert.equal(at1280.isDocked, true); }); test("context focus transition preserves accessible focus across breakpoint and close actions", () => { - // P2 Case 1: Popover is open and trigger is focused. Viewport resizes 1599 -> 1600. + // P2 Case 1: Popover is open and trigger is focused. Viewport resizes 1279 -> 1280. // Trigger will be hidden by CSS (display: none), so focus MUST transfer to #runtime-inspector-close. assert.equal( resolveRuntimeContextFocusTransition({ @@ -1110,7 +1112,7 @@ test("context focus transition preserves accessible focus across breakpoint and ); // P2 Case 2: Popover is open but focus was elsewhere (e.g. inside chat or timeline). - // Resize to 1600 must NOT steal focus! + // Resize to 1280 must NOT steal focus! assert.equal( resolveRuntimeContextFocusTransition({ wasDocked: false, @@ -1120,7 +1122,7 @@ test("context focus transition preserves accessible focus across breakpoint and "none" ); - // P2 Case 3: Context is closed and user resizes across 1599 <-> 1600. + // P2 Case 3: Context is closed and user resizes across 1279 <-> 1280. // nextDocked is false because closed context never docks; focus must never be stolen. assert.equal( resolveRuntimeContextFocusTransition({ @@ -1131,7 +1133,7 @@ test("context focus transition preserves accessible focus across breakpoint and "none" ); - // P2 Case 4: Already docked; resize within >=1600 range does not transfer focus. + // P2 Case 4: Already docked; resize within >=1280 range does not transfer focus. assert.equal( resolveRuntimeContextFocusTransition({ wasDocked: true, @@ -1141,7 +1143,7 @@ test("context focus transition preserves accessible focus across breakpoint and "none" ); - // P2 Case 5: Reverse transition from docked (1600) to popover (1599). + // P2 Case 5: Reverse transition from docked (1280) to popover (1279). // Close button remains visible in popover header; no focus jump needed. assert.equal( resolveRuntimeContextFocusTransition({ diff --git a/frontend/test/runtime_navigation.test.mjs b/frontend/test/runtime_navigation.test.mjs index 3abb38bf..d2e9eaf2 100644 --- a/frontend/test/runtime_navigation.test.mjs +++ b/frontend/test/runtime_navigation.test.mjs @@ -85,3 +85,69 @@ test("closing mobile navigation fences its delayed focus callback", async () => callbacks.shift()(); assert.equal(focused, true); }); + +test("retained message search matches body and resolution without mutating messages", async () => { + const source = await readFile(new URL("../dist/runtime.js", import.meta.url), "utf8"); + const start = source.indexOf("function runtimeSearchMatches("); + const end = source.indexOf("function renderCollaboration(", start); + const messages = [ + { message_id: "a", message: "Build failed", resolution: "Fixed Unicode 路径" }, + { message_id: "b", message: "Pending", author_session_id: "worker-2" }, + ]; + const original = JSON.stringify(messages); + const cards = messages.map((message) => ({ dataset: { messageId: message.message_id }, hidden: false })); + const separator = { hidden: false }; + const input = { value: "FIXED 路径" }; + let status; + const context = vm.createContext({ + state: { collaboration: { messages } }, + el: () => input, + setText: (_id, text) => { status = text; }, + document: { querySelectorAll: (selector) => selector.includes(".message-card") ? cards : [separator] }, + }); + vm.runInContext(source.slice(start, end), context); + context.filterCollaborationMessages(); + assert.deepEqual(cards.map((card) => card.hidden), [false, true]); + assert.equal(status, "1 / 2"); + assert.equal(separator.hidden, true); + input.value = "missing"; + context.filterCollaborationMessages(); + assert.equal(status, "0 / 2"); + input.value = ""; + context.filterCollaborationMessages(); + assert.deepEqual(cards.map((card) => card.hidden), [false, false]); + assert.equal(separator.hidden, false); + assert.equal(JSON.stringify(messages), original); +}); + +test("workspace disclosure survives rerender and ignores detached toggle events", async () => { + const source = await readFile(new URL("../dist/runtime.js", import.meta.url), "utf8"); + const start = source.indexOf('const workspace = document.createElement("details")'); + const end = source.indexOf('const row = document.createElement("summary")', start); + const stored = new Map(); + let disclosure; + const context = vm.createContext({ + clientId: "runner-a", project: { id: "project-a" }, state: { selectedProject: "project-a" }, + window: { localStorage: { getItem: (key) => stored.get(key), setItem: (key, value) => stored.set(key, value) } }, + document: { createElement: () => (disclosure = { + isConnected: true, + addEventListener(_name, handler) { this.toggle = handler; }, + }) }, + }); + const render = () => vm.runInContext("(() => {" + source.slice(start, end) + "})()", context); + render(); + assert.equal(disclosure.open, true); + disclosure.open = false; + disclosure.toggle(); + render(); + assert.equal(disclosure.open, false); + const detached = disclosure; + detached.isConnected = false; + detached.open = true; + detached.toggle(); + render(); + assert.equal(disclosure.open, false); + context.clientId = "runner-b"; + render(); + assert.equal(disclosure.open, true); +}); diff --git a/src/model_surface.rs b/src/model_surface.rs index 50089fd6..6adb30ec 100644 --- a/src/model_surface.rs +++ b/src/model_surface.rs @@ -242,6 +242,8 @@ mod tests { "work_on_project", "session_discussion_summary", "runtime_status", + "runner_config_check", + "runner_config_reload", "tool_manifest", "search_project_texts", "read_files", diff --git a/src/oauth_http/scope_registry.rs b/src/oauth_http/scope_registry.rs index c0c6c0c4..d3c1b1a5 100644 --- a/src/oauth_http/scope_registry.rs +++ b/src/oauth_http/scope_registry.rs @@ -8,6 +8,7 @@ use super::OAuthAuthorizeError; /// scope not intended for OAuth2 delegation. const OAUTH_SCOPES_SUPPORTED: &[&str] = &[ scopes::SCOPE_RUNTIME_READ, + scopes::SCOPE_RUNNER_MANAGE, scopes::SCOPE_SESSION_COLLABORATE, scopes::SCOPE_COMMUNICATION_READ, scopes::SCOPE_COMMUNICATION_MANAGE, diff --git a/src/oauth_http/tests/scopes.rs b/src/oauth_http/tests/scopes.rs index 5712c905..cd67a4dd 100644 --- a/src/oauth_http/tests/scopes.rs +++ b/src/oauth_http/tests/scopes.rs @@ -40,6 +40,16 @@ fn oauth_discovery_scopes_include_offline_access_but_permission_registry_does_no assert!(!oauth_scopes_supported().contains(&OAUTH_OFFLINE_ACCESS_SCOPE)); } +#[test] +fn direct_shared_key_model_scopes_are_all_oauth_delegable() { + for scope in crate::auth::DIRECT_SHARED_KEY_MODEL_SCOPES { + assert!( + oauth_scopes_supported().contains(scope), + "direct shared-key model scope {scope} must be present in the OAuth permission registry" + ); + } +} + #[test] fn normalize_oauth_scopes_deduplicates_and_orders() { let normalized = normalize_oauth_scopes( diff --git a/src/tool_runtime/tests/coding_task.rs b/src/tool_runtime/tests/coding_task.rs index 460eacd8..1945fa40 100644 --- a/src/tool_runtime/tests/coding_task.rs +++ b/src/tool_runtime/tests/coding_task.rs @@ -2558,7 +2558,18 @@ async fn finish_coding_task_summary_only_keeps_cargo_fmt_failure_blocking_when_o "cargo_test", json!({"project": fixture.project.clone()}), true, - json!({"exit_code": 0}), + json!({ + "exit_code": 0, + "stdout_tail": "running 1 test\n\ntest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n", + "stderr_tail": "", + "stdout_truncated": false, + "stderr_truncated": false, + "tests_detected": true, + "tests_run_count": 1, + "tests_passed": 1, + "tests_failed": 0, + "zero_tests_run": false + }), ); let result = finish_coding_task_summary_only_with_agent( @@ -2811,7 +2822,18 @@ async fn finish_coding_task_summary_only_treats_read_failure_as_historical_non_a "cargo_test", json!({"project": fixture.project.clone()}), true, - json!({"exit_code": 0}), + json!({ + "exit_code": 0, + "stdout_tail": "running 1 test\n\ntest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out\n", + "stderr_tail": "", + "stdout_truncated": false, + "stderr_truncated": false, + "tests_detected": true, + "tests_run_count": 1, + "tests_passed": 1, + "tests_failed": 0, + "zero_tests_run": false + }), ); let result = finish_coding_task_summary_only_with_agent( diff --git a/src/tool_runtime/tests/support/runtime.rs b/src/tool_runtime/tests/support/runtime.rs index ca395998..0ec43d9f 100644 --- a/src/tool_runtime/tests/support/runtime.rs +++ b/src/tool_runtime/tests/support/runtime.rs @@ -144,6 +144,7 @@ pub(in crate::tool_runtime::tests) fn sample_field_value(field: &str) -> Value { "base_commit" => json!("a".repeat(40)), "head_commit" => json!("b".repeat(40)), "expected_head" => json!("a".repeat(40)), + "expected_generation" => json!(1), "expected_revision" => json!(format!("sha256:{}", "a".repeat(64))), "name" => json!("Private Drop"), "kind" => json!("note"), diff --git a/src/tool_runtime/tests/validation_handoff.rs b/src/tool_runtime/tests/validation_handoff.rs index f90131c9..3d474d0c 100644 --- a/src/tool_runtime/tests/validation_handoff.rs +++ b/src/tool_runtime/tests/validation_handoff.rs @@ -1779,7 +1779,10 @@ async fn partial_agent_status_is_conservative_while_delta_log_uses_frozen_valida let validation = runtime .validation_summary_for_session_with_jobs(&summary, 50, Some(&auth)) .await; - assert_eq!(validation["status"], "passed"); + // The frozen Session summary only has the conservative truncated status + // snapshot. Observer-specific job_log material can prove three tests ran, + // but must not retroactively strengthen that Session evidence. + assert_eq!(validation["status"], "inconclusive"); let latest = &validation["latest"]; assert_eq!(latest["tool_name"], "cargo_test"); for field in [