ltcai 3.3.0 → 3.4.0

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 (75) hide show
  1. package/README.md +85 -66
  2. package/docs/CHANGELOG.md +36 -0
  3. package/docs/architecture.md +2 -1
  4. package/docs/assets/v3.4.0/agent-run.png +0 -0
  5. package/docs/assets/v3.4.0/agents.png +0 -0
  6. package/docs/assets/v3.4.0/before/chat-before.png +0 -0
  7. package/docs/assets/v3.4.0/before/files-before.png +0 -0
  8. package/docs/assets/v3.4.0/chat.png +0 -0
  9. package/docs/assets/v3.4.0/connect-folder.png +0 -0
  10. package/docs/assets/v3.4.0/files.png +0 -0
  11. package/docs/assets/v3.4.0/home.png +0 -0
  12. package/docs/assets/v3.4.0/hooks-dispatch.png +0 -0
  13. package/docs/assets/v3.4.0/knowledge-graph.png +0 -0
  14. package/docs/assets/v3.4.0/local-agent.png +0 -0
  15. package/docs/assets/v3.4.0/memory.png +0 -0
  16. package/docs/assets/v3.4.0/settings.png +0 -0
  17. package/docs/assets/v3.4.0/vision-input.png +0 -0
  18. package/docs/assets/v3.4.0/workflows.png +0 -0
  19. package/knowledge_graph.py +45 -0
  20. package/knowledge_graph_api.py +10 -0
  21. package/latticeai/__init__.py +1 -1
  22. package/latticeai/api/agents.py +3 -0
  23. package/latticeai/api/hooks.py +39 -0
  24. package/latticeai/api/local_files.py +41 -0
  25. package/latticeai/api/models.py +36 -1
  26. package/latticeai/api/tools.py +16 -1
  27. package/latticeai/api/workflow_designer.py +2 -1
  28. package/latticeai/core/hooks.py +398 -2
  29. package/latticeai/core/marketplace.py +1 -1
  30. package/latticeai/core/multi_agent.py +1 -1
  31. package/latticeai/core/workflow_engine.py +21 -1
  32. package/latticeai/core/workspace_os.py +1 -1
  33. package/latticeai/server_app.py +40 -0
  34. package/latticeai/services/agent_runtime.py +46 -1
  35. package/latticeai/services/upload_service.py +17 -0
  36. package/package.json +1 -1
  37. package/scripts/capture/capture_v340.js +88 -0
  38. package/static/css/{tokens.8b8e31bd.css → tokens.3ba22e37.css} +109 -109
  39. package/static/css/tokens.css +109 -109
  40. package/static/v3/asset-manifest.json +24 -24
  41. package/static/v3/css/{lattice.components.011e988b.css → lattice.components.9b49d614.css} +57 -32
  42. package/static/v3/css/lattice.components.css +57 -32
  43. package/static/v3/css/{lattice.shell.4920f42d.css → lattice.shell.6ceea7c8.css} +75 -31
  44. package/static/v3/css/lattice.shell.css +75 -31
  45. package/static/v3/css/lattice.tokens.css +13 -13
  46. package/static/v3/css/{lattice.tokens.c597ff81.css → lattice.tokens.e7018963.css} +13 -13
  47. package/static/v3/css/{lattice.views.1d326beb.css → lattice.views.22f69117.css} +93 -15
  48. package/static/v3/css/lattice.views.css +93 -15
  49. package/static/v3/js/{app.cf5bb712.js → app.c4acfdd8.js} +1 -1
  50. package/static/v3/js/core/{api.113660c5.js → api.12b568ad.js} +67 -0
  51. package/static/v3/js/core/api.js +67 -0
  52. package/static/v3/js/core/{components.4c83e0a9.js → components.35f02e4c.js} +8 -0
  53. package/static/v3/js/core/components.js +8 -0
  54. package/static/v3/js/core/{routes.07ad6696.js → routes.d214b399.js} +16 -12
  55. package/static/v3/js/core/routes.js +16 -12
  56. package/static/v3/js/core/{shell.9e707234.js → shell.80a6ad82.js} +37 -9
  57. package/static/v3/js/core/shell.js +34 -6
  58. package/static/v3/js/views/agents.014d0b74.js +541 -0
  59. package/static/v3/js/views/agents.js +305 -57
  60. package/static/v3/js/views/{chat.c48fd9e2.js → chat.e6dd7dd0.js} +161 -9
  61. package/static/v3/js/views/chat.js +161 -9
  62. package/static/v3/js/views/files.adad14c1.js +365 -0
  63. package/static/v3/js/views/files.js +212 -79
  64. package/static/v3/js/views/home.24f8b8ae.js +200 -0
  65. package/static/v3/js/views/home.js +96 -15
  66. package/static/v3/js/views/hooks.13845954.js +215 -0
  67. package/static/v3/js/views/hooks.js +117 -1
  68. package/static/v3/js/views/{my-computer.1b2ff621.js → my-computer.c3ef5283.js} +224 -1
  69. package/static/v3/js/views/my-computer.js +224 -1
  70. package/static/v3/js/views/{settings.c7b0cc05.js → settings.8631fa5e.js} +54 -0
  71. package/static/v3/js/views/settings.js +54 -0
  72. package/static/v3/js/views/agents.c373d48c.js +0 -293
  73. package/static/v3/js/views/files.8464634a.js +0 -232
  74. package/static/v3/js/views/home.cdde3b32.js +0 -119
  75. package/static/v3/js/views/hooks.f3edebca.js +0 -99
