cli-jaw 2.17.30 → 2.17.35

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 (135) hide show
  1. package/README.md +2 -0
  2. package/dist/src/agent/codex-app-client.js +69 -1
  3. package/dist/src/agent/codex-app-client.js.map +1 -1
  4. package/dist/src/agent/cursor-runtime.js +9 -0
  5. package/dist/src/agent/cursor-runtime.js.map +1 -1
  6. package/dist/src/agent/pi-runtime.js +1 -1
  7. package/dist/src/agent/pi-runtime.js.map +1 -1
  8. package/dist/src/agent/prompt-context.js +39 -0
  9. package/dist/src/agent/prompt-context.js.map +1 -1
  10. package/dist/src/agent/spawn.js +138 -20
  11. package/dist/src/agent/spawn.js.map +1 -1
  12. package/dist/src/browser/web-ai/capability-observation-presets.js +4 -0
  13. package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
  14. package/dist/src/browser/web-ai/chatgpt-model.js +9 -5
  15. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  16. package/dist/src/browser/web-ai/grok-model.js +18 -5
  17. package/dist/src/browser/web-ai/grok-model.js.map +1 -1
  18. package/dist/src/cli/claude-models.js +6 -0
  19. package/dist/src/cli/claude-models.js.map +1 -1
  20. package/dist/src/cli/handlers-runtime.js +29 -4
  21. package/dist/src/cli/handlers-runtime.js.map +1 -1
  22. package/dist/src/cli/registry.js +56 -15
  23. package/dist/src/cli/registry.js.map +1 -1
  24. package/dist/src/code-mode/model-options.js +4 -4
  25. package/dist/src/code-mode/model-options.js.map +1 -1
  26. package/dist/src/core/config.js +1 -1
  27. package/dist/src/core/config.js.map +1 -1
  28. package/dist/src/core/db.js +19 -0
  29. package/dist/src/core/db.js.map +1 -1
  30. package/dist/src/core/runtime-settings.js +11 -2
  31. package/dist/src/core/runtime-settings.js.map +1 -1
  32. package/dist/src/orchestrator/attestation.js +66 -0
  33. package/dist/src/orchestrator/attestation.js.map +1 -1
  34. package/dist/src/orchestrator/gateway.js +11 -3
  35. package/dist/src/orchestrator/gateway.js.map +1 -1
  36. package/dist/src/orchestrator/pipeline.js +5 -0
  37. package/dist/src/orchestrator/pipeline.js.map +1 -1
  38. package/dist/src/routes/command.js +4 -1
  39. package/dist/src/routes/command.js.map +1 -1
  40. package/dist/src/routes/orchestrate.js +14 -2
  41. package/dist/src/routes/orchestrate.js.map +1 -1
  42. package/dist/src/slack/commands.js +1 -0
  43. package/dist/src/slack/commands.js.map +1 -1
  44. package/dist/src/telegram/bot.js +3 -2
  45. package/dist/src/telegram/bot.js.map +1 -1
  46. package/package.json +5 -1
  47. package/public/dist/assets/{Agent-BjxJRsKG.js → Agent-kyyjcnqC.js} +1 -1
  48. package/public/dist/assets/BrowserPanel-0b3deLGR.js +3 -0
  49. package/public/dist/assets/BrowserPanel-D7SnTts8.css +1 -0
  50. package/public/dist/assets/{Heartbeat-Ca8DmJcw.js → Heartbeat-CD1R95Kv.js} +1 -1
  51. package/public/dist/assets/{Memory-BY88ur_h.js → Memory-CpZIdE1o.js} +1 -1
  52. package/public/dist/assets/{ModelProvider-mtAtYLmW.js → ModelProvider-tL42E5dy.js} +1 -1
  53. package/public/dist/assets/agent-meta-KPnVam9G.js +1 -0
  54. package/public/dist/assets/{app-CYayckBa.js → app-BvRV-aEt.js} +4 -4
  55. package/public/dist/assets/bgtask-badge-DLqpImpn.js +1 -0
  56. package/public/dist/assets/{bgtask-badge-CT6s6rND.js → bgtask-badge-FiEB3FJm.js} +1 -1
  57. package/public/dist/assets/constants-BfYYzHNr.js +1 -0
  58. package/public/dist/assets/{employees-DCju7V1x.js → employees-86F_D_Ce.js} +1 -1
  59. package/public/dist/assets/iframe-renderer-C_swzquc.js +1 -0
  60. package/public/dist/assets/{iframe-renderer-LZp7Nqm1.js → iframe-renderer-eozJpgjk.js} +2 -2
  61. package/public/dist/assets/manager-BnmWx9xL.js +13 -0
  62. package/public/dist/assets/manager-Cmu0aKPb.css +1 -0
  63. package/public/dist/assets/{memory-V5caYbpS.js → memory-DX7U3WV_.js} +1 -1
  64. package/public/dist/assets/memory-DfPbqPTD.js +1 -0
  65. package/public/dist/assets/{message-history-Bp_sUDSx.js → message-history-B_fIGorC.js} +1 -1
  66. package/public/dist/assets/message-history-BhSsLjis.js +1 -0
  67. package/public/dist/assets/{render-Cd4frZ2U.js → render-fKAuISeM.js} +1 -1
  68. package/public/dist/assets/settings-BNqSR9Zr.js +1 -0
  69. package/public/dist/assets/{settings-a0blK1fr.js → settings-CH6exiZf.js} +1 -1
  70. package/public/dist/assets/{settings-core-C5qo8giT.js → settings-core-DqKyyxbQ.js} +1 -1
  71. package/public/dist/assets/settings-core-x7CmBZq1.js +1 -0
  72. package/public/dist/assets/{sidebar-FbI4udzs.js → sidebar-qyLy9Og8.js} +3 -3
  73. package/public/dist/assets/skills-C7Yi3LIq.js +1 -0
  74. package/public/dist/assets/{skills-DeG9lWF2.js → skills-DAhOtbfP.js} +1 -1
  75. package/public/dist/assets/{slash-commands-FoQuZXga.js → slash-commands-BYH6YVS4.js} +1 -1
  76. package/public/dist/assets/slash-commands-DEbJk3sj.js +1 -0
  77. package/public/dist/assets/{trace-drawer-CWs8ydMO.js → trace-drawer-nyAJ3Bm_.js} +1 -1
  78. package/public/dist/assets/{ui-Cd8etFwN.js → ui-C62w6bJS.js} +1 -1
  79. package/public/dist/assets/ui-CBErZPBp.js +1 -0
  80. package/public/dist/index.html +1 -1
  81. package/public/dist/manager/index.html +2 -2
  82. package/public/js/constants.ts +22 -5
  83. package/public/js/features/settings-types.ts +5 -0
  84. package/public/manager/src/App.tsx +1 -1
  85. package/public/manager/src/AppChrome.tsx +18 -3
  86. package/public/manager/src/SidebarRailRouter.tsx +47 -1
  87. package/public/manager/src/browser-panel/BrowserPanel.tsx +151 -57
  88. package/public/manager/src/browser-panel/browser-address-bar.tsx +53 -0
  89. package/public/manager/src/browser-panel/browser-address-state.ts +41 -0
  90. package/public/manager/src/browser-panel/browser-favicon.ts +18 -0
  91. package/public/manager/src/browser-panel/browser-history-store.ts +80 -0
  92. package/public/manager/src/browser-panel/browser-panel.css +141 -24
  93. package/public/manager/src/components/CommandBar.tsx +17 -5
  94. package/public/manager/src/components/InstanceGroups.tsx +143 -23
  95. package/public/manager/src/components/InstanceNavigator.tsx +55 -2
  96. package/public/manager/src/components/InstanceRow.tsx +51 -3
  97. package/public/manager/src/components/SidebarRail.tsx +10 -10
  98. package/public/manager/src/components/SidebarResizeHandle.tsx +22 -0
  99. package/public/manager/src/components/WorkspaceLayout.tsx +22 -8
  100. package/public/manager/src/components/instance-row-status.ts +48 -0
  101. package/public/manager/src/components/sidebar-keyboard.ts +129 -0
  102. package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +42 -0
  103. package/public/manager/src/help/helpContent.tsx +1 -0
  104. package/public/manager/src/hooks/useSidebarGroupCollapse.ts +46 -0
  105. package/public/manager/src/hooks/useSidebarWidth.ts +88 -0
  106. package/public/manager/src/hooks/useWindowFullscreen.ts +23 -0
  107. package/public/manager/src/manager-components.css +206 -31
  108. package/public/manager/src/manager-layout.css +30 -19
  109. package/public/manager/src/manager-p0-1-1.css +72 -36
  110. package/public/manager/src/manager-polish.css +6 -45
  111. package/public/manager/src/manager-shortcut-runner.ts +37 -1
  112. package/public/manager/src/manager-shortcuts.ts +21 -0
  113. package/public/manager/src/manager-tokens.css +190 -127
  114. package/public/manager/src/panels/PanelResizer.tsx +18 -2
  115. package/public/manager/src/panels/desktop-bridge.ts +12 -1
  116. package/public/manager/src/panels/panels.css +32 -32
  117. package/public/manager/src/settings/pages/Agent.tsx +26 -0
  118. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +6 -5
  119. package/public/manager/src/styles.css +15 -7
  120. package/public/manager/src/types.ts +5 -1
  121. package/public/dist/assets/BrowserPanel-CsYKexNf.js +0 -3
  122. package/public/dist/assets/BrowserPanel-DpntR8EJ.css +0 -1
  123. package/public/dist/assets/agent-meta-_Idad3qq.js +0 -1
  124. package/public/dist/assets/bgtask-badge-CidVvjWb.js +0 -1
  125. package/public/dist/assets/constants-DK-21dMG.js +0 -1
  126. package/public/dist/assets/iframe-renderer-aFXUtTXX.js +0 -1
  127. package/public/dist/assets/manager-CwqrZ2MH.js +0 -13
  128. package/public/dist/assets/manager-LkGs6qEJ.css +0 -1
  129. package/public/dist/assets/memory-BcZdf_oz.js +0 -1
  130. package/public/dist/assets/message-history-DrEPUdTy.js +0 -1
  131. package/public/dist/assets/settings-core-Cm-CmVLA.js +0 -1
  132. package/public/dist/assets/settings-mbGEtP5B.js +0 -1
  133. package/public/dist/assets/skills-G8KUeHBV.js +0 -1
  134. package/public/dist/assets/slash-commands-BYv3yboz.js +0 -1
  135. package/public/dist/assets/ui-yrn3s72A.js +0 -1
