create-walle 0.9.21 → 0.9.22

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 (52) hide show
  1. package/README.md +5 -5
  2. package/package.json +2 -2
  3. package/template/claude-task-manager/api-prompts.js +13 -0
  4. package/template/claude-task-manager/api-reviews.js +5 -2
  5. package/template/claude-task-manager/db.js +348 -15
  6. package/template/claude-task-manager/docs/app-update-refresh-protocol.md +69 -0
  7. package/template/claude-task-manager/docs/image-paste-ux.md +3 -0
  8. package/template/claude-task-manager/docs/ipad-web-preview.md +88 -0
  9. package/template/claude-task-manager/git-utils.js +146 -17
  10. package/template/claude-task-manager/lib/auth-rate-limit.js +23 -3
  11. package/template/claude-task-manager/lib/auth-rules.js +3 -0
  12. package/template/claude-task-manager/lib/document-review.js +33 -2
  13. package/template/claude-task-manager/lib/microsoft-dev-tunnel-setup.js +83 -0
  14. package/template/claude-task-manager/lib/mobile-auth-api.js +14 -0
  15. package/template/claude-task-manager/lib/restart-guard.js +68 -0
  16. package/template/claude-task-manager/lib/session-standup.js +36 -13
  17. package/template/claude-task-manager/lib/session-stream.js +11 -4
  18. package/template/claude-task-manager/lib/transport-security.js +50 -0
  19. package/template/claude-task-manager/lib/walle-transcript.js +16 -0
  20. package/template/claude-task-manager/lib/worktree-active-sync.js +6 -3
  21. package/template/claude-task-manager/public/css/reviews.css +10 -0
  22. package/template/claude-task-manager/public/css/setup.css +13 -0
  23. package/template/claude-task-manager/public/css/walle.css +145 -0
  24. package/template/claude-task-manager/public/index.html +539 -44
  25. package/template/claude-task-manager/public/ipad.html +363 -0
  26. package/template/claude-task-manager/public/js/document-review-links.js +196 -0
  27. package/template/claude-task-manager/public/js/message-renderer.js +14 -3
  28. package/template/claude-task-manager/public/js/reviews.js +30 -6
  29. package/template/claude-task-manager/public/js/setup.js +42 -2
  30. package/template/claude-task-manager/public/js/stream-view.js +20 -1
  31. package/template/claude-task-manager/public/js/walle.js +314 -18
  32. package/template/claude-task-manager/public/m/app.css +789 -11
  33. package/template/claude-task-manager/public/m/app.js +1070 -67
  34. package/template/claude-task-manager/public/m/claim.html +9 -2
  35. package/template/claude-task-manager/public/m/index.html +17 -10
  36. package/template/claude-task-manager/public/m/sw.js +1 -1
  37. package/template/claude-task-manager/server.js +365 -95
  38. package/template/claude-task-manager/session-integrity.js +4 -0
  39. package/template/docs/designs/2026-05-17-portkey-gateway-provider-ux.md +86 -35
  40. package/template/package.json +1 -1
  41. package/template/wall-e/api-walle.js +19 -1
  42. package/template/wall-e/brain.js +152 -6
  43. package/template/wall-e/chat.js +85 -0
  44. package/template/wall-e/coding-orchestrator.js +106 -12
  45. package/template/wall-e/http/model-admin.js +131 -0
  46. package/template/wall-e/lib/service-health.js +194 -0
  47. package/template/wall-e/llm/anthropic.js +7 -0
  48. package/template/wall-e/llm/client.js +46 -12
  49. package/template/wall-e/llm/openai.js +17 -2
  50. package/template/wall-e/llm/portkey-sync.js +201 -0
  51. package/template/wall-e/server.js +13 -0
  52. package/template/website/index.html +10 -10