@@ -1,5 +1,5 @@
1
1
  /* ============================================================================
2
- * Lattice AI — Design Tokens (Single Source of Truth) v3.3.0
2
+ * Lattice AI — Design Tokens (Single Source of Truth) v3.3.1
3
3
  *
4
4
  * 이 파일이 색·면·테두리·그림자·포커스의 단일 출처다.
5
5
  * :root → 라이트 테마 값
@@ -18,75 +18,75 @@
18
18
  color-scheme: light;
19
19
 
20
20
  /* ── Brand raw scale (불변, 테마 무관 기준점) ───────────────────────────── */
21
- --lt-color-primary-100: #dbeafe;
22
- --lt-color-primary-200: #bfdbfe;
23
- --lt-color-primary-400: #60a5fa;
24
- --lt-color-primary-600: #2563eb;
25
- --lt-color-primary-800: #1e3a8a;
26
- --lt-color-ink-900: #111827;
27
- --lt-color-accent-cyan: #0891b2;
28
- --lt-color-accent-green: #0f9f8f;
29
- --lt-color-accent-amber: #b7791f;
30
- --lt-color-accent-pink: #b83280;
21
+ --lt-color-primary-100: #dfe7ff;
22
+ --lt-color-primary-200: #c8d6ff;
23
+ --lt-color-primary-400: #7f9cff;
24
+ --lt-color-primary-600: #3b63f4;
25
+ --lt-color-primary-800: #203a8d;
26
+ --lt-color-ink-900: #141923;
27
+ --lt-color-accent-cyan: #0c9ca8;
28
+ --lt-color-accent-green: #0e9f91;
29
+ --lt-color-accent-amber: #c77d16;
30
+ --lt-color-accent-pink: #c33fb3;
31
31
 
32
32
  /* ╔══════════════════════════════════════════════════════════════════════╗
33
33
  ║ SEMANTIC TOKENS — LIGHT (neutral workspace palette) ║
34
34
  ╚══════════════════════════════════════════════════════════════════════╝ */
35
35
 
36
36
  /* background / surfaces */
37
- --bg: #f6f8f7;
38
- --bg-soft: #eef3f2;
37
+ --bg: #f5f7fb;
38
+ --bg-soft: #edf1f7;
39
39
  --surface: #ffffff;
40
- --surface-2: #f0f5f4;
41
- --surface-3: #e4ecea;
42
- --surface-muted: #edf3f2;
43
- --surface-elevated: rgba(255, 255, 255, 0.94);
44
- --card: rgba(255, 255, 255, 0.92);
45
- --sidebar: rgba(255, 255, 255, 0.94);
40
+ --surface-2: #eef2f7;
41
+ --surface-3: #e1e7ef;
42
+ --surface-muted: #e9eef6;
43
+ --surface-elevated: rgba(255, 255, 255, 0.96);
44
+ --card: rgba(255, 255, 255, 0.94);
45
+ --sidebar: rgba(249, 251, 255, 0.96);
46
46
  --modal: rgba(255, 255, 255, 0.98);
47
47
  --table: rgba(255, 255, 255, 0.78);
48
48
  --input: rgba(255, 255, 255, 0.86);
49
- --overlay: rgba(15, 23, 42, 0.44);
49
+ --overlay: rgba(20, 25, 35, 0.48);
50
50
  --overlay-scrim: var(--overlay);
51
51
  --app-bg:
