stagent 0.1.5 → 0.1.7

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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Stagent
2
2
 
3
- > Governed AI agent operations with reusable profiles, workflow blueprints, scheduled runs, and local-first oversight.
3
+ > Govern Your AI Agents. Operate With Oversight.
4
4
 
5
5
  [![Next.js 16](https://img.shields.io/badge/Next.js-16-black)](https://nextjs.org/) [![React 19](https://img.shields.io/badge/React-19-61DAFB)](https://react.dev/) [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6)](https://www.typescriptlang.org/) [![Claude Agent SDK](https://img.shields.io/badge/Claude-Agent_SDK-D97706)](https://docs.anthropic.com/) [![OpenAI Codex App Server](https://img.shields.io/badge/OpenAI-Codex_App_Server-10A37F)](https://developers.openai.com/codex/app-server) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
6
6
 
@@ -12,27 +12,9 @@ npx stagent
12
12
 
13
13
  Open [localhost:3000](http://localhost:3000).
14
14
 
15
- <details>
16
- <summary>Contributor setup (clone + dev server)</summary>
17
-
18
- ```bash
19
- git clone <repo-url> && cd stagent && npm install
20
-
21
- # Set up one or both runtime credentials
22
- cat > .env.local <<'EOF'
23
- ANTHROPIC_API_KEY=your-anthropic-key
24
- OPENAI_API_KEY=your-openai-key
25
- EOF
26
-
27
- # Start the dev server
28
- npm run dev
29
- ```
30
-
31
- </details>
32
-
33
15
  **Profiles & Policies** · **Blueprints & Schedules** · **Open Source**
34
16
 
35
- <img src="https://unpkg.com/stagent@latest/public/readme/home-workspace.png" alt="Stagent home workspace" width="1200" />
17
+ <img src="https://raw.githubusercontent.com/navam-io/stagent/main/public/readme/home-workspace.png" alt="Stagent home workspace" width="1200" />
36
18
 
37
19
  | Home Workspace | Reusable Profiles | Workflow Blueprints | Governed Execution |
38
20
  |:-:|:-:|:-:|:-:|
@@ -76,7 +58,7 @@ Stagent ships a shared runtime registry that routes tasks, schedules, and workfl
76
58
 
77
59
  ## Architecture
78
60
 
79
- <img src="https://unpkg.com/stagent@latest/public/readme/architecture.svg" alt="Stagent architecture diagram" width="900" />
61
+ <img src="https://raw.githubusercontent.com/navam-io/stagent/main/public/readme/architecture.svg" alt="Stagent architecture diagram" width="900" />
80
62
 
81
63
  **Key design decisions:**
82
64
 
@@ -151,7 +133,7 @@ Curated agent profiles across work and personal domains, built as portable Claud
151
133
  #### Workflow Blueprints
152
134
  Pre-configured workflow templates across work and personal domains. Browse blueprints in a gallery with filtering and search, preview steps and required variables, fill in a dynamic form, and create draft workflows with resolved prompts and profile assignments. Create custom blueprints via YAML or import from GitHub URLs. Lineage tracking connects workflows back to their source blueprint.
153
135
 
154
- <img src="https://unpkg.com/stagent@latest/public/readme/workflow-blueprints.png" alt="Stagent workflow blueprint gallery" width="1200" />
136
+ <img src="https://raw.githubusercontent.com/navam-io/stagent/main/public/readme/workflow-blueprints.png" alt="Stagent workflow blueprint gallery" width="1200" />
155
137
 
156
138
  ### Documents
157
139
 
@@ -186,7 +168,7 @@ Provider-normalized metering tracks token and spend activity across tasks, resum
186
168
  #### Inbox & Human-in-the-Loop
187
169
  When an agent needs approval or input, a notification appears in your inbox. Review tool permission requests with "Allow Once" / "Always Allow" / "Deny" buttons, answer agent questions, and see task completion summaries. Supports bulk dismiss and 10s polling.
188
170
 
189
- <img src="https://unpkg.com/stagent@latest/public/readme/inbox-approvals.png" alt="Stagent inbox approval flow" width="1200" />
171
+ <img src="https://raw.githubusercontent.com/navam-io/stagent/main/public/readme/inbox-approvals.png" alt="Stagent inbox approval flow" width="1200" />
190
172
 
191
173
  #### Monitoring
192
174
  Real-time agent log streaming via Server-Sent Events. Filter by task or event type, click entries to jump to task details, and auto-pause polling when the tab is hidden (Page Visibility API).
@@ -343,6 +325,23 @@ All 14 features shipped across three layers:
343
325
 
344
326
  ## Contributing
345
327
 
328
+ ### Contributor Setup
329
+
330
+ ```bash
331
+ git clone <repo-url> && cd stagent && npm install
332
+
333
+ # Set up one or both runtime credentials
334
+ cat > .env.local <<'EOF'
335
+ ANTHROPIC_API_KEY=your-anthropic-key
336
+ OPENAI_API_KEY=your-openai-key
337
+ EOF
338
+
339
+ # Start the dev server
340
+ npm run dev
341
+ ```
342
+
343
+ ### Pull Requests
344
+
346
345
  1. Fork the repository
347
346
  2. Create a feature branch (`git checkout -b feature/your-feature`)
348
347
  3. Make your changes and add tests
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stagent",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Governed AI agent workspace for supervised local execution, workflows, documents, and provider runtimes.",
5
5
  "keywords": [
6
6
  "ai",
Binary file
@@ -185,41 +185,41 @@
185
185
  }
186
186
 
187
187
  .dark {
188
- /* Background — deep black with navy undertone */
189
- --background: oklch(0.09 0.02 265);
190
- --foreground: oklch(0.93 0.015 270);
191
-
192
- /* Cards — navy-tinted translucency */
193
- --card: oklch(0.16 0.025 265 / 0.6);
194
- --card-foreground: oklch(0.93 0.015 270);
195
- --popover: oklch(0.14 0.025 265 / 0.5);
196
- --popover-foreground: oklch(0.93 0.015 270);
197
-
198
- /* Primary — blue, stays mostly the same */
199
- --primary: oklch(0.65 0.18 260);
200
- --primary-foreground: oklch(0.09 0.02 265);
201
-
202
- /* Secondary — velvet-shifted */
203
- --secondary: oklch(0.18 0.035 310);
204
- --secondary-foreground: oklch(0.93 0.015 270);
205
-
206
- /* Muted — navy mid-tone */
207
- --muted: oklch(0.18 0.03 290);
208
- --muted-foreground: oklch(0.6 0.03 270);
209
- --surface-1: oklch(0.16 0.02 268 / 0.96);
210
- --surface-2: oklch(0.14 0.018 272 / 0.9);
211
- --surface-3: oklch(0.12 0.02 278 / 0.84);
212
- --surface-foreground: oklch(0.93 0.015 270);
213
-
214
- /* Accent — navy, distinct from secondary velvet */
215
- --accent: oklch(0.20 0.04 285);
216
- --accent-foreground: oklch(0.93 0.015 270);
188
+ /* Background — unified hue 250 blue-indigo */
189
+ --background: oklch(0.13 0.02 250);
190
+ --foreground: oklch(0.93 0.01 250);
191
+
192
+ /* Cards — hue 250 translucency */
193
+ --card: oklch(0.16 0.02 250 / 0.6);
194
+ --card-foreground: oklch(0.93 0.01 250);
195
+ --popover: oklch(0.16 0.02 250 / 0.5);
196
+ --popover-foreground: oklch(0.93 0.01 250);
197
+
198
+ /* Primary — blue-indigo hue 250 */
199
+ --primary: oklch(0.65 0.18 250);
200
+ --primary-foreground: oklch(0.13 0.02 250);
201
+
202
+ /* Secondary — unified hue 250 */
203
+ --secondary: oklch(0.19 0.02 250);
204
+ --secondary-foreground: oklch(0.93 0.01 250);
205
+
206
+ /* Muted — consistent hue 250 */
207
+ --muted: oklch(0.19 0.02 250);
208
+ --muted-foreground: oklch(0.6 0.02 250);
209
+ --surface-1: oklch(0.16 0.02 250 / 0.96);
210
+ --surface-2: oklch(0.14 0.02 250 / 0.9);
211
+ --surface-3: oklch(0.13 0.02 250 / 0.84);
212
+ --surface-foreground: oklch(0.93 0.01 250);
213
+
214
+ /* Accent — unified hue 250 */
215
+ --accent: oklch(0.19 0.02 250);
216
+ --accent-foreground: oklch(0.93 0.01 250);
217
217
 
218
218
  --destructive: oklch(0.55 0.2 25);
219
219
  --destructive-foreground: oklch(0.98 0.005 260);
220
220
  --border: var(--glass-border);
221
- --input: oklch(0.14 0.03 265 / 0.4);
222
- --ring: oklch(0.65 0.18 260);
221
+ --input: oklch(0.16 0.02 250 / 0.4);
222
+ --ring: oklch(0.65 0.18 250);
223
223
 
224
224
  --chart-1: oklch(0.65 0.22 260);
225
225
  --chart-2: oklch(0.65 0.19 170);
@@ -227,15 +227,15 @@
227
227
  --chart-4: oklch(0.65 0.22 300);
228
228
  --chart-5: oklch(0.7 0.19 30);
229
229
 
230
- /* Sidebar — slightly lighter velvet-black */
231
- --sidebar: oklch(0.11 0.025 290 / 0.6);
232
- --sidebar-foreground: oklch(0.93 0.015 270);
233
- --sidebar-primary: oklch(0.65 0.18 260);
234
- --sidebar-primary-foreground: oklch(0.09 0.02 265);
235
- --sidebar-accent: oklch(0.20 0.04 300);
236
- --sidebar-accent-foreground: oklch(0.93 0.015 270);
230
+ /* Sidebar — unified hue 250 */
231
+ --sidebar: oklch(0.13 0.02 250 / 0.6);
232
+ --sidebar-foreground: oklch(0.93 0.01 250);
233
+ --sidebar-primary: oklch(0.65 0.18 250);
234
+ --sidebar-primary-foreground: oklch(0.13 0.02 250);
235
+ --sidebar-accent: oklch(0.19 0.02 250);
236
+ --sidebar-accent-foreground: oklch(0.93 0.01 250);
237
237
  --sidebar-border: var(--glass-border-subtle);
238
- --sidebar-ring: oklch(0.65 0.18 260);
238
+ --sidebar-ring: oklch(0.65 0.18 250);
239
239
  /* Semantic status tokens */
240
240
  --status-running: oklch(0.65 0.18 260);
241
241
  --status-completed: oklch(0.65 0.15 170);
@@ -251,72 +251,42 @@
251
251
  --complexity-moderate: oklch(0.75 0.15 75);
252
252
  --complexity-complex: oklch(0.65 0.2 25);
253
253
 
254
- /* Dark mode glass overrides — navy-tinted instead of colorless white */
255
- --glass-bg: oklch(0.18 0.025 265 / 0.45);
256
- --glass-bg-heavy: oklch(0.22 0.03 265 / 0.55);
257
- --glass-bg-light: oklch(0.16 0.02 265 / 0.25);
258
- --glass-bg-subtle: oklch(0.14 0.015 265 / 0.15);
259
-
260
- /* Glass borders — navy-tinted for cohesion */
261
- --glass-border: oklch(0.4 0.04 265 / 0.3);
262
- --glass-border-strong: oklch(0.45 0.05 270 / 0.4);
263
- --glass-border-subtle: oklch(0.35 0.03 285 / 0.18);
264
-
265
- /* Glass shadows — deeper with navy tint */
266
- --glass-shadow: 0 8px 32px oklch(0.05 0.03 265 / 0.5);
267
- --glass-shadow-lg: 0 12px 48px oklch(0.05 0.03 265 / 0.6);
268
- --glass-shadow-sm: 0 4px 16px oklch(0.05 0.03 265 / 0.35);
269
-
270
- /* Inner glow — faint navy highlight */
271
- --glass-inner-glow: inset 0 1px 0 0 oklch(0.5 0.04 270 / 0.15);
272
- --glass-inner-glow-subtle: inset 0 1px 0 0 oklch(0.5 0.04 270 / 0.1);
273
-
274
- /* Modal — deep navy glass */
275
- --glass-bg-modal: oklch(0.12 0.03 285 / 0.75);
276
-
277
- /* Dark mode gradient presets — distinct identities using black/velvet/blue/navy palette */
278
- /* Dashboard/Home — deep black → midnight blue */
279
- --gradient-morning-sky: linear-gradient(
280
- 135deg,
281
- oklch(0.10 0.02 260) 0%,
282
- oklch(0.12 0.035 260) 50%,
283
- oklch(0.10 0.025 270) 100%
284
- );
285
- /* Projects/Workflows deep blue blue-navy */
286
- --gradient-ocean-mist: linear-gradient(
287
- 135deg,
288
- oklch(0.11 0.04 260) 0%,
289
- oklch(0.12 0.045 265) 50%,
290
- oklch(0.11 0.035 265) 100%
291
- );
292
- /* Monitor — black → deep navy */
293
- --gradient-forest-dawn: linear-gradient(
294
- 135deg,
295
- oklch(0.09 0.02 270) 0%,
296
- oklch(0.11 0.035 285) 50%,
297
- oklch(0.10 0.03 290) 100%
298
- );
299
- /* Inbox — velvet → warm navy */
300
- --gradient-sunset-glow: linear-gradient(
301
- 135deg,
302
- oklch(0.12 0.04 320) 0%,
303
- oklch(0.11 0.045 305) 50%,
304
- oklch(0.12 0.035 290) 100%
305
- );
306
- /* Documents — deep navy → indigo */
307
- --gradient-twilight: linear-gradient(
308
- 135deg,
309
- oklch(0.11 0.05 290) 0%,
310
- oklch(0.10 0.045 275) 50%,
311
- oklch(0.11 0.04 260) 100%
312
- );
313
- /* Settings — neutral black with subtle velvet warmth */
314
- --gradient-neutral: linear-gradient(
315
- 135deg,
316
- oklch(0.10 0.015 290) 0%,
317
- oklch(0.095 0.02 300) 50%,
318
- oklch(0.10 0.015 265) 100%
319
- );
254
+ /* Dark mode glass overrides — unified hue 250 blue-indigo */
255
+ --glass-bg: oklch(0.16 0.02 250 / 0.45);
256
+ --glass-bg-heavy: oklch(0.19 0.02 250 / 0.55);
257
+ --glass-bg-light: oklch(0.16 0.02 250 / 0.25);
258
+ --glass-bg-subtle: oklch(0.13 0.02 250 / 0.15);
259
+
260
+ /* Glass borders — hue 250 for cohesion */
261
+ --glass-border: oklch(0.25 0.02 250 / 0.3);
262
+ --glass-border-strong: oklch(0.30 0.02 250 / 0.4);
263
+ --glass-border-subtle: oklch(0.25 0.02 250 / 0.18);
264
+
265
+ /* Glass shadows — deeper with hue 250 tint */
266
+ --glass-shadow: 0 8px 32px oklch(0.05 0.02 250 / 0.5);
267
+ --glass-shadow-lg: 0 12px 48px oklch(0.05 0.02 250 / 0.6);
268
+ --glass-shadow-sm: 0 4px 16px oklch(0.05 0.02 250 / 0.35);
269
+
270
+ /* Inner glow — faint hue 250 highlight */
271
+ --glass-inner-glow: inset 0 1px 0 0 oklch(0.5 0.02 250 / 0.15);
272
+ --glass-inner-glow-subtle: inset 0 1px 0 0 oklch(0.5 0.02 250 / 0.1);
273
+
274
+ /* Modal — hue 250 glass */
275
+ --glass-bg-modal: oklch(0.13 0.02 250 / 0.75);
276
+
277
+ /* Dark mode gradient presets — unified hue 250 with subtle variation (248-252) */
278
+ --gradient-morning-sky: linear-gradient(135deg,
279
+ oklch(0.13 0.02 250) 0%, oklch(0.14 0.025 248) 50%, oklch(0.13 0.02 252) 100%);
280
+ --gradient-ocean-mist: linear-gradient(135deg,
281
+ oklch(0.13 0.025 248) 0%, oklch(0.14 0.03 250) 50%, oklch(0.13 0.025 252) 100%);
282
+ --gradient-forest-dawn: linear-gradient(135deg,
283
+ oklch(0.12 0.02 252) 0%, oklch(0.14 0.025 250) 50%, oklch(0.13 0.02 248) 100%);
284
+ --gradient-sunset-glow: linear-gradient(135deg,
285
+ oklch(0.13 0.02 246) 0%, oklch(0.14 0.025 248) 50%, oklch(0.13 0.02 250) 100%);
286
+ --gradient-twilight: linear-gradient(135deg,
287
+ oklch(0.13 0.03 252) 0%, oklch(0.14 0.025 250) 50%, oklch(0.13 0.02 248) 100%);
288
+ --gradient-neutral: linear-gradient(135deg,
289
+ oklch(0.13 0.015 250) 0%, oklch(0.135 0.02 250) 50%, oklch(0.13 0.015 250) 100%);
320
290
  }
321
291
 
322
292
  /* =============================================================
@@ -353,8 +323,8 @@
353
323
  box-shadow: inset 0 1px 0 0 oklch(0.3 0.04 260 / 0.3), var(--glass-shadow-sm);
354
324
  }
355
325
  .dark .logo-glass-bg {
356
- background: oklch(0.12 0.03 260);
357
- box-shadow: inset 0 1px 0 0 oklch(0.3 0.04 260 / 0.15), var(--glass-shadow-sm);
326
+ background: oklch(0.13 0.02 250);
327
+ box-shadow: inset 0 1px 0 0 oklch(0.3 0.02 250 / 0.15), var(--glass-shadow-sm);
358
328
  }
359
329
 
360
330
  .glass-sidebar {
@@ -410,6 +380,25 @@
410
380
  transition: background 0.3s ease, box-shadow 0.3s ease;
411
381
  }
412
382
 
383
+ .dark [data-slot="card"][data-slot="card"] {
384
+ background:
385
+ linear-gradient(180deg,
386
+ color-mix(in oklab, var(--surface-1) 70%, transparent),
387
+ color-mix(in oklab, var(--background) 88%, transparent)),
388
+ linear-gradient(135deg,
389
+ color-mix(in oklab, var(--primary) 10%, transparent),
390
+ transparent 58%);
391
+ box-shadow: 0 24px 50px color-mix(in oklab, var(--background) 84%, transparent);
392
+ }
393
+
394
+ .dark .surface-card {
395
+ background:
396
+ linear-gradient(180deg,
397
+ color-mix(in oklab, var(--surface-1) 85%, transparent),
398
+ color-mix(in oklab, var(--surface-2) 90%, transparent));
399
+ box-shadow: 0 12px 28px color-mix(in oklab, var(--background) 70%, transparent);
400
+ }
401
+
413
402
  [data-sidebar="sidebar"] {
414
403
  -webkit-backdrop-filter: blur(var(--blur-glass-lg));
415
404
  backdrop-filter: blur(var(--blur-glass-lg));
@@ -490,7 +479,7 @@
490
479
  }
491
480
  .dark [data-slot="sheet-overlay"],
492
481
  .dark [data-slot="dialog-overlay"] {
493
- background: oklch(0.05 0.03 285 / 0.65);
482
+ background: oklch(0.05 0.02 250 / 0.65);
494
483
  }
495
484
 
496
485
  /* Glass borders for table rows — doubled selector for cascade priority over TW4 utilities */
@@ -516,10 +505,10 @@
516
505
  width: 2px;
517
506
  }
518
507
  .dark [data-slot="separator"][data-orientation="horizontal"] {
519
- background: linear-gradient(to bottom, oklch(0.06 0.02 265 / 0.35), oklch(0.25 0.03 270 / 0.15));
508
+ background: linear-gradient(to bottom, oklch(0.06 0.02 250 / 0.35), oklch(0.25 0.02 250 / 0.15));
520
509
  }
521
510
  .dark [data-slot="separator"][data-orientation="vertical"] {
522
- background: linear-gradient(to right, oklch(0.06 0.02 265 / 0.35), oklch(0.25 0.03 270 / 0.15));
511
+ background: linear-gradient(to right, oklch(0.06 0.02 250 / 0.35), oklch(0.25 0.02 250 / 0.15));
523
512
  }
524
513
 
525
514
  /* Glass buttons — translucent CTAs */
@@ -571,12 +560,12 @@
571
560
 
572
561
  /* Dark mode button overrides */
573
562
  .dark [data-slot="button"][data-variant="default"] {
574
- background: oklch(0.55 0.18 255 / 0.8);
575
- box-shadow: var(--glass-shadow-sm), inset 0 1px 0 0 oklch(0.7 0.1 260 / 0.15);
576
- border: 1px solid oklch(0.6 0.12 260 / 0.25);
563
+ background: oklch(0.55 0.18 250 / 0.8);
564
+ box-shadow: var(--glass-shadow-sm), inset 0 1px 0 0 oklch(0.7 0.1 250 / 0.15);
565
+ border: 1px solid oklch(0.6 0.12 250 / 0.25);
577
566
  }
578
567
  .dark [data-slot="button"][data-variant="default"]:hover {
579
- background: oklch(0.58 0.18 255 / 0.9);
568
+ background: oklch(0.58 0.18 250 / 0.9);
580
569
  }
581
570
  .dark [data-slot="button"][data-variant="destructive"] {
582
571
  background: oklch(0.55 0.2 25 / 0.8);
@@ -701,7 +690,7 @@
701
690
  background: linear-gradient(
702
691
  90deg,
703
692
  transparent 0%,
704
- oklch(0.5 0.04 270 / 0.08) 50%,
693
+ oklch(0.5 0.02 250 / 0.08) 50%,
705
694
  transparent 100%
706
695
  );
707
696
  background-size: 200% 100%;
@@ -718,16 +707,29 @@ body {
718
707
 
719
708
  .dark .glass-sidebar [data-sidebar="sidebar"] {
720
709
  box-shadow:
721
- inset -1px 0 0 0 oklch(0.58 0.03 270 / 0.08),
722
- 12px 0 32px oklch(0.03 0.02 265 / 0.32);
710
+ inset -1px 0 0 0 oklch(0.58 0.02 250 / 0.08),
711
+ 12px 0 32px oklch(0.03 0.02 250 / 0.32);
723
712
  }
724
713
 
725
714
  .dark .surface-page-shell {
726
715
  box-shadow:
727
- 0 24px 56px oklch(0.03 0.02 265 / 0.44),
728
- inset 0 1px 0 0 oklch(0.58 0.03 270 / 0.08);
716
+ 0 24px 56px oklch(0.03 0.02 250 / 0.44),
717
+ inset 0 1px 0 0 oklch(0.58 0.02 250 / 0.08);
729
718
  }
730
719
 
731
720
  .dark .surface-toolbar {
732
- box-shadow: 0 10px 24px oklch(0.03 0.02 265 / 0.32);
721
+ box-shadow: 0 10px 24px oklch(0.03 0.02 250 / 0.32);
722
+ }
723
+
724
+ /* Noise grain overlay — subtle texture matching stagent.github.io */
725
+ .dark body::before {
726
+ content: "";
727
+ position: fixed;
728
+ inset: 0;
729
+ pointer-events: none;
730
+ z-index: 9999;
731
+ opacity: 0.03;
732
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
733
+ background-size: 256px 256px;
734
+ mix-blend-mode: overlay;
733
735
  }
@@ -21,7 +21,7 @@ export default async function InboxPage() {
21
21
 
22
22
  return (
23
23
  <div className="gradient-sunset-glow min-h-screen p-4 sm:p-6">
24
- <div className="surface-page surface-page-shell mx-auto min-h-[calc(100dvh-2rem)] max-w-6xl rounded-[30px] p-5 sm:p-6 lg:p-7">
24
+ <div className="surface-page surface-page-shell min-h-[calc(100dvh-2rem)] rounded-[30px] p-5 sm:p-6 lg:p-7">
25
25
  <div className="mb-5 space-y-1">
26
26
  <h1 className="text-2xl font-bold">Inbox</h1>
27
27
  <p className="text-sm text-muted-foreground">
@@ -35,17 +35,17 @@ const CRITICAL_THEME_CSS = `
35
35
  }
36
36
  html.dark {
37
37
  color-scheme: dark;
38
- --background: oklch(0.09 0.02 265);
39
- --foreground: oklch(0.93 0.015 270);
40
- --surface-1: oklch(0.16 0.02 268 / 0.96);
41
- --surface-2: oklch(0.14 0.018 272 / 0.9);
42
- --border: oklch(0.36 0.03 270 / 0.28);
38
+ --background: oklch(0.13 0.02 250);
39
+ --foreground: oklch(0.93 0.01 250);
40
+ --surface-1: oklch(0.16 0.02 250 / 0.96);
41
+ --surface-2: oklch(0.14 0.02 250 / 0.9);
42
+ --border: oklch(0.25 0.02 250 / 0.28);
43
43
  }
44
44
  html { background: var(--background); }
45
45
  `.replace(/\s+/g, " ").trim();
46
46
 
47
47
  // Static theme initialization script — no user input, safe from XSS.
48
- const THEME_INIT_SCRIPT = `(function(){try{var d=document.documentElement;var s=localStorage.getItem('stagent-theme');var t=s==='dark'||s==='light'?s:(window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light');d.classList.toggle('dark',t==='dark');d.dataset.theme=t;d.style.colorScheme=t;d.style.backgroundColor=t==='dark'?'oklch(0.09 0.02 265)':'oklch(0.98 0.005 260)';document.cookie='stagent-theme='+t+';path=/;max-age=31536000;SameSite=Lax';}catch(e){}})()`;
48
+ const THEME_INIT_SCRIPT = `(function(){try{var d=document.documentElement;var s=localStorage.getItem('stagent-theme');var t=s==='dark'||s==='light'?s:(window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light');d.classList.toggle('dark',t==='dark');d.dataset.theme=t;d.style.colorScheme=t;d.style.backgroundColor=t==='dark'?'oklch(0.13 0.02 250)':'oklch(0.98 0.005 260)';document.cookie='stagent-theme='+t+';path=/;max-age=31536000;SameSite=Lax';}catch(e){}})()`;
49
49
 
50
50
  export default function RootLayout({
51
51
  children,
package/src/app/page.tsx CHANGED
@@ -127,7 +127,7 @@ export default async function HomePage() {
127
127
 
128
128
  return (
129
129
  <div className="gradient-morning-sky min-h-screen p-4 sm:p-6">
130
- <div className="surface-page surface-page-shell mx-auto min-h-[calc(100dvh-2rem)] max-w-7xl rounded-[30px] p-5 sm:p-6 lg:p-7">
130
+ <div className="surface-page surface-page-shell min-h-[calc(100dvh-2rem)] rounded-[30px] p-5 sm:p-6 lg:p-7">
131
131
  <Greeting
132
132
  runningCount={runningResult.count}
133
133
  awaitingCount={awaitingResult.count}
@@ -25,7 +25,7 @@ export default async function EditProfilePage({
25
25
 
26
26
  return (
27
27
  <div className="gradient-ocean-mist min-h-screen p-6">
28
- <div className="max-w-6xl mx-auto">
28
+ <div className="">
29
29
  <Link href={duplicate === "true" ? "/profiles" : `/profiles/${id}`}>
30
30
  <Button variant="ghost" size="sm" className="mb-4">
31
31
  <ArrowLeft className="h-4 w-4 mr-1" />
@@ -19,7 +19,7 @@ export default async function ProfileDetailPage({
19
19
 
20
20
  return (
21
21
  <div className="gradient-ocean-mist min-h-[100dvh] p-4 sm:p-6">
22
- <div className="surface-page mx-auto max-w-7xl rounded-[28px] border border-border/60 p-6 shadow-[0_18px_48px_oklch(0.12_0.02_260_/_0.08)]">
22
+ <div className="surface-page rounded-[28px] border border-border/60 p-6 shadow-[0_18px_48px_oklch(0.12_0.02_260_/_0.08)]">
23
23
  <Link href="/profiles">
24
24
  <Button variant="ghost" size="sm" className="mb-4">
25
25
  <ArrowLeft className="h-4 w-4 mr-1" />
@@ -8,7 +8,7 @@ export const dynamic = "force-dynamic";
8
8
  export default async function NewProfilePage() {
9
9
  return (
10
10
  <div className="gradient-ocean-mist min-h-screen p-6">
11
- <div className="max-w-6xl mx-auto">
11
+ <div className="">
12
12
  <Link href="/profiles">
13
13
  <Button variant="ghost" size="sm" className="mb-4">
14
14
  <ArrowLeft className="h-4 w-4 mr-1" />
@@ -11,7 +11,7 @@ export default async function ProfilesPage() {
11
11
 
12
12
  return (
13
13
  <div className="gradient-ocean-mist min-h-[100dvh] p-4 sm:p-6">
14
- <div className="surface-page mx-auto max-w-7xl rounded-[28px] border border-border/60 p-6 shadow-[0_18px_48px_oklch(0.12_0.02_260_/_0.08)]">
14
+ <div className="surface-page rounded-[28px] border border-border/60 p-6 shadow-[0_18px_48px_oklch(0.12_0.02_260_/_0.08)]">
15
15
  <ProfileBrowser initialProfiles={profiles} />
16
16
  </div>
17
17
  </div>
@@ -24,7 +24,7 @@ export default async function ProjectsPage() {
24
24
 
25
25
  return (
26
26
  <div className="gradient-ocean-mist min-h-screen p-4 sm:p-6">
27
- <div className="surface-page surface-page-shell mx-auto min-h-[calc(100dvh-2rem)] max-w-6xl rounded-[30px] p-5 sm:p-6 lg:p-7">
27
+ <div className="surface-page surface-page-shell min-h-[calc(100dvh-2rem)] rounded-[30px] p-5 sm:p-6 lg:p-7">
28
28
  <ProjectList initialProjects={result} />
29
29
  </div>
30
30
  </div>
@@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader } from "@/components/ui/card";
3
3
 
4
4
  export default function SettingsLoading() {
5
5
  return (
6
- <div className="p-6 max-w-2xl space-y-6">
6
+ <div className="p-6 space-y-6">
7
7
  <div className="space-y-2">
8
8
  <Skeleton className="h-8 w-32" />
9
9
  <Skeleton className="h-4 w-56" />
@@ -9,7 +9,7 @@ export const dynamic = "force-dynamic";
9
9
  export default function SettingsPage() {
10
10
  return (
11
11
  <div className="gradient-sunset-glow min-h-screen">
12
- <div className="max-w-3xl mx-auto p-6 space-y-6">
12
+ <div className="p-6 space-y-6">
13
13
  <div>
14
14
  <h1 className="text-2xl font-bold tracking-tight">Settings</h1>
15
15
  <p className="text-muted-foreground">
@@ -47,7 +47,7 @@ export default async function EditWorkflowPage({
47
47
 
48
48
  return (
49
49
  <div className="gradient-ocean-mist min-h-screen p-6">
50
- <div className="max-w-6xl mx-auto">
50
+ <div className="">
51
51
  <Link href={clone === "true" ? "/workflows" : `/workflows/${id}`}>
52
52
  <Button variant="ghost" size="sm" className="mb-4">
53
53
  <ArrowLeft className="h-4 w-4 mr-1" />
@@ -22,7 +22,7 @@ export default async function NewWorkflowPage() {
22
22
 
23
23
  return (
24
24
  <div className="gradient-ocean-mist min-h-screen p-6">
25
- <div className="max-w-6xl mx-auto">
25
+ <div className="">
26
26
  <Link href="/workflows">
27
27
  <Button variant="ghost" size="sm" className="mb-4">
28
28
  <ArrowLeft className="h-4 w-4 mr-1" />
@@ -361,7 +361,7 @@ export function CostDashboard({
361
361
  );
362
362
 
363
363
  return (
364
- <div className="mx-auto flex max-w-7xl flex-col gap-6">
364
+ <div className="flex flex-col gap-6">
365
365
  <div className="max-w-3xl space-y-3">
366
366
  <div className="inline-flex items-center gap-2 rounded-full border border-border/60 bg-background/55 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-muted-foreground">
367
367
  <Wallet className="h-3.5 w-3.5" />
@@ -18,7 +18,7 @@ function applyTheme(theme: ResolvedTheme) {
18
18
  root.dataset.theme = theme;
19
19
  root.style.colorScheme = theme;
20
20
  root.style.backgroundColor =
21
- theme === "dark" ? "oklch(0.09 0.02 265)" : "oklch(0.98 0.005 260)";
21
+ theme === "dark" ? "oklch(0.13 0.02 250)" : "oklch(0.98 0.005 260)";
22
22
  localStorage.setItem("stagent-theme", theme);
23
23
  document.cookie = `stagent-theme=${theme};path=/;max-age=31536000;SameSite=Lax`;
24
24
  }