ltcai 2.2.0 → 2.2.2

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.
@@ -8,10 +8,10 @@
8
8
  Lattice AI follows an **open-core** model:
9
9
 
10
10
  - **Community** (this repository, MIT) is fully functional on its own: local
11
- LLMs, knowledge graph, Personal and Organization workspaces, roles, snapshots,
12
- memory, agents, workflows, skills, the auditable timeline, and the full v2.0
13
- Agentic Workspace Platform (Plugin SDK, Workflow Designer, Multi-Agent Runtime
14
- 2.0, Realtime Collaboration).
11
+ models, knowledge graph, Personal and Organization workspaces, roles,
12
+ snapshots, durable context, AI pipelines, multi-agent workflows, skills, the
13
+ auditable timeline, and the full v2 workspace platform (Plugin SDK, Workflow
14
+ Designer, Multi-Agent Runtime, Realtime Collaboration).
15
15
  - **Enterprise** is a separately-distributed plugin that attaches advanced,
16
16
  organization-scale governance and deployment capabilities through a stable
17
17
  runtime seam. It is never bundled into the Community build.
@@ -36,7 +36,7 @@ Community code consults the seam at extension points via
36
36
  always `False`, so the Community code path is taken and nothing is gated off.
37
37
 
38
38
  The live edition + capability matrix is exposed at `GET /workspace/editions`,
39
- surfaced in the Workspace OS summary (`GET /workspace/os` → `edition`), and
39
+ surfaced in the workspace summary (`GET /workspace/os` → `edition`), and
40
40
  shown in the Enterprise Admin UI at `/admin#enterprise`.
41
41
 
42
42
  Community also exposes descriptive admin surfaces at `GET /admin/enterprise`
@@ -14,7 +14,7 @@ through the existing skill registry rather than owning a parallel one.
14
14
 
15
15
  > **Compatibility.** v1.x data and APIs are preserved. The Plugin SDK adds new
16
16
  > code (`latticeai/core/plugins.py`, `latticeai/api/plugins.py`) and new
17
- > persisted state (`plugin_registry` inside the Workspace OS store). Nothing in
17
+ > persisted state (`plugin_registry` inside the workspace store). Nothing in
18
18
  > the v1.x contract changes. The new HTTP routes live under `/plugins/registry`
19
19
  > and friends, which do **not** collide with the pre-existing
20
20
  > `/plugins/directory` marketplace routes.
@@ -28,7 +28,7 @@ PLUGIN_SDK_VERSION = "2.2.0"
28
28
  ## v2.2 additions
29
29
 
30
30
  - `execute_action(...)` emits `plugin_started`, `plugin_completed`, and
31
- `execution_failed` through the existing Workspace OS timeline/realtime feed.
31
+ `execution_failed` through the existing workspace timeline/realtime feed.
32
32
  - Plugin outputs can be carried inside agent context packets and replayed from
33
33
  agent/workflow run history.
34
34
  - The local template catalog (`latticeai.core.marketplace`) adds Plugin,
@@ -228,7 +228,7 @@ discover -> validate -> install -> enable / disable -> uninstall
228
228
  ```
229
229
 
230
230
  Lifecycle *state* (installed / enabled / version / status) is delegated to the
231
- Workspace OS store via a small `store` port, so plugins reuse the same
231
+ workspace store via a small `store` port, so plugins reuse the same
232
232
  local-first JSON persistence, workspace scoping, and timeline events as skills.
233
233
  The registry itself owns only manifest parsing and the execution boundary.
234
234
 
@@ -355,7 +355,7 @@ A persisted entry looks like:
355
355
  }
356
356
  ```
357
357
 
358
- Each lifecycle mutation also records a Workspace OS timeline event
358
+ Each lifecycle mutation also records a workspace timeline event
359
359
  (`plugin_installed`, `plugin_uninstalled`, `plugin_enabled`, `plugin_disabled`)
360
360
  under the `plugins` channel.
361
361
 
@@ -1,11 +1,11 @@
1
- # Lattice AI v2 Architecture — Agentic Workspace Platform
1
+ # Lattice AI v2 Architecture — AI Workspace, Pipeline, and Workflow Platform
2
2
 
