ltcai 1.5.0 → 1.7.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 CHANGED
@@ -155,42 +155,62 @@ See [docs/architecture.md](docs/architecture.md) for request and data-flow detai
155
155
  </tr>
156
156
  </table>
157
157
 
158
- > Screenshots above are the live web UI. The diagrams below map the product
159
- > experience to the current v1.5.0 structure.
158
+ > Every image in this section is a **real screenshot** of the running app
159
+ > (Lattice AI v1.7.0), captured with a headless browser.
160
160
 
161
161
  ---
162
162
 
163
163
  ## Product Experience
164
164
 
165
- ### Local model recommendation
165
+ ### Onboard in minutes
166
166
 
167
- Lattice AI detects your OS, CPU, GPU, RAM, and disk, then rates every local model
168
- **Recommended**, **Compatible**, or **Not Recommended** for your machine — grouped
169
- by family (Gemma, Qwen, Llama, Phi, DeepSeek, and more).
167
+ A first run detects your OS, CPU, GPU, RAM, and disk, then recommends a local
168
+ model and rates every option **Recommended**, **Compatible**, or **Not
169
+ Recommended** for your machine — grouped by family (Gemma, Qwen, Llama, Phi,
170
+ DeepSeek, and more), with estimated RAM and a clear next step.
170
171
 
171
172
  <div align="center">
172
- <img src="docs/images/model-recommendation.png" alt="Tri-state local model recommendation grouped by family" width="100%"/>
173
+ <img src="docs/images/onboarding.png" alt="Onboarding hardware scan: OS, CPU, GPU, RAM, disk, runtime" width="49%"/>
174
+ <img src="docs/images/model-recommendation.png" alt="Local model recommendation with best-pick callout and per-family status" width="49%"/>
173
175
  </div>
174
176
 
175
177
  ### Workspaces & organization
176
178
 
177
- Switch instantly between a **Personal** workspace and shared **Organization**
178
- workspaces. Org data is scoped by `workspace_id`, and `owner / admin / member /
179
- viewer` roles map to a transparent permission matrix.
179
+ A **Current Workspace** card shows exactly where you are; switch instantly
180
+ between a **Personal** workspace and shared **Organization** workspaces. Org data
181
+ is scoped by `workspace_id`, and `owner / admin / member / viewer` roles map to a
182
+ transparent permission matrix with member management. A Workspace Health panel
183
+ summarizes indexed files, graph size, installed skills, memories, agent runs,
184
+ current model, last sync time, and status at a glance.
180
185
 
181
186
  <div align="center">
182
- <img src="docs/images/workspace.png" alt="Personal and Organization workspace model" width="49%"/>
183
- <img src="docs/images/organization.png" alt="Organization roles and permission matrix" width="49%"/>
187
+ <img src="docs/images/workspace.png" alt="Current Workspace summary card with scoped counts" width="100%"/>
188
+ <img src="docs/images/organization.png" alt="Organization workspace with members and roles" width="100%"/>
184
189
  </div>
185
190
 
186
- ### Knowledge graph & skills
191
+ ### Knowledge graph explorer
187
192
 
188
- Your work becomes a typed knowledge graph (built automatically), and skills extend
189
- the workspace through an in-product marketplace.
193
+ Your work becomes a typed knowledge graph automatically. The Entity Explorer
194
+ surfaces the most important entities and, on selection, their inbound/outbound
195
+ relationships, related entities, and a path back to you.
190
196
 
191
197
  <div align="center">
192
- <img src="docs/images/graph.png" alt="Knowledge graph node and edge taxonomy" width="49%"/>
193
- <img src="docs/images/skills.png" alt="Skill marketplace: recommended, popular, installed, updates" width="49%"/>
198
+ <img src="docs/images/graph.png" alt="Knowledge graph entity explorer with relationship detail" width="100%"/>
199
+ </div>
200
+
201
+ The Graph Canvas also supports node expand/collapse, focused subgraphs,
202
+ relationship highlighting, shortest-path visualization, and direct navigation
203
+ back into source conversations or files.
204
+
205
+ ### Skills & editions
206
+
207
+ Browse and install skills from an in-product marketplace; an honest editions
208
+ panel shows that every Enterprise capability is an opt-in extension point,
209
+ disabled in the open-source Community build.
210
+
211
+ <div align="center">
212
+ <img src="docs/images/skills.png" alt="Skill marketplace tabs: recommended, popular, installed, updates" width="49%"/>
213
+ <img src="docs/images/enterprise.png" alt="Enterprise capability status panel — all disabled in Community" width="49%"/>
194
214
  </div>
