reasonix 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -16
- package/README.zh-CN.md +50 -11
- package/dashboard/app.css +148 -1
- package/dashboard/app.js +226 -0
- package/dist/cli/index.js +538 -281
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.js +90 -64
- package/dist/index.js.map +1 -1
- package/package.json +113 -110
package/README.md
CHANGED
|
@@ -72,7 +72,26 @@ command list.
|
|
|
72
72
|
|
|
73
73
|
---
|
|
74
74
|
|
|
75
|
-
##
|
|
75
|
+
## At a glance
|
|
76
|
+
|
|
77
|
+
| | Reasonix | Claude Code | Cursor | Aider |
|
|
78
|
+
|------------------------------------|----------------|----------------|----------------|----------------|
|
|
79
|
+
| Backend | DeepSeek V4 | Anthropic | OpenAI / Anthropic | any |
|
|
80
|
+
| Cost / typical task | **~$0.001–0.005** | ~$0.05–0.50 | $20/mo + usage | varies |
|
|
81
|
+
| Where it runs | terminal | terminal + IDE | IDE (Electron) | terminal |
|
|
82
|
+
| License | **MIT** | closed | closed | Apache 2 |
|
|
83
|
+
| DeepSeek prefix-cache hit rate | **90.2%** | n/a | n/a | ~33% |
|
|
84
|
+
| Reviewable edits (no auto-write) | **yes** (`/apply`) | yes | partial | yes |
|
|
85
|
+
| MCP servers | **first-class**| first-class | — | — |
|
|
86
|
+
|
|
87
|
+
Numbers from `benchmarks/tau-bench-lite` (8 multi-turn coding tasks ×
|
|
88
|
+
3 repeats, live `deepseek-chat`). Same workload, sole variable is
|
|
89
|
+
prefix stability — committed transcripts in [`benchmarks/`](./benchmarks/).
|
|
90
|
+
The full feature comparison [is below](#why-reasonix-vs-cursor--claude-code--cline--aider).
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Web dashboard
|
|
76
95
|
|
|
77
96
|
Type `/dashboard` inside any session and Reasonix prints a localhost
|
|
78
97
|
URL with a one-time token. Open it for a 13-tab control surface that
|
|
@@ -98,15 +117,14 @@ keep alive.
|
|
|
98
117
|
|
|
99
118
|
Three things you'd come to Reasonix for, that nothing else combines:
|
|
100
119
|
|
|
101
|
-
- **
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
for a generic harness
|
|
108
|
-
panel
|
|
109
|
-
watch your bill not happen.
|
|
120
|
+
- **Cost economics that land in your bill.** DeepSeek V4 is ~30×
|
|
121
|
+
cheaper than Claude Sonnet per token. Cheap tokens alone isn't the
|
|
122
|
+
win — *cheap tokens with a 90%+ prefix-cache hit* is. Reasonix's
|
|
123
|
+
loop is engineered around append-only prompt growth so the
|
|
124
|
+
cache-stable prefix survives every tool call. The benchmarks
|
|
125
|
+
section verifies this end-to-end: 90.2% live cache hit, versus
|
|
126
|
+
32.8% for a generic harness on the same workload. The `/stats`
|
|
127
|
+
panel surfaces "vs Claude Sonnet 4.6" savings on every turn.
|
|
110
128
|
|
|
111
129
|
- **It lives in your terminal.** Pure CLI — no Electron, no VS Code
|
|
112
130
|
extension, no IDE plugin to wedge into your editor. Sits next to
|
|
@@ -136,6 +154,9 @@ Three things you'd come to Reasonix for, that nothing else combines:
|
|
|
136
154
|
| Cross-session cost dashboard | **yes** (`/stats`) | — | — | — | — |
|
|
137
155
|
| Sandbox boundary enforcement | **strict** (refuses `..` escape) | yes | partial | yes | partial |
|
|
138
156
|
|
|
157
|
+
<details>
|
|
158
|
+
<summary><strong>When reasonix is the wrong choice · DeepSeek/Anthropic-compat caveats · vs Aider/Cline/Continue</strong></summary>
|
|
159
|
+
|
|
139
160
|
### Pick something else when
|
|
140
161
|
|
|
141
162
|
- **You want multi-provider flexibility** (mix Claude / GPT / Gemini /
|
|
@@ -194,8 +215,8 @@ to.
|
|
|
194
215
|
|
|
195
216
|
Reasonix's loop was designed around byte-stable prefix from line one.
|
|
196
217
|
No markers, no breakpoints — append-only is the invariant. That's why
|
|
197
|
-
the same τ-bench workload lands at **
|
|
198
|
-
and **
|
|
218
|
+
the same τ-bench workload lands at **90.2% cache hit** on Reasonix
|
|
219
|
+
and **32.8%** on a cache-hostile baseline (committed transcripts;
|
|
199
220
|
benchmarks section below). At DeepSeek's pricing — $0.07/Mtok
|
|
200
221
|
uncached, ~$0.014/Mtok cached — the difference between 50% and 94%
|
|
201
222
|
hit is **roughly 2.5× on input cost alone**.
|
|
@@ -223,6 +244,8 @@ handful of DeepSeek-specific quirks generic loops don't handle:
|
|
|
223
244
|
> CLI — it's an agent CLI built around DeepSeek's specific cache
|
|
224
245
|
> mechanic and pricing model.
|
|
225
246
|
|
|
247
|
+
</details>
|
|
248
|
+
|
|
226
249
|
---
|
|
227
250
|
|
|
228
251
|
## `reasonix code` — pair programmer in your terminal
|
|
@@ -311,7 +334,7 @@ assistant
|
|
|
311
334
|
```
|
|
312
335
|
|
|
313
336
|
No allowlist gate — user-typed shell = explicit consent. 60s timeout,
|
|
314
|
-
32k char cap, survives session resume
|
|
337
|
+
32k char cap, survives session resume.
|
|
315
338
|
|
|
316
339
|
**`@path/to/file` — inline a file under "Referenced files."** Start
|
|
317
340
|
typing `@` and a picker appears (↑/↓ navigate, Tab/Enter to insert).
|
|
@@ -578,6 +601,9 @@ rendering, retries.
|
|
|
578
601
|
|
|
579
602
|
## Commands inside the session
|
|
580
603
|
|
|
604
|
+
<details>
|
|
605
|
+
<summary><strong>Slash command reference</strong> (click to expand)</summary>
|
|
606
|
+
|
|
581
607
|
**Core**
|
|
582
608
|
|
|
583
609
|
| command | what it does |
|
|
@@ -654,6 +680,8 @@ rendering, retries.
|
|
|
654
680
|
in-flight tool, rejects pending MCP requests)
|
|
655
681
|
- `y` / `n` on confirm prompts — hotkey accept / reject
|
|
656
682
|
|
|
683
|
+
</details>
|
|
684
|
+
|
|
657
685
|
---
|
|
658
686
|
|
|
659
687
|
## Sessions and safety nets
|
|
@@ -755,6 +783,9 @@ Supported transports: **stdio** (local command) and **HTTP+SSE**
|
|
|
755
783
|
|
|
756
784
|
## CLI reference
|
|
757
785
|
|
|
786
|
+
<details>
|
|
787
|
+
<summary><strong>Commands, flags, env vars</strong> (click to expand)</summary>
|
|
788
|
+
|
|
758
789
|
```bash
|
|
759
790
|
npx reasonix code [path] # coding mode scoped to path (default: cwd)
|
|
760
791
|
npx reasonix # chat (uses saved config)
|
|
@@ -794,10 +825,16 @@ export REASONIX_SEARCH=off # disable web_search / web_fetch
|
|
|
794
825
|
export REASONIX_UI=plain # disable live rows (ghosting workaround)
|
|
795
826
|
```
|
|
796
827
|
|
|
828
|
+
</details>
|
|
829
|
+
|
|
797
830
|
---
|
|
798
831
|
|
|
799
832
|
## Library usage
|
|
800
833
|
|
|
834
|
+
<details>
|
|
835
|
+
<summary><strong>Programmatic API — embed reasonix in your own Node project</strong> (click to expand)</summary>
|
|
836
|
+
|
|
837
|
+
|
|
801
838
|
```ts
|
|
802
839
|
import {
|
|
803
840
|
CacheFirstLoop,
|
|
@@ -842,6 +879,8 @@ callers who want the `reasonix code` loop wiring without the CLI
|
|
|
842
879
|
wrapper. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for
|
|
843
880
|
internals.
|
|
844
881
|
|
|
882
|
+
</details>
|
|
883
|
+
|
|
845
884
|
---
|
|
846
885
|
|
|
847
886
|
## Benchmarks — verify the cache-hit claim yourself
|
|
@@ -865,9 +904,9 @@ variable prefix stability:
|
|
|
865
904
|
|
|
866
905
|
| metric | baseline (cache-hostile) | Reasonix | delta |
|
|
867
906
|
|---|---:|---:|---:|
|
|
868
|
-
| cache hit |
|
|
869
|
-
| cost / task | $0.
|
|
870
|
-
| pass rate |
|
|
907
|
+
| cache hit | 32.8% | **90.2%** | +57.4 pp |
|
|
908
|
+
| cost / task | $0.000992 | $0.000593 | **−40%** |
|
|
909
|
+
| pass rate | 100% (24/24) | **100% (24/24)** | — |
|
|
871
910
|
|
|
872
911
|
**Reproduce without spending an API credit:**
|
|
873
912
|
|
package/README.zh-CN.md
CHANGED
|
@@ -69,7 +69,26 @@ Windows Terminal)。任何时候按 `Esc` 中断;`/help` 查看完整命令
|
|
|
69
69
|
|
|
70
70
|
---
|
|
71
71
|
|
|
72
|
-
##
|
|
72
|
+
## 一览
|
|
73
|
+
|
|
74
|
+
| | Reasonix | Claude Code | Cursor | Aider |
|
|
75
|
+
|----------------------------------|----------------|----------------|--------------------|-----------|
|
|
76
|
+
| 后端 | DeepSeek V4 | Anthropic | OpenAI / Anthropic | 任意 |
|
|
77
|
+
| 单任务成本 | **~$0.001–0.005** | ~$0.05–0.50 | $20/月 + 用量 | 不一 |
|
|
78
|
+
| 运行环境 | 终端 | 终端 + IDE | IDE (Electron) | 终端 |
|
|
79
|
+
| 协议 | **MIT** | 闭源 | 闭源 | Apache 2 |
|
|
80
|
+
| DeepSeek 前缀缓存命中率 | **90.2%** | n/a | n/a | ~33% |
|
|
81
|
+
| 编辑可审 (不自动落盘) | **支持** (`/apply`) | 支持 | 部分 | 支持 |
|
|
82
|
+
| MCP servers | **一等公民** | 一等公民 | — | — |
|
|
83
|
+
|
|
84
|
+
数据来自 `benchmarks/tau-bench-lite`(8 个多轮工具任务 × 3 次重放,
|
|
85
|
+
真实 `deepseek-chat`)。同一负载、唯一变量是前缀稳定性 ——
|
|
86
|
+
完整 transcript 提交在 [`benchmarks/`](./benchmarks/) 目录里。详细对比
|
|
87
|
+
见[下方](#为什么选-reasonixvs-cursor--claude-code--cline--aider)。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Web 控制台
|
|
73
92
|
|
|
74
93
|
会话内输入 `/dashboard`,Reasonix 会打印一个带一次性 token 的本地 URL。
|
|
75
94
|
浏览器打开后是一个 13 个面板的控制面 —— 与正在运行的 TUI 实时双向同步:
|
|
@@ -95,9 +114,8 @@ TUI 继续可用 —— 弹窗(shell 确认、plan 审阅、edit 闸门)会
|
|
|
95
114
|
- **成本节省落到账单上。** DeepSeek V4 的 token 单价大约是 Claude Sonnet
|
|
96
115
|
的 1/30。光便宜还不够 —— *便宜的 token 配上 90%+ 的前缀缓存命中*才是关键。
|
|
97
116
|
Reasonix 的循环按 append-only 增长设计,缓存稳定的前缀在每次工具调用之间
|
|
98
|
-
都活着,下面的 benchmark 章节端到端验证过:实测
|
|
99
|
-
框架只有
|
|
100
|
-
你可以亲眼看着账单不涨。
|
|
117
|
+
都活着,下面的 benchmark 章节端到端验证过:实测 90.2% 缓存命中,对照组通用
|
|
118
|
+
框架只有 32.8%。`/stats` 面板每轮都跟踪 "vs Claude Sonnet 4.6" 的节省额。
|
|
101
119
|
|
|
102
120
|
- **它住在终端里。** 纯 CLI —— 没有 Electron,没有 VS Code 插件,没有要
|
|
103
121
|
塞进编辑器的 IDE 插件。和 git、tmux、shell 历史并排。macOS / Linux /
|
|
@@ -123,6 +141,9 @@ TUI 继续可用 —— 弹窗(shell 确认、plan 审阅、edit 闸门)会
|
|
|
123
141
|
| 跨会话成本面板 | **支持**(`/stats`)| — | — | — | — |
|
|
124
142
|
| 沙箱边界强制 | **严格**(拒绝 `..` 逃逸)| 支持 | 部分 | 支持 | 部分 |
|
|
125
143
|
|
|
144
|
+
<details>
|
|
145
|
+
<summary><strong>什么时候 reasonix 不适合 · DeepSeek/Anthropic-compat 细节 · vs Aider/Cline/Continue</strong></summary>
|
|
146
|
+
|
|
126
147
|
### 这些情况下应该选别的
|
|
127
148
|
|
|
128
149
|
- **你想要多模型混用**(在一个工具里同时切 Claude / GPT / Gemini / 本地 Llama)。
|
|
@@ -175,9 +196,9 @@ loop 的 invariant 跟它现在对话的缓存机制不匹配。
|
|
|
175
196
|
|
|
176
197
|
Reasonix 的 loop 从第一行起就是按 byte-stable prefix 的不变量设计的。没有
|
|
177
198
|
marker、没有断点 —— append-only 就是 invariant。这就是为什么同一份 τ-bench
|
|
178
|
-
负载在 Reasonix 上是 **
|
|
179
|
-
**
|
|
180
|
-
单价 —— $0.07/Mtok 非缓存、约 $0.014/Mtok 缓存命中 ——
|
|
199
|
+
负载在 Reasonix 上是 **90.2% 缓存命中**、在 cache-hostile baseline 上是
|
|
200
|
+
**32.8%**(已 commit 的 transcript,见下面 benchmark 段)。按 DeepSeek 的
|
|
201
|
+
单价 —— $0.07/Mtok 非缓存、约 $0.014/Mtok 缓存命中 —— 33% 和 90% 命中之间
|
|
181
202
|
**仅 input 这一侧就大约是 2.5× 的差距**。
|
|
182
203
|
|
|
183
204
|
### "那 Aider / Cline / Continue 呢?"
|
|
@@ -200,6 +221,8 @@ byte-stability 的通用压缩 / 摘要模式。命中率落在和 baseline 同
|
|
|
200
221
|
> 不是"又一个 agent CLI",是**围绕 DeepSeek 具体的缓存机制和定价模型
|
|
201
222
|
> 设计的 agent CLI**。
|
|
202
223
|
|
|
224
|
+
</details>
|
|
225
|
+
|
|
203
226
|
---
|
|
204
227
|
|
|
205
228
|
## `reasonix code` — 终端里的结对编程
|
|
@@ -281,7 +304,7 @@ assistant
|
|
|
281
304
|
```
|
|
282
305
|
|
|
283
306
|
无白名单门 —— 用户主动输入的 shell 命令就是显式同意。60 秒超时、32k 字符
|
|
284
|
-
|
|
307
|
+
上限,会话恢复后依然保留。
|
|
285
308
|
|
|
286
309
|
**`@path/to/file` —— 内联一个文件作为 "Referenced files"。** 输入 `@`
|
|
287
310
|
弹出选择器(↑/↓ 切换、Tab/Enter 插入)。比让模型 `read_file` 后再问更省事:
|
|
@@ -517,6 +540,9 @@ MCP 工具走和原生工具一样的 Cache-First + 修复 + 上下文安全管
|
|
|
517
540
|
|
|
518
541
|
## 会话内命令
|
|
519
542
|
|
|
543
|
+
<details>
|
|
544
|
+
<summary><strong>斜杠命令清单</strong>(点击展开)</summary>
|
|
545
|
+
|
|
520
546
|
**核心**
|
|
521
547
|
|
|
522
548
|
| 命令 | 作用 |
|
|
@@ -592,6 +618,8 @@ MCP 工具走和原生工具一样的 Cache-First + 修复 + 上下文安全管
|
|
|
592
618
|
- `Esc` —— 中断当前轮(停 API 调用、取消进行中的工具、拒绝待响应的 MCP 请求)
|
|
593
619
|
- 确认弹窗里的 `y` / `n` —— 快捷接受 / 拒绝
|
|
594
620
|
|
|
621
|
+
</details>
|
|
622
|
+
|
|
595
623
|
---
|
|
596
624
|
|
|
597
625
|
## 会话与安全网
|
|
@@ -680,6 +708,9 @@ spec)。
|
|
|
680
708
|
|
|
681
709
|
## CLI 参考
|
|
682
710
|
|
|
711
|
+
<details>
|
|
712
|
+
<summary><strong>命令、flags、环境变量</strong>(点击展开)</summary>
|
|
713
|
+
|
|
683
714
|
```bash
|
|
684
715
|
npx reasonix code [path] # 编程模式,作用域 path(默认 cwd)
|
|
685
716
|
npx reasonix # 聊天(用已保存配置)
|
|
@@ -719,10 +750,16 @@ export REASONIX_SEARCH=off # 关闭 web_search / web_fetch
|
|
|
719
750
|
export REASONIX_UI=plain # 关闭实时行(鬼影绕开)
|
|
720
751
|
```
|
|
721
752
|
|
|
753
|
+
</details>
|
|
754
|
+
|
|
722
755
|
---
|
|
723
756
|
|
|
724
757
|
## 库用法
|
|
725
758
|
|
|
759
|
+
<details>
|
|
760
|
+
<summary><strong>程序化 API —— 在自己的 Node 项目里嵌入 reasonix</strong>(点击展开)</summary>
|
|
761
|
+
|
|
762
|
+
|
|
726
763
|
```ts
|
|
727
764
|
import {
|
|
728
765
|
CacheFirstLoop,
|
|
@@ -766,6 +803,8 @@ console.log(loop.stats.summary());
|
|
|
766
803
|
`reasonix code` 的 loop 接线、不要 CLI 包装。详见
|
|
767
804
|
[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
|
|
768
805
|
|
|
806
|
+
</details>
|
|
807
|
+
|
|
769
808
|
---
|
|
770
809
|
|
|
771
810
|
## 性能对比 —— 缓存命中率自己也能验证
|
|
@@ -787,9 +826,9 @@ console.log(loop.stats.summary());
|
|
|
787
826
|
|
|
788
827
|
| 指标 | 基线(缓存敌对) | Reasonix | 差值 |
|
|
789
828
|
|---|---:|---:|---:|
|
|
790
|
-
| 缓存命中 |
|
|
791
|
-
| 单任务成本 | $0.
|
|
792
|
-
| 通过率 |
|
|
829
|
+
| 缓存命中 | 32.8% | **90.2%** | +57.4 pp |
|
|
830
|
+
| 单任务成本 | $0.000992 | $0.000593 | **−40%** |
|
|
831
|
+
| 通过率 | 100% (24/24) | **100% (24/24)** | — |
|
|
793
832
|
|
|
794
833
|
**无需消耗 API 额度即可复现:**
|
|
795
834
|
|
package/dashboard/app.css
CHANGED
|
@@ -665,7 +665,8 @@ button:disabled {
|
|
|
665
665
|
}
|
|
666
666
|
|
|
667
667
|
input[type="text"],
|
|
668
|
-
input[type="search"]
|
|
668
|
+
input[type="search"],
|
|
669
|
+
input[type="number"] {
|
|
669
670
|
background: var(--bg-2);
|
|
670
671
|
border: 1px solid var(--border);
|
|
671
672
|
color: var(--fg-0);
|
|
@@ -678,6 +679,7 @@ input[type="search"] {
|
|
|
678
679
|
|
|
679
680
|
input[type="text"]:focus,
|
|
680
681
|
input[type="search"]:focus,
|
|
682
|
+
input[type="number"]:focus,
|
|
681
683
|
input[type="password"]:focus {
|
|
682
684
|
border-color: var(--primary);
|
|
683
685
|
outline: none;
|
|
@@ -712,7 +714,15 @@ select:focus {
|
|
|
712
714
|
textarea {
|
|
713
715
|
background: var(--bg-2);
|
|
714
716
|
color: var(--fg-0);
|
|
717
|
+
border: 1px solid var(--border);
|
|
718
|
+
border-radius: var(--radius-sm);
|
|
719
|
+
padding: 8px 10px;
|
|
715
720
|
font-family: var(--mono);
|
|
721
|
+
font-size: 12px;
|
|
722
|
+
line-height: 1.5;
|
|
723
|
+
resize: vertical;
|
|
724
|
+
width: 100%;
|
|
725
|
+
box-sizing: border-box;
|
|
716
726
|
}
|
|
717
727
|
textarea:focus {
|
|
718
728
|
border-color: var(--primary);
|
|
@@ -2538,3 +2548,140 @@ code,
|
|
|
2538
2548
|
border: 1px dashed var(--border);
|
|
2539
2549
|
border-radius: var(--radius-md);
|
|
2540
2550
|
}
|
|
2551
|
+
|
|
2552
|
+
/* ---------- Excludes settings (Semantic tab) ---------- */
|
|
2553
|
+
|
|
2554
|
+
.excludes-toggle {
|
|
2555
|
+
margin: 24px 0 12px;
|
|
2556
|
+
display: flex;
|
|
2557
|
+
align-items: baseline;
|
|
2558
|
+
gap: 10px;
|
|
2559
|
+
cursor: pointer;
|
|
2560
|
+
user-select: none;
|
|
2561
|
+
}
|
|
2562
|
+
.excludes-toggle:hover {
|
|
2563
|
+
color: var(--primary);
|
|
2564
|
+
}
|
|
2565
|
+
.excludes-toggle .caret {
|
|
2566
|
+
font-size: 11px;
|
|
2567
|
+
color: var(--fg-3);
|
|
2568
|
+
width: 10px;
|
|
2569
|
+
display: inline-block;
|
|
2570
|
+
}
|
|
2571
|
+
.excludes-toggle .label {
|
|
2572
|
+
font-size: 11px;
|
|
2573
|
+
letter-spacing: 0.1em;
|
|
2574
|
+
text-transform: uppercase;
|
|
2575
|
+
color: var(--fg-3);
|
|
2576
|
+
}
|
|
2577
|
+
.excludes-toggle:hover .label,
|
|
2578
|
+
.excludes-toggle:hover .caret {
|
|
2579
|
+
color: var(--primary);
|
|
2580
|
+
}
|
|
2581
|
+
.excludes-toggle .hint {
|
|
2582
|
+
font-size: 12px;
|
|
2583
|
+
color: var(--fg-3);
|
|
2584
|
+
font-weight: normal;
|
|
2585
|
+
}
|
|
2586
|
+
|
|
2587
|
+
.excludes-card {
|
|
2588
|
+
font-size: 13px;
|
|
2589
|
+
display: flex;
|
|
2590
|
+
flex-direction: column;
|
|
2591
|
+
gap: 12px;
|
|
2592
|
+
}
|
|
2593
|
+
.excludes-card .lead {
|
|
2594
|
+
color: var(--fg-2);
|
|
2595
|
+
font-size: 12px;
|
|
2596
|
+
line-height: 1.5;
|
|
2597
|
+
}
|
|
2598
|
+
.excludes-grid {
|
|
2599
|
+
display: grid;
|
|
2600
|
+
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
2601
|
+
gap: 14px;
|
|
2602
|
+
}
|
|
2603
|
+
.excludes-field label {
|
|
2604
|
+
display: block;
|
|
2605
|
+
font-size: 12px;
|
|
2606
|
+
color: var(--fg-2);
|
|
2607
|
+
margin-bottom: 4px;
|
|
2608
|
+
font-weight: 500;
|
|
2609
|
+
}
|
|
2610
|
+
.excludes-field textarea {
|
|
2611
|
+
min-height: 90px;
|
|
2612
|
+
}
|
|
2613
|
+
.excludes-options {
|
|
2614
|
+
display: flex;
|
|
2615
|
+
flex-wrap: wrap;
|
|
2616
|
+
gap: 18px;
|
|
2617
|
+
align-items: center;
|
|
2618
|
+
padding-top: 4px;
|
|
2619
|
+
font-size: 12px;
|
|
2620
|
+
color: var(--fg-1);
|
|
2621
|
+
}
|
|
2622
|
+
.excludes-options label {
|
|
2623
|
+
display: inline-flex;
|
|
2624
|
+
align-items: center;
|
|
2625
|
+
gap: 6px;
|
|
2626
|
+
}
|
|
2627
|
+
.excludes-options input[type="number"] {
|
|
2628
|
+
width: 110px;
|
|
2629
|
+
}
|
|
2630
|
+
.excludes-actions {
|
|
2631
|
+
display: flex;
|
|
2632
|
+
gap: 10px;
|
|
2633
|
+
flex-wrap: wrap;
|
|
2634
|
+
margin-top: 4px;
|
|
2635
|
+
}
|
|
2636
|
+
|
|
2637
|
+
.excludes-preview {
|
|
2638
|
+
margin-top: 4px;
|
|
2639
|
+
padding-top: 12px;
|
|
2640
|
+
border-top: 1px solid var(--border);
|
|
2641
|
+
font-size: 12px;
|
|
2642
|
+
display: flex;
|
|
2643
|
+
flex-direction: column;
|
|
2644
|
+
gap: 8px;
|
|
2645
|
+
}
|
|
2646
|
+
.excludes-preview .summary {
|
|
2647
|
+
font-size: 13px;
|
|
2648
|
+
color: var(--fg-1);
|
|
2649
|
+
}
|
|
2650
|
+
.excludes-preview details {
|
|
2651
|
+
background: var(--bg-2);
|
|
2652
|
+
border: 1px solid var(--border);
|
|
2653
|
+
border-radius: var(--radius-sm);
|
|
2654
|
+
padding: 6px 10px;
|
|
2655
|
+
}
|
|
2656
|
+
.excludes-preview details[open] {
|
|
2657
|
+
background: var(--bg-3);
|
|
2658
|
+
}
|
|
2659
|
+
.excludes-preview summary {
|
|
2660
|
+
cursor: pointer;
|
|
2661
|
+
color: var(--fg-1);
|
|
2662
|
+
font-weight: 500;
|
|
2663
|
+
}
|
|
2664
|
+
.excludes-preview summary:hover {
|
|
2665
|
+
color: var(--primary);
|
|
2666
|
+
}
|
|
2667
|
+
.excludes-preview ul {
|
|
2668
|
+
margin: 6px 0 0 16px;
|
|
2669
|
+
padding: 0;
|
|
2670
|
+
font-size: 11.5px;
|
|
2671
|
+
color: var(--fg-2);
|
|
2672
|
+
}
|
|
2673
|
+
.excludes-preview li {
|
|
2674
|
+
margin: 2px 0;
|
|
2675
|
+
}
|
|
2676
|
+
.excludes-preview li code {
|
|
2677
|
+
font-size: 11.5px;
|
|
2678
|
+
background: transparent;
|
|
2679
|
+
padding: 0;
|
|
2680
|
+
color: var(--fg-1);
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
.skip-buckets {
|
|
2684
|
+
margin-top: 4px;
|
|
2685
|
+
font-size: 12px;
|
|
2686
|
+
color: var(--fg-2);
|
|
2687
|
+
}
|