wezard 2.2.1 → 2.3.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/CLAUDE.md +7 -4
- package/README.md +1 -1
- package/dist/cli/init.js +2 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/daemon/approval.js +6 -4
- package/dist/daemon/approval.js.map +1 -1
- package/dist/daemon/chat-log.js +6 -1
- package/dist/daemon/chat-log.js.map +1 -1
- package/dist/daemon/danger.js +17 -0
- package/dist/daemon/danger.js.map +1 -1
- package/dist/daemon/detail.js +41 -0
- package/dist/daemon/detail.js.map +1 -1
- package/dist/daemon/handoff.js +8 -2
- package/dist/daemon/handoff.js.map +1 -1
- package/dist/daemon/inbound.js +9 -4
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +744 -152
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/jobs.js +62 -23
- package/dist/daemon/jobs.js.map +1 -1
- package/dist/daemon/last-response.js +15 -0
- package/dist/daemon/last-response.js.map +1 -1
- package/dist/daemon/memory-steward.js +124 -68
- package/dist/daemon/memory-steward.js.map +1 -1
- package/dist/daemon/mirror-bridge.js +461 -91
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js.map +1 -1
- package/dist/daemon/model-select.js +99 -0
- package/dist/daemon/model-select.js.map +1 -1
- package/dist/daemon/notices.js +7 -5
- package/dist/daemon/notices.js.map +1 -1
- package/dist/daemon/peers.js +183 -60
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/receipts.js +391 -77
- package/dist/daemon/receipts.js.map +1 -1
- package/dist/daemon/route.js +63 -10
- package/dist/daemon/route.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +24 -13
- package/dist/daemon/spawn-tmux.js.map +1 -1
- package/dist/daemon/task-registry.js +1 -1
- package/dist/daemon/task-registry.js.map +1 -1
- package/dist/daemon/tasks.js +12 -4
- package/dist/daemon/tasks.js.map +1 -1
- package/dist/daemon/usage.js +4 -11
- package/dist/daemon/usage.js.map +1 -1
- package/dist/daemon/wizard-memory.js +36 -4
- package/dist/daemon/wizard-memory.js.map +1 -1
- package/dist/daemon/wizard.js +102 -58
- package/dist/daemon/wizard.js.map +1 -1
- package/dist/mcp/server.js +138 -111
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/charter-view.js +35 -0
- package/dist/shared/charter-view.js.map +1 -0
- package/dist/shared/chat-http.js +133 -31
- package/dist/shared/chat-http.js.map +1 -1
- package/dist/shared/chat-render.js +6 -3
- package/dist/shared/chat-render.js.map +1 -1
- package/dist/shared/chat-view.js +17 -6
- package/dist/shared/chat-view.js.map +1 -1
- package/dist/shared/cli-backends.js +2 -0
- package/dist/shared/cli-backends.js.map +1 -1
- package/dist/shared/config.js +9 -5
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/daemon-token.js +18 -0
- package/dist/shared/daemon-token.js.map +1 -0
- package/dist/shared/detail-render.js +140 -16
- package/dist/shared/detail-render.js.map +1 -1
- package/dist/shared/detail-store.js +33 -12
- package/dist/shared/detail-store.js.map +1 -1
- package/dist/shared/effort.js +11 -0
- package/dist/shared/effort.js.map +1 -0
- package/dist/shared/model-prices.js +258 -0
- package/dist/shared/model-prices.js.map +1 -0
- package/dist/shared/pricing.js +55 -0
- package/dist/shared/pricing.js.map +1 -0
- package/dist/shared/reminder.js +18 -4
- package/dist/shared/reminder.js.map +1 -1
- package/dist/shared/role-render.js +172 -8
- package/dist/shared/role-render.js.map +1 -1
- package/dist/shared/role-view.js +89 -25
- package/dist/shared/role-view.js.map +1 -1
- package/dist/shared/session-label.js +4 -0
- package/dist/shared/session-label.js.map +1 -1
- package/dist/shared/task-file.js +16 -1
- package/dist/shared/task-file.js.map +1 -1
- package/dist/shared/turn-state.js +24 -0
- package/dist/shared/turn-state.js.map +1 -0
- package/dist/shared/world.js +37 -3
- package/dist/shared/world.js.map +1 -1
- package/dist/svr/index.js +2 -1
- package/dist/svr/index.js.map +1 -1
- package/hooks/pre-tool-use.sh +16 -3
- package/package.json +1 -1
- package/web/chat.css +173 -41
- package/web/chat.js +724 -245
package/web/chat.css
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
--mine-line: #c9d7f3;
|
|
19
19
|
--accent: #2f55c9; /* 视角色: 名字的点、选中态、自己的气泡描边 */
|
|
20
20
|
--priv: #9a5b10; /* 私聊 */
|
|
21
|
+
--human: #12715a; /* 人名 —— 青绿, 与 wizard (墨色) 和群名 (暗金) 三分 */
|
|
22
|
+
--chat: #7d6410; /* 群名 —— 暗金, 与 role 名 (墨色 + 视角色的点) 分开: 群是频道不是 role */
|
|
21
23
|
/* 头像底: 不透明, 且由 card/accent 推出 —— 叠在选中/高亮/关系图任何底色上都不变色, 换主题时随 token 走。 */
|
|
22
24
|
--av-bg: var(--card);
|
|
23
25
|
--av-line: var(--line);
|
|
@@ -42,6 +44,8 @@ button { font: inherit; color: inherit }
|
|
|
42
44
|
.nm { font-weight: 600 }
|
|
43
45
|
.nm::before { content: "."; color: var(--accent); font-weight: 700 }
|
|
44
46
|
.nm.human::before, .nm.task::before, .nm.system::before, .nm.chat::before { content: none }
|
|
47
|
+
.nm.chat, .ch-who .sub .up { color: var(--chat) }
|
|
48
|
+
.nm.human { color: var(--human) }
|
|
45
49
|
|
|
46
50
|
/* ── 侧栏: 我 + 会话 ─────────────────────────────────────────────── */
|
|
47
51
|
.side {
|
|
@@ -59,14 +63,14 @@ button { font: inherit; color: inherit }
|
|
|
59
63
|
flex-wrap: nowrap; align-items: stretch;
|
|
60
64
|
}
|
|
61
65
|
.rolebar > .who { min-width: 0 }
|
|
62
|
-
.rolebar .id { display: flex; gap:
|
|
66
|
+
.rolebar .id { display: flex; gap: 10px; align-items: center; min-width: 0 }
|
|
63
67
|
/* 与会话项头像同一套不透明底, 放大到名片尺寸。 */
|
|
64
68
|
.rolebar .id .av {
|
|
65
|
-
flex: none; display: grid; place-items: center; width:
|
|
66
|
-
background: var(--av-bg); box-shadow: inset 0 0 0 1px var(--av-line); font-size:
|
|
69
|
+
flex: none; display: grid; place-items: center; width: 40px; height: 40px; border-radius: 12px;
|
|
70
|
+
background: var(--av-bg); box-shadow: inset 0 0 0 1px var(--av-line); font-size: 23px; line-height: 1;
|
|
67
71
|
}
|
|
68
|
-
.rolebar .id .l { min-width: 0; display: flex; flex-direction: column; gap:
|
|
69
|
-
.rolebar .id .nm { font-size:
|
|
72
|
+
.rolebar .id .l { min-width: 0; display: flex; flex-direction: column; gap: 2px }
|
|
73
|
+
.rolebar .id .nm { font-size: 15.5px; line-height: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
70
74
|
/* 职责是一句话, 至多两行; 截掉的悬停看全文 (chat.js 的截断提示)。 */
|
|
71
75
|
.rolebar .job {
|
|
72
76
|
margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ink); opacity: .8; word-break: break-word;
|
|
@@ -76,29 +80,21 @@ button { font: inherit; color: inherit }
|
|
|
76
80
|
.rolebar .facts { display: flex; flex-wrap: wrap; gap: 0 10px; font-size: 11.5px; line-height: 1.45; color: var(--faint); min-width: 0 }
|
|
77
81
|
/* 每条自身不折行; 独占一行仍超宽 (长路径 / 长群名) 才省略。 */
|
|
78
82
|
.rolebar .facts span { white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis }
|
|
83
|
+
.rolebar .facts .fx { cursor: pointer }
|
|
84
|
+
.rolebar .facts .fx:hover, .rolebar .facts .fx.on { color: var(--accent) }
|
|
85
|
+
.rolebar .facts .fx.bad { color: #cf222e }
|
|
79
86
|
.rolebar .go { cursor: pointer; color: var(--accent) }
|
|
80
87
|
.rolebar .go:hover { text-decoration: underline }
|
|
81
|
-
/* 分隔线两端收进来, 与上面搜索框的左右边距对齐, 不顶满侧栏。 */
|
|
82
|
-
.acts { flex: none; display: flex; justify-content: center; align-items: center; gap: 2px; margin: 0 10px; padding: 4px 0 8px; border-bottom: 1px solid var(--line) }
|
|
83
|
-
.acts:empty { display: none }
|
|
84
|
-
/* 旧外壳 (daemon 未重启) 里它还在名片内 —— 那里不需要自己的内边距与分隔线。 */
|
|
85
|
-
.rolebar .acts { margin: 0; padding: 0; border: 0 }
|
|
86
|
-
/* 入口: 图标 + 名字 + 淡色副标题, 无框无底; hover 才浮出一层浅底, 打开着的染视角色。 */
|
|
87
|
-
.bd {
|
|
88
|
-
flex: none; padding: 1px 4px; border: 0; border-radius: 4px; background: none; cursor: pointer; white-space: nowrap;
|
|
89
|
-
font-size: 12px; color: var(--mute); transition: color .12s;
|
|
90
|
-
}
|
|
91
|
-
.bd:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px }
|
|
92
|
-
.bd.on { color: var(--accent); font-weight: 600 }
|
|
93
|
-
.bd.bad { color: #cf222e }
|
|
94
|
-
.acts .sep { color: var(--line); font-size: 12px; user-select: none }
|
|
95
88
|
/* session 切换: name 右边一个小号文字触发器 + 浮层列表。name 先省略, 触发器不让位。 */
|
|
96
89
|
.rolebar .id .l { flex: 1 }
|
|
97
90
|
.rolebar .nl { display: flex; align-items: center; gap: 8px; min-width: 0 }
|
|
98
91
|
#rb-st { flex: none; display: inline-flex }
|
|
99
92
|
.rolebar .nl .nm { min-width: 0; flex: 0 1 auto }
|
|
100
|
-
.rolebar .nl .cp { min-width: 0; flex: 0 1 auto; display: inline-flex; cursor:
|
|
93
|
+
.rolebar .nl .cp { min-width: 0; flex: 0 1 auto; display: inline-flex; align-items: center; gap: 4px; cursor: pointer }
|
|
101
94
|
.rolebar .nl .cp:hover .nm { text-decoration: underline dotted var(--faint); text-underline-offset: 3px }
|
|
95
|
+
/* 复制提示用 ⧉ 小图标, 不用 cursor:copy —— 那颗绿色的加号读起来像「添加」。 */
|
|
96
|
+
.rolebar .nl .cp::after { content: "⧉"; flex: none; font-size: 12px; color: var(--faint); display: none }
|
|
97
|
+
.rolebar .nl .cp:hover::after { display: inline }
|
|
102
98
|
.toast {
|
|
103
99
|
position: fixed; left: 50%; bottom: 28px; z-index: 1000; transform: translate(-50%, 8px);
|
|
104
100
|
padding: 6px 12px; border-radius: 8px; font-size: 12.5px; color: #fff; background: rgba(28, 36, 48, .88);
|
|
@@ -114,7 +110,7 @@ button { font: inherit; color: inherit }
|
|
|
114
110
|
}
|
|
115
111
|
.sp-btn:hover, .sp.open .sp-btn { background: var(--paper); color: var(--ink) }
|
|
116
112
|
/* 箭头用边框画, 不用 ▾ 字形 —— 字形贴着基线, 放大后总是偏下。 */
|
|
117
|
-
.sp-btn .car { flex: none; display: grid; place-items: center; width:
|
|
113
|
+
.sp-btn .car { flex: none; display: grid; place-items: center; width: 16px; height: 16px; transition: transform .15s }
|
|
118
114
|
.sp-btn .car::before { content: ""; border: 5px solid transparent; border-top: 6px solid var(--faint); border-bottom: 0 }
|
|
119
115
|
.sp.open .sp-btn .car { transform: rotate(180deg) }
|
|
120
116
|
.sp-list {
|
|
@@ -138,13 +134,14 @@ button { font: inherit; color: inherit }
|
|
|
138
134
|
|
|
139
135
|
/* ── 用量条: 一组轮次的总账 ─────────────────────────────────────────
|
|
140
136
|
一个组件两处挂: 整页页脚 (wizard 的总账) / 聊天窗口底 (人与某个 wizard 这段往来的账)。
|
|
141
|
-
永远单行: 主人 · 模型 · 指标 · 图例, I/O
|
|
137
|
+
永远单行: 主人 · 模型 · 指标 · 图例, I/O 分布是贴顶的色带 (兼作上边线)。排不下时 chat.js 的 fitUsage
|
|
142
138
|
按容器宽度一级级加 f-* 藏掉次要的 (分布文字 → 名字 → 耗时), 不按视口断点。 */
|
|
143
139
|
.usage {
|
|
144
140
|
/* 整条只有一个字号、一个间隔: 指标、模型名、主人、图例都用它。 */
|
|
145
141
|
--u-gap: 14px;
|
|
146
142
|
flex: none; display: flex; align-items: center; flex-wrap: nowrap; gap: var(--u-gap); overflow: hidden; white-space: nowrap;
|
|
147
|
-
position: relative; padding:
|
|
143
|
+
position: relative; padding: 8px 20px; background: var(--paper);
|
|
144
|
+
box-shadow: inset 0 1px var(--line); /* 没有分布 (total=0) 时的上边线; 有分布时被色带盖住 */
|
|
148
145
|
font-family: ui-monospace, Menlo, monospace; font-size: 11.5px; color: var(--mute);
|
|
149
146
|
font-variant-numeric: tabular-nums;
|
|
150
147
|
}
|
|
@@ -153,20 +150,21 @@ button { font: inherit; color: inherit }
|
|
|
153
150
|
.usage .u-who { display: flex; align-items: center; gap: 4px; max-width: 200px }
|
|
154
151
|
.usage .u-nm { overflow: hidden; text-overflow: ellipsis; color: var(--faint) }
|
|
155
152
|
.usage .u-lb { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 700; color: var(--accent) }
|
|
153
|
+
.usage .u-ef { margin-left: -4px; white-space: nowrap; color: var(--mute) }
|
|
156
154
|
.usage .u-ic { font-style: normal; margin-right: 4px }
|
|
157
155
|
.usage .u-kvs, .usage .leg { display: flex; gap: var(--u-gap) }
|
|
158
156
|
.usage .kv { white-space: nowrap }
|
|
159
|
-
/* I/O 分布 = bar
|
|
157
|
+
/* I/O 分布 = bar 的上边线: 横跨整宽的细色带, 不占行, 替掉 border-top; 悬停加粗一点好瞄准某一段。 */
|
|
160
158
|
.usage .bar {
|
|
161
|
-
position: absolute; left: 0; right: 0;
|
|
159
|
+
position: absolute; left: 0; right: 0; top: 0; height: 1px; display: flex;
|
|
162
160
|
background: var(--line); transition: height .12s;
|
|
163
161
|
}
|
|
164
|
-
.usage .bar:hover { height:
|
|
162
|
+
.usage .bar:hover { height: 3px }
|
|
165
163
|
.usage .bar .seg { flex: 1 1 0; min-width: 2px; height: 100% }
|
|
166
164
|
.usage .leg { margin-left: auto }
|
|
167
165
|
.usage .lg { display: flex; align-items: center; gap: 4px; white-space: nowrap }
|
|
168
166
|
.usage .lg i { width: 7px; height: 7px; border-radius: 50%; flex: none }
|
|
169
|
-
.usage.f-
|
|
167
|
+
.usage.f-cnt .kv-turns, .usage.f-cnt .kv-tools, .usage.f-cnt .kv-api, .usage.f-leg .leg, .usage.f-nm .u-nm { display: none }
|
|
170
168
|
|
|
171
169
|
/* 群聊头像 = 参与者头像拼图: 1 格居中, 2 格左右, 3/4 格田字。 */
|
|
172
170
|
.mosaic {
|
|
@@ -187,6 +185,20 @@ button { font: inherit; color: inherit }
|
|
|
187
185
|
}
|
|
188
186
|
.convs h2:first-child { margin-top: 6px }
|
|
189
187
|
.convs h2 span { font-weight: 400; color: var(--faint); font-variant-numeric: tabular-nums }
|
|
188
|
+
/* 会话列表 ↔ 关系图的小开关: 两个视图的第一行标题右端, 同一个位置。 */
|
|
189
|
+
.convs h2 .vt {
|
|
190
|
+
margin-left: auto; align-self: center; display: inline-flex; align-items: center; gap: 4px;
|
|
191
|
+
border: 0; background: none; padding: 2px 6px; border-radius: 5px; cursor: pointer;
|
|
192
|
+
font-size: 11px; font-weight: 400; color: var(--mute);
|
|
193
|
+
}
|
|
194
|
+
.convs h2 .vt:hover { background: #eef1f4; color: var(--accent) }
|
|
195
|
+
/* 范围按钮 (侧栏「往来 / 全部」、关系图「相关 / 全部」): 与视图开关同一个 .vt, 字是当前范围, 点一下换另一种。 */
|
|
196
|
+
.convs h2 [data-scope], .convs h2 [data-tall] { margin-left: auto }
|
|
197
|
+
.convs h2 [data-scope] + .vt, .convs h2 [data-tall] + .vt { margin-left: 0 }
|
|
198
|
+
/* 关系图那一行字多 (范围 · 计数 · 名册缺席 · 看全部 · 开关): 一律不折行, 让范围那段先省略。 */
|
|
199
|
+
.convs h2 { white-space: nowrap; min-width: 0 }
|
|
200
|
+
.convs h2 > * { flex: none }
|
|
201
|
+
.convs h2 > span:first-of-type { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis }
|
|
190
202
|
|
|
191
203
|
/* 群下的子项 (.si) 与私聊项 (.ci) 同一套尺寸 —— 只有一份。 */
|
|
192
204
|
.ci, .si {
|
|
@@ -215,6 +227,10 @@ button { font: inherit; color: inherit }
|
|
|
215
227
|
它们嵌在整行那颗按钮里; 行本身悬停不变底色, 只有入口自己亮起。z-index 保证没有兄弟盖住命中区。 */
|
|
216
228
|
.nm.go, .av.go { position: relative; z-index: 1; cursor: pointer }
|
|
217
229
|
.nm.go:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 2px }
|
|
230
|
+
/* 名字旁「+N」: 视角外它还在和几个 role 说话 —— inline-block 不吃名字 hover 的下划线 */
|
|
231
|
+
.nm .oc { display: inline-block; margin-left: 6px; padding: 0 6px; border-radius: 8px; line-height: 15px; font-size: 10.5px; font-weight: 600;
|
|
232
|
+
color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent); vertical-align: 1px }
|
|
233
|
+
.nm.go:hover .oc { background: color-mix(in srgb, var(--accent) 20%, transparent) }
|
|
218
234
|
span.av.go { border-radius: 8px; transition: background .12s, box-shadow .12s }
|
|
219
235
|
span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot) }
|
|
220
236
|
.ci .tag.priv { color: var(--priv); background: #9a5b1014 }
|
|
@@ -224,6 +240,10 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
224
240
|
/* 竖线的 x 与关系图里的竖向连线对齐: 都在项左缘 +10px (关系树 ul 缩进 20 - 线距 li 10)。 */
|
|
225
241
|
.subs { margin: 0 0 6px 10px; border-left: 1px solid var(--line); padding-left: 2px }
|
|
226
242
|
.si { color: var(--ink) }
|
|
243
|
+
/* 「chat 内全部」下与我无往来的子项: 整行淡下去、名字不加粗, 一眼分得出不是我的往来; 选中 / 悬停时恢复。 */
|
|
244
|
+
.si.far { opacity: .58 }
|
|
245
|
+
.si.far .t { font-weight: 400 }
|
|
246
|
+
.si.far:hover, .si.far.on { opacity: 1 }
|
|
227
247
|
.si-more {
|
|
228
248
|
display: block; width: 100%; text-align: center; padding: 4px 8px; border: 0;
|
|
229
249
|
background: transparent; cursor: pointer; font-size: 11.5px; color: var(--mute);
|
|
@@ -247,6 +267,11 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
247
267
|
background: var(--card); border-bottom: 1px solid var(--line);
|
|
248
268
|
}
|
|
249
269
|
.chathead .back { display: none; border: 0; background: none; font-size: 22px; color: var(--mute); cursor: pointer; padding: 0 4px }
|
|
270
|
+
/* 跳过来之后的返回 (工单页 / 移交行): 同一副无框箭头, 宽屏也露出。 */
|
|
271
|
+
.chathead .back.jb { display: block; flex: none; margin-right: -4px }
|
|
272
|
+
.chathead .back.jb:hover { color: var(--accent) }
|
|
273
|
+
/* 有跳转返回时窄屏只留它一个箭头: 先回跳转前; 没有它时 #tb-back 才是回会话列表。 */
|
|
274
|
+
.chathead:has(.back.jb) #tb-back { display: none }
|
|
250
275
|
.ch-who { display: flex; gap: 11px; align-items: center; min-width: 0; flex: 1 }
|
|
251
276
|
/* 一对一的两端头像: 同单个角色头像的画法, 后一个略压住前一个。 */
|
|
252
277
|
.ch-who .pair { display: flex; flex: none; align-items: center }
|
|
@@ -261,8 +286,10 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
261
286
|
.ch-who .t { min-width: 0; font-size: 16px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
262
287
|
.ch-who > .t:not(:only-child) { flex: 0 1 auto }
|
|
263
288
|
.ch-who .sub { min-width: 0; font-size: 11.5px; color: var(--mute); overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
289
|
+
/* 副标题里的群名: 回到整个群的入口, 平时只是一行灰字, 悬停才像链接。 */
|
|
290
|
+
.ch-who .sub .up { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer }
|
|
291
|
+
.ch-who .sub .up:hover { text-decoration: underline }
|
|
264
292
|
.ch-acts { display: flex; gap: 8px; align-items: center; flex: 0 1 auto; min-width: 0; font-size: 12px; color: var(--mute) }
|
|
265
|
-
.ch-acts .with { min-width: 0; max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
266
293
|
.ch-acts .vb { flex: none }
|
|
267
294
|
.vb {
|
|
268
295
|
font-size: 12.5px; background: var(--card); border: 1px solid var(--line); border-radius: 7px;
|
|
@@ -323,6 +350,28 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
323
350
|
.mchip.priv { color: var(--priv); background: #9a5b1014 }
|
|
324
351
|
.mchip.graph { color: #6639ba; background: #8250df12 }
|
|
325
352
|
.mchip.sys { color: #0a7d6b; background: #0a7d6b12 }
|
|
353
|
+
/* 回执: 定论着色 —— 已交是常态不抢眼, 反问 / 报错要人看一眼, 没答案的几种灰红。 */
|
|
354
|
+
.mchip.rcpt { border: 0; font: inherit; font-size: 11px; line-height: 16px; color: #1a7f37; background: #1a7f3712 }
|
|
355
|
+
button.mchip.rcpt { cursor: pointer }
|
|
356
|
+
button.mchip.rcpt:hover { text-decoration: underline }
|
|
357
|
+
.mchip.rcpt:is(.st-need, .st-error) { color: #9a6700; background: #9a670014 }
|
|
358
|
+
.mchip.rcpt:is(.st-timeout, .st-silent, .st-dead, .st-canceled) { color: #cf222e; background: #cf222e10 }
|
|
359
|
+
/* 移交行里的对方: 小头像 + 名字。整行是入口 (开双方的往来), 悬停时整行提亮。 */
|
|
360
|
+
.handoff .ho-who { display: inline-flex; align-items: center; gap: 3px; color: var(--ink) }
|
|
361
|
+
.handoff .ho-line[data-hto]:hover { background: var(--av-hot); border-radius: 6px }
|
|
362
|
+
.handoff .ho-who .av { width: 16px; height: 16px; border-radius: 50%; border: 1px solid var(--line); background: var(--card); font-size: 10px; line-height: 14px; text-align: center }
|
|
363
|
+
.handoff .ho-who .nm { font-weight: 500 }
|
|
364
|
+
/* 过程框收起后移交行仍露在框头下 —— 活交给了谁, 不该和普通工具输出一起藏起来。 */
|
|
365
|
+
.steps.folded > .bubbles:has(> .bubble.tool .handoff) { display: flex; flex-direction: column }
|
|
366
|
+
.steps.folded > .bubbles > :not(:has(.handoff)) { display: none }
|
|
367
|
+
.steps.folded > .bubbles > .bubble.tool > :not(.handoff) { display: none }
|
|
368
|
+
.steps.folded .handoff .ho-line { padding-left: 6px }
|
|
369
|
+
.steps.folded .handoff .ho-text { margin-left: 6px }
|
|
370
|
+
.steps.folded .handoff.pub > .say { margin-left: 6px }
|
|
371
|
+
/* 公开移交那句是这一行的发话人在群里说的话: 气泡取这一行自己的底色 (过程框里 --bub 被重置成白卡,
|
|
372
|
+
所以在 .mb 上先把行色存一份), 与普通消息同一颗。 */
|
|
373
|
+
.mrow .mb { --row-bub: var(--bub); --row-bub-line: var(--bub-line) }
|
|
374
|
+
.mrow .mb .steps .handoff.pub > .say > .bubble { background: var(--row-bub); border-color: var(--row-bub-line) }
|
|
326
375
|
|
|
327
376
|
/* 气泡与过程框同一种底色: 都是这个人发出来的 —— 自己的是视角色, 别人的是浅灰。
|
|
328
377
|
TURN_CSS 里写死的白卡 / 灰底 (嵌套气泡、代码块、折叠头) 在有色底上会显成一张张
|
|
@@ -331,7 +380,7 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
331
380
|
.mrow .mb .steps :is(.bubble, .typing) { background: transparent }
|
|
332
381
|
.mrow .mb .bubble.user,
|
|
333
382
|
.mrow .mb .md-body code, .mrow .mb .md-body pre,
|
|
334
|
-
.mrow .mb details:not(.tool-call) > summary,
|
|
383
|
+
.mrow .mb details:not(.tool-call, .handoff) > summary,
|
|
335
384
|
.mrow .mb .tool-body section > h2, .mrow .mb .diff-meta,
|
|
336
385
|
.mrow .mb .tool-call > summary:hover { background: var(--bub-soft); border-color: var(--bub-line) }
|
|
337
386
|
.mrow .mb .md-body pre code { background: transparent }
|
|
@@ -425,7 +474,10 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
425
474
|
}
|
|
426
475
|
.tg-head { order: 9; display: flex; align-items: center; gap: 4px 10px; flex-wrap: wrap; padding: 0 2px }
|
|
427
476
|
.mstat { display: inline-flex; align-items: center; gap: 4px 10px; flex-wrap: wrap }
|
|
428
|
-
|
|
477
|
+
/* 两方对话里只藏模型 / ctx —— 时刻与耗时每条 wizard 消息都留着。 */
|
|
478
|
+
.mrow.two :is(.mstat, .say-cap, .ho-acct) :is(.chip, .tg-tok) { display: none }
|
|
479
|
+
.ho-acct { display: inline-flex; align-items: center; gap: 4px 8px }
|
|
480
|
+
:is(.tg-head, .mstat, .say-cap, .ho-acct) :is(.chip.model, .chip.tier), .tg-tok, .tg-dur {
|
|
429
481
|
padding: 0; border: 0; border-radius: 0; background: none; font-weight: 400;
|
|
430
482
|
font-size: 10.5px; color: var(--faint); font-family: ui-monospace, Menlo, monospace;
|
|
431
483
|
}
|
|
@@ -620,20 +672,16 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
620
672
|
.wst::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: #b1bac4 }
|
|
621
673
|
.wst.run { background: #dafbe1; color: #1a7f37 }
|
|
622
674
|
.wst.run::before { background: #1a7f37; animation: pulse 1.4s infinite }
|
|
675
|
+
.wst.wait { background: #fbefff; color: #8250df }
|
|
676
|
+
.wst.wait::before { background: #8250df; animation: pulse 1.4s infinite }
|
|
623
677
|
.wst.off { background: transparent; color: var(--faint); box-shadow: inset 0 0 0 1px var(--line) }
|
|
624
678
|
.wst.off::before { background: transparent; box-shadow: inset 0 0 0 1.5px #b1bac4 }
|
|
625
679
|
.wst:empty { padding: 0; background: none; box-shadow: none }
|
|
626
680
|
.wst:empty::before { width: 7px; height: 7px }
|
|
627
681
|
/* ══ 关系图 · 关系树 (家谱与派活合成一棵, 以当前 role 为中心) ══════════
|
|
628
682
|
它替换的是侧栏的会话列表: 标题、图例与会话列表的分组标题同一种读法, 卡片就是会话项 (.ci)。 */
|
|
629
|
-
.tview .tall {
|
|
630
|
-
margin-left: auto; border: 0; background: none; padding: 0 2px; cursor: pointer; font-size: 11px; color: var(--faint);
|
|
631
|
-
text-decoration: underline dotted; text-underline-offset: 3px;
|
|
632
|
-
}
|
|
633
|
-
.tview .tall:hover { color: var(--accent) }
|
|
634
683
|
.tview h2 .warn { color: #9a6700; font-weight: 400 }
|
|
635
684
|
.tree.all > li + li { margin-top: 10px; padding-top: 10px; border-top: 1px dashed #eaeef2 }
|
|
636
|
-
.tfold { flex: none; font-size: 10px; font-weight: 400; color: var(--faint); border: 1px dashed var(--line); border-radius: 8px; padding: 0 5px; line-height: 14px }
|
|
637
685
|
.tsolo { font-size: 11.5px; color: var(--faint); margin: 0 8px 10px }
|
|
638
686
|
.tview .pempty { padding: 18px 8px }
|
|
639
687
|
|
|
@@ -677,6 +725,45 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
677
725
|
.ek.graph { color: #3d8577; background: #0a7d6b12 }
|
|
678
726
|
.ek.cross { font-weight: 400; background: #fff; box-shadow: inset 0 0 0 1px var(--line) }
|
|
679
727
|
|
|
728
|
+
/* ══ 宪章 · 按节 ═══════════════════════════════════════════════════ */
|
|
729
|
+
/* 通用 details summary (SHARED_CSS) 带灰底、大写和 ::before 箭头 —— 这里全部重置, 箭头自己画。 */
|
|
730
|
+
.cmix { display: flex; height: 8px; border-radius: 4px; overflow: hidden; gap: 2px; margin: 2px 0 6px }
|
|
731
|
+
.cmix i { display: block; min-width: 3px; background: #c4cbd3 }
|
|
732
|
+
.cmix i.top { background: #57606a }
|
|
733
|
+
.csec { border-top: 1px solid #eaeef2 }
|
|
734
|
+
.csec:first-of-type { border-top: 0 }
|
|
735
|
+
.csec > summary {
|
|
736
|
+
display: grid; grid-template-columns: 14px minmax(0, 1fr) minmax(60px, 160px) 92px; align-items: center; gap: 10px;
|
|
737
|
+
padding: 9px 4px; margin: 0 -4px; border-radius: 6px; border: 0; background: none;
|
|
738
|
+
cursor: pointer; list-style: none; user-select: none;
|
|
739
|
+
font-size: 13px; font-weight: 400; color: var(--ink); text-transform: none; letter-spacing: 0;
|
|
740
|
+
}
|
|
741
|
+
.csec > summary::-webkit-details-marker { display: none }
|
|
742
|
+
.csec > summary::before { content: "▸"; font-size: 11px; color: var(--faint); transition: transform .12s; justify-self: center }
|
|
743
|
+
.csec[open] > summary::before { content: "▸"; transform: rotate(90deg) }
|
|
744
|
+
.csec > summary:hover { background: #f6f8fa }
|
|
745
|
+
.csec .ct { overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
746
|
+
.csec[open] .ct { font-weight: 600 }
|
|
747
|
+
.csec .cbar { height: 6px; border-radius: 3px; background: #eaeef2; overflow: hidden }
|
|
748
|
+
.csec .cbar i { display: block; height: 100%; border-radius: 3px; background: #afb8c1 }
|
|
749
|
+
.csec.top .cbar i { background: #57606a }
|
|
750
|
+
.csec .cn { text-align: right; font-size: 11.5px; color: var(--mute); font-family: ui-monospace, Menlo, monospace; white-space: nowrap }
|
|
751
|
+
.csec .cn small { color: var(--faint); margin-left: 6px }
|
|
752
|
+
.csec .md-body { font-size: 13px; line-height: 1.6; margin: 0 0 12px 24px; padding: 2px 0 2px 12px; border-left: 2px solid #eaeef2; overflow-wrap: anywhere }
|
|
753
|
+
.csec .md-body > :first-child { margin-top: 0 }
|
|
754
|
+
.csec .md-body > :last-child { margin-bottom: 0 }
|
|
755
|
+
.csec .md-body ul { padding-left: 18px }
|
|
756
|
+
.csec .md-body pre { white-space: pre-wrap }
|
|
757
|
+
/* 关系 / 日程 / 宪章这类视图名很短, 窄屏上该让位的是副标题, 不是标题。 */
|
|
758
|
+
.outer .ch-who .t { flex-shrink: 0 }
|
|
759
|
+
.psec h3 .cx { white-space: nowrap; margin-left: auto; border: 0; background: none; padding: 0; cursor: pointer; font: 11px/1 inherit; color: var(--mute) }
|
|
760
|
+
.psec h3 .cx:hover { color: var(--ink) }
|
|
761
|
+
@media (max-width: 640px) {
|
|
762
|
+
.csec > summary { grid-template-columns: 14px minmax(0, 1fr) 84px }
|
|
763
|
+
.csec .cbar { display: none }
|
|
764
|
+
.csec .md-body { margin-left: 8px }
|
|
765
|
+
}
|
|
766
|
+
|
|
680
767
|
/* ══ 日程 · 总览 / 任务卡 ════════════════════════════════════════════ */
|
|
681
768
|
.pstats {
|
|
682
769
|
max-width: 900px; margin: 0 auto 18px; display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px;
|
|
@@ -751,13 +838,14 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
751
838
|
.jmm .tmp, .jmm .wchip { flex: none; white-space: nowrap }
|
|
752
839
|
|
|
753
840
|
/* ── 搜索 (⌘K): 名片下、关系/日程入口上的搜索框 + 居中浮层 ──────────────
|
|
754
|
-
入口与会话项同圆角,
|
|
841
|
+
入口与会话项同圆角, 无边框, 只靠浅灰底与侧栏白底区分; 悬停 / 键盘聚焦都只是底色再沉一档, 不描边。
|
|
842
|
+
浮层的结果行沿用会话项的两行读法。 */
|
|
755
843
|
.sbox {
|
|
756
|
-
flex: none; display: flex; align-items: center; gap: 8px; margin: 10px 10px 4px; padding:
|
|
757
|
-
border:
|
|
758
|
-
cursor: pointer; text-align: left; transition:
|
|
844
|
+
flex: none; display: flex; align-items: center; gap: 8px; margin: 10px 10px 4px; padding: 8px 11px;
|
|
845
|
+
border: 0; border-radius: 9px; background: var(--paper); color: var(--faint);
|
|
846
|
+
cursor: pointer; text-align: left; transition: background .12s, color .12s;
|
|
759
847
|
}
|
|
760
|
-
.sbox:hover
|
|
848
|
+
.sbox:hover, .sbox:focus-visible { background: var(--them-soft); color: var(--mute); outline: none }
|
|
761
849
|
.sbox .ic, .sk-in .ic { flex: none; display: inline-flex }
|
|
762
850
|
.sbox .ic svg, .sk-in .ic svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round }
|
|
763
851
|
.sbox .lb { flex: 1; min-width: 0; font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
|
|
@@ -841,3 +929,47 @@ span.av.go:hover { background: var(--av-hot); box-shadow: 0 0 0 3px var(--av-hot
|
|
|
841
929
|
/* 搜索跳到的那一句: 气泡闪一圈视角色。 */
|
|
842
930
|
.mrow.hit .mb > * { animation: hit 1.6s ease-out }
|
|
843
931
|
@keyframes hit { 0%, 30% { box-shadow: 0 0 0 3px #2f55c955 } 100% { box-shadow: 0 0 0 3px #2f55c900 } }
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
/* ══ 工单 (j:<id>) —— 工单页与工单列表都在主区; 侧栏 / 关系图只挂 📋 标记 ══════════════
|
|
935
|
+
进度徽标: 开着 = 已落定 / 一共 (琥珀), 收了 = 收工 (灰); 有人卡住另挂一枚紫色「N 卡住」。 */
|
|
936
|
+
.jtag { flex: none; margin-left: 6px; font-size: 10.5px; line-height: 15px; padding: 0 5px; border-radius: 4px; color: var(--faint); background: #f1f3f6; font-weight: 500 }
|
|
937
|
+
.jtag.open { color: #94741f; background: #bf870014 }
|
|
938
|
+
.jstuck { flex: none; margin-left: 4px; font-size: 10.5px; line-height: 15px; padding: 0 5px; border-radius: 4px; color: #8250df; background: #fbefff; font-weight: 500 }
|
|
939
|
+
.jmk { flex: none; margin-left: 4px; padding: 0 3px; border-radius: 4px; font-size: 10.5px; opacity: .8; cursor: pointer }
|
|
940
|
+
.jmk:hover { opacity: 1; background: #bf870022 }
|
|
941
|
+
.jmk i { font-style: normal; margin-left: 1px; color: #94741f; font-size: 10px }
|
|
942
|
+
.ek.jmk { margin-left: 0; opacity: 1; color: #94741f; background: #bf870014 }
|
|
943
|
+
.ek.jmk:hover { background: #bf870033 }
|
|
944
|
+
/* 消息上的工单 badge: 📋 标题 + 进度, 点了进工单页。 */
|
|
945
|
+
.mchip.job { display: inline-flex; align-items: center; gap: 3px; max-width: 260px; border: 0; font: inherit; font-size: 11px; line-height: 16px; color: #94741f; background: #bf870014; cursor: pointer }
|
|
946
|
+
.mchip.job:hover { background: #bf870030 }
|
|
947
|
+
.mchip.job .jt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0 }
|
|
948
|
+
.mchip.job .jtag { margin-left: 2px }
|
|
949
|
+
/* 工单列表 (主区): 与侧栏会话项同一种行; 已收工的淡一档, 悬停回满。 */
|
|
950
|
+
.jlist h2 { margin: 14px 4px 6px; font-size: 12px; font-weight: 500; color: var(--mute) }
|
|
951
|
+
.jlist h2 span { margin-left: 6px; font-weight: 400; color: var(--faint) }
|
|
952
|
+
.jlist .ci { width: 100% }
|
|
953
|
+
.jclosed .ci { opacity: .55 }
|
|
954
|
+
.jclosed .ci:hover { opacity: 1 }
|
|
955
|
+
/* 工单页的开工 / 收工两行。 */
|
|
956
|
+
.tg-job { margin: 6px auto; max-width: 560px; padding: 8px 12px; border-radius: 8px; border: 1px dashed #bf870066; background: #bf870008; font-size: 12px; color: var(--mute) }
|
|
957
|
+
.tg-job .jh { display: flex; gap: 6px; align-items: baseline; flex-wrap: wrap }
|
|
958
|
+
.tg-job .jh .jt { color: var(--ink); font-weight: 500 }
|
|
959
|
+
.tg-job .jh .s { margin-left: auto; color: var(--faint); font-size: 11px }
|
|
960
|
+
.tg-job .jmem { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 3px }
|
|
961
|
+
.tg-job .jmem li { display: flex; gap: 6px; align-items: baseline; flex-wrap: wrap }
|
|
962
|
+
/* 派给成员的那段活原样分行, 太长收在 4 行 (悬停看全文)。 */
|
|
963
|
+
.tg-job .jmem em { flex-basis: 100%; padding-left: 40px; font-style: normal; color: var(--faint); white-space: pre-wrap; overflow-wrap: anywhere; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden }
|
|
964
|
+
.tg-job .jmem .go { border: 0; background: none; padding: 0; font: inherit; color: var(--accent); cursor: pointer }
|
|
965
|
+
.tg-job .ja { flex-basis: 100%; padding-left: 40px; color: var(--faint); font-family: ui-monospace, monospace; font-size: 11px }
|
|
966
|
+
.tg-job .jo { flex: none; font-size: 10.5px; padding: 0 5px; border-radius: 4px; color: #1a7f37; background: #1a7f3712 }
|
|
967
|
+
.tg-job .jo.st-run { color: #94741f; background: #bf870014 }
|
|
968
|
+
.tg-job .jo.st-none { color: var(--faint); background: #f1f3f6 }
|
|
969
|
+
.tg-job .jo:is(.st-timeout, .st-silent, .st-dead, .st-canceled) { color: #cf222e; background: #cf222e10 }
|
|
970
|
+
.tg-job .md-body { margin-top: 6px; color: var(--ink); overflow-wrap: anywhere }
|
|
971
|
+
.tg-job .md-body.jplan { color: var(--mute) }
|
|
972
|
+
/* 关系图: 正在看一张工单时只亮它的当事人与两端都是当事人的线。 */
|
|
973
|
+
.tree.jsel .tci.jout { opacity: .3 }
|
|
974
|
+
.tree.jsel .tci.jout:hover { opacity: 1 }
|
|
975
|
+
.tree.jsel li.jdim { --lc: #d0d7de }
|