195
215
 
196
216
  ---
@@ -333,22 +353,32 @@ Supported routes include OpenAI-compatible APIs, OpenRouter, Groq, Together, xAI
333
353
 
334
354
  ## Current release
335
355
 
336
- **1.5.0 — Unified Product Release.** Onboarding, model recommendation, and CI
337
- stabilization in one release:
338
-
339
- - **CI / VSIX recovery** — the stale `@azure/core-tracing` lockfile pin that
340
- broke `npm ci` (ETARGET) is regenerated, so the VSIX build is green again
341
- - **Local model recommendation** a hardware-aware engine
342
- (`latticeai/services/model_recommendation.py`) classifies the model catalog as
343
- Recommended / Compatible / Not Recommended, exposed at `/models/recommendations`
344
- - **Catalog extraction** — the static model catalog moved to
345
- `latticeai/services/model_catalog.py`, simplifying `model_runtime.py`
346
- - **Enterprise PoC seam** — admin policy / audit-export / SIEM-stub / org-settings
347
- surfaces consult the capability registry (Community keeps everything ungated)
348
- - **Documentation & visuals** — README rewritten as a product page with an
349
- up-to-date architecture diagram and structural visuals
350
- - Python package, npm package, VS Code extension, FastAPI app, and `/health`
351
- version metadata are aligned at `1.5.0`
356
+ **1.7.0 — Graph & Collaboration Release.** An additive UI and validation release
357
+ for graph exploration, workspace health, Enterprise admin visibility, skills,
358
+ screenshots, and visual smoke coverage.
359
+
360
+ - **Graph Canvas** expand/collapse, subgraph focus, relationship/path
361
+ highlighting, shortest-path visualization, and click-through node navigation.
362
+ - **Workspace Health** indexed files, graph nodes/relationships, installed
363
+ skills, memories, agent runs, current model, last sync, and workspace status.
364
+ - **Enterprise Admin UI** — admin policies, audit export, SIEM export preview,
365
+ organization settings, and capability status surfaced in `/admin`.
366
+ - **Skill Marketplace completion** — install progress, validation status,
367
+ recommended/popular skills, updates, version, and source metadata.
368
+ - **Screenshot automation + visual smoke tests** — `scripts/capture/*` and a
369
+ scheduled Playwright workflow cover Workspace, Graph, Skills, Organization,
370
+ and Enterprise screens.
371
+ - **Compatibility preserved** API schemas, `server:app`,
372
+ `latticeai.server_app.app`, CLI, MCP, model, workspace, chat, KG, and VS Code
373
+ extension surfaces remain backward compatible.
374
+
375
+ | Version | Theme |
376
+ |---|---|
377
+ | **1.7.0** | Graph & Collaboration Release |
378
+ | 1.6.0 | Product Experience Deepening (UX + real screenshots) |
379
+ | 1.5.0 | Unified Product Release (CI/VSIX recovery, model recommendation, Enterprise PoC) |
380
+ | 1.4.0 | Server App final decomposition |
381
+ | 1.1.0–1.3.0 | Organization workspaces, modularization, route safety net |
352
382
 
353
383
  See the full [changelog](docs/CHANGELOG.md) and [RELEASE.md](RELEASE.md).
