@nelsonlongxiang/dsh-open-a2a-net 0.6.24 → 0.6.26

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 (38) hide show
  1. package/README.md +15 -11
  2. package/README_zh.md +3 -2
  3. package/assets/nexusDist/assets/index-DszoLz8i.js +5 -0
  4. package/assets/nexusDist/assets/index-uQf7NwjF.css +1 -0
  5. package/assets/nexusDist/index.html +2 -2
  6. package/cli/a2a.mjs +300 -0
  7. package/lib/card.js +17 -0
  8. package/lib/cli-deposit.js +141 -0
  9. package/lib/exposure-store.js +82 -0
  10. package/lib/index.js +904 -57
  11. package/lib/owner-settings.js +100 -0
  12. package/lib/peer-store.js +65 -9
  13. package/lib/task-ledger.js +44 -3
  14. package/lib/types/cli-deposit.d.ts +53 -0
  15. package/lib/types/exposure-store.d.ts +45 -0
  16. package/lib/types/index.d.ts +5 -0
  17. package/lib/types/owner-settings.d.ts +19 -0
  18. package/lib/types/peer-store.d.ts +22 -3
  19. package/lib/types/task-ledger.d.ts +18 -0
  20. package/lib/types/types.d.ts +10 -0
  21. package/nexus-stage/src/canvas-ops.ts +2 -2
  22. package/nexus-stage/src/federation.ts +6 -0
  23. package/nexus-stage/src/main.ts +97 -4
  24. package/nexus-stage/src/planning-menus.ts +16 -4
  25. package/nexus-stage/src/planning-types.ts +3 -0
  26. package/nexus-stage/src/planning-view.ts +208 -18
  27. package/nexus-stage/src/planning.css +4 -0
  28. package/nexus-stage/src/wb-chat.ts +670 -0
  29. package/nexus-stage/src/wb-directory.ts +222 -0
  30. package/nexus-stage/src/wb-ledger.ts +266 -0
  31. package/nexus-stage/src/wb-rail.ts +147 -0
  32. package/nexus-stage/src/workbench.css +190 -84
  33. package/nexus-stage/src/workbench.ts +385 -721
  34. package/nexus-stage/src/world.ts +5 -1
  35. package/package.json +18 -22
  36. package/assets/nexusDist/assets/index-034h1cNc.js +0 -3
  37. package/assets/nexusDist/assets/index-PG9EieGX.css +0 -1
  38. package/lib/types/client.d.ts +0 -73
@@ -14,8 +14,6 @@
14
14
  --n-canvas:#22d3ee; --n-line:var(--n-border);
15
15
  --n-raised:#131b2e; --n-federal:#6366f1; --n-card-line:#5c6680;
16
16
  --n-error-ink:#fecaca; --n-error-panel:#2a0d10f2; --n-shadow:rgba(0,0,0,.35);
17
- --n-role-user:#7dd3fc; --n-role-user-bg:rgba(56,189,248,.16);
18
- --n-role-assistant:#6ee7b7; --n-role-assistant-bg:rgba(52,211,153,.14);
19
17
  }
20
18
  @media (prefers-color-scheme: light){
21
19
  :root{ --n-bg:#eef2fa; --n-ink:#1a2438; --n-ink-muted:#5a6580; --n-panel:#ffffff;
@@ -23,9 +21,7 @@
23
21
  --n-danger:#b91c1c; --n-accent:#6d28d9;
24
22
  --n-cold:#636c81; --n-canvas:#0e7490;
25
23
  --n-raised:#ffffff; --n-federal:#4f46e5; --n-card-line:#8a95ae;
26
- --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16);
27
- --n-role-user:#075985; --n-role-user-bg:rgba(14,116,144,.12);
28
- --n-role-assistant:#065f46; --n-role-assistant-bg:rgba(5,150,105,.12); }
24
+ --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16); }
29
25
  }
30
26
  @media (min-width:1440px){ :root{ --n-rail-w:340px } }
31
27
  html,body,#app{height:100%;margin:0}
@@ -56,28 +52,15 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
56
52
  .wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}
57
53
 
58
54
  /* ── Rail (directory + operational panels in canvas mode) ── */
