antri_cli 1.57.45 โ†’ 1.57.46

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.
@@ -15,7 +15,7 @@
15
15
  <header class="app-header">
16
16
  <div class="brand-zone">
17
17
  <span class="logo-text">ANTRI</span>
18
- <span class="version-tag">v1.57.45</span>
18
+ <span class="version-tag">v1.57.46</span>
19
19
  </div>
20
20
 
21
21
  <!-- Mode Toggle -->
@@ -373,12 +373,12 @@
373
373
 
374
374
  <!-- Connection Edges (Bezier curves) -->
375
375
  <g id="swarm-edges-layer">
376
- <path id="edge-planner-engineer" d="M 120 160 C 210 160, 240 90, 330 90" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
377
- <path id="edge-planner-security" d="M 120 160 C 210 160, 240 230, 330 230" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
378
- <path id="edge-engineer-qa" d="M 430 90 C 520 90, 560 90, 650 90" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
379
- <path id="edge-engineer-security" d="M 380 135 L 380 185" stroke="#334155" stroke-width="2" fill="none" stroke-dasharray="4,4" />
380
- <path id="edge-security-synth" d="M 430 230 C 600 230, 750 200, 850 170" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
381
- <path id="edge-qa-synth" d="M 750 90 C 800 90, 830 140, 850 150" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
376
+ <path id="edge-planner-engineer" d="M 150 160 C 230 160, 280 85, 335 85" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
377
+ <path id="edge-planner-security" d="M 150 160 C 230 160, 280 235, 335 235" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
378
+ <path id="edge-engineer-qa" d="M 425 85 L 635 85" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
379
+ <path id="edge-engineer-security" d="M 380 130 L 380 190" stroke="#334155" stroke-width="2" fill="none" stroke-dasharray="4,4" />
380
+ <path id="edge-security-synth" d="M 425 235 C 580 235, 750 195, 845 165" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
381
+ <path id="edge-qa-synth" d="M 725 85 C 785 85, 830 125, 845 150" stroke="#334155" stroke-width="2.5" fill="none" stroke-dasharray="6,4" />
382
382
  </g>
383
383
 
384
384
  <!-- Animated Traveling Particle Layer -->
@@ -387,48 +387,48 @@
387
387
  <!-- Nodes Layer -->
388
388
  <g id="swarm-nodes-layer">
389
389
  <!-- Node 1: Architect (Planner) -->
390
- <g class="swarm-svg-node" id="svg-node-planner" transform="translate(100, 160)" onclick="selectSwarmAgentView('planner')">
391
- <circle class="node-halo" id="halo-planner" r="48" fill="rgba(56, 189, 248, 0.12)" stroke="#38bdf8" stroke-width="2" />
392
- <circle class="node-core" r="38" fill="url(#grad-planner)" />
390
+ <g class="swarm-svg-node" id="svg-node-planner" transform="translate(110, 160)" onclick="selectSwarmAgentView('planner')">
391
+ <circle class="node-halo" id="halo-planner" r="46" fill="rgba(56, 189, 248, 0.12)" stroke="#38bdf8" stroke-width="2" />
392
+ <circle class="node-core" r="36" fill="url(#grad-planner)" />
393
393
  <text text-anchor="middle" dy="-2" font-size="22">๐Ÿง </text>
394
- <text text-anchor="middle" dy="18" fill="#ffffff" font-size="10" font-weight="700">ARCHITECT</text>
395
- <text text-anchor="middle" dy="62" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-planner-status">IDLE</text>
394
+ <text text-anchor="middle" dy="17" fill="#ffffff" font-size="9.5" font-weight="700">ARCHITECT</text>
395
+ <text text-anchor="middle" dy="60" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-planner-status">IDLE</text>
396
396
  </g>
397
397
 
398
398
  <!-- Node 2: Systems Engineer -->
