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
@@ -1,5 +1,5 @@
1
1
  /* ============================================================================
2
- * Lattice AI — Design Tokens (Single Source of Truth) v2.2.7
2
+ * Lattice AI — Design Tokens (Single Source of Truth) v3.0.0
3
3
  *
4
4
  * 이 파일이 색·면·테두리·그림자·포커스의 단일 출처다.
5
5
  * :root → 라이트 테마 값
@@ -18,78 +18,75 @@
18
18
  color-scheme: light;
19
19
 
20
20
  /* ── Brand raw scale (불변, 테마 무관 기준점) ───────────────────────────── */
21
- --lt-color-primary-100: #EAE2FD;
22
- --lt-color-primary-200: #D3C2FB;
23
- --lt-color-primary-400: #9A78F0;
24
- --lt-color-primary-600: #6E4AE6;
25
- --lt-color-primary-800: #3B1F8E;
26
- --lt-color-ink-900: #0E102A;
27
- --lt-color-accent-cyan: #18C6D9;
28
- --lt-color-accent-green: #2FC28E;
29
- --lt-color-accent-amber: #F1A52A;
30
- --lt-color-accent-pink: #F060B8;
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;
31
31
 
32
32
  /* ╔══════════════════════════════════════════════════════════════════════╗
33
- ║ SEMANTIC TOKENS — LIGHT (현재 라벤더 룩 보존)
33
+ ║ SEMANTIC TOKENS — LIGHT (neutral workspace palette)
34
34
  ╚══════════════════════════════════════════════════════════════════════╝ */
35
35
 
36
36
  /* background / surfaces */
37
- --bg: #f3ecff;
38
- --bg-soft: #ede6ff;
39
- --surface: #f6f0ff;
40
- --surface-2: #efe8ff;
41
- --surface-3: #e8dfff;
42
- --surface-muted: #efe8ff;
43
- --surface-elevated: rgba(255, 255, 255, 0.92);
44
- --card: rgba(255, 255, 255, 0.90);
45
- --sidebar: rgba(244, 237, 255, 0.96);
46
- --modal: rgba(247, 242, 255, 0.98);
47
- --table: rgba(255, 255, 255, 0.72);
48
- --input: rgba(255, 255, 255, 0.80);
49
- --overlay: rgba(20, 16, 40, 0.42);
37
+ --bg: #f6f8f7;
38
+ --bg-soft: #eef3f2;
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);
46
+ --modal: rgba(255, 255, 255, 0.98);
47
+ --table: rgba(255, 255, 255, 0.78);
48
+ --input: rgba(255, 255, 255, 0.86);
49
+ --overlay: rgba(15, 23, 42, 0.44);
50
50
  --overlay-scrim: var(--overlay);
51
- /* decorative page background (그라데이션 한 토큰) */
52
51
  --app-bg:
53
- radial-gradient(circle at 82% 12%, rgba(111, 66, 232, 0.14), transparent 30%),
54
- radial-gradient(circle at 10% 80%, rgba(180, 160, 255, 0.16), transparent 35%),
55
- linear-gradient(180deg, #f3ecff 0%, #efe8ff 52%, #f2ecff 100%);
52
+ linear-gradient(180deg, #f8faf9 0%, #eef4f2 54%, #f7faf9 100%);
56
53
 
57
54
  /* text */
58
- --text: #14162c;
59
- --muted: #4a4668; /* muted-text */
60
- --faint: #7a74a0;
55
+ --text: #24223d;
56
+ --muted: #475569; /* muted-text */
57
+ --faint: #70818f;
61
58
  --text-muted: var(--muted);
62
59
 
63
60
  /* border / line */
64
- --border: rgba(111, 66, 232, 0.14);
65
- --border-strong: rgba(111, 66, 232, 0.26);
66
- --line: rgba(111, 66, 232, 0.12);
67
- --line-strong: rgba(111, 66, 232, 0.22);
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);
68
65
 
69
66
  /* accent */
70
- --accent: #6f42e8;
71
- --accent-2: #8b6cff;
72
- --accent-3: #a78fff;
73
- --accent-pink: #c084fc;
74
- --accent-soft: rgba(111, 66, 232, 0.12);
75
- --accent-deep: #3B1F8E;
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;
76
73
 
77
74
  /* status */
78
- --success: #1f9d6b;
79
- --warning: #b4690e;
80
- --danger: #e53935;
75
+ --success: #0f8f6d;
76
+ --warning: #a16207;
77
+ --danger: #c2410c;
81
78
 
82
79
  /* graph */
83
- --graph-bg: #fbfaff;
84
- --graph-grid: rgba(111, 66, 232, 0.06);
85
- --graph-pill: rgba(255, 255, 255, 0.90);
80
+ --graph-bg: #f8faf9;
81
+ --graph-grid: rgba(12, 92, 115, 0.08);
82
+ --graph-pill: rgba(255, 255, 255, 0.92);
86
83
 
87
84
  /* shadow */
88
- --shadow: 0 18px 54px rgba(88, 72, 150, 0.15);
89
- --shadow-sm: 0 8px 24px rgba(88, 72, 150, 0.11);
85
+ --shadow: 0 18px 50px rgba(15, 23, 42, 0.10);
86
+ --shadow-sm: 0 8px 22px rgba(15, 23, 42, 0.08);
90
87
 
91
88
  /* focus ring */
92
- --focus-ring: rgba(110, 74, 230, 0.55);
89
+ --focus-ring: rgba(37, 99, 235, 0.55);
93
90
 
94
91
  /* ── 구조 토큰(색 아님) ─────────────────────────────────────────────── */
95
92
  --radius: 14px;
@@ -110,12 +107,12 @@
110
107
  --panel-2: var(--surface-2);
111
108
  --panel-3: var(--surface-3);
112
109
  --panel-strong: var(--surface);
113
- --glow-green: 0 0 34px rgba(111, 66, 232, 0.14);
114
- --glow-blue: 0 0 34px rgba(139, 108, 255, 0.14);
110
+ --glow-green: 0 0 34px rgba(15, 159, 143, 0.14);
111
+ --glow-blue: 0 0 34px rgba(37, 99, 235, 0.14);
115
112
  /* PPT reference 스킨 별칭 */
116
113
  --ref-purple: var(--accent);
117
114
  --ref-purple-2: var(--accent-2);
118
- --ref-indigo: #2f73ff;
115
+ --ref-indigo: #2563eb;
119
116
  --ref-ink: var(--text);
120
117
  --ref-muted: var(--muted);
121
118
  --ref-faint: var(--faint);
@@ -126,16 +123,17 @@
126
123
 
127
124
  /* ── --lt-* 별칭 (workspace.css / platform.css 가 참조) — LIGHT ──────────
128
125
  순환참조를 피하려 구체값으로 둔다(소비자가 --bg 등을 --lt-* 로 재정의해도 안전). */
129
- --lt-bg: #f3ecff;
130
- --lt-surface: #f6f0ff;
131
- --lt-surface-2: #efe8ff;
132
- --lt-input: rgba(255, 255, 255, 0.80);
133
- --lt-ink: #14162c;
134
- --lt-ink-soft: #4a4668;
135
- --lt-muted: #7a74a0;
136
- --lt-line: rgba(111, 66, 232, 0.14);
137
- --lt-accent: #6f42e8;
138
- --lt-shadow-md: 0 18px 54px rgba(88, 72, 150, 0.15);
126
+ --lt-bg: #f6f8f7;
127
+ --lt-surface: #ffffff;
128
+ --lt-surface-2: #f0f5f4;
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);
139
137
 
140
138
  /* ── 모션 / 타이포 ─────────────────────────────────────────────────── */
141
139
  --lt-motion-ease: cubic-bezier(0.22, 1, 0.36, 1);
@@ -147,97 +145,94 @@
147
145
  :root[data-lt-theme="dark"] {
148
146
  color-scheme: dark;
149
147
 
150
- --bg: #0B0B1E;
151
- --bg-soft: #0e0e26;
152
- --surface: #16163a;
153
- --surface-2: #1b1d42;
154
- --surface-3: #23264f;
155
- --surface-muted: #11132f;
156
- --surface-elevated: #20234d;
157
- --card: rgba(255, 255, 255, 0.05);
158
- --sidebar: rgba(18, 18, 46, 0.96);
159
- --modal: rgba(22, 22, 58, 0.98);
160
- --table: rgba(255, 255, 255, 0.04);
161
- --input: rgba(255, 255, 255, 0.06);
162
- --overlay: rgba(0, 0, 0, 0.62);
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);
158
+ --table: rgba(255, 255, 255, 0.045);
159
+ --input: rgba(255, 255, 255, 0.065);
160
+ --overlay: rgba(0, 0, 0, 0.64);
163
161
  --overlay-scrim: var(--overlay);