3
- Lattice AI v2.0.0 turned the local-first Workspace OS into a full **Agentic
4
- Workspace Platform**. v2.2.0 keeps that architecture and matures the operational
5
- layer: explicit handoffs, context packets, review/retry loops, memory snapshots,
6
- planning records, replay, marketplace templates, and realtime execution
7
- observability all compose over the same local-first JSON store and Knowledge
8
- Graph.
3
+ Lattice AI v2.0.0 introduced the local-first AI workspace, AI pipeline,
4
+ Knowledge Graph, and multi-agent workflow foundation. v2.2.1 keeps that
5
+ architecture and matures the operational layer: explicit handoffs, context
6
+ packets, review/retry loops, durable context snapshots, planning records,
7
+ replay, marketplace templates, and realtime workflow observability all compose
8
+ over the same local-first JSON store and Knowledge Graph.
9
9
 
10
10
  This document describes how the v2 platform pillars fit together, the small set of
11
11
  **additive integration seams** that wire them, the cross-integration matrix that
@@ -47,7 +47,7 @@ templates / actions under one versioned, permissioned unit.
47
47
 
48
48
  Design rules enforced by the module: no import-time I/O (the filesystem is only
49
49
  touched on `discover()`), no FastAPI and no globals (lifecycle state lives in the
50
- Workspace OS store), and permissions are an allow-list — the execution boundary
50
+ workspace store), and permissions are an allow-list — the execution boundary
51
51
  refuses any capability a plugin did not declare *and* was not granted.
52
52
 
53
53
  A validated `plugin.json` manifest:
@@ -213,7 +213,7 @@ class RealtimeBus:
213
213
  v2.2.0 adds a local marketplace foundation rather than a cloud marketplace
214
214
  service. `TemplateCatalog` manages Plugin, Workflow, and Agent templates with
215
215
  metadata, export/import, install hooks, and a template registry stored through
216
- Workspace OS. Marketplace templates are local extension points for the existing
216
+ workspace. Marketplace templates are local extension points for the existing
217
217
  Plugin SDK, Workflow Engine, and Multi-Agent Runtime; they do not bypass plugin
218
218
  permissions, workflow execution guards, or workspace scoping.
219
219
 
@@ -1,9 +1,10 @@
1
1
  # Lattice AI Architecture
2
2
 
3
- Lattice AI v2.2.0 is a local-first **AI Knowledge OS**. The architecture is
3
+ Lattice AI is a local-first **AI workspace, AI pipeline platform, Knowledge
4
+ Graph platform, and multi-agent workflow platform**. The architecture is
4
5
  organized around one durable center: the Knowledge Graph. Models, tools,
5
6
  agents, workflows, and UI modes are replaceable layers that operate on top of
6
- the graph.
7
+ workspace and graph context.
7
8
 
8
9
  ## Architecture Goals
9
10
 
@@ -15,7 +16,7 @@ the graph.
15
16
  - Keep basic and advanced modes feature-equivalent.
16
17
  - Keep admin-only capabilities explicit and auditable.
17
18
 
18
- ## System View
19
+ ## Workspace View
19
20
 