354
384
 
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,94 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.7.0] - 2026-06-01
4
+
5
+ > Graph & Collaboration Release — Graph Canvas interactions, Enterprise Admin
6
+ > UI, Skill Marketplace completion, Workspace Health, screenshot automation, and
7
+ > Playwright visual smoke coverage. Backward compatible: API paths/schemas,
8
+ > `server:app`, `latticeai.server_app.app`, CLI, Workspace/Chat/Model/MCP/KG
9
+ > APIs, and VS Code extension commands remain stable.
10
+
11
+ ### Added
12
+
13
+ - **Graph Canvas** — node expand/collapse, focused subgraphs, relationship
14
+ highlighting, shortest-path visualization, URL/node click-through navigation,
15
+ and source/conversation actions. Uses existing graph/relationship APIs; no
16
+ schema change or destructive migration.
17
+ - **Enterprise Admin UI** — `/admin#enterprise` now surfaces Admin Policies,
18
+ Audit Export, SIEM Export preview, Organization Settings, and Enterprise
19
+ Capability Status. Community remains fully functional and ungated.
20
+ - **Skill Marketplace completion** — install progress (Download → Validate →
21
+ Ready), validation status, recommended/popular/update surfaces, version
22
+ metadata, and source metadata.
23
+ - **Workspace Health Dashboard** — indexed files, graph nodes, graph
24
+ relationships, installed skills, memory entries, agent runs, current model,
25
+ last sync time, and workspace status.
26
+ - **Screenshot automation** — `scripts/capture/` contains reproducible
27
+ Playwright capture scripts for workspace, graph, skills, enterprise, and
28
+ onboarding screenshots.
29
+ - **Visual smoke tests** — `tests/visual/*` plus `.github/workflows/visual.yml`
30
+ run Workspace, Graph, Skills, Organization, and Enterprise screen checks on
31
+ PR/push and nightly schedule with failure artifacts.
32
+
33
+ ### Changed
34
+
35
+ - Python package, npm package, VS Code extension, Workspace OS, FastAPI app, and
36
+ `/health` version metadata aligned at `1.7.0`.
37
+ - CI package validation is version-scoped instead of a broad `dist/*` check.
38
+
39
+ ### Validation
40
+
41
+ - Unit, integration, startup/import, route compatibility, MCP, model endpoint,
42
+ visual smoke, VSIX build, and release artifact validation are the release
43
+ target checks. Package-store publish remains manual only.
44
+
45
+ ## [1.6.0] - 2026-06-01
46
+
47
+ > Product Experience Deepening — user-facing UX (Knowledge Graph explorer,
48
+ > workspace summary, model recommendation 2.0, skill marketplace tabs, Enterprise
49
+ > capability panel) and a refresh of `docs/images/*` to **real captured UI**
50
+ > screenshots. Not a refactor: API paths, request/response schemas, `server:app`,
51
+ > CLI, MCP, and the Knowledge Graph contract are unchanged. The only code changes
52
+ > are additive frontend (`static/`) and version metadata.
53
+
54
+ ### Added
55
+
56
+ - **Knowledge Graph Explorer (Workspace OS)** — an Entity Explorer (importance-
57
+ ranked entity cards + search) with a detail panel showing inbound/outbound
58
+ relationships, related entities, and the shortest path back to you; plus a
59
+ Recent Activity feed and a Workspace Memory feed. Built entirely on the existing
60
+ `/knowledge-graph/graph` and `/workspace/relationships/*` endpoints (additive
61
+ UI, no new API, no schema change).
62
+ - **Workspace summary & quick-switch** — a "Current Workspace" card (active
63
+ workspace, role, members, scoped counts) and one-click switch chips, preserving
64
+ `workspace_id` scoping and the owner/admin/member/viewer model.
65
+ - **Model Recommendation 2.0** — the onboarding recommendation panel now shows a
66
+ machine summary (OS/RAM/GPU/engine), a "best for this PC" callout with the
67
+ reason, estimated RAM, and next step, per-family status, and a cloud caution.
68
+ Estimates are labelled and conservative.
69
+ - **Skill Marketplace tabs** — Recommended / Popular / Installed / Updates tabs
70
+ with version, category, and source, plus install / enable / disable actions on
71
+ the existing skill lifecycle API.
72
+ - **Enterprise capability panel** — a 12-capability status matrix in Workspace OS
73
+ (Community reports all disabled; nothing gates a Community feature).
74
+
75
+ ### Changed
76
+
77
+ - **Real UI visuals** — `docs/images/{hero.gif,onboarding,model-recommendation,
78
+ workspace,graph,organization,skills,enterprise}` are now **real screenshots**
79
+ captured from the running app with Playwright + headless Chrome (the v1.5.0
80
+ set was structural diagrams). `architecture.png` remains a structural diagram.
81
+ README references the new real screenshots with no broken links.
82
+ - Python package, npm package, VS Code extension, FastAPI app, and `/health`
83
+ version metadata aligned at `1.6.0`.
84
+
85
+ ### Validation
86
+
87
+ - Unit tests pass; route-compatibility, startup/import, streaming, model-endpoint,
88
+ MCP/KG, and workspace/org permission tests preserved; `npm run check:python`
89
+ green; new UI verified rendering in a real browser via Playwright; VSIX build
90
+ verified. Test/build/packaging artifacts only — no package-store publish.
91
+
3
92
  ## [1.5.0] - 2026-06-01
