/*
 * AI 助手「工作/编码」的内置终端（js/ai-terminal.js，仅桌面端）。
 *
 * 面板是右侧栏（css/ai-side-panel.css）的下半格：栏宽、上下分栏、拖动与腾地方都在 AiSidePanel 里，这里只管终端自己。
 * 不加 will-change / 残留 transform：抽屉里有 position: fixed 的后代（见 CLAUDE.md「打开 AI 抽屉的性能」）。
 */

/* ── 面板 ── */
.ai-terminal-panel {
    flex: 1 1 0;
    min-width: 0;
    min-height: 0;
    display: flex;
    flex-direction: column;
    background: var(--kb-paper, #fbfaf5);
    color: var(--kb-ink, #2f2b24);
    box-sizing: border-box;
    position: relative;
}

.ai-terminal-panel[hidden] {
    display: none;
}

/*
 * 全屏：面板连同指令集铺满应用窗口，与内置浏览器的全屏同一套（css/ai-browser.css「全屏」一段）。
 * 只改定位，面板不换父节点；桌面端 macOS 窗口非全屏时为交通灯让出的高度由 desktop.css 改写
 */
.ai-terminal-panel.is-fullscreen {
    --kb-fullscreen-titlebar: var(--kb-safe-top, 0px);
    position: fixed;
    inset: 0;
    z-index: 10040;
    padding-top: var(--kb-fullscreen-titlebar);
    box-shadow: none;
}

/* 层级：AI 首页的抽屉嵌在页面里（z-index 39），面板的 10040 只在抽屉这一层里算；全屏时把抽屉整层抬上去、
   藏掉左侧菜单的收起把手，菜单与通用弹框跟着抬到面板之上（理由同内置浏览器全屏） */
html.kb-terminal-fullscreen .ai-drawer:has(.ai-terminal-panel.is-fullscreen) {
    z-index: 10040;
}

html.kb-terminal-fullscreen .sidebar-toggle-btn.kb-edge-toggle {
    display: none !important;
}

html.kb-terminal-fullscreen .ai-popover-menu {
    z-index: 10050;
}

html.kb-terminal-fullscreen .utils-dialog {
    z-index: 10060 !important;
}

.ai-terminal-fullscreen-toggle[aria-pressed="true"] {
    color: var(--kb-accent);
}

.ai-terminal-header {
    display: flex;
    align-items: center;
    gap: 4px;
    flex-shrink: 0;
    height: 40px;
    /* 右边距与 AI 标题栏（.editor-header：1rem，≤1023px 为 0.5rem）同值：关闭键与标题栏最右的刷新 / 关闭键右缘对齐 */
    padding: 0 1rem 0 8px;
    border-bottom: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.15));
}

@media (max-width: 1023px) {
    .ai-terminal-header {
        padding-right: 0.5rem;
    }
}

.ai-terminal-tabs {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 2px;
    overflow-x: auto;
    scrollbar-width: none;
}

.ai-terminal-tabs::-webkit-scrollbar {
    display: none;
}

