ltcai 2.2.7 → 3.0.1

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 (69) hide show
  1. package/README.md +63 -32
  2. package/docs/CHANGELOG.md +82 -0
  3. package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
  4. package/docs/V3_FRONTEND.md +136 -0
  5. package/knowledge_graph.py +649 -21
  6. package/latticeai/__init__.py +1 -1
  7. package/latticeai/api/admin.py +47 -0
  8. package/latticeai/api/agents.py +54 -31
  9. package/latticeai/api/auth.py +1 -1
  10. package/latticeai/api/chat.py +10 -2
  11. package/latticeai/api/search.py +236 -0
  12. package/latticeai/api/static_routes.py +11 -2
  13. package/latticeai/core/config.py +16 -0
  14. package/latticeai/core/embedding_providers.py +502 -0
  15. package/latticeai/core/local_embeddings.py +86 -0
  16. package/latticeai/core/workspace_os.py +1 -1
  17. package/latticeai/server_app.py +49 -1
  18. package/latticeai/services/agent_runtime.py +245 -0
  19. package/latticeai/services/search_service.py +346 -0
  20. package/package.json +6 -4
  21. package/static/account.html +9 -9
  22. package/static/activity.html +4 -4
  23. package/static/admin.html +8 -8
  24. package/static/agents.html +4 -4
  25. package/static/chat.html +10 -10
  26. package/static/css/reference/account.css +137 -1
  27. package/static/css/reference/chat.css +31 -37
  28. package/static/css/responsive.css +42 -0
  29. package/static/css/tokens.css +125 -130
  30. package/static/graph.html +9 -9
  31. package/static/manifest.json +3 -3
  32. package/static/plugins.html +4 -4
  33. package/static/scripts/account.js +4 -4
  34. package/static/scripts/chat.js +40 -8
  35. package/static/scripts/workspace.js +78 -0
  36. package/static/v3/css/lattice.base.css +128 -0
  37. package/static/v3/css/lattice.components.css +447 -0
  38. package/static/v3/css/lattice.shell.css +407 -0
  39. package/static/v3/css/lattice.tokens.css +132 -0
  40. package/static/v3/css/lattice.views.css +277 -0
  41. package/static/v3/index.html +40 -0
  42. package/static/v3/js/app.js +26 -0
  43. package/static/v3/js/core/api.js +327 -0
  44. package/static/v3/js/core/components.js +215 -0
  45. package/static/v3/js/core/dom.js +148 -0
  46. package/static/v3/js/core/fixtures.js +171 -0
  47. package/static/v3/js/core/router.js +37 -0
  48. package/static/v3/js/core/routes.js +73 -0
  49. package/static/v3/js/core/shell.js +363 -0
  50. package/static/v3/js/core/store.js +113 -0
  51. package/static/v3/js/views/admin-audit.js +185 -0
  52. package/static/v3/js/views/admin-permissions.js +178 -0
  53. package/static/v3/js/views/admin-policies.js +103 -0
  54. package/static/v3/js/views/admin-private-vpc.js +138 -0
  55. package/static/v3/js/views/admin-security.js +181 -0
  56. package/static/v3/js/views/admin-users.js +168 -0
  57. package/static/v3/js/views/agents.js +194 -0
  58. package/static/v3/js/views/chat.js +450 -0
  59. package/static/v3/js/views/files.js +180 -0
  60. package/static/v3/js/views/home.js +119 -0
  61. package/static/v3/js/views/hybrid-search.js +195 -0
  62. package/static/v3/js/views/knowledge-graph.js +238 -0
  63. package/static/v3/js/views/models.js +247 -0
  64. package/static/v3/js/views/my-computer.js +237 -0
  65. package/static/v3/js/views/pipeline.js +161 -0
  66. package/static/v3/js/views/settings.js +258 -0
  67. package/static/workflows.html +4 -4
  68. package/static/workspace.css +340 -2
  69. package/static/workspace.html +43 -24
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
6
6
  <title>Realtime Activity — Lattice AI</title>
