ltcai 3.6.0 → 4.0.1

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 (238) hide show
  1. package/README.md +39 -31
  2. package/docs/CHANGELOG.md +64 -0
  3. package/docs/REALTIME_COLLABORATION.md +3 -3
  4. package/docs/V3_FRONTEND.md +9 -8
  5. package/docs/V4_BRAIN_ARCHITECTURE.md +322 -0
  6. package/docs/V4_DIGITAL_BRAIN_RECOVERY.md +552 -0
  7. package/docs/V4_IMPLEMENTATION_PLAN.md +470 -0
  8. package/docs/kg-schema.md +51 -53
  9. package/docs/spec-vs-impl.md +10 -10
  10. package/kg_schema.py +2 -520
  11. package/knowledge_graph.py +37 -4629
  12. package/knowledge_graph_api.py +11 -127
  13. package/latticeai/__init__.py +1 -1
  14. package/latticeai/api/admin.py +16 -17
  15. package/latticeai/api/agents.py +20 -7
  16. package/latticeai/api/auth.py +46 -15
  17. package/latticeai/api/chat.py +112 -76
  18. package/latticeai/api/health.py +1 -1
  19. package/latticeai/api/hooks.py +1 -1
  20. package/latticeai/api/invitations.py +100 -0
  21. package/latticeai/api/knowledge_graph.py +139 -0
  22. package/latticeai/api/local_files.py +1 -1
  23. package/latticeai/api/mcp.py +23 -11
  24. package/latticeai/api/memory.py +1 -1
  25. package/latticeai/api/models.py +1 -1
  26. package/latticeai/api/network.py +81 -0
  27. package/latticeai/api/plugins.py +3 -6
  28. package/latticeai/api/realtime.py +5 -8
  29. package/latticeai/api/search.py +26 -2
  30. package/latticeai/api/security_dashboard.py +2 -3
  31. package/latticeai/api/setup.py +2 -2
  32. package/latticeai/api/static_routes.py +11 -16
  33. package/latticeai/api/tools.py +3 -0
  34. package/latticeai/api/ui_redirects.py +26 -0
  35. package/latticeai/api/workflow_designer.py +85 -6
  36. package/latticeai/api/workspace.py +93 -57
  37. package/latticeai/app_factory.py +1781 -0
  38. package/latticeai/brain/__init__.py +18 -0
  39. package/latticeai/brain/_kg_common.py +1123 -0
  40. package/latticeai/brain/context.py +213 -0
  41. package/latticeai/brain/conversations.py +236 -0
  42. package/latticeai/brain/discovery.py +1455 -0
  43. package/latticeai/brain/documents.py +218 -0
  44. package/latticeai/brain/identity.py +175 -0
  45. package/latticeai/brain/ingest.py +644 -0
  46. package/latticeai/brain/memory.py +102 -0
  47. package/latticeai/brain/network.py +205 -0
  48. package/latticeai/brain/projection.py +561 -0
  49. package/latticeai/brain/provenance.py +401 -0
  50. package/latticeai/brain/retrieval.py +1316 -0
  51. package/latticeai/brain/schema.py +640 -0
  52. package/latticeai/brain/store.py +216 -0
  53. package/latticeai/brain/write_master.py +225 -0
  54. package/latticeai/core/agent.py +31 -7
  55. package/latticeai/core/audit.py +0 -7
  56. package/latticeai/core/config.py +1 -1
  57. package/latticeai/core/context_builder.py +1 -2
  58. package/latticeai/core/enterprise.py +1 -1
  59. package/latticeai/core/graph_curator.py +2 -2
  60. package/latticeai/core/invitations.py +131 -0
  61. package/latticeai/core/marketplace.py +1 -1
  62. package/latticeai/core/mcp_registry.py +791 -0
  63. package/latticeai/core/model_compat.py +1 -1
  64. package/latticeai/core/model_resolution.py +0 -1
  65. package/latticeai/core/multi_agent.py +238 -4
  66. package/latticeai/core/policy.py +54 -0
  67. package/latticeai/core/realtime.py +65 -44
  68. package/latticeai/core/security.py +1 -1
  69. package/latticeai/core/sessions.py +66 -10
  70. package/latticeai/core/users.py +147 -0
  71. package/latticeai/core/workflow_engine.py +114 -2
  72. package/latticeai/core/workspace_os.py +477 -29
  73. package/latticeai/models/__init__.py +7 -0
  74. package/latticeai/models/router.py +779 -0
  75. package/latticeai/server_app.py +29 -1536
  76. package/latticeai/services/agent_runtime.py +243 -4
  77. package/latticeai/services/app_context.py +75 -14
  78. package/latticeai/services/ingestion.py +47 -0
  79. package/latticeai/services/kg_portability.py +33 -3
  80. package/latticeai/services/memory_service.py +39 -11
  81. package/latticeai/services/model_runtime.py +2 -5
  82. package/latticeai/services/platform_runtime.py +100 -23
  83. package/latticeai/services/run_executor.py +328 -0
  84. package/latticeai/services/search_service.py +17 -8
  85. package/latticeai/services/tool_dispatch.py +12 -2
  86. package/latticeai/services/triggers.py +241 -0
  87. package/latticeai/services/upload_service.py +37 -12
  88. package/latticeai/services/workspace_service.py +55 -16
  89. package/llm_router.py +29 -772
  90. package/ltcai_cli.py +1 -2
  91. package/mcp_registry.py +25 -788
  92. package/p_reinforce.py +124 -14
  93. package/package.json +10 -20
  94. package/scripts/bump_version.py +99 -0
  95. package/scripts/generate_diagrams.py +0 -1
  96. package/scripts/lint_v3.mjs +105 -18
  97. package/scripts/validate_release_artifacts.py +0 -1
  98. package/scripts/wheel_smoke.py +142 -0
  99. package/server.py +11 -7
  100. package/setup_wizard.py +1142 -0
  101. package/static/sw.js +81 -52
  102. package/static/v3/asset-manifest.json +33 -25
  103. package/static/v3/css/{lattice.base.e4cdd05d.css → lattice.base.49deefb5.css} +1 -1
  104. package/static/v3/css/lattice.base.css +1 -1
  105. package/static/v3/css/{lattice.components.9b49d614.css → lattice.components.cde18231.css} +1 -1
  106. package/static/v3/css/lattice.components.css +1 -1
  107. package/static/v3/css/{lattice.shell.8fcc9d33.css → lattice.shell.29d36d85.css} +1 -1
  108. package/static/v3/css/lattice.shell.css +1 -1
  109. package/static/v3/css/{lattice.tokens.e7018963.css → lattice.tokens.304cbc40.css} +3 -0
  110. package/static/v3/css/lattice.tokens.css +3 -0
  111. package/static/v3/css/{lattice.views.22f69117.css → lattice.views.0a18b6c5.css} +2 -2
  112. package/static/v3/css/lattice.views.css +2 -2
  113. package/static/v3/index.html +3 -4
  114. package/static/v3/js/{app.c541f955.js → app.c5c80c46.js} +1 -1
  115. package/static/v3/js/core/{api.33d6320e.js → api.ba0fbf14.js} +58 -1
  116. package/static/v3/js/core/api.js +57 -0
  117. package/static/v3/js/core/i18n.880e1fec.js +575 -0
  118. package/static/v3/js/core/i18n.js +575 -0
  119. package/static/v3/js/core/routes.37522821.js +101 -0
  120. package/static/v3/js/core/routes.js +71 -63
  121. package/static/v3/js/core/{shell.8c163e0e.js → shell.e3f6bbfa.js} +68 -39
  122. package/static/v3/js/core/shell.js +66 -37
  123. package/static/v3/js/core/{store.34ebd5e6.js → store.7b2aa044.js} +11 -1
  124. package/static/v3/js/core/store.js +11 -1
  125. package/static/v3/js/views/account.eff40715.js +143 -0
  126. package/static/v3/js/views/account.js +143 -0
  127. package/static/v3/js/views/activity.0d271ef9.js +67 -0
  128. package/static/v3/js/views/activity.js +67 -0
  129. package/static/v3/js/views/{admin-users.03bac88c.js → admin-users.f7ac7b43.js} +4 -6
  130. package/static/v3/js/views/admin-users.js +4 -6
  131. package/static/v3/js/views/{agents.014d0b74.js → agents.17c5288d.js} +35 -12
  132. package/static/v3/js/views/agents.js +35 -12
  133. package/static/v3/js/views/{chat.e6dd7dd0.js → chat.e250e2cc.js} +23 -0
  134. package/static/v3/js/views/chat.js +23 -0
  135. package/static/v3/js/views/graph-canvas.17c15d65.js +509 -0
  136. package/static/v3/js/views/graph-canvas.js +509 -0
  137. package/static/v3/js/views/{hybrid-search.b22b97e0.js → hybrid-search.2fb63ed9.js} +1 -2
  138. package/static/v3/js/views/hybrid-search.js +1 -2
  139. package/static/v3/js/views/{knowledge-graph.a96040a5.js → knowledge-graph.4d09c537.js} +60 -44
  140. package/static/v3/js/views/knowledge-graph.js +60 -44
  141. package/static/v3/js/views/network.52a4f181.js +97 -0
  142. package/static/v3/js/views/network.js +97 -0
  143. package/static/v3/js/views/{planning.9ac3e313.js → planning.4876fd77.js} +26 -5
  144. package/static/v3/js/views/planning.js +26 -5
  145. package/static/v3/js/views/runs.b63b2afa.js +144 -0
  146. package/static/v3/js/views/runs.js +144 -0
  147. package/static/v3/js/views/{settings.8631fa5e.js → settings.b7140634.js} +7 -8
  148. package/static/v3/js/views/settings.js +7 -8
  149. package/static/v3/js/views/snapshots.6f5db095.js +135 -0
  150. package/static/v3/js/views/snapshots.js +135 -0
  151. package/static/v3/js/views/{workflows.26c57290.js → workflows.7752225a.js} +87 -2
  152. package/static/v3/js/views/workflows.js +87 -2
  153. package/static/v3/js/views/workspace-admin.c466029b.js +156 -0
  154. package/static/v3/js/views/workspace-admin.js +156 -0
  155. package/static/vendor/chart.umd.min.js +20 -0
  156. package/static/vendor/fonts/inter-latin-300-normal.woff2 +0 -0
  157. package/static/vendor/fonts/inter-latin-400-normal.woff2 +0 -0
  158. package/static/vendor/fonts/inter-latin-500-normal.woff2 +0 -0
  159. package/static/vendor/fonts/inter-latin-600-normal.woff2 +0 -0
  160. package/static/vendor/fonts/inter-latin-700-normal.woff2 +0 -0
  161. package/static/vendor/fonts/inter-latin-800-normal.woff2 +0 -0
  162. package/static/vendor/fonts/inter.css +44 -0
  163. package/static/vendor/icons/tabler-icons.min.css +4 -0
  164. package/static/vendor/icons/tabler-icons.woff2 +0 -0
  165. package/static/vendor/marked.min.js +69 -0
  166. package/telegram_bot.py +1 -2
  167. package/tools/commands.py +4 -2
  168. package/tools/computer.py +1 -1
  169. package/tools/documents.py +1 -3
  170. package/tools/filesystem.py +0 -4
  171. package/tools/knowledge.py +1 -3
  172. package/tools/network.py +1 -3
  173. package/codex_telegram_bot.py +0 -195
  174. package/docs/assets/v3.4.0/agent-run.png +0 -0
  175. package/docs/assets/v3.4.0/agents.png +0 -0
  176. package/docs/assets/v3.4.0/before/chat-before.png +0 -0
  177. package/docs/assets/v3.4.0/before/files-before.png +0 -0
  178. package/docs/assets/v3.4.0/chat.png +0 -0
  179. package/docs/assets/v3.4.0/connect-folder.png +0 -0
  180. package/docs/assets/v3.4.0/files.png +0 -0
  181. package/docs/assets/v3.4.0/home.png +0 -0
  182. package/docs/assets/v3.4.0/hooks-dispatch.png +0 -0
  183. package/docs/assets/v3.4.0/knowledge-graph.png +0 -0
  184. package/docs/assets/v3.4.0/local-agent.png +0 -0
  185. package/docs/assets/v3.4.0/memory.png +0 -0
  186. package/docs/assets/v3.4.0/settings.png +0 -0
  187. package/docs/assets/v3.4.0/vision-input.png +0 -0
  188. package/docs/assets/v3.4.0/workflows.png +0 -0
  189. package/docs/assets/v3.4.1/e2e_runtime_log.txt +0 -42
  190. package/docs/assets/v3.4.1/hooks-dispatch.png +0 -0
  191. package/docs/assets/v3.4.1/local-agent.png +0 -0
  192. package/docs/images/admin-dashboard.png +0 -0
  193. package/docs/images/architecture.png +0 -0
  194. package/docs/images/enterprise.png +0 -0
  195. package/docs/images/graph.png +0 -0
  196. package/docs/images/hero.gif +0 -0
  197. package/docs/images/knowledge-graph.png +0 -0
  198. package/docs/images/lattice-ai-demo.gif +0 -0
  199. package/docs/images/lattice-ai-hero.png +0 -0
  200. package/docs/images/logo.svg +0 -33
  201. package/docs/images/mobile-responsive.png +0 -0
  202. package/docs/images/model-recommendation.png +0 -0
  203. package/docs/images/onboarding.png +0 -0
  204. package/docs/images/organization.png +0 -0
  205. package/docs/images/pipeline.png +0 -0
  206. package/docs/images/screenshot-admin.png +0 -0
  207. package/docs/images/screenshot-chat.png +0 -0
  208. package/docs/images/screenshot-graph.png +0 -0
  209. package/docs/images/skills.png +0 -0
  210. package/docs/images/workspace-dark.png +0 -0
  211. package/docs/images/workspace-light.png +0 -0
  212. package/docs/images/workspace.png +0 -0
  213. package/requirements.txt +0 -16
  214. package/static/account.html +0 -115
  215. package/static/activity.html +0 -73
  216. package/static/admin.html +0 -488
  217. package/static/agents.html +0 -139
  218. package/static/chat.html +0 -844
  219. package/static/css/reference/account.css +0 -439
  220. package/static/css/reference/admin.css +0 -610
  221. package/static/css/reference/base.css +0 -1661
  222. package/static/css/reference/chat.css +0 -4623
  223. package/static/css/reference/graph.css +0 -1016
  224. package/static/css/responsive.css +0 -861
  225. package/static/graph.html +0 -124
  226. package/static/platform.css +0 -104
  227. package/static/plugins.html +0 -136
  228. package/static/scripts/account.js +0 -238
  229. package/static/scripts/admin.js +0 -1614
  230. package/static/scripts/chat.js +0 -5081
  231. package/static/scripts/graph.js +0 -1804
  232. package/static/scripts/platform.js +0 -64
  233. package/static/scripts/ux.js +0 -167
  234. package/static/scripts/workspace.js +0 -948
  235. package/static/v3/js/core/routes.2ce3815a.js +0 -93
  236. package/static/workflows.html +0 -146
  237. package/static/workspace.css +0 -1121
  238. package/static/workspace.html +0 -357
