ltcai 7.6.0 → 7.8.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.
Files changed (61) hide show
  1. package/README.md +39 -34
  2. package/docs/CHANGELOG.md +39 -0
  3. package/frontend/src/App.tsx +4 -2
  4. package/frontend/src/api/client.ts +9 -2
  5. package/frontend/src/components/LivingBrain.tsx +9 -1
  6. package/frontend/src/components/ProductFlow.tsx +27 -3
  7. package/frontend/src/components/onboarding/RecommendationScreen.tsx +33 -26
  8. package/frontend/src/features/brain/BrainConversation.tsx +214 -94
  9. package/frontend/src/features/brain/BrainHome.tsx +32 -28
  10. package/frontend/src/features/review/ReviewInbox.tsx +2 -2
  11. package/frontend/src/features/review/reviewHelpers.ts +11 -11
  12. package/frontend/src/i18n.ts +162 -26
  13. package/frontend/src/pages/Act.tsx +28 -14
  14. package/frontend/src/pages/Ask.tsx +11 -2
  15. package/frontend/src/pages/Brain.tsx +12 -2
  16. package/frontend/src/routes.ts +6 -6
  17. package/frontend/src/styles.css +592 -25
  18. package/lattice_brain/__init__.py +1 -1
  19. package/lattice_brain/runtime/multi_agent.py +1 -1
  20. package/latticeai/__init__.py +1 -1
  21. package/latticeai/core/marketplace.py +1 -1
  22. package/latticeai/core/workspace_os.py +1 -1
  23. package/latticeai/services/architecture_readiness.py +25 -7
  24. package/latticeai/services/product_readiness.py +159 -0
  25. package/package.json +1 -1
  26. package/scripts/product_readiness.py +37 -0
  27. package/src-tauri/Cargo.lock +1 -1
  28. package/src-tauri/Cargo.toml +1 -1
  29. package/src-tauri/tauri.conf.json +1 -1
  30. package/static/app/asset-manifest.json +28 -28
  31. package/static/app/assets/{Act-CSeeIWB4.js → Act-DOvf59ru.js} +2 -2
  32. package/static/app/assets/{Act-CSeeIWB4.js.map → Act-DOvf59ru.js.map} +1 -1
  33. package/static/app/assets/Brain-C7_0mEiI.js +322 -0
  34. package/static/app/assets/Brain-C7_0mEiI.js.map +1 -0
  35. package/static/app/assets/Capture-B9Tlhzqr.js +2 -0
  36. package/static/app/assets/Capture-B9Tlhzqr.js.map +1 -0
  37. package/static/app/assets/Library-BJPEEm5O.js +2 -0
  38. package/static/app/assets/{Library-C4zmA8O2.js.map → Library-BJPEEm5O.js.map} +1 -1
  39. package/static/app/assets/System-D6t9jo9V.js +2 -0
  40. package/static/app/assets/{System-Da-Kxwiz.js.map → System-D6t9jo9V.js.map} +1 -1
  41. package/static/app/assets/index-C7g26IF6.css +2 -0
  42. package/static/app/assets/index-DbcEYJQ2.js +17 -0
  43. package/static/app/assets/index-DbcEYJQ2.js.map +1 -0
  44. package/static/app/assets/primitives-CD38lt4n.js +2 -0
  45. package/static/app/assets/{primitives-CSsF_Ymb.js.map → primitives-CD38lt4n.js.map} +1 -1
  46. package/static/app/assets/textarea-BZk6ybp5.js +2 -0
  47. package/static/app/assets/{textarea-CJMFSyfQ.js.map → textarea-BZk6ybp5.js.map} +1 -1
  48. package/static/app/index.html +2 -2
  49. package/frontend/src/components/BrainConversation.tsx +0 -533
  50. package/frontend/src/components/FirstRunGuide.tsx +0 -99
  51. package/static/app/assets/Brain-D_Ne4YoR.js +0 -322
  52. package/static/app/assets/Brain-D_Ne4YoR.js.map +0 -1
  53. package/static/app/assets/Capture-YFRAO4bJ.js +0 -2
  54. package/static/app/assets/Capture-YFRAO4bJ.js.map +0 -1
  55. package/static/app/assets/Library-C4zmA8O2.js +0 -2
  56. package/static/app/assets/System-Da-Kxwiz.js +0 -2
  57. package/static/app/assets/index-BwmCpRoW.css +0 -2
  58. package/static/app/assets/index-D1hsexMt.js +0 -17
  59. package/static/app/assets/index-D1hsexMt.js.map +0 -1
  60. package/static/app/assets/primitives-CSsF_Ymb.js +0 -2
  61. package/static/app/assets/textarea-CJMFSyfQ.js +0 -2
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "7.6.0"
29
+ __version__ = "7.8.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, List, Optional
21
21
  from .contracts import multi_agent_contract