7
- <script src="/static/scripts/ux.js?v=2.2.7"></script>
8
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7" />
9
- <link rel="stylesheet" href="/static/platform.css?v=2.2.7" />
10
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7" />
7
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
8
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0" />
9
+ <link rel="stylesheet" href="/static/platform.css?v=3.0.0" />
10
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0" />
11
11
  </head>
12
12
  <body>
13
13
  <main>
package/static/admin.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content">
7
7
  <title>Lattice AI Admin</title>
8
- <script src="/static/scripts/ux.js?v=2.2.7"></script>
8
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
9
9
  <link rel="manifest" href="/manifest.json">
10
10
  <meta name="theme-color" content="#f3ecff">
11
11
  <meta name="apple-mobile-web-app-capable" content="yes">
@@ -15,13 +15,13 @@
15
15
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
16
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
17
17
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
18
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
19
- <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
20
- <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
21
- <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
22
- <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
23
- <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
24
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
18
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0">
19
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=3.0.0">
20
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=3.0.0">
21
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=3.0.0">
22
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=3.0.0">
23
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=3.0.0">
24
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0">
25
25
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
26
26
  </head>
27
27
 
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
6
6
  <title>Multi-Agent Runtime — Lattice AI</title>
7
- <script src="/static/scripts/ux.js?v=2.2.7"></script>
8
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7" />
9
- <link rel="stylesheet" href="/static/platform.css?v=2.2.7" />
10
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7" />
7
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
8
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0" />
9
+ <link rel="stylesheet" href="/static/platform.css?v=3.0.0" />
10
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0" />
11
11
  </head>
12
12
  <body>
13
13
  <main>
package/static/chat.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content">
7
7
  <title>Lattice AI — All-in-One Multimodal Workspace</title>
8
- <script src="/static/scripts/ux.js?v=2.2.7"></script>
8
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
9
9
 
10
10
  <!-- PWA -->
11
11
  <link rel="manifest" href="/manifest.json">
@@ -24,13 +24,13 @@
24
24
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
25
25
 
26
26
  <!-- ── Setup Wizard Styles ──────────────────────────────────────────── -->
27
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
28
- <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
29
- <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
30
- <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
31
- <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
32
- <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
33
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
27
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0">
28
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=3.0.0">
29
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=3.0.0">
30
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=3.0.0">
31
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=3.0.0">
32
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=3.0.0">
33
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0">
34
34
  </head>
35
35
 
36
36
  <body class="lattice-ref-chat">
@@ -747,7 +747,7 @@
747
747
  <div style="font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px">AI 자동 작업</div>
748
748
  <textarea id="cu-task-input" placeholder="예: Safari 열고 apple.com 접속해줘&#10;예: 현재 화면에서 버튼 찾아서 클릭해줘" style="width:100%;background:var(--surface-3);border:1px solid var(--border);border-radius:8px;padding:10px;color:var(--text);font-size:13px;resize:vertical;min-height:80px;font-family:inherit;outline:none"></textarea>
749
749
  <div style="display:flex;gap:6px;margin-top:6px">
750
- <button id="cu-run-btn" onclick="cuRunAgent()" style="flex:1;background:linear-gradient(135deg,var(--accent),var(--accent-2));border:none;color:#fff;padding:8px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px"><i class="ti ti-player-play"></i> 실행</button>
750
+ <button id="cu-run-btn" onclick="cuRunAgent()" style="flex:1;background:var(--accent);border:none;color:#fff;padding:8px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px"><i class="ti ti-player-play"></i> 실행</button>
751
751
  <button id="cu-stop-btn" onclick="cuStopAgent()" style="background:rgba(248,113,113,0.12);border:1px solid rgba(248,113,113,0.25);color:var(--danger);padding:8px 14px;border-radius:8px;font-size:13px;cursor:pointer;display:none"><i class="ti ti-player-stop"></i></button>
752
752
  </div>
753
753
  </div>
@@ -838,7 +838,7 @@
838
838
  </div>
839
839
 
840
840
 
841
- <script src="/static/scripts/chat.js?v=2.2.7"></script>
841
+ <script src="/static/scripts/chat.js?v=3.0.0"></script>
842
842
  </body>