@@ -1,1016 +0,0 @@
1
- /* Lattice AI — graph page (graph.html, body.lattice-ref-graph). Token-native. */
2
- /* ============================================================
3
- GRAPH PAGE (graph.html)
4
- ============================================================ */
5
- * { box-sizing: border-box; }
6
- html, body.lattice-ref-graph { height: 100%; }
7
- body.lattice-ref-graph {
8
- margin: 0;
9
- overflow: hidden;
10
- color: var(--text);
11
- background: var(--app-bg);
12
- font-family: "SF Pro Display", "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
13
- }
14
-
15
- body.lattice-ref-graph .app {
16
- min-height: 0;
17
- height: 100dvh;
18
- overflow: hidden;
19
- }
20
-
21
- body.lattice-ref-graph .stage {
22
- height: calc(100dvh - 138px);
23
- max-height: calc(100dvh - 138px);
24
- min-height: 0;
25
- }
26
-
27
- body.lattice-ref-graph .app > aside:not(.reference-rail) {
28
- height: calc(100dvh - 138px);
29
- max-height: calc(100dvh - 138px);
30
- min-height: 0;
31
- overflow-y: auto;
32
- overscroll-behavior: contain;
33
- padding-bottom: max(28px, env(safe-area-inset-bottom));
34
- scrollbar-gutter: stable;
35
- }
36
-
37
- .app {
38
- display: grid;
39
- grid-template-columns: minmax(0, 1fr) 360px;
40
- height: 100vh;
41
- }
42
-
43
- .stage {
44
- position: relative;
45
- min-width: 0;
46
- border-right: 1px solid var(--line);
47
- background:
48
- radial-gradient(circle, rgba(111,66,232,0.18) 1px, transparent 1.9px),
49
- linear-gradient(116deg, transparent 0 43%, rgba(111,66,232,0.05) 43.1%, transparent 43.28% 100%),
50
- linear-gradient(28deg, transparent 0 61%, rgba(180,160,255,0.07) 61.1%, transparent 61.28% 100%);
51
- background-size: 32px 32px, 100% 100%, 100% 100%;
52
- background-position: 10px 10px, 0 0, 0 0;
53
- }
54
-
55
- body.lattice-ref-graph .stage {
56
- background:
57
- radial-gradient(circle, var(--graph-grid) 1px, transparent 1.9px),
58
- linear-gradient(116deg, transparent 0 43%, rgba(111,66,232,0.05) 43.1%, transparent 43.28% 100%),
59
- linear-gradient(180deg, var(--graph-bg) 0%, var(--surface) 100%);
60
- background-size: 32px 32px, 100% 100%, 100% 100%;
61
- background-position: 10px 10px, 0 0, 0 0;
62
- }
63
-
64
- :root[data-lt-theme="dark"] body.lattice-ref-graph {
65
- background: var(--bg);
66
- }
67
-
68
- :root[data-lt-theme="dark"] body.lattice-ref-graph .app,
69
- :root[data-lt-theme="dark"] body.lattice-ref-graph .app > aside:not(.reference-rail) {
70
- background: var(--bg);
71
- }
72
-
73
- :root[data-lt-theme="dark"] body.lattice-ref-graph .stage {
74
- background:
75
- radial-gradient(circle, rgba(160, 170, 230, 0.11) 1px, transparent 1.9px),
76
- linear-gradient(116deg, transparent 0 43%, rgba(167,139,250,0.08) 43.1%, transparent 43.28% 100%),
77
- radial-gradient(circle at 72% 18%, rgba(34, 211, 238, 0.08), transparent 28%),
78
- linear-gradient(180deg, #0b0b1e 0%, #10122c 100%);
79
- border-color: rgba(160, 170, 230, 0.20);
80
- box-shadow: inset 0 0 0 1px rgba(167, 139, 250, 0.05), 0 18px 52px rgba(0, 0, 0, 0.40);
81
- }
82
-
83
- :root[data-lt-theme="dark"] body.lattice-ref-graph .stage::before {
84
- color: var(--text);
85
- }
86
-
87
- :root[data-lt-theme="dark"] body.lattice-ref-graph .search-shell,
88
- :root[data-lt-theme="dark"] body.lattice-ref-graph .toolbar,
89
- :root[data-lt-theme="dark"] body.lattice-ref-graph .graph-minimap,
90
- :root[data-lt-theme="dark"] body.lattice-ref-graph .detail-wrap {
91
- background: rgba(22, 22, 58, 0.96);
92
- border-color: rgba(160, 170, 230, 0.22);
93
- box-shadow: 0 18px 46px rgba(0, 0, 0, 0.46);
94
- }
95
-
96
- :root[data-lt-theme="dark"] body.lattice-ref-graph .search-input,
97
- :root[data-lt-theme="dark"] body.lattice-ref-graph .local-source-input input {
98
- background: rgba(255, 255, 255, 0.06);
99
- border-color: rgba(160, 170, 230, 0.22);
100
- color: var(--text);
101
- }
102
-
103
- :root[data-lt-theme="dark"] body.lattice-ref-graph .search-input::placeholder,
104
- :root[data-lt-theme="dark"] body.lattice-ref-graph .local-source-input input::placeholder {
105
- color: rgba(226, 232, 255, 0.48);
106
- }
107
-
108
- canvas {
109
- display: block;
110
- width: 100%;
111
- height: 100%;
112
- cursor: grab;
113
- }
114
-
115
- canvas.panning { cursor: grabbing; }
116
-
117
- .search-shell,
118
- .toolbar {
119
- position: absolute;
120
- z-index: 20;
121
- border: 1px solid var(--line);
122
- background: var(--panel);
123
- backdrop-filter: none; /* glass removed v3.5.0 */
124
- box-shadow: var(--shadow);
125
- }
126
-
127
- .search-shell {
128
- top: 16px;
129
- left: 16px;
130
- width: min(360px, calc(100% - 32px));
131
- border-radius: 10px;
132
- overflow: hidden;
133
- }
134
-
135
- .search-head {
136
- display: flex;
137
- align-items: center;
138
- justify-content: space-between;
139
- gap: 12px;
140
- padding: 14px 16px 10px;
141
- border-bottom: 1px solid rgba(111,66,232,0.10);
142
- }
143
-
144
- .search-title {
145
- display: flex;
146
- flex-direction: column;
147
- gap: 3px;
148
- }
149
-
150
- .search-title strong {
151
- font-size: 14px;
152
- font-weight: 700;
153
- letter-spacing: 0.01em;
154
- }
155
-
156
- .search-title span {
157
- font-size: 12px;
158
- color: var(--muted);
159
- }
160
-
161
- .search-count {
162
- flex-shrink: 0;
163
- font-size: 11px;
164
- color: #fff;
165
- background: linear-gradient(135deg, var(--accent), #9a78f0);
166
- border-radius: 999px;
167
- padding: 5px 10px;
168
- font-weight: 700;
169
- }
170
-
171
- .search-input-wrap {
172
- padding: 12px 16px 10px;
173
- }
174
-
175
- .search-input-row {
176
- display: flex;
177
- gap: 8px;
178
- align-items: center;
179
- }
180
-
181
- .search-input {
182
- flex: 1;
183
- height: 42px;
184
- border-radius: 12px;
185
- border: 1px solid var(--line-strong);
186
- background: var(--input);
187
- color: var(--text);
188
- padding: 0 14px;
189
- font-size: 14px;
190
- outline: none;
191
- }
192
-
193
- .search-input:focus {
194
- border-color: rgba(111,66,232,0.55);
195
- box-shadow: 0 0 0 4px rgba(111,66,232,0.09);
196
- }
197
-
198
- .icon-btn,
199
- .tb-btn {
200
- height: 42px;
201
- border-radius: 8px;
202
- border: 1px solid var(--line-strong);
203
- background: var(--surface-2);
204
- color: var(--text);
205
- cursor: pointer;
206
- font-size: 13px;
207
- transition: 140ms ease;
208
- }
209
-
210
- .icon-btn {
211
- width: 42px;
212
- flex-shrink: 0;
213
- font-size: 16px;
214
- }
215
-
216
- .icon-btn:hover,
217
- .tb-btn:hover {
218
- transform: translateY(-1px);
219
- border-color: rgba(111,66,232,0.45);
220
- color: var(--accent);
221
- background: rgba(111,66,232,0.07);
222
- }
223
-
224
- .search-results {
225
- max-height: min(420px, calc(100vh - 180px));
226
- overflow-y: auto;
227
- padding: 0 8px 10px;
228
- }
229
-
230
- .search-empty,
231
- .search-loading {
232
- margin: 0;
233
- padding: 14px 12px 16px;
234
- color: var(--muted);
235
- font-size: 13px;
236
- line-height: 1.65;
237
- }
238
-
239
- .search-list {
240
- display: flex;
241
- flex-direction: column;
242
- gap: 8px;
243
- padding: 0 8px 8px;
244
- }
245
-
246
- .search-item {
247
- width: 100%;
248
- text-align: left;
249
- border: 1px solid rgba(111,66,232,0.10);
250
- border-radius: 8px;
251
- background: var(--surface-2);
252
- color: var(--text);
253
- padding: 12px 12px 13px;
254
- cursor: pointer;
255
- transition: 140ms ease;
256
- }
257
-
258
- .search-item:hover,
259
- .search-item.active {
260
- border-color: rgba(111,66,232,0.34);
261
- background: rgba(111,66,232,0.07);
262
- transform: translateY(-1px);
263
- }
264
-
265
- .search-item-top {
266
- display: flex;
267
- align-items: center;
268
- gap: 8px;
269
- margin-bottom: 6px;
270
- }
271
-
272
- .search-type {
273
- display: inline-flex;
274
- align-items: center;
275
- border-radius: 999px;
276
- padding: 4px 10px;
277
- font-size: 11px;
278
- font-weight: 700;
279
- color: var(--text);
280
- }
281
-
282
- .search-item-title {
283
- font-size: 13px;
284
- font-weight: 700;
285
- letter-spacing: 0.01em;
286
- color: var(--text);
287
- }
288
-
289
- .search-item-summary {
290
- font-size: 12px;
291
- color: var(--muted);
292
- line-height: 1.55;
293
- margin: 0 0 8px;
294
- word-break: break-word;
295
- display: -webkit-box;
296
- -webkit-line-clamp: 3;
297
- line-clamp: 3;
298
- -webkit-box-orient: vertical;
299
- overflow: hidden;
300
- }
301
-
302
- .search-item-meta {
303
- font-size: 11px;
304
- color: var(--faint);
305
- display: flex;
306
- gap: 10px;
307
- flex-wrap: wrap;
308
- }
309
-
310
- .toolbar {
311
- top: 16px;
312
- right: 16px;
313
- display: flex;
314
- flex-wrap: wrap;
315
- gap: 8px;
316
- padding: 8px;
317
- border-radius: 10px;
318
- max-width: min(760px, calc(100% - 32px));
319
- }
320
-
321
- .tb-btn {
322
- padding: 0 14px;
323
- min-width: 72px;
324
- white-space: nowrap;
325
- }
326
-
327
- #tooltip {
328
- position: fixed;
329
- z-index: 50;
330
- max-width: 300px;
331
- padding: 8px 11px;
332
- border-radius: 10px;
333
- border: 1px solid rgba(111,66,232,0.18);
334
- background: var(--surface-elevated);
335
- color: var(--text);
336
- box-shadow: var(--shadow);
337
- font-size: 12px;
338
- line-height: 1.45;
339
- pointer-events: none;
340
- display: none;
341
- word-break: break-word;
342
- }
343
-
344
- aside {
345
- display: flex;
346
- flex-direction: column;
347
- background: var(--surface);
348
- border-left: 1px solid var(--accent-soft);
349
- overflow: hidden;
350
- }
351
-
352
- .sidebar-head {
353
- padding: 18px 18px 12px;
354
- border-bottom: 1px solid rgba(111,66,232,0.10);
355
- }
356
-
357
- .eyebrow {
358
- color: var(--accent);
359
- font-size: 11px;
360
- font-weight: 700;
361
- letter-spacing: 0.12em;
362
- text-transform: uppercase;
363
- margin-bottom: 8px;
364
- }
365
-
366
- h1 {
367
- margin: 0;
368
- font-size: 22px;
369
- line-height: 1.1;
370
- letter-spacing: -0.02em;
371
- }
372
-
373
- .sidebar-sub {
374
- margin: 10px 0 0;
375
- color: var(--muted);
376
- font-size: 13px;
377
- line-height: 1.65;
378
- }
379
-
380
- .stats-row {
381
- display: grid;
382
- grid-template-columns: 1fr 1fr;
383
- gap: 10px;
384
- margin-top: 14px;
385
- }
386
-
387
- .stat {
388
- border: 1px solid rgba(111,66,232,0.16);
389
- border-radius: 8px;
390
- background: var(--surface-2);
391
- padding: 12px 13px;
392
- color: var(--text);
393
- }
394
-
395
- .stat strong {
396
- display: block;
397
- font-size: 24px;
398
- line-height: 1;
399
- margin-bottom: 5px;
400
- }
401
-
402
- .stat span {
403
- display: block;
404
- font-size: 11px;
405
- color: var(--muted);
406
- text-transform: uppercase;
407
- letter-spacing: 0.08em;
408
- }
409
-
410
- .section {
411
- padding: 16px 18px 14px;
412
- flex-shrink: 0;
413
- }
414
-
415
- .section-label {
416
- color: var(--accent);
417
- font-size: 11px;
418
- text-transform: uppercase;
419
- letter-spacing: 0.08em;
420
- font-weight: 700;
421
- margin-bottom: 10px;
422
- }
423
-
424
- .legend-grid,
425
- .filter-grid {
426
- display: flex;
427
- flex-direction: column;
428
- gap: 7px;
429
- }
430
-
431
- .local-source-panel {
432
- display: flex;
433
- flex-direction: column;
434
- gap: 10px;
435
- }
436
-
437
- .local-source-notice {
438
- border: 1px solid rgba(13,148,136,0.20);
439
- border-radius: 8px;
440
- background: rgba(13,148,136,0.07);
441
- color: var(--success);
442
- padding: 9px 10px;
443
- font-size: 12px;
444
- line-height: 1.5;
445
- }
446
-
447
- .local-source-input {
448
- display: flex;
449
- gap: 8px;
450
- align-items: center;
451
- }
452
-
453
- .local-source-input input {
454
- min-width: 0;
455
- flex: 1;
456
- height: 38px;
457
- border-radius: 8px;
458
- border: 1px solid rgba(111,66,232,0.16);
459
- background: var(--input);
460
- color: var(--text);
461
- padding: 0 10px;
462
- font-size: 12px;
463
- outline: none;
464
- }
465
-
466
- .local-source-input input:focus {
467
- border-color: rgba(111,66,232,0.42);
468
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
469
- }
470
-
471
- .local-root-list,
472
- .local-tree-list,
473
- .local-source-list {
474
- display: flex;
475
- flex-direction: column;
476
- gap: 6px;
477
- max-height: min(150px, 22dvh);
478
- overflow-y: auto;
479
- padding-right: 2px;
480
- }
481
-
482
- .local-root-btn,
483
- .local-tree-row,
484
- .local-source-row {
485
- width: 100%;
486
- border: 1px solid rgba(111,66,232,0.13);
487
- border-radius: 8px;
488
- background: var(--surface-2);
489
- color: var(--text);
490
- padding: 8px 9px;
491
- display: grid;
492
- grid-template-columns: 18px minmax(0, 1fr) auto;
493
- gap: 8px;
494
- align-items: center;
495
- text-align: left;
496
- font-size: 12px;
497
- }
498
-
499
- .local-root-btn {
500
- cursor: pointer;
501
- }
502
-
503
- .local-root-btn:hover,
504
- .local-root-btn.active {
505
- border-color: rgba(111,66,232,0.34);
506
- background: rgba(111,66,232,0.07);
507
- }
508
-
509
- .local-source-main,
510
- .local-tree-main {
511
- min-width: 0;
512
- }
513
-
514
- .local-source-main strong,
515
- .local-tree-main strong {
516
- display: block;
517
- font-size: 12px;
518
- line-height: 1.25;
519
- overflow: hidden;
520
- text-overflow: ellipsis;
521
- white-space: nowrap;
522
- }
523
-
524
- .local-source-main span,
525
- .local-tree-main span {
526
- display: block;
527
- color: var(--faint);
528
- font-size: 11px;
529
- line-height: 1.35;
530
- overflow: hidden;
531
- text-overflow: ellipsis;
532
- white-space: nowrap;
533
- }
534
-
535
- .local-source-actions {
536
- display: grid;
537
- grid-template-columns: repeat(2, minmax(0, 1fr));
538
- gap: 7px;
539
- }
540
-
541
- .local-source-btn {
542
- min-width: 0;
543
- height: 36px;
544
- border: 1px solid rgba(111,66,232,0.18);
545
- border-radius: 8px;
546
- background: var(--surface-2);
547
- color: var(--text);
548
- cursor: pointer;
549
- display: inline-flex;
550
- align-items: center;
551
- justify-content: center;
552
- gap: 6px;
553
- font-size: 12px;
554
- font-weight: 650;
555
- }
556
-
557
- .local-source-btn:hover {
558
- border-color: rgba(111,66,232,0.42);
559
- color: var(--accent);
560
- background: rgba(111,66,232,0.07);
561
- }
562
-
563
- .local-source-btn.primary {
564
- grid-column: 1 / -1;
565
- background: linear-gradient(135deg, var(--accent), #7b61ff);
566
- color: #fff;
567
- border-color: rgba(111,66,232,0.3);
568
- }
569
-
570
- .local-source-btn.primary:hover {
571
- color: #fff;
572
- background: linear-gradient(135deg, #5f35d8, #6b51ef);
573
- box-shadow: 0 8px 20px rgba(111,66,232,0.22);
574
- }
575
-
576
- .local-source-btn:disabled {
577
- cursor: not-allowed;
578
- opacity: 0.55;
579
- transform: none;
580
- }
581
-
582
- .local-option-row {
583
- display: grid;
584
- grid-template-columns: repeat(2, minmax(0, 1fr));
585
- gap: 7px;
586
- }
587
-
588
- .local-option-btn {
589
- min-width: 0;
590
- height: 36px;
591
- border: 1px solid rgba(111,66,232,0.18);
592
- border-radius: 8px;
593
- background: var(--surface-2);
594
- color: var(--muted);
595
- cursor: pointer;
596
- display: inline-flex;
597
- align-items: center;
598
- justify-content: center;
599
- gap: 6px;
600
- padding: 0 9px;
601
- font-size: 12px;
602
- font-weight: 650;
603
- line-height: 1;
604
- text-align: center;
605
- white-space: nowrap;
606
- }
607
-
608
- .local-option-btn span {
609
- min-width: 0;
610
- overflow: hidden;
611
- text-overflow: ellipsis;
612
- white-space: nowrap;
613
- }
614
-
615
- .local-option-btn:hover {
616
- border-color: rgba(111,66,232,0.42);
617
- color: var(--accent);
618
- background: rgba(111,66,232,0.07);
619
- }
620
-
621
- .local-option-btn.active {
622
- border-color: rgba(111,66,232,0.48);
623
- background: rgba(111,66,232,0.11);
624
- color: var(--accent);
625
- box-shadow: inset 0 0 0 1px var(--accent-soft);
626
- }
627
-
628
- .local-audit-grid {
629
- display: grid;
630
- grid-template-columns: repeat(3, minmax(0, 1fr));
631
- gap: 6px;
632
- }
633
-
634
- .local-audit-stat {
635
- border: 1px solid rgba(111,66,232,0.13);
636
- border-radius: 8px;
637
- background: var(--surface-2);
638
- padding: 8px 7px;
639
- min-width: 0;
640
- }
641
-
642
- .local-audit-stat strong {
643
- display: block;
644
- font-size: 15px;
645
- line-height: 1.05;
646
- }
647
-
648
- .local-audit-stat span {
649
- display: block;
650
- margin-top: 4px;
651
- color: var(--faint);
652
- font-size: 10px;
653
- line-height: 1.2;
654
- }
655
-
656
- .local-status-line {
657
- color: var(--muted);
658
- font-size: 12px;
659
- line-height: 1.45;
660
- word-break: break-word;
661
- }
662
-
663
- .local-status-line.error {
664
- color: #a53131;
665
- }
666
-
667
- .local-permission {
668
- border: 1px solid rgba(245,158,11,0.28);
669
- background: rgba(245,158,11,0.09);
670
- border-radius: 8px;
671
- padding: 9px;
672
- display: flex;
673
- flex-direction: column;
674
- gap: 8px;
675
- }
676
-
677
- .legend-item,
678
- .filter-item {
679
- display: flex;
680
- align-items: center;
681
- gap: 9px;
682
- min-height: 26px;
683
- font-size: 12px;
684
- min-width: 0;
685
- }
686
-
687
- .filter-item {
688
- cursor: pointer;
689
- user-select: none;
690
- }
691
-
692
- .filter-item input[type="checkbox"] {
693
- width: 14px;
694
- height: 14px;
695
- margin: 0;
696
- accent-color: var(--accent);
697
- cursor: pointer;
698
- }
699
-
700
- .dot {
701
- width: 10px;
702
- height: 10px;
703
- border-radius: 50%;
704
- flex-shrink: 0;
705
- box-shadow: 0 0 0 3px rgba(111,66,232,0.08);
706
- }
707
-
708
- .legend-line {
709
- width: 18px;
710
- height: 0;
711
- border-top: 2px solid currentColor;
712
- opacity: 0.8;
713
- flex-shrink: 0;
714
- }
715
-
716
- .filter-name,
717
- .legend-name {
718
- flex: 1;
719
- min-width: 0;
720
- color: var(--text);
721
- font-size: 13px;
722
- font-weight: 500;
723
- overflow-wrap: anywhere;
724
- }
725
-
726
- .filter-count,
727
- .legend-meta {
728
- color: var(--muted);
729
- font-size: 12px;
730
- font-weight: 600;
731
- text-align: right;
732
- white-space: nowrap;
733
- }
734
-
735
- .detail-wrap {
736
- flex: 0 0 auto;
737
- min-height: auto;
738
- overflow: visible;
739
- padding: 18px 18px max(24px, env(safe-area-inset-bottom));
740
- }
741
-
742
- .type-badge {
743
- display: inline-flex;
744
- align-items: center;
745
- border-radius: 999px;
746
- padding: 5px 11px;
747
- font-size: 11px;
748
- font-weight: 700;
749
- color: var(--text);
750
- margin-bottom: 10px;
751
- }
752
-
753
- .detail-title {
754
- font-size: 19px;
755
- line-height: 1.28;
756
- font-weight: 750;
757
- margin-bottom: 8px;
758
- letter-spacing: -0.01em;
759
- overflow-wrap: anywhere;
760
- }
761
-
762
- .detail-summary {
763
- color: var(--muted);
764
- font-size: 13px;
765
- line-height: 1.7;
766
- white-space: pre-wrap;
767
- word-break: break-word;
768
- margin-bottom: 14px;
769
- }
770
-
771
- .metric-grid {
772
- display: grid;
773
- grid-template-columns: repeat(2, minmax(0, 1fr));
774
- gap: 10px;
775
- margin-bottom: 14px;
776
- }
777
-
778
- .metric-card {
779
- border: 1px solid var(--border);
780
- border-radius: 8px;
781
- padding: 11px 12px;
782
- background: var(--card);
783
- color: var(--text);
784
- }
785
-
786
- .metric-card strong {
787
- display: block;
788
- font-size: 18px;
789
- line-height: 1;
790
- margin-bottom: 5px;
791
- }
792
-
793
- .metric-card span {
794
- display: block;
795
- font-size: 11px;
796
- color: var(--muted);
797
- text-transform: uppercase;
798
- letter-spacing: 0.08em;
799
- }
800
-
801
- .meta-block {
802
- border: 1px solid var(--accent-soft);
803
- border-radius: 8px;
804
- background: var(--surface-2);
805
- padding: 12px;
806
- color: var(--muted);
807
- font-size: 12px;
808
- line-height: 1.65;
809
- white-space: pre-wrap;
810
- word-break: break-word;
811
- overflow-wrap: anywhere;
812
- max-height: min(42dvh, 460px);
813
- overflow: auto;
814
- }
815
-
816
- .jump-btn {
817
- display: inline-flex;
818
- align-items: center;
819
- gap: 6px;
820
- margin: 0 0 14px;
821
- padding: 8px 14px;
822
- border-radius: 999px;
823
- text-decoration: none;
824
- font-size: 12px;
825
- font-weight: 700;
826
- color: #fff;
827
- background: linear-gradient(135deg, var(--accent), var(--accent-2));
828
- box-shadow: 0 8px 22px rgba(111,66,232,0.22);
829
- }
830
-
831
- .jump-btn:hover { filter: brightness(1.04); }
832
-
833
- .jump-btn.secondary {
834
- border: 1px solid rgba(111,66,232,0.20);
835
- color: var(--text);
836
- background: var(--surface-2);
837
- box-shadow: none;
838
- cursor: pointer;
839
- font: inherit;
840
- font-size: 12px;
841
- font-weight: 700;
842
- }
843
-
844
- .detail-actions {
845
- display: flex;
846
- flex-wrap: wrap;
847
- gap: 8px;
848
- margin-bottom: 14px;
849
- }
850
-
851
- .related-node-list {
852
- display: grid;
853
- gap: 7px;
854
- margin-bottom: 14px;
855
- }
856
-
857
- .related-node-btn {
858
- width: 100%;
859
- min-width: 0;
860
- display: grid;
861
- grid-template-columns: 18px minmax(0, 1fr) auto;
862
- align-items: center;
863
- gap: 8px;
864
- border: 1px solid rgba(111,66,232,0.13);
865
- border-radius: 8px;
866
- background: var(--surface-2);
867
- color: var(--text);
868
- padding: 8px 10px;
869
- text-align: left;
870
- cursor: pointer;
871
- }
872
-
873
- .related-node-btn:hover {
874
- border-color: rgba(111,66,232,0.34);
875
- background: rgba(111,66,232,0.07);
876
- }
877
-
878
- .related-node-btn strong {
879
- min-width: 0;
880
- overflow: hidden;
881
- text-overflow: ellipsis;
882
- white-space: nowrap;
883
- font-size: 12px;
884
- }
885
-
886
- .related-node-btn em {
887
- color: var(--faint);
888
- font-size: 11px;
889
- font-style: normal;
890
- white-space: nowrap;
891
- }
892
-
893
- .focus-chip {
894
- position: absolute;
895
- z-index: 21;
896
- left: 16px;
897
- bottom: 16px;
898
- max-width: min(560px, calc(100% - 32px));
899
- display: flex;
900
- flex-wrap: wrap;
901
- gap: 8px;
902
- padding: 8px;
903
- border: 1px solid var(--line);
904
- border-radius: 10px;
905
- background: var(--surface-2);
906
- box-shadow: var(--shadow);
907
- backdrop-filter: none; /* glass removed v3.5.0 */
908
- }
909
-
910
- .focus-chip span {
911
- display: inline-flex;
912
- align-items: center;
913
- gap: 6px;
914
- border-radius: 999px;
915
- background: rgba(111,66,232,0.08);
916
- color: var(--text);
917
- padding: 5px 10px;
918
- font-size: 11px;
919
- font-weight: 800;
920
- max-width: 260px;
921
- overflow: hidden;
922
- text-overflow: ellipsis;
923
- white-space: nowrap;
924
- }
925
-
926
- .search-shell.search-open .search-results {
927
- display: block;
928
- }
929
-
930
- .empty-hint {
931
- margin: 0;
932
- color: var(--muted);
933
- font-size: 13px;
934
- line-height: 1.8;
935
- }
936
-
937
- @media (max-width: 900px) {
938
- body.lattice-ref-graph {
939
- overflow-y: auto;
940
- }
941
-
942
- body.lattice-ref-graph .reference-rail {
943
- display: none;
944
- }
945
-
946
- body.lattice-ref-graph {
947
- grid-template-columns: 1fr;
948
- }
949
-
950
- body.lattice-ref-graph .app {
951
- height: auto;
952
- min-height: 100dvh;
953
- overflow: visible;
954
- grid-template-columns: 1fr;
955
- grid-template-rows: minmax(420px, 58dvh) auto;
956
- }
957
-
958
- body.lattice-ref-graph .stage {
959
- height: auto;
960
- max-height: none;
961
- min-height: 420px;
962
- margin: 84px 12px 12px;
963
- }
964
-
965
- body.lattice-ref-graph .stage::before {
966
- top: 26px;
967
- left: 58px;
968
- font-size: 24px;
969
- }
970
-
971
- body.lattice-ref-graph .stage::after {
972
- top: 22px;
973
- left: 14px;
974
- }
975
-
976
- body.lattice-ref-graph .search-shell {
977
- top: -60px;
978
- left: 60px;
979
- right: 12px;
980
- width: auto;
981
- }
982
-
983
- body.lattice-ref-graph .app > aside:not(.reference-rail) {
984
- height: auto;
985
- max-height: none;
986
- min-height: 0;
987
- margin: 0 12px 24px;
988
- overflow: visible;
989
- padding-bottom: max(18px, env(safe-area-inset-bottom));
990
- }
991
-
992
- body.lattice-ref-graph .detail-wrap {
993
- flex: none;
994
- overflow: visible;
995
- }
996
-
997
- .app {
998
- grid-template-columns: 1fr;
999
- grid-template-rows: 1fr 360px;
1000
- }
1001
-
1002
- .stage {
1003
- border-right: 0;
1004
- border-bottom: 1px solid var(--line);
1005
- }
1006
-
1007
- .search-shell {
1008
- width: calc(100% - 32px);
1009
- }
1010
-
1011
- .toolbar {
1012
- top: auto;
1013
- bottom: 16px;
1014
- right: 16px;
1015
- }
1016
- }