ltcai 4.0.1 → 4.2.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 (192) hide show
  1. package/README.md +33 -24
  2. package/desktop/electron/main.cjs +44 -0
  3. package/docs/CHANGELOG.md +84 -0
  4. package/docs/V4_1_FRONTEND_ARCHITECTURE_REVIEW.md +65 -0
  5. package/docs/V4_1_FRONTEND_MIGRATION_REPORT.md +70 -0
  6. package/docs/V4_1_VALIDATION_REPORT.md +47 -0
  7. package/docs/V4_2_BRAIN_CORE_ARCHITECTURE.md +97 -0
  8. package/docs/V4_2_STORAGE_MIGRATION_REPORT.md +91 -0
  9. package/docs/V4_2_VALIDATION_REPORT.md +89 -0
  10. package/docs/V4_DIGITAL_BRAIN_RECOVERY.md +31 -26
  11. package/frontend/index.html +24 -0
  12. package/frontend/openapi.json +14436 -0
  13. package/frontend/src/App.tsx +184 -0
  14. package/frontend/src/api/client.ts +320 -0
  15. package/frontend/src/api/openapi.ts +16921 -0
  16. package/frontend/src/components/primitives.tsx +204 -0
  17. package/frontend/src/components/ui/badge.tsx +27 -0
  18. package/frontend/src/components/ui/button.tsx +37 -0
  19. package/frontend/src/components/ui/card.tsx +22 -0
  20. package/frontend/src/components/ui/input.tsx +16 -0
  21. package/frontend/src/components/ui/textarea.tsx +16 -0
  22. package/frontend/src/lib/utils.ts +33 -0
  23. package/frontend/src/main.tsx +23 -0
  24. package/frontend/src/pages/Act.tsx +245 -0
  25. package/frontend/src/pages/Ask.tsx +200 -0
  26. package/frontend/src/pages/Brain.tsx +267 -0
  27. package/frontend/src/pages/Capture.tsx +158 -0
  28. package/frontend/src/pages/Library.tsx +187 -0
  29. package/frontend/src/pages/System.tsx +378 -0
  30. package/frontend/src/routes.ts +85 -0
  31. package/frontend/src/store/appStore.ts +54 -0
  32. package/frontend/src/styles.css +107 -0
  33. package/kg_schema.py +1 -1
  34. package/knowledge_graph.py +4 -4
  35. package/lattice_brain/__init__.py +70 -0
  36. package/lattice_brain/_kg_common.py +1 -0
  37. package/lattice_brain/archive.py +133 -0
  38. package/lattice_brain/context.py +3 -0
  39. package/lattice_brain/conversations.py +3 -0
  40. package/lattice_brain/core.py +82 -0
  41. package/lattice_brain/discovery.py +1 -0
  42. package/lattice_brain/documents.py +1 -0
  43. package/lattice_brain/embeddings.py +82 -0
  44. package/lattice_brain/identity.py +13 -0
  45. package/lattice_brain/ingest.py +1 -0
  46. package/lattice_brain/memory.py +3 -0
  47. package/lattice_brain/network.py +1 -0
  48. package/lattice_brain/projection.py +1 -0
  49. package/lattice_brain/provenance.py +1 -0
  50. package/lattice_brain/retrieval.py +1 -0
  51. package/lattice_brain/schema.py +1 -0
  52. package/lattice_brain/storage/__init__.py +22 -0
  53. package/lattice_brain/storage/base.py +72 -0
  54. package/lattice_brain/storage/docker.py +105 -0
  55. package/lattice_brain/storage/factory.py +31 -0
  56. package/lattice_brain/storage/migration.py +190 -0
  57. package/lattice_brain/storage/postgres.py +123 -0
  58. package/lattice_brain/storage/sqlite.py +128 -0
  59. package/lattice_brain/store.py +3 -0
  60. package/lattice_brain/write_master.py +1 -0
  61. package/latticeai/__init__.py +1 -1
  62. package/latticeai/api/portability.py +69 -0
  63. package/latticeai/api/setup.py +5 -4
  64. package/latticeai/api/static_routes.py +4 -4
  65. package/latticeai/app_factory.py +17 -10
  66. package/latticeai/brain/__init__.py +6 -6
  67. package/latticeai/brain/_kg_common.py +1 -1
  68. package/latticeai/brain/network.py +1 -1
  69. package/latticeai/brain/retrieval.py +15 -0
  70. package/latticeai/brain/store.py +22 -6
  71. package/latticeai/core/config.py +8 -0
  72. package/latticeai/core/marketplace.py +1 -1
  73. package/latticeai/core/multi_agent.py +1 -1
  74. package/latticeai/core/workspace_os.py +1 -1
  75. package/latticeai/services/kg_portability.py +82 -1
  76. package/package.json +55 -15
  77. package/scripts/build_frontend_assets.mjs +38 -0
  78. package/scripts/bump_version.py +4 -1
  79. package/scripts/export_openapi.py +31 -0
  80. package/scripts/lint_frontend.mjs +91 -0
  81. package/scripts/migrate_brain_storage.py +53 -0
  82. package/scripts/run_python.mjs +47 -0
  83. package/scripts/wheel_smoke.py +3 -0
  84. package/src-tauri/Cargo.lock +4833 -0
  85. package/src-tauri/Cargo.toml +19 -0
  86. package/src-tauri/build.rs +3 -0
  87. package/src-tauri/capabilities/default.json +7 -0
  88. package/src-tauri/src/main.rs +78 -0
  89. package/src-tauri/tauri.conf.json +39 -0
  90. package/static/app/asset-manifest.json +32 -0
  91. package/static/app/assets/core-CwxXejkd.js +2 -0
  92. package/static/app/assets/core-CwxXejkd.js.map +1 -0
  93. package/static/app/assets/index-CDjiH_se.css +2 -0
  94. package/static/app/assets/index-C_HAkbAg.js +333 -0
  95. package/static/app/assets/index-C_HAkbAg.js.map +1 -0
  96. package/static/app/index.html +25 -0
  97. package/static/manifest.json +2 -2
  98. package/static/sw.js +4 -4
  99. package/scripts/build_v3_assets.mjs +0 -170
  100. package/scripts/lint_v3.mjs +0 -120
  101. package/static/v3/asset-manifest.json +0 -63
  102. package/static/v3/css/lattice.base.49deefb5.css +0 -128
  103. package/static/v3/css/lattice.base.css +0 -128
  104. package/static/v3/css/lattice.components.cde18231.css +0 -472
  105. package/static/v3/css/lattice.components.css +0 -472
  106. package/static/v3/css/lattice.shell.29d36d85.css +0 -452
  107. package/static/v3/css/lattice.shell.css +0 -452
  108. package/static/v3/css/lattice.tokens.304cbc40.css +0 -135
  109. package/static/v3/css/lattice.tokens.css +0 -135
  110. package/static/v3/css/lattice.views.0a18b6c5.css +0 -360
  111. package/static/v3/css/lattice.views.css +0 -360
  112. package/static/v3/index.html +0 -68
  113. package/static/v3/js/app.c5c80c46.js +0 -26
  114. package/static/v3/js/app.js +0 -26
  115. package/static/v3/js/core/api.ba0fbf14.js +0 -625
  116. package/static/v3/js/core/api.js +0 -625
  117. package/static/v3/js/core/components.f25b3b93.js +0 -230
  118. package/static/v3/js/core/components.js +0 -230
  119. package/static/v3/js/core/dom.a2773eb0.js +0 -148
  120. package/static/v3/js/core/dom.js +0 -148
  121. package/static/v3/js/core/i18n.880e1fec.js +0 -575
  122. package/static/v3/js/core/i18n.js +0 -575
  123. package/static/v3/js/core/router.584570f2.js +0 -37
  124. package/static/v3/js/core/router.js +0 -37
  125. package/static/v3/js/core/routes.37522821.js +0 -101
  126. package/static/v3/js/core/routes.js +0 -101
  127. package/static/v3/js/core/shell.e3f6bbfa.js +0 -420
  128. package/static/v3/js/core/shell.js +0 -420
  129. package/static/v3/js/core/store.7b2aa044.js +0 -123
  130. package/static/v3/js/core/store.js +0 -123
  131. package/static/v3/js/views/account.eff40715.js +0 -143
  132. package/static/v3/js/views/account.js +0 -143
  133. package/static/v3/js/views/activity.0d271ef9.js +0 -67
  134. package/static/v3/js/views/activity.js +0 -67
  135. package/static/v3/js/views/admin-audit.660a1fb1.js +0 -185
  136. package/static/v3/js/views/admin-audit.js +0 -185
  137. package/static/v3/js/views/admin-permissions.a7ae5f09.js +0 -177
  138. package/static/v3/js/views/admin-permissions.js +0 -177
  139. package/static/v3/js/views/admin-policies.3658fd86.js +0 -102
  140. package/static/v3/js/views/admin-policies.js +0 -102
  141. package/static/v3/js/views/admin-private-vpc.7d342d36.js +0 -135
  142. package/static/v3/js/views/admin-private-vpc.js +0 -135
  143. package/static/v3/js/views/admin-security.07c66b72.js +0 -180
  144. package/static/v3/js/views/admin-security.js +0 -180
  145. package/static/v3/js/views/admin-users.f7ac7b43.js +0 -166
  146. package/static/v3/js/views/admin-users.js +0 -166
  147. package/static/v3/js/views/agents.17c5288d.js +0 -564
  148. package/static/v3/js/views/agents.js +0 -564
  149. package/static/v3/js/views/chat.e250e2cc.js +0 -624
  150. package/static/v3/js/views/chat.js +0 -624
  151. package/static/v3/js/views/files.adad14c1.js +0 -365
  152. package/static/v3/js/views/files.js +0 -365
  153. package/static/v3/js/views/graph-canvas.17c15d65.js +0 -509
  154. package/static/v3/js/views/graph-canvas.js +0 -509
  155. package/static/v3/js/views/home.24f8b8ae.js +0 -200
  156. package/static/v3/js/views/home.js +0 -200
  157. package/static/v3/js/views/hooks.37895880.js +0 -220
  158. package/static/v3/js/views/hooks.js +0 -220
  159. package/static/v3/js/views/hybrid-search.2fb63ed9.js +0 -194
  160. package/static/v3/js/views/hybrid-search.js +0 -194
  161. package/static/v3/js/views/knowledge-graph.4d09c537.js +0 -529
  162. package/static/v3/js/views/knowledge-graph.js +0 -529
  163. package/static/v3/js/views/marketplace.ab0583d4.js +0 -141
  164. package/static/v3/js/views/marketplace.js +0 -141
  165. package/static/v3/js/views/mcp.99b5c6a7.js +0 -114
  166. package/static/v3/js/views/mcp.js +0 -114
  167. package/static/v3/js/views/memory.4ebdf474.js +0 -147
  168. package/static/v3/js/views/memory.js +0 -147
  169. package/static/v3/js/views/models.a1ffa147.js +0 -256
  170. package/static/v3/js/views/models.js +0 -256
  171. package/static/v3/js/views/my-computer.d9d9ae1c.js +0 -463
  172. package/static/v3/js/views/my-computer.js +0 -463
  173. package/static/v3/js/views/network.52a4f181.js +0 -97
  174. package/static/v3/js/views/network.js +0 -97
  175. package/static/v3/js/views/pipeline.c522f1ce.js +0 -157
  176. package/static/v3/js/views/pipeline.js +0 -157
  177. package/static/v3/js/views/planning.4876fd77.js +0 -174
  178. package/static/v3/js/views/planning.js +0 -174
  179. package/static/v3/js/views/runs.b63b2afa.js +0 -144
  180. package/static/v3/js/views/runs.js +0 -144
  181. package/static/v3/js/views/settings.b7140634.js +0 -317
  182. package/static/v3/js/views/settings.js +0 -317
  183. package/static/v3/js/views/skills.c6c2f965.js +0 -109
  184. package/static/v3/js/views/skills.js +0 -109
  185. package/static/v3/js/views/snapshots.6f5db095.js +0 -135
  186. package/static/v3/js/views/snapshots.js +0 -135
  187. package/static/v3/js/views/tools.e4f11276.js +0 -108
  188. package/static/v3/js/views/tools.js +0 -108
  189. package/static/v3/js/views/workflows.7752225a.js +0 -213
  190. package/static/v3/js/views/workflows.js +0 -213
  191. package/static/v3/js/views/workspace-admin.c466029b.js +0 -156
  192. package/static/v3/js/views/workspace-admin.js +0 -156