843
843
 
844
844
  </html>
@@ -1,7 +1,7 @@
1
1
  /* Lattice AI — account / auth page (account.html, body.lattice-ref-auth). Token-native. */
2
2
  /* ============================================================
3
3
  ACCOUNT / AUTH PAGE (account.html)
4
- Light lavender theme — unified with chat/graph/admin pages.
4
+ Token-native product entry surface — unified with chat/graph/admin pages.
5
5
  ============================================================ */
6
6
 
7
7
  * { box-sizing: border-box; margin: 0; padding: 0; }
@@ -301,3 +301,139 @@
301
301
  -webkit-text-fill-color: currentColor;
302
302
  color: var(--text);
303
303
  }
304
+
305
+ /* Product-grade auth surface — functional entry point, token-native. */
306
+ .lattice-ref-auth {
307
+ background: var(--app-bg);
308
+ }
309
+
310
+ .lattice-ref-auth::before {
311
+ background:
312
+ linear-gradient(90deg, rgba(12, 92, 115, 0.05) 1px, transparent 1px),
313
+ linear-gradient(180deg, rgba(12, 92, 115, 0.05) 1px, transparent 1px);
314
+ background-size: 42px 42px;
315
+ mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.32), transparent 76%);
316
+ }
317
+
318
+ .lattice-ref-auth::after,
319
+ .lattice-ref-auth .orb,
320
+ .auth-wave,
321
+ .auth-network {
322
+ display: none;
323
+ }
324
+
325
+ .auth-titlebar {
326
+ background: var(--surface-elevated);
327
+ border-bottom-color: var(--line);
328
+ color: var(--text);
329
+ }
330
+
331
+ .auth-window-brand i,
332
+ .lattice-ref-auth .hero-logo-mark {
333
+ color: var(--accent);
334
+ }
335
+
336
+ .auth-window-controls span::before,
337
+ .auth-window-controls span::after {
338
+ background: var(--text);
339
+ border-color: var(--text);
340
+ }
341
+
342
+ .lattice-ref-auth .login-shell {
343
+ width: min(980px, calc(100vw - 36px));
344
+ grid-template-columns: minmax(300px, 430px) minmax(280px, 1fr);
345
+ }
346
+
347
+ .lattice-ref-auth .brand-preview {
348
+ display: block;
349
+ border-radius: 8px;
350
+ background:
351
+ linear-gradient(135deg, var(--accent-soft), transparent 58%),
352
+ var(--surface);
353
+ border-color: var(--line);
354
+ box-shadow: none;
355
+ }
356
+
357
+ .lattice-ref-auth .preview-node {
358
+ border-radius: 8px;
359
+ background: var(--surface-2);
360
+ border-color: var(--line);
361
+ box-shadow: none;
362
+ }
363
+
364
+ .lattice-ref-auth .preview-node::after {
365
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
366
+ border-radius: 8px;
367
+ }
368
+
369
+ .lattice-ref-auth .preview-line {
370
+ background: linear-gradient(90deg, transparent, var(--accent-2), transparent);
371
+ }
372
+
373
+ .lattice-ref-auth .card {
374
+ border-radius: 8px;
375
+ background: var(--surface-elevated);
376
+ border-color: var(--line);
377
+ box-shadow: var(--shadow);
378
+ }
379
+
380
+ .lattice-ref-auth .card::before {
381
+ background: linear-gradient(90deg, transparent, var(--accent), var(--accent-2), transparent);
382
+ }
383
+
384
+ .lattice-ref-auth .title {
385
+ background: none;
386
+ color: var(--text);
387
+ -webkit-text-fill-color: currentColor;
388
+ }
389
+
390
+ .lattice-ref-auth .subtitle {
391
+ color: var(--muted);
392
+ font-weight: 700;
393
+ }
394
+
395
+ .lattice-ref-auth .input,
396
+ .lattice-ref-auth .auth-field,
397
+ .lattice-ref-auth .sso-btn {
398
+ background: var(--input);
399
+ border-color: var(--line);
400
+ color: var(--text);
401
+ }
402
+
403
+ .lattice-ref-auth .input:focus,
404
+ .lattice-ref-auth .auth-field:focus-within {
405
+ border-color: var(--accent);
406
+ box-shadow: 0 0 0 3px var(--accent-soft);
407
+ }
408
+
409
+ .lattice-ref-auth .submit {
410
+ background: var(--accent);
411
+ box-shadow: none;
412
+ }
413
+
414
+ .lattice-ref-auth .submit:hover {
415
+ background: var(--accent-deep);
416
+ box-shadow: none;
417
+ }
418
+
419
+ .lattice-ref-auth .local-start,
420
+ .lattice-ref-auth .register-cta,
421
+ .lattice-ref-auth .switch a {
422
+ color: var(--accent);
423
+ }
424
+
425
+ .lattice-ref-auth .lang-btn,
426
+ .lattice-ref-auth .lang-menu {
427
+ border-color: var(--line);
428
+ box-shadow: none;
429
+ }
430
+
431
+ @media (max-width: 760px) {
432
+ .lattice-ref-auth .login-shell {
433
+ grid-template-columns: 1fr;
434
+ }
435
+
436
+ .lattice-ref-auth .brand-preview {
437
+ display: none;
438
+ }
439
+ }
@@ -19,10 +19,7 @@
19
19
  inset: 0;