@@ -0,0 +1,88 @@
1
+ import { useCallback, useEffect, useState, useSyncExternalStore } from 'react';
2
+
3
+ export const SIDEBAR_WIDTH_STORAGE_KEY = 'jaw.sidebarWidth';
4
+ export const SIDEBAR_WIDTH_DEFAULT = 300;
5
+ export const SIDEBAR_WIDTH_MIN = 220;
6
+ export const SIDEBAR_MAIN_CONTENT_MIN_WIDTH = 640;
7
+ export const SIDEBAR_COLLAPSED_WIDTH = 44;
8
+
9
+ export type SidebarWidthBounds = {
10
+ viewportWidth: number;
11
+ rightPanelOpen: boolean;
12
+ rightPanelWidth: number;
13
+ };
14
+
15
+ export function resolveSidebarMaxWidth(bounds: SidebarWidthBounds): number {
16
+ const reserved = SIDEBAR_MAIN_CONTENT_MIN_WIDTH
17
+ + (bounds.rightPanelOpen ? Math.max(0, bounds.rightPanelWidth) : 0);
18
+ return Math.max(SIDEBAR_WIDTH_MIN, Math.floor(bounds.viewportWidth) - reserved);
19
+ }
20
+
21
+ export function clampSidebarWidth(width: number, bounds: SidebarWidthBounds): number {
22
+ const max = resolveSidebarMaxWidth(bounds);
23
+ const n = Number.isFinite(width) ? Math.round(width) : SIDEBAR_WIDTH_DEFAULT;
24
+ return Math.min(max, Math.max(SIDEBAR_WIDTH_MIN, n));
25
+ }
26
+
27
+ export function resolveSidebarWidth(stored: number | null, bounds: SidebarWidthBounds): number {
28
+ const preferred = stored == null ? SIDEBAR_WIDTH_DEFAULT : Math.max(SIDEBAR_WIDTH_MIN, stored);
29
+ return clampSidebarWidth(preferred, bounds);
30
+ }
31
+
32
+ export function readStoredSidebarWidth(): number | null {
33
+ if (typeof localStorage === 'undefined') return null;
34
+ const raw = localStorage.getItem(SIDEBAR_WIDTH_STORAGE_KEY);
35
+ if (raw == null || raw === '') return null;
36
+ const n = Number(raw);
37
+ return Number.isFinite(n) ? n : null;
38
+ }
39
+
40
+ export function writeStoredSidebarWidth(width: number): void {
41
+ localStorage.setItem(SIDEBAR_WIDTH_STORAGE_KEY, String(width));
42
+ }
43
+
44
+ export function clearStoredSidebarWidth(): void {
45
+ localStorage.removeItem(SIDEBAR_WIDTH_STORAGE_KEY);
46
+ }
47
+
48
+ function subscribeViewport(onStoreChange: () => void): () => void {
49
+ window.addEventListener('resize', onStoreChange);
50
+ return () => window.removeEventListener('resize', onStoreChange);
51
+ }
52
+
53
+ function getViewportWidth(): number {
54
+ return typeof window === 'undefined' ? 1440 : window.innerWidth;
55
+ }
56
+
57
+ export function useSidebarWidth(args: { rightPanelOpen: boolean; rightPanelWidth: number }) {
58
+ const viewportWidth = useSyncExternalStore(subscribeViewport, getViewportWidth, () => 1440);
59
+ const bounds: SidebarWidthBounds = {
60
+ viewportWidth,
61
+ rightPanelOpen: args.rightPanelOpen,
62
+ rightPanelWidth: args.rightPanelWidth,
63
+ };
64
+ const [width, setWidth] = useState(() => resolveSidebarWidth(readStoredSidebarWidth(), bounds));
65
+
66
+ useEffect(() => {
67
+ setWidth(current => clampSidebarWidth(current, bounds));
68
+ }, [bounds.viewportWidth, bounds.rightPanelOpen, bounds.rightPanelWidth]);
69
+
70
+ const addDelta = useCallback((delta: number) => {
71
+ setWidth(current => clampSidebarWidth(current + delta, bounds));
72
+ }, [bounds.viewportWidth, bounds.rightPanelOpen, bounds.rightPanelWidth]);
73
+
74
+ const persist = useCallback(() => {
75
+ setWidth(current => {
76
+ const next = clampSidebarWidth(current, bounds);
77
+ writeStoredSidebarWidth(next);
78
+ return next;
79
+ });
80
+ }, [bounds.viewportWidth, bounds.rightPanelOpen, bounds.rightPanelWidth]);
81
+
82
+ const reset = useCallback(() => {
83
+ clearStoredSidebarWidth();
84
+ setWidth(resolveSidebarWidth(null, bounds));
85
+ }, [bounds.viewportWidth, bounds.rightPanelOpen, bounds.rightPanelWidth]);
86
+
87
+ return { width, addDelta, persist, reset, viewportWidth };
88
+ }
@@ -0,0 +1,23 @@
1
+ import { useEffect } from 'react';
2
+ import { getDesktop } from '../panels/desktop-bridge';
3
+
4
+ function readFullscreenState(): boolean {
5
+ return getDesktop()?.window?.getFullscreenState?.() === true;
6
+ }
7
+
8
+ export function useWindowFullscreen(): boolean {
9
+ useEffect(() => {
10
+ const root = document.documentElement;
11
+ const apply = (next: boolean): void => {
12
+ if (next) root.dataset['windowFullscreen'] = 'true';
13
+ else delete root.dataset['windowFullscreen'];
14
+ };
15
+ apply(readFullscreenState());
16
+ const unsubscribe = getDesktop()?.window?.onFullscreenStateChange?.(apply);
17
+ return () => {
18
+ unsubscribe?.();
19
+ delete root.dataset['windowFullscreen'];
20
+ };
21
+ }, []);
22
+ return readFullscreenState();
23
+ }
@@ -1,12 +1,18 @@
1
1
  .rail-button {
2
- width: 34px;
3
- min-height: 34px;
2
+ width: 32px;
3
+ min-width: 32px;
4
+ min-height: 32px;
4
5
  border-color: transparent;
5
6
  background: transparent;
6
7
  color: var(--text-secondary);
7
8
  font-weight: 600;
8
9
  }