@@ -1,452 +0,0 @@
1
- /* ============================================================================
2
- * Lattice AI v3 — Application shell
3
- * The persistent chrome: nav rail, topbar, view outlet, command palette,
4
- * mobile drawer, and the signature "retrieval lattice" status component.
5
- * ========================================================================== */
6
-
7
- .lt3-app {
8
- position: relative;
9
- z-index: 1;
10
- display: grid;
11
- grid-template-columns: var(--lt3-rail-w) minmax(0, 1fr);
12
- height: 100dvh;
13
- background: var(--app-bg);
14
- }
15
-
16
- /* ── Nav rail ────────────────────────────────────────────────────────────── */
17
- .lt3-rail {
18
- position: relative;
19
- z-index: var(--lt3-z-rail);
20
- display: flex;
21
- flex-direction: column;
22
- min-height: 0;
23
- background: var(--sidebar);
24
- border-right: 1px solid var(--border);
25
- box-shadow: inset -1px 0 0 color-mix(in srgb, var(--surface) 40%, transparent);
26
- }
27
-
28
- .lt3-rail__brand {
29
- display: flex;
30
- align-items: center;
31
- gap: var(--lt3-space-3);
32
- padding: var(--lt3-space-5) var(--lt3-space-5) var(--lt3-space-4);
33
- }
34
- .lt3-rail__logo {
35
- display: grid; place-items: center;
36
- width: 34px; height: 34px; flex: none;
37
- border-radius: var(--lt3-radius-md);
38
- background: var(--text);
39
- color: var(--lt3-on-accent);
40
- box-shadow: var(--lt3-elev-1);
41
- }
42
- .lt3-rail__logo svg { width: 22px; height: 22px; }
43
- .lt3-rail__word { display: flex; flex-direction: column; line-height: 1.05; }
44
- .lt3-rail__word b { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-bold); letter-spacing: var(--lt3-tracking-tight); }
45
- .lt3-rail__word small { font-size: var(--lt3-text-2xs); color: var(--faint); letter-spacing: var(--lt3-tracking-wide); text-transform: uppercase; }
46
-
47
- .lt3-rail__scope { padding: 0 var(--lt3-space-4) var(--lt3-space-3); }
48
-
49
- .lt3-rail__nav {
50
- flex: 1;
51
- min-height: 0;
52
- overflow-y: auto;
53
- padding: var(--lt3-space-2) var(--lt3-space-3) var(--lt3-space-4);
54
- display: flex;
55
- flex-direction: column;
56
- gap: var(--lt3-space-1);
57
- }
58
- .lt3-navgroup { margin-top: var(--lt3-space-5); }
59
- .lt3-navgroup:first-child { margin-top: 0; }
60
- .lt3-navgroup__label {
61
- padding: var(--lt3-space-2) var(--lt3-space-3) var(--lt3-space-1);
62
- font-size: var(--lt3-text-2xs);
63
- font-weight: var(--lt3-weight-semi);
64
- letter-spacing: var(--lt3-tracking-caps);
65
- text-transform: uppercase;
66
- color: var(--faint);
67
- }
68
-
69
- .lt3-navitem {
70
- display: flex;
71
- align-items: flex-start;
72
- gap: var(--lt3-space-3);
73
- min-height: 42px;
74
- padding: var(--lt3-space-2) var(--lt3-space-3);
75
- border-radius: var(--lt3-radius-md);
76
- border: 1px solid transparent;
77
- color: var(--muted);
78
- font-size: var(--lt3-text-sm);
79
- font-weight: var(--lt3-weight-medium);
80
- position: relative;
81
- transition: background var(--lt3-dur-2) var(--lt3-ease), color var(--lt3-dur-2) var(--lt3-ease);
82
- }
83
- .lt3-navitem .ti { font-size: 1.16rem; flex: none; width: 22px; text-align: center; margin-top: 1px; }
84
- .lt3-navitem__copy { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
85
- .lt3-navitem__label { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
86
- .lt3-navitem__meta { font-size: var(--lt3-text-2xs); color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: var(--lt3-weight-normal); }
87
- .lt3-navitem:hover { background: var(--surface-2); color: var(--text); }
88
- .lt3-navitem[aria-current="page"] {
89
- background: var(--surface);
90
- color: var(--text);
91
- border: 1px solid var(--border);
92
- box-shadow: var(--lt3-elev-1);
93
- font-weight: var(--lt3-weight-semi);
94
- }
95
- .lt3-navitem[aria-current="page"]::before {
96
- content: ""; position: absolute; left: 0; top: 9px; bottom: 9px;
97
- width: 2px; border-radius: 99px; background: var(--accent);
98
- }
99
- .lt3-navitem[aria-current="page"] .lt3-navitem__meta { color: var(--muted); }
100
- .lt3-navitem__badge {
101
- margin-left: auto;
102
- font-size: var(--lt3-text-2xs);
103
- font-weight: var(--lt3-weight-bold);
104
- padding: 1px 7px;
105
- border-radius: 99px;
106
- background: var(--surface-3);
107
- color: var(--muted);
108
- }
109
- .lt3-navitem__dot { margin-left: auto; width: 7px; height: 7px; border-radius: 99px; }
110
-
111
- .lt3-rail__foot {
112
- padding: var(--lt3-space-3);
113
- border-top: 1px solid var(--border);
114
- display: flex;
115
- flex-direction: column;
116
- gap: var(--lt3-space-3);
117
- }
118
- .lt3-rail__foot-row {
119
- display: flex;
120
- align-items: center;
121
- gap: var(--lt3-space-2);
122
- }
123
- .lt3-rail__status {
124
- display: flex;
125
- flex-direction: column;
126
- gap: 2px;
127
- padding: var(--lt3-space-3);
128
- border-radius: var(--lt3-radius-md);
129
- background: var(--surface-2);
130
- border: 1px solid var(--border);
131
- }
132
- .lt3-rail__status-top {
133
- display: flex;
134
- align-items: center;
135
- gap: var(--lt3-space-2);
136
- font-size: var(--lt3-text-xs);
137
- font-weight: var(--lt3-weight-semi);
138
- color: var(--text);
139
- }
140
- .lt3-rail__status-sub {
141
- font-size: var(--lt3-text-2xs);
142
- color: var(--faint);
143
- }
144
- .lt3-rail__status-dot {
145
- width: 8px;
146
- height: 8px;
147
- border-radius: 99px;
148
- background: var(--warning);
149
- }
150
- .lt3-rail__status-dot[data-state="ready"] { background: var(--success); }
151
- .lt3-rail__status-dot[data-state="partial"] { background: var(--warning); }
152
- .lt3-rail__status-dot[data-state="pending"] { background: var(--faint); }
153
- }
154
- .lt3-rail__user {
155
- display: flex; align-items: center; gap: var(--lt3-space-3);
156
- flex: 1; min-width: 0;
157
- padding: var(--lt3-space-2);
158
- border-radius: var(--lt3-radius-sm);
159
- transition: background var(--lt3-dur-2) var(--lt3-ease);
160
- }
161
- .lt3-rail__user:hover { background: var(--surface-2); }
162
- .lt3-rail__user-meta { min-width: 0; line-height: 1.2; }
163
- .lt3-rail__user-meta b { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-semi); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
164
- .lt3-rail__user-meta small { font-size: var(--lt3-text-2xs); color: var(--faint); }
165
-
166
- /* ── Scope (workspace) switcher ──────────────────────────────────────────── */
167
- .lt3-scope {
168
- display: flex; align-items: center; gap: var(--lt3-space-3);
169
- width: 100%;
170
- padding: var(--lt3-space-3);
171
- border-radius: var(--lt3-radius-md);
172
- background: var(--surface-2);
173
- border: 1px solid var(--border);
174
- text-align: left;
175
- transition: border-color var(--lt3-dur-2) var(--lt3-ease);
176
- }
177
- .lt3-scope:hover { border-color: var(--border-strong); }
178
- .lt3-scope__icon {
179
- display: grid; place-items: center; width: 30px; height: 30px; flex: none;
180
- border-radius: var(--lt3-radius-xs);
181
- background: var(--accent-soft); color: var(--accent);
182
- }
183
- .lt3-scope__meta { flex: 1; min-width: 0; line-height: 1.2; }
184
- .lt3-scope__meta b { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-semi); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
185
- .lt3-scope__meta small { font-size: var(--lt3-text-2xs); color: var(--faint); text-transform: capitalize; }
186
- .lt3-scope .ti-selector, .lt3-scope > .ti:last-child { color: var(--faint); font-size: 1rem; }
187
-
188
- /* Scope dropdown menu */
189
- .lt3-menu {
190
- position: absolute;
191
- z-index: var(--lt3-z-drawer);
192
- min-width: 240px;
193
- padding: var(--lt3-space-2);
194
- background: var(--surface-elevated);
195
- border: 1px solid var(--border);
196
- border-radius: var(--lt3-radius-md);
197
- box-shadow: var(--lt3-elev-2);
198
- display: flex; flex-direction: column; gap: 2px;
199
- }
200
- .lt3-menu__item {
201
- display: flex; align-items: center; gap: var(--lt3-space-3);
202
- padding: var(--lt3-space-3);
203
- border-radius: var(--lt3-radius-sm);
204
- font-size: var(--lt3-text-sm);
205
- text-align: left;
206
- transition: background var(--lt3-dur-1) var(--lt3-ease);
207
- }
208
- .lt3-menu__item:hover { background: var(--surface-2); }
209
- .lt3-menu__item[data-active="true"] { color: var(--accent); }
210
- .lt3-menu__sep { height: 1px; background: var(--border); margin: var(--lt3-space-1) 0; }
211
-
212
- /* ── Main column ─────────────────────────────────────────────────────────── */
213
- .lt3-main { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
214
-
215
- .lt3-topbar {
216
- display: flex;
217
- align-items: center;
218
- gap: var(--lt3-space-3);
219
- min-height: var(--lt3-topbar-h);
220
- flex: none;
221
- padding: 0 var(--lt3-space-5);
222
- border-bottom: 1px solid var(--border);
223
- background: color-mix(in srgb, var(--surface-elevated) 88%, transparent);
224
- z-index: var(--lt3-z-topbar);
225
- }
226
- .lt3-topbar__menu { display: none; }
227
- .lt3-topbar__crumbs { display: flex; align-items: center; gap: var(--lt3-space-2); min-width: 0; }
228
- .lt3-topbar__crumbs .ti { color: var(--faint); font-size: 0.95rem; }
229
- .lt3-crumb { font-size: var(--lt3-text-sm); color: var(--muted); white-space: nowrap; }
230
- .lt3-crumb--current { color: var(--text); font-weight: var(--lt3-weight-semi); }
231
-
232
- .lt3-cmd-trigger {
233
- display: flex; align-items: center; gap: var(--lt3-space-3);
234
- height: 34px; width: min(360px, 38vw);
235
- padding: 0 var(--lt3-space-3);
236
- border-radius: var(--lt3-radius-sm);
237
- background: var(--surface-2);
238
- border: 1px solid var(--border);
239
- color: var(--faint);
240
- font-size: var(--lt3-text-sm);
241
- transition: border-color var(--lt3-dur-2) var(--lt3-ease);
242
- }
243
- .lt3-cmd-trigger:hover { border-color: var(--border-strong); }
244
- .lt3-cmd-trigger .ti { font-size: 1.05rem; }
245
- .lt3-cmd-trigger .lt3-kbd { margin-left: auto; }
246
-
247
- .lt3-mode {
248
- display: inline-flex;
249
- padding: 3px;
250
- gap: 2px;
251
- background: var(--surface-2);
252
- border: 1px solid var(--border);
253
- border-radius: var(--lt3-radius-md);
254
- }
255
- .lt3-mode button {
256
- display: inline-flex; align-items: center; gap: var(--lt3-space-2);
257
- padding: var(--lt3-space-2) var(--lt3-space-3);
258
- border-radius: var(--lt3-radius-sm);
259
- font-size: var(--lt3-text-xs);
260
- font-weight: var(--lt3-weight-semi);
261
- color: var(--muted);
262
- }
263
- .lt3-mode button .ti { font-size: 0.95rem; }
264
- .lt3-mode button[data-active="true"] { background: var(--surface); color: var(--text); box-shadow: var(--lt3-elev-1); }
265
- .lt3-mode button[data-mode="admin"][data-active="true"] { color: var(--accent-pink); }
266
-
267
- /* ── View outlet ─────────────────────────────────────────────────────────── */
268
- .lt3-view {
269
- flex: 1;
270
- min-height: 0;
271
- overflow-y: auto;
272
- scroll-behavior: smooth;
273
- }
274
- .lt3-view__inner {
275
- max-width: var(--lt3-content-max);
276
- margin: 0 auto;
277
- padding: var(--lt3-space-6) var(--lt3-content-pad) var(--lt3-space-9);
278
- display: flex;
279
- flex-direction: column;
280
- gap: var(--lt3-space-6);
281
- }
282
- .lt3-view--wide .lt3-view__inner { max-width: none; }
283
- .lt3-view--flush { overflow: hidden; }
284
- .lt3-view--flush .lt3-view__inner { padding: 0; max-width: none; height: 100%; gap: 0; }
285
-
286
- /* View header */
287
- .lt3-vhead { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--lt3-space-4); flex-wrap: wrap; }
288
- .lt3-vhead__title { font-size: var(--lt3-text-2xl); font-weight: var(--lt3-weight-bold); letter-spacing: var(--lt3-tracking-tight); }
289
- .lt3-vhead__sub { font-size: var(--lt3-text-md); color: var(--muted); margin-top: var(--lt3-space-1); max-width: 64ch; }
290
- .lt3-vhead__actions { display: flex; align-items: center; gap: var(--lt3-space-2); flex-wrap: wrap; }
291
-
292
- /* Section heading inside a view */
293
- .lt3-section__head { display: flex; align-items: center; justify-content: space-between; gap: var(--lt3-space-3); margin-bottom: var(--lt3-space-4); }
294
- .lt3-section__title { font-size: var(--lt3-text-xl); font-weight: var(--lt3-weight-semi); letter-spacing: var(--lt3-tracking-tight); }
295
-
296
- /* ── Retrieval lattice (signature identity component) ────────────────────── */
297
- .lt3-pillars {
298
- display: grid;
299
- grid-template-columns: repeat(3, minmax(0, 1fr));
300
- gap: var(--lt3-space-4);
301
- }
302
- .lt3-pillar {
303
- position: relative;
304
- overflow: hidden;
305
- padding: var(--lt3-space-5);
306
- border-radius: var(--lt3-radius-md);
307
- background: var(--surface);
308
- border: 1px solid var(--border);
309
- }
310
- .lt3-pillar::after {
311
- content: "";
312
- position: absolute; inset: 0 0 auto 0; height: 3px;
313
- background: var(--_accent, var(--accent));
314
- }
315
- .lt3-pillar--graph { --_accent: var(--lt3-pillar-graph); }
316
- .lt3-pillar--vector { --_accent: var(--lt3-pillar-vector); }
317
- .lt3-pillar--hybrid { --_accent: var(--lt3-pillar-hybrid); }
318
- .lt3-pillar__icon {
319
- display: grid; place-items: center; width: 40px; height: 40px;
320
- border-radius: var(--lt3-radius-sm);
321
- background: color-mix(in srgb, var(--_accent) 16%, transparent);
322
- color: var(--_accent);
323
- margin-bottom: var(--lt3-space-3);
324
- }
325
- .lt3-pillar__icon .ti { font-size: 1.4rem; }
326
- .lt3-pillar__name { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-bold); }
327
- .lt3-pillar__desc { font-size: var(--lt3-text-xs); color: var(--muted); margin-top: 2px; }
328
- .lt3-pillar__stat { display: flex; align-items: baseline; gap: var(--lt3-space-2); margin-top: var(--lt3-space-4); }
329
- .lt3-pillar__num { font-size: var(--lt3-text-xl); font-weight: var(--lt3-weight-bold); color: var(--_accent); letter-spacing: var(--lt3-tracking-tight); }
330
- .lt3-pillar__unit { font-size: var(--lt3-text-xs); color: var(--faint); }
331
-
332
- /* Compact index-status chip for the topbar */
333
- .lt3-idxchip {
334
- display: inline-flex; align-items: center; gap: var(--lt3-space-2);
335
- height: 30px; padding: 0 var(--lt3-space-3);
336
- border-radius: var(--lt3-radius-pill);
337
- background: var(--surface-2);
338
- border: 1px solid var(--border);
339
- font-size: var(--lt3-text-2xs);
340
- font-weight: var(--lt3-weight-semi);
341
- }
342
- .lt3-idxchip__dots { display: inline-flex; gap: 3px; }
343
- .lt3-idxchip__dot { width: 7px; height: 7px; border-radius: 99px; background: var(--surface-3); }
344
- .lt3-idxchip__dot[data-on="true"][data-kind="graph"] { background: var(--lt3-pillar-graph); }
345
- .lt3-idxchip__dot[data-on="true"][data-kind="vector"] { background: var(--lt3-pillar-vector); }
346
- .lt3-idxchip__dot[data-on="true"][data-kind="hybrid"] { background: var(--lt3-pillar-hybrid); }
347
-
348
- /* ── Command palette ─────────────────────────────────────────────────────── */
349
- .lt3-scrim {
350
- position: fixed; inset: 0;
351
- z-index: var(--lt3-z-scrim);
352
- /* Solid dim scrim — no backdrop blur (glassmorphism removed in v3.5.0 for a
353
- crisp, stable surface). */
354
- background: var(--overlay);
355
- opacity: 0;
356
- animation: lt3-fade var(--lt3-dur-2) var(--lt3-ease) forwards;
357
- }
358
- @keyframes lt3-fade { to { opacity: 1; } }
359
-
360
- .lt3-palette {
361
- position: fixed;
362
- z-index: var(--lt3-z-palette);
363
- top: 14vh; left: 50%;
364
- transform: translateX(-50%);
365
- width: min(620px, 92vw);
366
- background: var(--surface-elevated);
367
- border: 1px solid var(--border);
368
- border-radius: var(--lt3-radius-md);
369
- box-shadow: var(--lt3-elev-3);
370
- overflow: hidden;
371
- animation: lt3-pop var(--lt3-dur-3) var(--lt3-ease-out);
372
- }
373
- @keyframes lt3-pop { from { opacity: 0; transform: translate(-50%, 8px) scale(0.98); } to { opacity: 1; transform: translateX(-50%); } }
374
- .lt3-palette__input {
375
- display: flex; align-items: center; gap: var(--lt3-space-3);
376
- padding: var(--lt3-space-4) var(--lt3-space-5);
377
- border-bottom: 1px solid var(--border);
378
- }
379
- .lt3-palette__input .ti { font-size: 1.3rem; color: var(--faint); }
380
- .lt3-palette__input input { flex: 1; background: none; border: none; outline: none; font-size: var(--lt3-text-lg); }
381
- .lt3-palette__list { max-height: 52vh; overflow-y: auto; padding: var(--lt3-space-2); }
382
- .lt3-palette__group-label { padding: var(--lt3-space-3) var(--lt3-space-3) var(--lt3-space-1); font-size: var(--lt3-text-2xs); text-transform: uppercase; letter-spacing: var(--lt3-tracking-caps); color: var(--faint); }
383
- .lt3-palette__item {
384
- display: flex; align-items: center; gap: var(--lt3-space-3);
385
- width: 100%;
386
- padding: var(--lt3-space-3);
387
- border-radius: var(--lt3-radius-sm);
388
- font-size: var(--lt3-text-sm);
389
- text-align: left;
390
- }
391
- .lt3-palette__item .ti { font-size: 1.2rem; color: var(--muted); width: 22px; text-align: center; }
392
- .lt3-palette__item[data-active="true"] { background: var(--accent-soft); color: var(--accent); }
393
- .lt3-palette__item[data-active="true"] .ti { color: var(--accent); }
394
- .lt3-palette__item small { margin-left: auto; color: var(--faint); font-size: var(--lt3-text-2xs); }
395
- .lt3-palette__empty { padding: var(--lt3-space-6); text-align: center; color: var(--faint); font-size: var(--lt3-text-sm); }
396
-
397
- /* ── Mobile drawer scaffolding ───────────────────────────────────────────── */
398
- .lt3-rail__close { display: none; }
399
- .lt3-rail__scrim { display: none; }
400
-
401
- /* ── Responsive: tablet ──────────────────────────────────────────────────── */
402
- @media (max-width: 1100px) {
403
- .lt3-app { grid-template-columns: var(--lt3-rail-w-collapsed) minmax(0, 1fr); }
404
- .lt3-rail { --_collapsed: 1; }
405
- .lt3-rail__word, .lt3-rail__scope, .lt3-navgroup__label,
406
- .lt3-navitem__copy, .lt3-navitem__badge,
407
- .lt3-navitem__dot, .lt3-rail__user-meta, .lt3-rail__status { display: none; }
408
- .lt3-rail__brand { justify-content: center; padding: var(--lt3-space-5) 0 var(--lt3-space-4); }
409
- .lt3-rail__nav { align-items: center; }
410
- .lt3-navitem { justify-content: center; align-items: center; padding: var(--lt3-space-3); width: 44px; min-height: 44px; }
411
- .lt3-navitem .ti { margin-top: 0; }
412
- .lt3-navitem[aria-current="page"]::before { left: -3px; }
413
- .lt3-rail__foot { justify-content: center; }
414
- .lt3-rail__user { justify-content: center; flex: none; }
415
- .lt3-pillars { grid-template-columns: 1fr; }
416
- }
417
-
418
- /* ── Responsive: mobile (rail becomes off-canvas drawer) ─────────────────── */
419
- @media (max-width: 760px) {
420
- .lt3-app { grid-template-columns: 1fr; }
421
- .lt3-rail {
422
- position: fixed; inset: 0 auto 0 0;
423
- width: min(300px, 86vw);
424
- transform: translateX(-104%);
425
- transition: transform var(--lt3-dur-3) var(--lt3-ease);
426
- box-shadow: var(--lt3-elev-3);
427
- z-index: var(--lt3-z-drawer);
428
- }
429
- .lt3-rail__word, .lt3-rail__scope, .lt3-navgroup__label,
430
- .lt3-navitem__badge, .lt3-navitem__dot, .lt3-rail__user-meta { display: revert; }
431
- .lt3-navitem__copy, .lt3-rail__status { display: flex; }
432
- .lt3-rail__brand { justify-content: flex-start; padding: var(--lt3-space-5) var(--lt3-space-5) var(--lt3-space-4); }
433
- .lt3-rail__nav { align-items: stretch; }
434
- .lt3-navitem { justify-content: flex-start; align-items: flex-start; width: auto; min-height: 42px; }
435
- .lt3-rail__foot { justify-content: flex-start; }
436
- .lt3-rail__user { flex: 1; justify-content: flex-start; }
437
-
438
- .lt3-app[data-drawer="open"] .lt3-rail { transform: none; }
439
- .lt3-app[data-drawer="open"] .lt3-rail__scrim {
440
- display: block; position: fixed; inset: 0;
441
- background: var(--overlay); z-index: var(--lt3-z-scrim);
442
- }
443
- .lt3-rail__close { display: inline-flex; position: absolute; top: var(--lt3-space-4); right: var(--lt3-space-3); }
444
-
445
- .lt3-topbar__menu { display: inline-flex; }
446
- .lt3-cmd-trigger { width: auto; flex: 1; }
447
- .lt3-cmd-trigger span, .lt3-cmd-trigger .lt3-kbd { display: none; }
448
- .lt3-mode button span { display: none; }
449
- .lt3-mode button .ti { font-size: 1.1rem; }
450
- .lt3-view__inner { padding: var(--lt3-space-5) var(--lt3-space-4) var(--lt3-space-8); gap: var(--lt3-space-5); }
451
- .lt3-grid-2, .lt3-grid-3 { grid-template-columns: 1fr; }
452
- }
@@ -1,135 +0,0 @@
1
- /* ============================================================================
2
- * Lattice AI v3.3.1 — Structural Design Tokens
3
- *
4
- * This layer sits ON TOP of /static/css/tokens.css (the color single-source).
5
- * It adds the NON-COLOR structure of the v3 system — spacing, type scale,
6
- * radii, elevation, motion, z-index, layout rails — plus a small set of v3
7
- * SEMANTIC aliases that map the product's "retrieval lattice" identity
8
- * (Knowledge Graph · Vector Index · Hybrid Search) onto the existing
9
- * theme-aware color tokens. No raw colors are introduced for surfaces/text;
10
- * everything dark/light-aware flows from tokens.css.
11
- *
12
- * Rule: v3 component CSS uses only var(--lt3-*) or the inherited var(--*)
13
- * semantic color tokens. Never hard-code a hex for a themed surface.
14
- * ========================================================================== */
15
-
16
- :root {
17
- /* ── Type families ──────────────────────────────────────────────────── */
18
- --lt3-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
19
- --lt3-font-mono: "SFMono-Regular", "JetBrains Mono", ui-monospace, "Cascadia Code",
20
- Menlo, Consolas, monospace;
21
-
22
- /* ── Type scale (fluid-ish, fixed for predictability) ───────────────── */
23
- --lt3-text-2xs: 0.6875rem; /* 11px — metadata, kbd */
24
- --lt3-text-xs: 0.75rem; /* 12px — labels, captions */
25
- --lt3-text-sm: 0.8125rem; /* 13px — dense body, table */
26
- --lt3-text-md: 0.9375rem; /* 15px — body */
27
- --lt3-text-lg: 1.0625rem; /* 17px — lead */
28
- --lt3-text-xl: 1.375rem; /* 22px — section title */
29
- --lt3-text-2xl: 1.75rem; /* 28px — view title */
30
- --lt3-text-3xl: 2.25rem; /* 36px — hero */
31
- --lt3-text-4xl: 3rem; /* 48px — display */
32
-
33
- --lt3-leading-tight: 1.18;
34
- --lt3-leading-snug: 1.35;
35
- --lt3-leading-normal: 1.55;
36
-
37
- --lt3-weight-normal: 400;
38
- --lt3-weight-medium: 500;
39
- --lt3-weight-semi: 600;
40
- --lt3-weight-bold: 700;
41
- --lt3-weight-black: 800;
42
-
43
- --lt3-tracking-tight: 0;
44
- --lt3-tracking-wide: 0;
45
- --lt3-tracking-caps: 0; /* eyebrow / section labels */
46
-
47
- /* ── Spacing scale (4pt base) ───────────────────────────────────────── */
48
- --lt3-space-0: 0;
49
- --lt3-space-1: 0.25rem; /* 4 */
50
- --lt3-space-2: 0.5rem; /* 8 */
51
- --lt3-space-3: 0.75rem; /* 12 */
52
- --lt3-space-4: 1rem; /* 16 */
53
- --lt3-space-5: 1.5rem; /* 24 */
54
- --lt3-space-6: 2rem; /* 32 */
55
- --lt3-space-7: 2.5rem; /* 40 */
56
- --lt3-space-8: 3rem; /* 48 */
57
- --lt3-space-9: 4rem; /* 64 */
58
-
59
- /* ── Radii ──────────────────────────────────────────────────────────── */
60
- --lt3-radius-xs: 4px;
61
- --lt3-radius-sm: 6px;
62
- --lt3-radius-md: 8px;
63
- --lt3-radius-lg: 8px;
64
- --lt3-radius-xl: 8px;
65
- --lt3-radius-pill: 999px;
66
-
67
- /* ── Elevation (theme-aware via inherited --shadow*) ────────────────── */
68
- --lt3-elev-0: none;
69
- --lt3-elev-1: var(--shadow-sm);
70
- --lt3-elev-2: var(--shadow);
71
- --lt3-elev-3: 0 28px 70px rgba(30, 36, 48, 0.18);
72
-
73
- /* ── Motion ─────────────────────────────────────────────────────────── */
74
- --lt3-ease: var(--lt-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
75
- --lt3-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
76
- --lt3-dur-1: 90ms;
77
- --lt3-dur-2: 160ms;
78
- --lt3-dur-3: 240ms;
79
- --lt3-dur-4: 420ms;
80
-
81
- /* ── Z-index ────────────────────────────────────────────────────────── */
82
- --lt3-z-rail: 40;
83
- --lt3-z-topbar: 50;
84
- --lt3-z-drawer: 60;
85
- --lt3-z-scrim: 70;
86
- --lt3-z-palette: 90;
87
- --lt3-z-toast: 100;
88
-
89
- /* ── Layout rails ───────────────────────────────────────────────────── */
90
- --lt3-rail-w: 292px; /* expanded nav rail */
91
- --lt3-rail-w-collapsed: 76px;
92
- --lt3-topbar-h: 56px;
93
- --lt3-content-max: 1360px;
94
- --lt3-content-pad: var(--lt3-space-6);
95
-
96
- /* ── Retrieval identity accents (mapped to themed accents) ──────────── */
97
- /* Knowledge Graph (structure) · Vector Index (density) · Hybrid (fusion) */
98
- --lt3-pillar-graph: var(--accent); /* blue — relational structure */
99
- --lt3-pillar-vector: var(--accent-2); /* teal — embeddings field */
100
- --lt3-pillar-hybrid: var(--accent-pink); /* magenta — fusion of both */
101
-
102
- /* Text rendered on saturated accent fills (both themes keep accents dark-safe). */
103
- --lt3-on-accent: #ffffff;
104
- --lt3-pillar-graph-soft: color-mix(in srgb, var(--lt3-pillar-graph) 14%, transparent);
105
- --lt3-pillar-vector-soft: color-mix(in srgb, var(--lt3-pillar-vector) 16%, transparent);
106
- --lt3-pillar-hybrid-soft: color-mix(in srgb, var(--lt3-pillar-hybrid) 16%, transparent);
107
-
108
- /* ── Lattice motif (background mesh) ────────────────────────────────── */
109
- --lt3-mesh-line: color-mix(in srgb, var(--accent) 8%, transparent);
110
- --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 22%, transparent);
111
- --lt3-mesh-size: 46px;
112
-
113
- /* ── Status surfaces (themed, derived) ──────────────────────────────── */
114
- --lt3-ok: var(--success);
115
- --lt3-warn: var(--warning);
116
- --lt3-err: var(--danger);
117
- --lt3-ok-soft: color-mix(in srgb, var(--success) 16%, transparent);
118
- --lt3-warn-soft: color-mix(in srgb, var(--warning) 18%, transparent);
119
- --lt3-err-soft: color-mix(in srgb, var(--danger) 16%, transparent);
120
- --lt3-info-soft: var(--accent-soft);
121
- }
122
-
123
- :root[data-lt-theme="dark"] {
124
- --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
125
- --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
126
- --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
127
- }
128
-
129
- @media (prefers-color-scheme: dark) {
130
- :root:not([data-lt-theme="light"]):not([data-lt-theme="dark"]) {
131
- --lt3-elev-3: 0 30px 80px rgba(0, 0, 0, 0.58);
132
- --lt3-mesh-line: color-mix(in srgb, var(--accent) 16%, transparent);
133
- --lt3-mesh-node: color-mix(in srgb, var(--accent-2) 30%, transparent);
134
- }
135
- }