ltcai 2.2.7 → 3.1.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.
- package/README.md +72 -34
- package/docs/CHANGELOG.md +119 -0
- package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
- package/docs/V3_FRONTEND.md +139 -0
- package/knowledge_graph.py +649 -21
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/admin.py +47 -0
- package/latticeai/api/agents.py +54 -31
- package/latticeai/api/auth.py +5 -2
- package/latticeai/api/chat.py +10 -2
- package/latticeai/api/search.py +240 -0
- package/latticeai/api/static_routes.py +11 -2
- package/latticeai/core/config.py +18 -0
- package/latticeai/core/embedding_providers.py +625 -0
- package/latticeai/core/local_embeddings.py +86 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/server_app.py +65 -1
- package/latticeai/services/agent_runtime.py +245 -0
- package/latticeai/services/search_service.py +346 -0
- package/package.json +13 -6
- package/scripts/build_v3_assets.mjs +164 -0
- package/scripts/capture/README.md +28 -0
- package/scripts/capture/capture_enterprise.js +8 -0
- package/scripts/capture/capture_graph.js +8 -0
- package/scripts/capture/capture_onboarding.js +8 -0
- package/scripts/capture/capture_page.js +43 -0
- package/scripts/capture/capture_release_media.js +125 -0
- package/scripts/capture/capture_skills.js +8 -0
- package/scripts/capture/capture_workspace.js +8 -0
- package/scripts/generate_diagrams.py +513 -0
- package/scripts/lint_v3.mjs +33 -0
- package/scripts/release-0.3.1.sh +105 -0
- package/scripts/take_screenshots.js +69 -0
- package/scripts/validate_release_artifacts.py +167 -0
- package/static/account.html +9 -9
- package/static/activity.html +4 -4
- package/static/admin.html +8 -8
- package/static/agents.html +4 -4
- package/static/chat.html +10 -10
- package/static/css/reference/account.css +137 -1
- package/static/css/reference/chat.css +31 -37
- package/static/css/responsive.css +42 -0
- package/static/css/tokens.5a595671.css +260 -0
- package/static/css/tokens.css +125 -130
- package/static/graph.html +9 -9
- package/static/manifest.json +3 -3
- package/static/plugins.html +4 -4
- package/static/scripts/account.js +4 -4
- package/static/scripts/chat.js +40 -8
- package/static/scripts/workspace.js +78 -0
- package/static/sw.js +3 -1
- package/static/v3/asset-manifest.json +47 -0
- package/static/v3/css/lattice.base.css +128 -0
- package/static/v3/css/lattice.base.e4cdd05d.css +128 -0
- package/static/v3/css/lattice.components.011e988b.css +447 -0
- package/static/v3/css/lattice.components.css +447 -0
- package/static/v3/css/lattice.shell.4920f42d.css +407 -0
- package/static/v3/css/lattice.shell.css +407 -0
- package/static/v3/css/lattice.tokens.c597ff81.css +132 -0
- package/static/v3/css/lattice.tokens.css +132 -0
- package/static/v3/css/lattice.views.3ee19d4e.css +277 -0
- package/static/v3/css/lattice.views.css +277 -0
- package/static/v3/index.html +69 -0
- package/static/v3/js/app.46fb61d9.js +26 -0
- package/static/v3/js/app.js +26 -0
- package/static/v3/js/core/api.22a41d42.js +344 -0
- package/static/v3/js/core/api.js +344 -0
- package/static/v3/js/core/components.4c83e0a9.js +222 -0
- package/static/v3/js/core/components.js +222 -0
- package/static/v3/js/core/dom.a2773eb0.js +148 -0
- package/static/v3/js/core/dom.js +148 -0
- package/static/v3/js/core/router.584570f2.js +37 -0
- package/static/v3/js/core/router.js +37 -0
- package/static/v3/js/core/routes.f935dd50.js +78 -0
- package/static/v3/js/core/routes.js +78 -0
- package/static/v3/js/core/shell.1b6199d6.js +363 -0
- package/static/v3/js/core/shell.js +363 -0
- package/static/v3/js/core/store.34ebd5e6.js +113 -0
- package/static/v3/js/core/store.js +113 -0
- package/static/v3/js/views/admin-audit.660a1fb1.js +185 -0
- package/static/v3/js/views/admin-audit.js +185 -0
- package/static/v3/js/views/admin-permissions.a7ae5f09.js +177 -0
- package/static/v3/js/views/admin-permissions.js +177 -0
- package/static/v3/js/views/admin-policies.3658fd86.js +102 -0
- package/static/v3/js/views/admin-policies.js +102 -0
- package/static/v3/js/views/admin-private-vpc.7d342d36.js +135 -0
- package/static/v3/js/views/admin-private-vpc.js +135 -0
- package/static/v3/js/views/admin-security.07c66b72.js +180 -0
- package/static/v3/js/views/admin-security.js +180 -0
- package/static/v3/js/views/admin-users.03bac88c.js +168 -0
- package/static/v3/js/views/admin-users.js +168 -0
- package/static/v3/js/views/agents.14e48bdd.js +193 -0
- package/static/v3/js/views/agents.js +193 -0
- package/static/v3/js/views/chat.718144ce.js +449 -0
- package/static/v3/js/views/chat.js +449 -0
- package/static/v3/js/views/files.4935197e.js +186 -0
- package/static/v3/js/views/files.js +186 -0
- package/static/v3/js/views/home.cdde3b32.js +119 -0
- package/static/v3/js/views/home.js +119 -0
- package/static/v3/js/views/hybrid-search.b22b97e0.js +195 -0
- package/static/v3/js/views/hybrid-search.js +195 -0
- package/static/v3/js/views/knowledge-graph.a14ea7e7.js +237 -0
- package/static/v3/js/views/knowledge-graph.js +237 -0
- package/static/v3/js/views/models.a1ffa147.js +256 -0
- package/static/v3/js/views/models.js +256 -0
- package/static/v3/js/views/my-computer.1b2ff621.js +237 -0
- package/static/v3/js/views/my-computer.js +237 -0
- package/static/v3/js/views/pipeline.c522f1ce.js +157 -0
- package/static/v3/js/views/pipeline.js +157 -0
- package/static/v3/js/views/settings.4f777210.js +250 -0
- package/static/v3/js/views/settings.js +250 -0
- package/static/workflows.html +4 -4
- package/static/workspace.css +340 -2
- package/static/workspace.html +43 -24
- package/docs/images/tmp_frames/frame_00.png +0 -0
- package/docs/images/tmp_frames/frame_01.png +0 -0
- package/docs/images/tmp_frames/frame_02.png +0 -0
- package/docs/images/tmp_frames/frame_03.png +0 -0
- package/docs/images/tmp_frames/hero_00.png +0 -0
- package/docs/images/tmp_frames/hero_01.png +0 -0
- package/docs/images/tmp_frames/hero_02.png +0 -0
- package/docs/images/tmp_frames/hero_03.png +0 -0
package/static/css/tokens.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* ============================================================================
|
|
2
|
-
* Lattice AI — Design Tokens (Single Source of Truth)
|
|
2
|
+
* Lattice AI — Design Tokens (Single Source of Truth) v3.1.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: #
|
|
22
|
-
--lt-color-primary-200: #
|
|
23
|
-
--lt-color-primary-400: #
|
|
24
|
-
--lt-color-primary-600: #
|
|
25
|
-
--lt-color-primary-800: #
|
|
26
|
-
--lt-color-ink-900: #
|
|
27
|
-
--lt-color-accent-cyan: #
|
|
28
|
-
--lt-color-accent-green: #
|
|
29
|
-
--lt-color-accent-amber: #
|
|
30
|
-
--lt-color-accent-pink: #
|
|
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: #
|
|
38
|
-
--bg-soft: #
|
|
39
|
-
--surface: #
|
|
40
|
-
--surface-2: #
|
|
41
|
-
--surface-3: #
|
|
42
|
-
--surface-muted: #
|
|
43
|
-
--surface-elevated: rgba(255, 255, 255, 0.
|
|
44
|
-
--card: rgba(255, 255, 255, 0.
|
|
45
|
-
--sidebar: rgba(
|
|
46
|
-
--modal: rgba(
|
|
47
|
-
--table: rgba(255, 255, 255, 0.
|
|
48
|
-
--input: rgba(255, 255, 255, 0.
|
|
49
|
-
--overlay: rgba(
|
|
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
|
-
|
|
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: #
|
|
59
|
-
--muted: #
|
|
60
|
-
--faint: #
|
|
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(
|
|
65
|
-
--border-strong: rgba(
|
|
66
|
-
--line: rgba(
|
|
67
|
-
--line-strong: rgba(
|
|
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: #
|
|
71
|
-
--accent-2: #
|
|
72
|
-
--accent-3: #
|
|
73
|
-
--accent-pink: #
|
|
74
|
-
--accent-soft: rgba(
|
|
75
|
-
--accent-deep: #
|
|
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: #
|
|
79
|
-
--warning: #
|
|
80
|
-
--danger: #
|
|
75
|
+
--success: #0f8f6d;
|
|
76
|
+
--warning: #a16207;
|
|
77
|
+
--danger: #c2410c;
|
|
81
78
|
|
|
82
79
|
/* graph */
|
|
83
|
-
--graph-bg: #
|
|
84
|
-
--graph-grid: rgba(
|
|
85
|
-
--graph-pill: rgba(255, 255, 255, 0.
|
|
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
|
|
89
|
-
--shadow-sm: 0 8px
|
|
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(
|
|
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(
|
|
114
|
-
--glow-blue: 0 0 34px rgba(
|
|
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: #
|
|
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: #
|
|
130
|
-
--lt-surface: #
|
|
131
|
-
--lt-surface-2: #
|
|
132
|
-
--lt-input: rgba(255, 255, 255, 0.
|
|
133
|
-
--lt-ink: #
|
|
134
|
-
--lt-ink-soft: #
|
|
135
|
-
--lt-muted: #
|
|
136
|
-
--lt-line: rgba(
|
|
137
|
-
--lt-accent: #
|
|
138
|
-
--lt-
|
|
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: #
|
|
151
|
-
--bg-soft: #
|
|
152
|
-
--surface: #
|
|
153
|
-
--surface-2: #
|
|
154
|
-
--surface-3: #
|
|
155
|
-
--surface-muted: #
|
|
156
|
-
--surface-elevated: #
|
|
157
|
-
--card: rgba(255, 255, 255, 0.
|
|
158
|
-
--sidebar:
|
|
159
|
-
--modal: rgba(
|
|
160
|
-
--table: rgba(255, 255, 255, 0.
|
|
161
|
-
--input: rgba(255, 255, 255, 0.
|
|
162
|
-
--overlay: rgba(0, 0, 0, 0.
|
|
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
|
-
|
|
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: #
|
|
170
|
-
--muted: #
|
|
171
|
-
--faint: #
|
|
165
|
+
--text: #edf3f2;
|
|
166
|
+
--muted: #b8c5c2;
|
|
167
|
+
--faint: #849894;
|
|
172
168
|
--text-muted: var(--muted);
|
|
173
169
|
|
|
174
|
-
--border: rgba(
|
|
175
|
-
--border-strong: rgba(
|
|
176
|
-
--line: rgba(
|
|
177
|
-
--line-strong: rgba(
|
|
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: #
|
|
180
|
-
--accent-2: #
|
|
181
|
-
--accent-3: #
|
|
182
|
-
--accent-pink: #
|
|
183
|
-
--accent-soft: rgba(
|
|
184
|
-
--accent-deep: #
|
|
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: #
|
|
184
|
+
--danger: #fb923c;
|
|
189
185
|
|
|
190
|
-
--graph-bg: #
|
|
191
|
-
--graph-grid: rgba(
|
|
192
|
-
--graph-pill: rgba(
|
|
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(
|
|
193
|
+
--focus-ring: rgba(125, 211, 252, 0.70);
|
|
198
194
|
|
|
199
|
-
--lt-bg: #
|
|
200
|
-
--lt-surface: #
|
|
201
|
-
--lt-surface-2: #
|
|
202
|
-
--lt-input: rgba(255, 255, 255, 0.
|
|
203
|
-
--lt-ink: #
|
|
204
|
-
--lt-ink-soft: #
|
|
205
|
-
--lt-muted: #
|
|
206
|
-
--lt-line: rgba(
|
|
207
|
-
--lt-accent: #
|
|
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: #
|
|
211
|
-
--glow-green: 0 0 34px rgba(
|
|
212
|
-
--glow-blue: 0 0 34px rgba(
|
|
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: #
|
|
220
|
-
--surface: #
|
|
221
|
-
--surface-muted: #
|
|
222
|
-
--card: rgba(255,255,255,0.
|
|
223
|
-
--modal: rgba(
|
|
224
|
-
--input: rgba(255,255,255,0.
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
--
|
|
230
|
-
--
|
|
231
|
-
--
|
|
232
|
-
--
|
|
233
|
-
--
|
|
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(
|
|
238
|
-
--lt-bg: #
|
|
239
|
-
--lt-ink: #
|
|
240
|
-
--lt-line: rgba(
|
|
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
|
|
7
|
+
<script src="/static/scripts/ux.js"></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
|
|
13
|
-
<link rel="stylesheet" href="/static/css/reference/base.css
|
|
14
|
-
<link rel="stylesheet" href="/static/css/reference/account.css
|
|
15
|
-
<link rel="stylesheet" href="/static/css/reference/admin.css
|
|
16
|
-
<link rel="stylesheet" href="/static/css/reference/graph.css
|
|
17
|
-
<link rel="stylesheet" href="/static/css/reference/chat.css
|
|
18
|
-
<link rel="stylesheet" href="/static/css/responsive.css
|
|
12
|
+
<link rel="stylesheet" href="/static/css/tokens.css">
|
|
13
|
+
<link rel="stylesheet" href="/static/css/reference/base.css">
|
|
14
|
+
<link rel="stylesheet" href="/static/css/reference/account.css">
|
|
15
|
+
<link rel="stylesheet" href="/static/css/reference/admin.css">
|
|
16
|
+
<link rel="stylesheet" href="/static/css/reference/graph.css">
|
|
17
|
+
<link rel="stylesheet" href="/static/css/reference/chat.css">
|
|
18
|
+
<link rel="stylesheet" href="/static/css/responsive.css">
|
|
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
|
|
122
|
+
<script src="/static/scripts/graph.js"></script>
|
|
123
123
|
</body>
|
|
124
124
|
</html>
|
package/static/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "Lattice AI",
|
|
3
3
|
"short_name": "LatticeAI",
|
|
4
|
-
"description": "AI
|
|
5
|
-
"start_url": "/
|
|
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
|
]
|
package/static/plugins.html
CHANGED
|
@@ -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
|
|
8
|
-
<link rel="stylesheet" href="/static/css/tokens.css
|
|
9
|
-
<link rel="stylesheet" href="/static/platform.css
|
|
10
|
-
<link rel="stylesheet" href="/static/css/responsive.css
|
|
7
|
+
<script src="/static/scripts/ux.js"></script>
|
|
8
|
+
<link rel="stylesheet" href="/static/css/tokens.css" />
|
|
9
|
+
<link rel="stylesheet" href="/static/platform.css" />
|
|
10
|
+
<link rel="stylesheet" href="/static/css/responsive.css" />
|
|
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 = '/
|
|
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 = '/
|
|
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
|
|
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 = '/
|
|
226
|
+
if (r.ok) window.location.href = '/app';
|
|
227
227
|
}).catch(() => {});
|
|
228
228
|
|
|
229
229
|
initSSO();
|
package/static/scripts/chat.js
CHANGED
|
@@ -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-
|
|
682
|
-
{ id: '
|
|
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
|
-
|
|
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() {
|