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
@@ -1,32 +1,33 @@
1
1
  /* ──────────────────────────────────────────────────────────────────────────
2
- * 10.6.9a — Theme tokens for the manager dashboard.
2
+ * Theme tokens for the manager dashboard (260902 t3 shell polish, wp1).
3
3
  *
4
4
  * Three-tier hierarchy:
5
- * primitive raw color values (referenced only inside this file)
5
+ * primitive raw scale values (referenced only inside this file)
6
6
  * semantic intent-based aliases (consumed by all other CSS)
7
7
  * component declared in component CSS only when truly divergent
8
8
  *
9
- * The semantic layer keeps the legacy variable names so existing CSS files
10
- * (styles, layout, components, persistence, polish) keep rendering without
11
- * being rewritten in this slice. New `--surface-*` and `--ink-*` aliases are
12
- * exposed for future code; they map to the same legacy values.
9
+ * Every legacy variable name is preserved; only values moved to the
10
+ * zinc/neutral oklch scale with a single oklch primary accent
11
+ * (devlog/_plan/260902_t3_shell_polish/010_design_tokens.md).
12
+ * `--accent` is the CTA primary, not a surface tint.
13
13
  *
14
14
  * Theme resolution lives on <html data-theme="dark|light|auto">. The inline
15
15
  * boot script in index.html sets this attribute before paint to prevent FOUC.
16
16
  * ────────────────────────────────────────────────────────────────────────── */
17
17
 
18
- /* Primitive scale ─ never consumed outside this file. */
18
+ /* Primitive scale — never consumed outside this file (radius/font/motion are
19
+ * theme-independent semantics that also live here). */
19
20
  :root {
20
- --jp-gray-50: #f7f8fa;
21
- --jp-gray-100: #eef0f3;
22
- --jp-gray-200: #e2e6ec;
23
- --jp-gray-300: #cdd3dc;
24
- --jp-gray-400: #a8b0bc;
25
- --jp-gray-500: #6b7382;
26
- --jp-gray-600: #4d5662;
27
- --jp-gray-700: #2f3742;
28
- --jp-gray-800: #1a2027;
29
- --jp-gray-900: #111418;
21
+ --jp-gray-50: oklch(98.5% 0 0);
22
+ --jp-gray-100: oklch(96.7% 0.001 286.375);
23
+ --jp-gray-200: oklch(92% 0.004 286.32);
24
+ --jp-gray-300: oklch(87.1% 0.006 286.286);
25
+ --jp-gray-400: oklch(70.5% 0.015 286.067);
26
+ --jp-gray-500: oklch(55.2% 0.016 285.938);
27
+ --jp-gray-600: oklch(44.2% 0.017 285.786);
28
+ --jp-gray-700: oklch(37% 0.013 285.805);
29
+ --jp-gray-800: oklch(27.4% 0.006 286.033);
30
+ --jp-gray-900: oklch(21% 0.006 285.885);
30
31
 
31
32
  --jp-blue-100: #dbe7ff;
32
33
  --jp-blue-300: #8fb8f7;
@@ -35,44 +36,59 @@
35
36
  --jp-blue-600: #1f6feb;
36
37
  --jp-blue-700: #155bbb;
37
38
 
38
- --jp-green-400: #34d399;
39
- --jp-green-600: #15803d;
40
- --jp-amber-400: #f5a524;
41
- --jp-amber-600: #b45309;
42
- --jp-red-400: #f87171;
43
- --jp-red-600: #b91c1c;
44
- --jp-slate-400: #7b8797;
45
- --jp-slate-500: #6b7382;
39
+ --jp-green-400: oklch(76.5% 0.177 163.223);
40
+ --jp-green-600: oklch(59.6% 0.145 163.225);
41
+ --jp-amber-400: oklch(82.8% 0.189 84.429);
42
+ --jp-amber-600: oklch(66.6% 0.179 58.318);
43
+ --jp-red-400: oklch(70.4% 0.191 22.216);
44
+ --jp-red-600: oklch(57.7% 0.245 27.325);
45
+ --jp-slate-400: oklch(70.5% 0.015 286.067);
46
+ --jp-slate-500: oklch(55.2% 0.016 285.938);
47
+
48
+ --radius-sm: 0.375rem;
49
+ --radius-md: 0.5rem;
50
+ --radius-lg: 0.625rem;
51
+ --radius-xl: 0.875rem;
52
+ --control-radius: 0.5rem;
53
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui,
54
+ "Pretendard", "Noto Sans CJK SC", "Noto Sans CJK JP", "Noto Sans KR", sans-serif;
55
+ --font-mono: "Geist Mono", ui-monospace, "SF Mono", "SFMono-Regular", Menlo,
56
+ Consolas, "Liberation Mono", monospace;
57
+ --motion-fast: 120ms;
58
+ --motion-base: 180ms;
59
+ --workspace-topbar-height: 44px;
60
+ --scrollbar-size: 6px;
61
+ --scrollbar-radius: 3px;
46
62
  }