9
- .rail-button.is-active { background: var(--bg-raised); border-color: var(--border-strong); color: var(--text-primary); }
10
+ .rail-button.is-active {
11
+ background: var(--sidebar-row-active, var(--bg-raised));
12
+ border-color: transparent;
13
+ color: var(--text-primary);
14
+ box-shadow: inset 2px 0 0 var(--accent);
15
+ }
10
16
  .rail-collapse-button { margin-left: auto; }
11
17
  .manager-shell.is-sidebar-collapsed .rail-collapse-button { margin-left: 0; }
12
18
  .rail-spacer { flex: 1; }
@@ -50,18 +56,19 @@
50
56
  .command-bar {
51
57
  display: flex;
52
58
  flex-direction: column;
53
- gap: 8px;
54
- padding: 10px 14px;
59
+ gap: 0;
60
+ padding: 0 14px;
61
+ height: var(--workspace-topbar-height);
62
+ min-height: var(--workspace-topbar-height);
55
63
  }
56
64
  .command-primary {
57
65
  width: 100%;
58
66
  min-width: 0;
67
+ height: 100%;
59
68
  display: grid;
60
69
  align-items: center;
61
- gap: 10px;
62
- }
63
- .command-primary {
64
- grid-template-columns: minmax(128px, 190px) max-content minmax(max-content, 1fr);
70
+ gap: 8px;
71
+ grid-template-columns: auto minmax(0, 1fr) auto;
65
72
  }