20
21
  ```mermaid
21
22
  flowchart TD
@@ -24,9 +25,9 @@ flowchart TD
24
25
  Extract["Entity, relation, evidence extraction"]
25
26
  Graph["Knowledge Graph"]
26
27
  Context["Graph context builder"]
27
- Models["Multimodal model runtime"]
28
- Agents["Agent runtime and workflows"]
29
- Outputs["Advice, analysis, documents, automation"]
28
+ Models["Local or cloud model workflow"]
29
+ Agents["Multi-agent workflow"]
30
+ Outputs["Coding actions, analysis, documents, team workflows"]
30
31
  Admin["Admin policy and audit"]
31
32
 
32
33
  User --> Ingestion
@@ -42,7 +43,7 @@ flowchart TD
42
43
 
43
44
  ## Durable Core
44
45
 
45
- The Knowledge Graph stores the durable user and organization memory:
46
+ The Knowledge Graph stores durable personal and organization workspace context:
46
47
 
47
48
  - files and document evidence
48
49
  - images and screenshots
@@ -52,8 +53,8 @@ The Knowledge Graph stores the durable user and organization memory:
52
53
  - generated artifacts
53
54
  - agent and workflow events
54
55
 
55
- The LLM is not the product core. It is an execution worker that can be replaced
56
- when hardware, policy, or user preference changes.
56
+ The model is not the product core. It is a replaceable participant in the
57
+ workspace pipeline.
57
58
 
58
59
  ## Multimodal Ingestion
59
60
 
@@ -75,9 +76,9 @@ input set includes:
75
76
  The architecture must not ask users to convert these to plain text before AI can
76
77
  work on them.
77
78
 
78
- ## Model Runtime Policy
79
+ ## Local Model Management Policy
79
80
 
80
- Local recommended models must be multimodal. The v2.2 local runtime policy is:
81
+ Local recommended models must be multimodal. The v2.2 local model workflow policy is:
81
82
 
82
83
  - macOS Apple Silicon: MLX-VLM first
83
84
  - Windows: llama.cpp multimodal path, with LM Studio as a user-friendly option
@@ -130,11 +131,11 @@ Basic mode and advanced mode have the same feature access.
130
131
  | --- | --- |
131
132
  | `latticeai/services/model_catalog.py` | Multimodal model catalog, source metadata, aliases |
132
133
  | `latticeai/services/model_recommendation.py` | Hardware-aware multimodal recommendation |
133
- | `latticeai/services/model_runtime.py` | Download, load, server, and runtime orchestration |
134
+ | `latticeai/services/model_runtime.py` | Download, load, server, and model workflow orchestration |
134
135
  | `llm_router.py` | MLX-VLM and OpenAI-compatible model routing |
135
- | `knowledge_graph.py` | Graph storage, extraction, local folder graph RAG |
136
+ | `knowledge_graph.py` | Graph storage, extraction, local folder knowledge graph context |
136
137
  | `latticeai/core/context_builder.py` | Graph context for generation |
137
- | `latticeai/core/workspace_os.py` | Workspace state, timeline, snapshots, memory |
138
+ | `latticeai/core/workspace_os.py` | Workspace state, timeline, snapshots, durable context |
138
139
  | `latticeai/core/multi_agent.py` | Planner/executor/reviewer/researcher orchestration |
139
140
  | `latticeai/core/workflow_engine.py` | Workflow definitions and run history |
140
141
  | `latticeai/core/plugins.py` | Plugin manifest, registry, permission boundary |
@@ -142,7 +143,7 @@ Basic mode and advanced mode have the same feature access.
142
143
 
143
144
  ## Compatibility
144
145
 
145
- v2.2.0 preserves the additive Workspace OS and API compatibility posture from
146
+ v2.2.1 preserves the additive workspace and API compatibility posture from
146
147
  v2.x. Existing graph/workspace data is migrated non-destructively. The release
147
148
  does remove current recommendation entries for old or text-only model paths, but
148
149
  it does not destructively mutate existing user graph data.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -20,7 +20,7 @@
20
20
  PPT 명세는 "한 코드·다섯 화면" — Shared Core(Design Tokens, UI Components, Business Logic, AI/Graph Core) 위에서 Tauri(데스크탑) / Capacitor·RN(모바일) 렌더러가 같은 결과를 낸다.
21
21
 
22
22
  **현재 구현**
23
- - `static/chat.html`, `static/graph.html`, `static/admin.html`, `static/account.html` 4개 HTML — 각자 자체 CSS 변수 보유
23
+ - `static/chat.html`, `static/graph.html`, `static/admin.html`, `static/account.html` 4개 HTML — `static/css/tokens.css` 단일 토큰을 공유 (v2.2.1)
24
24
  - `vscode-extension/` — TypeScript VSCode 통합
25
25
  - `static/manifest.json` + `static/sw.js` — PWA 부분 지원 (iOS/Android 홈 화면 추가는 됨)
26
26
  - `telegram_bot.py` — Telegram 미러
@@ -28,11 +28,11 @@ PPT 명세는 "한 코드·다섯 화면" — Shared Core(Design Tokens, UI Comp
28
28
  **갭**
29
29
  - 데스크탑 네이티브 셸 (Tauri) 미구현
30
30
  - 모바일 네이티브 (Capacitor / RN) 미구현
31
- - 4개 HTML이 각자 다른 색 토큰 사용 → 같은 화면이 같게 안 보임
32
31
  - 다국어(i18n) 시스템화 안 됨 (HTML에 한글 하드코딩)
33
32
 
34
- **보강 결과물**
35
- - `static/css/tokens.css` (이번 PR에서 추가) — 4개 HTML이 공유할 단일 진실 토큰
33
+ **보강 결과물 (완료, v2.2.1)**
34
+ - `static/css/tokens.css` — 4개 HTML이 공유하는 단일 진실 토큰 (`:root` = 라이트, `[data-lt-theme="dark"]` = 다크)
35
+ - `static/css/responsive.css` + `static/scripts/ux.js` — 반응형 레이아웃 / 라이트·다크 토글 + OS 감지 + 지속화
36
36
  - 로드맵: `apps/desktop/` (Tauri 셸) · `apps/mobile/` (Capacitor 셸) 차후 단계
37
37
 
38
38
  ---
@@ -91,7 +91,9 @@ chunks ( id, source_node, text, metadata_json, created_at )
91
91
 
92
92
  ## 4. 디자인 일관성
93
93
 
94
- | 파일 | 현재 --bg | 현재 --accent |
94
+ 기존(v2.2.1 이전)에는 4개 HTML 각자 다른 토큰을 갖고 있었다:
95
+
96
+ | 파일 | 이전 --bg | 이전 --accent |
95
97
  |------|-----------|---------------|
96
98
  | `chat.html` | `#182332` 다크 블루그린 | `#22d3a0` 민트 |