59
- .wb-rail{border-right:1px solid var(--n-border);overflow-y:auto;min-width:0;background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
60
- .wb-sec{border-bottom:1px solid color-mix(in srgb,var(--n-border) 60%,transparent)}
61
- .wb-sec-head{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%;
62
- background:none;border:none;color:var(--n-ink);font:inherit;font-weight:600;font-size:12.5px;
63
- padding:8px 12px;cursor:pointer;text-transform:uppercase;letter-spacing:.05em}
64
- .wb-sec-head:hover{color:var(--n-accent)}
65
- .wb-sec-count{font-weight:400;font-size:11px;color:var(--n-ink-muted)}
66
- .wb-sec.is-collapsed .wb-sec-body{display:none}
67
- .wb-sec-body{padding:2px 10px 10px}
68
- /* Data mode: the three panels move to the stage — their rail seats hide. */
69
- .wb[data-mode="data"] .wb-sec[data-sec="ledger"],
70
- .wb[data-mode="data"] .wb-sec[data-sec="activity"],
71
- .wb[data-mode="data"] .wb-sec[data-sec="plan"]{display:none}
55
+ .wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;
56
+ background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
72
57
 
73
58
  .wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}
74
59
  .wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;
75
60
  color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}
76
61
  .wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}
77
62
  .wb-dot{font-size:10px}
78
- .wb-dot-live{color:var(--n-live)} .wb-dot-cold{color:var(--n-cold)} .wb-dot-canvas{color:var(--n-canvas)}
79
- .wb-dot-peer{color:var(--n-accent)} .wb-dot-remote{color:var(--n-act)}
80
- .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
63
+ .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)}
81
64
 
82
65
  /* ── Directory toolbar: unified search + category filters (0.6.6) ── */
83
66
  .wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}
@@ -94,7 +77,7 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
94
77
  border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}
95
78
  /* 0.6.10: .wb-item-open (the ↗ jump affordance) removed by ruling —
96
79
  禁止任何跳转,全部使用响应式布局. */
97
- .wb-item-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:46%}
80
+ .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
98
81
 
99
82
  /* ── Canvas member management (inspector, 0.6.6) ── */
100
83
  .wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}
@@ -123,16 +106,6 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
123
106
  .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}
124
107
  .wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}
125
108
  /* 0.6.11 inline transcript: read-only tail of a local session's own log. */
126
- .wb-transcript{display:flex;flex-direction:column;gap:6px}
127
- .wb-transcript-title{font-size:12px;color:var(--n-ink-muted)}
128
- .wb-transcript-body.is-folded{display:none}
129
- .wb-transcript-refresh{margin-left:auto;font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--n-line);background:transparent;color:var(--n-ink-muted);cursor:pointer}
130
- .wb-transcript-body{display:flex;flex-direction:column;gap:4px;max-height:220px;overflow-y:auto}
131
- .wb-transcript-row{display:flex;gap:6px;align-items:flex-start;font-size:12px;line-height:1.45}
132
- .wb-transcript-role{flex:0 0 auto;font-size:10px;padding:0 5px;border-radius:999px;margin-top:2px}
133
- .wb-transcript-user .wb-transcript-role{background:var(--n-role-user-bg);color:var(--n-role-user)}
134
- .wb-transcript-assistant .wb-transcript-role{background:var(--n-role-assistant-bg);color:var(--n-role-assistant)}
135
- .wb-transcript-text{flex:1 1 auto;min-width:0;color:var(--n-ink);word-break:break-word}
136
109
 
137
110
  /* ── Stage: board (canvas mode) or the data stack (data mode) ── */
138
111
  .wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}
@@ -144,28 +117,10 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
144
117
  .wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}
145
118
  .wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}
146
119
  .wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}
147
- .wb-table{flex-direction:column;gap:2px}
148
120
  .wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);
149
121
  border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}
150
- .wb-row-id{min-width:130px}
151
122
  .wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
152
123
  .wb-row-meta{color:var(--n-ink-muted)}