22
22
 
23
23
 
24
- MULTI_AGENT_VERSION = "7.6.0"
24
+ MULTI_AGENT_VERSION = "7.8.0"
25
25
 
26
26
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
27
27
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "7.6.0"
3
+ __version__ = "7.8.0"
@@ -11,7 +11,7 @@ from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
13
 
14
- MARKETPLACE_VERSION = "7.6.0"
14
+ MARKETPLACE_VERSION = "7.8.0"
15
15
  TEMPLATE_KINDS = ("plugin", "workflow", "agent")
16
16
 
17
17
 
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, Iterable, List, Optional
21
21
  from lattice_brain.runtime.contracts import realtime_event_contract, run_record_contract, workflow_run_contract
22
22
 
23
23
 
24
- WORKSPACE_OS_VERSION = "7.6.0"
24
+ WORKSPACE_OS_VERSION = "7.8.0"
25
25
 
26
26
  # Workspace types separate single-user Personal workspaces from shared
27
27
  # Organization workspaces. Both keep the same local-first JSON store; the type
@@ -1,13 +1,15 @@
1
1
  """Machine-checkable architecture readiness gates for release work.
2
2
 
3
- The 7.6 line closes the two local review notes by turning their architectural
4
- claims into a small contract: AgentRuntime, ToolRegistry, central Config,
3
+ The 7.7 complete-product line preserves the 7.6 closure of the two local review
4
+ notes by keeping their architectural claims in a small contract: AgentRuntime,
5
+ ToolRegistry, central Config,
5
6
  decomposed API routers, and Knowledge Graph portability must all be discoverable
6
7
  and testable before the release can be called complete.
7
8
  """
8
9
 
9
10
  from __future__ import annotations
10
11
 
12
+ import importlib
11
13
  from dataclasses import dataclass
12
14
  from pathlib import Path
13
15
  from typing import Any, Dict, List
@@ -21,6 +23,22 @@ class ArchitectureGate:
21
23
  evidence: List[str]
22
24
 
23
25
 
26
+ def _symbol_exists(dotted: str) -> bool:
27
+ """Verify a dotted path like 'pkg.mod.Class' actually imports and has the attr.
28
+ Non-symbol evidence (with space/* or docs) treated as non-blocking here.
29
+ """
30
+ if not dotted or " " in dotted or "*" in dotted or "::" in dotted:
31
+ return True
32
+ try:
33
+ if "." not in dotted:
34
+ return False
35
+ mod_name, name = dotted.rsplit(".", 1)
36
+ mod = importlib.import_module(mod_name)
37
+ return hasattr(mod, name)
38
+ except Exception:
39
+ return False
40
+
41
+
24
42
  def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
25
43
  if root is None:
26
44
  root = Path(__file__).resolve().parents[2]