66
73
  .drawer-trigger { display: none; }
67
74
  .eyebrow {
@@ -77,24 +84,23 @@ h1 { font-size: 14px; }
77
84
  h2 { font-size: 13px; }
78
85
  .command-search {
79
86
  min-width: 0;
80
- width: clamp(280px, 34vw, 820px);
87
+ width: 100%;
81
88
  max-width: 100%;
82
- justify-self: start;
83
- display: grid;
84
- grid-template-columns: minmax(160px, 1fr);
85
- gap: 8px;
89
+ justify-self: stretch;
86
90
  }
87
91
  .command-actions { justify-self: end; }
88
92
  .is-electron-titlebar {
89
93
  -webkit-app-region: drag;
90
- padding-left: 132px;
94
+ padding-left: var(--electron-titlebar-left-reserve, 90px);
91
95
  }
92
96
  .is-electron-titlebar button,
93
97
  .is-electron-titlebar input,
94
98
  .is-electron-titlebar select,
95
99
  .is-electron-titlebar a,
96
100
  .is-electron-titlebar .command-actions,
97
- .is-electron-titlebar .command-search {
101
+ .is-electron-titlebar .command-search,
102
+ .is-electron-titlebar .drawer-trigger,
103
+ .is-electron-titlebar .theme-switch {
98
104
  -webkit-app-region: no-drag;
99
105
  }
100
106
  .command-filter-strip {
@@ -115,7 +121,7 @@ h2 { font-size: 13px; }
115
121
  width: 100%;
116
122
  min-height: 30px;
117
123
  border: 1px solid var(--border-strong);
118
- border-radius: 7px;
124
+ border-radius: var(--control-radius);
119
125
  background: var(--canvas-deep);
120
126
  color: var(--text-primary);
121
127
  padding: 6px 9px;
@@ -125,14 +131,14 @@ h2 { font-size: 13px; }
125
131
  .command-mini-stat {
126
132
  border: 1px solid var(--border-subtle);
127
133
  background: var(--canvas-soft);
128
- border-radius: 6px;
134
+ border-radius: var(--radius-sm);
129
135
  color: var(--text-secondary);
130
136
  font-size: 11px;
131
137
  padding: 5px 7px;
132
138
  white-space: nowrap;
133
139
  }
134
140
  .command-mini-stat {
135
- font-family: "Geist Mono", "JetBrains Mono", monospace;
141
+ font-family: var(--font-mono);
136
142
  color: var(--text-primary);
137
143
  }
138
144
  .state {
@@ -195,6 +201,7 @@ h2 { font-size: 13px; }
195
201
  border-bottom: 1px solid var(--border-subtle);
196
202
  background: var(--canvas-deep);
197
203
  padding: 10px;
204
+ flex-wrap: wrap;
198
205
  }
199
206
  .instance-navigator-header strong {
200
207
  display: block;
@@ -213,6 +220,57 @@ h2 { font-size: 13px; }
213
220
  min-height: 0;
214
221
  overflow: auto;
215
222
  }
223
+ .instance-navigator-search { flex: 1 1 100%; }
224
+ .instance-navigator-search input {
225
+ width: 100%;
226
+ border: 1px solid var(--border-subtle);
227
+ background: var(--canvas-deep);
228
+ color: var(--text-primary);
229
+ border-radius: 6px;
230
+ padding: 6px 8px;
231
+ font: inherit;
232
+ }
233
+ .visually-hidden {
234
+ position: absolute;
235
+ width: 1px;
236
+ height: 1px;
237
+ padding: 0;
238
+ margin: -1px;
239
+ overflow: hidden;
240
+ clip: rect(0, 0, 0, 0);
241
+ white-space: nowrap;
242
+ border: 0;
243
+ }
244
+ .instance-jump-hint {
245
+ position: absolute;
246
+ right: 4px;
247
+ top: 4px;
248
+ height: 16px;
249
+ min-width: 16px;
250
+ padding: 0 4px;
251
+ display: inline-flex;
252
+ align-items: center;
253
+ justify-content: center;
254
+ font-size: 10px;
255
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
256
+ color: var(--text-secondary);
257
+ background: var(--surface-raised);
258
+ border: 1px solid var(--border-subtle);
259
+ border-radius: 4px;
260
+ pointer-events: none;
261
+ z-index: 2;
262
+ }
263
+ .instance-settled-more {
264
+ width: 100%;
265
+ margin-top: 4px;
266
+ border: 0;
267
+ background: transparent;
268
+ color: var(--text-dim);
269
+ font-size: 11px;
270
+ text-align: left;
271
+ cursor: pointer;
272
+ padding: 6px 4px;
273
+ }
216
274
  .instance-group { margin-bottom: 12px; }
217
275
  .instance-group-header {
218
276
  display: flex;
@@ -223,22 +281,123 @@ h2 { font-size: 13px; }
223
281
  font-weight: 700;
224
282
  padding: 7px 4px 6px;
225
283
  }
284
+ .instance-group-toggle {
285
+ display: flex;
286
+ align-items: center;
287
+ justify-content: space-between;
288
+ color: var(--text-dim);
289
+ font-size: 11px;
290
+ font-weight: 700;
291
+ padding: 7px 4px 6px;
292
+ }
293
+ .instance-group-toggle,
294
+ button.instance-group-header,
295
+ button.instance-group-toggle {
296
+ width: 100%;
297
+ min-height: 0;
298
+ border: 0;
299
+ border-radius: var(--radius-sm);
300
+ background: transparent;
301
+ color: var(--text-dim);
302
+ font-size: 11px;
303
+ font-weight: 700;
304
+ padding: 7px 4px 6px;
305
+ justify-content: space-between;
306
+ cursor: pointer;
307
+ text-align: left;
308
+ }
309
+ button.instance-group-header:hover:not(:disabled),
310
+ button.instance-group-toggle:hover:not(:disabled) {
311
+ background: var(--sidebar-row-hover);
312
+ border-color: transparent;
313
+ color: var(--text-secondary);
314
+ }
315
+ button.instance-group-header:active:not(:disabled) { transform: none; }
316
+ .instance-group-toggle > span { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
317
+ .instance-group-toggle:focus-visible,
318
+ button.instance-group-header:focus-visible,
319
+ button.instance-group-toggle:focus-visible {
320
+ outline: var(--focus-ring);
321
+ outline-offset: 2px;
322
+ }
323
+ .instance-group-chevron {
324
+ display: inline-block;
325
+ flex-shrink: 0;
326
+ transition: transform var(--motion-fast);
327
+ }
328
+ .instance-group-toggle[aria-expanded="false"] .instance-group-chevron,
329
+ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
330
+ transform: rotate(-90deg);
331
+ }
226
332
  .instance-row {
227
- position: relative; display: grid; gap: 8px; margin-bottom: 7px;
228
- border: 1px solid transparent; border-radius: 8px; background: transparent; padding: 10px;
333
+ position: relative;
334
+ display: grid;
335
+ gap: 8px;
336
+ margin-bottom: 7px;
337
+ min-height: 56px;
338
+ border: 1px solid transparent;
339
+ border-radius: var(--radius-md);
340
+ background: transparent;
341
+ padding: 10px;
229
342
  }
230
343
  .instance-row.density-compact {
344
+ min-height: 36px;
231
345
  gap: 6px;
232
346
  padding: 8px;
233
347
  }
348
+ .instance-row.density-rail {
349
+ min-height: 36px;
350
+ }
234
351
  .instance-row.priority-active {
235
352
  border-color: var(--border-strong);
236
- background: var(--row-bg);
353
+ background: var(--sidebar-row-active);
354
+ }
355
+ .instance-row:hover, .instance-row:focus-within { border-color: transparent; background: var(--sidebar-row-hover); }
356
+ .instance-row-status-line {
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 6px;
360
+ min-width: 0;
361
+ color: var(--sidebar-row-ready);
362
+ font-size: 10px;
363
+ font-weight: 700;
364
+ letter-spacing: 0.02em;
365
+ font-variant-numeric: tabular-nums;
366
+ }
367
+ .instance-row.density-compact .instance-row-status-line,
368
+ .instance-row.density-rail .instance-row-status-line {
369
+ display: none;
370
+ }
371
+ .instance-row-status-line[data-status="working"] {
372
+ color: var(--sidebar-row-working);
373
+ }
374
+ .instance-row-status-line[data-status="attention"] {
375
+ color: var(--sidebar-row-attention);
376
+ }
377
+ .instance-row-status-line[data-status="error"] {
378
+ color: var(--sidebar-row-error);
379
+ }
380
+ .instance-row-status-line[data-status="ready"],
381
+ .instance-row-status-line[data-status="online"],
382
+ .instance-row-status-line[data-status="offline"] {
383
+ color: var(--sidebar-row-ready);
384
+ }
385
+ .instance-row-status-pill,
386
+ .instance-row-working-duration {
387
+ color: inherit;
388
+ font: inherit;
389
+ background: transparent;
390
+ }
391
+ /* The compact sidebar polish hides every span inside .instance-row-title
392
+ (secondary metadata); the status line is primary and must stay visible. */
393
+ .manager-sidebar .instance-row-title .instance-row-status-line span {
394
+ display: inline;
395
+ color: inherit;
396
+ font-size: 10px;
237
397
  }
238
- .instance-row:hover, .instance-row:focus-within { border-color: transparent; background: var(--row-bg-hover); }
239
398
  .instance-row-select {
240
399
  width: 100%; min-height: 0; min-width: 0; display: grid; gap: 8px; border: 0;
241
- background: transparent; color: inherit; border-radius: 6px; padding: 0;
400
+ background: transparent; color: inherit; border-radius: var(--radius-sm); padding: 0;
242
401
  grid-template-columns: minmax(0, 1fr);
243
402
  justify-self: stretch; justify-content: start; justify-items: stretch;
244
403
  align-content: start; align-items: start;
@@ -250,10 +409,10 @@ h2 { font-size: 13px; }
250
409
  transform: none;
251
410
  }
252
411
  .instance-row-select:focus-visible {
253
- outline: 2px solid var(--accent);
412
+ outline: var(--focus-ring);
254
413
  outline-offset: 2px;
255
414
  }
256
- .instance-row.priority-active.is-selected { border-color: transparent; background: var(--surface-raised); }
415
+ .instance-row.priority-active.is-selected { border-color: transparent; background: var(--sidebar-row-selected); }
257
416
  .instance-row:not(.priority-active).is-selected {
258
417
  border-color: color-mix(in srgb, var(--accent) 42%, transparent);
259
418
  background: color-mix(in srgb, var(--accent) 6%, transparent);
@@ -281,6 +440,17 @@ h2 { font-size: 13px; }
281
440
  gap: 4px;
282
441
  flex-shrink: 0;
283
442
  }
443
+ .instance-row .instance-row-quick .quick-btn {
444
+ opacity: 0;
445
+ pointer-events: none;
446
+ transition: opacity var(--motion-fast), color var(--motion-fast), border-color var(--motion-fast), background var(--motion-fast);
447
+ }
448
+ .instance-row:hover .instance-row-quick .quick-btn:not(:disabled),
449
+ .instance-row:focus-within .instance-row-quick .quick-btn:not(:disabled),
450
+ .instance-row.is-selected .instance-row-quick .quick-btn:not(:disabled) {
451
+ opacity: 1;
452
+ pointer-events: auto;
453
+ }
284
454
  .quick-btn {
285
455
  display: inline-grid;
286
456
  place-items: center;
@@ -290,11 +460,11 @@ h2 { font-size: 13px; }
290
460
  min-height: 24px;
291
461
  padding: 0;
292
462
  border: 1px solid var(--border-subtle);
293
- border-radius: 6px;
463
+ border-radius: var(--radius-sm);
294
464
  background: transparent;
295
465
  color: var(--text-secondary);
296
466
  cursor: pointer;
297
- transition: color 0.12s, border-color 0.12s, background 0.12s;
467
+ transition: color var(--motion-fast), border-color var(--motion-fast), background var(--motion-fast);
298
468
  }
299
469
  .quick-btn:hover { color: var(--text-primary); background: var(--surface-raised); }
300
470
  .quick-btn.action-stop { border-color: color-mix(in srgb, var(--status-error) 30%, var(--border-subtle)); color: var(--status-error); }
@@ -324,6 +494,11 @@ h2 { font-size: 13px; }
324
494
  }
325
495
  @media (prefers-reduced-motion: reduce) {
326
496
  .instance-session-list { animation: none; }
497
+ .instance-group-chevron,
498
+ .instance-row .instance-row-quick .quick-btn,
499
+ .quick-btn {
500
+ transition: none;
501
+ }
327
502
  }
328
503
  .instance-session-row {
329
504
  display: flex;
@@ -478,7 +653,7 @@ h2 { font-size: 13px; }
478
653
  height: 26px;
479
654
  border: 1px solid var(--border-strong);
480
655
  border-radius: 6px;
481
- background: var(--surface);
656
+ background: var(--surface-raised);
482
657
  color: var(--text-primary);
483
658
  padding: 0 7px;
484
659
  font-size: 12px;
@@ -625,7 +800,7 @@ h2 { font-size: 13px; }
625
800
  }
626
801
  .project-dirs .label {
627
802
  flex: 0 0 auto;
628
- color: var(--text-muted);
803
+ color: var(--text-dim);
629
804
  font-size: 11px;
630
805
  font-weight: 650;
631
806
  }
@@ -644,7 +819,7 @@ h2 { font-size: 13px; }
644
819
  .project-dirs.is-empty .project-dir {
645
820
  border-style: dashed;
646
821
  background: transparent;
647
- color: var(--text-muted);
822
+ color: var(--text-dim);
648
823
  font-family: inherit;
649
824
  }
650
825
  .project-pick-button {
@@ -5,22 +5,26 @@
5
5
  grid-template-areas: "command" "workspace";
6
6
  background: var(--bg-base);
7
7
  }
8
+ @property --sidebar-width {
9
+ syntax: '<length>';
10
+ inherits: true;
11
+ initial-value: 300px;
12
+ }
8
13
  .manager-workspace {
9
14
  grid-area: workspace;
10
15
  position: relative;
11
16
  min-width: 0;
12
17
  min-height: 0;
13
18
  display: grid;
14
- grid-template-columns: var(--sidebar-width, 340px) minmax(0, 1fr) var(--right-panel-width, 0px);
19
+ grid-template-columns: var(--sidebar-width, 300px) minmax(0, 1fr) var(--right-panel-width, 0px);
15
20
  grid-template-rows: minmax(0, 1fr) var(--bottom-panel-height, var(--activity-dock-height, 150px));
16
21
  grid-template-areas: "sidebar center right" "sidebar bottom right";
17
22
  overflow: hidden;
23
+ transition: grid-template-columns var(--motion-base, 180ms) ease;
18
24
  }
19
25
  .manager-workspace.is-side-panel-open {
20
26
  --right-panel-width: 50vw;
21
27
  }
22
- .manager-shell.is-sidebar-collapsed .manager-workspace,
23
- .manager-workspace.is-sidebar-collapsed { --sidebar-width: 56px; }
24
28
  .manager-workspace.is-right-panel-closed { --right-panel-width: 0px; }
25
29
  .manager-workspace.is-right-panel-closed .right-panel,
26
30
  .manager-workspace.is-right-panel-closed .manager-ceo-panel { display: none; }
@@ -74,6 +78,8 @@
74
78
  flex-direction: column;
75
79
  border-right: 1px solid var(--border-subtle);
76
80
  background: var(--canvas-deep);
81
+ position: relative;
82
+ transition: width var(--motion-base, 180ms) ease;
77
83
  }
78
84
  .manager-command {
79
85
  grid-area: command;
@@ -131,25 +137,19 @@
131
137
  }
132
138
  .manager-sidebar-list { flex: 1 1 auto; min-height: 0; overflow: auto; }
133
139
  .manager-shell.is-sidebar-collapsed .manager-sidebar-list { display: none; }
140
+ .manager-shell.is-sidebar-collapsed .manager-sidebar > .mode-switch { display: none; }
134
141
  .manager-shell.is-sidebar-collapsed .sidebar-rail { height: 100%; min-height: 0; flex-direction: column; border-bottom: 0; padding: 10px 8px; }
135
142
  .manager-shell.is-sidebar-collapsed .rail-spacer { flex: 1; }
136
143
 
137
144
  @media (min-width: 1440px) {
138
- .dashboard-shell.manager-shell:not(.is-sidebar-collapsed) .manager-workspace {
139
- --sidebar-width: 360px;
140
- }
141
145
  .dashboard-shell.manager-shell:not(.is-sidebar-collapsed) .manager-workspace.is-side-panel-open {
142
146
  --right-panel-width: 50vw;
143
147
  }
144
148
  }
145
149
  @media (max-width: 1279px) and (min-width: 1024px) {
146
- .dashboard-shell.manager-shell:not(.is-sidebar-collapsed) .manager-workspace {
147
- --sidebar-width: 300px;
148
- }
149
150
  .dashboard-shell.manager-shell:not(.is-sidebar-collapsed) .manager-workspace.is-side-panel-open {
150
151
  --right-panel-width: 50vw;
151
152
  }
152
- .command-primary { grid-template-columns: minmax(120px, 180px) max-content minmax(max-content, 1fr); }
153
153
  .command-search { width: clamp(260px, 38vw, 620px); }
154
154
  .overview-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
155
155
  }
@@ -206,11 +206,9 @@
206
206
  }
