@lincyaw/dsh 0.1.0 → 0.2.0-rc.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 (78) hide show
  1. package/README.md +8 -4
  2. package/build/client.mjs +7 -1
  3. package/build/dist/client.js +1364 -64
  4. package/build/dist/client.json +225 -21
  5. package/build/ensure.mjs +11 -2
  6. package/cordis.patch.yml +9 -0
  7. package/entries/events.mjs +7 -0
  8. package/entries/load.mjs +11 -0
  9. package/entries/telemetry.mjs +7 -0
  10. package/entries/turns.mjs +7 -0
  11. package/package.json +32 -19
  12. package/src/client/RootLayout.tsx +332 -0
  13. package/src/client/agent-requests.ts +64 -0
  14. package/src/client/assistant-setup.tsx +185 -0
  15. package/src/client/author-settings.ts +57 -0
  16. package/src/client/brand.tsx +21 -14
  17. package/src/client/contract.ts +48 -1
  18. package/src/client/document-context.ts +39 -0
  19. package/src/client/dsh.d.ts +27 -1
  20. package/src/client/fallback.tsx +23 -19
  21. package/src/client/frame.css +280 -120
  22. package/src/client/index.tsx +72 -69
  23. package/src/client/launch-target.ts +89 -0
  24. package/src/client/layout.ts +90 -77
  25. package/src/client/mascot.tsx +37 -0
  26. package/src/client/messages.ts +142 -49
  27. package/src/client/{chrome.tsx → navigation-shell.tsx} +20 -25
  28. package/src/client/observable.ts +16 -0
  29. package/src/client/paths.ts +17 -0
  30. package/src/client/root-reload.ts +163 -0
  31. package/src/client/runtime-diagnostics.tsx +228 -0
  32. package/src/client/settings-opener.ts +26 -0
  33. package/src/client/{source.tsx → source-links.tsx} +16 -26
  34. package/src/client/speech-settings.tsx +7 -0
  35. package/src/client/styles.css +42 -0
  36. package/src/client/theme.ts +4 -2
  37. package/src/client/workbench-keys.ts +36 -0
  38. package/src/client/workspace-events.ts +114 -0
  39. package/src/node/bindings.ts +345 -0
  40. package/src/node/context.ts +131 -20
  41. package/src/node/{dsh.ts → dsh-types.ts} +33 -2
  42. package/src/node/fake-collector.ts +46 -0
  43. package/src/node/fake-model.ts +80 -0
  44. package/src/node/launch.ts +127 -10
  45. package/src/node/policy.ts +20 -23
  46. package/src/node/routes.ts +21 -11
  47. package/src/node/server-routes.ts +3 -0
  48. package/src/node/service.ts +58 -207
  49. package/src/node/skills.ts +9 -31
  50. package/src/node/telemetry.ts +126 -0
  51. package/src/node/tools.ts +34 -11
  52. package/src/node/{turns/index.ts → turns.ts} +48 -37
  53. package/src/node/workbench.ts +51 -6
  54. package/src/node/workspace-events.ts +167 -0
  55. package/src/node/workspaces.ts +2 -2
  56. package/src/workspace-events.ts +31 -0
  57. package/web.patch.yml +27 -56
  58. package/rows/load.mjs +0 -8
  59. package/rows/turns.mjs +0 -7
  60. package/skills/presmium-author/SKILL.md +0 -95
  61. package/skills/presmium-author/references/assistance.md +0 -27
  62. package/skills/presmium-author/references/code.md +0 -52
  63. package/skills/presmium-author/references/directives.md +0 -592
  64. package/skills/presmium-author/references/publishing.md +0 -60
  65. package/skills/presmium-author/references/writing.md +0 -72
  66. package/skills/presmium-present/SKILL.md +0 -69
  67. package/skills/presmium-present/references/classroom.md +0 -46
  68. package/skills/presmium-present/references/delivery.md +0 -63
  69. package/skills/presmium-present/references/lecture.md +0 -58
  70. package/src/client/Frame.tsx +0 -314
  71. /package/{rows → entries}/context.mjs +0 -0
  72. /package/{rows → entries}/policy.mjs +0 -0
  73. /package/{rows → entries}/routes.mjs +0 -0
  74. /package/{rows → entries}/service.mjs +0 -0
  75. /package/{rows → entries}/skills.mjs +0 -0
  76. /package/{rows → entries}/tools.mjs +0 -0
  77. /package/{rows → entries}/workbench.mjs +0 -0
  78. /package/{rows → entries}/workspaces.mjs +0 -0
