@co0ontty/wand 1.30.3 → 1.31.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 +39 -2
- package/dist/claude-sdk-runner.d.ts +31 -0
- package/dist/claude-sdk-runner.js +142 -0
- package/dist/cli.js +104 -0
- package/dist/git-quick-commit.js +18 -26
- package/dist/process-manager.d.ts +7 -0
- package/dist/process-manager.js +26 -2
- package/dist/prompt-optimizer.js +17 -26
- package/dist/server-session-routes.js +27 -1
- package/dist/server.js +1 -0
- package/dist/structured-session-manager.d.ts +2 -0
- package/dist/structured-session-manager.js +21 -3
- package/dist/tui/attach.js +7 -8
- package/dist/tui/commands.d.ts +24 -7
- package/dist/tui/commands.js +200 -86
- package/dist/tui/index.js +8 -8
- package/dist/tui/service-panel.js +3 -4
- package/dist/types.d.ts +2 -0
- package/dist/web-ui/content/scripts.js +250 -53
- package/dist/web-ui/content/styles.css +345 -109
- package/package.json +1 -1
|
@@ -3906,12 +3906,16 @@
|
|
|
3906
3906
|
}
|
|
3907
3907
|
|
|
3908
3908
|
/* ===== 聊天消息基础样式 ===== */
|
|
3909
|
+
/* 消息整体宽度跟随屏幕(容器)宽度——长文本自然换行;
|
|
3910
|
+
内部卡片(tool-use-card / inline-tool / terminal-tool / diff-tool / tool-group)
|
|
3911
|
+
通过 --chat-card-max-width 单独约束,避免在宽屏下被拉成横向大条。 */
|
|
3909
3912
|
.chat-message {
|
|
3910
3913
|
display: flex;
|
|
3911
3914
|
flex-direction: column;
|
|
3912
|
-
max-width:
|
|
3915
|
+
max-width: 100%;
|
|
3913
3916
|
margin: 4px 0;
|
|
3914
3917
|
transition: opacity 0.2s ease, transform 0.2s var(--ease-out-expo);
|
|
3918
|
+
--chat-card-max-width: 720px;
|
|
3915
3919
|
}
|
|
3916
3920
|
|
|
3917
3921
|
.chat-message:hover {
|
|
@@ -3936,12 +3940,13 @@
|
|
|
3936
3940
|
|
|
3937
3941
|
.chat-message.assistant {
|
|
3938
3942
|
align-self: flex-start;
|
|
3939
|
-
max-width:
|
|
3943
|
+
max-width: 100%;
|
|
3944
|
+
width: 100%;
|
|
3940
3945
|
}
|
|
3941
3946
|
|
|
3942
3947
|
.chat-message.system-info {
|
|
3943
3948
|
align-self: center;
|
|
3944
|
-
max-width:
|
|
3949
|
+
max-width: 100%;
|
|
3945
3950
|
width: 100%;
|
|
3946
3951
|
margin: 10px 0;
|
|
3947
3952
|
animation: messageFloat 3s ease-in-out infinite;
|
|
@@ -4080,8 +4085,10 @@
|
|
|
4080
4085
|
box-shadow: 0 4px 16px rgba(197, 101, 61, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
|
|
4081
4086
|
}
|
|
4082
4087
|
|
|
4088
|
+
/* 用户消息默认更紧凑(贴右气泡),上限放宽到 100% 让长 prompt 不再水平
|
|
4089
|
+
挤压;实际宽度由气泡内容 + word-break 决定。 */
|
|
4083
4090
|
.chat-message.user {
|
|
4084
|
-
max-width:
|
|
4091
|
+
max-width: 100%;
|
|
4085
4092
|
}
|
|
4086
4093
|
|
|
4087
4094
|
/* 助手消息气泡 */
|
|
@@ -4129,7 +4136,7 @@
|
|
|
4129
4136
|
display: flex;
|
|
4130
4137
|
flex-direction: column;
|
|
4131
4138
|
gap: 6px;
|
|
4132
|
-
max-width:
|
|
4139
|
+
max-width: 100%;
|
|
4133
4140
|
}
|
|
4134
4141
|
/* user turn 默认 align-self: flex-end(右对齐);多段渲染时强制
|
|
4135
4142
|
容器内左对齐,否则 subagent 段会被推到右边,border-left 色条断裂。 */
|
|
@@ -4232,7 +4239,10 @@
|
|
|
4232
4239
|
background: rgba(0, 0, 0, 0.04);
|
|
4233
4240
|
padding: 10px 12px;
|
|
4234
4241
|
border-radius: 6px;
|
|
4235
|
-
overflow-x:
|
|
4242
|
+
overflow-x: hidden;
|
|
4243
|
+
white-space: pre-wrap;
|
|
4244
|
+
word-break: break-word;
|
|
4245
|
+
overflow-wrap: anywhere;
|
|
4236
4246
|
margin: 8px 0;
|
|
4237
4247
|
}
|
|
4238
4248
|
|
|
@@ -4345,7 +4355,7 @@
|
|
|
4345
4355
|
/* Thinking Card (Deep Thought) */
|
|
4346
4356
|
.chat-message.thinking {
|
|
4347
4357
|
align-self: flex-start;
|
|
4348
|
-
max-width:
|
|
4358
|
+
max-width: 100%;
|
|
4349
4359
|
margin: 4px 0;
|
|
4350
4360
|
}
|
|
4351
4361
|
|
|
@@ -4384,7 +4394,7 @@
|
|
|
4384
4394
|
/* Prompt Suggestion Card (Pulsing) */
|
|
4385
4395
|
.chat-message.prompt {
|
|
4386
4396
|
align-self: center;
|
|
4387
|
-
max-width:
|
|
4397
|
+
max-width: 100%;
|
|
4388
4398
|
margin: 4px 0;
|
|
4389
4399
|
}
|
|
4390
4400
|
|
|
@@ -4467,6 +4477,7 @@
|
|
|
4467
4477
|
border-radius: var(--radius-sm);
|
|
4468
4478
|
overflow: hidden;
|
|
4469
4479
|
width: 100%;
|
|
4480
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
4470
4481
|
box-sizing: border-box;
|
|
4471
4482
|
background: linear-gradient(180deg, rgba(255, 251, 245, 0.88) 0%, rgba(255, 246, 234, 0.72) 100%);
|
|
4472
4483
|
box-shadow: 0 1px 2px rgba(89, 58, 32, 0.04);
|
|
@@ -4874,6 +4885,9 @@
|
|
|
4874
4885
|
align-items: baseline;
|
|
4875
4886
|
gap: 5px;
|
|
4876
4887
|
margin: 2px 0;
|
|
4888
|
+
width: 100%;
|
|
4889
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
4890
|
+
box-sizing: border-box;
|
|
4877
4891
|
padding: 3px 8px;
|
|
4878
4892
|
border-radius: 6px;
|
|
4879
4893
|
background: rgba(138, 108, 178, 0.04);
|
|
@@ -4981,6 +4995,9 @@
|
|
|
4981
4995
|
────────────────────────────────────────────────────────────── */
|
|
4982
4996
|
.tool-group {
|
|
4983
4997
|
margin: 4px 0;
|
|
4998
|
+
width: 100%;
|
|
4999
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
5000
|
+
box-sizing: border-box;
|
|
4984
5001
|
border-radius: var(--radius-sm);
|
|
4985
5002
|
border: 1px solid var(--border-subtle);
|
|
4986
5003
|
background: linear-gradient(180deg, rgba(255, 251, 245, 0.85) 0%, rgba(255, 248, 238, 0.7) 100%);
|
|
@@ -5106,10 +5123,17 @@
|
|
|
5106
5123
|
display: flex;
|
|
5107
5124
|
flex-direction: column;
|
|
5108
5125
|
margin: 1px 0;
|
|
5126
|
+
width: 100%;
|
|
5127
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
5128
|
+
box-sizing: border-box;
|
|
5109
5129
|
border-radius: var(--radius-xs);
|
|
5110
5130
|
cursor: pointer;
|
|
5111
5131
|
transition: background 0.16s ease;
|
|
5112
5132
|
}
|
|
5133
|
+
/* 嵌套在 tool-group-body 里的 inline-tool 撑满父容器即可(父已经限宽) */
|
|
5134
|
+
.tool-group-body > .inline-tool {
|
|
5135
|
+
max-width: 100%;
|
|
5136
|
+
}
|
|
5113
5137
|
.inline-tool-row {
|
|
5114
5138
|
display: flex;
|
|
5115
5139
|
align-items: center;
|
|
@@ -5293,6 +5317,9 @@
|
|
|
5293
5317
|
────────────────────────────────────────────────────────────── */
|
|
5294
5318
|
.inline-terminal {
|
|
5295
5319
|
margin: 4px 0;
|
|
5320
|
+
width: 100%;
|
|
5321
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
5322
|
+
box-sizing: border-box;
|
|
5296
5323
|
border: 1px solid rgba(15, 12, 9, 0.6);
|
|
5297
5324
|
border-radius: var(--radius-sm);
|
|
5298
5325
|
background: #1f1b17;
|
|
@@ -5453,6 +5480,9 @@
|
|
|
5453
5480
|
────────────────────────────────────────────────────────────── */
|
|
5454
5481
|
.inline-diff {
|
|
5455
5482
|
margin: 4px 0;
|
|
5483
|
+
width: 100%;
|
|
5484
|
+
max-width: var(--chat-card-max-width, 720px);
|
|
5485
|
+
box-sizing: border-box;
|
|
5456
5486
|
border: 1px solid var(--border-subtle);
|
|
5457
5487
|
border-radius: var(--radius-sm);
|
|
5458
5488
|
overflow: hidden;
|
|
@@ -5678,7 +5708,12 @@
|
|
|
5678
5708
|
|
|
5679
5709
|
/* Markdown Content */
|
|
5680
5710
|
.markdown-content { color: inherit; white-space: normal; overflow-x: hidden; }
|
|
5681
|
-
.markdown-content .code-block pre {
|
|
5711
|
+
.markdown-content .code-block pre {
|
|
5712
|
+
overflow-x: hidden;
|
|
5713
|
+
white-space: pre-wrap;
|
|
5714
|
+
word-break: break-word;
|
|
5715
|
+
overflow-wrap: anywhere;
|
|
5716
|
+
}
|
|
5682
5717
|
.markdown-content p { margin: 0 0 8px 0; }
|
|
5683
5718
|
.markdown-content p:last-child { margin-bottom: 0; }
|
|
5684
5719
|
.markdown-content strong { font-weight: 600; }
|
|
@@ -5790,7 +5825,10 @@
|
|
|
5790
5825
|
.markdown-content pre {
|
|
5791
5826
|
margin: 0;
|
|
5792
5827
|
padding: 12px;
|
|
5793
|
-
overflow-x:
|
|
5828
|
+
overflow-x: hidden;
|
|
5829
|
+
white-space: pre-wrap;
|
|
5830
|
+
word-break: break-word;
|
|
5831
|
+
overflow-wrap: anywhere;
|
|
5794
5832
|
}
|
|
5795
5833
|
.markdown-content pre code {
|
|
5796
5834
|
font-family: var(--font-mono);
|
|
@@ -5842,14 +5880,42 @@
|
|
|
5842
5880
|
align-items: center;
|
|
5843
5881
|
justify-content: space-between;
|
|
5844
5882
|
padding: 2px 4px 3px 6px;
|
|
5845
|
-
gap:
|
|
5883
|
+
gap: 3px;
|
|
5846
5884
|
}
|
|
5847
5885
|
.input-composer-left {
|
|
5848
5886
|
display: flex;
|
|
5849
5887
|
align-items: center;
|
|
5850
|
-
gap:
|
|
5888
|
+
gap: 3px;
|
|
5851
5889
|
flex-wrap: nowrap;
|
|
5852
5890
|
flex-shrink: 0;
|
|
5891
|
+
min-width: 0;
|
|
5892
|
+
}
|
|
5893
|
+
/* 会话设置三件套 (mode / model / thinking) 的容器 —— 用极轻的内描边视觉地
|
|
5894
|
+
把三颗"新会话/会话级配置 pill"框成一个 segmented control,与右侧
|
|
5895
|
+
开关型 chip (自动批准 / 终端交互) 在认知上分层。 */
|
|
5896
|
+
.composer-pill-group {
|
|
5897
|
+
display: inline-flex;
|
|
5898
|
+
align-items: center;
|
|
5899
|
+
gap: 2px;
|
|
5900
|
+
padding: 1px;
|
|
5901
|
+
border-radius: 11px;
|
|
5902
|
+
background: rgba(197, 101, 61, 0.05);
|
|
5903
|
+
box-shadow: inset 0 0 0 1px rgba(197, 101, 61, 0.08);
|
|
5904
|
+
min-width: 0;
|
|
5905
|
+
}
|
|
5906
|
+
.composer-pill-group .composer-pill {
|
|
5907
|
+
border-color: transparent;
|
|
5908
|
+
background: transparent;
|
|
5909
|
+
}
|
|
5910
|
+
.composer-pill-group .composer-pill:hover {
|
|
5911
|
+
border-color: var(--accent);
|
|
5912
|
+
background-color: rgba(255, 255, 255, 0.75);
|
|
5913
|
+
}
|
|
5914
|
+
.composer-pill-group .composer-pill:focus,
|
|
5915
|
+
.composer-pill-group .composer-pill:focus-visible,
|
|
5916
|
+
.composer-pill-group .composer-pill:focus-within {
|
|
5917
|
+
border-color: var(--accent);
|
|
5918
|
+
background-color: rgba(255, 255, 255, 0.9);
|
|
5853
5919
|
}
|
|
5854
5920
|
|
|
5855
5921
|
/* Permission actions inline in composer bar */
|
|
@@ -5913,28 +5979,16 @@
|
|
|
5913
5979
|
to { opacity: 1; transform: translateX(0); }
|
|
5914
5980
|
}
|
|
5915
5981
|
|
|
5916
|
-
/*
|
|
5917
|
-
|
|
5918
|
-
display: inline-flex;
|
|
5919
|
-
align-items: center;
|
|
5920
|
-
gap: 2px;
|
|
5921
|
-
font-size: 0.65rem;
|
|
5922
|
-
color: var(--muted);
|
|
5923
|
-
cursor: pointer;
|
|
5924
|
-
padding: 1px 4px;
|
|
5925
|
-
border-radius: 4px;
|
|
5926
|
-
transition: color 0.15s, background 0.15s;
|
|
5927
|
-
user-select: none;
|
|
5928
|
-
white-space: nowrap;
|
|
5929
|
-
}
|
|
5930
|
-
.auto-approve-indicator:hover {
|
|
5931
|
-
background: rgba(255, 255, 255, 0.06);
|
|
5932
|
-
}
|
|
5982
|
+
/* 自动批准 chip —— 套用 .composer-pill .composer-pill-chip 的基础外观,
|
|
5983
|
+
这里只覆盖 active 态的绿色(语义色)。 */
|
|
5933
5984
|
.auto-approve-indicator.active {
|
|
5934
5985
|
color: #22c55e;
|
|
5986
|
+
border-color: rgba(34, 197, 94, 0.5);
|
|
5987
|
+
background: rgba(34, 197, 94, 0.12);
|
|
5935
5988
|
}
|
|
5936
5989
|
.auto-approve-indicator.active:hover {
|
|
5937
|
-
background: rgba(34, 197, 94, 0.
|
|
5990
|
+
background: rgba(34, 197, 94, 0.2);
|
|
5991
|
+
border-color: #22c55e;
|
|
5938
5992
|
}
|
|
5939
5993
|
|
|
5940
5994
|
/* Approval stats badge */
|
|
@@ -5947,24 +6001,27 @@
|
|
|
5947
6001
|
display: none;
|
|
5948
6002
|
}
|
|
5949
6003
|
.approval-stats-divider {
|
|
5950
|
-
|
|
6004
|
+
/* 同行已经全部用 .composer-pill 的统一 gap (3px) 分隔,再加一条 1px 实线分隔
|
|
6005
|
+
反而显得拥挤。仅保留极细的 spacer 让 stats badge 与左侧 chip 不黏连。 */
|
|
6006
|
+
width: 0;
|
|
5951
6007
|
height: 16px;
|
|
5952
|
-
|
|
5953
|
-
margin: 0 4px 0 2px;
|
|
6008
|
+
margin: 0 1px;
|
|
5954
6009
|
}
|
|
5955
6010
|
.approval-stats-badge {
|
|
5956
6011
|
display: inline-flex;
|
|
5957
6012
|
align-items: center;
|
|
5958
6013
|
gap: 3px;
|
|
5959
|
-
|
|
6014
|
+
min-height: 22px;
|
|
6015
|
+
padding: 1px 8px;
|
|
5960
6016
|
border-radius: 10px;
|
|
5961
6017
|
background: rgba(34, 197, 94, 0.1);
|
|
5962
6018
|
color: #22c55e;
|
|
5963
|
-
font-size: 0.
|
|
6019
|
+
font-size: 0.625rem;
|
|
5964
6020
|
font-weight: 600;
|
|
5965
6021
|
cursor: default;
|
|
5966
6022
|
transition: background 0.15s;
|
|
5967
|
-
line-height: 1
|
|
6023
|
+
line-height: 1;
|
|
6024
|
+
box-sizing: border-box;
|
|
5968
6025
|
}
|
|
5969
6026
|
.approval-stats-badge:hover {
|
|
5970
6027
|
background: rgba(34, 197, 94, 0.18);
|
|
@@ -6045,31 +6102,11 @@
|
|
|
6045
6102
|
color: #22c55e;
|
|
6046
6103
|
}
|
|
6047
6104
|
|
|
6105
|
+
/* 终端交互切换按钮 —— 现在套用 .composer-pill .composer-pill-chip 的统一外观,
|
|
6106
|
+
这里仅保留图标专属的微调(字体大小 / 收紧 padding 让 ⌨ 居中)。 */
|
|
6048
6107
|
.composer-interactive-toggle {
|
|
6049
|
-
display: inline-flex;
|
|
6050
|
-
align-items: center;
|
|
6051
|
-
justify-content: center;
|
|
6052
|
-
width: 22px;
|
|
6053
|
-
height: 22px;
|
|
6054
|
-
border: 1px solid var(--border-subtle);
|
|
6055
|
-
border-radius: 4px;
|
|
6056
|
-
background: transparent;
|
|
6057
|
-
color: var(--text-muted);
|
|
6058
6108
|
font-size: 0.75rem;
|
|
6059
|
-
|
|
6060
|
-
transition: all var(--transition-fast);
|
|
6061
|
-
flex-shrink: 0;
|
|
6062
|
-
padding: 0;
|
|
6063
|
-
}
|
|
6064
|
-
.composer-interactive-toggle:hover {
|
|
6065
|
-
background: rgba(197, 101, 61, 0.08);
|
|
6066
|
-
color: var(--text-secondary);
|
|
6067
|
-
border-color: var(--accent);
|
|
6068
|
-
}
|
|
6069
|
-
.composer-interactive-toggle.active {
|
|
6070
|
-
background: rgba(197, 101, 61, 0.12);
|
|
6071
|
-
color: var(--accent);
|
|
6072
|
-
border-color: var(--accent);
|
|
6109
|
+
padding: 1px 8px;
|
|
6073
6110
|
}
|
|
6074
6111
|
.input-composer-right {
|
|
6075
6112
|
display: flex;
|
|
@@ -6079,52 +6116,79 @@
|
|
|
6079
6116
|
flex: 1;
|
|
6080
6117
|
justify-content: flex-end;
|
|
6081
6118
|
}
|
|
6119
|
+
/* 队列计数器:v1.30.3 是个 0.625rem 的小角标,挤在 input-hint 旁边没人看见。
|
|
6120
|
+
升级成 dot + label 的 pill,配色和"立即发送"按钮同源,让用户能联想到这套语义。 */
|
|
6082
6121
|
.queue-counter {
|
|
6083
|
-
|
|
6122
|
+
display: inline-flex;
|
|
6123
|
+
align-items: center;
|
|
6124
|
+
gap: 5px;
|
|
6125
|
+
font-size: 0.6875rem;
|
|
6084
6126
|
color: var(--accent);
|
|
6085
|
-
background:
|
|
6086
|
-
padding:
|
|
6087
|
-
border-radius:
|
|
6127
|
+
background: linear-gradient(180deg, rgba(197, 101, 61, 0.18) 0%, rgba(197, 101, 61, 0.10) 100%);
|
|
6128
|
+
padding: 3px 9px;
|
|
6129
|
+
border-radius: 999px;
|
|
6088
6130
|
white-space: nowrap;
|
|
6089
6131
|
font-weight: 600;
|
|
6132
|
+
letter-spacing: 0.02em;
|
|
6133
|
+
box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.25) inset;
|
|
6090
6134
|
animation: queuePulse 1.5s ease-in-out infinite;
|
|
6091
6135
|
}
|
|
6092
6136
|
.queue-counter.hidden { display: none; }
|
|
6137
|
+
.queue-counter-dot {
|
|
6138
|
+
width: 6px;
|
|
6139
|
+
height: 6px;
|
|
6140
|
+
border-radius: 50%;
|
|
6141
|
+
background: var(--accent);
|
|
6142
|
+
flex-shrink: 0;
|
|
6143
|
+
animation: queueDotPulse 1.0s ease-in-out infinite;
|
|
6144
|
+
}
|
|
6145
|
+
.queue-counter-text { line-height: 1; }
|
|
6093
6146
|
@keyframes queuePulse {
|
|
6094
6147
|
0%, 100% { opacity: 1; }
|
|
6095
|
-
50%
|
|
6148
|
+
50% { opacity: 0.78; }
|
|
6149
|
+
}
|
|
6150
|
+
@keyframes queueDotPulse {
|
|
6151
|
+
0%, 100% { transform: scale(1); opacity: 1; }
|
|
6152
|
+
50% { transform: scale(0.7); opacity: 0.55; }
|
|
6096
6153
|
}
|
|
6097
6154
|
|
|
6098
|
-
/* Queued message in chat view
|
|
6155
|
+
/* Queued message in chat view:用户最容易"觉得排队没生效"是因为旧版徽章太小。
|
|
6156
|
+
把气泡本身做出明显的"半成稿"质感(虚线边框 + 错位阴影),徽章放大到正常字号,
|
|
6157
|
+
让排队这件事在视觉上和"已发出"清楚拉开。 */
|
|
6099
6158
|
.chat-message.user.queued {
|
|
6100
|
-
opacity: 0.
|
|
6159
|
+
opacity: 0.92;
|
|
6101
6160
|
}
|
|
6102
6161
|
.chat-message.user.queued .chat-message-bubble,
|
|
6103
6162
|
.chat-message.user.queued .chat-message-content {
|
|
6104
|
-
|
|
6105
|
-
|
|
6163
|
+
box-shadow: 0 0 0 1.5px rgba(197, 101, 61, 0.55) inset,
|
|
6164
|
+
0 1px 0 rgba(197, 101, 61, 0.10);
|
|
6165
|
+
background: linear-gradient(180deg, rgba(255, 245, 235, 0.85) 0%, rgba(255, 235, 220, 0.65) 100%);
|
|
6166
|
+
border-radius: 14px;
|
|
6167
|
+
position: relative;
|
|
6106
6168
|
}
|
|
6107
6169
|
.queued-badge {
|
|
6108
6170
|
display: inline-flex;
|
|
6109
6171
|
align-items: center;
|
|
6110
|
-
gap:
|
|
6111
|
-
font-size: 0.
|
|
6112
|
-
color:
|
|
6113
|
-
background: var(--accent
|
|
6114
|
-
padding:
|
|
6172
|
+
gap: 5px;
|
|
6173
|
+
font-size: 0.75rem;
|
|
6174
|
+
color: #fff;
|
|
6175
|
+
background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
|
|
6176
|
+
padding: 3px 10px 3px 9px;
|
|
6115
6177
|
border-radius: 999px;
|
|
6116
6178
|
font-weight: 600;
|
|
6117
6179
|
margin-top: 6px;
|
|
6118
6180
|
letter-spacing: 0.04em;
|
|
6181
|
+
box-shadow: 0 2px 6px rgba(197, 101, 61, 0.30);
|
|
6119
6182
|
animation: queuePulse 1.5s ease-in-out infinite;
|
|
6120
6183
|
}
|
|
6121
6184
|
.queued-badge::before {
|
|
6122
6185
|
content: '';
|
|
6123
|
-
width:
|
|
6124
|
-
height:
|
|
6186
|
+
width: 7px;
|
|
6187
|
+
height: 7px;
|
|
6125
6188
|
border-radius: 50%;
|
|
6126
|
-
background:
|
|
6127
|
-
|
|
6189
|
+
background: #fff;
|
|
6190
|
+
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.45);
|
|
6191
|
+
animation: queueDotPulse 1.0s ease-in-out infinite;
|
|
6128
6192
|
}
|
|
6129
6193
|
|
|
6130
6194
|
.input-hint {
|
|
@@ -6831,36 +6895,125 @@
|
|
|
6831
6895
|
.input-inline-controls {
|
|
6832
6896
|
}
|
|
6833
6897
|
|
|
6834
|
-
/*
|
|
6835
|
-
|
|
6898
|
+
/* ========================================================================
|
|
6899
|
+
输入框统一 pill 系统 —— 模式 / 模型 / 思考 / 自动批准 / 终端交互
|
|
6900
|
+
全部用同一套尺寸 / 字号 / 边框 / hover / focus 表现,避免视觉混乱。
|
|
6901
|
+
变体:
|
|
6902
|
+
.composer-pill-select → 原生 <select> 形态(右侧 chevron)
|
|
6903
|
+
.composer-pill-chip → 按钮 / 切换状态的 chip(支持 .active 亮态)
|
|
6904
|
+
现有 .chat-mode-select / .auto-approve-indicator / .composer-interactive-toggle
|
|
6905
|
+
仍保留作为特定色彩或最大宽度等微调入口。
|
|
6906
|
+
====================================================================== */
|
|
6907
|
+
.composer-pill {
|
|
6836
6908
|
font-family: var(--font-sans);
|
|
6837
6909
|
font-size: 0.625rem;
|
|
6838
6910
|
font-weight: 500;
|
|
6839
|
-
|
|
6911
|
+
line-height: 1;
|
|
6912
|
+
min-height: 22px;
|
|
6913
|
+
padding: 1px 8px;
|
|
6840
6914
|
border-radius: 10px;
|
|
6841
6915
|
border: 1px solid var(--border-subtle);
|
|
6842
6916
|
background: rgba(246, 241, 232, 0.7);
|
|
6843
6917
|
color: var(--text-secondary);
|
|
6844
6918
|
cursor: pointer;
|
|
6845
6919
|
transition: all var(--transition-fast);
|
|
6846
|
-
|
|
6847
|
-
|
|
6920
|
+
display: inline-flex;
|
|
6921
|
+
align-items: center;
|
|
6922
|
+
justify-content: center;
|
|
6923
|
+
gap: 4px;
|
|
6924
|
+
white-space: nowrap;
|
|
6925
|
+
box-sizing: border-box;
|
|
6926
|
+
user-select: none;
|
|
6927
|
+
}
|
|
6928
|
+
.composer-pill:hover {
|
|
6929
|
+
border-color: var(--accent);
|
|
6930
|
+
background-color: rgba(246, 241, 232, 1);
|
|
6931
|
+
}
|
|
6932
|
+
.composer-pill:focus,
|
|
6933
|
+
.composer-pill:focus-visible {
|
|
6934
|
+
border-color: var(--accent);
|
|
6935
|
+
box-shadow: 0 0 0 2px var(--accent-muted);
|
|
6936
|
+
outline: none;
|
|
6937
|
+
}
|
|
6938
|
+
.composer-pill.disabled,
|
|
6939
|
+
.composer-pill[disabled] {
|
|
6940
|
+
opacity: 0.55;
|
|
6941
|
+
cursor: not-allowed;
|
|
6942
|
+
}
|
|
6943
|
+
|
|
6944
|
+
/* select 变体:保留 chevron 背景图与文本截断 */
|
|
6945
|
+
.composer-pill-select {
|
|
6946
|
+
padding: 1px 16px 1px 6px;
|
|
6947
|
+
max-width: 110px;
|
|
6848
6948
|
overflow: hidden;
|
|
6849
6949
|
text-overflow: ellipsis;
|
|
6850
|
-
white-space: nowrap;
|
|
6851
6950
|
appearance: none;
|
|
6852
6951
|
-webkit-appearance: none;
|
|
6853
6952
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' fill='none'%3E%3Cpath d='M1 1l3 3 3-3' stroke='%239a8e82' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
|
6854
6953
|
background-repeat: no-repeat;
|
|
6855
6954
|
background-position: right 4px center;
|
|
6955
|
+
/* 让 native <select> 在 inline-flex 下表现稳定 */
|
|
6956
|
+
display: inline-block;
|
|
6957
|
+
text-align: left;
|
|
6856
6958
|
}
|
|
6857
|
-
|
|
6858
|
-
|
|
6859
|
-
|
|
6959
|
+
|
|
6960
|
+
/* chip 变体:开关型按钮 / span,无 chevron,可亮态。
|
|
6961
|
+
字号与 select pill 对齐 (0.625rem),避免同行字号微差。 */
|
|
6962
|
+
.composer-pill-chip {
|
|
6963
|
+
padding: 1px 8px;
|
|
6964
|
+
font-size: 0.625rem;
|
|
6860
6965
|
}
|
|
6861
|
-
.
|
|
6966
|
+
.composer-pill-chip.active {
|
|
6967
|
+
background: var(--accent-muted, rgba(197, 101, 61, 0.12));
|
|
6968
|
+
color: var(--accent);
|
|
6862
6969
|
border-color: var(--accent);
|
|
6863
|
-
|
|
6970
|
+
}
|
|
6971
|
+
.composer-pill-chip.active:hover {
|
|
6972
|
+
background: rgba(197, 101, 61, 0.18);
|
|
6973
|
+
}
|
|
6974
|
+
|
|
6975
|
+
/* 兼容旧类:保留为 alias,仅用于细节微调(如最大宽度) */
|
|
6976
|
+
.chat-mode-select {
|
|
6977
|
+
/* 旧标识,沿用 .composer-pill / .composer-pill-select 的基础风格 */
|
|
6978
|
+
max-width: 78px;
|
|
6979
|
+
}
|
|
6980
|
+
.chat-model-select {
|
|
6981
|
+
max-width: 96px;
|
|
6982
|
+
}
|
|
6983
|
+
.chat-thinking-select {
|
|
6984
|
+
max-width: 86px;
|
|
6985
|
+
}
|
|
6986
|
+
|
|
6987
|
+
/* 思考深度 trigger —— 与 mode / model 同形 pill:相同 border / chevron / 字号。
|
|
6988
|
+
内部 .chat-thinking-label 显示当前档位,原生 <select> 透明叠层负责交互,
|
|
6989
|
+
移动端能调起系统滚轮选择,桌面端点击则展开原生菜单。 */
|
|
6990
|
+
.chat-thinking-trigger {
|
|
6991
|
+
position: relative;
|
|
6992
|
+
max-width: 86px;
|
|
6993
|
+
padding-left: 6px;
|
|
6994
|
+
}
|
|
6995
|
+
.chat-thinking-label {
|
|
6996
|
+
overflow: hidden;
|
|
6997
|
+
text-overflow: ellipsis;
|
|
6998
|
+
letter-spacing: 0.01em;
|
|
6999
|
+
}
|
|
7000
|
+
.chat-thinking-hidden-select {
|
|
7001
|
+
position: absolute;
|
|
7002
|
+
inset: 0;
|
|
7003
|
+
width: 100%;
|
|
7004
|
+
height: 100%;
|
|
7005
|
+
margin: 0;
|
|
7006
|
+
padding: 0;
|
|
7007
|
+
border: 0;
|
|
7008
|
+
background: transparent;
|
|
7009
|
+
color: transparent;
|
|
7010
|
+
font: inherit;
|
|
7011
|
+
opacity: 0;
|
|
7012
|
+
cursor: pointer;
|
|
7013
|
+
appearance: none;
|
|
7014
|
+
-webkit-appearance: none;
|
|
7015
|
+
}
|
|
7016
|
+
.chat-thinking-hidden-select:focus {
|
|
6864
7017
|
outline: none;
|
|
6865
7018
|
}
|
|
6866
7019
|
|
|
@@ -6917,25 +7070,66 @@
|
|
|
6917
7070
|
}
|
|
6918
7071
|
|
|
6919
7072
|
/* "立即发送":结构化会话流式输出时显示,按下会中断当前回复立即处理新输入。
|
|
6920
|
-
|
|
6921
|
-
|
|
6922
|
-
|
|
7073
|
+
v1.30.3 把它做成 28px 圆形 + dashed 边框,结果用户根本注意不到这颗按钮、
|
|
7074
|
+
误以为"立即发送没效果"。现在升级成 pill(图标 + "立即"文字 + 实色高对比 + 脉动),
|
|
7075
|
+
和 send 按钮形成"加急/默认"的视觉对位。 */
|
|
7076
|
+
.btn-pill {
|
|
7077
|
+
display: inline-flex;
|
|
7078
|
+
align-items: center;
|
|
7079
|
+
gap: 4px;
|
|
7080
|
+
height: 28px;
|
|
7081
|
+
padding: 0 10px 0 8px;
|
|
7082
|
+
border-radius: 999px;
|
|
7083
|
+
border: none;
|
|
7084
|
+
cursor: pointer;
|
|
7085
|
+
transition: all var(--transition-fast);
|
|
7086
|
+
flex-shrink: 0;
|
|
7087
|
+
font-size: 0.6875rem;
|
|
7088
|
+
font-weight: 600;
|
|
7089
|
+
letter-spacing: 0.02em;
|
|
7090
|
+
white-space: nowrap;
|
|
7091
|
+
}
|
|
7092
|
+
.btn-pill-icon {
|
|
7093
|
+
display: block;
|
|
7094
|
+
flex-shrink: 0;
|
|
7095
|
+
}
|
|
7096
|
+
.btn-pill-label {
|
|
7097
|
+
display: inline;
|
|
7098
|
+
}
|
|
7099
|
+
.btn-pill-interrupt {
|
|
7100
|
+
background: linear-gradient(180deg, rgba(197, 101, 61, 0.18) 0%, rgba(197, 101, 61, 0.10) 100%);
|
|
6923
7101
|
color: var(--accent);
|
|
6924
|
-
margin-right:
|
|
6925
|
-
|
|
7102
|
+
margin-right: 4px;
|
|
7103
|
+
box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.30) inset;
|
|
7104
|
+
animation: interruptPulse 1.8s ease-in-out infinite;
|
|
6926
7105
|
}
|
|
6927
|
-
.btn-
|
|
6928
|
-
background: var(--accent);
|
|
6929
|
-
color:
|
|
6930
|
-
|
|
6931
|
-
transform:
|
|
7106
|
+
.btn-pill-interrupt:hover {
|
|
7107
|
+
background: linear-gradient(180deg, var(--accent) 0%, #a8522f 100%);
|
|
7108
|
+
color: #fff;
|
|
7109
|
+
box-shadow: 0 3px 10px rgba(197, 101, 61, 0.35);
|
|
7110
|
+
transform: translateY(-1px);
|
|
7111
|
+
animation: none;
|
|
6932
7112
|
}
|
|
6933
|
-
.btn-
|
|
6934
|
-
transform: scale(0.
|
|
7113
|
+
.btn-pill-interrupt:active {
|
|
7114
|
+
transform: translateY(0) scale(0.97);
|
|
6935
7115
|
}
|
|
6936
|
-
.btn-
|
|
7116
|
+
.btn-pill-interrupt.hidden {
|
|
6937
7117
|
display: none;
|
|
6938
7118
|
}
|
|
7119
|
+
@keyframes interruptPulse {
|
|
7120
|
+
0%, 100% { box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.30) inset, 0 0 0 0 rgba(197, 101, 61, 0.0); }
|
|
7121
|
+
50% { box-shadow: 0 0 0 1px rgba(197, 101, 61, 0.45) inset, 0 0 0 4px rgba(197, 101, 61, 0.12); }
|
|
7122
|
+
}
|
|
7123
|
+
/* 屏宽 < 480 时把"立即"文字藏掉,只剩 » 图标,避免和 send 一起把行挤爆。
|
|
7124
|
+
hover/focus 期间临时回显,让长按移动端用户也能确认按钮含义。 */
|
|
7125
|
+
@media (max-width: 480px) {
|
|
7126
|
+
.btn-pill-interrupt {
|
|
7127
|
+
padding: 0 8px;
|
|
7128
|
+
}
|
|
7129
|
+
.btn-pill-interrupt .btn-pill-label {
|
|
7130
|
+
display: none;
|
|
7131
|
+
}
|
|
7132
|
+
}
|
|
6939
7133
|
|
|
6940
7134
|
/* send 按钮在「排队模式」下退到次要色,让相邻的"立即发送"成为视觉重点。
|
|
6941
7135
|
不动尺寸 / 圆形,避免 layout shift。 */
|
|
@@ -9116,7 +9310,7 @@
|
|
|
9116
9310
|
.view-toggle { height: 36px; }
|
|
9117
9311
|
.view-toggle-btn { padding: 0 12px; font-size: 0.75rem; height: 30px; min-height: 30px; }
|
|
9118
9312
|
.chat-container { padding: 0 12px 12px; }
|
|
9119
|
-
.chat-message { max-width:
|
|
9313
|
+
.chat-message { max-width: 100%; }
|
|
9120
9314
|
.thinking-card { padding: 10px 14px; }
|
|
9121
9315
|
.thinking-content { font-size: 0.8125rem; }
|
|
9122
9316
|
.tool-picker { grid-template-columns: 1fr; }
|
|
@@ -9176,9 +9370,34 @@
|
|
|
9176
9370
|
.floating-sidebar-toggle .hamburger-icon { width: 13px; height: 9px; }
|
|
9177
9371
|
|
|
9178
9372
|
.sidebar { top: 0; }
|
|
9179
|
-
.sidebar-header { padding: 10px 12px; min-height: 48px; }
|
|
9180
|
-
|
|
9181
|
-
.sidebar-
|
|
9373
|
+
.sidebar-header { padding: 10px 12px; min-height: 48px; gap: 8px; }
|
|
9374
|
+
/* 收紧 actions 内按钮间距,给主区(logo/标题/计数)腾空间 */
|
|
9375
|
+
.sidebar-header-actions { gap: 4px; }
|
|
9376
|
+
/* 5 个底栏按钮在 2 列布局下最后一颗会单独占满第三行,看着很挤。
|
|
9377
|
+
手机端统一切到 4 列、隐藏文字、保留图标,更紧凑也对齐统一。 */
|
|
9378
|
+
.sidebar-footer-actions {
|
|
9379
|
+
grid-template-columns: repeat(4, 1fr);
|
|
9380
|
+
gap: 4px;
|
|
9381
|
+
}
|
|
9382
|
+
.sidebar-footer-actions .btn {
|
|
9383
|
+
min-height: 40px;
|
|
9384
|
+
padding: 6px 4px;
|
|
9385
|
+
}
|
|
9386
|
+
.sidebar-footer-actions .btn span { display: none; }
|
|
9387
|
+
.sidebar-footer-actions .btn svg { width: 18px; height: 18px; }
|
|
9388
|
+
|
|
9389
|
+
/* "更多操作"下拉:默认锚在更多按钮右沿向左展开 150px。手机端:
|
|
9390
|
+
· 加大 min-width 让中文项不会两行;
|
|
9391
|
+
· max-width 限制在可见区,防止极窄手机被裁;
|
|
9392
|
+
· 按钮在侧栏靠右,下拉自然贴侧栏右沿;用 right: 0 原值即可。 */
|
|
9393
|
+
.sidebar-header-overflow {
|
|
9394
|
+
min-width: 180px;
|
|
9395
|
+
max-width: calc(100vw - 24px);
|
|
9396
|
+
}
|
|
9397
|
+
.sidebar-header-overflow .overflow-item {
|
|
9398
|
+
padding: 11px 14px;
|
|
9399
|
+
font-size: 0.875rem;
|
|
9400
|
+
}
|
|
9182
9401
|
|
|
9183
9402
|
/* 移动端终端顶栏 - 紧凑 */
|
|
9184
9403
|
.terminal-header { padding: 5px 8px; min-height: 32px; }
|
|
@@ -9328,11 +9547,27 @@
|
|
|
9328
9547
|
|
|
9329
9548
|
.input-composer-bar {
|
|
9330
9549
|
padding: 1px 3px 2px 5px;
|
|
9331
|
-
gap:
|
|
9550
|
+
gap: 2px;
|
|
9332
9551
|
}
|
|
9333
9552
|
|
|
9334
|
-
.input-composer-left { gap:
|
|
9553
|
+
.input-composer-left { gap: 2px; }
|
|
9335
9554
|
.input-composer-right { gap: 3px; }
|
|
9555
|
+
/* 移动端窄屏:进一步收紧 group 内边距,让 mode/model/thinking 三件套不占额外 padding */
|
|
9556
|
+
.input-composer-left .composer-pill-group {
|
|
9557
|
+
padding: 0;
|
|
9558
|
+
gap: 1px;
|
|
9559
|
+
background: transparent;
|
|
9560
|
+
box-shadow: none;
|
|
9561
|
+
}
|
|
9562
|
+
/* 移动端 chip 字号微缩,与新 desktop chip 0.625rem 对齐基础上再小一点 */
|
|
9563
|
+
.input-composer-left .composer-pill-chip {
|
|
9564
|
+
font-size: 0.6rem;
|
|
9565
|
+
padding: 1px 6px;
|
|
9566
|
+
}
|
|
9567
|
+
/* 移动端三件套 select 最大宽度同步收紧 */
|
|
9568
|
+
.input-composer-left .chat-mode-select { max-width: 64px; }
|
|
9569
|
+
.input-composer-left .chat-model-select { max-width: 78px; }
|
|
9570
|
+
.input-composer-left .chat-thinking-trigger { max-width: 72px; }
|
|
9336
9571
|
|
|
9337
9572
|
/* 移动端会话信息栏 */
|
|
9338
9573
|
.input-session-info-bar {
|
|
@@ -10116,12 +10351,13 @@
|
|
|
10116
10351
|
align-items: center;
|
|
10117
10352
|
gap: 6px;
|
|
10118
10353
|
}
|
|
10354
|
+
/* 此处历史遗留的 .chat-mode-select 全局规则会覆盖上面 .composer-pill 的统一字号 / 边框,
|
|
10355
|
+
已上移到 .composer-pill / .composer-pill-select 体系;这里只保留 outline / cursor 的兜底,
|
|
10356
|
+
不再设置 font-size / max-width,避免和 6938 行的统一样式打架。 */
|
|
10119
10357
|
.chat-mode-select {
|
|
10120
|
-
font-size: 0.6875rem;
|
|
10121
10358
|
font-family: inherit;
|
|
10122
10359
|
cursor: pointer;
|
|
10123
10360
|
outline: none;
|
|
10124
|
-
max-width: 96px;
|
|
10125
10361
|
}
|
|
10126
10362
|
.chat-mode-select:focus {
|
|
10127
10363
|
border-color: var(--accent);
|