153
- /* Owner signal (2026-10-21): the ledger is a RESULTS face — brief-first
154
- rows, exception-driven color, quiet normals. */
155
- .wb-row-result{flex-direction:column;align-items:stretch;gap:2px;flex-wrap:nowrap}
156
- .wb-row-head{color:var(--n-ink);font-size:12.5px;font-family:Avenir Next,Segoe UI Variable,Segoe UI,sans-serif;
157
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
158
- .wb-row-meta-line{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:11px;
159
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
160
- .wb-row-result:not(.wb-row-alert) .wb-row-head{color:var(--n-ink-muted)}
161
- .wb-row-alert{border-color:var(--n-danger)}
162
- .wb-row-alert .wb-row-head{color:var(--n-danger)}
163
- /* The dispatch brief is the row's only human-readable payload — give it the
164
- remaining width and clip rather than wrapping the table into unreadability
165
- (full text stays in the title tooltip). */
166
- .wb-row-brief{flex:1 1 160px;min-width:0;color:var(--n-ink);overflow:hidden;
167
- text-overflow:ellipsis;white-space:nowrap}
168
- .wb-row-brief:empty{flex:0 0 0;display:none}
169
124
  .wb-row-badges{color:var(--n-live)}
170
125
  .wb-row-dir{min-width:16px}
171
126
  .wb-row-dir.is-fail{color:var(--n-danger)}
@@ -198,42 +153,82 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
198
153
  .wb-kv-v{word-break:break-all}
199
154
  .wb-muted{color:var(--n-ink-muted)}
200
155
 
201
- /* ── Node chat drawer (0.6.13): right-side conversation face. ── */
202
- .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:360px;max-width:calc(100% - 16px);
156
+ /* ── Node chat drawer (wb-chat, rewritten 2026-10-23): head · info · thread · composer.
157
+ The thread is the conversation (shown by default); the composer is pinned
158
+ to the bottom; sends from this page track their receipts in the thread. ── */
159
+ .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);
203
160
  display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);
204
- border-radius:10px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);
161
+ border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;
205
162
  transform:translateX(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}
206
163
  .wb-chat.is-open{transform:translateX(0);pointer-events:auto}
