nextworks 0.2.0-alpha.13 → 0.2.0-alpha.15
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 +3 -1
- package/dist/cli_manifests/blocks_manifest.json +5 -0
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_QUICKSTART.md +2 -0
- package/dist/kits/blocks/.nextworks/docs/BLOCKS_README.md +2 -0
- package/dist/kits/blocks/app/templates/aiworkflow/PresetThemeVars.tsx +1 -58
- package/dist/kits/blocks/app/templates/aiworkflow/README.md +2 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/CTA.tsx +9 -9
- package/dist/kits/blocks/app/templates/aiworkflow/components/Contact.tsx +12 -13
- package/dist/kits/blocks/app/templates/aiworkflow/components/FAQ.tsx +22 -19
- package/dist/kits/blocks/app/templates/aiworkflow/components/FeatureMockups.tsx +562 -0
- package/dist/kits/blocks/app/templates/aiworkflow/components/Features.tsx +18 -16
- package/dist/kits/blocks/app/templates/aiworkflow/components/Footer.tsx +13 -9
- package/dist/kits/blocks/app/templates/aiworkflow/components/Hero.tsx +883 -636
- package/dist/kits/blocks/app/templates/aiworkflow/components/Navbar.tsx +14 -15
- package/dist/kits/blocks/app/templates/aiworkflow/components/Pricing.tsx +27 -22
- package/dist/kits/blocks/app/templates/aiworkflow/components/ProcessTimeline.tsx +20 -21
- package/dist/kits/blocks/app/templates/aiworkflow/components/Testimonials.tsx +17 -13
- package/dist/kits/blocks/app/templates/aiworkflow/components/TrustBadges.tsx +15 -12
- package/dist/kits/blocks/app/templates/aiworkflow/themes/animation.tsx +151 -0
- package/dist/kits/blocks/app/templates/aiworkflow/themes/default.tsx +158 -0
- package/dist/kits/blocks/app/templates/aiworkflow/themes/test.tsx +163 -0
- package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +46 -0
- package/dist/kits/blocks/app/templates/gallery/page.tsx +550 -161
- package/dist/kits/blocks/components/sections/HeroProductDemo.tsx +74 -64
- package/dist/kits/blocks/components/sections/Navbar.tsx +2 -0
- package/dist/kits/blocks/components/sections/product-demo/ApprovalInboxPanel.tsx +16 -13
- package/dist/kits/blocks/components/sections/product-demo/DemoStage.tsx +283 -162
- package/dist/kits/blocks/components/sections/product-demo/DemoWindow.tsx +65 -53
- package/dist/kits/blocks/components/sections/product-demo/KnowledgePanel.tsx +20 -17
- package/dist/kits/blocks/components/sections/product-demo/RunConsolePanel.tsx +208 -127
- package/dist/kits/blocks/components/sections/product-demo/TaskListPanel.tsx +95 -0
- package/dist/kits/blocks/components/sections/product-demo/WorkflowStudioPanel.tsx +714 -161
- package/dist/kits/blocks/components/sections/product-demo/types.ts +69 -0
- package/dist/kits/blocks/components/ui/theme-selector.tsx +1 -1
- package/dist/kits/blocks/package-deps.json +3 -3
- package/dist/kits/blocks/public/placeholders/aiworkflow/live.svg +92 -0
- package/dist/kits/blocks/public/placeholders/aiworkflow/review.svg +80 -0
- package/dist/kits/blocks/public/placeholders/aiworkflow/task.svg +71 -0
- package/dist/kits/blocks/tsconfig.json +13 -0
- package/dist/utils/file-operations.d.ts.map +1 -1
- package/dist/utils/file-operations.js +6 -1
- package/dist/utils/file-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,636 +1,883 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { HeroProductDemo } from "@/components/sections/HeroProductDemo";
|
|
4
|
-
import type { ProductDemoScenario } from "@/components/sections/product-demo/types";
|
|
5
|
-
|
|
6
|
-
const scenarios: ProductDemoScenario[] = [
|
|
7
|
-
{
|
|
8
|
-
key: "
|
|
9
|
-
label: "
|
|
10
|
-
description:
|
|
11
|
-
"
|
|
12
|
-
activeWindow: "workflowStudio",
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
{
|
|
101
|
-
id: "
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
status: "
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
"
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
summary:
|
|
256
|
-
"
|
|
257
|
-
|
|
258
|
-
{
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
"
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
},
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
},
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
},
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
status: "
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
{
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { HeroProductDemo } from "@/components/sections/HeroProductDemo";
|
|
4
|
+
import type { ProductDemoScenario } from "@/components/sections/product-demo/types";
|
|
5
|
+
|
|
6
|
+
const scenarios: ProductDemoScenario[] = [
|
|
7
|
+
{
|
|
8
|
+
key: "fix-auth-flow",
|
|
9
|
+
label: "Coding agent",
|
|
10
|
+
description:
|
|
11
|
+
"Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
|
|
12
|
+
activeWindow: "workflowStudio",
|
|
13
|
+
playback: {
|
|
14
|
+
workflowStudio: {
|
|
15
|
+
playbackStepDurationsMs: [780, 860, 1480, 1120, 940, 760, 1720],
|
|
16
|
+
playbackResetDelayMs: 2200,
|
|
17
|
+
},
|
|
18
|
+
runConsole: {
|
|
19
|
+
playbackStepDurationsMs: [1260, 1540, 980, 760, 680, 620, 1380],
|
|
20
|
+
playbackResetDelayMs: 2200,
|
|
21
|
+
playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 2, 3],
|
|
22
|
+
playbackStepVisibleLineCounts: [2, 2, 3, 4, 6, 9, 12, 15, 16],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
taskList: {
|
|
26
|
+
window: {
|
|
27
|
+
key: "taskList",
|
|
28
|
+
title: "Tasks",
|
|
29
|
+
subtitle: "Current workspace",
|
|
30
|
+
status: { label: "3 tasks", tone: "info" },
|
|
31
|
+
},
|
|
32
|
+
title: "Agent tasks",
|
|
33
|
+
subtitle: "Select a coding task to inspect and execute.",
|
|
34
|
+
activeItemId: "fix-auth-flow",
|
|
35
|
+
items: [
|
|
36
|
+
{
|
|
37
|
+
id: "fix-auth-flow",
|
|
38
|
+
title: "Fix auth flow",
|
|
39
|
+
description: "Fix the post-login redirect after the OAuth callback.",
|
|
40
|
+
meta: "apps/web · active",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "refactor-pricing-page",
|
|
44
|
+
title: "Refactor pricing page",
|
|
45
|
+
description:
|
|
46
|
+
"Extract repeated pricing sections into reusable components.",
|
|
47
|
+
meta: "marketing site · queued",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "ship-command-palette",
|
|
51
|
+
title: "Ship command palette",
|
|
52
|
+
description: "Add global search, shortcuts, and action routing.",
|
|
53
|
+
meta: "dashboard · ready",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
workflowStudio: {
|
|
58
|
+
window: {
|
|
59
|
+
key: "workflowStudio",
|
|
60
|
+
title: "Agent",
|
|
61
|
+
subtitle: "Active session",
|
|
62
|
+
status: { label: "Thinking", tone: "info" },
|
|
63
|
+
},
|
|
64
|
+
title: "Investigating redirect bug",
|
|
65
|
+
subtitle: "The agent inspects the callback and prepares a safe patch.",
|
|
66
|
+
activeNodeId: "edit-callback",
|
|
67
|
+
transcript: [
|
|
68
|
+
{ id: "auth-title", kind: "title", text: "Fix auth flow" },
|
|
69
|
+
{
|
|
70
|
+
id: "auth-prompt",
|
|
71
|
+
kind: "prompt",
|
|
72
|
+
text: "Fix the OAuth callback redirect so the app preserves the intended destination after sign-in.",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "auth-read-1",
|
|
76
|
+
kind: "activity",
|
|
77
|
+
text: "Read app/auth/callback/page.tsx",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "auth-file-1",
|
|
81
|
+
kind: "file",
|
|
82
|
+
path: "app/auth/callback/page.tsx",
|
|
83
|
+
text: "app/auth/callback/page.tsx",
|
|
84
|
+
added: 14,
|
|
85
|
+
removed: 3,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "auth-file-2",
|
|
89
|
+
kind: "file",
|
|
90
|
+
path: "lib/auth/normalize-return-to.ts",
|
|
91
|
+
text: "lib/auth/normalize-return-to.ts",
|
|
92
|
+
added: 6,
|
|
93
|
+
removed: 1,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: "auth-run-1",
|
|
97
|
+
kind: "activity",
|
|
98
|
+
text: "Run redirect scenarios for nested routes and invalid returnTo values",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "auth-thought-1",
|
|
102
|
+
kind: "thought",
|
|
103
|
+
text: "Preserve same-origin destinations, drop empty values, and avoid redirecting twice after the callback completes.",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "auth-message-1",
|
|
107
|
+
kind: "message",
|
|
108
|
+
text: "Patch keeps /dashboard/settings intact, falls back only when sanitize returns null, and records the redirect source for debugging.",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "auth-run-2",
|
|
112
|
+
kind: "activity",
|
|
113
|
+
text: "Prepare regression notes for auth loop and malformed path checks",
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
composer: {
|
|
117
|
+
placeholder: "Plan, inspect, or patch the next issue...",
|
|
118
|
+
modeLabel: "Agent",
|
|
119
|
+
modelLabel: "Sonnet",
|
|
120
|
+
},
|
|
121
|
+
highlights: [
|
|
122
|
+
{ id: "inspect-route", label: "Read files", tone: "info" },
|
|
123
|
+
{ id: "edit-callback", label: "Write patch", tone: "accent" },
|
|
124
|
+
],
|
|
125
|
+
nodes: [
|
|
126
|
+
{
|
|
127
|
+
id: "inspect-route",
|
|
128
|
+
label: "Inspect auth callback",
|
|
129
|
+
description: "Read callback handler and post-login redirect logic.",
|
|
130
|
+
type: "Read",
|
|
131
|
+
status: "success",
|
|
132
|
+
metadata: "app/auth/callback/page.tsx",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
id: "trace-session",
|
|
136
|
+
label: "Trace session state",
|
|
137
|
+
description: "Verify redirect target after token exchange completes.",
|
|
138
|
+
type: "Analyze",
|
|
139
|
+
status: "success",
|
|
140
|
+
metadata: "session + router state",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "edit-callback",
|
|
144
|
+
label: "Patch redirect handling",
|
|
145
|
+
type: "Edit",
|
|
146
|
+
status: "info",
|
|
147
|
+
active: true,
|
|
148
|
+
emphasized: true,
|
|
149
|
+
metadata: "drafting change set",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "run-checks",
|
|
153
|
+
label: "Run validation",
|
|
154
|
+
description:
|
|
155
|
+
"Check for auth loop regression and invalid destination paths.",
|
|
156
|
+
type: "Verify",
|
|
157
|
+
status: "neutral",
|
|
158
|
+
metadata: "tests next",
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
runConsole: {
|
|
163
|
+
window: {
|
|
164
|
+
key: "runConsole",
|
|
165
|
+
title: "Editor",
|
|
166
|
+
subtitle: "Live diff",
|
|
167
|
+
status: { label: "Updating", tone: "info" },
|
|
168
|
+
},
|
|
169
|
+
title: "app/auth/callback/page.tsx",
|
|
170
|
+
subtitle: "The diff updates as the agent writes the patch.",
|
|
171
|
+
statusLabel: "Applying patch",
|
|
172
|
+
progressLabel: "17 lines changed",
|
|
173
|
+
progressPercent: 68,
|
|
174
|
+
activeEntryId: "diff-3",
|
|
175
|
+
editorTabLabel: "page.tsx",
|
|
176
|
+
editorLanguage: "TypeScript",
|
|
177
|
+
editorSummary:
|
|
178
|
+
"Guard empty return paths and preserve intended destination.",
|
|
179
|
+
entries: [
|
|
180
|
+
{
|
|
181
|
+
id: "diff-1",
|
|
182
|
+
message: "Opened callback page and redirect helper",
|
|
183
|
+
timestamp: "11:02",
|
|
184
|
+
source: "agent",
|
|
185
|
+
status: "success",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: "diff-2",
|
|
189
|
+
message: "Found empty redirect path after OAuth callback",
|
|
190
|
+
timestamp: "11:02",
|
|
191
|
+
source: "analysis",
|
|
192
|
+
status: "success",
|
|
193
|
+
detail:
|
|
194
|
+
"Fallback was defaulting too early and dropping intended destination.",
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: "diff-3",
|
|
198
|
+
message: "Writing guarded redirect with preserved returnTo",
|
|
199
|
+
timestamp: "11:03",
|
|
200
|
+
source: "editor",
|
|
201
|
+
status: "info",
|
|
202
|
+
highlighted: true,
|
|
203
|
+
lineNumber: "38",
|
|
204
|
+
code: [
|
|
205
|
+
" const safeReturnTo = normalizeReturnTo(searchParams.get('returnTo'))",
|
|
206
|
+
"+const shouldTrackRedirect = safeReturnTo !== null",
|
|
207
|
+
"+const fallbackDestination = '/dashboard'",
|
|
208
|
+
" const destination = safeReturnTo ?? '/dashboard'",
|
|
209
|
+
"+const nextPath = destination || fallbackDestination",
|
|
210
|
+
"+const redirectSource = safeReturnTo ? 'return_to' : 'fallback'",
|
|
211
|
+
" ",
|
|
212
|
+
"+if (!nextPath.startsWith('/')) {",
|
|
213
|
+
"+ router.replace(fallbackDestination)",
|
|
214
|
+
"+ return null",
|
|
215
|
+
"+}",
|
|
216
|
+
"-router.replace('/dashboard')",
|
|
217
|
+
"+router.replace(nextPath)",
|
|
218
|
+
"+if (shouldTrackRedirect) trackAuthRedirect(nextPath, redirectSource)",
|
|
219
|
+
"+logAuthNavigation('oauth_callback_redirect', { destination: nextPath })",
|
|
220
|
+
" return null",
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
id: "diff-4",
|
|
225
|
+
message: "Validated redirect to /dashboard/settings",
|
|
226
|
+
timestamp: "11:03",
|
|
227
|
+
source: "preview",
|
|
228
|
+
status: "neutral",
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
metrics: [
|
|
232
|
+
{ id: "m1", label: "Files", value: "2", tone: "success" },
|
|
233
|
+
{ id: "m2", label: "Edits", value: "12", tone: "info" },
|
|
234
|
+
{ id: "m3", label: "Checks", value: "1/2", tone: "warning" },
|
|
235
|
+
],
|
|
236
|
+
highlights: [],
|
|
237
|
+
},
|
|
238
|
+
approvalInbox: {
|
|
239
|
+
window: {
|
|
240
|
+
key: "approvalInbox",
|
|
241
|
+
title: "Hidden",
|
|
242
|
+
},
|
|
243
|
+
items: [],
|
|
244
|
+
},
|
|
245
|
+
knowledgePanel: {
|
|
246
|
+
window: {
|
|
247
|
+
key: "knowledgePanel",
|
|
248
|
+
title: "Knowledge",
|
|
249
|
+
subtitle: "Preview",
|
|
250
|
+
status: { label: "Ready", tone: "success" },
|
|
251
|
+
},
|
|
252
|
+
title: "Patch preview",
|
|
253
|
+
subtitle: "Show the code the agent is producing right now.",
|
|
254
|
+
query: "page.tsx",
|
|
255
|
+
summary:
|
|
256
|
+
"Redirects now preserve a sanitized returnTo destination and fall back only when needed.",
|
|
257
|
+
snippets: [
|
|
258
|
+
{
|
|
259
|
+
id: "snippet-1",
|
|
260
|
+
title: "Updated callback handler",
|
|
261
|
+
excerptLabel: "Live diff",
|
|
262
|
+
confidence: "12 changed lines",
|
|
263
|
+
highlighted: true,
|
|
264
|
+
content:
|
|
265
|
+
"const safeReturnTo = normalizeReturnTo(searchParams.get('returnTo'))\nconst destination = safeReturnTo ?? '/dashboard'\nrouter.replace(destination)",
|
|
266
|
+
tags: ["redirect", "auth", "callback"],
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
highlights: [
|
|
270
|
+
{ id: "snippet-1", label: "Generated code", tone: "success" },
|
|
271
|
+
],
|
|
272
|
+
},
|
|
273
|
+
highlights: [
|
|
274
|
+
{ id: "edit-callback", label: "Active edit", tone: "accent" },
|
|
275
|
+
{ id: "diff-3", label: "Result updates", tone: "info" },
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
key: "refactor-pricing-page",
|
|
280
|
+
label: "Coding agent",
|
|
281
|
+
description:
|
|
282
|
+
"Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
|
|
283
|
+
activeWindow: "workflowStudio",
|
|
284
|
+
playback: {
|
|
285
|
+
workflowStudio: {
|
|
286
|
+
playbackStepDurationsMs: [820, 920, 1380, 1180, 980, 840, 1640],
|
|
287
|
+
playbackResetDelayMs: 2200,
|
|
288
|
+
},
|
|
289
|
+
runConsole: {
|
|
290
|
+
playbackStepDurationsMs: [1320, 1480, 920, 760, 700, 660, 1320],
|
|
291
|
+
playbackResetDelayMs: 2200,
|
|
292
|
+
playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 3, 3],
|
|
293
|
+
playbackStepVisibleLineCounts: [2, 2, 3, 4, 5, 7, 9, 11, 11],
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
taskList: {
|
|
297
|
+
window: {
|
|
298
|
+
key: "taskList",
|
|
299
|
+
title: "Tasks",
|
|
300
|
+
subtitle: "Current workspace",
|
|
301
|
+
status: { label: "3 tasks", tone: "info" },
|
|
302
|
+
},
|
|
303
|
+
title: "Agent tasks",
|
|
304
|
+
subtitle: "Select a coding task to inspect and execute.",
|
|
305
|
+
activeItemId: "refactor-pricing-page",
|
|
306
|
+
items: [
|
|
307
|
+
{
|
|
308
|
+
id: "fix-auth-flow",
|
|
309
|
+
title: "Fix auth flow",
|
|
310
|
+
description: "Fix the post-login redirect after the OAuth callback.",
|
|
311
|
+
meta: "apps/web · active",
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
id: "refactor-pricing-page",
|
|
315
|
+
title: "Refactor pricing page",
|
|
316
|
+
description:
|
|
317
|
+
"Extract repeated pricing sections into reusable components.",
|
|
318
|
+
meta: "marketing site · queued",
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
id: "ship-command-palette",
|
|
322
|
+
title: "Ship command palette",
|
|
323
|
+
description: "Add global search, shortcuts, and action routing.",
|
|
324
|
+
meta: "dashboard · ready",
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
},
|
|
328
|
+
workflowStudio: {
|
|
329
|
+
window: {
|
|
330
|
+
key: "workflowStudio",
|
|
331
|
+
title: "Agent",
|
|
332
|
+
subtitle: "Active session",
|
|
333
|
+
status: { label: "Planning", tone: "info" },
|
|
334
|
+
},
|
|
335
|
+
title: "Extracting pricing sections",
|
|
336
|
+
subtitle: "The agent maps repeated UI and rewires the page composition.",
|
|
337
|
+
activeNodeId: "create-blocks",
|
|
338
|
+
transcript: [
|
|
339
|
+
{ id: "pricing-title", kind: "title", text: "Refactor pricing page" },
|
|
340
|
+
{
|
|
341
|
+
id: "pricing-prompt",
|
|
342
|
+
kind: "prompt",
|
|
343
|
+
text: "Extract the pricing page into reusable sections without changing the visual output.",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
id: "pricing-read-1",
|
|
347
|
+
kind: "activity",
|
|
348
|
+
text: "Read app/(marketing)/pricing/page.tsx",
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
id: "pricing-file-1",
|
|
352
|
+
kind: "file",
|
|
353
|
+
path: "components/pricing/PricingTiers.tsx",
|
|
354
|
+
text: "components/pricing/PricingTiers.tsx",
|
|
355
|
+
added: 52,
|
|
356
|
+
removed: 0,
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
id: "pricing-file-2",
|
|
360
|
+
kind: "file",
|
|
361
|
+
path: "app/(marketing)/pricing/page.tsx",
|
|
362
|
+
text: "app/(marketing)/pricing/page.tsx",
|
|
363
|
+
added: 18,
|
|
364
|
+
removed: 34,
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
id: "pricing-run-1",
|
|
368
|
+
kind: "activity",
|
|
369
|
+
text: "Move the tier grid wrapper into PricingTiers and normalize the plans prop shape",
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
id: "pricing-thought-1",
|
|
373
|
+
kind: "thought",
|
|
374
|
+
text: "Keep the visual output identical by preserving card order, CTA copy, and the existing spacing classes.",
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
id: "pricing-message-1",
|
|
378
|
+
kind: "message",
|
|
379
|
+
text: "The page entry now composes extracted sections while shared pricing data stays centralized and easier to extend.",
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
id: "pricing-run-2",
|
|
383
|
+
kind: "activity",
|
|
384
|
+
text: "Compare extracted markup against the original layout before final cleanup",
|
|
385
|
+
},
|
|
386
|
+
],
|
|
387
|
+
composer: {
|
|
388
|
+
placeholder: "Plan, search, or restructure the page...",
|
|
389
|
+
modeLabel: "Agent",
|
|
390
|
+
modelLabel: "Sonnet",
|
|
391
|
+
},
|
|
392
|
+
highlights: [
|
|
393
|
+
{ id: "scan-page", label: "Find repetition", tone: "info" },
|
|
394
|
+
{ id: "create-blocks", label: "Extract components", tone: "accent" },
|
|
395
|
+
],
|
|
396
|
+
nodes: [
|
|
397
|
+
{
|
|
398
|
+
id: "scan-page",
|
|
399
|
+
label: "Scan pricing page",
|
|
400
|
+
description: "Detect repeated tier, feature, and CTA structures.",
|
|
401
|
+
type: "Read",
|
|
402
|
+
status: "success",
|
|
403
|
+
metadata: "app/(marketing)/pricing/page.tsx",
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
id: "map-sections",
|
|
407
|
+
label: "Map component boundaries",
|
|
408
|
+
description: "Group hero, tiers, FAQ, and comparison table logic.",
|
|
409
|
+
type: "Analyze",
|
|
410
|
+
status: "success",
|
|
411
|
+
metadata: "4 extractable sections",
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
id: "create-blocks",
|
|
415
|
+
label: "Create reusable blocks",
|
|
416
|
+
type: "Edit",
|
|
417
|
+
status: "info",
|
|
418
|
+
active: true,
|
|
419
|
+
emphasized: true,
|
|
420
|
+
metadata: "components/pricing/*",
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
id: "trim-page",
|
|
424
|
+
label: "Simplify page entry",
|
|
425
|
+
description: "Reduce the page to composition and imported data.",
|
|
426
|
+
type: "Verify",
|
|
427
|
+
status: "neutral",
|
|
428
|
+
metadata: "cleanup pending",
|
|
429
|
+
},
|
|
430
|
+
],
|
|
431
|
+
},
|
|
432
|
+
runConsole: {
|
|
433
|
+
window: {
|
|
434
|
+
key: "runConsole",
|
|
435
|
+
title: "Editor",
|
|
436
|
+
subtitle: "Component output",
|
|
437
|
+
status: { label: "Updating", tone: "info" },
|
|
438
|
+
},
|
|
439
|
+
title: "components/pricing/PricingTiers.tsx",
|
|
440
|
+
subtitle: "The diff updates as the extracted component takes shape.",
|
|
441
|
+
statusLabel: "Extracting components",
|
|
442
|
+
progressLabel: "3 files updated",
|
|
443
|
+
progressPercent: 59,
|
|
444
|
+
activeEntryId: "pricing-3",
|
|
445
|
+
editorTabLabel: "PricingTiers.tsx",
|
|
446
|
+
editorLanguage: "TSX",
|
|
447
|
+
editorSummary:
|
|
448
|
+
"Move repeated pricing JSX into a reusable tiers component.",
|
|
449
|
+
entries: [
|
|
450
|
+
{
|
|
451
|
+
id: "pricing-1",
|
|
452
|
+
message: "Found repeated tier markup and CTA footer",
|
|
453
|
+
timestamp: "11:11",
|
|
454
|
+
source: "agent",
|
|
455
|
+
status: "success",
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
id: "pricing-2",
|
|
459
|
+
message: "Created shared types for pricing data and features",
|
|
460
|
+
timestamp: "11:12",
|
|
461
|
+
source: "editor",
|
|
462
|
+
status: "success",
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
id: "pricing-3",
|
|
466
|
+
message: "Extracting PricingTiers component and props shape",
|
|
467
|
+
timestamp: "11:12",
|
|
468
|
+
source: "editor",
|
|
469
|
+
status: "info",
|
|
470
|
+
highlighted: true,
|
|
471
|
+
lineNumber: "18",
|
|
472
|
+
code: [
|
|
473
|
+
" export function PricingTiers({ plans }: PricingTiersProps) {",
|
|
474
|
+
"- return plans.map((plan) => (",
|
|
475
|
+
"+ return (",
|
|
476
|
+
"+ <div className='grid gap-6 lg:grid-cols-3'>",
|
|
477
|
+
"+ {plans.map((plan) => (",
|
|
478
|
+
" <PricingCard key={plan.name} plan={plan} />",
|
|
479
|
+
"+ ))}",
|
|
480
|
+
"+ </div>",
|
|
481
|
+
"- ))",
|
|
482
|
+
"+ )",
|
|
483
|
+
" }",
|
|
484
|
+
],
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
id: "pricing-4",
|
|
488
|
+
message: "Updating page.tsx to compose extracted sections",
|
|
489
|
+
timestamp: "11:13",
|
|
490
|
+
source: "editor",
|
|
491
|
+
status: "neutral",
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
metrics: [
|
|
495
|
+
{ id: "pm1", label: "Files", value: "4", tone: "success" },
|
|
496
|
+
{ id: "pm2", label: "Blocks", value: "3", tone: "info" },
|
|
497
|
+
{ id: "pm3", label: "Dupes", value: "-38%", tone: "success" },
|
|
498
|
+
],
|
|
499
|
+
highlights: [],
|
|
500
|
+
},
|
|
501
|
+
approvalInbox: {
|
|
502
|
+
window: {
|
|
503
|
+
key: "approvalInbox",
|
|
504
|
+
title: "Hidden",
|
|
505
|
+
},
|
|
506
|
+
items: [],
|
|
507
|
+
},
|
|
508
|
+
knowledgePanel: {
|
|
509
|
+
window: {
|
|
510
|
+
key: "knowledgePanel",
|
|
511
|
+
title: "Knowledge",
|
|
512
|
+
subtitle: "Preview",
|
|
513
|
+
status: { label: "Ready", tone: "success" },
|
|
514
|
+
},
|
|
515
|
+
title: "Component preview",
|
|
516
|
+
subtitle: "Show the extracted UI structure the agent is generating.",
|
|
517
|
+
query: "PricingTiers.tsx",
|
|
518
|
+
summary:
|
|
519
|
+
"The page is being reduced to reusable blocks with shared data and a slimmer entry point.",
|
|
520
|
+
snippets: [
|
|
521
|
+
{
|
|
522
|
+
id: "pricing-snippet",
|
|
523
|
+
title: "Extracted tier component",
|
|
524
|
+
excerptLabel: "Live component",
|
|
525
|
+
confidence: "3 components created",
|
|
526
|
+
highlighted: true,
|
|
527
|
+
content:
|
|
528
|
+
"export function PricingTiers({ plans }: PricingTiersProps) {\n return plans.map((plan) => <PricingCard key={plan.name} plan={plan} />)\n}",
|
|
529
|
+
tags: ["components", "refactor", "pricing"],
|
|
530
|
+
},
|
|
531
|
+
],
|
|
532
|
+
highlights: [
|
|
533
|
+
{ id: "pricing-snippet", label: "Generated UI", tone: "success" },
|
|
534
|
+
],
|
|
535
|
+
},
|
|
536
|
+
highlights: [
|
|
537
|
+
{ id: "create-blocks", label: "Active extraction", tone: "accent" },
|
|
538
|
+
{ id: "pricing-3", label: "Result updates", tone: "info" },
|
|
539
|
+
],
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
key: "ship-command-palette",
|
|
543
|
+
label: "Coding agent",
|
|
544
|
+
description:
|
|
545
|
+
"Choose a repo task and watch the agent inspect code, apply edits, and update the diff.",
|
|
546
|
+
activeWindow: "workflowStudio",
|
|
547
|
+
playback: {
|
|
548
|
+
workflowStudio: {
|
|
549
|
+
playbackStepDurationsMs: [760, 900, 1320, 1160, 920, 820, 1560],
|
|
550
|
+
playbackResetDelayMs: 2200,
|
|
551
|
+
},
|
|
552
|
+
runConsole: {
|
|
553
|
+
playbackStepDurationsMs: [1180, 1420, 940, 780, 700, 660, 1280],
|
|
554
|
+
playbackResetDelayMs: 2200,
|
|
555
|
+
playbackStepEntryIndices: [0, 0, 1, 1, 2, 2, 2, 3, 3],
|
|
556
|
+
playbackStepVisibleLineCounts: [2, 2, 3, 4, 6, 8, 10, 12, 12],
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
taskList: {
|
|
560
|
+
window: {
|
|
561
|
+
key: "taskList",
|
|
562
|
+
title: "Tasks",
|
|
563
|
+
subtitle: "Current workspace",
|
|
564
|
+
status: { label: "3 tasks", tone: "info" },
|
|
565
|
+
},
|
|
566
|
+
title: "Agent tasks",
|
|
567
|
+
subtitle: "Select a coding task to inspect and execute.",
|
|
568
|
+
activeItemId: "ship-command-palette",
|
|
569
|
+
items: [
|
|
570
|
+
{
|
|
571
|
+
id: "fix-auth-flow",
|
|
572
|
+
title: "Fix auth flow",
|
|
573
|
+
description: "Fix the post-login redirect after the OAuth callback.",
|
|
574
|
+
meta: "apps/web · active",
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
id: "refactor-pricing-page",
|
|
578
|
+
title: "Refactor pricing page",
|
|
579
|
+
description:
|
|
580
|
+
"Extract repeated pricing sections into reusable components.",
|
|
581
|
+
meta: "marketing site · queued",
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
id: "ship-command-palette",
|
|
585
|
+
title: "Ship command palette",
|
|
586
|
+
description: "Add global search, shortcuts, and action routing.",
|
|
587
|
+
meta: "dashboard · ready",
|
|
588
|
+
},
|
|
589
|
+
],
|
|
590
|
+
},
|
|
591
|
+
workflowStudio: {
|
|
592
|
+
window: {
|
|
593
|
+
key: "workflowStudio",
|
|
594
|
+
title: "Agent",
|
|
595
|
+
subtitle: "Active session",
|
|
596
|
+
status: { label: "Building", tone: "info" },
|
|
597
|
+
},
|
|
598
|
+
title: "Adding command palette",
|
|
599
|
+
subtitle: "The agent wires shortcuts and fast navigation into one flow.",
|
|
600
|
+
activeNodeId: "wire-shortcuts",
|
|
601
|
+
transcript: [
|
|
602
|
+
{ id: "cmd-title", kind: "title", text: "Ship command palette" },
|
|
603
|
+
{
|
|
604
|
+
id: "cmd-prompt",
|
|
605
|
+
kind: "prompt",
|
|
606
|
+
text: "Add a command palette with global shortcut support, grouped actions, and fast route switching.",
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
id: "cmd-read-1",
|
|
610
|
+
kind: "activity",
|
|
611
|
+
text: "Read app/dashboard/layout.tsx",
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
id: "cmd-file-1",
|
|
615
|
+
kind: "file",
|
|
616
|
+
path: "components/command-menu.tsx",
|
|
617
|
+
text: "components/command-menu.tsx",
|
|
618
|
+
added: 27,
|
|
619
|
+
removed: 4,
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
id: "cmd-file-2",
|
|
623
|
+
kind: "file",
|
|
624
|
+
path: "app/dashboard/layout.tsx",
|
|
625
|
+
text: "app/dashboard/layout.tsx",
|
|
626
|
+
added: 9,
|
|
627
|
+
removed: 1,
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
id: "cmd-run-1",
|
|
631
|
+
kind: "activity",
|
|
632
|
+
text: "Index route actions and quick commands so grouped search stays responsive",
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
id: "cmd-thought-1",
|
|
636
|
+
kind: "thought",
|
|
637
|
+
text: "The global shortcut should ignore focused text inputs and always remove its keydown listener on unmount.",
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
id: "cmd-message-1",
|
|
641
|
+
kind: "message",
|
|
642
|
+
text: "Palette now opens globally, keeps grouped actions discoverable, and routes immediately after a selection.",
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
id: "cmd-run-2",
|
|
646
|
+
kind: "activity",
|
|
647
|
+
text: "Validate keyboard open-close flow, route jumps, and the empty search state",
|
|
648
|
+
},
|
|
649
|
+
],
|
|
650
|
+
composer: {
|
|
651
|
+
placeholder: "Ask the agent to search, wire, or ship...",
|
|
652
|
+
modeLabel: "Agent",
|
|
653
|
+
modelLabel: "Sonnet",
|
|
654
|
+
},
|
|
655
|
+
highlights: [
|
|
656
|
+
{ id: "inspect-layout", label: "Inspect layout", tone: "info" },
|
|
657
|
+
{ id: "wire-shortcuts", label: "Add shortcuts", tone: "accent" },
|
|
658
|
+
],
|
|
659
|
+
nodes: [
|
|
660
|
+
{
|
|
661
|
+
id: "inspect-layout",
|
|
662
|
+
label: "Inspect app shell",
|
|
663
|
+
description:
|
|
664
|
+
"Find the dashboard layout, nav state, and modal primitives.",
|
|
665
|
+
type: "Read",
|
|
666
|
+
status: "success",
|
|
667
|
+
metadata: "dashboard shell",
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
id: "gather-actions",
|
|
671
|
+
label: "Collect command actions",
|
|
672
|
+
description: "Build a searchable list of routes and common actions.",
|
|
673
|
+
type: "Analyze",
|
|
674
|
+
status: "success",
|
|
675
|
+
metadata: "12 candidate commands",
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
id: "wire-shortcuts",
|
|
679
|
+
label: "Wire keyboard shortcuts",
|
|
680
|
+
type: "Edit",
|
|
681
|
+
status: "info",
|
|
682
|
+
active: true,
|
|
683
|
+
emphasized: true,
|
|
684
|
+
metadata: "keydown + dialog state",
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
id: "polish-results",
|
|
688
|
+
label: "Polish result list",
|
|
689
|
+
description:
|
|
690
|
+
"Add grouping, empty state, and active selection feedback.",
|
|
691
|
+
type: "Verify",
|
|
692
|
+
status: "neutral",
|
|
693
|
+
metadata: "UX pass next",
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
},
|
|
697
|
+
runConsole: {
|
|
698
|
+
window: {
|
|
699
|
+
key: "runConsole",
|
|
700
|
+
title: "Editor",
|
|
701
|
+
subtitle: "UI output",
|
|
702
|
+
status: { label: "Updating", tone: "info" },
|
|
703
|
+
},
|
|
704
|
+
title: "components/command-menu.tsx",
|
|
705
|
+
subtitle:
|
|
706
|
+
"The diff updates as the command palette is wired into the app shell.",
|
|
707
|
+
statusLabel: "Wiring command palette",
|
|
708
|
+
progressLabel: "8 commands indexed",
|
|
709
|
+
progressPercent: 73,
|
|
710
|
+
activeEntryId: "cmd-3",
|
|
711
|
+
editorTabLabel: "command-menu.tsx",
|
|
712
|
+
editorLanguage: "TSX",
|
|
713
|
+
editorSummary:
|
|
714
|
+
"Wire a global shortcut and searchable action list into the dashboard shell.",
|
|
715
|
+
entries: [
|
|
716
|
+
{
|
|
717
|
+
id: "cmd-1",
|
|
718
|
+
message: "Opened dialog primitive and dashboard nav state",
|
|
719
|
+
timestamp: "11:21",
|
|
720
|
+
source: "agent",
|
|
721
|
+
status: "success",
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
id: "cmd-2",
|
|
725
|
+
message: "Generated grouped command list and action search",
|
|
726
|
+
timestamp: "11:22",
|
|
727
|
+
source: "editor",
|
|
728
|
+
status: "success",
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
id: "cmd-3",
|
|
732
|
+
message: "Binding Cmd+K to open the command menu globally",
|
|
733
|
+
timestamp: "11:22",
|
|
734
|
+
source: "editor",
|
|
735
|
+
status: "info",
|
|
736
|
+
highlighted: true,
|
|
737
|
+
lineNumber: "27",
|
|
738
|
+
code: [
|
|
739
|
+
" useEffect(() => {",
|
|
740
|
+
"+ const handleKeyDown = (event: KeyboardEvent) => {",
|
|
741
|
+
"+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {",
|
|
742
|
+
"+ event.preventDefault()",
|
|
743
|
+
"+ setOpen((current) => !current)",
|
|
744
|
+
"+ }",
|
|
745
|
+
"+ }",
|
|
746
|
+
"- window.addEventListener('keydown', onKeyDown)",
|
|
747
|
+
"+ window.addEventListener('keydown', handleKeyDown)",
|
|
748
|
+
"- return () => window.removeEventListener('keydown', onKeyDown)",
|
|
749
|
+
"+ return () => window.removeEventListener('keydown', handleKeyDown)",
|
|
750
|
+
" }, [])",
|
|
751
|
+
],
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
id: "cmd-4",
|
|
755
|
+
message: "Validated route jump and quick action execution",
|
|
756
|
+
timestamp: "11:23",
|
|
757
|
+
source: "preview",
|
|
758
|
+
status: "neutral",
|
|
759
|
+
},
|
|
760
|
+
],
|
|
761
|
+
metrics: [
|
|
762
|
+
{ id: "cm1", label: "Commands", value: "8", tone: "info" },
|
|
763
|
+
{ id: "cm2", label: "Routes", value: "5", tone: "success" },
|
|
764
|
+
{ id: "cm3", label: "Shortcut", value: "Cmd+K", tone: "success" },
|
|
765
|
+
],
|
|
766
|
+
highlights: [],
|
|
767
|
+
},
|
|
768
|
+
approvalInbox: {
|
|
769
|
+
window: {
|
|
770
|
+
key: "approvalInbox",
|
|
771
|
+
title: "Hidden",
|
|
772
|
+
},
|
|
773
|
+
items: [],
|
|
774
|
+
},
|
|
775
|
+
knowledgePanel: {
|
|
776
|
+
window: {
|
|
777
|
+
key: "knowledgePanel",
|
|
778
|
+
title: "Knowledge",
|
|
779
|
+
subtitle: "Preview",
|
|
780
|
+
status: { label: "Ready", tone: "success" },
|
|
781
|
+
},
|
|
782
|
+
title: "Palette preview",
|
|
783
|
+
subtitle: "Show the agent's latest UI output for the command menu.",
|
|
784
|
+
query: "command-menu.tsx",
|
|
785
|
+
summary:
|
|
786
|
+
"A global command palette is being added with grouped actions, shortcut support, and instant route changes.",
|
|
787
|
+
snippets: [
|
|
788
|
+
{
|
|
789
|
+
id: "command-snippet",
|
|
790
|
+
title: "Command menu",
|
|
791
|
+
excerptLabel: "Live UI",
|
|
792
|
+
confidence: "8 commands wired",
|
|
793
|
+
highlighted: true,
|
|
794
|
+
content:
|
|
795
|
+
'<CommandDialog open={open} onOpenChange={setOpen}>\n <CommandInput placeholder="Search commands" />\n <CommandList>{groups.map(renderGroup)}</CommandList>\n</CommandDialog>',
|
|
796
|
+
tags: ["command palette", "ux", "keyboard"],
|
|
797
|
+
},
|
|
798
|
+
],
|
|
799
|
+
highlights: [
|
|
800
|
+
{ id: "command-snippet", label: "Generated UI", tone: "success" },
|
|
801
|
+
],
|
|
802
|
+
},
|
|
803
|
+
highlights: [
|
|
804
|
+
{ id: "wire-shortcuts", label: "Active build", tone: "accent" },
|
|
805
|
+
{ id: "cmd-3", label: "Result updates", tone: "info" },
|
|
806
|
+
],
|
|
807
|
+
},
|
|
808
|
+
];
|
|
809
|
+
|
|
810
|
+
export function Hero() {
|
|
811
|
+
return (
|
|
812
|
+
<div className="relative overflow-hidden">
|
|
813
|
+
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(180deg,#eef3f8_0%,#f6f8fb_48%,#eef3f8_100%)] dark:bg-[linear-gradient(180deg,#171717_0%,#121212_18%,#1d1d1d_46%,#131313_76%,#1b1b1b_100%)]" />
|
|
814
|
+
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(112deg,transparent_18%,rgba(255,255,255,0.18)_28%,rgba(255,255,255,0.05)_37%,transparent_50%),linear-gradient(248deg,transparent_22%,rgba(255,255,255,0.14)_31%,rgba(255,255,255,0.04)_41%,transparent_56%)] opacity-70 dark:opacity-100" />
|
|
815
|
+
<div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(255,255,255,0.12),transparent_34%)] opacity-70 dark:opacity-100" />
|
|
816
|
+
<div className="pointer-events-none absolute left-1/2 top-[26rem] h-[32rem] w-[62rem] -translate-x-1/2 rounded-full bg-[radial-gradient(circle_at_center,rgba(255,255,255,0.22)_0%,rgba(255,255,255,0.12)_12%,rgba(255,255,255,0.06)_24%,transparent_66%)] blur-3xl opacity-85 dark:opacity-100" />
|
|
817
|
+
|
|
818
|
+
<HeroProductDemo
|
|
819
|
+
className="bg-transparent"
|
|
820
|
+
heading={{
|
|
821
|
+
text: "Code with agents.",
|
|
822
|
+
className:
|
|
823
|
+
"max-w-4xl text-left font-outfit text-3xl font-semibold leading-none tracking-tight text-[var(--heading-fg)] sm:text-4xl lg:text-5xl",
|
|
824
|
+
}}
|
|
825
|
+
subheading={{
|
|
826
|
+
text: "Watch the agent read, edit, and update the result in real time.",
|
|
827
|
+
className:
|
|
828
|
+
"mt-3 max-w-2xl text-left font-inter text-sm leading-6 text-[var(--subheading-fg)] sm:text-base",
|
|
829
|
+
}}
|
|
830
|
+
cta1={{
|
|
831
|
+
label: "Start building",
|
|
832
|
+
href: "#contact",
|
|
833
|
+
variant: "default",
|
|
834
|
+
size: "lg",
|
|
835
|
+
className: [
|
|
836
|
+
"px-7 py-3 text-sm font-semibold shadow-lg shadow-black/10 dark:shadow-black/30",
|
|
837
|
+
"[--btn-bg:var(--hero-cta-primary-bg)]",
|
|
838
|
+
"hover:[--btn-hover-bg:var(--hero-cta-primary-hover-bg)]",
|
|
839
|
+
"[--btn-fg:var(--hero-cta-primary-fg)]",
|
|
840
|
+
"hover:[--btn-hover-fg:var(--hero-cta-primary-hover-fg)]",
|
|
841
|
+
].join(" "),
|
|
842
|
+
}}
|
|
843
|
+
cta2={{
|
|
844
|
+
label: "View features",
|
|
845
|
+
href: "#features",
|
|
846
|
+
variant: "outline",
|
|
847
|
+
size: "lg",
|
|
848
|
+
className: [
|
|
849
|
+
"border px-7 py-3 text-sm font-semibold shadow-sm dark:shadow-black/20",
|
|
850
|
+
"[--btn-bg:var(--hero-cta-secondary-bg)]",
|
|
851
|
+
"[--btn-fg:var(--hero-cta-secondary-fg)]",
|
|
852
|
+
"[--btn-border:var(--hero-cta-secondary-border)]",
|
|
853
|
+
"hover:[--btn-hover-bg:var(--hero-cta-secondary-hover-bg)]",
|
|
854
|
+
"hover:[--btn-hover-fg:var(--hero-cta-secondary-hover-fg)]",
|
|
855
|
+
].join(" "),
|
|
856
|
+
}}
|
|
857
|
+
stage={{
|
|
858
|
+
scenarios,
|
|
859
|
+
initialScenarioIndex: 0,
|
|
860
|
+
className: "mt-0",
|
|
861
|
+
}}
|
|
862
|
+
section={{
|
|
863
|
+
className: "px-6 py-10 sm:px-8 lg:px-10 lg:py-12",
|
|
864
|
+
}}
|
|
865
|
+
container={{
|
|
866
|
+
className: "relative z-10 max-w-7xl",
|
|
867
|
+
}}
|
|
868
|
+
textContainer={{
|
|
869
|
+
className: "max-w-3xl pt-1 lg:pl-4 lg:pt-0",
|
|
870
|
+
}}
|
|
871
|
+
demoContainer={{
|
|
872
|
+
className:
|
|
873
|
+
"relative min-h-[32rem] w-full max-w-full lg:px-4 lg:h-[clamp(30rem,calc(100svh-7rem),42rem)] lg:min-h-0",
|
|
874
|
+
}}
|
|
875
|
+
buttonsContainer={{
|
|
876
|
+
className: "mt-4 flex-col items-start sm:flex-row sm:items-center",
|
|
877
|
+
}}
|
|
878
|
+
demoBelowText
|
|
879
|
+
ariaLabel="AI coding agent hero section"
|
|
880
|
+
/>
|
|
881
|
+
</div>
|
|
882
|
+
);
|
|
883
|
+
}
|