.ai-terminal-tab {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex-shrink: 0;
    max-width: 180px;
    height: 28px;
    padding: 0 4px 0 10px;
    border-radius: 6px;
    font-size: 0.8125rem;
    color: var(--kb-ink-muted, #827a6d);
    cursor: pointer;
    user-select: none;
}

.ai-terminal-tab-title {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/*
 * 双击重命名的输入框（js 里 _startRename）。多带一层 .ai-terminal-tab：
 * form-unified.css 的 input[type="text"] 给了 40px 高、1rem 内边距与边框，特异度比单个类高
 */
.ai-terminal-tab .ai-terminal-tab-input,
.ai-terminal-tab .ai-terminal-tab-input:focus {
    box-sizing: border-box;
    width: 9em;
    min-width: 0;
    height: 20px;
    min-height: 0;
    padding: 0 4px;
    border: 1px solid var(--kb-accent);
    border-radius: 4px;
    outline: none;
    box-shadow: none;
    background: var(--kb-paper, #fbfaf5);
    color: var(--kb-ink, #2f2b24);
    font: inherit;
    line-height: 18px;
    user-select: text;
    transition: none;
}

/* reading-theme.css 的 `.kb-paper-app input:focus` 带 !important 套 3px 光晕：同样 !important、靠更高的特异度压住 */
.kb-paper-app .ai-terminal-tab .ai-terminal-tab-input:focus,
.kb-paper-app .ai-terminal-tab .ai-terminal-tab-input:focus-visible {
    border-color: var(--kb-accent) !important;
    box-shadow: none !important;
    outline: none !important;
}

.ai-terminal-tab.is-active {
    background: var(--kb-active-bg);
    color: var(--kb-ink, #2f2b24);
}

.ai-terminal-tab.is-exited .ai-terminal-tab-title {
    text-decoration: line-through;
    opacity: 0.7;
}

@media (any-hover: hover) {
    .ai-terminal-tab:hover:not(.is-active):not(:where(html[data-kb-pointer="touch"] *)) {
        background: var(--kb-active-bg);
    }
}

.ai-terminal-tab:focus-visible:where(html:not(.kb-focus-pointer) *) {
    outline: 2px solid var(--kb-accent);
    outline-offset: -2px;
}

.ai-terminal-tab-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 18px;
    height: 18px;
    border-radius: 4px;
    opacity: 0.55;
}

.ai-terminal-tab-close:hover {
    opacity: 1;
    background: var(--kb-active-bg-strong);
}

.ai-terminal-actions {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-shrink: 0;
}

/*
 * 标签栏右侧的小工具键（新建 / 选类型 / 收起）。刻意不用 32px 的 .kb-header-icon-btn：
 * 这里是终端自己的紧凑工具条，不是抽屉标题栏，那副大圆钮压在 40px 高的标签行上显得笨重
 */
.ai-terminal-action {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 24px;
    height: 24px;
    min-width: 0 !important;
    min-height: 0 !important;
    padding: 0;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: var(--kb-ink-muted, #827a6d);
    font-size: 16px;
    line-height: 1;
    cursor: pointer;
}

@media (any-hover: hover) {
    .ai-terminal-action:hover:not(:where(html[data-kb-pointer="touch"] *)) {
        background: var(--kb-active-bg);
        color: var(--kb-ink, #2f2b24);
    }
}

.ai-terminal-action:focus-visible:where(html:not(.kb-focus-pointer) *) {
    outline: 2px solid var(--kb-accent);
    outline-offset: -2px;
}

.ai-terminal-body {
    flex: 1;
    min-height: 0;
    position: relative;
}

.ai-terminal-view {
    position: absolute;
    inset: 6px 4px 4px 10px;
}

.ai-terminal-view[hidden] {
    display: none;
}

/* xterm 自带的滚动区背景跟着主题变量，不留白边 */
.ai-terminal-view .xterm,
.ai-terminal-view .xterm-viewport {
    background-color: var(--kb-paper, #fbfaf5) !important;
}

.ai-terminal-view .xterm {
    height: 100%;
}

.ai-terminal-message {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 8px 10px;
    padding: 8px 12px;
    border-radius: 8px;
    font-size: 0.8125rem;
    border: 1px solid rgba(245, 158, 11, 0.4);
    background: rgba(245, 158, 11, 0.12);
    color: #b45309;
}

[data-theme="dark"] .ai-terminal-message {
    color: #fbbf24;
}

.ai-terminal-message[hidden] {
    display: none;
}

.ai-terminal-message span {
    flex: 1;
    min-width: 0;
}

.ai-terminal-retry {
    flex-shrink: 0;
    min-height: 0 !important;
    height: 26px;
    padding: 0 10px;
    border-radius: 6px;
    border: 1px solid currentColor;
    background: transparent;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

/* 右键菜单的锚点：0×0，按鼠标位置摆 */
.ai-terminal-menu-anchor {
    position: fixed;
    width: 0;
    height: 0;
    pointer-events: none;
}

/* ───────────────── 指令集（V3.164，js/ai-terminal-commands.js / ai-terminal-suggest.js） ───────────────── */

/* 面板主区：左边指令集抽屉、右边终端（进度条 + 标签视图） */
.ai-terminal-main {
    --ai-terminal-commands-width: 240px;
    flex: 1;
    min-height: 0;
    display: flex;
    position: relative;
}

.ai-terminal-stage {
    position: relative;
    flex: 1;
    min-width: 0;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

/* 「指令集」键紧挨着标签、开着时有底色块：与标签（28px）同高，否则一高一矮（右侧三颗没有底色，留 24px） */
.ai-terminal-header .ai-terminal-commands-toggle {
    width: 28px;
    height: 28px;
}

.ai-terminal-commands-toggle.is-active {
    background: var(--kb-active-bg);
    color: var(--kb-ink, #2f2b24);
}

.ai-terminal-commands {
    flex: 0 0 var(--ai-terminal-commands-width);
    width: var(--ai-terminal-commands-width);
    min-width: 0;
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    border-right: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.15));
    background: var(--kb-paper, #fbfaf5);
    position: relative;
    font-size: 0.8125rem;
}

.ai-terminal-commands[hidden] {
    display: none;
}

/* ── 收起 / 展开（V3.165，照 VAN 左缘的把手）：收起时宽度归零，把手贴在终端左缘 ── */
.ai-terminal-commands.is-collapsed {
    flex-basis: 0;
    width: 0;
    border-right-width: 0;
    overflow: hidden;
}

.ai-terminal-commands.is-collapsed > * {
    visibility: hidden;
}

.ai-terminal-main.is-commands-animating .ai-terminal-commands {
    overflow: hidden;
    transition: flex-basis 0.22s ease, width 0.22s ease;
}

/*
 * 长相是全站统一的 .kb-edge-toggle（css/splitter.css，就是照这颗键抽出来的），这里只管位置与显隐。
 * **transition 必须自己写**（V3.174）：它是个 <button>，form-unified.css 给所有按钮挂了 `transition: all 0.3s`，
 * 不覆盖的话 left 也带 0.3 秒过渡——拖分割线时抽屉立刻跟手、把手慢半拍，两者分开。只在收起 / 展开动画期间过渡 left（见下）。
 * z-index 高过分割线（.kb-splitter 是 11）：两者在同一处，分割线的 ±4px 命中区不能盖住把手
 */
.ai-terminal-commands-edge {
    position: absolute;
    top: 50%;
    left: var(--ai-terminal-commands-width);
    z-index: 12;
    display: none;
    transform: translate(-1px, -50%);
    transition: background 0.2s, color 0.2s;
}

.ai-terminal-main.has-commands > .ai-terminal-commands-edge {
    display: flex;
}

.ai-terminal-main.is-commands-collapsed > .ai-terminal-commands-edge {
    left: 0;
    transform: translate(0, -50%);
}

.ai-terminal-main.is-commands-animating > .ai-terminal-commands-edge {
    transition: left 0.22s ease, transform 0.22s ease;
}


/* ── 拖拽排序：插入线 / 拖进分组 ── */
.ai-terminal-command[draggable="true"],
.ai-terminal-group-head[draggable="true"] {
    -webkit-user-drag: element;
}

.ai-terminal-command.is-dragging,
.ai-terminal-group.is-dragging {
    opacity: 0.45;
}

.ai-terminal-command.is-drop-before,
.ai-terminal-group-head.is-drop-before {
    box-shadow: inset 0 2px 0 var(--kb-accent);
}

.ai-terminal-command.is-drop-after,
.ai-terminal-group-head.is-drop-after {
    box-shadow: inset 0 -2px 0 var(--kb-accent);
}

.ai-terminal-group-head.is-drop-into {
    background: var(--kb-active-bg);
    box-shadow: inset 0 0 0 1px var(--kb-accent);
}

/* ── 编辑框里的「AI 生成」备注 ── */
/*
 * 指令集的弹框表单（添加 / 编辑指令、填写占位符）：字段间距取全站统一的 --kb-dialog-field-gap（css/dialog.css），
 * 标签与控件之间由 .kb-dialog-field 自己给（V3.173；此前容器没有任何样式，字段贴在一起，与别的弹框不一致）
 */
.ai-terminal-command-form,
.ai-terminal-placeholder-form {
    display: flex;
    flex-direction: column;
    gap: var(--kb-dialog-field-gap, 16px);
}

.ai-terminal-note-label {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}

.ai-terminal-note-ai {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    min-height: 0 !important;
    padding: 2px 8px;
    border: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.15));
    border-radius: 999px;
    background: transparent;
    color: var(--kb-accent);
    font-size: 0.75rem;
    cursor: pointer;
}

.ai-terminal-note-ai:disabled {
    color: var(--kb-control-disabled-text, #a39b8c);
    cursor: default;
}

.ai-terminal-note-ai.is-loading i {
    animation: kb-loading-spin 1s linear infinite;
}

/* ── 「加入指令集」对话框 ── */
.ai-terminal-import-target {
    display: flex;
    gap: 8px;
}

.ai-terminal-import-target > * {
    flex: 1;
    min-width: 0;
}

.ai-terminal-import-target [hidden] {
    display: none;
}

.ai-terminal-import-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    /* 与上面「保存到」之间是字段间距（与别的弹框一致），与下面的清单贴近 */
    margin: var(--kb-dialog-field-gap, 16px) 0 6px;
    font-size: 0.8125rem;
    color: var(--kb-ink-muted, #827a6d);
}

.ai-terminal-import-head label {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    white-space: nowrap;
    cursor: pointer;
}

.ai-terminal-import-head input,
.ai-terminal-import-check {
    width: 16px;
    height: 16px;
    margin: 0;
    flex-shrink: 0;
}

.ai-terminal-import-list {
    max-height: min(52vh, 480px);
    overflow-y: auto;
    margin: 0;
    padding: 0;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

/*
 * 「加入指令集」每条一行（V3.175）：勾选 | 指令 | 备注，勾选框按行垂直居中、与表头「全选」同一条竖线。
 * 此前指令、备注上下两个输入框叠着、勾选框顶对齐，弹框又窄，长命令与备注都被截断
 */
.ai-terminal-import-item {
    position: relative;
    display: grid;
    grid-template-columns: 16px minmax(0, 1fr);
    align-items: center;
    column-gap: 10px;
}

.ai-terminal-import-fields {
    min-width: 0;
    display: grid;
    grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
    column-gap: 8px;
}

.ai-terminal-import-fields .kb-dialog-input {
    height: 36px;
    padding-top: 0.375rem;
    padding-bottom: 0.375rem;
}

.ai-terminal-import-item.is-dup .ai-terminal-import-fields {
    opacity: 0.55;
}

/* 「已在分组里」浮在备注框右侧，不另占一列（大多数行没有它） */
.ai-terminal-import-tag {
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    padding: 1px 6px;
    border-radius: 4px;
    background: var(--kb-active-bg);
    font-size: 0.75rem;
    color: var(--kb-ink-muted, #827a6d);
    white-space: nowrap;
    pointer-events: none;
}

.ai-terminal-import-item.is-dup [data-import-note] {
    padding-right: 84px;
}

/* 窄屏：指令与备注退回上下两行 */
@media (max-width: 640px) {
    .ai-terminal-import-fields {
        grid-template-columns: minmax(0, 1fr);
        row-gap: 4px;
    }

    .ai-terminal-import-tag {
        top: auto;
        bottom: 9px;
        transform: none;
    }
}

.ai-terminal-import-tag[hidden] {
    display: none;
}

.ai-terminal-commands-head {
    flex-shrink: 0;
    padding: 8px 8px 6px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.ai-terminal-commands-search {
    display: flex;
    align-items: center;
    gap: 6px;
    height: 28px;
    padding: 0 8px;
    border-radius: 6px;
    background: var(--kb-active-bg);
    color: var(--kb-ink-muted, #827a6d);
}

/* form-unified.css 给 input 兜了 40px 高与边框：多带一层类压住 */
.ai-terminal-commands .ai-terminal-commands-search input,
.ai-terminal-commands .ai-terminal-commands-search input:focus {
    flex: 1;
    min-width: 0;
    height: 24px;
    min-height: 0;
    padding: 0;
    border: none;
    outline: none;
    box-shadow: none;
    background: transparent;
    color: var(--kb-ink, #2f2b24);
    font: inherit;
}

/* 清除键与知识库列表的搜索框同一套（css/search.css 的 .search-clear），这里只缩一档；系统自带的 × 藏掉 */
.ai-terminal-commands .ai-terminal-commands-search input::-webkit-search-cancel-button {
    -webkit-appearance: none;
    appearance: none;
    display: none;
}

.ai-terminal-commands-search .search-clear {
    width: 20px;
    height: 20px;
    min-width: 0 !important;
    min-height: 0 !important;
    margin-left: 0;
}

.kb-paper-app .ai-terminal-commands .ai-terminal-commands-search input:focus,
.kb-paper-app .ai-terminal-commands .ai-terminal-commands-search input:focus-visible {
    box-shadow: none !important;
    outline: none !important;
    border: none !important;
}

.ai-terminal-commands-tools {
    display: flex;
    align-items: center;
    gap: 2px;
}

/* .ai-terminal-action 自带 display:flex，压过 [hidden]：没装 VAN Terminal 时同步键曾照样露着 */
.ai-terminal-commands-tools > [hidden] {
    display: none;
}

/* 本机 VAN Terminal 的数据比上次同步时新：键上挂个点 */
.ai-terminal-van {
    position: relative;
}

.ai-terminal-van.has-update::after {
    content: '';
    position: absolute;
    top: 3px;
    right: 3px;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--kb-accent);
}

.ai-terminal-commands-list {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 0 4px 8px;
}

.ai-terminal-commands-empty {
    padding: 16px 10px;
    color: var(--kb-ink-muted, #827a6d);
    line-height: 1.6;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
}

.ai-terminal-commands-empty p {
    margin: 0;
}

.ai-terminal-commands-link {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    min-height: 0 !important;
    padding: 2px 0;
    border: none;
    background: transparent;
    color: var(--kb-accent);
    font: inherit;
    cursor: pointer;
}

.ai-terminal-group-head {
    display: flex;
    align-items: center;
    gap: 4px;
    height: 30px;
    padding: 0 4px;
    border-radius: 6px;
    cursor: pointer;
    user-select: none;
    color: var(--kb-ink, #2f2b24);
}

.ai-terminal-group-caret {
    flex-shrink: 0;
    color: var(--kb-ink-muted, #827a6d);
    transition: transform 0.15s ease;
}

.ai-terminal-group.is-open .ai-terminal-group-caret {
    transform: rotate(90deg);
}

.ai-terminal-group-name {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 500;
}

.ai-terminal-group-head em {
    flex-shrink: 0;
    font-style: normal;
    font-size: 0.75rem;
    color: var(--kb-ink-muted, #827a6d);
}

.ai-terminal-group-actions,
.ai-terminal-command-actions {
    display: none;
    align-items: center;
    flex-shrink: 0;
}

.ai-terminal-group-actions .ai-terminal-action,
.ai-terminal-command-actions .ai-terminal-action {
    width: 22px;
    height: 22px;
    font-size: 14px;
}

.ai-terminal-group-head:focus-within .ai-terminal-group-actions,
.ai-terminal-command:focus-within .ai-terminal-command-actions {
    display: flex;
}

@media (any-hover: hover) {
    .ai-terminal-group-head:hover:not(:where(html[data-kb-pointer="touch"] *)),
    .ai-terminal-command:hover:not(:where(html[data-kb-pointer="touch"] *)) {
        background: var(--kb-active-bg);
    }

    .ai-terminal-group-head:hover .ai-terminal-group-actions,
    .ai-terminal-command:hover .ai-terminal-command-actions {
        display: flex;
    }

    .ai-terminal-group-head:hover em {
        display: none;
    }
}

/* 触屏没有悬停：动作键常显 */
:where(html[data-kb-pointer="touch"]) .ai-terminal-group-actions,
:where(html[data-kb-pointer="touch"]) .ai-terminal-command-actions {
    display: flex;
}

.ai-terminal-action.is-busy {
    opacity: 0.45;
    cursor: default;
}

.ai-terminal-command {
    display: flex;
    align-items: flex-start;
    gap: 4px;
    padding: 5px 4px 5px 22px;
    border-radius: 6px;
    cursor: pointer;
}

.ai-terminal-group-head:focus-visible:where(html:not(.kb-focus-pointer) *),
.ai-terminal-command:focus-visible:where(html:not(.kb-focus-pointer) *) {
    outline: 2px solid var(--kb-accent);
    outline-offset: -2px;
}

.ai-terminal-command-text {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.ai-terminal-command-text code {
    font-family: "SF Mono", Menlo, Monaco, Consolas, monospace;
    font-size: 0.75rem;
    color: var(--kb-ink, #2f2b24);
    background: transparent;
    padding: 0;
    word-break: break-all;
}

.ai-terminal-command-text span {
    font-size: 0.75rem;
    color: var(--kb-ink-muted, #827a6d);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ai-terminal-commands mark,
.ai-terminal-suggest mark {
    background: rgba(245, 158, 11, 0.28);
    color: inherit;
    border-radius: 2px;
}

/* 右缘拖宽 */
/*
 * 右缘调宽：长相、命中区（线两侧各 4px）与悬停强调条都是全站统一的 .kb-splitter（css/splitter.css，V3.174；此前是自写的
 * 8px 透明条，命中区与别处不一致、悬停也不亮）。这里只把它压在抽屉右边线上——多带一层类拼特异度，splitter.css 加载在后
 */
.ai-terminal-commands > .ai-terminal-commands-resize.kb-splitter {
    position: absolute;
    top: 0;
    bottom: 0;
    right: -1px;
}

.ai-terminal-commands.is-collapsed > .ai-terminal-commands-resize {
    display: none;
}

/* 清空指令集弹框 */
.ai-terminal-clear {
    display: flex;
    flex-direction: column;
    gap: var(--kb-dialog-field-gap, 16px);
}

.ai-terminal-clear-text {
    font-size: 0.875rem;
    line-height: 1.6;
    color: var(--kb-ink-soft, #5e584e);
}

.ai-terminal-clear-groups {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 0.875rem;
    color: var(--kb-ink, #2f2b24);
    cursor: pointer;
}

/* ── 批量执行进度条 ── */
/*
 * 批量执行进度：浮在终端区顶上居中的胶囊（V3.173，照内置浏览器「AI 正在操作」那颗）。不占布局——
 * 曾经是终端上方一条占位的横条，出现 / 消失时终端整块上下跳、还要重新 fit。外层不吃鼠标，胶囊本身可点（停止 / 关闭）
 */
.ai-terminal-runbar {
    position: absolute;
    top: 8px;
    left: 12px;
    right: 12px;
    z-index: 5;
    display: flex;
    justify-content: center;
    pointer-events: none;
    animation: ai-terminal-run-in 0.2s ease;
}

.ai-terminal-runbar[hidden] {
    display: none;
}

@keyframes ai-terminal-run-in {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: none; }
}

/* 状态色是半透明的，叠在不透明的纸色上（background-image 盖在 background-color 上），浮在终端输出上不透字 */
.ai-terminal-run {
    --ai-terminal-run-tone: var(--kb-active-bg);
    display: flex;
    align-items: center;
    gap: 8px;
    max-width: 100%;
    min-height: 30px;
    padding: 4px 6px 4px 12px;
    border: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.15));
    border-radius: 15px;
    font-size: 0.8125rem;
    background-color: var(--kb-paper, #fbfaf5);
    background-image: linear-gradient(var(--ai-terminal-run-tone), var(--ai-terminal-run-tone));
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
    color: var(--kb-ink, #2f2b24);
    pointer-events: auto;
}

.ai-terminal-run > span {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* 成败的红绿与 diff 同一套（reading-theme.css 亮暗各一份），等输入用状态黄 */
.ai-terminal-run.is-done {
    color: var(--kb-diff-add-fg);
    --ai-terminal-run-tone: var(--kb-diff-add-bg);
}

.ai-terminal-run.is-failed {
    color: var(--kb-diff-del-fg);
    --ai-terminal-run-tone: var(--kb-diff-del-bg);
}

.ai-terminal-run.is-waiting {
    color: var(--kb-status-warn);
    --ai-terminal-run-tone: var(--kb-status-warn-soft);
}

.ai-terminal-run .is-spinning {
    animation: kb-loading-spin 1s linear infinite;
}

/* 多带一层 .ai-terminal-run：上面 `.ai-terminal-run > span` 的 flex: 1 特异度更高，会把徽标撑满一整行 */
.ai-terminal-run > .ai-terminal-run-by {
    flex: 0 0 auto;
    padding: 0 5px;
    border-radius: 4px;
    font-size: 0.6875rem;
    line-height: 16px;
    background: var(--kb-accent);
    color: var(--kb-paper, #fbfaf5);
}

.ai-terminal-run-stop,
.ai-terminal-run-close {
    flex-shrink: 0;
    min-height: 0 !important;
    height: 24px;
    padding: 0 8px;
    border: 1px solid currentColor;
    border-radius: 6px;
    background: transparent;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

.ai-terminal-run-close {
    border: none;
    padding: 0 4px;
}

/* ── 输入提示弹层（摆在光标下一行） ── */
.ai-terminal-suggest {
    position: absolute;
    z-index: 4;
    width: min(420px, calc(100% - 8px));
    max-width: calc(100% - 8px);
    box-sizing: border-box;
    max-height: 260px;
    overflow-y: auto;
    border-radius: 8px;
    border: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.2));
    background: var(--kb-paper, #fbfaf5);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
    font-size: 0.8125rem;
}

.ai-terminal-suggest-item {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px 10px;
    cursor: pointer;
}

.ai-terminal-suggest-item.is-active {
    background: var(--kb-active-bg-strong);
}

.ai-terminal-suggest-item code {
    font-family: "SF Mono", Menlo, Monaco, Consolas, monospace;
    font-size: 0.75rem;
    background: transparent;
    padding: 0;
    color: var(--kb-ink, #2f2b24);
    word-break: break-all;
}

.ai-terminal-suggest-item span {
    font-size: 0.75rem;
    color: var(--kb-ink-muted, #827a6d);
}

.ai-terminal-suggest-item em {
    font-style: normal;
    margin-left: 6px;
    opacity: 0.8;
}

.ai-terminal-suggest-item em:only-child {
    margin-left: 0;
}

.ai-terminal-suggest-hint {
    position: sticky;
    bottom: 0;
    padding: 4px 10px;
    border-top: 1px solid var(--kb-paper-line, rgba(96, 84, 62, 0.15));
    background: var(--kb-paper, #fbfaf5);
    font-size: 0.6875rem;
    color: var(--kb-ink-muted, #827a6d);
}

.ai-terminal-command-input {
    font-family: "SF Mono", Menlo, Monaco, Consolas, monospace;
    font-size: 0.8125rem;
}