207
- .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 8px;border-bottom:1px solid var(--n-border)}
208
- .wb-chat-dot{flex:none;font-size:11px}
209
- .wb-chat-dot.is-live{color:var(--n-accent)}
210
- .wb-chat-dot.is-cold{color:var(--n-ink-muted)}
211
- .wb-chat-dot.is-peer{color:var(--n-act)}
212
- .wb-chat-title{font-weight:600;font-size:13px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
213
- .wb-chat-sub{flex:1 1 auto;min-width:0;font-size:11px;color:var(--n-ink-muted);
164
+ .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}
165
+ .wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
166
+ .wb-chat-dot.is-live{background:var(--n-live)}
167
+ .wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}
168
+ .wb-chat-dot.is-peer{background:var(--n-federal)}
169
+ .wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}
170
+ .wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
171
+ .wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
214
172
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
215
- .wb-chat .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px;flex:none}
216
- .wb-chat-body{flex:1 1 auto;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:10px}
217
- .wb-chat-note{font-size:12px;color:var(--n-ink-muted);border:1px dashed var(--n-border);
218
- border-radius:8px;padding:8px 10px}
219
-
220
- /* ── Ledger density: stat strip, age histogram, load rows ── */
221
- .wb-stats{display:flex;gap:8px;flex-wrap:wrap;margin:2px 0 10px}
222
- .wb-stat{display:inline-flex;align-items:baseline;gap:6px;padding:4px 10px;border-radius:8px;
223
- border:1px solid var(--n-border);background:color-mix(in srgb,var(--n-panel) 70%,transparent);cursor:help}
224
- .wb-stat-k{font-size:11px;color:var(--n-ink-muted)}
225
- .wb-stat-v{font-family:ui-monospace,Consolas,monospace;font-size:14px;font-weight:600}
226
- .wb-stat-warn{border-color:var(--n-act)}
227
- .wb-stat-warn .wb-stat-v{color:var(--n-act)}
228
- .wb-stat-danger{border-color:var(--n-danger)}
229
- .wb-stat-danger .wb-stat-v{color:var(--n-danger)}
230
- .wb-hist{display:flex;flex-direction:column;gap:3px;margin:2px 0 8px;max-width:420px}
231
- .wb-bar-row{display:flex;align-items:center;gap:8px;font-size:11px}
232
- .wb-bar-k{color:var(--n-ink-muted);min-width:52px;flex:none;text-align:right}
233
- .wb-bar-track{flex:1;height:9px;border-radius:4px;overflow:hidden;
234
- background:color-mix(in srgb,var(--n-border) 55%,transparent)}
235
- .wb-bar-fill{display:block;height:100%;border-radius:4px;background:var(--n-accent)}
236
- .wb-bar-v{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:28px}
173
+ .wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}
174
+ .wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}
175
+ .wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
176
+ .wb-chat .wb-chat-back[hidden]{display:none}
177
+ .wb-chat-info-btn[aria-expanded="true"]{border-color:var(--n-accent);color:var(--n-accent)}
178
+ .wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;
179
+ border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}
180
+ .wb-chat-info[hidden]{display:none}
181
+ .wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}
182
+ .wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
183
+ display:flex;flex-direction:column;gap:10px;padding:12px}
184
+ .wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
185
+ .wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}
186
+ .wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;
187
+ color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}
188
+ .wb-chat-notice[hidden]{display:none}
189
+ .wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}
190
+ .wb-chat-empty.is-error{color:var(--n-danger)}
191
+ .wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;
192
+ font-size:13px;line-height:1.55}
193
+ .wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}
194
+ .wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));
195
+ border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}
196
+ /* Role label for screen readers; side and tint carry it visually. */
197
+ .wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}
198
+ .wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}
199
+ .wb-msg-ledger .wb-msg-meta{justify-content:center}
200
+ .wb-msg-in .wb-msg-meta{justify-content:flex-start}
201
+ .wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
202
+ .wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
203
+ .wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}
204
+ .wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}
205
+ .wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}
206
+ .wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}
207
+ .wb-msg-status.is-ok{color:var(--n-live)}
208
+ .wb-msg-status.is-warn{color:var(--n-act)}
209
+ .wb-msg-status.is-danger{color:var(--n-danger)}
210
+ .wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}
211
+ .wb-chat-divider::before,.wb-chat-divider::after{content:'';flex:1;border-top:1px solid var(--n-border)}
212
+ .wb-chat-sessions{display:flex;flex-direction:column;gap:6px}
213
+ .wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;
214
+ background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;
215
+ color:var(--n-ink);font:inherit;cursor:pointer}
216
+ .wb-chat-session:hover{border-color:var(--n-accent)}
217
+ .wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
218
+ .wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}
219
+ .wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}
220
+ .wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}
221
+ .wb-chat-composer{display:flex;flex-direction:column;gap:4px}
222
+ .wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}
223
+ .wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;
224
+ border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}
225
+ .wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;
226
+ background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}
227
+ .wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}
228
+ .wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}
229
+ .wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}
230
+ .wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}
231
+ .wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}
237
232
 
238
233
  /* The one fault badge (planning.css carried a second, conflicting copy —
239
234
  the cascade mixed the two). Honesty surface: always above the board. */
@@ -251,12 +246,12 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
251
246
  transform:translateX(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}
252
247
  .wb.is-rail-open .wb-rail{transform:translateX(0)}
253
248
  .wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}
254
- .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:70%;
249
+ .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;
255
250
  transform:translateY(102%)}
256
251
  .wb-chat.is-open{transform:translateY(0)}
257
252
  }
258
253
  @media (pointer:coarse){
259
- .wb-filter,.wb-item,.wb-sec-head{min-height:36px}
254
+ .wb-filter,.wb-item,.wb-tab{min-height:36px}
260
255
  .wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}
261
256
  }
262
257
  @media (max-width:680px){
@@ -265,3 +260,114 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
265
260
  .wb-row-team{min-width:0;flex:1 1 auto}
266
261
  .wb-data{padding:8px}
267
262
  }
