@shendeguize/dsh-agent-sidecar 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +78 -11
  2. package/lib/client.js +4708 -2932
  3. package/lib/client.js.map +1 -1
  4. package/package.json +3 -1
  5. package/src/client/analysis/AnalysisPanel.tsx +19 -27
  6. package/src/client/analysis/analysis.module.css +36 -97
  7. package/src/client/board/Board.tsx +255 -48
  8. package/src/client/board/board.module.css +113 -92
  9. package/src/client/board/logic.ts +99 -21
  10. package/src/client/board/project-view-logic.ts +27 -34
  11. package/src/client/board/project-view.module.css +46 -83
  12. package/src/client/board/project-view.tsx +50 -8
  13. package/src/client/board/strings.ts +70 -85
  14. package/src/client/commands.ts +30 -15
  15. package/src/client/controller.ts +27 -7
  16. package/src/client/detail/SessionDetail.tsx +234 -37
  17. package/src/client/detail/detail.module.css +100 -153
  18. package/src/client/detail/logic.ts +220 -29
  19. package/src/client/detail/strings.ts +66 -77
  20. package/src/client/detail-glue.ts +33 -0
  21. package/src/client/detail-view.module.css +43 -35
  22. package/src/client/detail-view.tsx +138 -118
  23. package/src/client/dsh-tools/LineageTree.tsx +22 -13
  24. package/src/client/dsh-tools/SearchPanel.tsx +18 -11
  25. package/src/client/dsh-tools/dsh-tools.module.css +53 -140
  26. package/src/client/dsh-tools/strings.ts +42 -77
  27. package/src/client/index.ts +285 -124
  28. package/src/client/inject/InjectPanel.tsx +81 -61
  29. package/src/client/inject/inject.module.css +97 -197
  30. package/src/client/inject/logic.ts +38 -0
  31. package/src/client/lifecycle/handoff.ts +83 -0
  32. package/src/client/locales/en.ts +91 -4
  33. package/src/client/locales/host.ts +131 -0
  34. package/src/client/locales/index.ts +196 -8
  35. package/src/client/locales/react.ts +10 -0
  36. package/src/client/locales/view.ts +38 -0
  37. package/src/client/locales/zh.ts +200 -125
  38. package/src/client/mount.tsx +75 -41
  39. package/src/client/navigation/CenterOverlay.tsx +40 -0
  40. package/src/client/navigation/center-overlay.module.css +51 -0
  41. package/src/client/navigation/center.ts +45 -0
  42. package/src/client/navigation/modal-isolation.ts +152 -0
  43. package/src/client/navigation/modal-surface-anchor.ts +72 -0
  44. package/src/client/navigation/sidebar-entry.module.css +73 -0
  45. package/src/client/navigation/sidebar-entry.ts +309 -0
  46. package/src/client/primitives/StaticPill.tsx +21 -0
  47. package/src/client/settings-card.module.css +35 -119
  48. package/src/client/settings-card.tsx +31 -153
  49. package/src/client/settings-fields.tsx +131 -0
  50. package/src/client/sidebar/SidebarTab.tsx +156 -0
  51. package/src/client/sidebar/model.ts +65 -0
  52. package/src/client/sidebar/sidebar-tab.module.css +118 -0
  53. package/src/client/sidebar-tab.tsx +46 -320
  54. package/src/client/theme/agsc.module.css +31 -0
  55. package/src/client/theme/parts.ts +56 -0
  56. package/src/client/ui-integration.ts +86 -0
  57. package/src/client/widget.tsx +42 -16
  58. package/src/client/inject/overlay.module.css +0 -22
@@ -1,9 +1,4 @@
1
- /*
2
- * Session-detail styles (design §5.1 view 2 / §5.3): every color rides a
3
- * --dsw-alias-* design token with a neutral fallback — no theme colors are
4
- * hardcoded as the only value. The gap marker uses the warn palette,
5
- * deliberately restrained (a thin honesty note, not an alarm).
6
- */
1
+ /* Session-detail layout over the shared Agent Sidecar / DSH token contract. */
7
2
 