207
207
  .command-primary {
208
208
  grid-template-columns: auto minmax(0, 1fr) auto;
209
- grid-template-areas: "drawer title actions" "search search search";
209
+ grid-template-areas: "title search actions";
210
210
  }
211
- .command-actions { grid-area: actions; justify-self: end; }
212
- .command-title { grid-area: title; }
213
- .command-search { grid-area: search; }
211
+ .drawer-trigger { display: inline-flex; }
214
212
  .command-search { width: 100%; }
215
213
  .command-filter-strip .home-input { display: none; }
216
214
  .preview-frame { min-height: 300px; }
@@ -242,11 +240,7 @@
242
240
  width: min(90vw, var(--right-panel-width, 340px));
243
241
  max-width: min(90vw, 360px);
244
242
  }
245
- .command-bar {
246
- gap: 8px;
247
- padding: 9px 10px;
248
- }
249
- .command-primary { grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "drawer search actions"; }
243
+ .command-primary { grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "title search actions"; }
250
244
  .command-title { display: none; }
251
245
  .command-actions { grid-area: actions; }
252
246
  .command-filter-strip {
@@ -302,3 +296,20 @@
302
296
  @media (prefers-reduced-motion: reduce) {
303
297
  *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
304
298
  }
299
+
300
+ /* The handle is a workspace child (not inside the aside) because
301
+ .manager-sidebar clips overflow to its padding box, which would hide the
302
+ half of the 24px hit zone that hangs past the border. */
303
+ .manager-workspace > .sidebar-resize-handle.panel-resizer-horizontal {
304
+ position: absolute;
305
+ top: 0;
306
+ bottom: 0;
307
+ left: calc(var(--sidebar-width) - 12px);
308
+ width: 24px;
309
+ margin: 0;
310
+ z-index: 3;
311
+ }
312
+
313
+ @media (prefers-reduced-motion: reduce) {
314
+ .manager-workspace, .manager-sidebar { transition: none !important; }
315
+ }