@@ -7,23 +7,23 @@ body,
7
7
  .pmw-frame {
8
8
  position: relative;
9
9
  display: grid;
10
- grid-template-rows: minmax(0, 1fr) auto auto;
10
+ grid-template-rows: auto minmax(0, 1fr) auto;
11
11
  grid-template-areas:
12
- 'activity panels'
13
- 'status status'
14
- 'bottom bottom';
15
- grid-template-columns: 48px minmax(0, 1fr);
12
+ 'appbar'
13
+ 'panels'
14
+ 'bottom';
15
+ grid-template-columns: minmax(0, 1fr);
16
16
  height: 100%;
17
17
  overflow: hidden;
18
- background: var(--pm-color-bg);
18
+ background: var(--pm-color-chrome);
19
19
  color: var(--pm-color-ink);
20
20
  }
21
21
 
22
22
  .pmw-frame__skip {
23
23
  position: absolute;
24
24
  z-index: 30;
25
- top: 4px;
26
- left: 4px;
25
+ top: var(--pm-space-1);
26
+ left: var(--pm-space-1);
27
27
  padding: var(--pm-space-2) var(--pm-space-3);
28
28
  border-radius: var(--pm-radius-control);
29
29
  background: var(--pm-color-surface);
@@ -35,97 +35,180 @@ body,
35
35
  transform: none;
36
36
  }
37
37
 