97
99
  | `graph.html` | `#282a36` 다크 그레이 | `#a77cff` 라일락 |
@@ -100,9 +102,10 @@ chunks ( id, source_node, text, metadata_json, created_at )
100
102
  | `lattice-reference.css` | (라이트, PPT) | `#6f42e8` Lattice 보라 |
101
103
  | **PPT 명세** | `#FFFFFF` 또는 `#0B0B16` | `#6E4AE6` Lattice 보라 |
102
104
 
103
- **보강 결과물**
104
- - `static/css/tokens.css` — 단일 토큰 (PPT 명세 그대로)
105
- - 4개 HTML 의 `:root {}` 블록을 `@import` 줄로 대체 가능하도록 토큰 명 호환
105
+ **보강 결과물 (완료, v2.2.1)**
106
+ - `static/css/tokens.css` — 단일 토큰을 모든 화면이 공유. `:root` 가 라이트 값,
107
+ `[data-lt-theme="dark"]` 다크 값을 정의하는 단일 진실 소스
108
+ - 라이트/다크 토글 + OS 다크모드 감지 + 지속화는 `static/scripts/ux.js` 가 담당
106
109
 
107
110
  ---
108
111
 
@@ -124,9 +127,9 @@ PPT 화면 1, 13 (login, security) 에 한국어 / Microsoft Entra ID / Okta SSO
124
127
  | 순위 | 파일 | 무엇 |
125
128
  |------|------|------|
126
129
  | 1 | `docs/kg-schema.md`, `kg_schema.py` | KG 스키마 정식화 (10 노드 · 12 엣지 · embedding · confidence) |
127
- | 2 | `static/css/tokens.css` | 디자인 토큰 통합 (PPT 색팔레트) |
130
+ | 2 | `static/css/tokens.css` (+ `responsive.css`, `ux.js`) | 디자인 토큰 통합 + 라이트/다크 — v2.2.1 완료 |
128
131
  | 3 | `auto_setup.py` | OS 프로빙 + 모델 추천 + 설치 어댑터 |
129
132
  | 4 | `docs/architecture.md` 보강 | 위 변경 반영 |
130
133
  | 5 | (차후) `apps/desktop`, `apps/mobile` 스캐폴딩 | Tauri/Capacitor |
131
134
 
132
- 항목은 이번 PR 함께 들어간다 (1~3은 코드, 4는 문서, 5는 청사진만).
135
+ 1~4 구현/문서로 반영되었고 (디자인 토큰·라이트/다크는 v2.2.1 에서 완료), 5 는 청사진만 유지한다.
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "2.2.0"
3
+ __version__ = "2.2.2"
@@ -18,7 +18,7 @@ from pathlib import Path
18
18
  from typing import Any, Callable, Dict, Iterable, List, Optional