@@ -3,7 +3,9 @@ html[data-theme="dark"] {
3
3
  color-scheme: dark;
4
4
  --bg: #101419;
5
5
  --bg-elev: #151b22;
6
+ --bg-elev-2: #111820;
6
7
  --bg-soft: #1d252d;
8
+ --panel: #151b22;
7
9
  --line: #33404d;
8
10
  --line-strong: #4b5a67;
9
11
  --fg: #edf2f7;
@@ -21,7 +23,9 @@ html[data-theme="light"] {
21
23
  color-scheme: light;
22
24
  --bg: #f6f7f9;
23
25
  --bg-elev: #ffffff;
26
+ --bg-elev-2: #f8fafc;
24
27
  --bg-soft: #eceef2;
28
+ --panel: #ffffff;
25
29
  --line: rgba(15,23,42,0.10);
26
30
  --line-strong: rgba(15,23,42,0.18);
27
31
  --fg: #0f172a;
@@ -130,6 +134,56 @@ body.detail-sheet-open .app-topbar {
130
134
  backdrop-filter: blur(12px);
131
135
  }
132
136
 
137
+ .app-reload-banner {
138
+ position: fixed;
139
+ top: calc(env(safe-area-inset-top) + 72px);
140
+ left: 10px;
141
+ right: 10px;
142
+ z-index: 80;
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 12px;
146
+ padding: 10px 14px;
147
+ border: 1px solid var(--line-strong);
148
+ border-radius: 12px;
149
+ background: color-mix(in srgb, var(--amber) 14%, var(--bg-elev));
150
+ color: var(--fg);
151
+ box-shadow: 0 10px 30px rgba(0,0,0,0.28);
152
+ }
153
+
154
+ .app-reload-banner[hidden] {
155
+ display: none;
156
+ }
157
+
158
+ .app-reload-banner div {
159
+ flex: 1 1 auto;
160
+ min-width: 0;
161
+ }
162
+
163
+ .app-reload-banner strong {
164
+ display: block;
165
+ font-size: 13px;
166
+ line-height: 1.2;
167
+ }
168
+
169
+ .app-reload-banner span {
170
+ display: block;
171
+ margin-top: 2px;
172
+ color: var(--fg-dim);
173
+ font-size: 12px;
174
+ line-height: 1.3;
175
+ }
176
+
177
+ .app-reload-banner button {
178
+ min-height: 36px;
179
+ padding: 0 12px;
180
+ border: 1px solid var(--line-strong);
181
+ border-radius: 999px;
182
+ background: var(--blue);
183
+ color: #fff;
184
+ font-weight: 800;
185
+ }
186
+
133
187
  .app-kicker {
134
188
  color: var(--fg-muted);
135
189
  font-size: 11px;
@@ -307,6 +361,122 @@ h3 {
307
361
  border-color: rgba(113, 167, 255, 0.4);
308
362
  }
309
363
 
364
+ .worktree-summary {
365
+ margin: 4px 0 8px;
366
+ padding: 10px 16px 8px;
367
+ border-top: 1px solid var(--line);
368
+ border-bottom: 1px solid var(--line);
369
+ background: color-mix(in srgb, var(--bg-elev) 70%, transparent);
370
+ }
371
+
372
+ .worktree-summary-head {
373
+ display: flex;
374
+ align-items: flex-end;
375
+ justify-content: space-between;
376
+ gap: 12px;
377
+ margin-bottom: 6px;
378
+ }
379
+
380
+ .worktree-summary-head > span:first-child {
381
+ min-width: 0;
382
+ }
383
+
384
+ .worktree-summary-kicker {
385
+ display: block;
386
+ color: var(--fg-muted);
387
+ font-size: 10px;
388
+ font-weight: 900;
389
+ line-height: 1.1;
390
+ text-transform: uppercase;
391
+ }
392
+
393
+ .worktree-summary-head strong {
394
+ display: block;
395
+ margin-top: 2px;
396
+ color: var(--fg);
397
+ font-size: 14px;
398
+ line-height: 1.15;
399
+ }
400
+
401
+ .worktree-summary-stats,
402
+ .worktree-summary-more {
403
+ color: var(--fg-dim);
404
+ font-size: 11px;
405
+ font-weight: 800;
406
+ line-height: 1.2;
407
+ white-space: nowrap;
408
+ }
409
+
410
+ .worktree-summary-list {
411
+ display: grid;
412
+ }
413
+
414
+ .worktree-summary-row {
415
+ appearance: none;
416
+ display: grid;
417
+ grid-template-columns: minmax(0, 1fr) auto;
418
+ align-items: center;
419
+ gap: 10px;
420
+ width: 100%;
421
+ min-height: 48px;
422
+ padding: 9px 0;
423
+ border: 0;
424
+ border-top: 1px solid rgba(120, 135, 180, 0.16);
425
+ background: transparent;
426
+ color: inherit;
427
+ text-align: left;
428
+ cursor: pointer;
429
+ touch-action: manipulation;
430
+ }
431
+
432
+ .worktree-summary-row:first-child {
433
+ border-top: 0;
434
+ }
435
+
436
+ .worktree-summary-row:active {
437
+ background: color-mix(in srgb, var(--blue) 8%, transparent);
438
+ }
439
+
440
+ .worktree-summary-copy {
441
+ display: grid;
442
+ gap: 3px;
443
+ min-width: 0;
444
+ }
445
+
446
+ .worktree-summary-title {
447
+ min-width: 0;
448
+ color: var(--fg);
449
+ font-size: 13px;
450
+ font-weight: 900;
451
+ line-height: 1.2;
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
454
+ white-space: nowrap;
455
+ }
456
+
457
+ .worktree-summary-row.main .worktree-summary-title {
458
+ color: #f6c177;
459
+ }
460
+
461
+ .worktree-summary-meta {
462
+ min-width: 0;
463
+ color: var(--fg-dim);
464
+ font-size: 11px;
465
+ line-height: 1.25;
466
+ overflow: hidden;
467
+ text-overflow: ellipsis;
468
+ white-space: nowrap;
469
+ }
470
+
471
+ .worktree-summary-row .session-diff-tags {
472
+ justify-content: flex-end;
473
+ margin-top: 0;
474
+ }
475
+
476
+ .worktree-summary-more {
477
+ padding-top: 5px;
478
+ }
479
+
310
480
  .home-search {
311
481
  display: grid;
312
482
  gap: 6px;
@@ -659,6 +829,16 @@ h3 {
659
829
  }
660
830
 
661
831
  @media (max-width: 380px) {
832
+ .worktree-summary-row {
833
+ grid-template-columns: 1fr;
834
+ gap: 6px;
835
+ align-items: start;
836
+ }
837
+
838
+ .worktree-summary-row .session-diff-tags {
839
+ justify-content: flex-start;
840
+ }
841
+
662
842
  .session-diff-tags {
663
843
  gap: 5px;
664
844
  }
@@ -1153,6 +1333,7 @@ html[data-theme="light"] .nav-item.active {
1153
1333
  cursor: text;
1154
1334
  user-select: text;
1155
1335
  -webkit-user-select: text;
1336
+ -webkit-touch-callout: default;
1156
1337
  }
1157
1338
 
1158
1339
  .detail-messages .prompt-turn-header .prompt-turn-meta,
@@ -2404,6 +2585,44 @@ html[data-theme="light"] .nav-item.active {
2404
2585
  color: var(--red);
2405
2586
  }
2406
2587
 
2588
+ .send-menu-model {
2589
+ grid-column: 1 / -1;
2590
+ display: grid;
2591
+ grid-template-columns: auto minmax(0, 1fr);
2592
+ align-items: center;
2593
+ gap: 10px;
2594
+ min-height: 54px;
2595
+ color: var(--blue);
2596
+ text-align: left;
2597
+ }
2598
+
2599
+ .send-menu-model[hidden] {
2600
+ display: none;
2601
+ }
2602
+
2603
+ .send-menu-item-kicker,
2604
+ .send-menu-item-main {
2605
+ display: block;
2606
+ min-width: 0;
2607
+ overflow: hidden;
2608
+ text-overflow: ellipsis;
2609
+ white-space: nowrap;
2610
+ }
2611
+
2612
+ .send-menu-item-kicker {
2613
+ color: var(--fg-dim);
2614
+ font-size: 10px;
2615
+ font-weight: 950;
2616
+ letter-spacing: 0;
2617
+ text-transform: uppercase;
2618
+ }
2619
+
2620
+ .send-menu-item-main {
2621
+ color: var(--blue);
2622
+ font-size: 14px;
2623
+ font-weight: 950;
2624
+ }
2625
+
2407
2626
  .send-menu-item[data-send-menu-attach] {
2408
2627
  color: var(--blue);
2409
2628
  }
@@ -2650,6 +2869,11 @@ html[data-theme="light"] .nav-item.active {
2650
2869
  min-width: 0;
2651
2870
  }
2652
2871
 
2872
+ .more-row > div,
2873
+ .more-row > span {
2874
+ min-width: 0;
2875
+ }
2876
+
2653
2877
  .more-action-row {
2654
2878
  align-items: center;
2655
2879
  gap: 14px;
@@ -2947,6 +3171,240 @@ html[data-theme="light"] .nav-item.active {
2947
3171
  padding-bottom: 14px;
2948
3172
  }
2949
3173
 
3174
+ .mobile-health-card {
3175
+ margin: 10px 12px 0;
3176
+ border: 1px solid color-mix(in srgb, var(--blue) 26%, var(--line));
3177
+ border-radius: 10px;
3178
+ background: color-mix(in srgb, var(--bg-elev) 88%, var(--blue) 6%);
3179
+ overflow: hidden;
3180
+ }
3181
+
3182
+ .mobile-health-card.error {
3183
+ border-color: color-mix(in srgb, var(--red) 44%, var(--line));
3184
+ background: color-mix(in srgb, var(--bg-elev) 90%, var(--red) 7%);
3185
+ }
3186
+
3187
+ .mobile-health-card.warning {
3188
+ border-color: color-mix(in srgb, var(--amber) 42%, var(--line));
3189
+ background: color-mix(in srgb, var(--bg-elev) 90%, var(--amber) 7%);
3190
+ }
3191
+
3192
+ .mobile-health-header {
3193
+ display: grid;
3194
+ grid-template-columns: 10px minmax(0, 1fr);
3195
+ gap: 10px;
3196
+ padding: 12px;
3197
+ }
3198
+
3199
+ .mobile-health-dot {
3200
+ width: 8px;
3201
+ height: 8px;
3202
+ margin-top: 6px;
3203
+ border-radius: 999px;
3204
+ background: var(--green);
3205
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--green) 14%, transparent);
3206
+ }
3207
+
3208
+ .mobile-health-card.error .mobile-health-dot {
3209
+ background: var(--red);
3210
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--red) 14%, transparent);
3211
+ }
3212
+
3213
+ .mobile-health-card.warning .mobile-health-dot {
3214
+ background: var(--amber);
3215
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--amber) 16%, transparent);
3216
+ }
3217
+
3218
+ .mobile-health-kicker {
3219
+ color: var(--fg-muted);
3220
+ font-size: 11px;
3221
+ font-weight: 900;
3222
+ letter-spacing: 0;
3223
+ text-transform: uppercase;
3224
+ }
3225
+
3226
+ .mobile-health-copy h3 {
3227
+ margin: 2px 0 0;
3228
+ color: var(--fg);
3229
+ font-size: 14px;
3230
+ line-height: 1.25;
3231
+ }
3232
+
3233
+ .mobile-health-copy p {
3234
+ margin: 4px 0 0;
3235
+ color: var(--fg-dim);
3236
+ font-size: 12px;
3237
+ line-height: 1.42;
3238
+ }
3239
+
3240
+ .mobile-health-meta,
3241
+ .mobile-health-current-meta,
3242
+ .mobile-health-more {
3243
+ margin-top: 6px;
3244
+ color: var(--fg-muted);
3245
+ font-size: 11px;
3246
+ font-weight: 800;
3247
+ line-height: 1.3;
3248
+ }
3249
+
3250
+ .mobile-health-current {
3251
+ margin: 0 12px 12px;
3252
+ padding: 10px;
3253
+ border: 1px solid color-mix(in srgb, var(--red) 32%, var(--line));
3254
+ border-radius: 9px;
3255
+ background: color-mix(in srgb, var(--bg) 62%, transparent);
3256
+ }
3257
+
3258
+ .mobile-health-actions {
3259
+ display: grid;
3260
+ grid-template-columns: minmax(0, 1fr) auto auto;
3261
+ gap: 8px;
3262
+ margin-top: 10px;
3263
+ align-items: center;
3264
+ }
3265
+
3266
+ .mobile-health-btn,
3267
+ .mobile-health-icon-btn {
3268
+ min-height: 40px;
3269
+ border: 1px solid var(--line);
3270
+ border-radius: 8px;
3271
+ background: var(--bg-soft);
3272
+ color: var(--fg);
3273
+ font-size: 12px;
3274
+ font-weight: 900;
3275
+ text-decoration: none;
3276
+ }
3277
+
3278
+ .mobile-health-btn {
3279
+ display: inline-flex;
3280
+ align-items: center;
3281
+ justify-content: center;
3282
+ padding: 0 12px;
3283
+ }
3284
+
3285
+ .mobile-health-btn.primary {
3286
+ border-color: color-mix(in srgb, var(--blue) 42%, var(--line));
3287
+ background: var(--blue);
3288
+ color: #07111f;
3289
+ }
3290
+
3291
+ .mobile-health-icon-btn {
3292
+ width: 40px;
3293
+ min-width: 40px;
3294
+ padding: 0;
3295
+ color: var(--fg-dim);
3296
+ font-size: 20px;
3297
+ }
3298
+
3299
+ .mobile-health-test {
3300
+ margin: 0 12px 12px;
3301
+ padding: 8px 10px;
3302
+ border: 1px solid color-mix(in srgb, var(--green) 34%, var(--line));
3303
+ border-radius: 8px;
3304
+ color: var(--fg);
3305
+ font-size: 12px;
3306
+ font-weight: 800;
3307
+ }
3308
+
3309
+ .mobile-health-test.error {
3310
+ border-color: color-mix(in srgb, var(--red) 40%, var(--line));
3311
+ }
3312
+
3313
+ .mobile-health-group {
3314
+ border-top: 1px solid var(--line);
3315
+ }
3316
+
3317
+ .mobile-health-group summary {
3318
+ display: flex;
3319
+ align-items: center;
3320
+ justify-content: space-between;
3321
+ gap: 10px;
3322
+ min-height: 42px;
3323
+ padding: 0 12px;
3324
+ color: var(--fg);
3325
+ font-size: 12px;
3326
+ font-weight: 900;
3327
+ list-style: none;
3328
+ }
3329
+
3330
+ .mobile-health-group summary::-webkit-details-marker {
3331
+ display: none;
3332
+ }
3333
+
3334
+ .mobile-health-group summary span {
3335
+ min-width: 0;
3336
+ }
3337
+
3338
+ .mobile-health-group summary strong {
3339
+ display: inline-grid;
3340
+ min-width: 22px;
3341
+ height: 22px;
3342
+ place-items: center;
3343
+ border: 1px solid var(--line);
3344
+ border-radius: 999px;
3345
+ color: var(--fg-dim);
3346
+ font-size: 11px;
3347
+ }
3348
+
3349
+ .mobile-health-group-body {
3350
+ display: grid;
3351
+ gap: 6px;
3352
+ padding: 0 12px 12px;
3353
+ }
3354
+
3355
+ .mobile-health-row {
3356
+ display: grid;
3357
+ grid-template-columns: 8px minmax(0, 1fr) auto;
3358
+ gap: 8px;
3359
+ align-items: start;
3360
+ color: var(--fg-dim);
3361
+ font-size: 12px;
3362
+ line-height: 1.35;
3363
+ }
3364
+
3365
+ .mobile-health-row-dot {
3366
+ width: 5px;
3367
+ height: 5px;
3368
+ margin-top: 6px;
3369
+ border-radius: 999px;
3370
+ background: var(--fg-muted);
3371
+ }
3372
+
3373
+ .mobile-health-row-copy {
3374
+ overflow-wrap: anywhere;
3375
+ }
3376
+
3377
+ .mobile-health-row-action {
3378
+ min-height: 30px;
3379
+ padding: 0 10px;
3380
+ border: 1px solid color-mix(in srgb, var(--blue) 32%, var(--line));
3381
+ border-radius: 7px;
3382
+ background: color-mix(in srgb, var(--blue) 14%, var(--bg-soft));
3383
+ color: var(--fg);
3384
+ font-size: 11px;
3385
+ font-weight: 900;
3386
+ text-decoration: none;
3387
+ white-space: nowrap;
3388
+ }
3389
+
3390
+ a.mobile-health-row-action {
3391
+ display: inline-flex;
3392
+ align-items: center;
3393
+ justify-content: center;
3394
+ }
3395
+
3396
+ .mobile-health-footer {
3397
+ padding: 10px 12px 12px;
3398
+ border-top: 1px solid var(--line);
3399
+ }
3400
+
3401
+ .mobile-health-link {
3402
+ color: var(--blue);
3403
+ font-size: 12px;
3404
+ font-weight: 900;
3405
+ text-decoration: none;
3406
+ }
3407
+
2950
3408
  .walle-chat-composer {
2951
3409
  position: sticky;
2952
3410
  bottom: calc(var(--nav-h) + env(safe-area-inset-bottom));
@@ -3020,15 +3478,31 @@ html[data-theme="light"] .nav-item.active {
3020
3478
 
3021
3479
  .walle-empty-chat {
3022
3480
  display: grid;
3023
- gap: 6px;
3024
- padding: 42px 20px;
3481
+ justify-items: center;
3482
+ gap: 10px;
3483
+ max-width: 380px;
3484
+ margin: 0 auto;
3485
+ padding: 56px 22px;
3025
3486
  text-align: center;
3026
3487
  }
3027
3488
 
3489
+ .walle-empty-icon {
3490
+ display: inline-grid;
3491
+ place-items: center;
3492
+ width: 48px;
3493
+ height: 48px;
3494
+ border: 1px solid color-mix(in srgb, var(--blue) 36%, var(--line));
3495
+ border-radius: 12px;
3496
+ background: color-mix(in srgb, var(--blue) 12%, var(--bg-soft));
3497
+ color: var(--blue);
3498
+ font-size: 16px;
3499
+ }
3500
+
3028
3501
  .walle-empty-chat h3 {
3029
3502
  margin: 0;
3030
3503
  color: var(--fg);
3031
- font-size: 18px;
3504
+ font-size: 19px;
3505
+ line-height: 1.2;
3032
3506
  }
3033
3507
 
3034
3508
  .walle-empty-chat p {
@@ -3038,6 +3512,17 @@ html[data-theme="light"] .nav-item.active {
3038
3512
  line-height: 1.4;
3039
3513
  }
3040
3514
 
3515
+ .walle-empty-actions {
3516
+ width: min(100%, 240px);
3517
+ padding-top: 8px;
3518
+ }
3519
+
3520
+ .walle-empty-note {
3521
+ padding: 0 8px;
3522
+ color: var(--fg-muted);
3523
+ font-size: 12px;
3524
+ }
3525
+
3041
3526
  .modal-backdrop {
3042
3527
  position: fixed;
3043
3528
  inset: 0;
@@ -3300,43 +3785,336 @@ html[data-theme="light"] .nav-item.active {
3300
3785
  color: var(--red);
3301
3786
  }
3302
3787
 
3303
- @media (min-width: 720px) {
3788
+ @media (min-width: 720px) and (max-width: 899.98px) {
3304
3789
  .mobile-app {
3305
- max-width: 520px;
3790
+ max-width: min(680px, 100vw);
3306
3791
  margin: 0 auto;
3307
3792
  border-left: 1px solid var(--line);
3308
3793
  border-right: 1px solid var(--line);
3309
3794
  }
3310
3795
 
3311
- .bottom-nav,
3312
3796
  .app-topbar,
3313
3797
  .detail-topbar {
3798
+ left: auto;
3799
+ right: auto;
3800
+ width: auto;
3801
+ transform: none;
3802
+ }
3803
+
3804
+ .bottom-nav {
3314
3805
  left: 50%;
3315
3806
  right: auto;
3316
- width: 520px;
3807
+ width: min(680px, 100vw);
3317
3808
  transform: translateX(-50%);
3318
3809
  }
3319
3810
 
3811
+ .status-summary {
3812
+ gap: 10px;
3813
+ }
3814
+
3815
+ .session-row,
3816
+ .result-row,
3817
+ .device-row,
3818
+ .walle-row,
3819
+ .more-row {
3820
+ padding-inline: 20px;
3821
+ }
3822
+
3823
+ .section-block,
3824
+ .home-search,
3825
+ .worktree-summary,
3826
+ .view-heading {
3827
+ padding-inline: 20px;
3828
+ }
3829
+
3320
3830
  .detail-view {
3321
3831
  left: 50%;
3322
3832
  right: auto;
3323
- width: 520px;
3833
+ width: min(680px, 100vw);
3324
3834
  transform: translateX(-50%);
3325
3835
  border-left: 1px solid var(--line);
3326
3836
  border-right: 1px solid var(--line);
3327
3837
  }
3328
3838
 
3839
+ .detail-messages {
3840
+ padding-inline: 18px;
3841
+ }
3842
+
3329
3843
  .modal-backdrop {
3330
3844
  justify-content: center;
3331
3845
  }
3332
3846
 
3333
- .stepup-sheet {
3334
- width: 520px;
3847
+ .stepup-sheet,
3848
+ .model-picker-sheet {
3849
+ width: min(640px, calc(100vw - 32px));
3335
3850
  }
3336
3851
 
3337
3852
  .model-picker-sheet {
3338
- width: 520px;
3339
3853
  border-left: 1px solid var(--line);
3340
3854
  border-right: 1px solid var(--line);
3341
3855
  }
3342
3856
  }
3857
+
3858
+ @media (min-width: 900px) and (min-height: 650px) {
3859
+ :root {
3860
+ --tablet-list-w: clamp(372px, 37vw, 468px);
3861
+ --tablet-single-w: min(680px, 100vw);
3862
+ --tablet-topbar-h: 72px;
3863
+ }
3864
+
3865
+ html {
3866
+ height: 100%;
3867
+ overflow: hidden;
3868
+ background:
3869
+ linear-gradient(90deg, var(--bg) 0, var(--bg) var(--tablet-list-w), color-mix(in srgb, var(--bg-elev) 72%, var(--bg)) var(--tablet-list-w), var(--bg) 100%);
3870
+ }
3871
+
3872
+ html:not(.detail-open) {
3873
+ background: var(--bg);
3874
+ }
3875
+
3876
+ body.mobile-app {
3877
+ width: 100%;
3878
+ max-width: none;
3879
+ min-height: 100vh;
3880
+ min-height: 100dvh;
3881
+ margin: 0;
3882
+ padding: 0;
3883
+ border: 0;
3884
+ overflow: hidden;
3885
+ }
3886
+
3887
+ body.detail-sheet-open {
3888
+ position: static !important;
3889
+ top: auto !important;
3890
+ left: auto !important;
3891
+ right: auto !important;
3892
+ width: 100% !important;
3893
+ }
3894
+
3895
+ body.detail-sheet-open .app-main,
3896
+ body.detail-sheet-open .bottom-nav,
3897
+ body.detail-sheet-open .app-topbar {
3898
+ pointer-events: auto;
3899
+ user-select: auto;
3900
+ }
3901
+
3902
+ .app-topbar {
3903
+ position: fixed;
3904
+ top: 0;
3905
+ left: 0;
3906
+ right: auto;
3907
+ width: var(--tablet-list-w);
3908
+ min-height: calc(var(--tablet-topbar-h) + env(safe-area-inset-top));
3909
+ padding: calc(12px + env(safe-area-inset-top)) 18px 12px;
3910
+ border-right: 1px solid var(--line);
3911
+ border-bottom: 1px solid var(--line);
3912
+ transform: none;
3913
+ }
3914
+
3915
+ body.mobile-app:not(.detail-open) .app-topbar {
3916
+ left: 50%;
3917
+ width: var(--tablet-single-w);
3918
+ border-left: 1px solid var(--line);
3919
+ transform: translateX(-50%);
3920
+ }
3921
+
3922
+ .app-main {
3923
+ position: fixed;
3924
+ top: calc(var(--tablet-topbar-h) + env(safe-area-inset-top));
3925
+ left: 0;
3926
+ bottom: calc(var(--nav-h) + env(safe-area-inset-bottom));
3927
+ width: var(--tablet-list-w);
3928
+ min-height: 0;
3929
+ overflow: auto;
3930
+ border-right: 1px solid var(--line);
3931
+ -webkit-overflow-scrolling: touch;
3932
+ }
3933
+
3934
+ body.mobile-app:not(.detail-open) .app-main {
3935
+ left: 50%;
3936
+ width: var(--tablet-single-w);
3937
+ border-left: 1px solid var(--line);
3938
+ transform: translateX(-50%);
3939
+ }
3940
+
3941
+ .mobile-view {
3942
+ padding: 16px 0 22px;
3943
+ }
3944
+
3945
+ .status-summary {
3946
+ gap: 10px;
3947
+ padding: 14px 18px 8px;
3948
+ }
3949
+
3950
+ .summary-tile {
3951
+ min-height: 76px;
3952
+ }
3953
+
3954
+ .home-search,
3955
+ .view-heading,
3956
+ .worktree-summary,
3957
+ .section-block {
3958
+ padding-inline: 18px;
3959
+ }
3960
+
3961
+ .session-row,
3962
+ .result-row,
3963
+ .device-row {
3964
+ grid-template-columns: 8px minmax(0, 1fr);
3965
+ padding: 14px 18px;
3966
+ }
3967
+
3968
+ .walle-row,
3969
+ .more-row {
3970
+ grid-template-columns: minmax(0, 1fr) auto;
3971
+ padding: 14px 18px;
3972
+ }
3973
+
3974
+ .push-row,
3975
+ .restart-row {
3976
+ grid-template-columns: minmax(0, 1fr);
3977
+ }
3978
+
3979
+ .session-row.selected,
3980
+ .result-row.selected {
3981
+ background:
3982
+ linear-gradient(90deg, color-mix(in srgb, var(--blue) 13%, transparent), transparent 54%),
3983
+ var(--bg-elev);
3984
+ box-shadow:
3985
+ inset 0 0 0 1px color-mix(in srgb, var(--blue) 28%, transparent),
3986
+ inset 4px 0 0 var(--blue);
3987
+ }
3988
+
3989
+ .row-actions {
3990
+ grid-column: 2;
3991
+ flex-direction: row;
3992
+ align-items: center;
3993
+ margin-top: 10px;
3994
+ }
3995
+
3996
+ .row-action {
3997
+ min-height: 34px;
3998
+ min-width: 92px;
3999
+ }
4000
+
4001
+ .bottom-nav {
4002
+ position: fixed;
4003
+ left: 0;
4004
+ right: auto;
4005
+ bottom: 0;
4006
+ width: var(--tablet-list-w);
4007
+ border-right: 1px solid var(--line);
4008
+ transform: none;
4009
+ }
4010
+
4011
+ body.mobile-app:not(.detail-open) .bottom-nav {
4012
+ left: 50%;
4013
+ width: var(--tablet-single-w);
4014
+ border-left: 1px solid var(--line);
4015
+ transform: translateX(-50%);
4016
+ }
4017
+
4018
+ .detail-view {
4019
+ top: 0;
4020
+ left: var(--tablet-list-w);
4021
+ right: 0;
4022
+ bottom: 0;
4023
+ width: auto;
4024
+ height: 100vh;
4025
+ min-height: 100vh;
4026
+ height: 100dvh;
4027
+ min-height: 100dvh;
4028
+ padding: 0;
4029
+ border-left: 0;
4030
+ border-right: 0;
4031
+ transform: none;
4032
+ background:
4033
+ linear-gradient(180deg, color-mix(in srgb, var(--bg-elev) 56%, transparent), transparent 260px),
4034
+ var(--bg);
4035
+ }
4036
+
4037
+ .detail-view.active {
4038
+ display: flex;
4039
+ }
4040
+
4041
+ .detail-topbar {
4042
+ position: sticky;
4043
+ top: 0;
4044
+ left: auto;
4045
+ right: auto;
4046
+ width: auto;
4047
+ min-height: calc(var(--tablet-topbar-h) + env(safe-area-inset-top));
4048
+ padding: calc(12px + env(safe-area-inset-top)) clamp(20px, 3vw, 34px) 12px;
4049
+ transform: none;
4050
+ }
4051
+
4052
+ .detail-alert,
4053
+ .detail-controls {
4054
+ padding-inline: clamp(20px, 3vw, 34px);
4055
+ }
4056
+
4057
+ .detail-messages {
4058
+ padding: 18px clamp(20px, 3vw, 36px) 36px;
4059
+ }
4060
+
4061
+ .detail-messages .msg,
4062
+ .detail-messages .review-msg,
4063
+ .detail-messages .turn,
4064
+ .detail-messages .prompt-turn,
4065
+ .detail-messages .thought-group,
4066
+ .message-row {
4067
+ max-width: min(920px, 100%);
4068
+ }
4069
+
4070
+ .composer {
4071
+ grid-template-columns: minmax(0, 1fr) 60px;
4072
+ gap: 10px;
4073
+ padding: 12px clamp(20px, 3vw, 36px) calc(12px + env(safe-area-inset-bottom));
4074
+ }
4075
+
4076
+ .composer.has-model-picker {
4077
+ grid-template-columns: minmax(0, 1fr) 86px 60px;
4078
+ }
4079
+
4080
+ .composer-editor {
4081
+ min-height: 56px;
4082
+ max-height: min(32vh, 220px);
4083
+ }
4084
+
4085
+ .send-btn {
4086
+ width: 60px;
4087
+ min-width: 60px;
4088
+ height: 56px;
4089
+ min-height: 56px;
4090
+ }
4091
+
4092
+ .model-picker-btn {
4093
+ width: 86px;
4094
+ min-width: 86px;
4095
+ height: 56px;
4096
+ min-height: 56px;
4097
+ }
4098
+
4099
+ .send-menu {
4100
+ left: calc(var(--tablet-list-w) + clamp(20px, 3vw, 36px));
4101
+ right: clamp(20px, 3vw, 36px);
4102
+ bottom: calc(var(--mobile-keyboard-offset, 0px) + env(safe-area-inset-bottom) + 104px);
4103
+ max-width: 680px;
4104
+ }
4105
+
4106
+ .mobile-skill-picker {
4107
+ right: -70px;
4108
+ max-height: min(44vh, 340px);
4109
+ }
4110
+
4111
+ .modal-backdrop {
4112
+ left: var(--tablet-list-w);
4113
+ justify-content: center;
4114
+ }
4115
+
4116
+ .stepup-sheet,
4117
+ .model-picker-sheet {
4118
+ width: min(640px, calc(100vw - var(--tablet-list-w) - 48px));
4119
+ }
4120
+ }