47
63
 
48
- /* Default = dark (matches the previous behavior). */
64
+ /* Default = dark. */
49
65
  :root,
50
66
  :root[data-theme="dark"] {
51
67
  color-scheme: dark;
52
68
 
53
69
  /* legacy variable names — keep so existing CSS still renders */
54
- --bg-base: #080b0f;
55
- --bg-panel: #10161d;
56
- --bg-raised: #151c25;
57
- --bg-elevated: #1a2430;
58
- --border-subtle: #202a35;
59
- --border-strong: #2d3b4c;
60
- --text-primary: #e7edf5;
61
- --text-secondary: #9aa6b5;
62
- --text-dim: #657283;
63
- --accent: #62a8f5;
64
- --accent-soft: #1e2b3d;
70
+ --bg-base: #0a0a0a;
71
+ --bg-panel: color-mix(in srgb, #0a0a0a 97%, white);
72
+ --bg-raised: color-mix(in srgb, white 4%, transparent);
73
+ --bg-elevated: color-mix(in srgb, #0a0a0a 97%, white);
74
+ --border-subtle: color-mix(in srgb, white 8%, transparent);
75
+ --border-strong: color-mix(in srgb, white 10%, transparent);
76
+ --text-primary: #f1f3f7;
77
+ --text-secondary: #a3a3a3;
78
+ --text-dim: color-mix(in srgb, oklch(55.6% 0 0) 90%, white);
79
+ --accent: oklch(0.571 0.21 264);
80
+ --accent-soft: color-mix(in srgb, var(--accent) 12%, transparent);
65
81
  --selection-bg: color-mix(in srgb, var(--accent) 40%, transparent);
66
- --status-running: #34d399;
67
- --status-success: #4caf50;
68
- --status-warn: #f5a524;
69
- --status-error: #f87171;
70
- --status-idle: #7b8797;
71
- --shadow-panel: 0 22px 70px rgba(0, 0, 0, 0.28);
72
- --shadow-elevated: 0 1px 3px rgba(0, 0, 0, 0.18);
73
- --scrim-overlay: rgba(5, 8, 12, 0.68);
82
+ --status-running: oklch(69.6% 0.17 162.48);
83
+ --status-success: oklch(69.6% 0.17 162.48);
84
+ --status-warn: oklch(76.9% 0.188 70.08);
85
+ --status-error: color-mix(in srgb, oklch(63.7% 0.237 25.331) 90%, white);
86
+ --status-idle: color-mix(in srgb, oklch(55.2% 0.016 285.938) 90%, white);
87
+ --shadow-panel: inset 0 1px rgb(255 255 255 / 4%), 0 24px 72px -20px rgb(0 0 0 / 90%);
88
+ --shadow-elevated: 0 1px 2px color-mix(in srgb, var(--text-primary) 12%, transparent);
89
+ --scrim-overlay: color-mix(in srgb, var(--bg-base) 64%, transparent);
74
90
 
75
- /* new semantic aliases — used by 10.6.9 components and onward */
91
+ /* semantic aliases */
76
92
  --surface-base: var(--bg-base);
77
93
  --surface-panel: var(--bg-panel);
78
94
  --surface-raised: var(--bg-raised);
@@ -84,69 +100,84 @@
84
100
  --ink-on-accent: #ffffff;
85
101
  --ring: var(--accent);
86
102
 
87
- /* common composite values previously inlined as raw hex */
88
- --button-bg: #142133;
89
- --button-bg-hover: #1a2b42;
90
- --button-border-hover: #3a5470;
91
- --row-bg: #111b26;
92
- --row-bg-hover: rgba(21, 28, 37, 0.62);
93
- --canvas-deep: #0b1016;
94
- --canvas-mid: #0c1218;
95
- --canvas-soft: #0d141c;
96
- --shell-tint: rgba(98, 168, 245, 0.12);
97
- --error-border: #70303a;
98
- --error-text: #ffc0c6;
99
- --lifecycle-border:#315a82;
100
- --lifecycle-text: #cfe8ff;
101
- --highlight-bg: #20344e;
102
- --highlight-border:#426483;
103
- --placeholder-ink: #728093;
104
- --segment-track: rgba(255, 255, 255, 0.03);
105
- --segment-border: rgba(255, 255, 255, 0.05);
106
- --segment-hover: rgba(255, 255, 255, 0.05);
107
- --segment-active: #232c38;
108
- --segment-active-ink: #e2e8f0;
109
- --link-border: rgba(255, 255, 255, 0.12);
110
- --link-bg-hover: rgba(255, 255, 255, 0.06);
111
- --link-border-hover: rgba(255, 255, 255, 0.2);
112
- --link-ink: #a1b0c0;
113
- --inset-glow: rgba(255, 255, 255, 0.03);
114
- --rail-top: #0d141c;
115
- --rail-bottom: #0a1017;
103
+ /* common composite values */
104
+ --button-bg: color-mix(in srgb, #0a0a0a 97%, white);
105
+ --button-bg-hover: color-mix(in srgb, white 4%, transparent);
106
+ --button-border-hover: color-mix(in srgb, white 10%, transparent);
107
+ --row-bg: #000000;
108
+ --row-bg-hover: color-mix(in srgb, white 4%, transparent);
109
+ --canvas-deep: #000000;
110
+ --canvas-mid: color-mix(in srgb, #0a0a0a 97%, white);
111
+ --canvas-soft: color-mix(in srgb, white 4%, transparent);
112
+ --shell-tint: color-mix(in srgb, var(--accent) 6%, transparent);
113
+ --error-border: color-mix(in srgb, var(--status-error) 16%, transparent);
114
+ --error-text: var(--jp-red-400);
115
+ --lifecycle-border:color-mix(in srgb, var(--accent) 30%, transparent);
116
+ --lifecycle-text: color-mix(in srgb, var(--accent) 60%, white);
117
+ --highlight-bg: color-mix(in srgb, var(--accent) 12%, transparent);
118
+ --highlight-border:color-mix(in srgb, white 10%, transparent);
119
+ --placeholder-ink: var(--text-dim);
120
+ --segment-track: color-mix(in srgb, white 3%, transparent);
121
+ --segment-border: color-mix(in srgb, white 8%, transparent);
122
+ --segment-hover: color-mix(in srgb, white 4%, transparent);
123
+ --segment-active: #000000;
124
+ --segment-active-ink: #f1f3f7;
125
+ --link-border: color-mix(in srgb, white 8%, transparent);
126
+ --link-bg-hover: color-mix(in srgb, white 4%, transparent);
127
+ --link-border-hover: color-mix(in srgb, white 10%, transparent);
128
+ --link-ink: #a3a3a3;
129
+ --inset-glow: color-mix(in srgb, white 3%, transparent);
130
+ --rail-top: #000000;
131
+ --rail-bottom: #000000;
116
132
 
117
- /* alias tokens for notes/panels (previously undeclared) */
118
- --canvas-panel: oklch(16% 0.01 260);
119
- --canvas-base: oklch(13% 0.005 260);
120
- --danger-soft: color-mix(in srgb, var(--status-error) 12%, transparent);
133
+ /* alias tokens for notes/panels */
134
+ --canvas-panel: color-mix(in srgb, #0a0a0a 97%, white);
135
+ --canvas-base: #000000;
136
+ --danger-soft: color-mix(in srgb, var(--status-error) 16%, transparent);
121
137
  --accent-primary: var(--accent);
122
138
  --surface-secondary: var(--surface-raised);
123
139
  --text-tertiary: var(--text-dim);
140
+ --text-danger: var(--error-text);
141
+
142
+ /* sidebar surface + status tokens (260902 t3 shell, consumed from wp2/wp3) */
143
+ --sidebar-row-hover: color-mix(in srgb, #f1f3f7 8%, transparent);
144
+ --sidebar-row-active: color-mix(in srgb, #f1f3f7 11%, transparent);
145
+ --sidebar-row-selected: color-mix(in srgb, #f1f3f7 7%, transparent);
146
+ --sidebar-row-working: #38bdf8;
147
+ --sidebar-row-attention: var(--jp-amber-400);
148
+ --sidebar-row-error: var(--jp-red-400);
149
+ --sidebar-row-ready: var(--text-dim);
150
+ --sidebar-border: color-mix(in srgb, white 8%, transparent);
151
+ --sidebar-control-surface: #0a0a0a;
152
+ --focus-ring: 2px solid color-mix(in srgb, var(--ring) 50%, transparent);
153
+ --scrollbar-thumb: rgb(255 255 255 / 8%);
154
+ --scrollbar-thumb-hover: rgb(255 255 255 / 12%);
124
155
  }
125
156
 
126
157
  /* Light palette. */
127
158
  :root[data-theme="light"] {
128
159
  color-scheme: light;
129
160
 
130
- --bg-base: var(--jp-gray-50);
161
+ --bg-base: oklch(99.2% 0 0);
131
162
  --bg-panel: #ffffff;
132
- --bg-raised: var(--jp-gray-100);
163
+ --bg-raised: var(--jp-gray-50);
133
164
  --bg-elevated: #ffffff;
134
165
  --border-subtle: var(--jp-gray-200);
135
166
  --border-strong: var(--jp-gray-300);
136
- --text-primary: var(--jp-gray-900);
167
+ --text-primary: var(--jp-gray-800);
137
168
  --text-secondary: var(--jp-gray-600);
138
169
  --text-dim: var(--jp-gray-500);
139
- --accent: var(--jp-blue-600);
140
- --accent-soft: var(--jp-blue-100);
170
+ --accent: oklch(0.488 0.217 264);
171
+ --accent-soft: color-mix(in srgb, var(--accent) 8%, transparent);
141
172
  --selection-bg: color-mix(in srgb, var(--accent) 30%, transparent);
142
173
  --status-running: var(--jp-green-600);
143
174
  --status-success: var(--jp-green-600);
144
175
  --status-warn: var(--jp-amber-600);
145
176
  --status-error: var(--jp-red-600);
146
177
  --status-idle: var(--jp-slate-500);
147
- --shadow-panel: 0 18px 50px rgba(17, 20, 24, 0.08);
148
- --shadow-elevated: 0 1px 3px rgba(17, 20, 24, 0.08);
149
- --scrim-overlay: rgba(17, 20, 24, 0.32);
178
+ --shadow-panel: 0 24px 64px -24px rgb(0 0 0 / 18%);
179
+ --shadow-elevated: 0 1px 2px color-mix(in srgb, var(--text-primary) 12%, transparent);
180
+ --scrim-overlay: color-mix(in srgb, var(--bg-base) 60%, transparent);
150
181
 
151
182
  --surface-base: var(--bg-base);
152
183
  --surface-panel: var(--bg-panel);
@@ -157,43 +188,57 @@
157
188
  --ink-secondary: var(--text-secondary);
158
189
  --ink-muted: var(--text-dim);
159
190
  --ink-on-accent: #ffffff;
160
- --ring: var(--jp-blue-500);
191
+ --ring: var(--accent);
161
192
 
162
193
  --button-bg: #ffffff;
163
194
  --button-bg-hover: var(--jp-gray-100);
164
195
  --button-border-hover: var(--jp-gray-400);
165
196
  --row-bg: #ffffff;
166
- --row-bg-hover: rgba(31, 111, 235, 0.06);
197
+ --row-bg-hover: oklch(99.2% 0 0);
167
198
  --canvas-deep: var(--jp-gray-50);
168
199
  --canvas-mid: #ffffff;
169
200
  --canvas-soft: var(--jp-gray-100);
170
- --shell-tint: rgba(31, 111, 235, 0.05);
171
- --error-border: #f5b7bd;
172
- --error-text: #8a1f2a;
173
- --lifecycle-border:#b3d2f5;
174
- --lifecycle-text: #1f4e84;
175
- --highlight-bg: var(--jp-blue-100);
176
- --highlight-border: var(--jp-blue-300);
201
+ --shell-tint: color-mix(in srgb, var(--accent) 6%, transparent);
202
+ --error-border: color-mix(in srgb, var(--status-error) 8%, transparent);
203
+ --error-text: oklch(50.5% 0.213 27.518);
204
+ --lifecycle-border:color-mix(in srgb, var(--accent) 25%, transparent);
205
+ --lifecycle-text: var(--accent);
206
+ --highlight-bg: var(--jp-gray-100);
207
+ --highlight-border: var(--jp-gray-300);
177
208
  --placeholder-ink: var(--jp-gray-500);
178
- --segment-track: var(--jp-gray-100);
209
+ --segment-track: var(--jp-gray-50);
179
210
  --segment-border: var(--jp-gray-200);
180
- --segment-hover: rgba(17, 20, 24, 0.04);
211
+ --segment-hover: oklch(99.2% 0 0);
181
212
  --segment-active: #ffffff;
182
- --segment-active-ink: var(--jp-gray-900);
213
+ --segment-active-ink: var(--jp-gray-800);
183
214
  --link-border: var(--jp-gray-200);
184
- --link-bg-hover: var(--jp-gray-100);
215
+ --link-bg-hover: oklch(99.2% 0 0);
185
216
  --link-border-hover: var(--jp-gray-300);
186
217
  --link-ink: var(--jp-gray-600);
187
218
  --inset-glow: rgba(0, 0, 0, 0.02);
188
219
  --rail-top: #ffffff;
189
- --rail-bottom: var(--jp-gray-50);
220
+ --rail-bottom: oklch(99.2% 0 0);
190
221
 
191
- --canvas-panel: oklch(97% 0.005 260);
192
- --canvas-base: oklch(99% 0.002 260);
222
+ --canvas-panel: #ffffff;
223
+ --canvas-base: oklch(99.2% 0 0);
193
224
  --danger-soft: color-mix(in srgb, var(--status-error) 8%, transparent);
194
225
  --accent-primary: var(--accent);
195
226
  --surface-secondary: var(--surface-raised);
196
227
  --text-tertiary: var(--text-dim);
228
+ --text-danger: var(--error-text);
229
+
230
+ --sidebar-row-hover: oklch(99.2% 0 0);
231
+ --sidebar-row-active: #ffffff;
232
+ --sidebar-row-selected: #ffffff;
233
+ --sidebar-row-working: #0284c7;
234
+ --sidebar-row-attention: var(--jp-amber-600);
235
+ --sidebar-row-error: var(--jp-red-600);
236
+ --sidebar-row-ready: var(--text-dim);
237
+ --sidebar-border: var(--border-subtle);
238
+ --sidebar-control-surface: var(--jp-gray-100);
239
+ --focus-ring: 2px solid color-mix(in srgb, var(--ring) 50%, transparent);
240
+ --scrollbar-thumb: rgb(217 217 217);
241
+ --scrollbar-thumb-hover: rgb(191 191 191);
197
242
  }
198
243
 
199
244
  /* Auto: follow OS, default to dark when query is unsupported. */
@@ -201,26 +246,26 @@
201
246
  :root[data-theme="auto"] {
202
247
  color-scheme: light;
203
248
 
204
- --bg-base: var(--jp-gray-50);
249
+ --bg-base: oklch(99.2% 0 0);
205
250
  --bg-panel: #ffffff;
206
- --bg-raised: var(--jp-gray-100);
251
+ --bg-raised: var(--jp-gray-50);
207
252
  --bg-elevated: #ffffff;
208
253
  --border-subtle: var(--jp-gray-200);
209
254
  --border-strong: var(--jp-gray-300);
210
- --text-primary: var(--jp-gray-900);
255
+ --text-primary: var(--jp-gray-800);
211
256
  --text-secondary: var(--jp-gray-600);
212
257
  --text-dim: var(--jp-gray-500);
213
- --accent: var(--jp-blue-600);
214
- --accent-soft: var(--jp-blue-100);
258
+ --accent: oklch(0.488 0.217 264);
259
+ --accent-soft: color-mix(in srgb, var(--accent) 8%, transparent);
215
260
  --selection-bg: color-mix(in srgb, var(--accent) 30%, transparent);
216
261
  --status-running: var(--jp-green-600);
217
262
  --status-success: var(--jp-green-600);
218
263
  --status-warn: var(--jp-amber-600);
219
264
  --status-error: var(--jp-red-600);
220
265
  --status-idle: var(--jp-slate-500);
221
- --shadow-panel: 0 18px 50px rgba(17, 20, 24, 0.08);
222
- --shadow-elevated: 0 1px 3px rgba(17, 20, 24, 0.08);
223
- --scrim-overlay: rgba(17, 20, 24, 0.32);
266
+ --shadow-panel: 0 24px 64px -24px rgb(0 0 0 / 18%);
267
+ --shadow-elevated: 0 1px 2px color-mix(in srgb, var(--text-primary) 12%, transparent);
268
+ --scrim-overlay: color-mix(in srgb, var(--bg-base) 60%, transparent);
224
269
 
225
270
  --surface-base: var(--bg-base);
226
271
  --surface-panel: var(--bg-panel);
@@ -231,42 +276,60 @@
231
276
  --ink-secondary: var(--text-secondary);
232
277
  --ink-muted: var(--text-dim);
233
278
  --ink-on-accent: #ffffff;
234
- --ring: var(--jp-blue-500);
279
+ --ring: var(--accent);
235
280
 
236
281
  --button-bg: #ffffff;
237
282
  --button-bg-hover: var(--jp-gray-100);
238
283
  --button-border-hover: var(--jp-gray-400);
239
284
  --row-bg: #ffffff;
240
- --row-bg-hover: rgba(31, 111, 235, 0.06);
285
+ --row-bg-hover: oklch(99.2% 0 0);
241
286
  --canvas-deep: var(--jp-gray-50);
242
287
  --canvas-mid: #ffffff;
243
288
  --canvas-soft: var(--jp-gray-100);
244
- --shell-tint: rgba(31, 111, 235, 0.05);
245
- --error-border: #f5b7bd;
246
- --error-text: #8a1f2a;
247
- --lifecycle-border:#b3d2f5;
248
- --lifecycle-text: #1f4e84;
249
- --highlight-bg: var(--jp-blue-100);
250
- --highlight-border: var(--jp-blue-300);
289
+ --shell-tint: color-mix(in srgb, var(--accent) 6%, transparent);
290
+ --error-border: color-mix(in srgb, var(--status-error) 8%, transparent);
291
+ --error-text: oklch(50.5% 0.213 27.518);
292
+ --lifecycle-border:color-mix(in srgb, var(--accent) 25%, transparent);
293
+ --lifecycle-text: var(--accent);
294
+ --highlight-bg: var(--jp-gray-100);
295
+ --highlight-border: var(--jp-gray-300);
251
296
  --placeholder-ink: var(--jp-gray-500);
252
- --segment-track: var(--jp-gray-100);
297
+ --segment-track: var(--jp-gray-50);
253
298
  --segment-border: var(--jp-gray-200);
254
- --segment-hover: rgba(17, 20, 24, 0.04);
299
+ --segment-hover: oklch(99.2% 0 0);
255
300
  --segment-active: #ffffff;
256
- --segment-active-ink: var(--jp-gray-900);
301
+ --segment-active-ink: var(--jp-gray-800);
257
302
  --link-border: var(--jp-gray-200);
258
- --link-bg-hover: var(--jp-gray-100);
303
+ --link-bg-hover: oklch(99.2% 0 0);
259
304
  --link-border-hover: var(--jp-gray-300);
260
305
  --link-ink: var(--jp-gray-600);
261
306
  --inset-glow: rgba(0, 0, 0, 0.02);
262
307
  --rail-top: #ffffff;
263
- --rail-bottom: var(--jp-gray-50);
308
+ --rail-bottom: oklch(99.2% 0 0);
264
309
 
265
- --canvas-panel: oklch(97% 0.005 260);
266
- --canvas-base: oklch(99% 0.002 260);
310
+ --canvas-panel: #ffffff;
311
+ --canvas-base: oklch(99.2% 0 0);
267
312
  --danger-soft: color-mix(in srgb, var(--status-error) 8%, transparent);
268
313
  --accent-primary: var(--accent);
269
314
  --surface-secondary: var(--surface-raised);
270
315
  --text-tertiary: var(--text-dim);
316
+ --text-danger: var(--error-text);
317
+
318
+ --sidebar-row-hover: oklch(99.2% 0 0);
319
+ --sidebar-row-active: #ffffff;
320
+ --sidebar-row-selected: #ffffff;
321
+ --sidebar-row-working: #0284c7;
322
+ --sidebar-row-attention: var(--jp-amber-600);
323
+ --sidebar-row-error: var(--jp-red-600);
324
+ --sidebar-row-ready: var(--text-dim);
325
+ --sidebar-border: var(--border-subtle);
326
+ --sidebar-control-surface: var(--jp-gray-100);
327
+ --focus-ring: 2px solid color-mix(in srgb, var(--ring) 50%, transparent);
328
+ --scrollbar-thumb: rgb(217 217 217);
329
+ --scrollbar-thumb-hover: rgb(191 191 191);
271
330
  }
272
331
  }
332
+
333
+ :root[data-cli-jaw-desktop="true"] {
334
+ --workspace-topbar-height: 52px;
335
+ }
@@ -7,11 +7,16 @@ type PanelResizerProps = {
7
7
  onDelta: (delta: number) => void;
8
8
  onEnd?: (() => void) | undefined;
9
9
  className?: string | undefined;
10
+ ariaLabel?: string | undefined;
11
+ ariaValueNow?: number | undefined;
12
+ onDoubleClick?: (() => void) | undefined;
10
13
  };
11
14
 
12
15
  export function PanelResizer(props: PanelResizerProps) {
13
16
  const dragging = useRef(false);
14
17
  const lastPos = useRef(0);
18
+ const startPos = useRef(0);
19
+ const moved = useRef(false);
15
20
  const onDeltaRef = useRef(props.onDelta);
16
21
  const onEndRef = useRef(props.onEnd);
17
22
  const [isDragging, setIsDragging] = useState(false);
@@ -25,6 +30,12 @@ export function PanelResizer(props: PanelResizerProps) {
25
30
  const applyPointerPosition = useCallback((clientX: number, clientY: number) => {
26
31
  if (!dragging.current) return;
27
32
  const pos = direction === 'horizontal' ? clientX : clientY;
33
+ // A double-click is two mousedowns a few pixels apart; do not treat
34
+ // that jitter as a resize (t3 sidebar rail uses the same 2px guard).
35
+ if (!moved.current) {
36
+ if (Math.abs(pos - startPos.current) <= 2) return;
37
+ moved.current = true;
38
+ }
28
39
  const delta = pos - lastPos.current;
29
40
  lastPos.current = pos;
30
41
  if (delta !== 0) onDeltaRef.current(delta);
@@ -94,8 +105,10 @@ export function PanelResizer(props: PanelResizerProps) {
94
105
 
95
106
  function startDragging(clientX: number, clientY: number) {
96
107
  dragging.current = true;
108
+ moved.current = false;
97
109
  setIsDragging(true);
98
- lastPos.current = direction === 'horizontal' ? clientX : clientY;
110
+ startPos.current = direction === 'horizontal' ? clientX : clientY;
111
+ lastPos.current = startPos.current;
99
112
  document.body.classList.add(direction === 'horizontal' ? 'is-resizing-horizontal' : 'is-resizing-vertical');
100
113
  }
101
114
 
@@ -136,12 +149,15 @@ export function PanelResizer(props: PanelResizerProps) {
136
149
  role="separator"
137
150
  tabIndex={0}
138
151
  className={`panel-resizer panel-resizer-${direction} ${props.className ?? ''}`}
139
- aria-label={`Resize ${direction === 'horizontal' ? 'width' : 'height'}`}
152
+ aria-label={props.ariaLabel ?? `Resize ${direction === 'horizontal' ? 'width' : 'height'}`}
153
+ aria-valuenow={props.ariaValueNow}
154
+ aria-valuetext={props.ariaValueNow === undefined ? undefined : `${props.ariaValueNow}px`}
140
155
  aria-orientation={direction === 'horizontal' ? 'vertical' : 'horizontal'}
141
156
  onPointerDown={handlePointerDown}
142
157
  onMouseDown={handleMouseDown}
143
158
  onLostPointerCapture={stopDragging}
144
159
  onKeyDown={handleKeyDown}
160
+ onDoubleClick={props.onDoubleClick}
145
161
  />
146
162
  {isDragging && (
147
163
  <div
@@ -191,6 +191,8 @@ export type BrowserWebviewTabState = {
191
191
  inspecting?: boolean;
192
192
  crashed?: boolean;
193
193
  error?: string;
194
+ favicons?: string[];
195
+ zoomFactor?: number;
194
196
  };
195
197
 
196
198
  /** v5: element resolved from the native inspect pick (CDP DOM/AX domains). */
@@ -225,7 +227,10 @@ export type BrowserWebviewCommand =
225
227
  | { kind: 'reload'; tabId: string; ignoreCache?: boolean }
226
228
  | { kind: 'goBack'; tabId: string }
227
229
  | { kind: 'goForward'; tabId: string }
228
- | { kind: 'stop'; tabId: string };
230
+ | { kind: 'stop'; tabId: string }
231
+ | { kind: 'zoomIn'; tabId: string }
232
+ | { kind: 'zoomOut'; tabId: string }
233
+ | { kind: 'zoomReset'; tabId: string };
229
234
 
230
235
  export type BrowserWebviewNativeAction =
231
236
  | { kind: 'openExternal'; tabId: string }
@@ -281,6 +286,11 @@ export type PermissionDiagnosticsBridgeApi = {
281
286
  getLastDenials: () => Promise<{ ok: boolean; denials?: PermissionDenial[]; error?: string }>;
282
287
  };
283
288
 
289
+ export type DesktopWindowBridgeApi = {
290
+ getFullscreenState?: () => boolean;
291
+ onFullscreenStateChange?: (cb: (fullscreen: boolean) => void) => () => void;
292
+ };
293
+
284
294
  export type DesktopShellCapability = 'terminal' | 'diff' | 'git' | 'folder' | 'shortcuts' | 'browser' | 'clipboard' | 'permissions';
285
295
 
286
296
  /**
@@ -306,6 +316,7 @@ export type CliJawDesktopApi = {
306
316
  browser?: BrowserBridgeApi | undefined;
307
317
  reloadWindow?: (() => void) | undefined;
308
318
  hardReloadWindow?: (() => void) | undefined;
319
+ window?: DesktopWindowBridgeApi | undefined;
309
320
  };
310
321
 
311
322
  export function getDesktop(): CliJawDesktopApi | null {