19
19
 
20
20
 
21
- WORKSPACE_OS_VERSION = "2.2.0"
21
+ WORKSPACE_OS_VERSION = "2.2.2"
22
22
 
23
23
  # Workspace types separate single-user Personal workspaces from shared
24
24
  # Organization workspaces. Both keep the same local-first JSON store; the type
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "2.2.0",
4
- "description": "Lattice AI Workspace OS for local-first graph, memory, agent, workflow, and skill operations",
3
+ "version": "2.2.2",
4
+ "description": "Local-first AI workspace for knowledge graphs, AI pipelines, and multi-agent coding workflows.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
7
7
  "type": "git",
@@ -29,16 +29,24 @@
29
29
  "capture:skills": "node scripts/capture/capture_skills.js",
30
30
  "capture:enterprise": "node scripts/capture/capture_enterprise.js",
31
31
  "capture:onboarding": "node scripts/capture/capture_onboarding.js",
32
- "publish:npm": "npm publish --access public",
33
- "publish:pypi": "python3 -m twine upload --skip-existing dist/ltcai-$npm_package_version.tar.gz dist/ltcai-$npm_package_version-py3-none-any.whl"
32
+ "release:artifacts": "npm run build:python && npm pack && cd vscode-extension && npm run package:vsix",
33
+ "release:validate": "python3 scripts/validate_release_artifacts.py $npm_package_version --require-vsix --require-tgz",
34
+ "publish:npm": "npm pack && npm publish ltcai-$npm_package_version.tgz --access public",
35
+ "publish:pypi": "npm run build:python && python3 -m twine upload --skip-existing dist/ltcai-$npm_package_version.tar.gz dist/ltcai-$npm_package_version-py3-none-any.whl",
36
+ "publish:vscode": "cd vscode-extension && npm run package:vsix && npm run publish:vscode",
37
+ "publish:openvsx": "cd vscode-extension && npm run package:vsix && npm run publish:openvsx",
38
+ "publish:all": "npm run release:artifacts && npm run release:validate && npm publish ltcai-$npm_package_version.tgz --access public && python3 -m twine upload --skip-existing dist/ltcai-$npm_package_version.tar.gz dist/ltcai-$npm_package_version-py3-none-any.whl && cd vscode-extension && npm run publish:vscode && npm run publish:openvsx"
34
39
  },