164
162
  --app-bg:
165
- radial-gradient(circle at 82% 12%, rgba(110, 74, 230, 0.22), transparent 32%),
166
- radial-gradient(circle at 10% 80%, rgba(24, 198, 217, 0.10), transparent 38%),
167
- linear-gradient(180deg, #0B0B1E 0%, #0e0e24 52%, #0B0B1E 100%);
163
+ linear-gradient(180deg, #101418 0%, #151d22 54%, #101418 100%);
168
164
 
169
- --text: #F4F5FB;
170
- --muted: #C2C7DC;
171
- --faint: #8B92AC;
165
+ --text: #edf3f2;
166
+ --muted: #b8c5c2;
167
+ --faint: #849894;
172
168
  --text-muted: var(--muted);
173
169
 
174
- --border: rgba(160, 170, 230, 0.20);
175
- --border-strong: rgba(160, 170, 230, 0.32);
176
- --line: rgba(160, 170, 230, 0.16);
177
- --line-strong: rgba(160, 170, 230, 0.28);
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);
178
174
 
179
- --accent: #A78BFA;
180
- --accent-2: #c4b5fd;
181
- --accent-3: #ddd6fe;
182
- --accent-pink: #e0b0ff;
183
- --accent-soft: rgba(167, 139, 250, 0.18);
184
- --accent-deep: #ddd6fe;
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;
185
181
 
186
182
  --success: #34d399;
187
183
  --warning: #fbbf24;
188
- --danger: #F47171;
184
+ --danger: #fb923c;
189
185
 
190
- --graph-bg: #0B0B1E;
191
- --graph-grid: rgba(160, 170, 230, 0.08);
192
- --graph-pill: rgba(24, 26, 53, 0.92);
186
+ --graph-bg: #0f1518;
187
+ --graph-grid: rgba(94, 234, 212, 0.08);
188
+ --graph-pill: rgba(27, 35, 40, 0.92);
193
189
 
194
190
  --shadow: 0 18px 54px rgba(0, 0, 0, 0.50);
195
191
  --shadow-sm: 0 8px 24px rgba(0, 0, 0, 0.42);
196
192
 
197
- --focus-ring: rgba(167, 139, 250, 0.70);
193
+ --focus-ring: rgba(125, 211, 252, 0.70);
198
194
 
199
- --lt-bg: #0B0B1E;
200
- --lt-surface: #16163a;
201
- --lt-surface-2: #1b1d42;
202
- --lt-input: rgba(255, 255, 255, 0.06);
203
- --lt-ink: #F4F5FB;
204
- --lt-ink-soft: #C2C7DC;
205
- --lt-muted: #8B92AC;
206
- --lt-line: rgba(160, 170, 230, 0.20);
207
- --lt-accent: #A78BFA;
195
+ --lt-bg: #101418;
196
+ --lt-surface: #1b2328;
197
+ --lt-surface-2: #202b31;
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;
208
205
  --lt-shadow-md: 0 18px 54px rgba(0, 0, 0, 0.50);
209
206
 
210
- --ref-indigo: #6f93ff;
211
- --glow-green: 0 0 34px rgba(110, 74, 230, 0.22);
212
- --glow-blue: 0 0 34px rgba(24, 198, 217, 0.18);
207
+ --ref-indigo: #93c5fd;
208
+ --glow-green: 0 0 34px rgba(94, 234, 212, 0.18);
209
+ --glow-blue: 0 0 34px rgba(125, 211, 252, 0.18);
213
210
  }
214
211
 
215
212
  /* OS 다크 추종 — 사용자가 명시적으로 라이트를 고르지 않은 경우에만 */
