@nelsonlongxiang/dsh-open-a2a-net 0.6.41 → 0.6.42

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.
Files changed (61) hide show
  1. package/README.md +1 -1
  2. package/README_zh.md +1 -1
  3. package/assets/stageDist/assets/index-Bj7S2pA1.css +1 -1
  4. package/assets/stageDist/assets/index-C-28k_o5.js +974 -974
  5. package/assets/stageDist/index.html +12 -12
  6. package/lib/client.js +64 -64
  7. package/lib/client.js.map +1 -1
  8. package/lib/index.js +57 -9
  9. package/lib/origin-claim.js +4 -0
  10. package/lib/skill/SKILL.md +117 -117
  11. package/lib/skill/references/collaboration.md +428 -428
  12. package/lib/skill/references/discovery.md +78 -78
  13. package/lib/skill/references/intake.md +107 -107
  14. package/lib/skill/references/membership.md +73 -73
  15. package/lib/skill/references/pitfalls.md +51 -51
  16. package/lib/skill/references/router.md +96 -96
  17. package/lib/skill/references/routing.md +65 -65
  18. package/lib/types/origin-claim.d.ts +2 -0
  19. package/nexus-stage/package.json +21 -21
  20. package/nexus-stage/scripts/mockhost.py +261 -261
  21. package/nexus-stage/src/canvas-ops.ts +191 -191
  22. package/nexus-stage/src/canvas-wire.ts +164 -164
  23. package/nexus-stage/src/cli-home-picker.ts +42 -42
  24. package/nexus-stage/src/fault.ts +56 -56
  25. package/nexus-stage/src/federation-overlay.ts +103 -103
  26. package/nexus-stage/src/federation.ts +241 -241
  27. package/nexus-stage/src/layout-doc.ts +145 -145
  28. package/nexus-stage/src/main.ts +513 -513
  29. package/nexus-stage/src/planning-card-text.ts +73 -73
  30. package/nexus-stage/src/planning-card.ts +63 -63
  31. package/nexus-stage/src/planning-edges.ts +26 -26
  32. package/nexus-stage/src/planning-fit.ts +45 -45
  33. package/nexus-stage/src/planning-frame-hue.ts +13 -13
  34. package/nexus-stage/src/planning-legend.ts +39 -39
  35. package/nexus-stage/src/planning-member-handles.ts +61 -61
  36. package/nexus-stage/src/planning-menus.ts +422 -422
  37. package/nexus-stage/src/planning-mirror.ts +75 -75
  38. package/nexus-stage/src/planning-nodelist.ts +294 -294
  39. package/nexus-stage/src/planning-overlap.ts +159 -159
  40. package/nexus-stage/src/planning-reachability.ts +28 -28
  41. package/nexus-stage/src/planning-relayout.ts +121 -121
  42. package/nexus-stage/src/planning-roster.ts +15 -15
  43. package/nexus-stage/src/planning-search.ts +168 -168
  44. package/nexus-stage/src/planning-types.ts +115 -115
  45. package/nexus-stage/src/planning-undo.ts +68 -68
  46. package/nexus-stage/src/planning-view.ts +1499 -1499
  47. package/nexus-stage/src/planning.css +340 -340
  48. package/nexus-stage/src/seat-name-editor.ts +31 -31
  49. package/nexus-stage/src/session-drag.ts +64 -64
  50. package/nexus-stage/src/viewport.ts +106 -106
  51. package/nexus-stage/src/wb-chat.ts +684 -684
  52. package/nexus-stage/src/wb-directory.ts +237 -237
  53. package/nexus-stage/src/wb-ledger.ts +279 -279
  54. package/nexus-stage/src/wb-names.ts +43 -43
  55. package/nexus-stage/src/wb-rail.ts +147 -147
  56. package/nexus-stage/src/workbench.css +388 -388
  57. package/nexus-stage/src/workbench.ts +1272 -1272
  58. package/nexus-stage/src/world.ts +509 -509
  59. package/nexus-stage/tsconfig.json +24 -24
  60. package/nexus-stage/vite.config.ts +15 -15
  61. package/package.json +1 -1