8
3
  .root {
9
4
  display: flex;
@@ -13,8 +8,8 @@
13
8
  min-height: 420px;
14
9
  padding: 16px 20px;
15
10
  box-sizing: border-box;
16
- color: var(--dsw-alias-label-primary, #1f2328);
17
- background: var(--dsw-alias-bg-base, transparent);
11
+ color: var(--agsc-fg);
12
+ background: var(--agsc-bg);
18
13
  }
19
14
 
20
15
  /* -------------------------------------------------------------- header */
@@ -32,48 +27,21 @@
32
27
  flex-wrap: wrap;
33
28
  }
34
29
 
35
- .closeButton {
36
- font-size: 12px;
37
- font-family: inherit;
38
- color: var(--dsw-alias-label-secondary, #57606a);
39
- background: transparent;
40
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
41
- border-radius: 6px;
42
- padding: 2px 10px;
43
- cursor: pointer;
44
- }
45
-
46
- .closeButton:hover {
47
- color: var(--dsw-alias-label-primary, #1f2328);
48
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
49
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
50
- }
51
-
52
30
  .agent {
53
31
  display: inline-flex;
54
32
  align-items: center;
55
33
  gap: 5px;
56
34
  font-size: 13px;
57
35
  font-weight: 650;
58
- color: var(--dsw-alias-label-primary, #1f2328);
36
+ color: var(--dsw-alias-label-primary);
59
37
  }
60
38
 
61
39
  .agentGlyph {
62
40
  flex: none;
63
- color: var(--dsw-alias-brand-primary, #4d6bfe);
41
+ color: var(--dsw-alias-brand-primary);
64
42
  }
65
43
 
66
44
  .badge {
67
- display: inline-flex;
68
- align-items: center;
69
- gap: 5px;
70
- font-size: 12px;
71
- line-height: 20px;
72
- padding: 0 8px;
73
- border-radius: 999px;
74
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
75
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.03));
76
- color: var(--dsw-alias-label-secondary, #57606a);
77
45
  white-space: nowrap;
78
46
  }
79
47
 
@@ -82,59 +50,37 @@
82
50
  height: 8px;
83
51
  border-radius: 50%;
84
52
  flex: none;
85
- background: var(--dsw-alias-label-tertiary, #6e7781);
53
+ background: var(--agsc-fg-dimmed);
86
54
  }
87
55
 
88
56
  .dot[data-tone='success'] {
89
- background: var(--dsw-alias-state-success-primary, #1a7f37);
57
+ background: var(--agsc-ok);
90
58
  }
91
59
 
92
60
  .dot[data-tone='warn'] {
93
- background: var(--dsw-alias-state-warn-primary, #9a6700);
61
+ background: var(--agsc-warn);
94
62
  }
95
63
 
96
64
  .dot[data-tone='danger'] {
97
- background: var(--dsw-alias-state-error-primary, #cf222e);
65
+ background: var(--agsc-err);
98
66
  }
99
67
 
100
68
  .dot[data-tone='neutral'] {
101
- background: var(--dsw-alias-label-tertiary, #6e7781);
69
+ background: var(--agsc-fg-secondary);
102
70
  }
103
71
 
104
72
  .dot[data-tone='muted'] {
105
- background: var(--dsw-alias-label-dimmed, #8c959f);
73
+ background: var(--agsc-fg-dimmed);
106
74
  }
107
75
 
108
76
  .spacer {
109
77
  flex: 1;
110
78
  }
111
79
 
112
- .listenButton {
113
- font-size: 12px;
114
- font-family: inherit;
115
- color: var(--dsw-alias-label-secondary, #57606a);
116
- background: transparent;
117
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
118
- border-radius: 999px;
119
- padding: 2px 12px;
120
- cursor: pointer;
121
- }
122
-
123
- .listenButton:hover {
124
- color: var(--dsw-alias-label-primary, #1f2328);
125
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
126
- }
127
-
128
- .listenButton[data-active] {
129
- color: var(--dsw-alias-brand-primary, #4d6bfe);
130
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
131
- background: var(--dsw-alias-brand-tertiary, rgba(77, 107, 254, 0.08));
132
- }
133
-
134
80
  .title {
135
81
  font-size: 15px;
136
82
  font-weight: 600;
137
- color: var(--dsw-alias-label-primary, #1f2328);
83
+ color: var(--dsw-alias-label-primary);
138
84
  overflow: hidden;
139
85
  text-overflow: ellipsis;
140
86
  white-space: nowrap;
@@ -149,16 +95,17 @@
149
95
 
150
96
  .project {
151
97
  font-size: 12px;
152
- color: var(--dsw-alias-label-secondary, #57606a);
98
+ color: var(--dsw-alias-label-secondary);
153
99
  overflow: hidden;
154
100
  text-overflow: ellipsis;
155
101
  white-space: nowrap;
156
102
  }
157
103
 
104
+ /* Click-to-copy session id (UX-17): plain-text look, button semantics. */
158
105
  .sessionId {
159
106
  font-size: 11px;
160
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
161
- color: var(--dsw-alias-label-tertiary, #6e7781);
107
+ font-family: var(--ds-font-family-code);
108
+ color: var(--dsw-alias-label-tertiary);
162
109
  overflow: hidden;
163
110
  text-overflow: ellipsis;
164
111
  white-space: nowrap;
@@ -166,6 +113,21 @@
166
113
  max-width: 40%;
167
114
  }
168
115
 
116
+ .sessionId:hover {
117
+ color: var(--dsw-alias-label-primary);
118
+ text-decoration: underline;
119
+ }
120
+
121
+ .copiedBubble {
122
+ flex: none;
123
+ color: var(--agsc-ok);
124
+ }
125
+
126
+ .copiedBubble > span,
127
+ .sourceBadge > span {
128
+ color: inherit;
129
+ }
130
+
169
131
  .metaRow {
170
132
  display: flex;
171
133
  align-items: center;
@@ -175,7 +137,7 @@
175
137
 
176
138
  .disclaimer {
177
139
  font-size: 11px;
178
- color: var(--dsw-alias-label-caption, var(--dsw-alias-label-tertiary, #6e7781));
140
+ color: var(--dsw-alias-label-caption);
179
141
  }
180
142
 
181
143
  .sourceList {
@@ -185,23 +147,15 @@
185
147
  }
186
148
 
187
149
  .sourceBadge {
188
- font-size: 11px;
189
- line-height: 16px;
190
- padding: 0 6px;
191
- border-radius: 999px;
192
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
193
- color: var(--dsw-alias-label-secondary, #57606a);
194
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.03));
195
150
  white-space: nowrap;
196
151
  }
197
152
 
198
153
  .sourceBadge[data-tone='success'] {
199
- color: var(--dsw-alias-state-success-primary, #1a7f37);
200
- border-color: var(--dsw-alias-state-success-secondary, rgba(26, 127, 55, 0.24));
154
+ color: var(--agsc-ok);
201
155
  }
202
156
 
203
157
  .sourceBadge[data-tone='muted'] {
204
- color: var(--dsw-alias-label-dimmed, #8c959f);
158
+ color: var(--agsc-fg-dimmed);
205
159
  }
206
160
 
207
161
  /* -------------------------------------------------------------- banner */
@@ -210,10 +164,10 @@
210
164
  font-size: 12px;
211
165
  line-height: 18px;
212
166
  padding: 6px 10px;
213
- border-radius: 8px;
214
- color: var(--dsw-alias-state-warn-label, var(--dsw-alias-state-warn-primary, #9a6700));
215
- background: var(--dsw-alias-state-warn-tertiary, rgba(154, 103, 0, 0.08));
216
- border: 1px solid var(--dsw-alias-state-warn-secondary, rgba(154, 103, 0, 0.24));
167
+ border-radius: var(--agsc-radius-control);
168
+ color: var(--agsc-warn);
169
+ background: var(--dsw-alias-state-warn-tertiary);
170
+ border: 1px solid var(--dsw-alias-state-warn-secondary);
217
171
  }
218
172
 
219
173
  /* --------------------------------------------- loading / empty / error */
@@ -233,52 +187,44 @@
233
187
  .bodyStateTitle {
234
188
  font-size: 14px;
235
189
  font-weight: 600;
236
- color: var(--dsw-alias-label-primary, #1f2328);
190
+ color: var(--dsw-alias-label-primary);
237
191
  }
238
192
 
239
193
  .bodyState[data-kind='error'] .bodyStateTitle {
240
- color: var(--dsw-alias-state-error-primary, #cf222e);
194
+ color: var(--agsc-err);
241
195
  }
242
196
 
243
197
  .bodyStateHint {
244
198
  font-size: 12px;
245
199
  max-width: 420px;
246
200
  line-height: 20px;
247
- color: var(--dsw-alias-label-secondary, #57606a);
201
+ color: var(--dsw-alias-label-secondary);
248
202
  }
249
203
 
250
- /* --------------------------------------------------------------- pager */
204
+ /* --------------------------------------- kind filter chips (UX-03) */
251
205
 
252
- .pager {
206
+ .filterRow {
253
207
  display: flex;
254
- justify-content: center;
208
+ align-items: center;
209
+ gap: 6px;
210
+ flex-wrap: wrap;
255
211
  }
256
212
 
257
- .loadMoreButton {
258
- font-size: 12px;
259
- font-family: inherit;
260
- color: var(--dsw-alias-label-secondary, #57606a);
261
- background: transparent;
262
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
263
- border-radius: 6px;
264
- padding: 3px 14px;
265
- cursor: pointer;
213
+ .filterHiddenNote {
214
+ font-size: 11px;
215
+ color: var(--dsw-alias-label-tertiary);
266
216
  }
267
217
 
268
- .loadMoreButton:hover:enabled {
269
- color: var(--dsw-alias-label-primary, #1f2328);
270
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
271
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
272
- }
218
+ /* --------------------------------------------------------------- pager */
273
219
 
274
- .loadMoreButton:disabled {
275
- cursor: default;
276
- opacity: 0.6;
220
+ .pager {
221
+ display: flex;
222
+ justify-content: center;
277
223
  }
278
224
 
279
225
  .pagerNote {
280
226
  font-size: 11px;
281
- color: var(--dsw-alias-label-tertiary, #6e7781);
227
+ color: var(--dsw-alias-label-tertiary);
282
228
  }
283
229
 
284
230
  .hiddenNotice {
@@ -287,17 +233,7 @@
287
233
  justify-content: center;
288
234
  gap: 8px;
289
235
  font-size: 11px;
290
- color: var(--dsw-alias-label-tertiary, #6e7781);
291
- }
292
-
293
- .showAllButton {
294
- font-size: 11px;
295
- font-family: inherit;
296
- color: var(--dsw-alias-brand-primary, #4d6bfe);
297
- background: transparent;
298
- border: none;
299
- padding: 0;
300
- cursor: pointer;
236
+ color: var(--dsw-alias-label-tertiary);
301
237
  }
302
238
 
303
239
  /* ------------------------------------------------------------ timeline */
@@ -318,14 +254,37 @@
318
254
  flex-direction: column;
319
255
  gap: 4px;
320
256
  padding: 6px 10px;
321
- border-radius: 8px;
322
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.06));
323
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));
257
+ border-radius: var(--agsc-radius-control);
258
+ border: 1px solid var(--agsc-border);
259
+ background: var(--agsc-bg-raised);
324
260
  }
325
261
 
326
262
  .event[data-new] {
327
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
328
- background: var(--dsw-alias-brand-tertiary, rgba(77, 107, 254, 0.06));
263
+ border-color: var(--agsc-accent);
264
+ /* brand tint from the real token (UX-15). */
265
+ background: color-mix(in srgb, var(--agsc-accent) 6%, transparent);
266
+ }
267
+
268
+ /* Aggregated streaming-chunk run (UX-03): quiet one-line stand-in. */
269
+ .chunkRun {
270
+ display: flex;
271
+ align-items: center;
272
+ gap: 8px;
273
+ font-size: 11px;
274
+ line-height: 16px;
275
+ padding: 4px 10px;
276
+ border-radius: var(--agsc-radius-control);
277
+ color: var(--dsw-alias-label-tertiary);
278
+ background: var(--agsc-bg-raised);
279
+ border: 1px dashed var(--agsc-border-strong);
280
+ }
281
+
282
+ .chunkRun[data-new] {
283
+ border-color: var(--agsc-accent);
284
+ }
285
+
286
+ .chunkRunLabel {
287
+ flex: none;
329
288
  }
330
289
 
331
290
  .eventHead {
@@ -338,22 +297,22 @@
338
297
  .eventGlyph {
339
298
  flex: none;
340
299
  font-size: 12px;
341
- color: var(--dsw-alias-label-tertiary, #6e7781);
300
+ color: var(--dsw-alias-label-tertiary);
342
301
  }
343
302
 
344
303
  .event[data-kind='user'] .eventGlyph,
345
304
  .event[data-kind='assistant'] .eventGlyph {
346
- color: var(--dsw-alias-brand-primary, #4d6bfe);
305
+ color: var(--dsw-alias-brand-primary);
347
306
  }
348
307
 
349
308
  .event[data-kind='error'] .eventGlyph {
350
- color: var(--dsw-alias-state-error-primary, #cf222e);
309
+ color: var(--dsw-alias-state-error-primary);
351
310
  }
352
311
 
353
312
  .eventLabel {
354
313
  font-size: 12px;
355
314
  font-weight: 600;
356
- color: var(--dsw-alias-label-primary, #1f2328);
315
+ color: var(--dsw-alias-label-primary);
357
316
  white-space: nowrap;
358
317
  overflow: hidden;
359
318
  text-overflow: ellipsis;
@@ -361,18 +320,13 @@
361
320
 
362
321
  .eventSeq {
363
322
  font-size: 10px;
364
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
365
- color: var(--dsw-alias-label-tertiary, #6e7781);
323
+ font-family: var(--ds-font-family-code);
324
+ color: var(--dsw-alias-label-tertiary);
366
325
  flex: none;
367
326
  }
368
327
 
369
328
  .eventNew {
370
- font-size: 10px;
371
- line-height: 14px;
372
- padding: 0 5px;
373
- border-radius: 999px;
374
- color: var(--dsw-alias-brand-primary, #4d6bfe);
375
- border: 1px solid var(--dsw-alias-brand-primary, #4d6bfe);
329
+ color: var(--agsc-accent);
376
330
  flex: none;
377
331
  }
378
332
 
@@ -382,37 +336,30 @@
382
336
 
383
337
  .eventTime {
384
338
  font-size: 11px;
385
- color: var(--dsw-alias-label-caption, var(--dsw-alias-label-tertiary, #6e7781));
339
+ color: var(--dsw-alias-label-caption);
386
340
  flex: none;
387
341
  }
388
342
 
389
343
  .eventSummary {
390
344
  font-size: 12px;
391
345
  line-height: 18px;
392
- color: var(--dsw-alias-label-secondary, #57606a);
346
+ color: var(--dsw-alias-label-secondary);
393
347
  overflow-wrap: anywhere;
394
348
  }
395
349
 
396
350
  .expandButton {
397
351
  align-self: flex-start;
398
- font-size: 11px;
399
- font-family: inherit;
400
- color: var(--dsw-alias-brand-primary, #4d6bfe);
401
- background: transparent;
402
- border: none;
403
- padding: 0;
404
- cursor: pointer;
405
352
  }
406
353
 
407
354
  .eventBody {
408
355
  margin: 0;
409
356
  padding: 8px 10px;
410
- border-radius: 6px;
357
+ border-radius: var(--agsc-radius-control);
411
358
  font-size: 11px;
412
359
  line-height: 16px;
413
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
414
- color: var(--dsw-alias-label-primary, #1f2328);
415
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
360
+ font-family: var(--ds-font-family-code);
361
+ color: var(--dsw-alias-label-primary);
362
+ background: var(--dsw-alias-bg-layer-2);
416
363
  white-space: pre-wrap;
417
364
  overflow-wrap: anywhere;
418
365
  max-height: 320px;
@@ -425,9 +372,9 @@
425
372
  font-size: 11px;
426
373
  line-height: 16px;
427
374
  padding: 4px 10px;
428
- border-radius: 6px;
375
+ border-radius: var(--agsc-radius-control);
429
376
  text-align: center;
430
- color: var(--dsw-alias-state-warn-label, var(--dsw-alias-state-warn-primary, #9a6700));
431
- background: var(--dsw-alias-state-warn-tertiary, rgba(154, 103, 0, 0.06));
432
- border: 1px dashed var(--dsw-alias-state-warn-secondary, rgba(154, 103, 0, 0.32));
377
+ color: var(--agsc-warn);
378
+ background: var(--dsw-alias-state-warn-tertiary);
379
+ border: 1px dashed var(--dsw-alias-state-warn-secondary);
433
380
  }