216
213
  @media (prefers-color-scheme: dark) {
217
214
  :root:not([data-lt-theme="light"]):not([data-lt-theme="dark"]) {
218
215
  color-scheme: dark;
219
- --bg: #0B0B1E; --bg-soft: #0e0e26;
220
- --surface: #16163a; --surface-2: #1b1d42; --surface-3: #23264f;
221
- --surface-muted: #11132f; --surface-elevated: #20234d;
222
- --card: rgba(255,255,255,0.05); --sidebar: rgba(18,18,46,0.96);
223
- --modal: rgba(22,22,58,0.98); --table: rgba(255,255,255,0.04);
224
- --input: rgba(255,255,255,0.06); --overlay: rgba(0,0,0,0.62); --overlay-scrim: var(--overlay);
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);
225
222
  --app-bg:
226
- radial-gradient(circle at 82% 12%, rgba(110,74,230,0.22), transparent 32%),
227
- radial-gradient(circle at 10% 80%, rgba(24,198,217,0.10), transparent 38%),
228
- linear-gradient(180deg, #0B0B1E 0%, #0e0e24 52%, #0B0B1E 100%);
229
- --text: #F4F5FB; --muted: #C2C7DC; --faint: #8B92AC; --text-muted: var(--muted);
230
- --border: rgba(160,170,230,0.20); --border-strong: rgba(160,170,230,0.32);
231
- --line: rgba(160,170,230,0.16); --line-strong: rgba(160,170,230,0.28);
232
- --accent: #A78BFA; --accent-2: #c4b5fd; --accent-3: #ddd6fe;
233
- --accent-pink: #e0b0ff; --accent-soft: rgba(167,139,250,0.18); --accent-deep: #ddd6fe;
234
- --success: #34d399; --warning: #fbbf24; --danger: #F47171;
235
- --graph-bg: #0B0B1E; --graph-grid: rgba(160,170,230,0.08); --graph-pill: rgba(24,26,53,0.92);
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);
236
231
  --shadow: 0 18px 54px rgba(0,0,0,0.50); --shadow-sm: 0 8px 24px rgba(0,0,0,0.42);
237
- --focus-ring: rgba(167,139,250,0.70);
238
- --lt-bg: #0B0B1E; --lt-surface: #16163a; --lt-surface-2: #1b1d42; --lt-input: rgba(255,255,255,0.06);
239
- --lt-ink: #F4F5FB; --lt-ink-soft: #C2C7DC; --lt-muted: #8B92AC;
240
- --lt-line: rgba(160,170,230,0.20); --lt-accent: #A78BFA;
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;
241
236
  --lt-shadow-md: 0 18px 54px rgba(0,0,0,0.50);
242
237
  }
243
238
  }
package/static/graph.html CHANGED
@@ -4,18 +4,18 @@
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>Lattice AI - 지식 그래프</title>
7
- <script src="/static/scripts/ux.js?v=2.2.7"></script>
7
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
11
11
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
12
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
13
- <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
14
- <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
15
- <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
16
- <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
17
- <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
18
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
12
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0">
13
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=3.0.0">
14
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=3.0.0">
15
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=3.0.0">
16
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=3.0.0">
17
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=3.0.0">
18
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0">
19
19
  </head>
20
20
  <body class="lattice-ref-graph">
21
21
  <div class="sidebar-overlay" onclick="closeGraphNav&&closeGraphNav()"></div>
@@ -119,6 +119,6 @@
119
119
 
120
120
  <div id="tooltip"></div>
121
121
 
122
- <script src="/static/scripts/graph.js?v=2.2.7"></script>
122
+ <script src="/static/scripts/graph.js?v=3.0.0"></script>
123
123
  </body>
124
124
  </html>
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "Lattice AI",
3
3
  "short_name": "LatticeAI",
4
- "description": "AI Workspace OS for local-first graph, memory, agents, workflows, and skills",
5
- "start_url": "/workspace",
4
+ "description": "Local-first AI workspace platform for knowledge graphs, vector index, hybrid search, agents, and workspace modes",
5
+ "start_url": "/app",
6
6
  "id": "/",
7
7
  "display": "standalone",
8
8
  "orientation": "any",
@@ -28,7 +28,7 @@
28
28
  {
29
29
  "name": "새 대화",
30
30
  "short_name": "대화",
31
- "url": "/",
31
+ "url": "/app#/chat",
32
32
  "icons": [{ "src": "/icons/icon-192.png", "sizes": "192x192" }]
33
33
  }
34
34
  ]
@@ -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>Plugin SDK — 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>
@@ -162,7 +162,7 @@ const API_BASE = window.location.protocol === 'file:' ? 'http://localhost:4825'
162
162
  localStorage.setItem('ltcai_user_nickname', data.nickname || data.name || data.email);
163
163
  localStorage.setItem('ltcai_is_admin', data.is_admin ? 'true' : 'false');
164
164
  requestSetupAfterLogin();