20
20
  pointer-events: none;
21
21
  z-index: 0;
22
- background:
23
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
24
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
25
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, var(--surface) 100%);
22
+ background: var(--app-bg);
26
23
  }
27
24
 
28
25
  .bg-shapes {
@@ -2872,14 +2869,14 @@
2872
2869
  color: var(--accent);
2873
2870
  }
2874
2871
 
2875
- /* Lattice AI workspace — light lavender theme. */
2872
+ /* Lattice AI workspace — product shell theme. */
2876
2873
  .app-layout {
2877
2874
  --bg: var(--bg);
2878
2875
  --surface: var(--surface);
2879
2876
  --surface-2: var(--surface-2);
2880
2877
  --surface-3: var(--surface-3);
2881
2878
  --accent: var(--accent);
2882
- --accent-2: var(--accent-2);
2879
+ --accent-2: var(--lt-accent-2, #0f9f8f);
2883
2880
  --accent-3: var(--accent-3);
2884
2881
  --accent-pink: var(--accent-pink);
2885
2882
  --accent-soft: var(--accent-soft);
@@ -4220,7 +4217,7 @@
4220
4217
  }
4221
4218
 
4222
4219
  /* =========================================================
4223
- Soft Lavender Theme (4/10) — full override for .app-layout
4220
+ Workspace product shell — full override for .app-layout
4224
4221
  ========================================================= */
4225
4222
  body.lattice-ref-chat .app-layout {
4226
4223
  --bg: var(--bg);
@@ -4228,7 +4225,7 @@
4228
4225
  --surface-2: var(--surface-2);
4229
4226
  --surface-3: var(--surface-3);
4230
4227
  --accent: var(--accent);
4231
- --accent-2: #ffb84d;
4228
+ --accent-2: var(--lt-accent-2, #0f9f8f);
4232
4229
  --accent-3: var(--accent-2);
4233
4230
  --accent-soft: var(--accent-soft);
4234
4231
  --text: var(--text);
@@ -4238,10 +4235,7 @@
4238
4235
  --border-strong: var(--border-strong);
4239
4236
  --shadow: var(--shadow);
4240
4237
  --shadow-sm: var(--shadow-sm);
4241
- background:
4242
- radial-gradient(circle at 82% 12%, var(--border), transparent 30%),
4243
- radial-gradient(circle at 10% 80%, rgba(180,160,255,0.16), transparent 35%),
4244
- linear-gradient(180deg, var(--bg) 0%, var(--surface-2) 52%, var(--surface) 100%);
4238
+ background: var(--app-bg);
4245
4239
  }
4246
4240
  body.lattice-ref-chat .app-layout::before,
4247
4241
  body.lattice-ref-chat .app-layout::after {
@@ -4251,15 +4245,15 @@
4251
4245
  /* Sidebar */
4252
4246
  body.lattice-ref-chat .app-layout .sidebar {
4253
4247
  background: var(--sidebar);
4254
- border-right: 1px solid rgba(111,66,232,0.13);
4255
- box-shadow: 12px 0 46px rgba(88,72,150,0.08);
4248
+ border-right: 1px solid var(--line);
4249
+ box-shadow: none;
4256
4250
  }
4257
4251
 
4258
4252
  /* Chat header */
4259
4253
  body.lattice-ref-chat .app-layout .chat-header {
4260
4254
  background: var(--sidebar);
4261
- border-bottom: 1px solid rgba(111,66,232,0.11);
4262
- box-shadow: 0 2px 12px rgba(88,72,150,0.06);
4255
+ border-bottom: 1px solid var(--line);
4256
+ box-shadow: none;
4263
4257
  backdrop-filter: blur(14px);
4264
4258
  }
4265
4259
 
@@ -4306,28 +4300,28 @@
4306
4300
  /* 입력창 영역 */
4307
4301
  body.lattice-ref-chat .app-layout .input-area {
4308
4302
  background: linear-gradient(0deg,
4309
- rgba(243,237,255,0.99) 0%,
4310
- rgba(243,237,255,0.86) 64%,
4303
+ color-mix(in srgb, var(--bg) 98%, transparent) 0%,
4304
+ color-mix(in srgb, var(--bg) 82%, transparent) 64%,
4311
4305
  transparent 100%);
4312
4306
  }
4313
4307
  body.lattice-ref-chat .app-layout .input-box {
4314
4308
  background: var(--input);
4315
- border: 1px solid rgba(111,66,232,0.17);
4316
- box-shadow: 0 8px 32px rgba(88,72,150,0.10);
4309
+ border: 1px solid var(--line);
4310
+ box-shadow: var(--shadow-sm);
4317
4311
  }
4318
4312
  body.lattice-ref-chat .app-layout .input-box:focus-within {
4319
- border-color: rgba(111,66,232,0.44);
4320
- box-shadow: 0 8px 32px rgba(88,72,150,0.10), 0 0 0 3px rgba(111,66,232,0.09);
4313
+ border-color: var(--accent);
4314
+ box-shadow: var(--shadow-sm), 0 0 0 3px var(--accent-soft);
4321
4315
  }
4322
4316
 
4323
4317
  /* 전송 버튼 */
4324
4318
  body.lattice-ref-chat .app-layout .send-btn {
4325
4319
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
4326
4320
  color: #ffffff;
4327
- box-shadow: 0 8px 20px rgba(111,66,232,0.28);
4321
+ box-shadow: 0 8px 20px color-mix(in srgb, var(--accent) 24%, transparent);
4328
4322
  }
4329
4323
  body.lattice-ref-chat .app-layout .send-btn:hover {
4330
- box-shadow: 0 10px 26px rgba(111,66,232,0.38);
4324
+ box-shadow: 0 10px 26px color-mix(in srgb, var(--accent) 34%, transparent);
4331
4325
  opacity: 0.92;
4332
4326
  }
4333
4327
 
@@ -4339,17 +4333,17 @@
4339
4333
  box-shadow: 0 2px 10px rgba(88,72,150,0.08);
4340
4334
  }
4341
4335
  body.lattice-ref-chat .app-layout .empty-chip:hover {
4342
- background: rgba(111,66,232,0.08);
4336
+ background: var(--accent-soft);
4343
4337
  border-color: var(--border-strong);
4344
4338
  }
4345
4339
  body.lattice-ref-chat .app-layout .ops-card {
4346
4340
  background: var(--card);
4347
- border-color: rgba(111,66,232,0.13);
4348
- box-shadow: 0 6px 22px rgba(88,72,150,0.08);
4341
+ border-color: var(--line);
4342
+ box-shadow: var(--shadow-sm);
4349
4343
  }
4350
4344
  body.lattice-ref-chat .app-layout .ops-card.primary {
4351
- background: linear-gradient(135deg, rgba(111,66,232,0.10), var(--card) 58%);
4352
- border-color: rgba(111,66,232,0.22);
4345
+ background: linear-gradient(135deg, var(--accent-soft), var(--card) 58%);
4346
+ border-color: var(--border-strong);
4353
4347
  }
4354
4348
 
4355
4349
  /* 배지/버튼 */
@@ -4371,8 +4365,8 @@
4371
4365
  body.lattice-ref-chat .app-layout .status-btn,
4372
4366
  body.lattice-ref-chat .app-layout .admin-btn,
4373
4367
  body.lattice-ref-chat .app-layout .setup-wizard-sidebar-btn {
4374
- background: rgba(111,66,232,0.10);
4375
- border-color: rgba(111,66,232,0.22);
4368
+ background: var(--accent-soft);
4369
+ border-color: var(--border-strong);
4376
4370
  color: var(--accent);
4377
4371
  box-shadow: none;
4378
4372
  }
@@ -4388,7 +4382,7 @@
4388
4382
  color: var(--text);
4389
4383
  -webkit-text-fill-color: var(--text);
4390
4384
  background: var(--accent-soft);
4391
- border-color: rgba(111,66,232,0.24);
4385
+ border-color: var(--border-strong);
4392
4386
  }
4393
4387
  /* 채팅 기록 목록도 검정 */
4394
4388
  body.lattice-ref-chat .app-layout .history-item {
@@ -4408,20 +4402,20 @@
4408
4402
  /* 사이드바 검색 입력 */
4409
4403
  body.lattice-ref-chat .app-layout .sidebar-search input {
4410
4404
  color: var(--text);
4411
- background: rgba(111,66,232,0.06);
4412
- border-color: rgba(111,66,232,0.16);
4405
+ background: var(--input);
4406
+ border-color: var(--line);
4413
4407
  }
4414
4408
  body.lattice-ref-chat .app-layout .sidebar-search input::placeholder {
4415
4409
  color: var(--faint);
4416
4410
  -webkit-text-fill-color: var(--faint);
4417
4411
  }
4418
- /* 상단 모드 세그멘트 배경도 라벤더로 */
4412
+ /* 상단 모드 세그멘트 */
4419
4413
  body.lattice-ref-chat .app-layout .mode-segmented {
4420
4414
  background: var(--surface-2);
4421
- border-color: rgba(111,66,232,0.16);
4415
+ border-color: var(--line);
4422
4416
  }
4423
4417
  body.lattice-ref-chat .app-layout .mode-segmented button:not(.active) {
4424
- color: #3d3860;
4418
+ color: var(--muted);
4425
4419
  }
4426
4420
 
4427
4421
  /* ── 홈 뷰: 채팅 전용 사이드바 섹션 숨기기 ── */
@@ -817,3 +817,45 @@ body.lattice-ref-chat .app-layout #user-input:focus {
817
817
  width: 100%;
818
818
  }
819
819
  }
