Skip to content

Commit 4cae17a

Browse files
CopilotBunsDevCopilot
authored
Resolve PR #395 merge conflicts against main (#428)
* Switch Openclaw gateway test to modern connect handshake - Replace legacy auth/session RPC flow with connect challenge handling - Surface gateway error details and pairing hints in diagnostics - Update contract and settings UI to show the new handshake fields * Add sidebar and branch picker enhancement plan (#391) - Document planned sidebar metadata and branch picker improvements - Add design guidance for dense, inline state visibility * Widen preview viewport inputs (#393) - Increase the width of the viewport width and height inputs - Prevent clipped values in the preview panel * Add OpenClaw gateway auth and device token persistence - Add gateway client handshake with signed device identity - Persist encrypted gateway config, device keys, and tokens - Thread OpenClaw auth state through server and UI * Wire in Openclaw gateway config and drop Solar Witch theme - Add `OpenclawGatewayConfigLive` to the server runtime layer - Remove the Solar Witch theme definitions from the web styles * Apply reviewer feedback: fix connect handshake, config error handling, Solar Witch theme, and legacy import banner gating Agent-Logs-Url: https://github.com/OpenKnots/okcode/sessions/9615af9c-7cb2-409b-93c1-541b906a4a67 Co-authored-by: BunsDev <[email protected]> * Add nonce validation in test handshake for clearer error reporting Agent-Logs-Url: https://github.com/OpenKnots/okcode/sessions/9615af9c-7cb2-409b-93c1-541b906a4a67 Co-authored-by: BunsDev <[email protected]> * Update DESIGN.md Co-authored-by: Copilot <[email protected]> * Update apps/web/src/themes.css Co-authored-by: Copilot <[email protected]> * Update apps/web/src/themes.css Co-authored-by: Copilot <[email protected]> * Update apps/web/src/routes/_chat.settings.tsx Co-authored-by: Copilot <[email protected]> * Update apps/server/src/persistence/Layers/OpenclawGatewayConfig.ts Co-authored-by: Copilot <[email protected]> * Update apps/server/src/wsServer.ts Co-authored-by: Copilot <[email protected]> * chore(deps): bump @pierre/diffs, lucide-react, oxfmt, oxlint, turbo Agent-Logs-Url: https://github.com/OpenKnots/okcode/sessions/fd5aa06f-86c4-4710-b12f-0d87f6a9c8f8 Co-authored-by: BunsDev <[email protected]> * Polish PR 395 merge resolution Agent-Logs-Url: https://github.com/OpenKnots/okcode/sessions/de1775b2-7460-4cb0-b19c-512a47ed8242 Co-authored-by: BunsDev <[email protected]> --------- Co-authored-by: Val Alexander <[email protected]> Co-authored-by: Val Alexander <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent 43bafe2 commit 4cae17a

File tree

8 files changed

+171
-234
lines changed

8 files changed

+171
-234
lines changed

DESIGN.md

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,34 +52,34 @@ conversation with the agent. Every pixel must earn its place.
5252

5353
### Typography
5454

55-
| Role | Size | Weight | Tracking | Font Stack |
56-
| -------------------------- | -------------------- | --------------- | --------- | ---------------------------- |
57-
| Thread title (sidebar) | `text-xs` (0.75rem) | `font-normal` | default | Inter, system-ui, sans-serif |
58-
| Thread subtitle / metadata | `text-[10px]` | `font-normal` | default | Inter, system-ui, sans-serif |
59-
| Badge text | `text-[10px]` | `font-medium` | default | Inter, system-ui, sans-serif |
60-
| Button text | `text-sm` (0.875rem) | `font-medium` | default | Inter, system-ui, sans-serif |
61-
| Heading / dialog title | `text-lg` (1.125rem) | `font-semibold` | `-0.01em` | Inter, system-ui, sans-serif |
62-
| Code / terminal | `text-sm` | `font-normal` | default | SF Mono, Consolas, monospace |
63-
| Project name | `text-xs` | `font-semibold` | default | Inter, system-ui, sans-serif |
55+
| Role | Size | Weight | Tracking | Font Stack |
56+
|------|------|--------|----------|------------|
57+
| Thread title (sidebar) | `text-xs` (0.75rem) | `font-normal` | default | Inter, system-ui, sans-serif |
58+
| Thread subtitle / metadata | `text-[10px]` | `font-normal` | default | Inter, system-ui, sans-serif |
59+
| Badge text | `text-[10px]` | `font-medium` | default | Inter, system-ui, sans-serif |
60+
| Button text | `text-sm` (0.875rem) | `font-medium` | default | Inter, system-ui, sans-serif |
61+
| Heading / dialog title | `text-lg` (1.125rem) | `font-semibold` | `-0.01em` | Inter, system-ui, sans-serif |
62+
| Code / terminal | `text-sm` | `font-normal` | default | SF Mono, Consolas, monospace |
63+
| Project name | `text-xs` | `font-semibold` | default | Inter, system-ui, sans-serif |
6464

6565
### Color Semantics
6666

6767
Colors are referenced through CSS custom properties, never hardcoded hex values.
6868

69-
| Token | Usage |
70-
| -------------------------- | ------------------------------------------------- |
71-
| `text-foreground` | Primary text |
72-
| `text-muted-foreground` | Secondary/deemphasized text |
69+
| Token | Usage |
70+
|-------|-------|
71+
| `text-foreground` | Primary text |
72+
| `text-muted-foreground` | Secondary/deemphasized text |
7373
| `text-muted-foreground/50` | Tertiary/metadata text (branch names, timestamps) |
74-
| `bg-background` | Page background |
75-
| `bg-accent` | Hover state, active row highlight |
76-
| `bg-accent/60` | Active sidebar item |
77-
| `bg-accent/40` | Selected sidebar item |
78-
| `text-emerald-600` | Additions / success (green) |
79-
| `text-rose-500` | Deletions / error (red) |
80-
| `text-warning` | Warning states, behind-upstream |
81-
| `text-destructive` | Destructive actions (delete) |
82-
| `border-border/60` | Subtle badge borders |
74+
| `bg-background` | Page background |
75+
| `bg-accent` | Hover state, active row highlight |
76+
| `bg-accent/60` | Active sidebar item |
77+
| `bg-accent/40` | Selected sidebar item |
78+
| `text-emerald-600` | Additions / success (green) |
79+
| `text-rose-500` | Deletions / error (red) |
80+
| `text-warning` | Warning states, behind-upstream |
81+
| `text-destructive` | Destructive actions (delete) |
82+
| `border-border/60` | Subtle badge borders |
8383

8484
### Spacing Rules
8585

@@ -93,16 +93,15 @@ Colors are referenced through CSS custom properties, never hardcoded hex values.
9393

9494
### Themes
9595

96-
Six premium themes, each with light and dark variants:
96+
Five premium themes, each with light and dark variants:
9797

98-
| Theme | Vibe |
99-
| --------------------- | ------------------------------------- |
100-
| **Iridescent Void** | Futuristic, expensive, slightly alien |
101-
| **Solar Witch** | Magical, cozy, ritualistic |
102-
| **Carbon** | Stark, modern, performance-focused |
103-
| **Vapor** | Refined, fluid, purposeful |
104-
| **Cotton Candy** | Sweet, dreamy, pink and blue |
105-
| **Cathedral Circuit** | Sacred machine, techno-gothic |
98+
| Theme | Vibe |
99+
|-------|------|
100+
| **Iridescent Void** | Futuristic, expensive, slightly alien |
101+
| **Carbon** | Stark, modern, performance-focused |
102+
| **Vapor** | Refined, fluid, purposeful |
103+
| **Cotton Candy** | Sweet, dreamy, pink and blue |
104+
| **Cathedral Circuit** | Sacred machine, techno-gothic |
106105

107106
All themes define the same set of CSS custom properties. Components must use semantic
108107
tokens (`bg-accent`, `text-muted-foreground`) — never theme-specific values.
@@ -250,7 +249,6 @@ a single flow:
250249
```
251250

252251
Quick action resolves automatically based on git state:
253-
254252
- Has changes + no PR → "Commit, push & PR"
255253
- Has changes + existing PR → "Commit & push"
256254
- No changes + ahead → "Push & create PR"

apps/server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"@anthropic-ai/claude-agent-sdk": "^0.2.77",
2727
"@effect/platform-node": "catalog:",
2828
"@effect/sql-sqlite-bun": "catalog:",
29-
"@pierre/diffs": "^1.1.0-beta.16",
29+
"@pierre/diffs": "1.1.13",
3030
"effect": "catalog:",
3131
"node-pty": "^1.1.0",
3232
"open": "^10.1.0",

apps/server/src/openclaw/GatewayClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ export class OpenclawGatewayClient {
466466

467467
if (frame.type === "event" && typeof frame.event === "string") {
468468
let matchedWaiter = false;
469-
for (const waiter of this.pendingEventWaiters) {
469+
for (const waiter of [...this.pendingEventWaiters]) {
470470
if (waiter.eventName === frame.event) {
471471
matchedWaiter = true;
472472
this.pendingEventWaiters.delete(waiter);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import * as Effect from "effect/Effect";
2+
import * as SqlClient from "effect/unstable/sql/SqlClient";
3+
4+
export default Effect.gen(function* () {
5+
const sql = yield* SqlClient.SqlClient;
6+
7+
yield* sql`
8+
CREATE TABLE IF NOT EXISTS openclaw_gateway_config (
9+
config_id TEXT PRIMARY KEY,
10+
gateway_url TEXT NOT NULL,
11+
encrypted_shared_secret TEXT NULL,
12+
device_id TEXT NOT NULL,
13+
device_public_key TEXT NOT NULL,
14+
device_fingerprint TEXT NOT NULL,
15+
encrypted_device_private_key TEXT NOT NULL,
16+
encrypted_device_token TEXT NULL,
17+
device_token_role TEXT NULL,
18+
device_token_scopes_json TEXT NOT NULL DEFAULT '[]',
19+
created_at TEXT NOT NULL,
20+
updated_at TEXT NOT NULL
21+
)
22+
`;
23+
});

apps/web/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"@lexical/react": "^0.41.0",
3131
"@okcode/contracts": "workspace:*",
3232
"@okcode/shared": "workspace:*",
33-
"@pierre/diffs": "1.1.0-beta.16",
33+
"@pierre/diffs": "1.1.13",
3434
"@tanstack/react-pacer": "^0.19.4",
3535
"@tanstack/react-query": "^5.90.0",
3636
"@tanstack/react-router": "^1.160.2",
@@ -42,7 +42,7 @@
4242
"html-to-image": "^1.11.13",
4343
"lexical": "^0.41.0",
4444
"lucide-react": "^0.564.0",
45-
"oxfmt": "^0.42.0",
45+
"oxfmt": "^0.44.0",
4646
"react": "^19.0.0",
4747
"react-dom": "^19.0.0",
4848
"react-intl": "^10.1.1",

apps/web/src/themes.css

Lines changed: 51 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -122,37 +122,6 @@
122122
--warning: #fbbf24;
123123
--warning-foreground: #fcd34d;
124124
}
125-
/* ─── Solar Witch ─── mystical, radiant, high-contrast sunset magic ─── */
126-
127-
:root.theme-solar-witch {
128-
color-scheme: light;
129-
--background: #fff7ed;
130-
--foreground: #3b0764;
131-
--card: #ffedd5;
132-
--card-foreground: #3b0764;
133-
--popover: #fff7ed;
134-
--popover-foreground: #3b0764;
135-
--primary: oklch(0.68 0.23 35);
136-
--primary-foreground: #ffffff;
137-
--secondary: rgba(251, 146, 60, 0.12);
138-
--secondary-foreground: #7c2d12;
139-
--muted: rgba(245, 158, 11, 0.12);
140-
--muted-foreground: #9a3412;
141-
--accent: rgba(236, 72, 153, 0.12);
142-
--accent-foreground: #831843;
143-
--destructive: #dc2626;
144-
--destructive-foreground: #b91c1c;
145-
--border: rgba(234, 88, 12, 0.18);
146-
--input: rgba(234, 88, 12, 0.14);
147-
--ring: oklch(0.68 0.23 35);
148-
--info: #7c3aed;
149-
--info-foreground: #6d28d9;
150-
--success: #16a34a;
151-
--success-foreground: #15803d;
152-
--warning: #f59e0b;
153-
--warning-foreground: #b45309;
154-
}
155-
156125
:root.theme-solar-witch.dark {
157126
color-scheme: dark;
158127
--background: #140b1f;
@@ -302,116 +271,64 @@
302271
--warning-foreground: #e8b830;
303272
}
304273

305-
/* ─── Cotton Candy ─── warm paper light, neon candy dark ─── */
274+
/* ─── Cotton Candy ─── sweet, dreamy pink & blue ─── */
306275

307276
:root.theme-cotton-candy {
308277
color-scheme: light;
309-
--background: rgb(249, 249, 249);
310-
--foreground: rgb(32, 32, 32);
311-
--card: rgb(252, 252, 252);
312-
--card-foreground: rgb(32, 32, 32);
313-
--popover: rgb(252, 252, 252);
314-
--popover-foreground: rgb(32, 32, 32);
315-
--primary: rgb(107, 71, 57);
316-
--primary-foreground: rgb(255, 255, 255);
317-
--secondary: rgb(255, 223, 181);
318-
--secondary-foreground: rgb(100, 40, 17);
319-
--muted: rgb(239, 239, 239);
320-
--muted-foreground: rgb(100, 100, 100);
321-
--accent: rgb(232, 232, 232);
322-
--accent-foreground: rgb(32, 32, 32);
323-
--destructive: rgb(255, 60, 20);
324-
--destructive-foreground: rgb(255, 255, 255);
325-
--border: rgb(216, 216, 216);
326-
--input: rgb(216, 216, 216);
327-
--ring: rgb(107, 71, 57);
328-
--chart-1: rgb(107, 71, 57);
329-
--chart-2: rgb(255, 223, 181);
330-
--chart-3: rgb(232, 232, 232);
331-
--chart-4: rgb(255, 230, 196);
332-
--chart-5: rgb(110, 69, 54);
333-
--sidebar: rgb(251, 251, 251);
334-
--sidebar-foreground: rgb(37, 37, 37);
335-
--sidebar-primary: rgb(52, 52, 52);
336-
--sidebar-primary-foreground: rgb(251, 251, 251);
337-
--sidebar-accent: rgb(247, 247, 247);
338-
--sidebar-accent-foreground: rgb(52, 52, 52);
339-
--sidebar-border: rgb(235, 235, 235);
340-
--sidebar-ring: rgb(181, 181, 181);
341-
--font-sans: Oxanium, sans-serif;
342-
--font-serif: "Space Grotesk", serif;
343-
--font-mono: Oxanium, sans-serif;
344-
--radius: 0.6rem;
345-
--shadow-x: 0;
346-
--shadow-y: 1px;
347-
--shadow-blur: 3px;
348-
--shadow-spread: 0px;
349-
--shadow-opacity: 0.1;
350-
--shadow-color: oklch(0 0 0);
351-
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
352-
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
353-
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
354-
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
355-
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
356-
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
357-
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
358-
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
359-
--tracking-normal: 0em;
360-
--spacing: 0.2rem;
278+
--background: #fdf6f9;
279+
--foreground: #2a1f2e;
280+
--card: #fceef5;
281+
--card-foreground: #2a1f2e;
282+
--popover: #fceef5;
283+
--popover-foreground: #2a1f2e;
284+
--primary: oklch(0.72 0.14 350);
285+
--primary-foreground: #ffffff;
286+
--secondary: rgba(248, 185, 215, 0.12);
287+
--secondary-foreground: #2a1f2e;
288+
--muted: rgba(160, 210, 248, 0.1);
289+
--muted-foreground: #8a7e94;
290+
--accent: rgba(150, 212, 252, 0.14);
291+
--accent-foreground: #2a1f2e;
292+
--destructive: #e85475;
293+
--destructive-foreground: #d03058;
294+
--border: rgba(248, 180, 215, 0.2);
295+
--input: rgba(248, 180, 215, 0.22);
296+
--ring: oklch(0.72 0.14 350);
297+
--info: #7ec8ee;
298+
--info-foreground: #5aaedb;
299+
--success: #6cc4a0;
300+
--success-foreground: #4aaa82;
301+
--warning: #f5baca;
302+
--warning-foreground: #d8929e;
361303
}
362304

363305
:root.theme-cotton-candy.dark {
364306
color-scheme: dark;
365-
--background: rgb(13, 13, 13);
366-
--foreground: rgb(237, 237, 237);
367-
--card: rgb(28, 28, 28);
368-
--card-foreground: rgb(238, 238, 238);
369-
--popover: rgb(26, 26, 26);
370-
--popover-foreground: rgb(238, 238, 238);
371-
--primary: rgb(255, 178, 238);
372-
--primary-foreground: rgb(45, 6, 45);
373-
--secondary: rgb(60, 37, 55);
374-
--secondary-foreground: rgb(254, 194, 255);
375-
--muted: rgb(28, 28, 28);
376-
--muted-foreground: rgb(181, 181, 181);
377-
--accent: rgb(13, 13, 13);
378-
--accent-foreground: rgb(237, 237, 237);
379-
--destructive: rgb(255, 60, 20);
380-
--destructive-foreground: rgb(255, 255, 255);
381-
--border: rgb(34, 22, 33);
382-
--input: rgb(71, 71, 71);
383-
--ring: rgb(255, 194, 244);
384-
--chart-1: rgb(255, 194, 244);
385-
--chart-2: rgb(60, 37, 56);
386-
--chart-3: rgb(41, 41, 41);
387-
--chart-4: rgb(70, 42, 65);
388-
--chart-5: rgb(255, 194, 247);
389-
--sidebar: rgb(23, 23, 28);
390-
--sidebar-foreground: rgb(245, 244, 245);
391-
--sidebar-primary: rgb(245, 0, 143);
392-
--sidebar-primary-foreground: rgb(255, 255, 255);
393-
--sidebar-accent: rgb(43, 38, 43);
394-
--sidebar-accent-foreground: rgb(245, 244, 245);
395-
--sidebar-border: rgb(43, 38, 43);
396-
--sidebar-ring: rgb(217, 211, 216);
397-
--font-sans: Oxanium, sans-serif;
398-
--font-serif: "Space Grotesk", serif;
399-
--font-mono: Oxanium, sans-serif;
400-
--radius: 0.6rem;
401-
--shadow-x: 0;
402-
--shadow-y: 1px;
403-
--shadow-blur: 3px;
404-
--shadow-spread: 0px;
405-
--shadow-opacity: 0.1;
406-
--shadow-color: oklch(0 0 0);
407-
--shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
408-
--shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
409-
--shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
410-
--shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
411-
--shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
412-
--shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
413-
--shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
414-
--shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
307+
--background: #170e1a;
308+
--foreground: #f4e8f2;
309+
--card: #1e1222;
310+
--card-foreground: #f4e8f2;
311+
--popover: #1e1222;
312+
--popover-foreground: #f4e8f2;
313+
--primary: oklch(0.75 0.14 350);
314+
--primary-foreground: #170e1a;
315+
--secondary: rgba(250, 170, 210, 0.08);
316+
--secondary-foreground: #f4e8f2;
317+
--muted: rgba(150, 210, 250, 0.08);
318+
--muted-foreground: #a090aa;
319+
--accent: rgba(150, 215, 255, 0.1);
320+
--accent-foreground: #f4e8f2;
321+
--destructive: #ff6b8a;
322+
--destructive-foreground: #ff95aa;
323+
--border: rgba(250, 170, 215, 0.1);
324+
--input: rgba(250, 170, 215, 0.12);
325+
--ring: oklch(0.75 0.14 350);
326+
--info: #8ed4f5;
327+
--info-foreground: #aee0f8;
328+
--success: #7dd4b0;
329+
--success-foreground: #90e0c0;
330+
--warning: #f5bfcc;
331+
--warning-foreground: #f8cdd8;
415332
}
416333

417334
/* ─── Cathedral Circuit ─── sacred machine, techno-gothic ─── */

0 commit comments

Comments
 (0)