4
93
 
5
94
  > Unified Product Release — CI/VSIX recovery, hardware-aware local model
@@ -50,6 +50,10 @@ the boundary stays predictable for contributors and users.
50
50
 
51
51
  - `GET /workspace/editions` → edition + per-capability matrix.
52
52
  - `GET /workspace/os` → `edition` block in the Workspace OS summary.
53
+ - `/admin#enterprise` → Admin policy, audit export, SIEM preview,
54
+ organization settings, and capability status UI.
55
+ - `GET /admin/enterprise` and `GET /admin/enterprise/siem-export` → descriptive
56
+ Community-safe Enterprise surfaces for integrations.
53
57
  - `latticeai.core.enterprise.detect_edition()` for in-process checks.
54
58
 
55
59
  In the Community build all of the above report `community` with every Enterprise
@@ -33,8 +33,14 @@ Community code consults the seam at extension points via
33
33
  `is_capability_enabled(EnterpriseCapability.X)`. In the Community build this is
34
34
  always `False`, so the Community code path is taken and nothing is gated off.
35
35
 
36
- The live edition + capability matrix is exposed at `GET /workspace/editions`
37
- and surfaced in the Workspace OS summary (`GET /workspace/os` → `edition`).
36
+ The live edition + capability matrix is exposed at `GET /workspace/editions`,
37
+ surfaced in the Workspace OS summary (`GET /workspace/os` → `edition`), and
38
+ shown in the Enterprise Admin UI at `/admin#enterprise`.
39
+
40
+ Community also exposes descriptive admin surfaces at `GET /admin/enterprise`
41
+ and `GET /admin/enterprise/siem-export`: they show policy/export/envelope
42
+ shapes while reporting Enterprise-only capabilities disabled and never
43
+ streaming external events.
38
44
 
39
45
  ## Enterprise capability roadmap
40
46
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "1.5.0"
3
+ __version__ = "1.7.0"
@@ -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 = "1.5.0"
21
+ WORKSPACE_OS_VERSION = "1.7.0"
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
@@ -353,6 +353,7 @@ class WorkspaceOSStore:
353
353
  "workspaces": state.get("workspaces"),
354
354
  "navigation": list(WORKSPACE_AREAS),
355
355
  "feature_flags": state.get("feature_flags"),
356
+ "updated_at": state.get("updated_at"),
356
357
  "counts": {
357
358
  "snapshots": len(_listify(state.get("snapshots"))),
358
359
  "traces": len(_listify(state.get("traces"))),
@@ -1424,6 +1425,9 @@ class WorkspaceOSStore:
1424
1425
  "description": desc,
1425
1426
  "version": version,
1426
1427
  "installed": True,
1428
+ "install_status": entry.get("install_status") or "ready",
1429
+ "validation_status": "ready" if skill_md.exists() else "missing_manifest",
1430
+ "source": entry.get("source") or "local",
1427
1431
  "path": str(skill_dir),
1428
1432
  "updated_at": entry.get("updated_at") or _now(),
1429
1433
  })
@@ -1438,6 +1442,9 @@ class WorkspaceOSStore:
1438
1442
  **item,