820
+
821
+ /* Product workspace shell: this file loads last, so keep the mobile rail fluid. */
822
+ @media (max-width: 860px) {
823
+ body.workspace-page .workspace-shell {
824
+ grid-template-columns: 1fr;
825
+ min-width: 0;
826
+ width: 100%;
827
+ }
828
+
829
+ body.workspace-page .workspace-rail {
830
+ height: auto;
831
+ min-height: 0;
832
+ min-width: 0;
833
+ max-width: 100vw;
834
+ position: relative;
835
+ width: 100%;
836
+ }
837
+
838
+ body.workspace-page main {
839
+ min-width: 0;
840
+ width: 100%;
841
+ }
842
+
843
+ body.workspace-page .workspace-rail nav,
844
+ body.workspace-page .rail-links {
845
+ min-width: 0;
846
+ width: 100%;
847
+ }
848
+
849
+ body.workspace-page .workspace-rail a span {
850
+ min-width: 0;
851
+ overflow: hidden;
852
+ text-overflow: ellipsis;
853
+ }
854
+ }
855
+
856
+ @media (max-width: 520px) {
857
+ body.workspace-page .workspace-rail nav,
858
+ body.workspace-page .rail-links {
859
+ grid-template-columns: 1fr;
860
+ }
861
+ }