ltcai 4.0.1 → 4.1.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 (150) hide show
  1. package/README.md +28 -23
  2. package/desktop/electron/main.cjs +44 -0
  3. package/docs/CHANGELOG.md +42 -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_DIGITAL_BRAIN_RECOVERY.md +26 -19
  8. package/frontend/index.html +24 -0
  9. package/frontend/openapi.json +14190 -0
  10. package/frontend/src/App.tsx +184 -0
  11. package/frontend/src/api/client.ts +317 -0
  12. package/frontend/src/api/openapi.ts +16637 -0
  13. package/frontend/src/components/primitives.tsx +204 -0
  14. package/frontend/src/components/ui/badge.tsx +27 -0
  15. package/frontend/src/components/ui/button.tsx +37 -0
  16. package/frontend/src/components/ui/card.tsx +22 -0
  17. package/frontend/src/components/ui/input.tsx +16 -0
  18. package/frontend/src/components/ui/textarea.tsx +16 -0
  19. package/frontend/src/lib/utils.ts +33 -0
  20. package/frontend/src/main.tsx +23 -0
  21. package/frontend/src/pages/Act.tsx +245 -0
  22. package/frontend/src/pages/Ask.tsx +200 -0
  23. package/frontend/src/pages/Brain.tsx +267 -0
  24. package/frontend/src/pages/Capture.tsx +158 -0
  25. package/frontend/src/pages/Library.tsx +187 -0
  26. package/frontend/src/pages/System.tsx +344 -0
  27. package/frontend/src/routes.ts +85 -0
  28. package/frontend/src/store/appStore.ts +54 -0
  29. package/frontend/src/styles.css +107 -0
  30. package/latticeai/__init__.py +1 -1
  31. package/latticeai/api/setup.py +5 -4
  32. package/latticeai/api/static_routes.py +4 -4
  33. package/latticeai/core/marketplace.py +1 -1
  34. package/latticeai/core/multi_agent.py +1 -1
  35. package/latticeai/core/workspace_os.py +1 -1
  36. package/package.json +54 -15
  37. package/scripts/build_frontend_assets.mjs +38 -0
  38. package/scripts/bump_version.py +1 -1
  39. package/scripts/export_openapi.py +31 -0
  40. package/scripts/lint_frontend.mjs +86 -0
  41. package/scripts/run_python.mjs +47 -0
  42. package/src-tauri/Cargo.lock +4833 -0
  43. package/src-tauri/Cargo.toml +19 -0
  44. package/src-tauri/build.rs +3 -0
  45. package/src-tauri/capabilities/default.json +7 -0
  46. package/src-tauri/src/main.rs +78 -0
  47. package/src-tauri/tauri.conf.json +36 -0
  48. package/static/app/asset-manifest.json +32 -0
  49. package/static/app/assets/core-CwxXejkd.js +2 -0
  50. package/static/app/assets/core-CwxXejkd.js.map +1 -0
  51. package/static/app/assets/index-CJRAzNnf.js +333 -0
  52. package/static/app/assets/index-CJRAzNnf.js.map +1 -0
  53. package/static/app/assets/index-CSwBBgf4.css +2 -0
  54. package/static/app/index.html +25 -0
  55. package/static/manifest.json +2 -2
  56. package/static/sw.js +4 -4
  57. package/scripts/build_v3_assets.mjs +0 -170
  58. package/scripts/lint_v3.mjs +0 -120
  59. package/static/v3/asset-manifest.json +0 -63
  60. package/static/v3/css/lattice.base.49deefb5.css +0 -128
  61. package/static/v3/css/lattice.base.css +0 -128
  62. package/static/v3/css/lattice.components.cde18231.css +0 -472
  63. package/static/v3/css/lattice.components.css +0 -472
  64. package/static/v3/css/lattice.shell.29d36d85.css +0 -452
  65. package/static/v3/css/lattice.shell.css +0 -452
  66. package/static/v3/css/lattice.tokens.304cbc40.css +0 -135
  67. package/static/v3/css/lattice.tokens.css +0 -135
  68. package/static/v3/css/lattice.views.0a18b6c5.css +0 -360
  69. package/static/v3/css/lattice.views.css +0 -360
  70. package/static/v3/index.html +0 -68
  71. package/static/v3/js/app.c5c80c46.js +0 -26
  72. package/static/v3/js/app.js +0 -26
  73. package/static/v3/js/core/api.ba0fbf14.js +0 -625
  74. package/static/v3/js/core/api.js +0 -625
  75. package/static/v3/js/core/components.f25b3b93.js +0 -230
  76. package/static/v3/js/core/components.js +0 -230
  77. package/static/v3/js/core/dom.a2773eb0.js +0 -148
  78. package/static/v3/js/core/dom.js +0 -148
  79. package/static/v3/js/core/i18n.880e1fec.js +0 -575
  80. package/static/v3/js/core/i18n.js +0 -575
  81. package/static/v3/js/core/router.584570f2.js +0 -37
  82. package/static/v3/js/core/router.js +0 -37
  83. package/static/v3/js/core/routes.37522821.js +0 -101
  84. package/static/v3/js/core/routes.js +0 -101
  85. package/static/v3/js/core/shell.e3f6bbfa.js +0 -420
  86. package/static/v3/js/core/shell.js +0 -420
  87. package/static/v3/js/core/store.7b2aa044.js +0 -123
  88. package/static/v3/js/core/store.js +0 -123
  89. package/static/v3/js/views/account.eff40715.js +0 -143
  90. package/static/v3/js/views/account.js +0 -143
  91. package/static/v3/js/views/activity.0d271ef9.js +0 -67
  92. package/static/v3/js/views/activity.js +0 -67
  93. package/static/v3/js/views/admin-audit.660a1fb1.js +0 -185
  94. package/static/v3/js/views/admin-audit.js +0 -185
  95. package/static/v3/js/views/admin-permissions.a7ae5f09.js +0 -177
  96. package/static/v3/js/views/admin-permissions.js +0 -177
  97. package/static/v3/js/views/admin-policies.3658fd86.js +0 -102
  98. package/static/v3/js/views/admin-policies.js +0 -102
  99. package/static/v3/js/views/admin-private-vpc.7d342d36.js +0 -135
  100. package/static/v3/js/views/admin-private-vpc.js +0 -135
  101. package/static/v3/js/views/admin-security.07c66b72.js +0 -180
  102. package/static/v3/js/views/admin-security.js +0 -180
  103. package/static/v3/js/views/admin-users.f7ac7b43.js +0 -166
  104. package/static/v3/js/views/admin-users.js +0 -166
  105. package/static/v3/js/views/agents.17c5288d.js +0 -564
  106. package/static/v3/js/views/agents.js +0 -564
  107. package/static/v3/js/views/chat.e250e2cc.js +0 -624
  108. package/static/v3/js/views/chat.js +0 -624
  109. package/static/v3/js/views/files.adad14c1.js +0 -365
  110. package/static/v3/js/views/files.js +0 -365
  111. package/static/v3/js/views/graph-canvas.17c15d65.js +0 -509
  112. package/static/v3/js/views/graph-canvas.js +0 -509
  113. package/static/v3/js/views/home.24f8b8ae.js +0 -200
  114. package/static/v3/js/views/home.js +0 -200
  115. package/static/v3/js/views/hooks.37895880.js +0 -220
  116. package/static/v3/js/views/hooks.js +0 -220
  117. package/static/v3/js/views/hybrid-search.2fb63ed9.js +0 -194
  118. package/static/v3/js/views/hybrid-search.js +0 -194
  119. package/static/v3/js/views/knowledge-graph.4d09c537.js +0 -529
  120. package/static/v3/js/views/knowledge-graph.js +0 -529
  121. package/static/v3/js/views/marketplace.ab0583d4.js +0 -141
  122. package/static/v3/js/views/marketplace.js +0 -141
  123. package/static/v3/js/views/mcp.99b5c6a7.js +0 -114
  124. package/static/v3/js/views/mcp.js +0 -114
  125. package/static/v3/js/views/memory.4ebdf474.js +0 -147
  126. package/static/v3/js/views/memory.js +0 -147
  127. package/static/v3/js/views/models.a1ffa147.js +0 -256
  128. package/static/v3/js/views/models.js +0 -256
  129. package/static/v3/js/views/my-computer.d9d9ae1c.js +0 -463
  130. package/static/v3/js/views/my-computer.js +0 -463
  131. package/static/v3/js/views/network.52a4f181.js +0 -97
  132. package/static/v3/js/views/network.js +0 -97
  133. package/static/v3/js/views/pipeline.c522f1ce.js +0 -157
  134. package/static/v3/js/views/pipeline.js +0 -157
  135. package/static/v3/js/views/planning.4876fd77.js +0 -174
  136. package/static/v3/js/views/planning.js +0 -174
  137. package/static/v3/js/views/runs.b63b2afa.js +0 -144
  138. package/static/v3/js/views/runs.js +0 -144
  139. package/static/v3/js/views/settings.b7140634.js +0 -317
  140. package/static/v3/js/views/settings.js +0 -317
  141. package/static/v3/js/views/skills.c6c2f965.js +0 -109
  142. package/static/v3/js/views/skills.js +0 -109
  143. package/static/v3/js/views/snapshots.6f5db095.js +0 -135
  144. package/static/v3/js/views/snapshots.js +0 -135
  145. package/static/v3/js/views/tools.e4f11276.js +0 -108
  146. package/static/v3/js/views/tools.js +0 -108
  147. package/static/v3/js/views/workflows.7752225a.js +0 -213
  148. package/static/v3/js/views/workflows.js +0 -213
  149. package/static/v3/js/views/workspace-admin.c466029b.js +0 -156
  150. package/static/v3/js/views/workspace-admin.js +0 -156