399
- <g class="swarm-svg-node" id="svg-node-engineer" transform="translate(380, 90)" onclick="selectSwarmAgentView('engineer')">
400
- <circle class="node-halo" id="halo-engineer" r="48" fill="rgba(168, 85, 247, 0.12)" stroke="#a855f7" stroke-width="2" />
401
- <circle class="node-core" r="38" fill="url(#grad-engineer)" />
399
+ <g class="swarm-svg-node" id="svg-node-engineer" transform="translate(380, 85)" onclick="selectSwarmAgentView('engineer')">
400
+ <circle class="node-halo" id="halo-engineer" r="46" fill="rgba(168, 85, 247, 0.12)" stroke="#a855f7" stroke-width="2" />
401
+ <circle class="node-core" r="36" fill="url(#grad-engineer)" />
402
402
  <text text-anchor="middle" dy="-2" font-size="22">๐Ÿ’ป</text>
403
- <text text-anchor="middle" dy="18" fill="#ffffff" font-size="10" font-weight="700">ENGINEER</text>
404
- <text text-anchor="middle" dy="62" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-engineer-status">IDLE</text>
403
+ <text text-anchor="middle" dy="17" fill="#ffffff" font-size="9.5" font-weight="700">ENGINEER</text>
404
+ <text text-anchor="middle" dy="60" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-engineer-status">IDLE</text>
405
405
  </g>
406
406
 
407
407
  <!-- Node 3: Security Sentinel -->
408
- <g class="swarm-svg-node" id="svg-node-security" transform="translate(380, 230)" onclick="selectSwarmAgentView('security')">
409
- <circle class="node-halo" id="halo-security" r="48" fill="rgba(244, 63, 94, 0.12)" stroke="#f43f5e" stroke-width="2" />
410
- <circle class="node-core" r="38" fill="url(#grad-security)" />
408
+ <g class="swarm-svg-node" id="svg-node-security" transform="translate(380, 235)" onclick="selectSwarmAgentView('security')">
409
+ <circle class="node-halo" id="halo-security" r="46" fill="rgba(244, 63, 94, 0.12)" stroke="#f43f5e" stroke-width="2" />
410
+ <circle class="node-core" r="36" fill="url(#grad-security)" />
411
411
  <text text-anchor="middle" dy="-2" font-size="22">๐Ÿ›ก๏ธ</text>
412
- <text text-anchor="middle" dy="18" fill="#ffffff" font-size="10" font-weight="700">SECURITY</text>
413
- <text text-anchor="middle" dy="62" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-security-status">IDLE</text>
412
+ <text text-anchor="middle" dy="17" fill="#ffffff" font-size="9.5" font-weight="700">SECURITY</text>
413
+ <text text-anchor="middle" dy="60" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-security-status">IDLE</text>
414
414
  </g>
415
415
 
416
416
  <!-- Node 4: QA Chaos Tester -->
417
- <g class="swarm-svg-node" id="svg-node-qa" transform="translate(700, 90)" onclick="selectSwarmAgentView('qa')">
418
- <circle class="node-halo" id="halo-qa" r="48" fill="rgba(245, 158, 11, 0.12)" stroke="#f59e0b" stroke-width="2" />
419
- <circle class="node-core" r="38" fill="url(#grad-qa)" />
417
+ <g class="swarm-svg-node" id="svg-node-qa" transform="translate(680, 85)" onclick="selectSwarmAgentView('qa')">
418
+ <circle class="node-halo" id="halo-qa" r="46" fill="rgba(245, 158, 11, 0.12)" stroke="#f59e0b" stroke-width="2" />
419
+ <circle class="node-core" r="36" fill="url(#grad-qa)" />
420
420
  <text text-anchor="middle" dy="-2" font-size="22">๐Ÿงช</text>
421
- <text text-anchor="middle" dy="18" fill="#ffffff" font-size="10" font-weight="700">QA CHAOS</text>
422
- <text text-anchor="middle" dy="62" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-qa-status">IDLE</text>
421
+ <text text-anchor="middle" dy="17" fill="#ffffff" font-size="9.5" font-weight="700">QA CHAOS</text>
422
+ <text text-anchor="middle" dy="60" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-qa-status">IDLE</text>
423
423
  </g>
424
424
 
425
425
  <!-- Node 5: Chief Synthesizer -->