@@ -1,388 +1,388 @@
1
- /* A2A workbench styles (0.6.2 merged shell): the planning board is the stage,
2
- the operational panels ride a collapsible rail, the inspector is an overlay
3
- card. Responsive tiers are CSS-only:
4
- - ≥1440px rail 340px, everything docked
5
- - 1024–1439 rail 300px
6
- - <1024 rail becomes a left drawer (☰), inspector becomes a bottom sheet
7
- Dark default, light via prefers-color-scheme. Panels are data surfaces,
8
- not decoration — rows are monospaced data lines. */
9
- :root{
10
- color-scheme:dark;
11
- --n-bg:#060a12; --n-ink:#dde3f0; --n-ink-muted:#7a86a0; --n-panel:#0d1322;
12
- --n-live:#4ade80; --n-cold:#7a86a0; --n-border:#223052; --n-act:#f59e0b;
13
- --n-danger:#f87171; --n-accent:#9673f7; --n-rail-w:300px;
14
- --n-canvas:#22d3ee; --n-line:var(--n-border);
15
- --n-raised:#131b2e; --n-federal:#6366f1; --n-card-line:#5c6680;
16
- --n-error-ink:#fecaca; --n-error-panel:#2a0d10f2; --n-shadow:rgba(0,0,0,.35);
17
- }
18
- @media (prefers-color-scheme: light){
19
- :root{ --n-bg:#eef2fa; --n-ink:#1a2438; --n-ink-muted:#5a6580; --n-panel:#ffffff;
20
- --n-live:#157a37; --n-border:#c6d0e6; --n-act:#a84d08;
21
- --n-danger:#b91c1c; --n-accent:#6d28d9;
22
- --n-cold:#636c81; --n-canvas:#0e7490;
23
- --n-raised:#ffffff; --n-federal:#4f46e5; --n-card-line:#8a95ae;
24
- --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16); }
25
- }
26
- @media (min-width:1440px){ :root{ --n-rail-w:340px } }
27
- html,body,#app{height:100%;margin:0}
28
- body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif}
29
-
30
- .wb{display:flex;flex-direction:column;height:100%}
31
- .wb-header{display:flex;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--n-border);background:var(--n-panel)}
32
- .wb-title{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px;white-space:nowrap}
33
- .wb-badge{font-size:11px;font-weight:400;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:99px;padding:1px 8px}
34
- .wb-badge[hidden]{display:none}
35
- .wb-row-remote{margin-left:6px;padding:0 6px;border:1px solid currentColor;border-radius:99px;font-size:10.5px;color:var(--n-ink-muted);vertical-align:1px}
36
- .wb-header-stats{display:flex;gap:16px;font-size:12px;color:var(--n-ink-muted);flex-wrap:wrap;min-width:0}
37
- .wb-header-stats .wb-kv{display:flex;gap:6px}
38
- .wb-header-stats .wb-kv-k{color:var(--n-ink-muted)}
39
- .wb-header-stats .wb-kv-v{color:var(--n-ink)}
40
- /* Header verdict: exceptions only (results-first). Quiet when healthy. */
41
- .wb-header-ok{color:var(--n-ink-muted)}
42
- .wb-alert{border:1px solid currentColor;border-radius:99px;padding:0 9px;line-height:20px;white-space:nowrap;cursor:pointer;background:transparent;font:inherit}
43
- .wb-alert:hover{background:color-mix(in srgb,currentColor 12%,transparent)}
44
- .wb-alert:focus-visible{outline:2px solid currentColor;outline-offset:2px}
45
- .wb-alert-danger{color:var(--n-danger)}
46
- .wb-alert-warn{color:var(--n-act)}
47
- .wb-forensics{font-family:ui-monospace,Consolas,monospace;font-size:11px}
48
- .wb-icon-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;
49
- width:30px;height:30px;display:none;align-items:center;justify-content:center;font:inherit;font-size:14px;
50
- cursor:pointer;flex:none}
51
- .wb-icon-btn:hover{border-color:var(--n-accent)}
52
- .wb-owner-btn{display:inline-flex}
53
- .wb-menu{margin-left:0}
54
- .wb-rail-toggle{margin-left:auto}
55
- .wb.is-rail-collapsed .wb-rail{display:none}
56
-
57
- .wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}
58
-
59
- /* ── Rail (directory + operational panels in canvas mode) ── */
60
- .wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;
61
- background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
62
-
63
- .wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}
64
- .wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;
65
- color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}
66
- .wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}
67
- .wb-dot{font-size:10px}
68
- .wb-dot-live{color:var(--n-live)} .wb-dot-cold{color:var(--n-cold)} .wb-dot-canvas{color:var(--n-canvas)} .wb-dot-remote{color:var(--n-act)}
69
-
70
- /* ── Directory toolbar: unified search + category filters (0.6.6) ── */
71
- .wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}
72
- .wb-search{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
73
- border-radius:6px;padding:4px 8px;font:inherit;font-size:12.5px;min-width:0}
74
- .wb-search:focus{outline:1px solid var(--n-accent)}
75
- .wb-filters{display:flex;flex-wrap:wrap;gap:4px}
76
- .wb-filter{background:none;border:1px solid var(--n-border);color:var(--n-ink-muted);
77
- border-radius:99px;padding:0 10px;min-height:24px;font:inherit;font-size:11.5px;cursor:pointer}
78
- .wb-filter:hover{border-color:var(--n-accent);color:var(--n-ink)}
79
- .wb-filter.is-active{border-color:var(--n-accent);color:var(--n-ink);
80
- background:color-mix(in srgb,var(--n-accent) 16%,transparent)}
81
- .wb-item-badge{flex:none;font-size:10.5px;color:var(--n-canvas);border:1px solid color-mix(in srgb,var(--n-canvas) 45%,transparent);
82
- border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}
83
- /* 0.6.10: .wb-item-open (the ↗ jump affordance) removed by ruling —
84
- 禁止任何跳转,全部使用响应式布局. */
85
- .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
86
-
87
- /* ── Canvas member management (inspector, 0.6.6) ── */
88
- .wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}
89
- .wb-member-row:hover{background:color-mix(in srgb,var(--n-accent) 10%,transparent)}
90
- .wb-member-dot{flex:none;font-size:11px;color:var(--n-ink-muted);min-width:44px}
91
- .wb-member-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
92
- .wb-member-remove,.wb-member-submit{background:none;border:1px solid var(--n-border);color:var(--n-ink);
93
- border-radius:6px;padding:1px 8px;font:inherit;font-size:11.5px;cursor:pointer;flex:none}
94
- .wb-member-remove:hover:not(:disabled),.wb-member-submit:hover:not(:disabled){border-color:var(--n-danger)}
95
- .wb-member-submit:hover:not(:disabled){border-color:var(--n-accent)}
96
- .wb-member-add{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
97
- .wb-cli-home{display:flex;flex-wrap:wrap;gap:6px;padding:8px;margin:4px 0 10px;border:1px solid var(--n-border);border-radius:6px}
98
- .wb-cli-home [hidden]{display:none}
99
- .wb-cli-home .wb-hint{flex-basis:100%;margin-top:0}
100
- .wb-cli-home .wb-member-pick{min-width:0;max-width:100%}
101
- .wb-member-pick,.wb-member-manual{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
102
- border-radius:6px;padding:3px 8px;font:inherit;font-size:12px;min-width:0}
103
- .wb-member-pick{flex:1 1 150px}
104
- .wb-member-manual{flex:1 1 130px}
105
- .wb-member-pick:focus,.wb-member-manual:focus{outline:1px solid var(--n-accent)}
106
- .wb-hint{margin-top:10px;font-size:11px;color:var(--n-ink-muted);line-height:1.5}
107
- /* Quick dispatch (0.6.9): one human message to a routing team. */
108
- .wb-dispatch{margin-top:12px;border-top:1px dashed var(--n-border);padding-top:8px}
109
- .wb-dispatch-form{display:flex;flex-direction:column;gap:6px;margin-top:6px}
110
- .wb-dispatch-text{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
111
- border-radius:6px;padding:5px 8px;font:inherit;font-size:12px;min-height:52px;resize:vertical}
112
- .wb-dispatch-text:focus{outline:1px solid var(--n-accent)}
113
- .wb-dispatch-submit{align-self:flex-end;background:none;border:1px solid var(--n-border);color:var(--n-ink);
114
- border-radius:6px;padding:2px 14px;font:inherit;font-size:11.5px;cursor:pointer}
115
- .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}
116
- .wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}
117
- /* 0.6.11 inline transcript: read-only tail of a local session's own log. */
118
-
119
- /* ── Stage: board (canvas mode) or the data stack (data mode) ── */
120
- .wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}
121
- .wb-stage-board{position:absolute;inset:0;overflow:hidden}
122
- .wb-stage-board.is-hidden{display:none}
123
- .wb-data{display:flex;flex-direction:column;gap:14px;padding:10px 14px;overflow-y:auto;min-height:0}
124
- .wb-data.is-hidden{display:none}
125
-
126
- .wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}
127
- .wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}
128
- .wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}
129
- .wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);
130
- border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}
131
- .wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
132
- .wb-row-meta{color:var(--n-ink-muted)}
133
- .wb-row-badges{color:var(--n-live)}
134
- .wb-row-dir{min-width:16px}
135
- .wb-row-dir.is-fail{color:var(--n-danger)}
136
- .wb-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;
137
- padding:2px 10px;font:inherit;font-size:12px;cursor:pointer;margin-left:auto}
138
- .wb-btn:hover:not(:disabled){border-color:var(--n-accent)}
139
- .wb-btn:disabled{opacity:.5;cursor:default}
140
- .wb-btn-primary{border-color:var(--n-accent);color:var(--n-ink)}
141
- .wb-action{display:flex;gap:10px;align-items:baseline;font-size:12.5px;padding:5px 8px;border-radius:6px;
142
- border:1px solid var(--n-border);margin-bottom:4px}
143
- .wb-action-high{border-color:var(--n-danger)}
144
- .wb-action-text{flex:1}
145
- .wb-draft{display:flex;flex-direction:column;gap:8px;max-width:560px;margin-top:6px}
146
- .wb-select,.wb-textarea{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
147
- border-radius:8px;padding:6px 9px;font:inherit}
148
- .wb-textarea{resize:vertical}
149
- .wb-select:focus,.wb-textarea:focus{outline:1px solid var(--n-accent)}
150
-
151
- /* ── Inspector: overlay card on the stage; bottom sheet when narrow. ── */
152
- .wb-inspector{position:absolute;top:8px;right:8px;width:280px;max-height:calc(100% - 16px);
153
- overflow-y:auto;background:var(--n-panel);border:1px solid var(--n-border);border-radius:10px;
154
- padding:10px;z-index:20;box-shadow:0 8px 24px var(--n-shadow);display:none}
155
- .wb-inspector.is-open{display:block}
156
- .wb-inspector-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
157
- .wb-inspector-title{font-weight:600;font-size:12.5px}
158
- .wb-inspector .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px}
159
- .wb-card{display:flex;flex-direction:column;gap:6px}
160
- .wb-kv{display:flex;gap:8px;font-size:12px}
161
- .wb-kv-k{color:var(--n-ink-muted);min-width:58px;flex:none}
162
- .wb-kv-v{word-break:break-all}
163
- .wb-muted{color:var(--n-ink-muted)}
164
-
165
- /* ── Node chat drawer (wb-chat, rewritten 2026-10-23): head · info · thread · composer.
166
- The thread is the conversation (shown by default); the composer is pinned
167
- to the bottom; sends from this page track their receipts in the thread. ── */
168
- .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);
169
- display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);
170
- border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;
171
- transform:translateX(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}
172
- .wb-chat.is-open{transform:translateX(0);pointer-events:auto}
173
- .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}
174
- .wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
175
- .wb-chat-dot.is-live{background:var(--n-live)}
176
- .wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}
177
- .wb-chat-dot.is-peer{background:var(--n-federal)}
178
- .wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}
179
- .wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
180
- .wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
181
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
182
- .wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}
183
- .wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}
184
- .wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
185
- .wb-chat .wb-chat-back[hidden]{display:none}
186
- .wb-chat-info-btn[aria-expanded="true"]{border-color:var(--n-accent);color:var(--n-accent)}
187
- .wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;
188
- border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}
189
- .wb-chat-info[hidden]{display:none}
190
- .wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}
191
- .wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
192
- display:flex;flex-direction:column;gap:10px;padding:12px}
193
- .wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
194
- .wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}
195
- .wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;
196
- color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}
197
- .wb-chat-notice[hidden]{display:none}
198
- .wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}
199
- .wb-chat-empty.is-error{color:var(--n-danger)}
200
- .wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;
201
- font-size:13px;line-height:1.55}
202
- .wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}
203
- .wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));
204
- border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}
205
- /* Role label for screen readers; side and tint carry it visually. */
206
- .wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}
207
- .wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}
208
- .wb-msg-ledger .wb-msg-meta{justify-content:center}
209
- .wb-msg-in .wb-msg-meta{justify-content:flex-start}
210
- .wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
211
- .wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
212
- .wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}
213
- .wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}
214
- .wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}
215
- .wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}
216
- .wb-msg-status.is-ok{color:var(--n-live)}
217
- .wb-msg-status.is-warn{color:var(--n-act)}
218
- .wb-msg-status.is-danger{color:var(--n-danger)}
219
- .wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}
220
- .wb-chat-divider::before,.wb-chat-divider::after{content:'';flex:1;border-top:1px solid var(--n-border)}
221
- .wb-chat-sessions{display:flex;flex-direction:column;gap:6px}
222
- .wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;
223
- background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;
224
- color:var(--n-ink);font:inherit;cursor:pointer}
225
- .wb-chat-session:hover{border-color:var(--n-accent)}
226
- .wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
227
- .wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}
228
- .wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}
229
- .wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}
230
- .wb-chat-composer{display:flex;flex-direction:column;gap:4px}
231
- .wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}
232
- .wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;
233
- border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}
234
- .wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;
235
- background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}
236
- .wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}
237
- .wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}
238
- .wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}
239
- .wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}
240
- .wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}
241
-
242
- /* The one fault badge (planning.css carried a second, conflicting copy —
243
- the cascade mixed the two). Honesty surface: always above the board. */
244
- .nexus-fault{display:none;position:fixed;top:10px;right:12px;z-index:50;max-width:420px;
245
- font:12px/1.5 ui-monospace,Consolas,monospace;color:var(--n-error-ink);background:var(--n-error-panel);
246
- border:1px solid var(--n-danger);border-radius:8px;padding:6px 10px;pointer-events:none}
247
-
248
- /* ── Responsive tiers ── */
249
- @media (max-width:1023px){
250
- .wb-menu{display:inline-flex}
251
- .wb-rail-toggle{display:none}
252
- .wb-body{grid-template-columns:minmax(0,1fr)}
253
- .wb-rail{position:fixed;left:0;top:0;bottom:0;width:min(86vw,320px);z-index:40;
254
- background:var(--n-panel);border-right:1px solid var(--n-border);
255
- transform:translateX(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}
256
- .wb.is-rail-open .wb-rail{transform:translateX(0)}
257
- .wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}
258
- .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;
259
- transform:translateY(102%)}
260
- .wb-chat.is-open{transform:translateY(0)}
261
- }
262
- @media (pointer:coarse){
263
- .wb-filter,.wb-item,.wb-tab{min-height:36px}
264
- .wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}
265
- }
266
- @media (max-width:680px){
267
- .wb-header{flex-wrap:wrap;row-gap:4px}
268
- .wb-header-stats{order:3;width:100%}
269
- .wb-row-team{min-width:0;flex:1 1 auto}
270
- .wb-data{padding:8px}
271
- }
272
-
273
- /* gh#20 W-C: host rail rows — lamp + label + link badge + version + url. */
274
- .wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);
275
- border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}
276
- .wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}
277
- .wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
278
- .wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
279
- .wb-host-lamp.is-live{background:var(--n-live)}
280
- .wb-host-lamp.is-warm{background:var(--n-act)}
281
- .wb-host-lamp.is-cold{background:var(--n-ink-muted)}
282
- .wb-host-lamp.is-fail{background:var(--n-danger)}
283
- .wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}
284
- .wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}
285
- .wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}
286
- .wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}
287
- .wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}
288
- .wb-host-ver{flex:none;font-size:10px;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:4px;padding:0 4px}
289
- .wb-host-url{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink-muted);font-size:10.5px}
290
-
291
- /* ── Rail tabs (wb-rail, 2026-10-23): 目录 · 主机 · 台账 · 活动 · 规划, each panel
292
- with its own scroll. Badges count; color only when something needs a hand. ── */
293
- .wb-tabs{flex:none;display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--n-border);overflow-x:auto;scrollbar-width:none}
294
- .wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;
295
- background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;
296
- padding:6px 6px 7px;cursor:pointer;white-space:nowrap}
297
- .wb-tab:hover{color:var(--n-ink)}
298
- .wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}
299
- .wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}
300
- .wb-tab[hidden]{display:none}
301
- .wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}
302
- .wb-tab-badge:empty{display:none}
303
- .wb-tab-badge.is-danger,.wb-tab-badge.is-warn,.wb-tab-badge.is-accent{padding:0 6px;border-radius:99px;border:1px solid currentColor}
304
- .wb-tab-badge.is-danger{color:var(--n-danger)}
305
- .wb-tab-badge.is-warn{color:var(--n-act)}
306
- .wb-tab-badge.is-accent{color:var(--n-accent)}
307
- .wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
308
- .wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}
309
- .wb-tabpanel[hidden]{display:none}
310
- .wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
311
- .wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}
312
-
313
- /* ── 目录 (wb-directory) ── */
314
- .wb-tabpanel .wb-dir-tools{padding:0 0 6px}
315
- .wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}
316
- .wb-dir-group:first-child{margin-top:2px}
317
- .wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;
318
- font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}
319
- .wb-dir-head-label{font-weight:600;color:var(--n-ink)}
320
- .wb-dir-head-note{font-size:10.5px}
321
- .wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}
322
- .wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
323
- .wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}
324
- .wb-directory .wb-item.is-draggable{cursor:grab}
325
- .wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
326
- .wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}
327
- .wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
328
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
329
- .wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}
330
- .wb-directory .wb-item.is-unreachable{opacity:.78}
331
- .wb-unreachable-note{font-size:11px;line-height:1.35;color:var(--n-danger);white-space:normal;overflow-wrap:anywhere}
332
- .wb-node-warning{font-size:11px;line-height:1.35;color:var(--n-danger);white-space:normal;overflow-wrap:anywhere}
333
- .wb-dot-log{color:var(--n-ink-muted)}
334
-
335
- /* ── 台账 (wb-ledger) ── */
336
- .wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
337
- .wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;
338
- border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}
339
- .wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}
340
- .wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}
341
- .wb-led-tile.is-warn{border-color:var(--n-act)}
342
- .wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}
343
- .wb-led-tile.is-danger{border-color:var(--n-danger)}
344
- .wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}
345
- .wb-led-split{display:flex;flex-direction:column;gap:4px}
346
- .wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}
347
- .wb-led-seg{display:block;height:100%}
348
- .wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}
349
- .wb-led-split-item{display:inline-flex;align-items:center;gap:4px}
350
- .wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}
351
- .wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}
352
- .wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}
353
- .wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}
354
- .wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}
355
- .wb-led-seg.is-unclassified,.wb-led-swatch.is-unclassified,.wb-led-seg.is-other,.wb-led-swatch.is-other{background:color-mix(in srgb,var(--n-ink-muted) 45%,var(--n-border))}
356
- .wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}
357
- .wb-led-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:600;color:var(--n-ink)}
358
- .wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}
359
- .wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}
360
- .wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}
361
- .wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;
362
- border:1px solid var(--n-border);background:var(--n-raised);min-width:0}
363
- .wb-led-card.is-danger{border-color:var(--n-danger)}
364
- .wb-led-card.is-warn{border-left:3px solid var(--n-act)}
365
- .wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}
366
- .wb-led-card.is-link{cursor:pointer}
367
- .wb-led-card.is-link:hover{border-color:var(--n-accent)}
368
- .wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
369
- .wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}
370
- .wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}
371
- .wb-led-dir.is-in{color:var(--n-federal)}
372
- .wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);
373
- display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
374
- .wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}
375
- .wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}
376
- .wb-led-brief.is-missing{font-style:italic}
377
- .wb-led-meta{display:flex;flex-wrap:wrap;gap:2px 8px;font:11px/1.45 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:0}
378
- .wb-led-meta > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
379
- .wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}
380
- .wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}
381
- .wb-led-abandon.is-quiet{border-color:transparent;background:transparent;color:var(--n-ink-muted)}
382
- .wb-led-abandon.is-quiet:hover{border-color:var(--n-border);color:var(--n-ink)}
383
- .wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}
384
- .wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
385
- .wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}
386
- .wb-led-forensics summary{cursor:pointer}
387
- .wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
388
- .wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}
1
+ /* A2A workbench styles (0.6.2 merged shell): the planning board is the stage,
2
+ the operational panels ride a collapsible rail, the inspector is an overlay
3
+ card. Responsive tiers are CSS-only:
4
+ - ≥1440px rail 340px, everything docked
5
+ - 1024–1439 rail 300px
6
+ - <1024 rail becomes a left drawer (☰), inspector becomes a bottom sheet
7
+ Dark default, light via prefers-color-scheme. Panels are data surfaces,
8
+ not decoration — rows are monospaced data lines. */
9
+ :root{
10
+ color-scheme:dark;
11
+ --n-bg:#060a12; --n-ink:#dde3f0; --n-ink-muted:#7a86a0; --n-panel:#0d1322;
12
+ --n-live:#4ade80; --n-cold:#7a86a0; --n-border:#223052; --n-act:#f59e0b;
13
+ --n-danger:#f87171; --n-accent:#9673f7; --n-rail-w:300px;
14
+ --n-canvas:#22d3ee; --n-line:var(--n-border);
15
+ --n-raised:#131b2e; --n-federal:#6366f1; --n-card-line:#5c6680;
16
+ --n-error-ink:#fecaca; --n-error-panel:#2a0d10f2; --n-shadow:rgba(0,0,0,.35);
17
+ }
18
+ @media (prefers-color-scheme: light){
19
+ :root{ --n-bg:#eef2fa; --n-ink:#1a2438; --n-ink-muted:#5a6580; --n-panel:#ffffff;
20
+ --n-live:#157a37; --n-border:#c6d0e6; --n-act:#a84d08;
21
+ --n-danger:#b91c1c; --n-accent:#6d28d9;
22
+ --n-cold:#636c81; --n-canvas:#0e7490;
23
+ --n-raised:#ffffff; --n-federal:#4f46e5; --n-card-line:#8a95ae;
24
+ --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16); }
25
+ }
26
+ @media (min-width:1440px){ :root{ --n-rail-w:340px } }
27
+ html,body,#app{height:100%;margin:0}
28
+ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif}
29
+
30
+ .wb{display:flex;flex-direction:column;height:100%}
31
+ .wb-header{display:flex;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--n-border);background:var(--n-panel)}
32
+ .wb-title{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px;white-space:nowrap}
33
+ .wb-badge{font-size:11px;font-weight:400;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:99px;padding:1px 8px}
34
+ .wb-badge[hidden]{display:none}
35
+ .wb-row-remote{margin-left:6px;padding:0 6px;border:1px solid currentColor;border-radius:99px;font-size:10.5px;color:var(--n-ink-muted);vertical-align:1px}
36
+ .wb-header-stats{display:flex;gap:16px;font-size:12px;color:var(--n-ink-muted);flex-wrap:wrap;min-width:0}
37
+ .wb-header-stats .wb-kv{display:flex;gap:6px}
38
+ .wb-header-stats .wb-kv-k{color:var(--n-ink-muted)}
39
+ .wb-header-stats .wb-kv-v{color:var(--n-ink)}
40
+ /* Header verdict: exceptions only (results-first). Quiet when healthy. */
41
+ .wb-header-ok{color:var(--n-ink-muted)}
42
+ .wb-alert{border:1px solid currentColor;border-radius:99px;padding:0 9px;line-height:20px;white-space:nowrap;cursor:pointer;background:transparent;font:inherit}
43
+ .wb-alert:hover{background:color-mix(in srgb,currentColor 12%,transparent)}
44
+ .wb-alert:focus-visible{outline:2px solid currentColor;outline-offset:2px}
45
+ .wb-alert-danger{color:var(--n-danger)}
46
+ .wb-alert-warn{color:var(--n-act)}
47
+ .wb-forensics{font-family:ui-monospace,Consolas,monospace;font-size:11px}
48
+ .wb-icon-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:8px;
49
+ width:30px;height:30px;display:none;align-items:center;justify-content:center;font:inherit;font-size:14px;
50
+ cursor:pointer;flex:none}
51
+ .wb-icon-btn:hover{border-color:var(--n-accent)}
52
+ .wb-owner-btn{display:inline-flex}
53
+ .wb-menu{margin-left:0}
54
+ .wb-rail-toggle{margin-left:auto}
55
+ .wb.is-rail-collapsed .wb-rail{display:none}
56
+
57
+ .wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}
58
+
59
+ /* ── Rail (directory + operational panels in canvas mode) ── */
60
+ .wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;
61
+ background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
62
+
63
+ .wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}
64
+ .wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;
65
+ color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}
66
+ .wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}
67
+ .wb-dot{font-size:10px}
68
+ .wb-dot-live{color:var(--n-live)} .wb-dot-cold{color:var(--n-cold)} .wb-dot-canvas{color:var(--n-canvas)} .wb-dot-remote{color:var(--n-act)}
69
+
70
+ /* ── Directory toolbar: unified search + category filters (0.6.6) ── */
71
+ .wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}
72
+ .wb-search{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
73
+ border-radius:6px;padding:4px 8px;font:inherit;font-size:12.5px;min-width:0}
74
+ .wb-search:focus{outline:1px solid var(--n-accent)}
75
+ .wb-filters{display:flex;flex-wrap:wrap;gap:4px}
76
+ .wb-filter{background:none;border:1px solid var(--n-border);color:var(--n-ink-muted);
77
+ border-radius:99px;padding:0 10px;min-height:24px;font:inherit;font-size:11.5px;cursor:pointer}
78
+ .wb-filter:hover{border-color:var(--n-accent);color:var(--n-ink)}
79
+ .wb-filter.is-active{border-color:var(--n-accent);color:var(--n-ink);
80
+ background:color-mix(in srgb,var(--n-accent) 16%,transparent)}
81
+ .wb-item-badge{flex:none;font-size:10.5px;color:var(--n-canvas);border:1px solid color-mix(in srgb,var(--n-canvas) 45%,transparent);
82
+ border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}
83
+ /* 0.6.10: .wb-item-open (the ↗ jump affordance) removed by ruling —
84
+ 禁止任何跳转,全部使用响应式布局. */
85
+ .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
86
+
87
+ /* ── Canvas member management (inspector, 0.6.6) ── */
88
+ .wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}
89
+ .wb-member-row:hover{background:color-mix(in srgb,var(--n-accent) 10%,transparent)}
90
+ .wb-member-dot{flex:none;font-size:11px;color:var(--n-ink-muted);min-width:44px}
91
+ .wb-member-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
92
+ .wb-member-remove,.wb-member-submit{background:none;border:1px solid var(--n-border);color:var(--n-ink);
93
+ border-radius:6px;padding:1px 8px;font:inherit;font-size:11.5px;cursor:pointer;flex:none}
94
+ .wb-member-remove:hover:not(:disabled),.wb-member-submit:hover:not(:disabled){border-color:var(--n-danger)}
95
+ .wb-member-submit:hover:not(:disabled){border-color:var(--n-accent)}
96
+ .wb-member-add{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
97
+ .wb-cli-home{display:flex;flex-wrap:wrap;gap:6px;padding:8px;margin:4px 0 10px;border:1px solid var(--n-border);border-radius:6px}
98
+ .wb-cli-home [hidden]{display:none}
99
+ .wb-cli-home .wb-hint{flex-basis:100%;margin-top:0}
100
+ .wb-cli-home .wb-member-pick{min-width:0;max-width:100%}
101
+ .wb-member-pick,.wb-member-manual{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
102
+ border-radius:6px;padding:3px 8px;font:inherit;font-size:12px;min-width:0}
103
+ .wb-member-pick{flex:1 1 150px}
104
+ .wb-member-manual{flex:1 1 130px}
105
+ .wb-member-pick:focus,.wb-member-manual:focus{outline:1px solid var(--n-accent)}
106
+ .wb-hint{margin-top:10px;font-size:11px;color:var(--n-ink-muted);line-height:1.5}
107
+ /* Quick dispatch (0.6.9): one human message to a routing team. */
108
+ .wb-dispatch{margin-top:12px;border-top:1px dashed var(--n-border);padding-top:8px}
109
+ .wb-dispatch-form{display:flex;flex-direction:column;gap:6px;margin-top:6px}
110
+ .wb-dispatch-text{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
111
+ border-radius:6px;padding:5px 8px;font:inherit;font-size:12px;min-height:52px;resize:vertical}
112
+ .wb-dispatch-text:focus{outline:1px solid var(--n-accent)}
113
+ .wb-dispatch-submit{align-self:flex-end;background:none;border:1px solid var(--n-border);color:var(--n-ink);
114
+ border-radius:6px;padding:2px 14px;font:inherit;font-size:11.5px;cursor:pointer}
115
+ .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}
116
+ .wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}
117
+ /* 0.6.11 inline transcript: read-only tail of a local session's own log. */
118
+
119
+ /* ── Stage: board (canvas mode) or the data stack (data mode) ── */
120
+ .wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}
121
+ .wb-stage-board{position:absolute;inset:0;overflow:hidden}
122
+ .wb-stage-board.is-hidden{display:none}
123
+ .wb-data{display:flex;flex-direction:column;gap:14px;padding:10px 14px;overflow-y:auto;min-height:0}
124
+ .wb-data.is-hidden{display:none}
125
+
126
+ .wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}
127
+ .wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}
128
+ .wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}
129
+ .wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);
130
+ border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}
131
+ .wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
132
+ .wb-row-meta{color:var(--n-ink-muted)}
133
+ .wb-row-badges{color:var(--n-live)}
134
+ .wb-row-dir{min-width:16px}
135
+ .wb-row-dir.is-fail{color:var(--n-danger)}
136
+ .wb-btn{background:none;border:1px solid var(--n-border);color:var(--n-ink);border-radius:6px;
137
+ padding:2px 10px;font:inherit;font-size:12px;cursor:pointer;margin-left:auto}
138
+ .wb-btn:hover:not(:disabled){border-color:var(--n-accent)}
139
+ .wb-btn:disabled{opacity:.5;cursor:default}
140
+ .wb-btn-primary{border-color:var(--n-accent);color:var(--n-ink)}
141
+ .wb-action{display:flex;gap:10px;align-items:baseline;font-size:12.5px;padding:5px 8px;border-radius:6px;
142
+ border:1px solid var(--n-border);margin-bottom:4px}
143
+ .wb-action-high{border-color:var(--n-danger)}
144
+ .wb-action-text{flex:1}
145
+ .wb-draft{display:flex;flex-direction:column;gap:8px;max-width:560px;margin-top:6px}
146
+ .wb-select,.wb-textarea{background:var(--n-panel);border:1px solid var(--n-border);color:var(--n-ink);
147
+ border-radius:8px;padding:6px 9px;font:inherit}
148
+ .wb-textarea{resize:vertical}
149
+ .wb-select:focus,.wb-textarea:focus{outline:1px solid var(--n-accent)}
150
+
151
+ /* ── Inspector: overlay card on the stage; bottom sheet when narrow. ── */
152
+ .wb-inspector{position:absolute;top:8px;right:8px;width:280px;max-height:calc(100% - 16px);
153
+ overflow-y:auto;background:var(--n-panel);border:1px solid var(--n-border);border-radius:10px;
154
+ padding:10px;z-index:20;box-shadow:0 8px 24px var(--n-shadow);display:none}
155
+ .wb-inspector.is-open{display:block}
156
+ .wb-inspector-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
157
+ .wb-inspector-title{font-weight:600;font-size:12.5px}
158
+ .wb-inspector .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px}
159
+ .wb-card{display:flex;flex-direction:column;gap:6px}
160
+ .wb-kv{display:flex;gap:8px;font-size:12px}
161
+ .wb-kv-k{color:var(--n-ink-muted);min-width:58px;flex:none}
162
+ .wb-kv-v{word-break:break-all}
163
+ .wb-muted{color:var(--n-ink-muted)}
164
+
165
+ /* ── Node chat drawer (wb-chat, rewritten 2026-10-23): head · info · thread · composer.
166
+ The thread is the conversation (shown by default); the composer is pinned
167
+ to the bottom; sends from this page track their receipts in the thread. ── */
168
+ .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);
169
+ display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);
170
+ border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;
171
+ transform:translateX(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}
172
+ .wb-chat.is-open{transform:translateX(0);pointer-events:auto}
173
+ .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}
174
+ .wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
175
+ .wb-chat-dot.is-live{background:var(--n-live)}
176
+ .wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}
177
+ .wb-chat-dot.is-peer{background:var(--n-federal)}
178
+ .wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}
179
+ .wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
180
+ .wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
181
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
182
+ .wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}
183
+ .wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}
184
+ .wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
185
+ .wb-chat .wb-chat-back[hidden]{display:none}
186
+ .wb-chat-info-btn[aria-expanded="true"]{border-color:var(--n-accent);color:var(--n-accent)}
187
+ .wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;
188
+ border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}
189
+ .wb-chat-info[hidden]{display:none}
190
+ .wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}
191
+ .wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
192
+ display:flex;flex-direction:column;gap:10px;padding:12px}
193
+ .wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
194
+ .wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}
195
+ .wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;
196
+ color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}
197
+ .wb-chat-notice[hidden]{display:none}
198
+ .wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}
199
+ .wb-chat-empty.is-error{color:var(--n-danger)}
200
+ .wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;
201
+ font-size:13px;line-height:1.55}
202
+ .wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}
203
+ .wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));
204
+ border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}
205
+ /* Role label for screen readers; side and tint carry it visually. */
206
+ .wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}
207
+ .wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}
208
+ .wb-msg-ledger .wb-msg-meta{justify-content:center}
209
+ .wb-msg-in .wb-msg-meta{justify-content:flex-start}
210
+ .wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
211
+ .wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
212
+ .wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}
213
+ .wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}
214
+ .wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}
215
+ .wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}
216
+ .wb-msg-status.is-ok{color:var(--n-live)}
217
+ .wb-msg-status.is-warn{color:var(--n-act)}
218
+ .wb-msg-status.is-danger{color:var(--n-danger)}
219
+ .wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}
220
+ .wb-chat-divider::before,.wb-chat-divider::after{content:'';flex:1;border-top:1px solid var(--n-border)}
221
+ .wb-chat-sessions{display:flex;flex-direction:column;gap:6px}
222
+ .wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;
223
+ background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;
224
+ color:var(--n-ink);font:inherit;cursor:pointer}
225
+ .wb-chat-session:hover{border-color:var(--n-accent)}
226
+ .wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
227
+ .wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}
228
+ .wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}
229
+ .wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}
230
+ .wb-chat-composer{display:flex;flex-direction:column;gap:4px}
231
+ .wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}
232
+ .wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;
233
+ border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}
234
+ .wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;
235
+ background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}
236
+ .wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}
237
+ .wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}
238
+ .wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}
239
+ .wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}
240
+ .wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}
241
+
242
+ /* The one fault badge (planning.css carried a second, conflicting copy —
243
+ the cascade mixed the two). Honesty surface: always above the board. */
244
+ .nexus-fault{display:none;position:fixed;top:10px;right:12px;z-index:50;max-width:420px;
245
+ font:12px/1.5 ui-monospace,Consolas,monospace;color:var(--n-error-ink);background:var(--n-error-panel);
246
+ border:1px solid var(--n-danger);border-radius:8px;padding:6px 10px;pointer-events:none}
247
+
248
+ /* ── Responsive tiers ── */
249
+ @media (max-width:1023px){
250
+ .wb-menu{display:inline-flex}
251
+ .wb-rail-toggle{display:none}
252
+ .wb-body{grid-template-columns:minmax(0,1fr)}
253
+ .wb-rail{position:fixed;left:0;top:0;bottom:0;width:min(86vw,320px);z-index:40;
254
+ background:var(--n-panel);border-right:1px solid var(--n-border);
255
+ transform:translateX(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}
256
+ .wb.is-rail-open .wb-rail{transform:translateX(0)}
257
+ .wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}
258
+ .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;
259
+ transform:translateY(102%)}
260
+ .wb-chat.is-open{transform:translateY(0)}
261
+ }
262
+ @media (pointer:coarse){
263
+ .wb-filter,.wb-item,.wb-tab{min-height:36px}
264
+ .wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}
265
+ }
266
+ @media (max-width:680px){
267
+ .wb-header{flex-wrap:wrap;row-gap:4px}
268
+ .wb-header-stats{order:3;width:100%}
269
+ .wb-row-team{min-width:0;flex:1 1 auto}
270
+ .wb-data{padding:8px}
271
+ }
272
+
273
+ /* gh#20 W-C: host rail rows — lamp + label + link badge + version + url. */
274
+ .wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);
275
+ border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}
276
+ .wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}
277
+ .wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
278
+ .wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
279
+ .wb-host-lamp.is-live{background:var(--n-live)}
280
+ .wb-host-lamp.is-warm{background:var(--n-act)}
281
+ .wb-host-lamp.is-cold{background:var(--n-ink-muted)}
282
+ .wb-host-lamp.is-fail{background:var(--n-danger)}
283
+ .wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}
284
+ .wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}
285
+ .wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}
286
+ .wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}
287
+ .wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}
288
+ .wb-host-ver{flex:none;font-size:10px;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:4px;padding:0 4px}
289
+ .wb-host-url{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink-muted);font-size:10.5px}
290
+
291
+ /* ── Rail tabs (wb-rail, 2026-10-23): 目录 · 主机 · 台账 · 活动 · 规划, each panel
292
+ with its own scroll. Badges count; color only when something needs a hand. ── */
293
+ .wb-tabs{flex:none;display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--n-border);overflow-x:auto;scrollbar-width:none}
294
+ .wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;
295
+ background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;
296
+ padding:6px 6px 7px;cursor:pointer;white-space:nowrap}
297
+ .wb-tab:hover{color:var(--n-ink)}
298
+ .wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}
299
+ .wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}
300
+ .wb-tab[hidden]{display:none}
301
+ .wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}
302
+ .wb-tab-badge:empty{display:none}
303
+ .wb-tab-badge.is-danger,.wb-tab-badge.is-warn,.wb-tab-badge.is-accent{padding:0 6px;border-radius:99px;border:1px solid currentColor}
304
+ .wb-tab-badge.is-danger{color:var(--n-danger)}
305
+ .wb-tab-badge.is-warn{color:var(--n-act)}
306
+ .wb-tab-badge.is-accent{color:var(--n-accent)}
307
+ .wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
308
+ .wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}
309
+ .wb-tabpanel[hidden]{display:none}
310
+ .wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
311
+ .wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}
312
+
313
+ /* ── 目录 (wb-directory) ── */
314
+ .wb-tabpanel .wb-dir-tools{padding:0 0 6px}
315
+ .wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}
316
+ .wb-dir-group:first-child{margin-top:2px}
317
+ .wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;
318
+ font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}
319
+ .wb-dir-head-label{font-weight:600;color:var(--n-ink)}
320
+ .wb-dir-head-note{font-size:10.5px}
321
+ .wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}
322
+ .wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
323
+ .wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}
324
+ .wb-directory .wb-item.is-draggable{cursor:grab}
325
+ .wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
326
+ .wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}
327
+ .wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
328
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
329
+ .wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}
330
+ .wb-directory .wb-item.is-unreachable{opacity:.78}
331
+ .wb-unreachable-note{font-size:11px;line-height:1.35;color:var(--n-danger);white-space:normal;overflow-wrap:anywhere}
332
+ .wb-node-warning{font-size:11px;line-height:1.35;color:var(--n-danger);white-space:normal;overflow-wrap:anywhere}
333
+ .wb-dot-log{color:var(--n-ink-muted)}
334
+
335
+ /* ── 台账 (wb-ledger) ── */
336
+ .wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
337
+ .wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;
338
+ border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}
339
+ .wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}
340
+ .wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}
341
+ .wb-led-tile.is-warn{border-color:var(--n-act)}
342
+ .wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}
343
+ .wb-led-tile.is-danger{border-color:var(--n-danger)}
344
+ .wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}
345
+ .wb-led-split{display:flex;flex-direction:column;gap:4px}
346
+ .wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}
347
+ .wb-led-seg{display:block;height:100%}
348
+ .wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}
349
+ .wb-led-split-item{display:inline-flex;align-items:center;gap:4px}
350
+ .wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}
351
+ .wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}
352
+ .wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}
353
+ .wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}
354
+ .wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}
355
+ .wb-led-seg.is-unclassified,.wb-led-swatch.is-unclassified,.wb-led-seg.is-other,.wb-led-swatch.is-other{background:color-mix(in srgb,var(--n-ink-muted) 45%,var(--n-border))}
356
+ .wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}
357
+ .wb-led-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:600;color:var(--n-ink)}
358
+ .wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}
359
+ .wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}
360
+ .wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}
361
+ .wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;
362
+ border:1px solid var(--n-border);background:var(--n-raised);min-width:0}
363
+ .wb-led-card.is-danger{border-color:var(--n-danger)}
364
+ .wb-led-card.is-warn{border-left:3px solid var(--n-act)}
365
+ .wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}
366
+ .wb-led-card.is-link{cursor:pointer}
367
+ .wb-led-card.is-link:hover{border-color:var(--n-accent)}
368
+ .wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
369
+ .wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}
370
+ .wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}
371
+ .wb-led-dir.is-in{color:var(--n-federal)}
372
+ .wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);
373
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
374
+ .wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}
375
+ .wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}
376
+ .wb-led-brief.is-missing{font-style:italic}
377
+ .wb-led-meta{display:flex;flex-wrap:wrap;gap:2px 8px;font:11px/1.45 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:0}
378
+ .wb-led-meta > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
379
+ .wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}
380
+ .wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}
381
+ .wb-led-abandon.is-quiet{border-color:transparent;background:transparent;color:var(--n-ink-muted)}
382
+ .wb-led-abandon.is-quiet:hover{border-color:var(--n-border);color:var(--n-ink)}
383
+ .wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}
384
+ .wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
385
+ .wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}
386
+ .wb-led-forensics summary{cursor:pointer}
387
+ .wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
388
+ .wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}