@@ -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
- }
@@ -1,360 +0,0 @@
1
- /* ============================================================================
2
- * Lattice AI v3 — View-specific layouts
3
- * Bespoke compositions that go beyond the generic primitives. Token-native.
4
- * ========================================================================== */
5
-
6
- /* ── Home hero ───────────────────────────────────────────────────────────── */
7
- .lt3-hero {
8
- position: relative;
9
- overflow: hidden;
10
- display: grid;
11
- grid-template-columns: minmax(0, 1.25fr) minmax(300px, 0.75fr);
12
- gap: var(--lt3-space-6);
13
- padding: var(--lt3-space-6);
14
- border-radius: var(--lt3-radius-md);
15
- background:
16
- linear-gradient(90deg, var(--surface) 0%, color-mix(in srgb, var(--surface-2) 62%, var(--surface)) 100%),
17
- var(--surface);
18
- border: 1px solid var(--border);
19
- box-shadow: var(--lt3-elev-1);
20
- }
21
- .lt3-hero::before {
22
- content: "";
23
- position: absolute;
24
- inset: 0;
25
- pointer-events: none;
26
- background-image:
27
- linear-gradient(var(--lt3-mesh-line) 1px, transparent 1px),
28
- linear-gradient(90deg, var(--lt3-mesh-line) 1px, transparent 1px);
29
- background-size: calc(var(--lt3-mesh-size) * 0.85) calc(var(--lt3-mesh-size) * 0.85);
30
- mask-image: linear-gradient(90deg, transparent, #000 34%, #000 100%);
31
- }
32
- .lt3-hero > * { position: relative; z-index: 1; }
33
- .lt3-hero__eyebrow { display: inline-flex; align-items: center; gap: var(--lt3-space-2); }
34
- .lt3-hero__title { font-size: var(--lt3-text-3xl); font-weight: var(--lt3-weight-black); letter-spacing: var(--lt3-tracking-tight); margin-top: var(--lt3-space-3); max-width: 22ch; }
35
- .lt3-hero__sub { font-size: var(--lt3-text-lg); color: var(--muted); margin-top: var(--lt3-space-3); max-width: 56ch; }
36
- .lt3-hero__actions { display: flex; flex-wrap: wrap; gap: var(--lt3-space-3); margin-top: var(--lt3-space-5); }
37
- .lt3-hero__aside { display: flex; flex-direction: column; gap: var(--lt3-space-3); }
38
-
39
- .lt3-readiness {
40
- display: grid;
41
- gap: var(--lt3-space-2);
42
- }
43
- .lt3-readiness__row {
44
- display: grid;
45
- grid-template-columns: auto minmax(0, 1fr) auto;
46
- align-items: center;
47
- gap: var(--lt3-space-3);
48
- padding: var(--lt3-space-3);
49
- border: 1px solid var(--border);
50
- border-radius: var(--lt3-radius-md);
51
- background: var(--card);
52
- }
53
- .lt3-readiness__icon {
54
- display: grid;
55
- place-items: center;
56
- width: 30px;
57
- height: 30px;
58
- border-radius: var(--lt3-radius-xs);
59
- background: var(--surface-2);
60
- color: var(--accent);
61
- }
62
- .lt3-readiness__title { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-semi); }
63
- .lt3-readiness__meta { font-size: var(--lt3-text-2xs); color: var(--faint); }
64
- .lt3-mini-lattice {
65
- display: grid;
66
- grid-template-columns: repeat(3, minmax(0, 1fr));
67
- gap: var(--lt3-space-2);
68
- }
69
- .lt3-mini-lattice__node {
70
- display: flex;
71
- flex-direction: column;
72
- gap: 2px;
73
- min-height: 88px;
74
- padding: var(--lt3-space-3);
75
- border-radius: var(--lt3-radius-md);
76
- border: 1px solid var(--border);
77
- background: var(--surface);
78
- }
79
- .lt3-mini-lattice__node b { font-size: var(--lt3-text-sm); }
80
- .lt3-mini-lattice__node span { font-size: var(--lt3-text-2xs); color: var(--faint); }
81
-
82
- .lt3-quickgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--lt3-space-4); }
83
- .lt3-quick {
84
- display: flex; flex-direction: column; gap: var(--lt3-space-2);
85
- padding: var(--lt3-space-4);
86
- min-height: 132px;
87
- border-radius: var(--lt3-radius-md);
88
- background: var(--card);
89
- border: 1px solid var(--border);
90
- transition: transform var(--lt3-dur-2) var(--lt3-ease), border-color var(--lt3-dur-2) var(--lt3-ease);
91
- }
92
- .lt3-quick:hover { transform: translateY(-2px); border-color: color-mix(in srgb, var(--accent) 40%, var(--border)); }
93
- .lt3-quick__icon { display: grid; place-items: center; width: 34px; height: 34px; border-radius: var(--lt3-radius-md); background: var(--accent-soft); color: var(--accent); }
94
- .lt3-quick__title { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-semi); }
95
- .lt3-quick__desc { font-size: var(--lt3-text-xs); color: var(--muted); }
96
-
97
- /* ── Split: explorer + inspector (KG, Files) ─────────────────────────────── */
98
- .lt3-split {
99
- display: grid;
100
- grid-template-columns: minmax(0, 1fr) 360px;
101
- gap: var(--lt3-space-5);
102
- align-items: start;
103
- }
104
- .lt3-split--left { grid-template-columns: 300px minmax(0, 1fr); }
105
- @media (max-width: 980px) { .lt3-split, .lt3-split--left { grid-template-columns: 1fr; } }
106
-
107
- /* ── Knowledge Graph canvas ──────────────────────────────────────────────── */
108
- .lt3-graph-canvas {
109
- position: relative;
110
- height: 540px;
111
- border-radius: var(--lt3-radius-md);
112
- border: 1px solid var(--border);
113
- background:
114
- radial-gradient(circle at center, var(--graph-grid) 1px, transparent 1.5px),
115
- var(--graph-bg);
116
- background-size: 26px 26px, cover;
117
- overflow: hidden;
118
- }
119
- .lt3-graph-canvas svg { width: 100%; height: 100%; display: block; }
120
- .lt3-graph-legend { display: flex; flex-wrap: wrap; gap: var(--lt3-space-3); }
121
- .lt3-graph-legend span { display: inline-flex; align-items: center; gap: var(--lt3-space-2); font-size: var(--lt3-text-xs); color: var(--muted); }
122
- .lt3-graph-legend i { width: 10px; height: 10px; border-radius: 99px; display: inline-block; }
123
-
124
- .lt3-gnode { cursor: pointer; transition: opacity var(--lt3-dur-2) var(--lt3-ease); }
125
- .lt3-gnode circle { stroke: var(--surface); stroke-width: 2; transition: r var(--lt3-dur-2) var(--lt3-ease); }
126
- .lt3-gnode text { font-size: 11px; fill: var(--text); font-family: var(--lt3-font-sans); pointer-events: none; }
127
- .lt3-gedge { stroke: var(--border-strong); stroke-width: 1.4; opacity: 0.7; }
128
-
129
- .lt3-entity {
130
- display: flex; align-items: center; gap: var(--lt3-space-3);
131
- padding: var(--lt3-space-3);
132
- border-radius: var(--lt3-radius-sm);
133
- border: 1px solid var(--border);
134
- background: var(--surface);
135
- transition: border-color var(--lt3-dur-2) var(--lt3-ease), background var(--lt3-dur-2) var(--lt3-ease);
136
- text-align: left; width: 100%;
137
- }
138
- .lt3-entity:hover { border-color: var(--border-strong); background: var(--surface-2); }
139
- .lt3-entity[data-active="true"] { border-color: var(--accent); background: var(--accent-soft); }
140
- .lt3-entity__type { display: grid; place-items: center; width: 30px; height: 30px; flex: none; border-radius: var(--lt3-radius-xs); font-size: 0.95rem; }
141
- .lt3-entity__body { flex: 1; min-width: 0; }
142
- .lt3-entity__name { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
143
- .lt3-entity__meta { font-size: var(--lt3-text-2xs); color: var(--faint); }
144
-
145
- /* ── Hybrid Search ───────────────────────────────────────────────────────── */
146
- .lt3-search-hero { display: flex; flex-direction: column; gap: var(--lt3-space-4); }
147
- .lt3-fusion {
148
- display: inline-flex; align-items: center; gap: 0;
149
- border-radius: var(--lt3-radius-sm);
150
- border: 1px solid var(--border);
151
- overflow: hidden;
152
- }
153
- .lt3-fusion button {
154
- padding: var(--lt3-space-2) var(--lt3-space-4);
155
- font-size: var(--lt3-text-xs); font-weight: var(--lt3-weight-semi);
156
- color: var(--muted); background: var(--surface);
157
- border-right: 1px solid var(--border);
158
- }
159
- .lt3-fusion button:last-child { border-right: none; }
160
- .lt3-fusion button[data-active="true"] { background: var(--accent-soft); color: var(--accent); }
161
-
162
- .lt3-result {
163
- display: flex; flex-direction: column; gap: var(--lt3-space-2);
164
- padding: var(--lt3-space-4);
165
- border-radius: var(--lt3-radius-md);
166
- border: 1px solid var(--border);
167
- background: var(--surface);
168
- transition: border-color var(--lt3-dur-2) var(--lt3-ease);
169
- }
170
- .lt3-result:hover { border-color: var(--border-strong); }
171
- .lt3-result__top { display: flex; align-items: center; gap: var(--lt3-space-3); }
172
- .lt3-result__title { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-semi); }
173
- .lt3-result__snippet { font-size: var(--lt3-text-sm); color: var(--muted); }
174
- .lt3-result__scores { display: flex; gap: var(--lt3-space-4); flex-wrap: wrap; }
175
- .lt3-score { display: flex; flex-direction: column; gap: 3px; min-width: 120px; }
176
- .lt3-score__row { display: flex; align-items: center; justify-content: space-between; font-size: var(--lt3-text-2xs); color: var(--faint); }
177
- .lt3-score__row b { color: var(--text); font-family: var(--lt3-font-mono); }
178
-
179
- /* ── Chat (3-pane: conversations · thread · retrieval context) ───────────── */
180
- .lt3-chat {
181
- position: relative;
182
- display: grid;
183
- grid-template-columns: 280px minmax(0, 1fr) 340px;
184
- height: 100%;
185
- overflow: hidden;
186
- }
187
-
188
- /* Conversation list rail */
189
- .lt3-chatlist { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border); background: var(--sidebar); }
190
- .lt3-chatlist__head { flex: none; padding: var(--lt3-space-4); border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: var(--lt3-space-3); }
191
- .lt3-chatlist__items { flex: 1; min-height: 0; overflow-y: auto; padding: var(--lt3-space-2); display: flex; flex-direction: column; gap: 2px; }
192
- .lt3-convo {
193
- display: flex; align-items: center; gap: var(--lt3-space-2);
194
- width: 100%; text-align: left;
195
- padding: var(--lt3-space-3);
196
- border-radius: var(--lt3-radius-sm);
197
- color: var(--muted);
198
- transition: background var(--lt3-dur-1) var(--lt3-ease), color var(--lt3-dur-1) var(--lt3-ease);
199
- }
200
- .lt3-convo:hover { background: var(--surface-2); color: var(--text); }
201
- .lt3-convo[data-active="true"] { background: var(--accent-soft); color: var(--accent); }
202
- .lt3-convo__body { flex: 1; min-width: 0; }
203
- .lt3-convo__title { font-size: var(--lt3-text-sm); font-weight: var(--lt3-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
204
- .lt3-convo__meta { font-size: var(--lt3-text-2xs); color: var(--faint); }
205
- .lt3-convo__del { opacity: 0; flex: none; }
206
- .lt3-convo:hover .lt3-convo__del, .lt3-convo[data-active="true"] .lt3-convo__del { opacity: 1; }
207
-
208
- /* Main thread column */
209
- .lt3-chat__main { display: flex; flex-direction: column; min-width: 0; height: 100%; }
210
- .lt3-chat__bar {
211
- flex: none; display: flex; align-items: center; gap: var(--lt3-space-3);
212
- padding: var(--lt3-space-3) var(--lt3-space-5);
213
- border-bottom: 1px solid var(--border);
214
- min-height: 54px;
215
- background: var(--surface-elevated);
216
- }
217
- .lt3-chat__title { font-size: var(--lt3-text-md); font-weight: var(--lt3-weight-semi); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
218
- .lt3-chat__thread { flex: 1; overflow-y: auto; padding: var(--lt3-space-6); display: flex; flex-direction: column; gap: var(--lt3-space-5); }
219
- .lt3-chat__thread-inner { width: 100%; max-width: 780px; margin: 0 auto; display: flex; flex-direction: column; gap: var(--lt3-space-5); }
220
-
221
- .lt3-msg { display: flex; gap: var(--lt3-space-3); max-width: 100%; }
222
- .lt3-msg--user { align-self: flex-end; flex-direction: row-reverse; max-width: 90%; }
223
- .lt3-msg--ai { align-self: flex-start; max-width: 100%; }
224
- .lt3-msg__avatar { width: 32px; height: 32px; flex: none; border-radius: var(--lt3-radius-sm); display: grid; place-items: center; }
225
- .lt3-msg--ai .lt3-msg__avatar { background: linear-gradient(135deg, var(--lt3-pillar-graph), var(--lt3-pillar-vector)); color: var(--lt3-on-accent); }
226
- .lt3-msg--user .lt3-msg__avatar { background: var(--surface-3); color: var(--muted); }
227
- .lt3-msg__body { min-width: 0; display: flex; flex-direction: column; gap: var(--lt3-space-2); }
228
- .lt3-msg__bubble { padding: var(--lt3-space-3) var(--lt3-space-4); border-radius: var(--lt3-radius-md); font-size: var(--lt3-text-md); line-height: var(--lt3-leading-normal); white-space: pre-wrap; overflow-wrap: anywhere; }
229
- .lt3-msg--ai .lt3-msg__bubble { background: var(--surface); border: 1px solid var(--border); }
230
- .lt3-msg--user .lt3-msg__bubble { background: var(--accent); color: var(--lt3-on-accent); }
231
- .lt3-msg__cites { display: flex; flex-wrap: wrap; gap: var(--lt3-space-2); }
232
- .lt3-typing { display: inline-flex; gap: 4px; align-items: center; padding: var(--lt3-space-1) 0; }
233
- .lt3-typing i { width: 6px; height: 6px; border-radius: 99px; background: var(--faint); animation: lt3-bounce 1s var(--lt3-ease) infinite; }
234
- .lt3-typing i:nth-child(2) { animation-delay: 0.15s; }
235
- .lt3-typing i:nth-child(3) { animation-delay: 0.3s; }
236
- @keyframes lt3-bounce { 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; } 30% { transform: translateY(-4px); opacity: 1; } }
237
-
238
- /* Composer */
239
- .lt3-composer { flex: none; padding: var(--lt3-space-3) var(--lt3-space-6) var(--lt3-space-5); }
240
- .lt3-composer__inner { max-width: 780px; margin: 0 auto; }
241
- .lt3-composer__box {
242
- display: flex; align-items: flex-end; gap: var(--lt3-space-3);
243
- padding: var(--lt3-space-3) var(--lt3-space-3) var(--lt3-space-3) var(--lt3-space-4);
244
- border-radius: var(--lt3-radius-md);
245
- border: 1px solid var(--border);
246
- background: var(--input);
247
- transition: border-color var(--lt3-dur-2) var(--lt3-ease), box-shadow var(--lt3-dur-2) var(--lt3-ease);
248
- }
249
- .lt3-composer__box:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); box-shadow: 0 0 0 3px var(--accent-soft); }
250
- .lt3-composer__box textarea { flex: 1; background: none; border: none; outline: none; resize: none; max-height: 200px; min-height: 24px; font-size: var(--lt3-text-md); line-height: var(--lt3-leading-snug); }
251
- .lt3-composer__tools { display: flex; align-items: center; gap: var(--lt3-space-2); margin-top: var(--lt3-space-3); flex-wrap: wrap; }
252
- .lt3-composer__hint { margin-top: var(--lt3-space-2); font-size: var(--lt3-text-2xs); color: var(--faint); text-align: center; }
253
-
254
- /* Retrieval context column */
255
- .lt3-chat__context { display: flex; flex-direction: column; min-height: 0; border-left: 1px solid var(--border); background: var(--sidebar); }
256
- .lt3-chat__context-head { flex: none; padding: var(--lt3-space-4) var(--lt3-space-4) var(--lt3-space-3); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; gap: var(--lt3-space-2); }
257
- .lt3-chat__context-body { flex: 1; min-height: 0; overflow-y: auto; padding: var(--lt3-space-4); display: flex; flex-direction: column; gap: var(--lt3-space-5); }
258
- .lt3-ctx-sec__title { display: flex; align-items: center; gap: var(--lt3-space-2); font-size: var(--lt3-text-2xs); font-weight: var(--lt3-weight-semi); letter-spacing: var(--lt3-tracking-caps); text-transform: uppercase; color: var(--faint); margin-bottom: var(--lt3-space-3); }
259
- .lt3-ctx-sec__title .ti { font-size: 0.95rem; }
260
- .lt3-ctx-item { display: flex; align-items: center; gap: var(--lt3-space-2); padding: var(--lt3-space-2) 0; font-size: var(--lt3-text-sm); }
261
- .lt3-ctx-item__dot { width: 8px; height: 8px; border-radius: 99px; flex: none; }
262
- .lt3-ctx-item__label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
263
- .lt3-ctx-item__score { font-family: var(--lt3-font-mono); font-size: var(--lt3-text-2xs); color: var(--muted); }
264
-
265
- /* Mobile/tablet pane toggles + off-canvas behaviour */
266
- .lt3-chat__toggle-list, .lt3-chat__toggle-context { display: none; }
267
- .lt3-chat__pane-close { display: none; }
268
- .lt3-chat__scrim { display: none; position: absolute; inset: 0; background: var(--overlay); z-index: 5; }
269
- .lt3-chat[data-list="open"] .lt3-chat__scrim,
270
- .lt3-chat[data-context="open"] .lt3-chat__scrim { display: block; }
271
-
272
- @media (max-width: 1240px) {
273
- .lt3-chat { grid-template-columns: 280px minmax(0, 1fr); }
274
- .lt3-chat__context {
275
- position: absolute; top: 0; right: 0; bottom: 0; width: min(340px, 88vw);
276
- transform: translateX(102%); transition: transform var(--lt3-dur-3) var(--lt3-ease);
277
- z-index: 6; box-shadow: var(--lt3-elev-3);
278
- }
279
- .lt3-chat[data-context="open"] .lt3-chat__context { transform: none; }
280
- .lt3-chat__toggle-context { display: inline-flex; }
281
- .lt3-chat__context .lt3-chat__pane-close { display: inline-flex; }
282
- }
283
-
284
- @media (max-width: 900px) {
285
- .lt3-chat { grid-template-columns: minmax(0, 1fr); }
286
- .lt3-chatlist {
287
- position: absolute; top: 0; left: 0; bottom: 0; width: min(280px, 86vw);
288
- transform: translateX(-104%); transition: transform var(--lt3-dur-3) var(--lt3-ease);
289
- z-index: 6; box-shadow: var(--lt3-elev-3);
290
- }
291
- .lt3-chat[data-list="open"] .lt3-chatlist { transform: none; }
292
- .lt3-chat__toggle-list { display: inline-flex; }
293
- .lt3-chatlist .lt3-chat__pane-close { display: inline-flex; }
294
- .lt3-chat__thread { padding: var(--lt3-space-4); }
295
- .lt3-composer { padding: var(--lt3-space-3) var(--lt3-space-4) var(--lt3-space-4); }
296
- }
297
-
298
- /* ── Files ───────────────────────────────────────────────────────────────── */
299
- .lt3-filerow { display: flex; align-items: center; gap: var(--lt3-space-3); padding: var(--lt3-space-3); border-radius: var(--lt3-radius-sm); }
300
- .lt3-filerow:hover { background: var(--surface-2); }
301
- .lt3-filerow__icon { width: 30px; text-align: center; color: var(--muted); }
302
- .lt3-drop {
303
- display: flex; flex-direction: column; align-items: center; gap: var(--lt3-space-3);
304
- padding: var(--lt3-space-7);
305
- border: 1.5px dashed var(--border-strong);
306
- border-radius: var(--lt3-radius-md);
307
- background: var(--surface-2);
308
- text-align: center;
309
- transition: border-color var(--lt3-dur-2) var(--lt3-ease), background var(--lt3-dur-2) var(--lt3-ease);
310
- }
311
- .lt3-drop__meta {
312
- display: flex;
313
- flex-wrap: wrap;
314
- justify-content: center;
315
- gap: var(--lt3-space-2);
316
- max-width: 720px;
317
- }
318
- .lt3-drop.is-dragover {
319
- border-color: var(--accent);
320
- background: var(--accent-soft);
321
- }
322
-
323
- /* ── Pipeline ────────────────────────────────────────────────────────────── */
324
- .lt3-flow { display: flex; align-items: stretch; gap: 0; overflow-x: auto; padding-bottom: var(--lt3-space-3); }
325
- .lt3-stage {
326
- flex: none; width: 220px;
327
- padding: var(--lt3-space-4);
328
- border-radius: var(--lt3-radius-md);
329
- border: 1px solid var(--border);
330
- background: var(--surface);
331
- }
332
- .lt3-stage__num { font-family: var(--lt3-font-mono); font-size: var(--lt3-text-2xs); color: var(--faint); }
333
- .lt3-stage__name { font-weight: var(--lt3-weight-semi); margin-top: 2px; }
334
- .lt3-flow__arrow { flex: none; display: grid; place-items: center; width: 44px; color: var(--faint); }
335
- .lt3-flow__arrow .ti { font-size: 1.3rem; }
336
-
337
- /* ── Generic 2-up metric rows used widely ────────────────────────────────── */
338
- .lt3-statrow { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--lt3-space-3); }
339
-
340
- @media (max-width: 980px) {
341
- .lt3-hero { grid-template-columns: 1fr; padding: var(--lt3-space-5); }
342
- }
343
-
344
- @media (max-width: 680px) {
345
- .lt3-mini-lattice { grid-template-columns: 1fr; }
346
- .lt3-hero__title { font-size: var(--lt3-text-2xl); }
347
- .lt3-quick { min-height: auto; }
348
- }
349
-
350
- /* ── Admin shared ────────────────────────────────────────────────────────── */
351
- .lt3-keyval { display: grid; grid-template-columns: max-content 1fr; gap: var(--lt3-space-2) var(--lt3-space-5); font-size: var(--lt3-text-sm); }
352
- .lt3-keyval dt { color: var(--muted); }
353
- .lt3-keyval dd { margin: 0; font-weight: var(--lt3-weight-medium); }
354
-
355
- .lt3-timeline { position: relative; padding-left: var(--lt3-space-5); }
356
- .lt3-timeline::before { content: ""; position: absolute; left: 6px; top: 4px; bottom: 4px; width: 2px; background: var(--border); }
357
- .lt3-timeline__item { position: relative; padding: 0 0 var(--lt3-space-4); }
358
- .lt3-timeline__item::before { content: ""; position: absolute; left: calc(-1 * var(--lt3-space-5) + 1px); top: 5px; width: 10px; height: 10px; border-radius: 99px; background: var(--accent); border: 2px solid var(--surface); }
359
- .lt3-timeline__time { font-size: var(--lt3-text-2xs); color: var(--faint); font-family: var(--lt3-font-mono); }
360
- .lt3-timeline__body { font-size: var(--lt3-text-sm); }