426
- <g class="swarm-svg-node" id="svg-node-synthesizer" transform="translate(900, 160)" onclick="selectSwarmAgentView('synthesizer')">
427
- <circle class="node-halo" id="halo-synthesizer" r="52" fill="rgba(16, 185, 129, 0.15)" stroke="#10b981" stroke-width="2.5" />
428
- <circle class="node-core" r="42" fill="url(#grad-synthesizer)" />
426
+ <g class="swarm-svg-node" id="svg-node-synthesizer" transform="translate(890, 160)" onclick="selectSwarmAgentView('synthesizer')">
427
+ <circle class="node-halo" id="halo-synthesizer" r="50" fill="rgba(16, 185, 129, 0.15)" stroke="#10b981" stroke-width="2.5" />
428
+ <circle class="node-core" r="40" fill="url(#grad-synthesizer)" />
429
429
  <text text-anchor="middle" dy="-2" font-size="24">โš–๏ธ</text>
430
- <text text-anchor="middle" dy="20" fill="#ffffff" font-size="10" font-weight="800">SYNTHESIZER</text>
431
- <text text-anchor="middle" dy="68" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-synthesizer-status">IDLE</text>
430
+ <text text-anchor="middle" dy="19" fill="#ffffff" font-size="9.5" font-weight="800">SYNTHESIZER</text>
431
+ <text text-anchor="middle" dy="65" fill="#94a3b8" font-size="10" font-family="monospace" id="svg-node-synthesizer-status">IDLE</text>
432
432
  </g>
433
433
  </g>
434
434
  </svg>