165
- window.location.href = '/chat?setup=1';
165
+ window.location.href = '/app';
166
166
  } else {
167
167
  const data = await res.json().catch(() => ({}));
168
168
  setMsg('login-msg', data.detail || t('err_login_fail'));
@@ -205,7 +205,7 @@ const API_BASE = window.location.protocol === 'file:' ? 'http://localhost:4825'
205
205
  localStorage.setItem('ltcai_user_nickname', data.nickname || data.name || data.email);
206
206
  localStorage.setItem('ltcai_is_admin', data.is_admin ? 'true' : 'false');
207
207
  requestSetupAfterLogin();
208
- window.location.href = '/chat?setup=1';
208
+ window.location.href = '/app';
209
209
  }
210
210
  });
211
211
  } else {
@@ -221,9 +221,9 @@ const API_BASE = window.location.protocol === 'file:' ? 'http://localhost:4825'
221
221
  }
222
222
  }
223
223
 
224
- // If already logged in, skip to chat
224
+ // If already logged in, skip to the v3 workspace shell.
225
225
  apiFetch('/account/profile').then(r => {
226
- if (r.ok) window.location.href = '/chat';
226
+ if (r.ok) window.location.href = '/app';
227
227
  }).catch(() => {});
228
228
 
229
229
  initSSO();
@@ -342,9 +342,13 @@ const chatViewport = document.getElementById('chat-viewport');
342
342
  logout: '로그아웃', admin_dashboard: '관리자 대시보드',
343
343
  my_status: '내 상태 보기', auto_setup: '자동 설정',
344
344
  nav_home: '홈', nav_chat: '채팅', nav_workspace: 'Workspace OS', nav_knowledge: '지식 그래프',
345
- nav_pipeline: '파이프라인', nav_files: '내 컴퓨터',
345
+ nav_pipeline: '파이프라인', nav_files: '파일', nav_computer: '내 컴퓨터',
346
+ nav_search: '검색', nav_new_chat: '새 대화',
346
347
  nav_model_status: '모델 상태', nav_runtime: '실행 방식 설정',
347
348
  nav_advanced_settings: '고급 설정',
349
+ nav_user_management: '사용자 관리', nav_permission_management: '권한 관리',
350
+ nav_audit_logs: '감사 로그', nav_security: '보안', nav_sensitive_data: '민감정보 감시',
351
+ nav_org_policies: '조직 정책', nav_private_vpc: 'Private VPC',
348
352
  history_search_ph: '대화 검색...', new_chat: 'New Chat',
349
353
  history_section: '대화', history_empty: '아직 저장된 대화가 없습니다.',
350
354
  new_conversation: '새 대화', previous_history: '이전 대화 기록',
@@ -421,9 +425,13 @@ const chatViewport = document.getElementById('chat-viewport');
421
425
  logout: 'Logout', admin_dashboard: 'Admin Dashboard',
422
426
  my_status: 'My Status', auto_setup: 'Auto Setup',
423
427
  nav_home: 'Home', nav_chat: 'Chat', nav_workspace: 'Workspace OS', nav_knowledge: 'Knowledge Graph',
424
- nav_pipeline: 'Pipeline', nav_files: 'My Computer',
428
+ nav_pipeline: 'Pipeline', nav_files: 'Files', nav_computer: 'My Computer',
429
+ nav_search: 'Search', nav_new_chat: 'New Chat',
425
430
  nav_model_status: 'Model Status', nav_runtime: 'Execution Settings',
426
431
  nav_advanced_settings: 'Advanced Settings',
432
+ nav_user_management: 'User Management', nav_permission_management: 'Permissions',
433
+ nav_audit_logs: 'Audit Logs', nav_security: 'Security', nav_sensitive_data: 'Sensitive Data',
434
+ nav_org_policies: 'Org Policies', nav_private_vpc: 'Private VPC',
427
435
  history_search_ph: 'Search chats...', new_chat: 'New Chat',
428
436
  history_section: 'Chats', history_empty: 'No saved chats yet.',
429
437
  new_conversation: 'New chat', previous_history: 'Previous chat history',
@@ -675,26 +683,37 @@ const chatViewport = document.getElementById('chat-viewport');
675
683
  const BASE_NAV_ITEMS = [
676
684
  { id: 'home', icon: 'ti-home', labelKey: 'nav_home' },
677
685
  { id: 'chat', icon: 'ti-message-circle', labelKey: 'nav_chat' },
678
- { id: 'workspace-os', icon: 'ti-layout-dashboard', labelKey: 'nav_workspace' },
679
686
  { id: 'knowledge', icon: 'ti-chart-dots-3', labelKey: 'nav_knowledge' },
680
687
  { id: 'pipeline', icon: 'ti-git-branch', labelKey: 'nav_pipeline' },
681
- { id: 'files', icon: 'ti-device-desktop', labelKey: 'nav_files' },
682
- { id: 'status', icon: 'ti-info-circle', labelKey: 'my_status' },
688
+ { id: 'files', icon: 'ti-files', labelKey: 'nav_files' },
689
+ { id: 'my-computer', icon: 'ti-device-desktop', labelKey: 'nav_computer' },
690
+ { id: 'search', icon: 'ti-search', labelKey: 'nav_search' },
691
+ { id: 'new-chat', icon: 'ti-plus', labelKey: 'nav_new_chat' },
683
692
  ];
