ltcai 2.2.2 → 2.2.7

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 CHANGED
@@ -15,7 +15,7 @@
15
15
  [![npm version](https://img.shields.io/npm/v/ltcai?label=npm)](https://www.npmjs.com/package/ltcai)
16
16
  [![VS Code Marketplace](https://vsmarketplacebadges.dev/version-short/parktaesoo.ltcai.svg)](https://marketplace.visualstudio.com/items?itemName=parktaesoo.ltcai)
17
17
  [![Open VSX](https://img.shields.io/open-vsx/v/parktaesoo/ltcai?label=Open%20VSX)](https://open-vsx.org/extension/parktaesoo/ltcai)
18
- [![GitHub release](https://img.shields.io/github/v/release/TaeSooPark-PTS/LatticeAI?label=GitHub%20release)](https://github.com/TaeSooPark-PTS/LatticeAI/releases/tag/v2.2.2)
18
+ [![GitHub release](https://img.shields.io/github/v/release/TaeSooPark-PTS/LatticeAI?label=GitHub%20release)](https://github.com/TaeSooPark-PTS/LatticeAI/releases/tag/v2.2.7)
19
19
  [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
20
20
  [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/)
21
21
  [![VS Code extension](https://img.shields.io/badge/VS%20Code-extension-blue?logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=parktaesoo.ltcai)
@@ -48,7 +48,7 @@ Install the coding extension:
48
48
 
49
49
  - [VS Code Marketplace: parktaesoo.ltcai](https://marketplace.visualstudio.com/items?itemName=parktaesoo.ltcai)
50
50
  - [Open VSX: parktaesoo.ltcai](https://open-vsx.org/extension/parktaesoo/ltcai)
51
- - [GitHub Release v2.2.2](https://github.com/TaeSooPark-PTS/LatticeAI/releases/tag/v2.2.2)
51
+ - [GitHub Release v2.2.7](https://github.com/TaeSooPark-PTS/LatticeAI/releases/tag/v2.2.7)
52
52
 
53
53
  ## Quick Start
54
54
 
@@ -114,22 +114,25 @@ and disconnected automations. Lattice AI keeps those parts together:
114
114
  - multi-agent workflows leave behind replayable plans, reviews, retries, and
115
115
  outcomes.
116
116
 
117
- ## v2.2.2 QA & Stability Highlights
118
-
119
- A no-features stabilization release that hardens the v2.2.x UI. Every fix keeps
120
- the existing design-token structure and adds no `!important`.
121
-
122
- - Mobile hamburger navigation on the Knowledge Graph and Admin pages is
123
- reachable again (a CSS source-order bug had kept the toggles hidden).
124
- - Admin top-bar actions (Refresh, Logout) are clickable again a graph-only
125
- toolbar rule that floated over the header was scoped back off the graph page.
126
- - Removed latent horizontal overflow on the Workspace page.
127
- - Verified across the full viewport matrix (375px phone → 3440px ultrawide):
128
- light/dark theme parity, button hit-testing, no horizontal scroll, mobile
129
- drawer open/close, and Escape-to-close — all covered by an expanded
130
- Playwright suite.
131
-
132
- Carried forward from v2.2.1: mobile-first responsive layout, design-token
117
+ ## v2.2.7 Visual Stabilization Highlights
118
+
119
+ Lattice AI v2.2.7 is a visual stabilization release driven by rendered browser
120
+ screens, not stylesheet cleanup alone. It keeps the existing design-token
121
+ structure while making the app feel like one cohesive product.
122
+
123
+ - The dark chat composer is now an intentional dark surface with a crisp outer
124
+ focus state, no white haze, and no legacy inner textarea box.
125
+ - Knowledge Graph canvas and Workspace OS panels no longer fall back to
126
+ washed-out light surfaces in dark mode.
127
+ - Workspace select, onboarding, recommendation, auto setup, mode select,
128
+ pipeline, My Computer, profile, settings, VPC, and model-state surfaces use a
129
+ shared modal/panel language.
130
+ - Static frontend asset cache-busting is normalized to `?v=2.2.7`, including
131
+ `/static/scripts/chat.js?v=2.2.7`.
132
+ - Playwright visual coverage now locks the v2.2.7 composer, graph canvas,
133
+ Workspace OS dark inputs/cards, and mobile composer behavior.
134
+
135
+ Carried forward from v2.2.x: mobile-first responsive layout, design-token
133
136
  light/dark themes, keyboard-safe chat composer, Knowledge Graph responsive UX,
134
137
  Admin mobile card layout, drag-and-drop file attachment, and model-card source
135
138
  disclosure.
@@ -227,7 +230,12 @@ Core areas:
227
230
 
228
231
  | Version | Theme |
229
232
  | --- | --- |
230
- | **2.2.2** | Frontend QA stabilization — mobile nav, admin actions, overflow fixes, and expanded visual tests |
233
+ | **2.2.7** | Visual system stabilization — cohesive dark/light screens, crisp chat composer, dark graph canvas, Workspace OS polish |
234
+ | 2.2.6 | Token-native CSS foundation |
235
+ | 2.2.5 | Release hygiene hotfix — dark overlays, modal stack, cache-busting, favicon, and Telegram log masking |
236
+ | 2.2.4 | Chat dark-mode completion |
237
+ | 2.2.3 | Frontend stability and UX fixes |
238
+ | 2.2.2 | Frontend QA stabilization — mobile nav, admin actions, overflow fixes, and expanded visual tests |
231
239
  | 2.2.1 | Frontend and UX overhaul for responsive workspace, themes, graph UX, admin reflow, and file attachment |
232
240
  | 2.2.0 | Multimodal-first Knowledge Graph and local model source disclosure |
233
241
  | 2.1.0 | Multi-agent workflow maturity |
@@ -7,6 +7,10 @@ from pathlib import Path
7
7
  import httpx
8
8
  from openai import AsyncOpenAI
9
9
 
10
+ from latticeai.core.logging_safety import install_sensitive_log_filter, safe_log_text
11
+
12
+ install_sensitive_log_filter()
13
+
10
14
 
11
15
  def load_env_file(path=".env"):
12
16
  env_path = Path(path)
@@ -72,7 +76,7 @@ async def get_updates(client, offset=None):
72
76
  res = await client.get(f"{TELEGRAM_API_URL}/getUpdates", params=params, timeout=35)
73
77
  return res.json()
74
78
  except Exception as exc:
75
- logger.error("Telegram update failed: %s", exc)
79
+ logger.error("Telegram update failed: %s", safe_log_text(exc))
76
80
  return None
77
81
 
78
82
 
@@ -161,7 +165,7 @@ async def handle_message(client, chat_id, text):
161
165
  answer = await ask_codex(chat_id, text)
162
166
  except Exception as exc:
163
167
  logger.exception("OpenAI request failed")
164
- answer = f"OpenAI 요청 실패: {exc}"
168
+ answer = f"OpenAI 요청 실패: {safe_log_text(exc)}"
165
169
  await send_message(client, chat_id, answer)
166
170
 
167
171
 
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,77 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.7] - 2026-06-05
4
+
5
+ > Visual Stabilization Release — browser-rendered screens were reviewed and
6
+ > polished until Chat, onboarding, graph, Workspace OS, and operational panels
7
+ > felt like one product.
8
+
9
+ ### Fixed
10
+
11
+ - **Chat composer haze** — removed the dark-mode white/milky bottom composer
12
+ effect and the legacy inner textarea border; the shell now owns the focus
13
+ state and the attachment/send controls stay readable.
14
+ - **Knowledge Graph canvas** — replaced the washed-out light graph work surface
15
+ with an intentional dark canvas treatment.
16
+ - **Workspace OS dark surfaces** — relationship/list cards, inputs, tags,
17
+ health cards, and capability cards no longer fall back to hardcoded white.
18
+ - **Onboarding/modals** — workspace select, PC environment analysis,
19
+ recommendation result, auto setup, mode select, pipeline, My Computer,
20
+ profile, settings, Private VPC, and model-state panels now share the same
21
+ dark panel language.
22
+ - **Account dark contrast** — account/register logo text, inputs, and window
23
+ controls remain readable in dark mode.
24
+
25
+ ### Changed
26
+
27
+ - **Cache-busting** — all versioned frontend assets now use `?v=2.2.7`,
28
+ including `/static/scripts/chat.js?v=2.2.7`.
29
+ - **Version sync** — Python package, npm package, VS Code extension, Workspace
30
+ OS, lockfiles, and runtime metadata aligned at `2.2.7`.
31
+
32
+ ### Validation
33
+
34
+ - Release target includes Python compile/pytest, npm lint/typecheck/test/build,
35
+ Python build + twine check, npm pack, VSIX package, and Playwright visual QA.
36
+ - Package-store publishing remains manual; release artifacts are version-scoped
37
+ and must use exact `2.2.7` filenames.
38
+
39
+ ## [2.2.5] - 2026-06-04
40
+
41
+ > Release Hygiene Hotfix — dark-mode overlay clarity, modal state protection,
42
+ > static asset version alignment, favicon routing, and Telegram log redaction.
43
+
44
+ ### Added
45
+
46
+ - **Modal manager** — Chat overlays now share one blocking-modal controller with
47
+ Escape close, backdrop close, pagehide/navigation cleanup, and body scroll-lock
48
+ restoration.
49
+ - **Favicon asset** — `static/favicon.ico` is packaged and served by
50
+ `/favicon.ico`.
51
+ - **Sensitive-log helper** — Telegram bot tokens are normalized to
52
+ `bot123:REDACTED` before HTTP, exception, or response text reaches logs.
53
+ - **Validation coverage** — unit tests for token masking and static release
54
+ hygiene, plus Playwright checks for modal stack behavior and favicon response.
55
+
56
+ ### Changed
57
+
58
+ - **Overlay theme tokens** — full-screen overlays use `--overlay-scrim` and no
59
+ blur-heavy backdrop, preventing washed-out dark-mode UI.
60
+ - **Surface token coverage** — modal, drawer, file manager, My Computer,
61
+ onboarding, model switcher, pipeline, and admin surfaces are remapped to
62
+ semantic tokens (`--modal`, `--surface`, `--surface-elevated`, `--input`).
63
+ - **Cache-busting** — all versioned frontend assets now use `?v=2.2.5`, including
64
+ `/static/scripts/chat.js?v=2.2.5`.
65
+ - **Version sync** — Python package, npm package, VS Code extension, Workspace
66
+ OS, lockfiles, and runtime metadata aligned at `2.2.5`.
67
+
68
+ ### Validation
69
+
70
+ - Release target includes Python compile/pytest, npm lint/typecheck/test/build,
71
+ Python build + twine check, npm pack, VSIX package, and Playwright visual QA.
72
+ - Package-store publishing remains manual; release artifacts are version-scoped
73
+ and must use exact `2.2.5` filenames.
74
+
3
75
  ## [2.2.1] - 2026-06-04
4
76
 
5
77
  > Frontend / UX Overhaul Release — Lattice AI keeps feature behavior stable
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "2.2.2"
3
+ __version__ = "2.2.7"
@@ -82,6 +82,16 @@ def create_static_routes_router(
82
82
  if not p.exists():
83
83
  raise HTTPException(status_code=404)
84
84
  return FileResponse(str(p), media_type="application/manifest+json")
85
+
86
+ @api_router.api_route("/favicon.ico", methods=["GET", "HEAD"])
87
+ async def favicon():
88
+ ico = STATIC_DIR / "favicon.ico"
89
+ png = STATIC_DIR / "icons" / "favicon-32.png"
90
+ if ico.exists():
91
+ return FileResponse(str(ico), media_type="image/x-icon")
92
+ if png.exists():
93
+ return FileResponse(str(png), media_type="image/png")
94
+ raise HTTPException(status_code=404)
85
95
 
86
96
 
87
97
  @api_router.get("/sw.js")
@@ -0,0 +1,62 @@
1
+ """Helpers for keeping sensitive values out of logs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import re
7
+ from typing import Any
8
+
9
+ _TELEGRAM_BOT_TOKEN_RE = re.compile(r"\bbot(\d{5,20}):([A-Za-z0-9_-]{8,})")
10
+ _TELEGRAM_BARE_TOKEN_RE = re.compile(
11
+ r"(?<![A-Za-z0-9_:-])(\d{5,20}):([A-Za-z0-9_-]{8,})(?![A-Za-z0-9_-])"
12
+ )
13
+ _LOG_FILTER_INSTALLED = False
14
+
15
+
16
+ def mask_telegram_bot_token(value: Any) -> str:
17
+ """Return ``value`` as text with Telegram bot token secrets redacted."""
18
+
19
+ text = str(value)
20
+ text = _TELEGRAM_BOT_TOKEN_RE.sub(r"bot\1:REDACTED", text)
21
+ return _TELEGRAM_BARE_TOKEN_RE.sub(r"bot\1:REDACTED", text)
22
+
23
+
24
+ def safe_log_text(value: Any) -> str:
25
+ """Sanitize text before it is sent to application logs."""
26
+
27
+ return mask_telegram_bot_token(value)
28
+
29
+
30
+ def _safe_log_arg(value: Any) -> Any:
31
+ if isinstance(value, str):
32
+ return mask_telegram_bot_token(value)
33
+ if isinstance(value, tuple):
34
+ return tuple(_safe_log_arg(item) for item in value)
35
+ if isinstance(value, list):
36
+ return [_safe_log_arg(item) for item in value]
37
+ if isinstance(value, dict):
38
+ return {_safe_log_arg(key): _safe_log_arg(item) for key, item in value.items()}
39
+
40
+ text = str(value)
41
+ masked = mask_telegram_bot_token(text)
42
+ return masked if masked != text else value
43
+
44
+
45
+ def install_sensitive_log_filter() -> None:
46
+ """Install a process-wide log-record sanitizer for known secret shapes."""
47
+
48
+ global _LOG_FILTER_INSTALLED
49
+ if _LOG_FILTER_INSTALLED:
50
+ return
51
+
52
+ original_factory = logging.getLogRecordFactory()
53
+
54
+ def factory(*args: Any, **kwargs: Any) -> logging.LogRecord:
55
+ record = original_factory(*args, **kwargs)
56
+ record.msg = _safe_log_arg(record.msg)
57
+ if record.args:
58
+ record.args = _safe_log_arg(record.args)
59
+ return record
60
+
61
+ logging.setLogRecordFactory(factory)
62
+ _LOG_FILTER_INSTALLED = True
@@ -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.2"
21
+ WORKSPACE_OS_VERSION = "2.2.7"
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,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "2.2.2",
3
+ "version": "2.2.7",
4
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": {
@@ -20,6 +20,8 @@
20
20
  "build": "npm run build:python",
21
21
  "build:python": "python3 -m build",
22
22
  "check:python": "python3 -m py_compile ltcai_cli.py server.py latticeai/server_app.py latticeai/api/chat.py latticeai/api/computer_use.py latticeai/api/deps.py latticeai/api/garden.py latticeai/api/local_files.py latticeai/api/permissions.py latticeai/api/setup.py latticeai/api/static_routes.py latticeai/api/tools.py latticeai/api/plugins.py latticeai/api/workflow_designer.py latticeai/api/agents.py latticeai/api/realtime.py latticeai/api/marketplace.py latticeai/services/app_context.py latticeai/services/model_runtime.py latticeai/services/model_catalog.py latticeai/services/model_recommendation.py latticeai/services/tool_dispatch.py latticeai/services/upload_service.py latticeai/core/tool_registry.py latticeai/core/enterprise.py latticeai/core/enterprise_admin.py latticeai/core/agent_prompts.py latticeai/core/workspace_os.py latticeai/core/plugins.py latticeai/core/marketplace.py latticeai/core/workflow_engine.py latticeai/core/multi_agent.py latticeai/core/realtime.py knowledge_graph.py knowledge_graph_api.py local_knowledge_api.py llm_router.py p_reinforce.py telegram_bot.py tools.py codex_telegram_bot.py",
23
+ "lint": "node --check static/scripts/account.js && node --check static/scripts/admin.js && node --check static/scripts/chat.js && node --check static/scripts/graph.js && node --check static/scripts/platform.js && node --check static/scripts/ux.js && node --check static/scripts/workspace.js && node --check tests/visual/mock_server.cjs",
24
+ "typecheck": "cd vscode-extension && npm run build",
23
25
  "test": "python3 -m pytest tests/ -v",
24
26
  "test:unit": "python3 -m pytest tests/unit/ -v",
25
27
  "test:integration": "python3 -m pytest tests/integration/ -v",
@@ -80,9 +82,9 @@
80
82
  "static/workflows.html",
81
83
  "static/agents.html",
82
84
  "static/activity.html",
85
+ "static/favicon.ico",
83
86
  "static/manifest.json",
84
87
  "static/sw.js",
85
- "static/lattice-reference.css",
86
88
  "static/workspace.css",
87
89
  "static/platform.css",
88
90
  "static/scripts/",
@@ -4,7 +4,7 @@
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.2"></script>
7
+ <script src="/static/scripts/ux.js?v=2.2.7"></script>
8
8
  <link rel="manifest" href="/manifest.json">
9
9
  <meta name="theme-color" content="#f3ecff">
10
10
  <meta name="apple-mobile-web-app-capable" content="yes">
@@ -14,8 +14,13 @@
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
15
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
16
16
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
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
+ <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
18
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
19
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
20
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
21
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
22
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
23
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
19
24
  </head>
20
25
  <body class="lattice-ref-auth">
21
26
  <div class="orb orb-1"></div>
@@ -105,6 +110,6 @@
105
110
  <a href="#" onclick="return false;" id="privacy-link">개인정보 처리방침</a>
106
111
  </footer>
107
112
 
108
- <script src="/static/scripts/account.js?v=0.3.3"></script>
113
+ <script src="/static/scripts/account.js?v=2.2.7"></script>
109
114
  </body>
110
115
  </html>
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
6
6
  <title>Realtime Activity — Lattice AI</title>
7
- <script src="/static/scripts/ux.js?v=2.2.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" />
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" />
11
11
  </head>
12
12
  <body>
13
13
  <main>
package/static/admin.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content">
7
7
  <title>Lattice AI Admin</title>
8
- <script src="/static/scripts/ux.js?v=2.2.2"></script>
8
+ <script src="/static/scripts/ux.js?v=2.2.7"></script>
9
9
  <link rel="manifest" href="/manifest.json">
10
10
  <meta name="theme-color" content="#f3ecff">
11
11
  <meta name="apple-mobile-web-app-capable" content="yes">
@@ -15,8 +15,13 @@
15
15
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16
16
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap">
17
17
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
18
- <link rel="stylesheet" href="/static/lattice-reference.css?v=0.3.3">
19
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
18
+ <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
19
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
20
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
21
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
22
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
23
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
24
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
20
25
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
21
26
  </head>
22
27
 
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
6
6
  <title>Multi-Agent Runtime — Lattice AI</title>
7
- <script src="/static/scripts/ux.js?v=2.2.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" />
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" />
11
11
  </head>
12
12
  <body>
13
13
  <main>
package/static/chat.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content">
7
7
  <title>Lattice AI — All-in-One Multimodal Workspace</title>
8
- <script src="/static/scripts/ux.js?v=2.2.2"></script>
8
+ <script src="/static/scripts/ux.js?v=2.2.7"></script>
9
9
 
10
10
  <!-- PWA -->
11
11
  <link rel="manifest" href="/manifest.json">
@@ -24,8 +24,13 @@
24
24
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
25
25
 
26
26
  <!-- ── Setup Wizard Styles ──────────────────────────────────────────── -->
27
- <link rel="stylesheet" href="/static/lattice-reference.css?v=0.3.3">
28
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
27
+ <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.7">
28
+ <link rel="stylesheet" href="/static/css/reference/base.css?v=2.2.7">
29
+ <link rel="stylesheet" href="/static/css/reference/account.css?v=2.2.7">
30
+ <link rel="stylesheet" href="/static/css/reference/admin.css?v=2.2.7">
31
+ <link rel="stylesheet" href="/static/css/reference/graph.css?v=2.2.7">
32
+ <link rel="stylesheet" href="/static/css/reference/chat.css?v=2.2.7">
33
+ <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
29
34
  </head>
30
35
 
31
36
  <body class="lattice-ref-chat">
@@ -414,7 +419,7 @@
414
419
  <!-- Planning -->
415
420
  <div class="pipeline-phase-row">
416
421
  <div class="pipeline-phase-label">
417
- <span class="pipeline-phase-badge" style="background:rgba(99,102,241,0.15);color:#818cf8">📋 Planning</span>
422
+ <span class="pipeline-phase-badge" style="background:rgba(99,102,241,0.15);color:var(--accent)">📋 Planning</span>
418
423
  <span style="color:var(--muted);font-size:11px">계획 수립 · 유저와 함께 검토</span>
419
424
  </div>
420
425
  <select id="pipeline-planning-select" class="pipeline-select">
@@ -425,7 +430,7 @@
425
430
  <!-- Executing -->
426
431
  <div class="pipeline-phase-row">
427
432
  <div class="pipeline-phase-label">
428
- <span class="pipeline-phase-badge" style="background:rgba(34,197,94,0.12);color:#4ade80">⚙️ Executing</span>
433
+ <span class="pipeline-phase-badge" style="background:rgba(34,197,94,0.12);color:var(--success)">⚙️ Executing</span>
429
434
  <span style="color:var(--muted);font-size:11px">코드 작성 · 파일 생성 · 툴 호출</span>
430
435
  </div>
431
436
  <select id="pipeline-executing-select" class="pipeline-select">
@@ -436,7 +441,7 @@
436
441
  <!-- Reviewing -->
437
442
  <div class="pipeline-phase-row">
438
443
  <div class="pipeline-phase-label">
439
- <span class="pipeline-phase-badge" style="background:rgba(251,146,60,0.12);color:#fb923c">🔍 Reviewing</span>
444
+ <span class="pipeline-phase-badge" style="background:rgba(251,146,60,0.12);color:var(--warning)">🔍 Reviewing</span>
440
445
  <span style="color:var(--muted);font-size:11px">결과 검증 · 최종 답변 생성</span>
441
446
  </div>
442
447
  <select id="pipeline-reviewing-select" class="pipeline-select">
@@ -501,7 +506,7 @@
501
506
  <button class="admin-action" onclick="sendFileToChat()" style="flex:1;background:rgba(111,66,232,0.12);border-color:rgba(111,66,232,0.28)">
502
507
  <i class="ti ti-send"></i> AI에게 보내기
503
508
  </button>
504
- <button class="status-btn" onclick="closeFileEditor();document.getElementById('local-browser-overlay').style.display='flex'" style="flex:1">
509
+ <button class="status-btn" onclick="closeFileEditor();showModalLayer('local-browser-overlay')" style="flex:1">
505
510
  <i class="ti ti-arrow-left"></i> 탐색기로
506
511
  </button>
507
512
  </div>
@@ -736,7 +741,7 @@
736
741
  <div id="cu-screenshot-meta" style="font-size:11px;color:var(--faint);text-align:center"></div>
737
742
  </div>
738
743
  <!-- Controls panel -->
739
- <div style="width:280px;padding:14px;display:flex;flex-direction:column;gap:12px;overflow-y:auto">
744
+ <div class="cu-controls-panel" style="padding:14px;display:flex;flex-direction:column;gap:12px;overflow-y:auto">
740
745
  <!-- Agent task input -->
741
746
  <div>
742
747
  <div style="font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px">AI 자동 작업</div>
@@ -774,7 +779,7 @@
774
779
  <div id="cu-log" style="flex:1;background:var(--surface-3);border:1px solid var(--border);border-radius:8px;padding:8px;font-size:11px;font-family:monospace;color:var(--muted);overflow-y:auto;max-height:200px;min-height:80px"></div>
775
780
  </div>
776
781
  <!-- Permission note -->
777
- <div style="background:rgba(240,168,50,.07);border:1px solid rgba(240,168,50,.2);border-radius:8px;padding:9px 11px;font-size:11px;color:rgba(240,168,50,.85)">
782
+ <div style="background:rgba(240,168,50,.07);border:1px solid rgba(240,168,50,.2);border-radius:8px;padding:9px 11px;font-size:11px;color:var(--warning)">
778
783
  <i class="ti ti-alert-triangle"></i> macOS 손쉬운 사용 권한 필요<br>
779
784
  <span style="opacity:.7">시스템 설정 → 개인 정보 보호 → 손쉬운 사용</span>
780
785
  </div>
@@ -833,7 +838,7 @@
833
838
  </div>
834
839
 
835
840
 
836
- <script src="/static/scripts/chat.js?v=0.3.4"></script>
841
+ <script src="/static/scripts/chat.js?v=2.2.7"></script>
837
842
  </body>
838
843
 
839
844
  </html>