263
+
264
+ /* gh#20 W-C: host rail rows — lamp + label + link badge + version + url. */
265
+ .wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);
266
+ border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}
267
+ .wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}
268
+ .wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
269
+ .wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
270
+ .wb-host-lamp.is-live{background:var(--n-live)}
271
+ .wb-host-lamp.is-warm{background:var(--n-act)}
272
+ .wb-host-lamp.is-cold{background:var(--n-ink-muted)}
273
+ .wb-host-lamp.is-fail{background:var(--n-danger)}
274
+ .wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}
275
+ .wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}
276
+ .wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}
277
+ .wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}
278
+ .wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}
279
+ .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}
280
+ .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}
281
+
282
+ /* ── Rail tabs (wb-rail, 2026-10-23): 目录 · 主机 · 台账 · 活动 · 规划, each panel
283
+ with its own scroll. Badges count; color only when something needs a hand. ── */
284
+ .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}
285
+ .wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;
286
+ background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;
287
+ padding:6px 6px 7px;cursor:pointer;white-space:nowrap}
288
+ .wb-tab:hover{color:var(--n-ink)}
289
+ .wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}
290
+ .wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}
291
+ .wb-tab[hidden]{display:none}
292
+ .wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}
293
+ .wb-tab-badge:empty{display:none}
294
+ .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}
295
+ .wb-tab-badge.is-danger{color:var(--n-danger)}
296
+ .wb-tab-badge.is-warn{color:var(--n-act)}
297
+ .wb-tab-badge.is-accent{color:var(--n-accent)}
298
+ .wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
299
+ .wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}
300
+ .wb-tabpanel[hidden]{display:none}
301
+ .wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
302
+ .wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}
303
+
304
+ /* ── 目录 (wb-directory) ── */
305
+ .wb-tabpanel .wb-dir-tools{padding:0 0 6px}
306
+ .wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}
307
+ .wb-dir-group:first-child{margin-top:2px}
308
+ .wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;
309
+ font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}
310
+ .wb-dir-head-label{font-weight:600;color:var(--n-ink)}
311
+ .wb-dir-head-note{font-size:10.5px}
312
+ .wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}
313
+ .wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
314
+ .wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}
315
+ .wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
316
+ .wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}
317
+ .wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
318
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
319
+ .wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}
320
+ .wb-dot-log{color:var(--n-ink-muted)}
321
+
322
+ /* ── 台账 (wb-ledger) ── */
323
+ .wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
324
+ .wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;
325
+ border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}
326
+ .wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}
327
+ .wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}
328
+ .wb-led-tile.is-warn{border-color:var(--n-act)}
329
+ .wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}
330
+ .wb-led-tile.is-danger{border-color:var(--n-danger)}
331
+ .wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}
332
+ .wb-led-split{display:flex;flex-direction:column;gap:4px}
333
+ .wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}
334
+ .wb-led-seg{display:block;height:100%}
335
+ .wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}
336
+ .wb-led-split-item{display:inline-flex;align-items:center;gap:4px}
337
+ .wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}
338
+ .wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}
339
+ .wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}
340
+ .wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}
341
+ .wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}
342
+ .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))}
343
+ .wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}
344
+ .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)}
345
+ .wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}
346
+ .wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}
347
+ .wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}
348
+ .wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;
349
+ border:1px solid var(--n-border);background:var(--n-raised);min-width:0}
350
+ .wb-led-card.is-danger{border-color:var(--n-danger)}
351
+ .wb-led-card.is-warn{border-left:3px solid var(--n-act)}
352
+ .wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}
353
+ .wb-led-card.is-link{cursor:pointer}
354
+ .wb-led-card.is-link:hover{border-color:var(--n-accent)}
355
+ .wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
356
+ .wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}
357
+ .wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}
358
+ .wb-led-dir.is-in{color:var(--n-federal)}
359
+ .wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);
360
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
361
+ .wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}
362
+ .wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}
363
+ .wb-led-brief.is-missing{font-style:italic}
364
+ .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}
365
+ .wb-led-meta > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
366
+ .wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}
367
+ .wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}
368
+ .wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}
369
+ .wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
370
+ .wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}
371
+ .wb-led-forensics summary{cursor:pointer}
372
+ .wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
373
+ .wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}