684
693
 
685
694
  const ADVANCED_NAV_ITEMS = [
695
+ { id: 'workspace-os', icon: 'ti-layout-dashboard', labelKey: 'nav_workspace' },
686
696
  { id: 'model-status', icon: 'ti-cpu-2', labelKey: 'nav_model_status' },
687
697
  { id: 'runtime', icon: 'ti-adjustments-cog', labelKey: 'nav_runtime' },
688
698
  { id: 'advanced-settings', icon: 'ti-settings', labelKey: 'nav_advanced_settings' },
689
699
  ];
690
700
 
701
+ const ADMIN_NAV_ITEMS = [
702
+ { id: 'admin-users', icon: 'ti-users', labelKey: 'nav_user_management' },
703
+ { id: 'admin-permissions', icon: 'ti-key', labelKey: 'nav_permission_management' },
704
+ { id: 'admin-audit', icon: 'ti-report-search', labelKey: 'nav_audit_logs' },
705
+ { id: 'admin-security', icon: 'ti-shield-check', labelKey: 'nav_security' },
706
+ { id: 'admin-sensitive-data', icon: 'ti-radar', labelKey: 'nav_sensitive_data' },
707
+ { id: 'admin-policies', icon: 'ti-building-skyscraper', labelKey: 'nav_org_policies' },
708
+ { id: 'private-vpc', icon: 'ti-cloud-lock', labelKey: 'nav_private_vpc' },
709
+ ];
710
+
691
711
  function navItemsForMode(mode) {
692
712
  if (mode === 'advanced') return [...BASE_NAV_ITEMS, ...ADVANCED_NAV_ITEMS];
693
- // 관리자 모드: 내 상태 보기 뒤에 고급 3개 + 관리자 대시보드
694
713
  if (mode === 'admin') return [
695
714
  ...BASE_NAV_ITEMS,
696
715
  ...ADVANCED_NAV_ITEMS,
697
- { id: 'admin-dashboard', icon: 'ti-shield-lock', labelKey: 'admin_dashboard' },
716
+ ...ADMIN_NAV_ITEMS,
698
717
  ];
699
718
  return BASE_NAV_ITEMS;
700
719
  }
@@ -743,12 +762,25 @@ const chatViewport = document.getElementById('chat-viewport');
743
762
  else if (id === 'knowledge') openDataGraph();
744
763
  else if (id === 'pipeline') openPipelineModal();
745
764
  else if (id === 'files') openLocalBrowser();
746
- else if (id === 'computer') openCuPanel();
765
+ else if (id === 'my-computer') openCuPanel();
766
+ else if (id === 'search') {
767
+ showChat();
768
+ markActiveNav('search');
769
+ const search = document.getElementById('history-search-input');
770
+ if (search) search.focus();
771
+ }
772
+ else if (id === 'new-chat') startNewChat();
747
773
  else if (id === 'status') openStatusPanel();
748
774
  else if (id === 'model-status') openStatusPanel();
749
775
  else if (id === 'runtime') openModelPanel();
750
776
  else if (id === 'advanced-settings') openAdvancedSettingsPanel();
751
777
  else if (id === 'admin-dashboard') openAdminPanel();
778
+ else if (id === 'admin-users') window.location.href = `${API_BASE}/admin#users`;
779
+ else if (id === 'admin-permissions') window.location.href = `${API_BASE}/admin#permissions`;
780
+ else if (id === 'admin-audit') window.location.href = `${API_BASE}/admin#audit`;
781
+ else if (id === 'admin-security' || id === 'admin-sensitive-data') window.location.href = `${API_BASE}/admin#security`;
782
+ else if (id === 'admin-policies') window.location.href = `${API_BASE}/admin#enterprise`;
783
+ else if (id === 'private-vpc') openVpcPanel();
752
784
  }
753
785
 
754
786
  function focusChatInput() {