38
- .pmw-activity {
39
- grid-area: activity;
38
+ /* The app bar across the top: the brand, where the author is, and the commands of the whole workbench. */
39
+
40
+ .pmw-appbar {
41
+ grid-area: appbar;
40
42
  display: flex;
41
- flex-direction: column;
42
43
  align-items: center;
43
- gap: var(--pm-space-1);
44
- padding: var(--pm-space-2) 0;
45
- border-right: 1px solid var(--pm-color-line);
46
- background: var(--pm-color-sunk);
44
+ gap: var(--pm-space-px);
45
+ min-width: 0;
46
+ height: var(--pm-appbar-height);
47
+ padding: 0 var(--pm-space-2) 0 var(--pm-space-3);
48
+ border-bottom: var(--pm-size-hairline) solid var(--pm-color-line);
49
+ background: var(--pm-color-chrome);
50
+ font-size: var(--pm-text-sm);
47
51
  }
48
52
 
49
- .pmw-activity__logo {
53
+ .pmw-appbar__brand {
54
+ display: inline-flex;
55
+ flex: none;
56
+ align-items: center;
57
+ gap: var(--pm-space-2);
58
+ margin-right: var(--pm-space-3);
59
+ font-size: var(--pm-text-md);
60
+ }
61
+
62
+ .pmw-appbar__places {
50
63
  display: flex;
51
- margin-bottom: var(--pm-space-2);
64
+ align-items: center;
65
+ min-width: 0;
66
+ margin: 0;
67
+ padding: 0;
68
+ list-style: none;
52
69
  }
53
70
 
54
- .pmw-activity__end {
71
+ .pmw-appbar__places > li {
55
72
  display: flex;
56
- flex-direction: column;
57
- gap: var(--pm-space-1);
58
- margin-top: auto;
73
+ align-items: center;
74
+ min-width: 0;
75
+ }
76
+
77
+ .pmw-appbar__places > li + li::before {
78
+ flex: none;
79
+ margin: 0 var(--pm-space-px);
80
+ color: var(--pm-color-line-strong);
81
+ content: '/';
59
82
  }
60
83
 
61
- .pmw-activity__button {
84
+ .pmw-appbar__place,
85
+ .pmw-appbar__button {
86
+ box-sizing: border-box;
62
87
  position: relative;
63
- display: grid;
64
- place-items: center;
65
- width: 36px;
66
- height: 36px;
67
- padding: 0;
68
- border: 0;
69
- border-radius: var(--pm-radius-control);
88
+ display: inline-flex;
89
+ flex: none;
90
+ align-items: center;
91
+ gap: var(--pm-space-1);
92
+ height: var(--pm-size-tool);
93
+ min-width: var(--pm-size-tool);
94
+ margin: 0;
95
+ padding: 0 var(--pm-space-2);
96
+ border: var(--pm-size-hairline) solid transparent;
97
+ border-radius: var(--pm-radius-tool);
70
98
  background: none;
71
99
  color: var(--pm-color-muted);
100
+ font: inherit;
101
+ white-space: nowrap;
72
102
  cursor: pointer;
73
103
  }
74
104
 
75
- .pmw-activity__count {
76
- position: absolute;
77
- top: 2px;
78
- right: 2px;
79
- min-width: 14px;
80
- padding: 0 3px;
81
- border-radius: var(--pm-radius-pill);
82
- background: var(--pm-color-accent);
83
- color: var(--pm-color-on-accent);
84
- font-size: 10px;
85
- line-height: 14px;
105
+ .pmw-appbar__place {
106
+ flex: 0 1 auto;
107
+ }
108
+
109
+ .pmw-appbar__label {
110
+ min-width: 0;
111
+ overflow: hidden;
112
+ text-overflow: ellipsis;
86
113
  }
87
114
 
88
- .pmw-activity__button:hover {
89
- background: color-mix(in srgb, var(--pm-color-ink) 6%, transparent);
115
+ .pmw-appbar__place[aria-current] {
90
116
  color: var(--pm-color-ink);
117
+ font-weight: 600;
91
118
  }
92
119
 
93
- .pmw-activity__button[aria-pressed='true'] {
94
- background: var(--pm-color-surface);
95
- box-shadow: inset 2px 0 0 var(--pm-color-accent);
120
+ span.pmw-appbar__place {
121
+ cursor: default;
122
+ }
123
+
124
+ .pmw-appbar__place:is(button):hover,
125
+ .pmw-appbar__button:hover {
126
+ background: var(--pm-color-hover);
127
+ color: var(--pm-color-ink);
128
+ }
129
+
130
+ .pmw-appbar__button[aria-pressed='true'] {
131
+ border-color: var(--pm-color-accent-line);
132
+ background: var(--pm-color-selected);
96
133
  color: var(--pm-color-accent);
97
134
  }
98
135
 
99
- .pmw-activity__button:focus-visible {
100
- outline: 2px solid var(--pm-color-accent);
101
- outline-offset: 1px;
136
+ .pmw-appbar__place:focus-visible,
137
+ .pmw-appbar__button:focus-visible {
138
+ outline: var(--pm-size-stroke) solid var(--pm-color-accent);
139
+ outline-offset: var(--pm-size-hairline);
140
+ }
141
+
142
+ .pmw-appbar__divider {
143
+ flex: none;
144
+ width: var(--pm-size-hairline);
145
+ height: var(--pm-size-divider);
146
+ margin: 0 var(--pm-space-1);
147
+ background: var(--pm-color-line);
148
+ }
149
+
150
+ .pmw-appbar__approvals {
151
+ display: inline-flex;
152
+ flex: none;
153
+ margin-right: var(--pm-space-1);
154
+ }
155
+
156
+ .pmw-appbar__approvals:empty {
157
+ display: none;
158
+ }
159
+
160
+ .pmw-appbar__more {
161
+ display: inline-flex;
162
+ color: var(--pm-color-muted);
163
+ }
164
+
165
+ .pmw-appbar .pm-ui-icon {
166
+ width: var(--pm-size-icon);
167
+ height: var(--pm-size-icon);
168
+ }
169
+
170
+ .pmw-appbar__brand > .pmw-logo {
171
+ width: var(--pm-size-logo);
172
+ height: var(--pm-size-logo);
173
+ }
174
+
175
+ .pmw-appbar__more > .pm-ui-icon-button {
176
+ width: var(--pm-size-tool);
177
+ height: var(--pm-size-tool);
178
+ border-radius: var(--pm-radius-tool);
179
+ }
180
+
181
+ .pmw-appbar__busy {
182
+ position: absolute;
183
+ top: var(--pm-space-1);
184
+ right: var(--pm-space-1);
185
+ width: var(--pm-size-dot);
186
+ height: var(--pm-size-dot);
187
+ border-radius: 50%;
188
+ background: var(--pm-color-accent);
189
+ animation: pmw-pulse var(--pm-duration-pulse) ease-in-out infinite;
190
+ }
191
+
192
+ @keyframes pmw-pulse {
193
+ 50% { opacity: 0.3; }
194
+ }
195
+
196
+ @media (prefers-reduced-motion: reduce) {
197
+ .pmw-appbar__busy { animation: none; }
102
198
  }
103
199
 
104
- .pmw-frame__side,
105
200
  .pmw-frame__sidebar {
106
201
  grid-area: side;
107
202
  min-width: 0;
108
203
  min-height: 0;
109
- overflow: auto;
110
- border-right: 1px solid var(--pm-color-line);
111
- background: var(--pm-color-bg);
112
- }
113
-
114
- .pmw-frame__sidebar {
115
204
  overflow: hidden;
116
- background: var(--dsw-specific-sidebar-fill, var(--pm-color-sunk));
205
+ background: var(--pm-color-chrome);
117
206
  }
118
207
 
119
- .pmw-frame__side:not([data-shown]),
120
- .pmw-frame__side[data-content='sessions'],
121
208
  .pmw-frame__sidebar:not([data-shown]) {
122
209
  display: none;
123
210
  }
124
211
 
125
- .pmw-frame__side-files[hidden] {
126
- display: none;
127
- }
128
-
129
212
  .pmw-frame__centre {
130
213
  grid-area: centre;
131
214
  min-width: 0;
@@ -154,44 +237,29 @@ body,
154
237
  overflow: visible;
155
238
  }
156
239
 
157
- .pmw-frame__dock {
158
- grid-area: dock;
240
+ .pmw-frame__conversation {
241
+ grid-area: conversation;
159
242
  display: flex;
160
243
  flex-direction: column;
161
244
  min-width: 0;
162
245
  min-height: 0;
163
246
  overflow: hidden;
164
- border-left: 1px solid var(--pm-color-line);
165
- background: var(--dsw-alias-bg-base, var(--pm-color-bg));
247
+ background: var(--pm-color-chrome);
166
248
  }
167
249
 
168
- .pmw-frame__dock > * {
250
+ .pmw-frame__conversation > * {
169
251
  flex: 1;
170
252
  min-height: 0;
171
253
  }
172
254
 
173
- .pmw-frame__dock[hidden] { display: none; }
255
+ .pmw-frame__conversation[hidden] { display: none; }
174
256
  .pmw-chat-actions { display: flex; align-items: center; gap: var(--pm-space-1); }
257
+ .pmw-chat-actions__title { margin-right: var(--pm-space-2); color: var(--pm-color-muted); font-size: var(--pm-text-xs); font-weight: 600; letter-spacing: var(--pm-tracking-label); white-space: nowrap; }
175
258
  .pmw-history { display: flex; flex-direction: column; height: 100%; min-height: 0; color: var(--pm-color-ink); }
176
- .pmw-history__header { display: flex; align-items: center; justify-content: space-between; gap: var(--pm-space-2); padding: var(--pm-space-2) var(--pm-space-3); border-bottom: 1px solid var(--pm-color-line); }
259
+ .pmw-history__header { display: flex; align-items: center; justify-content: space-between; gap: var(--pm-space-2); padding: var(--pm-space-2) var(--pm-space-3); border-bottom: var(--pm-size-hairline) solid var(--pm-color-line); }
177
260
  .pmw-history__header h2 { margin: 0; font-size: var(--pm-text-sm); font-weight: 600; }
178
261
  .pmw-history__browser { flex: 1; min-height: 0; overflow: hidden; }
179
262
 
180
- .pmw-frame__status {
181
- grid-area: status;
182
- display: flex;
183
- align-items: center;
184
- gap: var(--pm-space-4);
185
- min-height: var(--pm-statusbar-height);
186
- padding: 0 var(--pm-space-3);
187
- overflow: hidden;
188
- border-top: 1px solid var(--pm-color-line);
189
- background: var(--pm-color-sunk);
190
- color: var(--pm-color-muted);
191
- font-family: var(--pm-font-mono);
192
- font-size: var(--pm-text-xs);
193
- }
194
-
195
263
  .pmw-frame__bottom {
196
264
  grid-area: bottom;
197
265
  min-width: 0;
@@ -215,50 +283,46 @@ body,
215
283
  .pmw-frame__panels { grid-area: panels; min-width: 0; min-height: 0; }
216
284
  .pmw-frame__side-panel { display: grid; }
217
285
  .pmw-frame__side-panel > * { grid-area: 1 / 1; }
218
- .pmw-frame__side, .pmw-frame__sidebar, .pmw-frame__centre, .pmw-frame__dock, .pmw-frame__rightbar { height: 100%; }
219
- .pmw-frame__handle { width: 8px; z-index: 11; background: var(--pm-color-line); }
220
- .pmw-frame__handle:hover, .pmw-frame__handle:focus-visible { background: var(--pm-color-accent); }
221
-
222
- .pmw-frame[data-narrow] {
223
- grid-template-columns: minmax(0, 1fr);
224
- grid-template-rows: auto minmax(0, 1fr) auto auto;
225
- grid-template-areas:
226
- 'activity'
227
- 'panels'
228
- 'status'
229
- 'bottom';
286
+ .pmw-frame__sidebar, .pmw-frame__centre, .pmw-frame__conversation, .pmw-frame__rightbar { height: 100%; }
287
+ /* A hairline between columns, with a wider area to grab. */
288
+ .pmw-frame__handle { position: relative; width: var(--pm-size-hairline); z-index: 11; background: var(--pm-color-line); }
289
+ .pmw-frame__handle::after { position: absolute; inset: 0 calc(-1 * var(--pm-space-1)); content: ''; }
290
+ .pmw-frame__handle:hover, .pmw-frame__handle:focus-visible, .pmw-frame__handle[data-separator='active'] { background: var(--pm-color-accent); box-shadow: 0 0 0 var(--pm-size-hairline) var(--pm-color-accent); }
291
+
292
+ .pmw-frame[data-narrow] .pmw-appbar__brand > .pmw-brand-name,
293
+ .pmw-frame[data-narrow] .pmw-appbar__label,
294
+ .pmw-frame[data-narrow] .pmw-appbar__places > li + li::before {
295
+ display: none;
230
296
  }
231
297
 
232
- .pmw-frame[data-narrow] .pmw-activity {
233
- flex-direction: row;
234
- justify-content: space-between;
235
- padding: var(--pm-space-1) var(--pm-space-2);
236
- overflow-x: auto;
237
- border-right: 0;
238
- border-bottom: 1px solid var(--pm-color-line);
298
+ .pmw-frame[data-narrow] .pmw-appbar__brand {
299
+ margin-right: var(--pm-space-1);
239
300
  }
240
301
 
241
- .pmw-frame[data-narrow] .pmw-activity__logo {
242
- margin: 0 var(--pm-space-1) 0 0;
302
+ .pmw-frame[data-narrow] .pmw-appbar__place[aria-current] {
303
+ background: var(--pm-color-selected);
304
+ color: var(--pm-color-accent);
243
305
  }
244
306
 
245
- .pmw-frame[data-narrow] .pmw-activity__end {
246
- flex-direction: row;
247
- margin: 0;
307
+ .pmw-frame[data-narrow] .pmw-appbar__place,
308
+ .pmw-frame[data-narrow] .pmw-appbar__button {
309
+ min-width: var(--pm-size-touch);
310
+ height: var(--pm-size-touch);
311
+ justify-content: center;
248
312
  }
249
313
 
250
- .pmw-frame[data-narrow] .pmw-activity__button[aria-pressed='true'] {
251
- box-shadow: inset 0 -2px 0 var(--pm-color-accent);
314
+ .pmw-frame[data-narrow] .pmw-appbar {
315
+ height: var(--pm-appbar-height-touch);
252
316
  }
253
317
 
254
318
  .pmw-frame[data-narrow] .pmw-frame__sidebar,
255
- .pmw-frame[data-narrow] .pmw-frame__dock,
319
+ .pmw-frame[data-narrow] .pmw-frame__conversation,
256
320
  .pmw-frame[data-narrow] .pmw-frame__rightbar {
257
321
  grid-area: centre;
258
322
  border: 0;
259
323
  }
260
324
 
261
- .pmw-frame[data-narrow] .pmw-frame__dock:not([data-shown]) {
325
+ .pmw-frame[data-narrow] .pmw-frame__conversation:not([data-shown]) {
262
326
  display: none;
263
327
  }
264
328
 
@@ -270,10 +334,6 @@ body,
270
334
  pointer-events: auto;
271
335
  }
272
336
 
273
- .pmw-frame[data-narrow] .pmw-frame__status {
274
- gap: var(--pm-space-2);
275
- }
276
-
277
337
  .pmw-logo {
278
338
  flex: none;
279
339
  display: block;
@@ -322,24 +382,124 @@ body,
322
382
  }
323
383
 
324
384
  .pmw-fallback__doc {
325
- display: grid;
326
- grid-template-columns: 240px minmax(0, 1fr);
327
385
  height: 100%;
328
386
  }
329
387
 
388
+ .pmw-fallback__doc[hidden] { display: none; }
389
+
330
390
  .pmw-fallback__tab {
331
391
  height: 100%;
332
392
  overflow: hidden;
333
393
  }
334
394
 
335
395
  .pmw-frame[data-narrow] .pmw-frame__panels { display: block !important; }
336
- .pmw-frame[data-narrow] .pmw-frame__panels > [data-panel] { width: 100%; height: 100%; }
396
+ /* react-resizable-panels writes `height: auto` on each panel; on a narrow screen each one fills the page. */
397
+ .pmw-frame[data-narrow] .pmw-frame__panels > [data-panel] { width: 100%; height: 100% !important; }
337
398
  .pmw-frame__panels > [hidden] { display: none !important; }
338
399
  .pmw-frame[data-narrow] .pmw-frame__sidebar[data-shown] { height: 100%; }
339
400
 
340
- .pmw-frame__rightbar-overlay { position: absolute; top: 0; bottom: var(--pm-statusbar-height); height: auto; z-index: 13; pointer-events: none; }
401
+ .pmw-frame__rightbar-overlay { position: absolute; top: 0; bottom: 0; height: auto; z-index: 13; pointer-events: none; }
341
402
  .pmw-frame__rightbar-track { height: 100%; width: 100%; }
342
403
  .pmw-frame__rightbar-overlay [data-sidebar-right-session]:has([data-pmw-source-route]) { opacity: 0; }
343
404
  .pmw-frame__rightbar-overlay [data-sidebar-right-session]:not([data-sidebar-right-open]) [data-dockkit-host='dock'] { transition: none; }
344
405
  .pmw-frame__document { height: 100%; min-width: 0; min-height: 0; }
345
406
  .pmw-frame__document[hidden] { display: none; }
407
+
408
+ /*
409
+ * Presmium opens one workspace: the conversation does not offer to choose another or another agent preset, and the
410
+ * chat history lists the sessions without the workspace row above them. Matched by slot names and row keys, not by
411
+ * Harness's generated class names.
412
+ */
413
+ [data-slot='conversation.hero.agentPreset'],
414
+ :has(> [data-slot='conversation.hero.agentPreset']) > button,
415
+ [data-slot='sidebar.workspaces'] [data-row-key^='workspace:'],
416
+ [data-slot='sidebar.workspaces'] :has(> [data-slot^='sidebar.workspaces.directory']) {
417
+ display: none !important;
418
+ }
419
+
420
+ /* Runtime diagnostics use shared controls; the shell owns their placement only. */
421
+ .pmw-runtime-feedback { flex: none; padding: var(--pm-space-2) var(--pm-space-3); }
422
+ .pmw-runtime-feedback details { max-block-size: 40dvh; overflow: auto; overflow-wrap: anywhere; }
423
+ .pmw-runtime-feedback__actions { display: flex; flex-wrap: wrap; gap: var(--pm-space-2); margin-block-start: var(--pm-space-2); }
424
+ .pmw-runtime-feedback p { margin: 0; }
425
+ .pmw-runtime-feedback ul { margin-block: var(--pm-space-2); padding-inline-start: var(--pm-space-4); }
426
+ .pmw-runtime-fallback { display: grid; align-content: center; min-height: 100dvh; padding: var(--pm-space-4); }
427
+
428
+ /* The AI assistant without a usable model: the notice in the composer's place, and a failed turn in the author's terms. */
429
+ .pmw-assistant-setup {
430
+ display: grid;
431
+ grid-template-columns: auto minmax(0, 1fr);
432
+ gap: var(--pm-space-2) var(--pm-space-3);
433
+ margin: 0 var(--pm-space-4) var(--pm-space-4);
434
+ padding: var(--pm-space-4);
435
+ border: var(--pm-size-hairline) solid var(--pm-color-line);
436
+ border-radius: var(--pm-radius-card);
437
+ background: var(--pm-color-surface);
438
+ color: var(--pm-color-ink);
439
+ box-shadow: var(--pm-shadow);
440
+ }
441
+
442
+ .pmw-assistant-setup__icon {
443
+ display: inline-flex;
444
+ color: var(--pm-color-accent);
445
+ }
446
+
447
+ .pmw-assistant-setup__copy,
448
+ .pmw-turn-failure__copy {
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: var(--pm-space-1);
452
+ min-width: 0;
453
+ }
454
+
455
+ .pmw-assistant-setup__copy p,
456
+ .pmw-turn-failure__copy p {
457
+ margin: 0;
458
+ line-height: var(--pm-leading-ui);
459
+ }
460
+
461
+ .pmw-assistant-setup__title,
462
+ .pmw-turn-failure__title {
463
+ font-weight: var(--pm-weight-semibold);
464
+ }
465
+
466
+ .pmw-assistant-setup__actions {
467
+ display: flex;
468
+ grid-column: 1 / -1;
469
+ justify-content: flex-end;
470
+ }
471
+
472
+ .pmw-turn-failure {
473
+ display: grid;
474
+ grid-template-columns: auto minmax(0, 1fr);
475
+ gap: var(--pm-space-2);
476
+ padding: var(--pm-space-3);
477
+ border-radius: var(--pm-radius-control);
478
+ background: var(--pm-color-warn-soft);
479
+ color: var(--pm-color-ink);
480
+ font-size: var(--pm-text-sm);
481
+ }
482
+
483
+ .pmw-turn-failure__mark {
484
+ display: inline-flex;
485
+ color: var(--pm-color-warn);
486
+ }
487
+
488
+ .pmw-turn-failure__actions {
489
+ display: flex;
490
+ margin-top: var(--pm-space-1);
491
+ }
492
+
493
+ .pmw-turn-failure__details {
494
+ color: var(--pm-color-muted);
495
+ font-size: var(--pm-text-xs);
496
+ }
497
+
498
+ .pmw-turn-failure__details summary {
499
+ cursor: pointer;
500
+ }
501
+
502
+ .pmw-turn-failure__details p {
503
+ margin-top: var(--pm-space-1);
504
+ overflow-wrap: anywhere;
505
+ }