1439
1443
  "enabled": bool(state_entry.get("enabled", True)),
1440
1444
  "installed": bool(state_entry.get("installed")),
1445
+ "install_status": state_entry.get("install_status") or ("ready" if state_entry.get("installed") else "available"),
1446
+ "validation_status": state_entry.get("validation_status") or item.get("validation_status") or ("ready" if state_entry.get("installed") else "not_installed"),
1447
+ "source": state_entry.get("source") or item.get("source") or item.get("plugin") or "marketplace",
1441
1448
  "version": state_entry.get("version") or item.get("version") or "remote",
1442
1449
  })
1443
1450
  self.save_state(state)
@@ -1465,6 +1472,9 @@ class WorkspaceOSStore:
1465
1472
  "installed": True,
1466
1473
  "enabled": entry.get("enabled", True),
1467
1474
  "version": version,
1475
+ "install_status": "ready",
1476
+ "validation_status": "ready",
1477
+ "source": (metadata or {}).get("source") or entry.get("source") or "marketplace",
1468
1478
  "metadata": metadata or entry.get("metadata") or {},
1469
1479
  "updated_at": _now(),
1470
1480
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "Lattice AI Workspace OS for local-first graph, memory, agent, workflow, and skill operations",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -23,6 +23,12 @@
23
23
  "test": "python3 -m pytest tests/ -v",
24
24
  "test:unit": "python3 -m pytest tests/unit/ -v",
25
25
  "test:integration": "python3 -m pytest tests/integration/ -v",
26
+ "test:visual": "playwright test",
27
+ "capture:workspace": "node scripts/capture/capture_workspace.js",
28
+ "capture:graph": "node scripts/capture/capture_graph.js",
29
+ "capture:skills": "node scripts/capture/capture_skills.js",
30
+ "capture:enterprise": "node scripts/capture/capture_enterprise.js",
31
+ "capture:onboarding": "node scripts/capture/capture_onboarding.js",
26
32
  "publish:npm": "npm publish --access public",
27
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"
28
34
  },
@@ -75,5 +81,8 @@
75
81
  ],
76
82
  "publishConfig": {
77
83
  "access": "public"
84
+ },
85
+ "devDependencies": {
86
+ "@playwright/test": "^1.60.0"
78
87
  }
79
88
  }
package/static/admin.html CHANGED
@@ -26,6 +26,7 @@
26
26
  <a href="#users" data-admin-nav="users"><i class="ti ti-users"></i> <span data-i18n="nav_users">사용자 관리</span></a>
27
27
  <a href="#permissions" data-admin-nav="permissions"><i class="ti ti-key"></i> <span data-i18n="nav_permissions">권한 관리</span></a>
28
28
  <a href="#sso" data-admin-nav="sso"><i class="ti ti-lock-access"></i> <span data-i18n="nav_sso">SSO 관리</span></a>
29
+ <a href="#enterprise" data-admin-nav="enterprise"><i class="ti ti-building-skyscraper"></i> <span data-i18n="nav_enterprise">Enterprise</span></a>
29
30
  <a href="#security" data-admin-nav="security"><i class="ti ti-shield-check"></i> <span data-i18n="nav_security">보안 모니터링</span></a>
30
31
  <a href="#audit" data-admin-nav="audit"><i class="ti ti-report-search"></i> <span data-i18n="nav_audit">감사 로그</span></a>
31
32
  <a href="/workspace"><i class="ti ti-layout-dashboard"></i> <span>Workspace OS</span></a>
@@ -256,6 +257,67 @@
256
257
  </section>
257
258
  </section>
258
259
 