35
40
  "keywords": [
36
41
  "ltcai",
37
- "ai-assistant",
42
+ "ai-workspace",
43
+ "ai-pipeline",
44
+ "knowledge-graph",
38
45
  "llm",
39
46
  "mlx",
40
47
  "local-ai",
41
- "agent",
48
+ "multi-agent",
49
+ "workflow",
42
50
  "mcp",
43
51
  "rag",
44
52
  "vscode"
@@ -2,8 +2,9 @@
2
2
  <html lang="ko">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
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.2"></script>
7
8
  <link rel="manifest" href="/manifest.json">
8
9
  <meta name="theme-color" content="#f3ecff">
9
10
  <meta name="apple-mobile-web-app-capable" content="yes">
@@ -14,6 +15,7 @@
14
15
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
15
16
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
16
17
  <link rel="stylesheet" href="/static/lattice-reference.css?v=0.3.3">
18
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
17
19
  </head>
18
20
  <body class="lattice-ref-auth">
19
21
  <div class="orb orb-1"></div>
@@ -2,9 +2,12 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
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
- <link rel="stylesheet" href="/static/platform.css" />
7
+ <script src="/static/scripts/ux.js?v=2.2.2"></script>
8
+ <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.2" />
9
+ <link rel="stylesheet" href="/static/platform.css?v=2.2.2" />
10
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2" />
8
11
  </head>
9
12
  <body>
10
13
  <main>
package/static/admin.html CHANGED
@@ -3,8 +3,9 @@
3
3
 
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
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.2"></script>
8
9
  <link rel="manifest" href="/manifest.json">
9
10
  <meta name="theme-color" content="#f3ecff">
10
11
  <meta name="apple-mobile-web-app-capable" content="yes">
@@ -15,10 +16,13 @@
15
16
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
16
17
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
17
18
  <link rel="stylesheet" href="/static/lattice-reference.css?v=0.3.3">
19
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
18
20
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
19
21
  </head>
20
22
 
21
23
  <body class="lattice-ref-admin">
24
+ <div class="sidebar-overlay" onclick="closeAdminRail&&closeAdminRail()"></div>
25
+ <button class="admin-rail-toggle graph-nav-toggle" onclick="toggleAdminRail&&toggleAdminRail()" title="메뉴" aria-label="관리자 메뉴 열기"><i class="ti ti-menu-2"></i></button>
22
26
  <aside class="reference-rail admin-rail">
23
27
  <div class="rail-brand"><i class="ti ti-shield-lock"></i><strong>LATTICE AI</strong><span>Administrator</span></div>
24
28
  <nav>
@@ -2,9 +2,12 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
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
- <link rel="stylesheet" href="/static/platform.css" />
7
+ <script src="/static/scripts/ux.js?v=2.2.2"></script>
8
+ <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.2" />
9
+ <link rel="stylesheet" href="/static/platform.css?v=2.2.2" />
10
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2" />
8
11
  </head>
9
12
  <body>
10
13
  <main>
package/static/chat.html CHANGED
@@ -3,8 +3,9 @@
3
3
 
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
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.2"></script>
8
9
 
9
10
  <!-- PWA -->
10
11
  <link rel="manifest" href="/manifest.json">
@@ -24,6 +25,7 @@
24
25
 
25
26
  <!-- ── Setup Wizard Styles ──────────────────────────────────────────── -->
26
27
  <link rel="stylesheet" href="/static/lattice-reference.css?v=0.3.3">
28
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
27
29
  </head>
28
30
 
29
31
  <body class="lattice-ref-chat">
@@ -37,7 +39,7 @@
37
39
 
38
40
 
39
41
  <div class="app-layout">
40
- <div class="sidebar-overlay" onclick="closeSidebar()"></div>
42
+ <div class="sidebar-overlay" onclick="closeSidebar();closeGraphNav&&closeGraphNav();closeAdminRail&&closeAdminRail()"></div>
41
43
  <!-- Sidebar -->
42
44
  <aside class="sidebar">
43
45
  <div class="sidebar-header">
@@ -81,6 +83,7 @@
81
83
  <div class="mode-segmented" id="mode-segmented" role="tablist" aria-label="작업 모드"></div>
82
84
  </div>
83
85
  <div class="header-pills">
86
+ <button class="theme-toggle" onclick="toggleTheme()" title="테마 전환" aria-label="라이트/다크 테마 전환"><i class="ti ti-moon"></i><i class="ti ti-sun"></i></button>
84
87
  <div class="lang-picker" id="header-lang-picker">
85
88
  <button class="logout-btn" id="lang-btn" onclick="toggleLangMenu('header-lang-picker')" title="Language"><i class="ti ti-language"></i> Language</button>
86
89
  <div class="lang-picker-menu" id="header-lang-picker-menu">
@@ -93,7 +96,7 @@
93
96
  </div>
94
97
  </header>
95
98
 
96
- <div class="acct-modal-overlay" id="acct-modal-overlay">
99
+ <div class="acct-modal-overlay" id="acct-modal-overlay" onclick="if(event.target===this)closeAcctModal()">
97
100
  <div class="acct-modal">
98
101
  <div class="acct-tabs">
99
102
  <button class="acct-tab active" id="tab-profile" onclick="switchAcctTab('profile')" data-i18n="tab_profile">프로필</button>
@@ -477,7 +480,7 @@
477
480
 
478
481
  <!-- ── 파일 에디터 ── -->
479
482
  <div id="file-editor-overlay" class="admin-overlay" style="display:none">
480
- <section class="admin-panel" style="max-width:720px;height:85vh;display:flex;flex-direction:column">
483
+ <section class="admin-panel" style="max-width:720px;height:min(85dvh, calc(100dvh - 24px));display:flex;flex-direction:column">
481
484
  <div class="admin-header" style="flex-shrink:0">
482
485
  <div style="min-width:0;flex:1">
483
486
  <h2><i class="ti ti-file-pencil" style="color:var(--accent)"></i> 파일 편집</h2>