@@ -29,7 +47,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
29
47
  ArchitectureGate(
30
48
  id="agent-runtime",
31
49
  title="AgentRuntime boundary",
32
- status="complete",
50
+ status="complete" if _symbol_exists("lattice_brain.runtime.agent_runtime.AgentRuntime") else "incomplete",
33
51
  evidence=[
34
52
  "lattice_brain.runtime.agent_runtime.AgentRuntime",
35
53
  "latticeai.api.agents.create_agents_router(agent_runtime=...)",
@@ -39,7 +57,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
39
57
  ArchitectureGate(
40
58
  id="tool-registry",
41
59
  title="ToolRegistry separation",
42
- status="complete",
60
+ status="complete" if all(_symbol_exists(s) for s in ["latticeai.core.tool_registry.ToolRegistry", "latticeai.services.tool_dispatch.ToolDispatchService"]) else "incomplete",
43
61
  evidence=[
44
62
  "latticeai.core.tool_registry.ToolRegistry",
45
63
  "latticeai.services.tool_dispatch.ToolDispatchService",
@@ -49,7 +67,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
49
67
  ArchitectureGate(
50
68
  id="config-centralization",
51
69
  title="Central app Config",
52
- status="complete",
70
+ status="complete" if _symbol_exists("latticeai.core.config.Config") else "incomplete",
53
71
  evidence=[
54
72
  "latticeai.core.config.Config.from_env",
55
73
  "latticeai.runtime.config_runtime.ConfigRuntime",
@@ -69,7 +87,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
69
87
  ArchitectureGate(
70
88
  id="kg-hardening",
71
89
  title="Knowledge Graph stabilization",
72
- status="complete",
90
+ status="complete" if _symbol_exists("lattice_brain.graph.store.KnowledgeGraphStore") else "incomplete",
73
91
  evidence=[
74
92
  "lattice_brain.graph.store.KnowledgeGraphStore",
75
93
  "lattice_brain.portability.KGPortabilityService",
@@ -92,7 +110,7 @@ def architecture_readiness(root: Path | None = None) -> Dict[str, Any]:
92
110
  runtime_module_count = len(list((root / "latticeai" / "runtime").glob("*.py")))
93
111
  return {
94
112
  "status": "complete" if all(gate.status == "complete" for gate in gates) else "incomplete",
95
- "version_target": "7.6.0",
113
+ "version_target": "7.8.0",
96
114
  "gates": [gate.__dict__ for gate in gates],
97
115
  "metrics": {
98
116
  "api_router_modules": api_router_count,
@@ -0,0 +1,159 @@
1
+ """Machine-checkable *product* readiness gates for the 7.8 line.
2
+
3
+ Where ``architecture_readiness`` proves the internal structure is sound, this
4
+ module answers the product question the 7.8 release exists to settle: *can
5
+ someone understand and use the Brain at a glance?* It does so honestly — every
6
+ gate is backed by evidence that is probed on disk, so a gate only reports
7
+ ``complete`` when its evidence actually resolves. The same report can be printed
8
+ by ``scripts/product_readiness.py`` and re-run after every change, which is the
9
+ point: completeness is something we keep measuring, not a one-time claim.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from dataclasses import dataclass
15
+ from pathlib import Path
16
+ from typing import Any, Dict, List
17
+
18
+ from latticeai.services.architecture_readiness import architecture_readiness
19
+
20
+ PRODUCT_VERSION_TARGET = "7.8.0"
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class ProductGate:
25
+ id: str
26
+ title: str
27
+ # Evidence is either a repo-relative path that must exist, or
28
+ # "path::needle" meaning the file must exist and contain ``needle``.
29
+ evidence: List[str]
30
+
31
+
32
+ PRODUCT_GATES: List[ProductGate] = [
33
+ ProductGate(
34
+ id="first-run",
35
+ title="First five minutes lands without a manual",
36
+ evidence=[
37
+ "frontend/src/components/ProductFlow.tsx::WakeBrainScreen",
38
+ "frontend/src/features/brain/BrainConversation.tsx::ProductCommandCenter",
39
+ "frontend/src/features/brain/BrainHome.tsx",
40
+ "auto_setup.py",
41
+ "setup_wizard.py",
42
+ ],
43
+ ),
44
+ ProductGate(
45
+ id="answer-proof",
46
+ title="Answers carry memory proof and citations",
47
+ evidence=[
48
+ "latticeai/api/memory.py::brain-proof",
49
+ "scripts/brain_quality_eval.py",
50
+ ],
51
+ ),
52
+ ProductGate(
53
+ id="local-first-trust",
54
+ title="Local-first privacy is stated and bounded",
55
+ evidence=[
56
+ "PRIVACY.md",
57
+ "PUBLIC_MODE.md",
58
+ "SECURITY.md",
59
+ ],
60
+ ),
61
+ ProductGate(
62
+ id="packaging",
63
+ title="One command produces shippable artifacts",
64
+ evidence=[
65
+ "package.json::release:artifacts",
66
+ "package.json::release:validate",
67
+ "README.md::dist/ltcai-7.8.0-py3-none-any.whl",
68
+ "README.md::dist/ltcai-7.8.0.tar.gz",
69
+ "README.md::dist/ltcai-7.8.0.vsix",
70
+ "README.md::ltcai-7.8.0.tgz",
71
+ "scripts/validate_release_artifacts.py",
72
+ "scripts/release_smoke.py",
73
+ "Dockerfile",
74
+ ],
75
+ ),
76
+ ProductGate(
77
+ id="architecture-closed",
78
+ title="Architecture readiness is complete",
79
+ evidence=["latticeai/services/architecture_readiness.py"],
80
+ ),
81
+ ProductGate(
82
+ id="trust-docs",
83
+ title="Release story is documented and honest",
84
+ evidence=[
85
+ "README.md",
86
+ "README.md::The current release is **7.8.0",
87
+ "SECURITY.md::7.8.x (latest)",
88
+ "vscode-extension/README.md::**7.8.0",
89
+ "docs/CHANGELOG.md::## [7.8.0]",
90
+ "FEATURE_STATUS.md",
91
+ "RELEASE_NOTES_v7.8.0.md",
92
+ ],
93
+ ),
94
+ ProductGate(
95
+ id="quality-gates",
96
+ title="Quality is guarded by repeatable gates",
97
+ evidence=[
98
+ "scripts/brain_quality_eval.py",
99
+ "scripts/product_readiness.py",
100
+ "tests/unit/test_v78_product_readiness.py",
101
+ "tests/visual/v3.spec.js::Brain Chat Home",
102
+ ".github/workflows/ci.yml::scripts/product_readiness.py",
103
+ ".github/workflows/release.yml::npm run lint",
104
+ ],
105
+ ),
106
+ ]
107
+
108
+
109
+ def _evidence_resolves(root: Path, evidence: str) -> bool:
110
+ if "::" in evidence:
111
+ rel, needle = evidence.split("::", 1)
112
+ target = root / rel
113
+ if not target.is_file():
114
+ return False
115
+ try:
116
+ return needle in target.read_text(encoding="utf-8", errors="ignore")
117
+ except OSError:
118
+ return False
119
+ return (root / evidence).exists()
120
+
121
+
122
+ def product_readiness(root: Path | None = None) -> Dict[str, Any]:
123
+ if root is None:
124
+ root = Path(__file__).resolve().parents[2]
125
+
126
+ arch = architecture_readiness(root)
127
+
128
+ gate_reports: List[Dict[str, Any]] = []
129
+ for gate in PRODUCT_GATES:
130
+ missing = [e for e in gate.evidence if not _evidence_resolves(root, e)]
131
+ # The architecture gate is satisfied by the composed report, not just
132
+ # the file existing — fold its status in so this score can never claim
133
+ # product completeness while the structure underneath is incomplete.
134
+ if gate.id == "architecture-closed" and arch.get("status") != "complete":
135
+ missing = missing or ["architecture_readiness().status != complete"]
136
+ gate_reports.append(
137
+ {
138
+ "id": gate.id,
139
+ "title": gate.title,
140
+ "status": "complete" if not missing else "incomplete",
141
+ "evidence": gate.evidence,
142
+ "missing": missing,
143
+ }
144
+ )
145
+
146
+ complete = sum(1 for g in gate_reports if g["status"] == "complete")
147
+ total = len(gate_reports)
148
+ return {
149
+ "status": "complete" if complete == total else "incomplete",
150
+ "version_target": PRODUCT_VERSION_TARGET,
151
+ "score": f"{complete}/{total}",
152
+ "gates": gate_reports,
153
+ "architecture": arch["status"],
154
+ "metrics": {
155
+ "product_gates": total,
156
+ "product_gates_complete": complete,
157
+ **arch.get("metrics", {}),
158
+ },
159
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "7.6.0",
3
+ "version": "7.8.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python3
2
+ """Print the 7.8 product-readiness scorecard and fail CI when incomplete.
3
+
4
+ Run it as often as you like — it re-probes the repo every time, so it is the
5
+ single objective answer to "is this a finished product yet?". Exit code is 0
6
+ only when every product gate resolves its evidence on disk.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import sys
12
+ from pathlib import Path
13
+
14
+ REPO_ROOT = Path(__file__).resolve().parents[1]
15
+ if str(REPO_ROOT) not in sys.path:
16
+ sys.path.insert(0, str(REPO_ROOT))
17
+
18
+ from latticeai.services.product_readiness import product_readiness # noqa: E402
19
+
20
+
21
+ def main() -> int:
22
+ report = product_readiness(REPO_ROOT)
23
+ print(f"Lattice AI product readiness — target {report['version_target']}")
24
+ print(f"Score: {report['score']} (architecture: {report['architecture']})")
25
+ print("-" * 60)
26
+ for gate in report["gates"]:
27
+ mark = "✓" if gate["status"] == "complete" else "✗"
28
+ print(f"{mark} {gate['id']:<22} {gate['title']}")
29
+ for miss in gate["missing"]:
30
+ print(f" missing: {miss}")
31
+ print("-" * 60)
32
+ print(f"STATUS: {report['status'].upper()}")
33
+ return 0 if report["status"] == "complete" else 1
34
+
35
+
36
+ if __name__ == "__main__":
37
+ raise SystemExit(main())
@@ -1584,7 +1584,7 @@ dependencies = [
1584
1584
 
1585
1585
  [[package]]
1586
1586
  name = "lattice-ai-desktop"
1587
- version = "7.6.0"
1587
+ version = "7.7.0"
1588
1588
  dependencies = [
1589
1589
  "plist",
1590
1590
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "7.6.0"
3
+ version = "7.8.0"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "7.6.0",
4
+ "version": "7.8.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",
@@ -1,20 +1,20 @@
1
1
  {
2
- "version": "7.6.0",
2
+ "version": "7.8.0",
3
3
  "generated_at": "vite",
4
4
  "entrypoints": {
5
5
  "app": "/static/app/index.html"
6
6
  },
7
7
  "assets": {
8
8
  "../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
9
- "_primitives-CSsF_Ymb.js": "/static/app/assets/primitives-CSsF_Ymb.js",
10
- "_textarea-CJMFSyfQ.js": "/static/app/assets/textarea-CJMFSyfQ.js",
11
- "index.html": "/static/app/assets/index-D1hsexMt.js",
12
- "assets/index-BwmCpRoW.css": "/static/app/assets/index-BwmCpRoW.css",
13
- "src/pages/Act.tsx": "/static/app/assets/Act-CSeeIWB4.js",
14
- "src/pages/Brain.tsx": "/static/app/assets/Brain-D_Ne4YoR.js",
15
- "src/pages/Capture.tsx": "/static/app/assets/Capture-YFRAO4bJ.js",
16
- "src/pages/Library.tsx": "/static/app/assets/Library-C4zmA8O2.js",
17
- "src/pages/System.tsx": "/static/app/assets/System-Da-Kxwiz.js"
9
+ "_primitives-CD38lt4n.js": "/static/app/assets/primitives-CD38lt4n.js",
10
+ "_textarea-BZk6ybp5.js": "/static/app/assets/textarea-BZk6ybp5.js",
11
+ "index.html": "/static/app/assets/index-DbcEYJQ2.js",
12
+ "assets/index-C7g26IF6.css": "/static/app/assets/index-C7g26IF6.css",
13
+ "src/pages/Act.tsx": "/static/app/assets/Act-DOvf59ru.js",
14
+ "src/pages/Brain.tsx": "/static/app/assets/Brain-C7_0mEiI.js",
15
+ "src/pages/Capture.tsx": "/static/app/assets/Capture-B9Tlhzqr.js",
16
+ "src/pages/Library.tsx": "/static/app/assets/Library-BJPEEm5O.js",
17
+ "src/pages/System.tsx": "/static/app/assets/System-D6t9jo9V.js"
18
18
  },
19
19
  "vite": {
20
20
  "../node_modules/@tauri-apps/api/core.js": {
@@ -23,22 +23,22 @@
23
23
  "src": "../node_modules/@tauri-apps/api/core.js",
24
24
  "isDynamicEntry": true
25
25
  },
26
- "_primitives-CSsF_Ymb.js": {
27
- "file": "assets/primitives-CSsF_Ymb.js",
26
+ "_primitives-CD38lt4n.js": {
27
+ "file": "assets/primitives-CD38lt4n.js",
28
28
  "name": "primitives",
29
29
  "imports": [
30
30
  "index.html"
31
31
  ]
32
32
  },
33
- "_textarea-CJMFSyfQ.js": {
34
- "file": "assets/textarea-CJMFSyfQ.js",
33
+ "_textarea-BZk6ybp5.js": {
34
+ "file": "assets/textarea-BZk6ybp5.js",
35
35
  "name": "textarea",
36
36
  "imports": [
37
37
  "index.html"
38
38
  ]
39
39
  },
40
40
  "index.html": {
41
- "file": "assets/index-D1hsexMt.js",
41
+ "file": "assets/index-DbcEYJQ2.js",
42
42
  "name": "index",
43
43
  "src": "index.html",
44
44
  "isEntry": true,
@@ -51,59 +51,59 @@
51
51
  "src/pages/System.tsx"
52
52
  ],
53
53
  "css": [
54
- "assets/index-BwmCpRoW.css"
54
+ "assets/index-C7g26IF6.css"
55
55
  ]
56
56
  },
57
57
  "src/pages/Act.tsx": {
58
- "file": "assets/Act-CSeeIWB4.js",
58
+ "file": "assets/Act-DOvf59ru.js",
59
59
  "name": "Act",
60
60
  "src": "src/pages/Act.tsx",
61
61
  "isDynamicEntry": true,
62
62
  "imports": [
63
63
  "index.html",
64
- "_primitives-CSsF_Ymb.js",
65
- "_textarea-CJMFSyfQ.js"
64
+ "_primitives-CD38lt4n.js",
65
+ "_textarea-BZk6ybp5.js"
66
66
  ]
67
67
  },
68
68
  "src/pages/Brain.tsx": {
69
- "file": "assets/Brain-D_Ne4YoR.js",
69
+ "file": "assets/Brain-C7_0mEiI.js",
70
70
  "name": "Brain",
71
71
  "src": "src/pages/Brain.tsx",
72
72
  "isDynamicEntry": true,
73
73
  "imports": [
74
74
  "index.html",
75
- "_primitives-CSsF_Ymb.js",
76
- "_textarea-CJMFSyfQ.js"
75
+ "_primitives-CD38lt4n.js",
76
+ "_textarea-BZk6ybp5.js"
77
77
  ]
78
78
  },
79
79
  "src/pages/Capture.tsx": {
80
- "file": "assets/Capture-YFRAO4bJ.js",
80
+ "file": "assets/Capture-B9Tlhzqr.js",
81
81
  "name": "Capture",
82
82
  "src": "src/pages/Capture.tsx",
83
83
  "isDynamicEntry": true,
84
84
  "imports": [
85
85
  "index.html",
86
- "_primitives-CSsF_Ymb.js"
86
+ "_primitives-CD38lt4n.js"
87
87
  ]
88
88
  },
89
89
  "src/pages/Library.tsx": {
90
- "file": "assets/Library-C4zmA8O2.js",
90
+ "file": "assets/Library-BJPEEm5O.js",
91
91
  "name": "Library",
92
92
  "src": "src/pages/Library.tsx",
93
93
  "isDynamicEntry": true,
94
94
  "imports": [
95
95
  "index.html",
96
- "_primitives-CSsF_Ymb.js"
96
+ "_primitives-CD38lt4n.js"
97
97
  ]
98
98
  },
99
99
  "src/pages/System.tsx": {
100
- "file": "assets/System-Da-Kxwiz.js",
100
+ "file": "assets/System-D6t9jo9V.js",
101
101
  "name": "System",
102
102
  "src": "src/pages/System.tsx",
103
103
  "isDynamicEntry": true,
104
104
  "imports": [
105
105
  "index.html",
106
- "_primitives-CSsF_Ymb.js"
106
+ "_primitives-CD38lt4n.js"
107
107
  ]
108
108
  }
109
109
  }