260
+ <section class="admin-view" id="admin-view-enterprise" data-admin-view="enterprise">
261
+ <section class="panel">
262
+ <div class="panel-header">
263
+ <div>
264
+ <h3 data-i18n="enterprise_title">Enterprise Admin</h3>
265
+ <p data-i18n="enterprise_desc">Admin policies, audit export, SIEM export, organization settings, and capability status.</p>
266
+ </div>
267
+ <div class="tag-row" id="enterprise-status-tags"></div>
268
+ </div>
269
+ <div class="panel-body">
270
+ <div class="enterprise-grid" id="enterprise-capability-status"></div>
271
+ </div>
272
+ </section>
273
+
274
+ <section class="panel-grid">
275
+ <article class="panel">
276
+ <div class="panel-header">
277
+ <div>
278
+ <h3 data-i18n="enterprise_policies">Admin Policies</h3>
279
+ <p data-i18n="enterprise_policies_desc">Effective Community policy and Enterprise policy-pack status.</p>
280
+ </div>
281
+ </div>
282
+ <div class="panel-body" id="enterprise-admin-policies"></div>
283
+ </article>
284
+ <article class="panel">
285
+ <div class="panel-header">
286
+ <div>
287
+ <h3 data-i18n="enterprise_org">Organization Settings</h3>
288
+ <p data-i18n="enterprise_org_desc">Workspace governance and organization capability status.</p>
289
+ </div>
290
+ </div>
291
+ <div class="panel-body" id="enterprise-org-settings"></div>
292
+ </article>
293
+ </section>
294
+
295
+ <section class="panel-grid">
296
+ <article class="panel">
297
+ <div class="panel-header">
298
+ <div>
299
+ <h3 data-i18n="enterprise_audit_export">Audit Export</h3>
300
+ <p data-i18n="enterprise_audit_export_desc">Local export remains available in Community; retention is an Enterprise extension point.</p>
301
+ </div>
302
+ </div>
303
+ <div class="panel-body" id="enterprise-audit-export"></div>
304
+ </article>
305
+ <article class="panel">
306
+ <div class="panel-header">
307
+ <div>
308
+ <h3 data-i18n="enterprise_siem">SIEM Export</h3>
309
+ <p data-i18n="enterprise_siem_desc">Preview the SIEM envelope without streaming external events in Community.</p>
310
+ </div>
311
+ <button class="btn" id="refresh-siem-btn" type="button"><i class="ti ti-refresh"></i> <span>SIEM</span></button>
312
+ </div>
313
+ <div class="panel-body">
314
+ <div id="enterprise-siem-export"></div>
315
+ <pre class="enterprise-json" id="enterprise-siem-preview"></pre>
316
+ </div>
317
+ </article>
318
+ </section>
319
+ </section>
320
+
259
321
  <section class="admin-view" id="admin-view-security" data-admin-view="security">
260
322
  <!-- Security & Audit Command Center (피드백 #5) -->
261
323
  <section class="panel" id="security-overview-panel">
package/static/graph.html CHANGED
@@ -51,7 +51,12 @@
51
51
  </section>
52
52
 
53
53
  <div class="toolbar">
54
- <button class="tb-btn" id="refresh-btn">↺ Refresh</button>
54
+ <button class="tb-btn" id="refresh-btn"><i class="ti ti-refresh"></i> Refresh</button>
55
+ <button class="tb-btn" id="fit-btn" title="Fit graph"><i class="ti ti-arrows-maximize"></i> Fit</button>
56
+ <button class="tb-btn" id="expand-btn" title="Expand selected node"><i class="ti ti-circle-plus"></i> Expand</button>
57
+ <button class="tb-btn" id="collapse-btn" title="Collapse selected neighbors"><i class="ti ti-circle-minus"></i> Collapse</button>
58
+ <button class="tb-btn" id="focus-btn" title="Focus selected subgraph"><i class="ti ti-focus-2"></i> Focus</button>
59
+ <button class="tb-btn" id="path-btn" title="Shortest path from saved start"><i class="ti ti-route"></i> Path</button>
55
60
  <div class="lang-picker" id="graph-lang-picker">
56
61
  <button class="tb-btn" id="graph-lang-btn" type="button" onclick="toggleLangMenu('graph-lang-picker')">Language</button>
57
62
  <div class="lang-picker-menu" id="graph-lang-picker-menu">
@@ -60,6 +65,7 @@
60
65
  </div>
61
66
  </div>
62
67
  </div>
68
+ <div id="graph-focus-chip" class="focus-chip" hidden></div>
63
69
  </main>
64
70
 
65
71
  <aside>