52
- linear-gradient(180deg, #f8faf9 0%, #eef4f2 54%, #f7faf9 100%);
52
+ linear-gradient(180deg, #f8faff 0%, #eef3fa 48%, #f5f7fb 100%);
53
53
 
54
54
  /* text */
55
- --text: #24223d;
56
- --muted: #475569; /* muted-text */
57
- --faint: #70818f;
55
+ --text: #1e2430;
56
+ --muted: #526071; /* muted-text */
57
+ --faint: #7a8798;
58
58
  --text-muted: var(--muted);
59
59
 
60
60
  /* border / line */
61
- --border: rgba(15, 23, 42, 0.12);
62
- --border-strong: rgba(15, 23, 42, 0.22);
63
- --line: rgba(15, 23, 42, 0.10);
64
- --line-strong: rgba(15, 23, 42, 0.18);
61
+ --border: rgba(30, 36, 48, 0.12);
62
+ --border-strong: rgba(30, 36, 48, 0.22);
63
+ --line: rgba(30, 36, 48, 0.09);
64
+ --line-strong: rgba(30, 36, 48, 0.18);
65
65
 
66
66
  /* accent */
67
- --accent: #2563eb;
68
- --accent-2: #0f9f8f;
69
- --accent-3: #b7791f;
70
- --accent-pink: #b83280;
71
- --accent-soft: rgba(37, 99, 235, 0.10);
72
- --accent-deep: #1d4ed8;
67
+ --accent: #3b63f4;
68
+ --accent-2: #0e9f91;
69
+ --accent-3: #c77d16;
70
+ --accent-pink: #c33fb3;
71
+ --accent-soft: rgba(59, 99, 244, 0.11);
72
+ --accent-deep: #2f4fd0;
73
73
 
74
74
  /* status */
75
- --success: #0f8f6d;
76
- --warning: #a16207;
77
- --danger: #c2410c;
75
+ --success: #0d8f70;
76
+ --warning: #a45f07;
77
+ --danger: #bf3e2f;
78
78
 
79
79
  /* graph */
80
- --graph-bg: #f8faf9;
81
- --graph-grid: rgba(12, 92, 115, 0.08);
80
+ --graph-bg: #f8faff;
81
+ --graph-grid: rgba(59, 99, 244, 0.09);
82
82
  --graph-pill: rgba(255, 255, 255, 0.92);
83
83
 
84
84
  /* shadow */
85
- --shadow: 0 18px 50px rgba(15, 23, 42, 0.10);
86
- --shadow-sm: 0 8px 22px rgba(15, 23, 42, 0.08);
85
+ --shadow: 0 18px 48px rgba(30, 36, 48, 0.11);
86
+ --shadow-sm: 0 8px 20px rgba(30, 36, 48, 0.08);
87
87
 
88
88
  /* focus ring */
89
- --focus-ring: rgba(37, 99, 235, 0.55);
89
+ --focus-ring: rgba(59, 99, 244, 0.56);
90
90
 
91
91
  /* ── 구조 토큰(색 아님) ─────────────────────────────────────────────── */
92
92
  --radius: 14px;
@@ -123,17 +123,17 @@
123
123
 
124
124
  /* ── --lt-* 별칭 (workspace.css / platform.css 가 참조) — LIGHT ──────────
125
125
  순환참조를 피하려 구체값으로 둔다(소비자가 --bg 등을 --lt-* 로 재정의해도 안전). */
126
- --lt-bg: #f6f8f7;
126
+ --lt-bg: #f5f7fb;
127
127
  --lt-surface: #ffffff;
128
- --lt-surface-2: #f0f5f4;
128
+ --lt-surface-2: #eef2f7;
129
129
  --lt-input: rgba(255, 255, 255, 0.86);
130
- --lt-ink: #24223d;
131
- --lt-ink-soft: #475569;
132
- --lt-muted: #70818f;
133
- --lt-line: rgba(15, 23, 42, 0.12);
134
- --lt-accent: #2563eb;
135
- --lt-accent-2: #0f9f8f;
136
- --lt-shadow-md: 0 18px 50px rgba(15, 23, 42, 0.10);
130
+ --lt-ink: #1e2430;
131
+ --lt-ink-soft: #526071;
132
+ --lt-muted: #7a8798;
133
+ --lt-line: rgba(30, 36, 48, 0.12);
134
+ --lt-accent: #3b63f4;
135
+ --lt-accent-2: #0e9f91;
136
+ --lt-shadow-md: 0 18px 48px rgba(30, 36, 48, 0.11);
137
137
 
138
138
  /* ── 모션 / 타이포 ─────────────────────────────────────────────────── */
139
139
  --lt-motion-ease: cubic-bezier(0.22, 1, 0.36, 1);
@@ -145,63 +145,63 @@
145
145
  :root[data-lt-theme="dark"] {
146
146
  color-scheme: dark;
147
147
 
148
- --bg: #101418;
149
- --bg-soft: #151b20;
150
- --surface: #1b2328;
151
- --surface-2: #202b31;
152
- --surface-3: #29363d;
153
- --surface-muted: #151d22;
154
- --surface-elevated: #253139;
155
- --card: rgba(255, 255, 255, 0.055);
156
- --sidebar: #11191d;
157
- --modal: rgba(27, 35, 40, 0.98);
148
+ --bg: #0d1017;
149
+ --bg-soft: #111722;
150
+ --surface: #151b26;
151
+ --surface-2: #1b2330;
152
+ --surface-3: #263142;
153
+ --surface-muted: #111925;
154
+ --surface-elevated: #202a38;
155
+ --card: rgba(255, 255, 255, 0.06);
156
+ --sidebar: #0f141d;
157
+ --modal: rgba(21, 27, 38, 0.98);
158
158
  --table: rgba(255, 255, 255, 0.045);
159
159
  --input: rgba(255, 255, 255, 0.065);
160
- --overlay: rgba(0, 0, 0, 0.64);
160
+ --overlay: rgba(0, 0, 0, 0.66);
161
161
  --overlay-scrim: var(--overlay);
162
162
  --app-bg:
163
- linear-gradient(180deg, #101418 0%, #151d22 54%, #101418 100%);
163
+ linear-gradient(180deg, #0d1017 0%, #121a27 50%, #0d1017 100%);
164
164
 
165
- --text: #edf3f2;
166
- --muted: #b8c5c2;
167
- --faint: #849894;
165
+ --text: #eef3fb;
166
+ --muted: #b8c3d2;
167
+ --faint: #8290a3;
168
168
  --text-muted: var(--muted);
169
169
 
170
- --border: rgba(196, 213, 208, 0.18);
171
- --border-strong: rgba(196, 213, 208, 0.30);
172
- --line: rgba(196, 213, 208, 0.14);
173
- --line-strong: rgba(196, 213, 208, 0.24);
170
+ --border: rgba(207, 217, 231, 0.16);
171
+ --border-strong: rgba(207, 217, 231, 0.28);
172
+ --line: rgba(207, 217, 231, 0.12);
173
+ --line-strong: rgba(207, 217, 231, 0.22);
174
174
 
175
- --accent: #0284c7;
176
- --accent-2: #0f766e;
177
- --accent-3: #facc15;
178
- --accent-pink: #f0abfc;
179
- --accent-soft: rgba(2, 132, 199, 0.20);
180
- --accent-deep: #0369a1;
175
+ --accent: #7f9cff;
176
+ --accent-2: #4dd8c2;
177
+ --accent-3: #f2bc57;
178
+ --accent-pink: #f47ac2;
179
+ --accent-soft: rgba(127, 156, 255, 0.18);
180
+ --accent-deep: #a8bbff;
181
181
 
182
182
  --success: #34d399;
183
- --warning: #fbbf24;
184
- --danger: #fb923c;
183
+ --warning: #f2bc57;
184
+ --danger: #ff8a72;
185
185
 
186
- --graph-bg: #0f1518;
187
- --graph-grid: rgba(94, 234, 212, 0.08);
188
- --graph-pill: rgba(27, 35, 40, 0.92);
186
+ --graph-bg: #0f141d;
187
+ --graph-grid: rgba(127, 156, 255, 0.10);
188
+ --graph-pill: rgba(21, 27, 38, 0.92);
189
189
 
190
190
  --shadow: 0 18px 54px rgba(0, 0, 0, 0.50);
191
191
  --shadow-sm: 0 8px 24px rgba(0, 0, 0, 0.42);
192
192
 
193
- --focus-ring: rgba(125, 211, 252, 0.70);
193
+ --focus-ring: rgba(127, 156, 255, 0.70);
194
194
 
195
- --lt-bg: #101418;
196
- --lt-surface: #1b2328;
197
- --lt-surface-2: #202b31;
195
+ --lt-bg: #0d1017;
196
+ --lt-surface: #151b26;
197
+ --lt-surface-2: #1b2330;
198
198
  --lt-input: rgba(255, 255, 255, 0.065);
199
- --lt-ink: #edf3f2;
200
- --lt-ink-soft: #b8c5c2;
201
- --lt-muted: #849894;
202
- --lt-line: rgba(196, 213, 208, 0.18);
203
- --lt-accent: #0284c7;
204
- --lt-accent-2: #0f766e;
199
+ --lt-ink: #eef3fb;
200
+ --lt-ink-soft: #b8c3d2;
201
+ --lt-muted: #8290a3;
202
+ --lt-line: rgba(207, 217, 231, 0.16);
203
+ --lt-accent: #7f9cff;
204
+ --lt-accent-2: #4dd8c2;
205
205
  --lt-shadow-md: 0 18px 54px rgba(0, 0, 0, 0.50);
206
206
 
207
207
  --ref-indigo: #93c5fd;
@@ -213,26 +213,26 @@
213
213
  @media (prefers-color-scheme: dark) {
214
214
  :root:not([data-lt-theme="light"]):not([data-lt-theme="dark"]) {
215
215
  color-scheme: dark;
216
- --bg: #101418; --bg-soft: #151b20;
217
- --surface: #1b2328; --surface-2: #202b31; --surface-3: #29363d;
218
- --surface-muted: #151d22; --surface-elevated: #253139;
219
- --card: rgba(255,255,255,0.055); --sidebar: #11191d;
220
- --modal: rgba(27,35,40,0.98); --table: rgba(255,255,255,0.045);
221
- --input: rgba(255,255,255,0.065); --overlay: rgba(0,0,0,0.64); --overlay-scrim: var(--overlay);
216
+ --bg: #0d1017; --bg-soft: #111722;
217
+ --surface: #151b26; --surface-2: #1b2330; --surface-3: #263142;
218
+ --surface-muted: #111925; --surface-elevated: #202a38;
219
+ --card: rgba(255,255,255,0.06); --sidebar: #0f141d;
220
+ --modal: rgba(21,27,38,0.98); --table: rgba(255,255,255,0.045);
221
+ --input: rgba(255,255,255,0.065); --overlay: rgba(0,0,0,0.66); --overlay-scrim: var(--overlay);
222
222
  --app-bg:
223
- linear-gradient(180deg, #101418 0%, #151d22 54%, #101418 100%);
224
- --text: #edf3f2; --muted: #b8c5c2; --faint: #849894; --text-muted: var(--muted);
225
- --border: rgba(196,213,208,0.18); --border-strong: rgba(196,213,208,0.30);
226
- --line: rgba(196,213,208,0.14); --line-strong: rgba(196,213,208,0.24);
227
- --accent: #0284c7; --accent-2: #0f766e; --accent-3: #facc15;
228
- --accent-pink: #f0abfc; --accent-soft: rgba(2,132,199,0.20); --accent-deep: #0369a1;
229
- --success: #34d399; --warning: #fbbf24; --danger: #fb923c;
230
- --graph-bg: #0f1518; --graph-grid: rgba(94,234,212,0.08); --graph-pill: rgba(27,35,40,0.92);
223
+ linear-gradient(180deg, #0d1017 0%, #121a27 50%, #0d1017 100%);
224
+ --text: #eef3fb; --muted: #b8c3d2; --faint: #8290a3; --text-muted: var(--muted);
225
+ --border: rgba(207,217,231,0.16); --border-strong: rgba(207,217,231,0.28);
226
+ --line: rgba(207,217,231,0.12); --line-strong: rgba(207,217,231,0.22);
227
+ --accent: #7f9cff; --accent-2: #4dd8c2; --accent-3: #f2bc57;
228
+ --accent-pink: #f47ac2; --accent-soft: rgba(127,156,255,0.18); --accent-deep: #a8bbff;
229
+ --success: #34d399; --warning: #f2bc57; --danger: #ff8a72;
230
+ --graph-bg: #0f141d; --graph-grid: rgba(127,156,255,0.10); --graph-pill: rgba(21,27,38,0.92);
231
231
  --shadow: 0 18px 54px rgba(0,0,0,0.50); --shadow-sm: 0 8px 24px rgba(0,0,0,0.42);
232
- --focus-ring: rgba(125,211,252,0.70);
233
- --lt-bg: #101418; --lt-surface: #1b2328; --lt-surface-2: #202b31; --lt-input: rgba(255,255,255,0.065);
234
- --lt-ink: #edf3f2; --lt-ink-soft: #b8c5c2; --lt-muted: #849894;
235
- --lt-line: rgba(196,213,208,0.18); --lt-accent: #0284c7; --lt-accent-2: #0f766e;
232
+ --focus-ring: rgba(127,156,255,0.70);
233
+ --lt-bg: #0d1017; --lt-surface: #151b26; --lt-surface-2: #1b2330; --lt-input: rgba(255,255,255,0.065);
234
+ --lt-ink: #eef3fb; --lt-ink-soft: #b8c3d2; --lt-muted: #8290a3;
235
+ --lt-line: rgba(207,217,231,0.16); --lt-accent: #7f9cff; --lt-accent-2: #4dd8c2;
236
236
  --lt-shadow-md: 0 18px 54px rgba(0,0,0,0.50);
237
237
  }
238
238
  }
@@ -1,31 +1,31 @@
1
1
  {
2
- "version": "3.3.0",
2
+ "version": "3.4.0",
3
3
  "generated_at": "deterministic",
4
4
  "entrypoints": {
5
- "app": "/static/v3/js/app.cf5bb712.js",
5
+ "app": "/static/v3/js/app.c4acfdd8.js",
6
6
  "styles": [
7
- "/static/css/tokens.8b8e31bd.css",
8
- "/static/v3/css/lattice.tokens.c597ff81.css",
7
+ "/static/css/tokens.3ba22e37.css",
8
+ "/static/v3/css/lattice.tokens.e7018963.css",
9
9
  "/static/v3/css/lattice.base.e4cdd05d.css",
10
- "/static/v3/css/lattice.components.011e988b.css",
11
- "/static/v3/css/lattice.shell.4920f42d.css",
12
- "/static/v3/css/lattice.views.1d326beb.css"
10
+ "/static/v3/css/lattice.components.9b49d614.css",
11
+ "/static/v3/css/lattice.shell.6ceea7c8.css",
12
+ "/static/v3/css/lattice.views.22f69117.css"
13
13
  ]
14
14
  },
15
15
  "assets": {
16
- "static/css/tokens.css": "/static/css/tokens.8b8e31bd.css",
17
- "static/v3/css/lattice.tokens.css": "/static/v3/css/lattice.tokens.c597ff81.css",
16
+ "static/css/tokens.css": "/static/css/tokens.3ba22e37.css",
17
+ "static/v3/css/lattice.tokens.css": "/static/v3/css/lattice.tokens.e7018963.css",
18
18
  "static/v3/css/lattice.base.css": "/static/v3/css/lattice.base.e4cdd05d.css",
19
- "static/v3/css/lattice.components.css": "/static/v3/css/lattice.components.011e988b.css",
20
- "static/v3/css/lattice.shell.css": "/static/v3/css/lattice.shell.4920f42d.css",
21
- "static/v3/css/lattice.views.css": "/static/v3/css/lattice.views.1d326beb.css",
22
- "static/v3/js/app.js": "/static/v3/js/app.cf5bb712.js",
23
- "static/v3/js/core/api.js": "/static/v3/js/core/api.113660c5.js",
24
- "static/v3/js/core/components.js": "/static/v3/js/core/components.4c83e0a9.js",
19
+ "static/v3/css/lattice.components.css": "/static/v3/css/lattice.components.9b49d614.css",
20
+ "static/v3/css/lattice.shell.css": "/static/v3/css/lattice.shell.6ceea7c8.css",
21
+ "static/v3/css/lattice.views.css": "/static/v3/css/lattice.views.22f69117.css",
22
+ "static/v3/js/app.js": "/static/v3/js/app.c4acfdd8.js",
23
+ "static/v3/js/core/api.js": "/static/v3/js/core/api.12b568ad.js",
24
+ "static/v3/js/core/components.js": "/static/v3/js/core/components.35f02e4c.js",
25
25
  "static/v3/js/core/dom.js": "/static/v3/js/core/dom.a2773eb0.js",
26
26
  "static/v3/js/core/router.js": "/static/v3/js/core/router.584570f2.js",
27
- "static/v3/js/core/routes.js": "/static/v3/js/core/routes.07ad6696.js",
28
- "static/v3/js/core/shell.js": "/static/v3/js/core/shell.9e707234.js",
27
+ "static/v3/js/core/routes.js": "/static/v3/js/core/routes.d214b399.js",
28
+ "static/v3/js/core/shell.js": "/static/v3/js/core/shell.80a6ad82.js",
29
29
  "static/v3/js/core/store.js": "/static/v3/js/core/store.34ebd5e6.js",
30
30
  "static/v3/js/views/admin-audit.js": "/static/v3/js/views/admin-audit.660a1fb1.js",
31
31
  "static/v3/js/views/admin-permissions.js": "/static/v3/js/views/admin-permissions.a7ae5f09.js",
@@ -33,21 +33,21 @@
33
33
  "static/v3/js/views/admin-private-vpc.js": "/static/v3/js/views/admin-private-vpc.7d342d36.js",
34
34
  "static/v3/js/views/admin-security.js": "/static/v3/js/views/admin-security.07c66b72.js",
35
35
  "static/v3/js/views/admin-users.js": "/static/v3/js/views/admin-users.03bac88c.js",
36
- "static/v3/js/views/agents.js": "/static/v3/js/views/agents.c373d48c.js",
37
- "static/v3/js/views/chat.js": "/static/v3/js/views/chat.c48fd9e2.js",
38
- "static/v3/js/views/files.js": "/static/v3/js/views/files.8464634a.js",
39
- "static/v3/js/views/home.js": "/static/v3/js/views/home.cdde3b32.js",
40
- "static/v3/js/views/hooks.js": "/static/v3/js/views/hooks.f3edebca.js",
36
+ "static/v3/js/views/agents.js": "/static/v3/js/views/agents.014d0b74.js",
37
+ "static/v3/js/views/chat.js": "/static/v3/js/views/chat.e6dd7dd0.js",
38
+ "static/v3/js/views/files.js": "/static/v3/js/views/files.adad14c1.js",
39
+ "static/v3/js/views/home.js": "/static/v3/js/views/home.24f8b8ae.js",
40
+ "static/v3/js/views/hooks.js": "/static/v3/js/views/hooks.13845954.js",
41
41
  "static/v3/js/views/hybrid-search.js": "/static/v3/js/views/hybrid-search.b22b97e0.js",
42
42
  "static/v3/js/views/knowledge-graph.js": "/static/v3/js/views/knowledge-graph.a14ea7e7.js",
43
43
  "static/v3/js/views/marketplace.js": "/static/v3/js/views/marketplace.ab0583d4.js",
44
44
  "static/v3/js/views/mcp.js": "/static/v3/js/views/mcp.99b5c6a7.js",
45
45
  "static/v3/js/views/memory.js": "/static/v3/js/views/memory.4ebdf474.js",
46
46
  "static/v3/js/views/models.js": "/static/v3/js/views/models.a1ffa147.js",
47
- "static/v3/js/views/my-computer.js": "/static/v3/js/views/my-computer.1b2ff621.js",
47
+ "static/v3/js/views/my-computer.js": "/static/v3/js/views/my-computer.c3ef5283.js",
48
48
  "static/v3/js/views/pipeline.js": "/static/v3/js/views/pipeline.c522f1ce.js",
49
49
  "static/v3/js/views/planning.js": "/static/v3/js/views/planning.9ac3e313.js",
50
- "static/v3/js/views/settings.js": "/static/v3/js/views/settings.c7b0cc05.js",
50
+ "static/v3/js/views/settings.js": "/static/v3/js/views/settings.8631fa5e.js",
51
51
  "static/v3/js/views/skills.js": "/static/v3/js/views/skills.c6c2f965.js",
52
52
  "static/v3/js/views/tools.js": "/static/v3/js/views/tools.e4f11276.js",
53
53
  "static/v3/js/views/workflows.js": "/static/v3/js/views/workflows.26c57290.js"
@@ -37,20 +37,21 @@
37
37
  .lt3-card,
38
38
  .lt3-panel {
39
39
  position: relative;
40
- background: var(--surface);
40
+ background: var(--card);
41
41
  border: 1px solid var(--border);
42
- border-radius: var(--lt3-radius-lg);
42
+ border-radius: var(--lt3-radius-md);
43
43
  box-shadow: var(--lt3-elev-1);
44
44
  }
45
45
  .lt3-panel { padding: var(--lt3-space-5); }
46
46
  .lt3-card { padding: var(--lt3-space-4); }
47
47
  .lt3-card--flat { box-shadow: none; background: var(--surface-2); }
48
48
  .lt3-card--ghost { background: transparent; border-style: dashed; box-shadow: none; }
49
- .lt3-card--interactive { transition: transform var(--lt3-dur-2) var(--lt3-ease), border-color var(--lt3-dur-2) var(--lt3-ease), box-shadow var(--lt3-dur-2) var(--lt3-ease); }
49
+ .lt3-card--interactive { transition: transform var(--lt3-dur-2) var(--lt3-ease), border-color var(--lt3-dur-2) var(--lt3-ease), box-shadow var(--lt3-dur-2) var(--lt3-ease), background var(--lt3-dur-2) var(--lt3-ease); }
50
50
  .lt3-card--interactive:hover {
51
- transform: translateY(-2px);
52
- border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
53
- box-shadow: var(--lt3-elev-2);
51
+ transform: translateY(-1px);
52
+ border-color: color-mix(in srgb, var(--accent) 42%, var(--border));
53
+ background: var(--surface);
54
+ box-shadow: var(--lt3-elev-1);
54
55
  }
55
56
 
56
57
  .lt3-panel__head {
@@ -61,7 +62,7 @@
61
62
  margin-bottom: var(--lt3-space-4);
62
63
  }
63
64
  .lt3-panel__title {
64
- font-size: var(--lt3-text-lg);
65
+ font-size: var(--lt3-text-md);
65
66
  font-weight: var(--lt3-weight-semi);
66
67
  letter-spacing: var(--lt3-tracking-tight);
67
68
  }
@@ -73,7 +74,7 @@
73
74
  align-items: center;
74
75
  justify-content: center;
75
76
  gap: var(--lt3-space-2);
76
- height: 38px;
77
+ height: 36px;
77
78
  padding: 0 var(--lt3-space-4);
78
79
  border-radius: var(--lt3-radius-sm);
79
80
  border: 1px solid transparent;
@@ -95,15 +96,15 @@
95
96
  .lt3-btn--danger { background: var(--lt3-err-soft); color: var(--danger); border-color: color-mix(in srgb, var(--danger) 35%, transparent); }
96
97
  .lt3-btn--danger:hover { background: color-mix(in srgb, var(--danger) 24%, transparent); }
97
98
  .lt3-btn--sm { height: 30px; padding: 0 var(--lt3-space-3); font-size: var(--lt3-text-xs); }
98
- .lt3-btn--lg { height: 46px; padding: 0 var(--lt3-space-5); font-size: var(--lt3-text-md); }
99
+ .lt3-btn--lg { height: 42px; padding: 0 var(--lt3-space-5); font-size: var(--lt3-text-sm); }
99
100
  .lt3-btn--block { width: 100%; }
100
101
 
101
102
  .lt3-iconbtn {
102
103
  display: inline-flex;
103
104
  align-items: center;
104
105
  justify-content: center;
105
- width: 38px;
106
- height: 38px;
106
+ width: 36px;
107
+ height: 36px;
107
108
  border-radius: var(--lt3-radius-sm);
108
109
  color: var(--muted);
109
110
  transition: background var(--lt3-dur-2) var(--lt3-ease), color var(--lt3-dur-2) var(--lt3-ease);
@@ -115,8 +116,8 @@
115
116
  /* ── Inputs ─────────────────────────────────────────────────────────────── */
116
117
  .lt3-input, .lt3-select, .lt3-textarea {
117
118
  width: 100%;
118
- height: 40px;
119
- padding: 0 var(--lt3-space-4);
119
+ height: 38px;
120
+ padding: 0 var(--lt3-space-3);
120
121
  background: var(--input);
121
122
  border: 1px solid var(--border);
122
123
  border-radius: var(--lt3-radius-sm);
@@ -133,12 +134,13 @@
133
134
  }
134
135
  .lt3-field { display: flex; flex-direction: column; gap: var(--lt3-space-2); }
135
136
  .lt3-label { font-size: var(--lt3-text-xs); font-weight: var(--lt3-weight-medium); color: var(--muted); }
137
+ .lt3-help { font-size: var(--lt3-text-xs); color: var(--faint); }
136
138
 
137
139
  .lt3-search {
138
140
  display: flex;
139
141
  align-items: center;
140
142
  gap: var(--lt3-space-2);
141
- height: 44px;
143
+ height: 40px;
142
144
  padding: 0 var(--lt3-space-4);
143
145
  background: var(--input);
144
146
  border: 1px solid var(--border);
@@ -221,22 +223,40 @@
221
223
 
222
224
  /* ── Stat tile ──────────────────────────────────────────────────────────── */
223
225
  .lt3-stat {
224
- display: flex;
225
- flex-direction: column;
226
- gap: var(--lt3-space-1);
227
- padding: var(--lt3-space-4) var(--lt3-space-5);
228
- background: var(--surface);
226
+ display: grid;
227
+ grid-template-columns: minmax(0, 1fr) auto;
228
+ align-items: start;
229
+ gap: var(--lt3-space-2);
230
+ min-height: 88px;
231
+ padding: var(--lt3-space-4);
232
+ background: var(--card);
229
233
  border: 1px solid var(--border);
230
234
  border-radius: var(--lt3-radius-md);
231
235
  }
232
- .lt3-stat__label { font-size: var(--lt3-text-xs); color: var(--muted); display: flex; align-items: center; gap: var(--lt3-space-2); }
236
+ .lt3-stat__label {
237
+ grid-column: 1 / -1;
238
+ font-size: var(--lt3-text-xs);
239
+ color: var(--muted);
240
+ display: flex;
241
+ align-items: center;
242
+ gap: var(--lt3-space-2);
243
+ }
244
+ .lt3-stat__label .ti {
245
+ display: inline-grid;
246
+ place-items: center;
247
+ width: 24px;
248
+ height: 24px;
249
+ border-radius: var(--lt3-radius-xs);
250
+ background: var(--surface-2);
251
+ color: var(--accent);
252
+ }
233
253
  .lt3-stat__value { font-size: var(--lt3-text-2xl); font-weight: var(--lt3-weight-bold); letter-spacing: var(--lt3-tracking-tight); line-height: 1.1; }
234
- .lt3-stat__delta { font-size: var(--lt3-text-2xs); color: var(--muted); }
254
+ .lt3-stat__delta { justify-self: end; font-size: var(--lt3-text-2xs); color: var(--muted); }
235
255
  .lt3-stat__delta--up { color: var(--success); }
236
256
  .lt3-stat__delta--down { color: var(--danger); }
237
257
 
238
258
  /* ── Tables ─────────────────────────────────────────────────────────────── */
239
- .lt3-table { width: 100%; border-collapse: collapse; font-size: var(--lt3-text-sm); }
259
+ .lt3-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--lt3-text-sm); }
240
260
  .lt3-table th {
241
261
  text-align: left;
242
262
  font-size: var(--lt3-text-2xs);
@@ -244,19 +264,19 @@
244
264
  letter-spacing: var(--lt3-tracking-caps);
245
265
  text-transform: uppercase;
246
266
  color: var(--faint);
247
- padding: var(--lt3-space-3) var(--lt3-space-3);
267
+ padding: var(--lt3-space-3) var(--lt3-space-4);
248
268
  border-bottom: 1px solid var(--border);
249
- position: sticky; top: 0; background: var(--surface); z-index: 1;
269
+ position: sticky; top: 0; background: var(--surface-elevated); z-index: 1;
250
270
  }
251
271
  .lt3-table td {
252
- padding: var(--lt3-space-3) var(--lt3-space-3);
272
+ padding: var(--lt3-space-3) var(--lt3-space-4);
253
273
  border-bottom: 1px solid var(--line);
254
274
  vertical-align: middle;
255
275
  }
256
276
  .lt3-table tr:last-child td { border-bottom: none; }
257
277
  .lt3-table tbody tr { transition: background var(--lt3-dur-1) var(--lt3-ease); }
258
278
  .lt3-table tbody tr:hover { background: var(--surface-2); }
259
- .lt3-table--clip { border: 1px solid var(--border); border-radius: var(--lt3-radius-md); overflow: hidden; }
279
+ .lt3-table--clip { border: 1px solid var(--border); border-radius: var(--lt3-radius-md); overflow: hidden; background: var(--card); }
260
280
 
261
281
  /* ── List rows ──────────────────────────────────────────────────────────── */
262
282
  .lt3-list { display: flex; flex-direction: column; }
@@ -292,11 +312,11 @@
292
312
  gap: 2px;
293
313
  background: var(--surface-2);
294
314
  border: 1px solid var(--border);
295
- border-radius: var(--lt3-radius-sm);
315
+ border-radius: var(--lt3-radius-md);
296
316
  }
297
317
  .lt3-seg button {
298
318
  padding: var(--lt3-space-2) var(--lt3-space-3);
299
- border-radius: 7px;
319
+ border-radius: var(--lt3-radius-sm);
300
320
  font-size: var(--lt3-text-xs);
301
321
  font-weight: var(--lt3-weight-semi);
302
322
  color: var(--muted);
@@ -348,19 +368,24 @@
348
368
  .lt3-empty {
349
369
  display: flex; flex-direction: column; align-items: center; justify-content: center;
350
370
  gap: var(--lt3-space-3);
351
- padding: var(--lt3-space-8) var(--lt3-space-5);
371
+ min-height: 220px;
372
+ padding: var(--lt3-space-7) var(--lt3-space-5);
352
373
  text-align: center;
353
374
  color: var(--muted);
375
+ background:
376
+ linear-gradient(180deg, color-mix(in srgb, var(--surface-2) 64%, transparent), transparent);
377
+ border: 1px dashed var(--border);
378
+ border-radius: var(--lt3-radius-md);
354
379
  }
355
380
  .lt3-empty__icon {
356
381
  display: grid; place-items: center;
357
- width: 56px; height: 56px;
358
- border-radius: var(--lt3-radius-lg);
382
+ width: 44px; height: 44px;
383
+ border-radius: var(--lt3-radius-md);
359
384
  background: var(--surface-2);
360
385
  border: 1px solid var(--border);
361
386
  color: var(--faint);
362
387
  }
363
- .lt3-empty__icon .ti { font-size: 1.6rem; }
388
+ .lt3-empty__icon .ti { font-size: 1.35rem; }
364
389
  .lt3-empty__title { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-semi); color: var(--text); }
365
390
  .lt3-empty__body { font-size: var(--lt3-text-sm); max-width: 38ch; }
366
391