@@ -2297,43 +2297,52 @@ body.antri-app {
2297
2297
  gap: 8px;
2298
2298
  margin-bottom: 16px;
2299
2299
  overflow-x: auto;
2300
- padding-bottom: 4px;
2300
+ .swarm-presets-bar {
2301
+ display: flex;
2302
+ align-items: center;
2303
+ gap: 10px;
2304
+ margin-bottom: 20px;
2305
+ overflow-x: auto;
2306
+ padding: 4px 2px 10px 2px;
2301
2307
  }
2302
2308
 
2303
2309
  .presets-label {
2304
2310
  font-size: 12px;
2305
- font-weight: 600;
2306
- color: var(--text-tertiary, #94a3b8);
2311
+ font-weight: 700;
2312
+ color: #38bdf8;
2307
2313
  white-space: nowrap;
2314
+ letter-spacing: 0.5px;
2308
2315
  }
2309
2316
 
2310
2317
  .swarm-preset-btn {
2311
- background: rgba(30, 41, 59, 0.7);
2312
- border: 1px solid rgba(255, 255, 255, 0.08);
2313
- color: var(--text-secondary, #cbd5e1);
2314
- padding: 5px 12px;
2315
- border-radius: 8px;
2318
+ background: rgba(15, 23, 42, 0.9);
2319
+ border: 1px solid rgba(56, 189, 248, 0.25);
2320
+ color: #e2e8f0;
2321
+ padding: 7px 15px;
2322
+ border-radius: 20px;
2316
2323
  font-size: 12px;
2317
- font-weight: 500;
2324
+ font-weight: 600;
2318
2325
  cursor: pointer;
2319
2326
  white-space: nowrap;
2320
- transition: all 0.2s ease;
2327
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2328
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
2321
2329
  }
2322
2330
 
2323
2331
  .swarm-preset-btn:hover {
2324
- background: rgba(56, 189, 248, 0.15);
2325
- border-color: rgba(56, 189, 248, 0.4);
2326
- color: #38bdf8;
2332
+ background: rgba(56, 189, 248, 0.22);
2333
+ border-color: #38bdf8;
2334
+ color: #ffffff;
2327
2335
  transform: translateY(-1px);
2336
+ box-shadow: 0 4px 14px rgba(56, 189, 248, 0.3);
2328
2337
  }
2329
2338
 
2330
2339
  .swarm-canvas-card {
2331
- background: radial-gradient(circle at 50% 30%, rgba(15, 23, 42, 0.95), rgba(7, 10, 19, 0.98));
2332
- border: 1px solid rgba(59, 130, 246, 0.2);
2340
+ background: radial-gradient(circle at 50% 30%, rgba(15, 23, 42, 0.96), rgba(7, 10, 19, 0.99));
2341
+ border: 1px solid rgba(56, 189, 248, 0.25);
2333
2342
  border-radius: 16px;
2334
- padding: 16px 20px;
2335
- margin-bottom: 20px;
2336
- box-shadow: 0 12px 36px rgba(0, 0, 0, 0.5);
2343
+ padding: 20px 24px;
2344
+ margin-bottom: 22px;
2345
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.6);
2337
2346
  position: relative;
2338
2347
  overflow: hidden;
2339
2348
  }
@@ -2342,7 +2351,7 @@ body.antri-app {
2342
2351
  display: flex;
2343
2352
  justify-content: space-between;
2344
2353
  align-items: center;
2345
- margin-bottom: 12px;
2354
+ margin-bottom: 14px;
2346
2355
  }
2347
2356
 
2348
2357
  .canvas-title {
@@ -2350,8 +2359,8 @@ body.antri-app {
2350
2359
  align-items: center;
2351
2360
  gap: 8px;
2352
2361
  font-size: 11px;
2353
- font-weight: 700;
2354
- letter-spacing: 1px;
2362
+ font-weight: 800;
2363
+ letter-spacing: 1.2px;
2355
2364
  color: #38bdf8;
2356
2365
  }
2357
2366
 
@@ -2371,7 +2380,7 @@ body.antri-app {
2371
2380
 
2372
2381
  .swarm-metrics-row {
2373
2382
  display: flex;
2374
- gap: 16px;
2383
+ gap: 20px;
2375
2384
  }
2376
2385
 
2377
2386
  .metric-item {
@@ -2382,14 +2391,15 @@ body.antri-app {
2382
2391
 
2383
2392
  .metric-item .m-label {
2384
2393
  font-size: 10px;
2385
- color: var(--text-tertiary, #64748b);
2394
+ color: #94a3b8;
2386
2395
  text-transform: uppercase;
2396
+ letter-spacing: 0.5px;
2387
2397
  }
2388
2398
 
2389
2399
  .metric-item .m-val {
2390
- font-size: 13px;
2400
+ font-size: 14px;
2391
2401
  font-weight: 700;
2392
- color: #f1f5f9;
2402
+ color: #ffffff;
2393
2403
  font-family: var(--font-mono);
2394
2404
  }
2395
2405
 
@@ -2399,10 +2409,11 @@ body.antri-app {
2399
2409
 
2400
2410
  .swarm-svg-wrapper {
2401
2411
  width: 100%;
2402
- height: 240px;
2412
+ height: 270px;
2403
2413
  display: flex;
2404
2414
  align-items: center;
2405
2415
  justify-content: center;
2416
+ padding: 8px 0;
2406
2417
  }
2407
2418
 
2408
2419
  .swarm-svg-wrapper svg {
@@ -2433,7 +2444,7 @@ body.antri-app {
2433
2444
  .swarm-svg-node.selected .node-halo {
2434
2445
  stroke-width: 4px;
2435
2446
  stroke: #ffffff;
2436
- filter: drop-shadow(0 0 12px rgba(255,255,255,0.6));
2447
+ filter: drop-shadow(0 0 14px rgba(255,255,255,0.7));
2437
2448
  }
2438
2449
 
2439
2450
  @keyframes haloPulse {
@@ -2448,7 +2459,8 @@ body.antri-app {
2448
2459
  .swarm-workspace-grid {
2449
2460
  display: grid;
2450
2461
  grid-template-columns: 1fr 1fr;
2451
- gap: 20px;
2462
+ gap: 22px;
2463
+ margin-top: 4px;
2452
2464
  }
2453
2465
 
2454
2466
  @media (max-width: 900px) {
@@ -2458,23 +2470,24 @@ body.antri-app {
2458
2470
  }
2459
2471
 
2460
2472
  .swarm-stream-card, .swarm-deliverables-card {
2461
- background: var(--bg-surface, #0f172a);
2462
- border: 1px solid var(--border-color, #1e293b);
2463
- border-radius: 12px;
2473
+ background: #0b1120;
2474
+ border: 1px solid #1e293b;
2475
+ border-radius: 14px;
2464
2476
  display: flex;
2465
2477
  flex-direction: column;
2466
- height: 480px;
2478
+ height: 520px;
2467
2479
  overflow: hidden;
2480
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
2468
2481
  }
2469
2482
 
2470
2483
  .stream-header, .deliverables-header {
2471
- padding: 10px 14px;
2472
- background: rgba(15, 23, 42, 0.8);
2473
- border-bottom: 1px solid var(--border-color, #1e293b);
2484
+ padding: 12px 16px;
2485
+ background: #0f172a;
2486
+ border-bottom: 1px solid #1e293b;
2474
2487
  display: flex;
2475
2488
  justify-content: space-between;
2476
2489
  align-items: center;
2477
- gap: 8px;
2490
+ gap: 10px;
2478
2491
  }
2479
2492
 
2480
2493
  .stream-tabs {
@@ -2488,63 +2501,223 @@ body.antri-app {
2488
2501
  .stream-tab-btn {
2489
2502
  background: transparent;
2490
2503
  border: 1px solid transparent;
2491
- color: var(--text-tertiary, #94a3b8);
2492
- padding: 5px 10px;
2504
+ color: #94a3b8;
2505
+ padding: 6px 12px;
2493
2506
  border-radius: 6px;
2494
2507
  font-size: 11px;
2495
- font-weight: 600;
2508
+ font-weight: 700;
2496
2509
  cursor: pointer;
2497
2510
  white-space: nowrap;
2498
2511
  transition: all 0.15s ease;
2499
2512
  }
2500
2513
 
2501
2514
  .stream-tab-btn.active {
2502
- background: rgba(56, 189, 248, 0.15);
2503
- border-color: rgba(56, 189, 248, 0.35);
2515
+ background: rgba(56, 189, 248, 0.18);
2516
+ border-color: rgba(56, 189, 248, 0.45);
2504
2517
  color: #38bdf8;
2505
2518
  }
2506
2519
 
2507
2520
  .stream-tab-btn:hover:not(.active) {
2508
- color: #f1f5f9;
2509
- background: rgba(255, 255, 255, 0.05);
2521
+ color: #f8fafc;
2522
+ background: rgba(255, 255, 255, 0.08);
2510
2523
  }
2511
2524
 
2512
2525
  .copy-stream-btn, .action-btn-sm {
2513
- background: rgba(255, 255, 255, 0.06);
2514
- border: 1px solid rgba(255, 255, 255, 0.12);
2515
- color: #cbd5e1;
2516
- padding: 4px 10px;
2526
+ background: rgba(255, 255, 255, 0.08);
2527
+ border: 1px solid rgba(255, 255, 255, 0.15);
2528
+ color: #f1f5f9;
2529
+ padding: 5px 12px;
2517
2530
  border-radius: 6px;
2518
2531
  font-size: 11px;
2519
- font-weight: 600;
2532
+ font-weight: 700;
2520
2533
  cursor: pointer;
2521
2534
  transition: all 0.2s ease;
2522
2535
  }
2523
2536
 
2524
2537
  .copy-stream-btn:hover, .action-btn-sm:hover {
2525
- background: rgba(56, 189, 248, 0.2);
2538
+ background: rgba(56, 189, 248, 0.25);
2526
2539
  border-color: #38bdf8;
2527
- color: #fff;
2540
+ color: #ffffff;
2528
2541
  }
2529
2542
 
2530
2543
  .swarm-stream-body, .deliverables-content {
2531
- padding: 16px;
2544
+ padding: 18px 20px;
2532
2545
  overflow-y: auto;
2533
2546
  flex: 1;
2534
2547
  font-size: 13px;
2535
- line-height: 1.6;
2536
- color: var(--text-primary, #f1f5f9);
2548
+ line-height: 1.65;
2549
+ color: #f1f5f9;
2550
+ background: #070d19;
2551
+ }
2552
+
2553
+ /* ==========================================================================
2554
+ โœจ High-Contrast Luminous Typography & Formatted Markdown for Dark Surfaces
2555
+ ========================================================================== */
2556
+
2557
+ #tab-swarm {
2558
+ color: #f1f5f9;
2537
2559
  }
2538
2560
 
2539
- .swarm-stream-body pre, .deliverables-content pre {
2561
+ #tab-swarm .panel-header h2 {
2562
+ color: var(--text-primary);
2563
+ }
2564
+
2565
+ #tab-swarm .panel-header p {
2566
+ color: var(--text-secondary);
2567
+ }
2568
+
2569
+ #tab-swarm #swarm-objective-input {
2570
+ background: #0f172a;
2571
+ border: 1px solid #334155;
2572
+ color: #ffffff;
2573
+ padding: 8px 14px;
2574
+ border-radius: 8px;
2575
+ font-size: 12px;
2576
+ outline: none;
2577
+ min-width: 320px;
2578
+ transition: border-color 0.2s ease;
2579
+ }
2580
+
2581
+ #tab-swarm #swarm-objective-input:focus {
2582
+ border-color: #38bdf8;
2583
+ box-shadow: 0 0 10px rgba(56, 189, 248, 0.25);
2584
+ }
2585
+
2586
+ #tab-swarm #swarm-objective-input::placeholder {
2587
+ color: #64748b;
2588
+ }
2589
+
2590
+ .swarm-stream-body *,
2591
+ .deliverables-content * {
2592
+ box-sizing: border-box;
2593
+ }
2594
+
2595
+ .swarm-stream-body p,
2596
+ .deliverables-content p {
2597
+ color: #e2e8f0;
2598
+ margin-bottom: 10px;
2599
+ line-height: 1.65;
2600
+ }
2601
+
2602
+ .formatted-h2 {
2603
+ font-size: 16px;
2604
+ font-weight: 800;
2605
+ color: #38bdf8;
2606
+ margin: 16px 0 8px 0;
2607
+ border-bottom: 1px solid rgba(56, 189, 248, 0.2);
2608
+ padding-bottom: 4px;
2609
+ }
2610
+
2611
+ .formatted-h3 {
2612
+ font-size: 14px;
2613
+ font-weight: 700;
2614
+ color: #c084fc;
2615
+ margin: 14px 0 6px 0;
2616
+ }
2617
+
2618
+ .formatted-h4 {
2619
+ font-size: 13px;
2620
+ font-weight: 700;
2621
+ color: #fbbf24;
2622
+ margin: 12px 0 6px 0;
2623
+ }
2624
+
2625
+ .formatted-h5 {
2626
+ font-size: 12px;
2627
+ font-weight: 700;
2628
+ color: #34d399;
2629
+ margin: 10px 0 4px 0;
2630
+ }
2631
+
2632
+ .bullet-item {
2633
+ color: #f1f5f9;
2634
+ margin: 5px 0;
2635
+ line-height: 1.55;
2636
+ padding-left: 6px;
2637
+ }
2638
+
2639
+ .number-item {
2640
+ color: #f1f5f9;
2641
+ margin: 5px 0;
2642
+ line-height: 1.55;
2643
+ }
2644
+
2645
+ .num-badge {
2646
+ color: #38bdf8;
2647
+ font-weight: 700;
2648
+ font-family: var(--font-mono);
2649
+ margin-right: 4px;
2650
+ }
2651
+
2652
+ .formatted-quote {
2653
+ border-left: 3px solid #38bdf8;
2654
+ background: rgba(56, 189, 248, 0.08);
2655
+ padding: 8px 12px;
2656
+ margin: 10px 0;
2657
+ border-radius: 0 6px 6px 0;
2658
+ color: #cbd5e1;
2659
+ font-style: italic;
2660
+ }
2661
+
2662
+ .inline-code {
2663
+ background: rgba(56, 189, 248, 0.15);
2664
+ color: #38bdf8;
2665
+ padding: 2px 6px;
2666
+ border-radius: 4px;
2667
+ font-family: var(--font-mono);
2668
+ font-size: 12px;
2669
+ border: 1px solid rgba(56, 189, 248, 0.25);
2670
+ }
2671
+
2672
+ .formatted-code-block {
2540
2673
  background: #020617;
2541
2674
  border: 1px solid #1e293b;
2542
2675
  border-radius: 8px;
2543
- padding: 12px;
2676
+ margin: 12px 0;
2677
+ overflow: hidden;
2678
+ }
2679
+
2680
+ .code-block-header {
2681
+ background: #0f172a;
2682
+ color: #94a3b8;
2683
+ font-size: 11px;
2684
+ font-weight: 700;
2685
+ padding: 5px 12px;
2686
+ text-transform: uppercase;
2687
+ font-family: var(--font-mono);
2688
+ border-bottom: 1px solid #1e293b;
2689
+ }
2690
+
2691
+ .formatted-code-block pre {
2692
+ padding: 12px 14px;
2693
+ margin: 0;
2544
2694
  overflow-x: auto;
2545
2695
  font-family: var(--font-mono);
2546
2696
  font-size: 12px;
2547
- margin: 10px 0;
2697
+ color: #e2e8f0;
2698
+ line-height: 1.5;
2699
+ background: #020617;
2700
+ }
2701
+
2702
+ .formatted-code-block code {
2703
+ color: #e2e8f0;
2704
+ font-family: var(--font-mono);
2705
+ }
2706
+
2707
+ .swarm-stream-body strong,
2708
+ .deliverables-content strong {
2709
+ color: #ffffff;
2710
+ font-weight: 700;
2711
+ }
2712
+
2713
+ .swarm-stream-body em,
2714
+ .deliverables-content em {
2715
+ color: #cbd5e1;
2716
+ }
2717
+
2718
+ .placeholder-text {
2719
+ color: #94a3b8 !important;
2720
+ font-style: italic;
2548
2721
  }
2549
2722
 
2550
2723
  /* ==========================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/desktop/server.ts"],"names":[],"mappings":"AAuCA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAA4C;IACxD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,gBAAgB,CAAqD;;IAO7E,OAAO,CAAC,sBAAsB;IA2BjB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAkGxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUpB,SAAS;WAm0BH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAyBnD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/desktop/server.ts"],"names":[],"mappings":"AAuCA,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAA4C;IACxD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,gBAAgB,CAAqD;;IAO7E,OAAO,CAAC,sBAAsB;IA2BjB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAkGxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUpB,SAAS;WA81BH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAyBnD"}
@@ -259,6 +259,14 @@ export class DesktopServer {
259
259
  }));
260
260
  return;
261
261
  }
262
+ // GET /api/cloud/sync (Get Cloud Sync Status & Config)
263
+ if (pathname === '/api/cloud/sync' && req.method === 'GET') {
264
+ const { FirestoreSyncManager } = await import('../cloud/firestore.js');
265
+ const cfg = FirestoreSyncManager.getSyncConfig();
266
+ res.writeHead(200, { 'Content-Type': 'application/json' });
267
+ res.end(JSON.stringify({ success: true, ...cfg }));
268
+ return;
269
+ }
262
270
  // GET /api/skills
263
271
  if (pathname === '/api/skills' && req.method === 'GET') {
264
272
  const markdownSkills = skillManager.listSkills();
@@ -411,6 +419,22 @@ export class DesktopServer {
411
419
  }));
412
420
  return;
413
421
  }
422
+ // POST /api/cloud/pull (Pull profiles from Firestore)
423
+ if (pathname === '/api/cloud/pull' && req.method === 'POST') {
424
+ const { FirestoreSyncManager } = await import('../cloud/firestore.js');
425
+ const resData = await FirestoreSyncManager.pullFromFirestore(payload.syncKey);
426
+ res.writeHead(200, { 'Content-Type': 'application/json' });
427
+ res.end(JSON.stringify(resData));
428
+ return;
429
+ }
430
+ // POST /api/cloud/push (Push profiles to Firestore)
431
+ if (pathname === '/api/cloud/push' && req.method === 'POST') {
432
+ const { FirestoreSyncManager } = await import('../cloud/firestore.js');
433
+ const resData = await FirestoreSyncManager.pushToFirestore(payload.syncKey);
434
+ res.writeHead(200, { 'Content-Type': 'application/json' });
435
+ res.end(JSON.stringify(resData));
436
+ return;
437
+ }
414
438
  // POST /api/codebase/breathe (Trigger 1-2s Codebase Analysis & Cache Re-indexing)
415
439
  if (pathname === '/api/codebase/breathe' && req.method === 'POST') {
416
440
  const freshCache = await CodebaseBreather.breathe(config.workingDir, { minDurationMs: 1200, silent: true });