ltcai 6.6.0 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -36
- package/docs/CHANGELOG.md +25 -2
- package/frontend/src/App.tsx +78 -3
- package/frontend/src/features/brain/BrainConversation.tsx +20 -2
- package/frontend/src/i18n.ts +10 -0
- package/frontend/src/routes.ts +31 -17
- package/frontend/src/styles.css +83 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/package.json +1 -1
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +84 -6
- package/static/app/assets/Act-DGN37eR4.js +2 -0
- package/static/app/assets/Act-DGN37eR4.js.map +1 -0
- package/static/app/assets/Brain-HDcIwPHW.js +322 -0
- package/static/app/assets/Brain-HDcIwPHW.js.map +1 -0
- package/static/app/assets/Capture--eZfb_Ex.js +2 -0
- package/static/app/assets/Capture--eZfb_Ex.js.map +1 -0
- package/static/app/assets/Library-BbagRFyd.js +2 -0
- package/static/app/assets/Library-BbagRFyd.js.map +1 -0
- package/static/app/assets/System-C6pd3Mp_.js +2 -0
- package/static/app/assets/System-C6pd3Mp_.js.map +1 -0
- package/static/app/assets/index-C950aES_.js +17 -0
- package/static/app/assets/index-C950aES_.js.map +1 -0
- package/static/app/assets/index-ztppMg0c.css +2 -0
- package/static/app/assets/primitives-Bcm5lZRu.js +2 -0
- package/static/app/assets/primitives-Bcm5lZRu.js.map +1 -0
- package/static/app/assets/textarea-C2PLu6_O.js +2 -0
- package/static/app/assets/textarea-C2PLu6_O.js.map +1 -0
- package/static/app/index.html +2 -2
- package/static/app/assets/index-C8toxDpv.css +0 -2
- package/static/app/assets/index-CbvcAQ6B.js +0 -16
- package/static/app/assets/index-CbvcAQ6B.js.map +0 -1
package/README.md
CHANGED
|
@@ -69,42 +69,42 @@ You need Lattice AI when:
|
|
|
69
69
|
Choose the owner of the Brain. The profile is not a SaaS account by default; it
|
|
70
70
|
is the local identity for the knowledge you keep.
|
|
71
71
|
|
|
72
|
-

|
|
73
73
|
|
|
74
74
|
### 2. Environment Analysis
|
|
75
75
|
|
|
76
76
|
See what kind of local AI experience this computer can support before choosing a
|
|
77
77
|
model.
|
|
78
78
|
|
|
79
|
-

|
|
80
80
|
|
|
81
81
|
### 3. Recommended Models
|
|
82
82
|
|
|
83
83
|
Start with a short list: safest recommendation, faster model, stronger model.
|
|
84
84
|
Advanced details stay available without overwhelming first-time users.
|
|
85
85
|
|
|
86
|
-

|
|
87
87
|
|
|
88
88
|
### 4. Install And Load
|
|
89
89
|
|
|
90
90
|
Download and load only after consent. Lattice explains model size, local
|
|
91
91
|
execution, and network use before work starts.
|
|
92
92
|
|
|
93
|
-

|
|
94
94
|
|
|
95
95
|
### 5. Brain Chat
|
|
96
96
|
|
|
97
97
|
Talk normally. Useful decisions and context become memory, then appear later as
|
|
98
98
|
topics, relationships, and graph structure.
|
|
99
99
|
|
|
100
|
-

|
|
101
101
|
|
|
102
102
|
### 6. Review Center
|
|
103
103
|
|
|
104
104
|
Automation results are staged for review before they become durable decisions.
|
|
105
105
|
Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
|
|
106
106
|
|
|
107
|
-

|
|
108
108
|
|
|
109
109
|
## Brain Depths
|
|
110
110
|
|
|
@@ -120,10 +120,10 @@ The user travels inward from everyday memory to deeper structure:
|
|
|
120
120
|
|
|
121
121
|
Walkthrough:
|
|
122
122
|
|
|
123
|
-

|
|
124
124
|
|
|
125
125
|
Screenshot index and capture notes:
|
|
126
|
-
[output/release/v6.
|
|
126
|
+
[output/release/v6.7.0/SCREENSHOT_INDEX.md](output/release/v6.7.0/SCREENSHOT_INDEX.md)
|
|
127
127
|
|
|
128
128
|
## Install
|
|
129
129
|
|
|
@@ -198,34 +198,31 @@ npm run docs:check-links
|
|
|
198
198
|
|
|
199
199
|
See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
|
|
200
200
|
|
|
201
|
-
## Current Release
|
|
202
|
-
|
|
203
|
-
The current
|
|
204
|
-
|
|
205
|
-
- Brain Home now
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
- `dist/ltcai-6.
|
|
225
|
-
- `
|
|
226
|
-
- `ltcai-6.6.0.tgz`
|
|
227
|
-
- `dist/ltcai-6.6.0.vsix`
|
|
228
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_6.6.0_aarch64.dmg`
|
|
201
|
+
## Current Release
|
|
202
|
+
|
|
203
|
+
The current release is **6.7.0 Brain IA Cleanup**:
|
|
204
|
+
|
|
205
|
+
- Brain Home now surfaces direct actions for adding documents, searching the
|
|
206
|
+
graph, changing models, and opening settings.
|
|
207
|
+
- The rich Capture, Brain explorer, Library, System, and Act pages are mounted
|
|
208
|
+
inside a shared Brain shell instead of existing only as hard-to-discover
|
|
209
|
+
compatibility routes.
|
|
210
|
+
- `routes.ts` now separates product shell routes from legacy compatibility
|
|
211
|
+
aliases, so visible IA and old entry URLs can evolve independently.
|
|
212
|
+
- Rich pages are code-split with lazy route loading. The first Brain Home bundle
|
|
213
|
+
stays below the previous warning threshold while graph/search/model/settings
|
|
214
|
+
surfaces load when opened.
|
|
215
|
+
- The release keeps the 6.6.0 backend-owned Brain proof loop and
|
|
216
|
+
workspace-scoped ingestion intact while making the product actions more
|
|
217
|
+
obvious in the first five minutes.
|
|
218
|
+
|
|
219
|
+
Expected artifacts for 6.7.0 release must use exact filenames:
|
|
220
|
+
|
|
221
|
+
- `dist/ltcai-6.7.0-py3-none-any.whl`
|
|
222
|
+
- `dist/ltcai-6.7.0.tar.gz`
|
|
223
|
+
- `ltcai-6.7.0.tgz`
|
|
224
|
+
- `dist/ltcai-6.7.0.vsix`
|
|
225
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_6.7.0_aarch64.dmg`
|
|
229
226
|
|
|
230
227
|
Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
231
228
|
|
|
@@ -244,6 +241,7 @@ Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
|
244
241
|
|
|
245
242
|
| Version | Theme |
|
|
246
243
|
| --- | --- |
|
|
244
|
+
| 6.7.0 | Brain IA Cleanup: reachable rich pages, separated product routes vs compatibility aliases, shared Brain shell navigation, and lazy-loaded rich pages |
|
|
247
245
|
| 6.6.0 | Brain Proof Runtime: backend-owned Brain proof API, model-continuity wiring, first-screen proof that saved context can be recalled across model changes, and direct Brain Home document upload |
|
|
248
246
|
| 6.5.0 | Brain Experience Readiness: Brain readiness signal, depth progress rail, source-aware memory-save feedback, and visual coverage for the first-memory loop |
|
|
249
247
|
| 6.4.0 | Digital Brain Quality Hardening: workspace-scoped graph/search/memory reads and mutations, Brain quality primitives, structured context guardrails, and retrieval benchmark coverage |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
The top entry is the current
|
|
4
|
-
historical and may describe behavior as it
|
|
3
|
+
The top entry is either the current unreleased main-branch work or the current
|
|
4
|
+
release line. Older entries are historical and may describe behavior as it
|
|
5
|
+
existed at that release.
|
|
6
|
+
|
|
7
|
+
## [6.7.0] - 2026-06-18
|
|
8
|
+
|
|
9
|
+
> Brain IA Cleanup. Makes rich product pages reachable from Brain Home,
|
|
10
|
+
> separates visible product IA from legacy compatibility aliases, and
|
|
11
|
+
> code-splits heavy pages out of the first Brain bundle.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- Brain Home now exposes direct action routes for adding documents, searching
|
|
15
|
+
the knowledge graph, changing models, and opening settings, so the rich
|
|
16
|
+
Capture, Brain explorer, Library, and System pages are reachable from the
|
|
17
|
+
first Brain flow.
|
|
18
|
+
- The post-onboarding app shell now mounts Capture, Brain explorer/graph,
|
|
19
|
+
Library, System, and Act pages inside a shared Brain shell navigation instead
|
|
20
|
+
of leaving those rich pages as compatibility-only routes.
|
|
21
|
+
- `routes.ts` now keeps product shell routes and compatibility aliases in
|
|
22
|
+
separate maps while preserving old hash/entry URLs.
|
|
23
|
+
- Rich pages now load through `React.lazy`, splitting Brain explorer, Capture,
|
|
24
|
+
Library, System, and Act chunks away from the initial Brain Home bundle.
|
|
25
|
+
- Package/runtime/static metadata is synchronized to 6.7.0; package publish and
|
|
26
|
+
deployment remain owner-run only.
|
|
5
27
|
|
|
6
28
|
## [6.6.0] - 2026-06-18
|
|
7
29
|
|
|
@@ -19,6 +41,7 @@ historical and may describe behavior as it existed at that release.
|
|
|
19
41
|
bring back after a useful exchange.
|
|
20
42
|
- Brain Home document upload CTA in the empty state and composer, giving the
|
|
21
43
|
first session a direct way to grow the Brain with files.
|
|
44
|
+
- Refreshed README-linked release evidence under `output/release/v6.6.0/`.
|
|
22
45
|
- Unit coverage for model-independent Brain proof recall behavior.
|
|
23
46
|
- Honest empty-state Brain proof: model-independent capability remains visible,
|
|
24
47
|
but continuity is only marked proven after durable evidence exists.
|
package/frontend/src/App.tsx
CHANGED
|
@@ -2,11 +2,16 @@ import * as React from "react";
|
|
|
2
2
|
import { type BrainState } from "@/components/LivingBrain";
|
|
3
3
|
import { ProductFlow, readProductFlowComplete } from "@/components/ProductFlow";
|
|
4
4
|
import { useAppStore } from "@/store/appStore";
|
|
5
|
-
import { parseHash } from "@/routes";
|
|
6
|
-
import { ActPage } from "@/pages/Act";
|
|
5
|
+
import { parseHash, productShellRoutes } from "@/routes";
|
|
7
6
|
import { BrainHome } from "@/features/brain/BrainHome";
|
|
8
7
|
import { AdminConsole } from "@/features/admin/AdminConsole";
|
|
9
8
|
|
|
9
|
+
const ActPage = React.lazy(() => import("@/pages/Act").then((module) => ({ default: module.ActPage })));
|
|
10
|
+
const BrainPage = React.lazy(() => import("@/pages/Brain").then((module) => ({ default: module.BrainPage })));
|
|
11
|
+
const CapturePage = React.lazy(() => import("@/pages/Capture").then((module) => ({ default: module.CapturePage })));
|
|
12
|
+
const LibraryPage = React.lazy(() => import("@/pages/Library").then((module) => ({ default: module.LibraryPage })));
|
|
13
|
+
const SystemPage = React.lazy(() => import("@/pages/System").then((module) => ({ default: module.SystemPage })));
|
|
14
|
+
|
|
10
15
|
export default function App() {
|
|
11
16
|
const theme = useAppStore((state) => state.theme);
|
|
12
17
|
const language = useAppStore((state) => state.language);
|
|
@@ -41,7 +46,41 @@ export default function App() {
|
|
|
41
46
|
{rawRoute.startsWith("/admin") ? (
|
|
42
47
|
<AdminConsole onBack={() => navigateHash("/brain")} />
|
|
43
48
|
) : parsed.primary === "act" ? (
|
|
44
|
-
<
|
|
49
|
+
<BrainShell active={parsed.primary}>
|
|
50
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
51
|
+
<ActPage initialTab={parsed.tab} />
|
|
52
|
+
</React.Suspense>
|
|
53
|
+
</BrainShell>
|
|
54
|
+
) : parsed.primary === "capture" ? (
|
|
55
|
+
<BrainShell active={parsed.primary}>
|
|
56
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
57
|
+
<CapturePage initialTab={parsed.tab} />
|
|
58
|
+
</React.Suspense>
|
|
59
|
+
</BrainShell>
|
|
60
|
+
) : parsed.primary === "library" ? (
|
|
61
|
+
<BrainShell active={parsed.primary}>
|
|
62
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
63
|
+
<LibraryPage initialTab={parsed.tab} />
|
|
64
|
+
</React.Suspense>
|
|
65
|
+
</BrainShell>
|
|
66
|
+
) : parsed.primary === "system" ? (
|
|
67
|
+
<BrainShell active={parsed.primary}>
|
|
68
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
69
|
+
<SystemPage initialTab={parsed.tab} />
|
|
70
|
+
</React.Suspense>
|
|
71
|
+
</BrainShell>
|
|
72
|
+
) : parsed.primary === "memory" ? (
|
|
73
|
+
<BrainShell active="memory">
|
|
74
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
75
|
+
<BrainPage initialTab="memory" />
|
|
76
|
+
</React.Suspense>
|
|
77
|
+
</BrainShell>
|
|
78
|
+
) : parsed.primary === "brain" && parsed.tab && parsed.tab !== "conversation" ? (
|
|
79
|
+
<BrainShell active="brain">
|
|
80
|
+
<React.Suspense fallback={<PageLoader />}>
|
|
81
|
+
<BrainPage initialTab={parsed.tab} />
|
|
82
|
+
</React.Suspense>
|
|
83
|
+
</BrainShell>
|
|
45
84
|
) : (
|
|
46
85
|
<BrainHome brainState={brainState} intensity={intensity} onBrainChange={setBrain} />
|
|
47
86
|
)}
|
|
@@ -49,6 +88,42 @@ export default function App() {
|
|
|
49
88
|
);
|
|
50
89
|
}
|
|
51
90
|
|
|
91
|
+
function BrainShell({
|
|
92
|
+
active,
|
|
93
|
+
children,
|
|
94
|
+
}: {
|
|
95
|
+
active: string;
|
|
96
|
+
children: React.ReactNode;
|
|
97
|
+
}) {
|
|
98
|
+
return (
|
|
99
|
+
<main className="brain-shell-page" aria-label="Lattice workspace">
|
|
100
|
+
<nav className="brain-shell-nav" aria-label="Brain workspace navigation">
|
|
101
|
+
{productShellRoutes.map((item) => (
|
|
102
|
+
<button
|
|
103
|
+
key={item.id}
|
|
104
|
+
type="button"
|
|
105
|
+
className={item.id === active ? "is-active" : ""}
|
|
106
|
+
onClick={() => navigateHash(`/${item.path}`)}
|
|
107
|
+
>
|
|
108
|
+
{item.label}
|
|
109
|
+
</button>
|
|
110
|
+
))}
|
|
111
|
+
</nav>
|
|
112
|
+
<section className="brain-shell-content">
|
|
113
|
+
{children}
|
|
114
|
+
</section>
|
|
115
|
+
</main>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function PageLoader() {
|
|
120
|
+
return (
|
|
121
|
+
<div className="brain-shell-loader" role="status">
|
|
122
|
+
Loading Brain workspace...
|
|
123
|
+
</div>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
52
127
|
function useHashRoute() {
|
|
53
128
|
const read = React.useCallback(() => {
|
|
54
129
|
const hash = window.location.hash.replace(/^#/, "");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { DatabaseZap, ShieldCheck } from "lucide-react";
|
|
2
|
+
import { Cpu, DatabaseZap, FileUp, Search, Settings, ShieldCheck } from "lucide-react";
|
|
3
3
|
import { LanguageSwitcher } from "@/components/LanguageSwitcher";
|
|
4
4
|
import { t, type Language } from "@/i18n";
|
|
5
5
|
import type { BrainDepth, BrainProof, BrainReadiness, KnowledgeConcept, MemoryFragment, Message } from "./types";
|
|
@@ -63,7 +63,25 @@ export function BrainConversation({
|
|
|
63
63
|
<span>{t(language, "brain.portable")}</span>
|
|
64
64
|
<span>{t(language, "brain.private")}</span>
|
|
65
65
|
</div>
|
|
66
|
-
<div
|
|
66
|
+
<div className="brain-flow-actions" aria-label={t(language, "brain.aria.actions")}>
|
|
67
|
+
<button type="button" onClick={() => navigateHash("/capture")}>
|
|
68
|
+
<FileUp className="h-3.5 w-3.5" />
|
|
69
|
+
{t(language, "brain.action.add")}
|
|
70
|
+
</button>
|
|
71
|
+
<button type="button" onClick={() => navigateHash("/knowledge-graph")}>
|
|
72
|
+
<Search className="h-3.5 w-3.5" />
|
|
73
|
+
{t(language, "brain.action.find")}
|
|
74
|
+
</button>
|
|
75
|
+
<button type="button" onClick={() => navigateHash("/models")}>
|
|
76
|
+
<Cpu className="h-3.5 w-3.5" />
|
|
77
|
+
{t(language, "brain.action.model")}
|
|
78
|
+
</button>
|
|
79
|
+
<button type="button" onClick={() => navigateHash("/settings")}>
|
|
80
|
+
<Settings className="h-3.5 w-3.5" />
|
|
81
|
+
{t(language, "brain.action.settings")}
|
|
82
|
+
</button>
|
|
83
|
+
</div>
|
|
84
|
+
<div className="brain-model-pill">{modelName}</div>
|
|
67
85
|
<button className="brain-admin-link" type="button" onClick={() => navigateHash("/admin")}>
|
|
68
86
|
<ShieldCheck className="h-3.5 w-3.5" />
|
|
69
87
|
{t(language, "brain.admin")}
|
package/frontend/src/i18n.ts
CHANGED
|
@@ -34,6 +34,7 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
34
34
|
"brain.depthRail.aria": "Brain 깊이 진행 상태",
|
|
35
35
|
"brain.aria.conversation": "대화",
|
|
36
36
|
"brain.aria.ownership": "Brain 소유 보장",
|
|
37
|
+
"brain.aria.actions": "Brain 주요 작업",
|
|
37
38
|
"brain.aria.starterPrompts": "시작 프롬프트",
|
|
38
39
|
"brain.aria.overview": "Brain 한눈에 보기",
|
|
39
40
|
"brain.aria.graph": "지식 그래프",
|
|
@@ -42,6 +43,10 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
42
43
|
"brain.portable": "이동 가능",
|
|
43
44
|
"brain.private": "개인 소유",
|
|
44
45
|
"brain.admin": "관리자 콘솔",
|
|
46
|
+
"brain.action.add": "넣기",
|
|
47
|
+
"brain.action.find": "찾기",
|
|
48
|
+
"brain.action.model": "모델",
|
|
49
|
+
"brain.action.settings": "설정",
|
|
45
50
|
"brain.empty.kicker": "내 오래가는 기억",
|
|
46
51
|
"brain.empty.title": "잊으면 안 되는 맥락부터 말해 주세요.",
|
|
47
52
|
"brain.empty.body": "문서, 대화, 프로젝트, 결정이 이 컴퓨터의 Brain에 쌓이고 나중에 주제와 관계로 다시 보입니다.",
|
|
@@ -388,6 +393,7 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
388
393
|
"brain.depthRail.aria": "Brain depth progress",
|
|
389
394
|
"brain.aria.conversation": "Conversation",
|
|
390
395
|
"brain.aria.ownership": "Brain ownership guarantees",
|
|
396
|
+
"brain.aria.actions": "Brain primary actions",
|
|
391
397
|
"brain.aria.starterPrompts": "Starter prompts",
|
|
392
398
|
"brain.aria.overview": "Brain overview",
|
|
393
399
|
"brain.aria.graph": "Knowledge Graph",
|
|
@@ -396,6 +402,10 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
396
402
|
"brain.portable": "Portable",
|
|
397
403
|
"brain.private": "Private",
|
|
398
404
|
"brain.admin": "Admin Console",
|
|
405
|
+
"brain.action.add": "Add",
|
|
406
|
+
"brain.action.find": "Find",
|
|
407
|
+
"brain.action.model": "Model",
|
|
408
|
+
"brain.action.settings": "Settings",
|
|
399
409
|
"brain.empty.kicker": "Durable memory",
|
|
400
410
|
"brain.empty.title": "Start with context that should not be forgotten.",
|
|
401
411
|
"brain.empty.body": "Documents, conversations, projects, and decisions accumulate in the Brain on this computer, then reappear as topics and relationships.",
|
package/frontend/src/routes.ts
CHANGED
|
@@ -9,19 +9,29 @@ import {
|
|
|
9
9
|
|
|
10
10
|
export type PrimaryRoute = "brain" | "memory" | "capture" | "act" | "library" | "system";
|
|
11
11
|
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
{ id: "
|
|
16
|
-
{ id: "
|
|
17
|
-
{ id: "
|
|
18
|
-
{ id: "
|
|
12
|
+
export type RouteTarget = { primary: PrimaryRoute; tab?: string };
|
|
13
|
+
|
|
14
|
+
export const productShellRoutes = [
|
|
15
|
+
{ id: "brain", path: "brain", label: "Lattice Brain", icon: Brain, description: "Talk with your living Brain" },
|
|
16
|
+
{ id: "capture", path: "capture", label: "Files", icon: FolderInput, description: "Bring in files, folders, and pages" },
|
|
17
|
+
{ id: "memory", path: "knowledge-graph", label: "Graph", icon: Database, description: "Search and inspect Brain knowledge" },
|
|
18
|
+
{ id: "library", path: "models", label: "Models", icon: Library, description: "Choose the local model powering your Brain" },
|
|
19
|
+
{ id: "system", path: "settings", label: "Settings", icon: Settings, description: "Keep your Brain safe and portable" },
|
|
20
|
+
{ id: "act", path: "review", label: "Act", icon: Workflow, description: "Turn goals into supervised runs" },
|
|
19
21
|
] as const;
|
|
20
22
|
|
|
21
|
-
export const
|
|
23
|
+
export const directProductRoutes: Record<string, RouteTarget> = {
|
|
24
|
+
brain: { primary: "brain", tab: "conversation" },
|
|
25
|
+
capture: { primary: "capture", tab: "files" },
|
|
26
|
+
"knowledge-graph": { primary: "brain", tab: "graph" },
|
|
27
|
+
models: { primary: "library", tab: "models" },
|
|
28
|
+
settings: { primary: "system", tab: "settings" },
|
|
29
|
+
review: { primary: "act", tab: "review" },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const compatibilityRouteAliases: Record<string, RouteTarget> = {
|
|
22
33
|
home: { primary: "brain", tab: "conversation" },
|
|
23
34
|
onboarding: { primary: "system", tab: "account" },
|
|
24
|
-
"knowledge-graph": { primary: "brain", tab: "graph" },
|
|
25
35
|
"hybrid-search": { primary: "brain", tab: "knowledge" },
|
|
26
36
|
memory: { primary: "memory", tab: "memory" },
|
|
27
37
|
ask: { primary: "brain", tab: "conversation" },
|
|
@@ -31,13 +41,11 @@ export const routeAliases: Record<string, { primary: PrimaryRoute; tab?: string
|
|
|
31
41
|
"my-computer": { primary: "capture", tab: "local" },
|
|
32
42
|
agents: { primary: "act", tab: "agents" },
|
|
33
43
|
runs: { primary: "act", tab: "runs" },
|
|
34
|
-
review: { primary: "act", tab: "review" },
|
|
35
44
|
"review-center": { primary: "act", tab: "review" },
|
|
36
45
|
workflows: { primary: "act", tab: "workflows" },
|
|
37
46
|
planning: { primary: "act", tab: "agents" },
|
|
38
47
|
hooks: { primary: "act", tab: "hooks" },
|
|
39
48
|
tools: { primary: "act", tab: "tools" },
|
|
40
|
-
models: { primary: "library", tab: "models" },
|
|
41
49
|
skills: { primary: "library", tab: "skills" },
|
|
42
50
|
mcp: { primary: "library", tab: "mcp" },
|
|
43
51
|
marketplace: { primary: "library", tab: "marketplace" },
|
|
@@ -55,21 +63,27 @@ export const routeAliases: Record<string, { primary: PrimaryRoute; tab?: string
|
|
|
55
63
|
"admin/private-vpc": { primary: "system", tab: "admin" },
|
|
56
64
|
};
|
|
57
65
|
|
|
66
|
+
export const primaryRoutes = productShellRoutes;
|
|
67
|
+
export const routeAliases = compatibilityRouteAliases;
|
|
68
|
+
|
|
58
69
|
export const commandRoutes = [
|
|
59
|
-
{ key: "brain", label: "Brain", icon: Brain },
|
|
60
|
-
{ key: "memory", label: "Memory", icon: Database },
|
|
70
|
+
{ key: "brain", label: "Lattice Brain", icon: Brain },
|
|
61
71
|
{ key: "files", label: "Files", icon: FolderInput },
|
|
62
|
-
{ key: "
|
|
72
|
+
{ key: "knowledge-graph", label: "Graph", icon: Database },
|
|
63
73
|
{ key: "models", label: "Models", icon: Library },
|
|
64
74
|
{ key: "settings", label: "Settings", icon: Settings },
|
|
75
|
+
{ key: "review", label: "Act", icon: Workflow },
|
|
65
76
|
];
|
|
66
77
|
|
|
67
78
|
export function parseHash() {
|
|
68
79
|
const raw = window.location.hash.replace(/^#\/?/, "").replace(/^\/+/, "");
|
|
69
80
|
const path = raw || "brain";
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
81
|
+
const normalized = path.split("?")[0];
|
|
82
|
+
const direct = directProductRoutes[normalized];
|
|
83
|
+
if (direct) return { ...direct, path };
|
|
84
|
+
const primary = productShellRoutes.find((route) => route.id === normalized);
|
|
85
|
+
if (primary) return { primary: primary.id as PrimaryRoute, tab: undefined, path };
|
|
86
|
+
const aliased = compatibilityRouteAliases[normalized];
|
|
73
87
|
return { primary: aliased?.primary || "brain", tab: aliased?.tab, path };
|
|
74
88
|
}
|
|
75
89
|
|
package/frontend/src/styles.css
CHANGED
|
@@ -964,6 +964,69 @@ body {
|
|
|
964
964
|
overflow: hidden;
|
|
965
965
|
}
|
|
966
966
|
|
|
967
|
+
.brain-shell-page {
|
|
968
|
+
position: relative;
|
|
969
|
+
z-index: 2;
|
|
970
|
+
height: 100vh;
|
|
971
|
+
overflow: auto;
|
|
972
|
+
padding: 0.9rem 1rem 2rem;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
.brain-shell-nav {
|
|
976
|
+
position: sticky;
|
|
977
|
+
top: 0.65rem;
|
|
978
|
+
z-index: 20;
|
|
979
|
+
display: flex;
|
|
980
|
+
flex-wrap: wrap;
|
|
981
|
+
justify-content: center;
|
|
982
|
+
gap: 0.45rem;
|
|
983
|
+
width: min(100%, 72rem);
|
|
984
|
+
margin: 0 auto 1rem;
|
|
985
|
+
border: 1px solid hsl(var(--border) / 0.66);
|
|
986
|
+
border-radius: 8px;
|
|
987
|
+
background: hsl(var(--surface-glass));
|
|
988
|
+
padding: 0.35rem;
|
|
989
|
+
backdrop-filter: blur(18px);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
.brain-shell-nav button {
|
|
993
|
+
min-height: 2.25rem;
|
|
994
|
+
border: 1px solid transparent;
|
|
995
|
+
border-radius: 6px;
|
|
996
|
+
background: transparent;
|
|
997
|
+
color: hsl(var(--fg-muted));
|
|
998
|
+
padding: 0 0.78rem;
|
|
999
|
+
font-size: 0.78rem;
|
|
1000
|
+
font-weight: 820;
|
|
1001
|
+
letter-spacing: 0;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.brain-shell-nav button:hover,
|
|
1005
|
+
.brain-shell-nav button:focus-visible,
|
|
1006
|
+
.brain-shell-nav button.is-active {
|
|
1007
|
+
border-color: hsl(var(--brain-core) / 0.58);
|
|
1008
|
+
background: hsl(var(--brain-core) / 0.1);
|
|
1009
|
+
color: hsl(var(--fg));
|
|
1010
|
+
outline: none;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
.brain-shell-content {
|
|
1014
|
+
width: min(100%, 72rem);
|
|
1015
|
+
margin: 0 auto;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
.brain-shell-loader {
|
|
1019
|
+
min-height: 18rem;
|
|
1020
|
+
display: grid;
|
|
1021
|
+
place-items: center;
|
|
1022
|
+
border: 1px solid hsl(var(--border) / 0.58);
|
|
1023
|
+
border-radius: 8px;
|
|
1024
|
+
background: hsl(var(--surface-glass));
|
|
1025
|
+
color: hsl(var(--fg-muted));
|
|
1026
|
+
font-size: 0.82rem;
|
|
1027
|
+
font-weight: 760;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
967
1030
|
/* Subtle living field behind everything */
|
|
968
1031
|
.brain-field {
|
|
969
1032
|
position: fixed;
|
|
@@ -1238,6 +1301,7 @@ body {
|
|
|
1238
1301
|
display: flex;
|
|
1239
1302
|
align-items: center;
|
|
1240
1303
|
justify-content: space-between;
|
|
1304
|
+
flex-wrap: wrap;
|
|
1241
1305
|
gap: 0.75rem;
|
|
1242
1306
|
padding-bottom: 0.65rem;
|
|
1243
1307
|
color: hsl(var(--fg-muted));
|
|
@@ -1265,6 +1329,16 @@ body {
|
|
|
1265
1329
|
white-space: nowrap;
|
|
1266
1330
|
}
|
|
1267
1331
|
|
|
1332
|
+
.brain-flow-actions {
|
|
1333
|
+
display: flex;
|
|
1334
|
+
flex: 0 1 auto;
|
|
1335
|
+
flex-wrap: wrap;
|
|
1336
|
+
justify-content: flex-end;
|
|
1337
|
+
gap: 0.35rem;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
.brain-flow-actions button,
|
|
1341
|
+
.brain-model-pill,
|
|
1268
1342
|
.brain-admin-link {
|
|
1269
1343
|
display: inline-flex;
|
|
1270
1344
|
min-height: 2rem;
|
|
@@ -1282,6 +1356,15 @@ body {
|
|
|
1282
1356
|
transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
|
|
1283
1357
|
}
|
|
1284
1358
|
|
|
1359
|
+
.brain-model-pill {
|
|
1360
|
+
max-width: 13rem;
|
|
1361
|
+
overflow: hidden;
|
|
1362
|
+
text-overflow: ellipsis;
|
|
1363
|
+
white-space: nowrap;
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
.brain-flow-actions button:hover,
|
|
1367
|
+
.brain-flow-actions button:focus-visible,
|
|
1285
1368
|
.brain-admin-link:hover,
|
|
1286
1369
|
.brain-admin-link:focus-visible {
|
|
1287
1370
|
border-color: hsl(var(--brain-core) / 0.72);
|
|
@@ -19,7 +19,7 @@ from datetime import datetime
|
|
|
19
19
|
from typing import Any, Callable, Dict, List, Optional
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
MULTI_AGENT_VERSION = "6.
|
|
22
|
+
MULTI_AGENT_VERSION = "6.7.0"
|
|
23
23
|
|
|
24
24
|
AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
|
|
25
25
|
CORE_PIPELINE = ("planner", "executor", "reviewer")
|
package/latticeai/__init__.py
CHANGED
|
@@ -19,7 +19,7 @@ from pathlib import Path
|
|
|
19
19
|
from typing import Any, Callable, Dict, Iterable, List, Optional
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
WORKSPACE_OS_VERSION = "6.
|
|
22
|
+
WORKSPACE_OS_VERSION = "6.7.0"
|
|
23
23
|
|
|
24
24
|
# Workspace types separate single-user Personal workspaces from shared
|
|
25
25
|
# Organization workspaces. Both keep the same local-first JSON store; the type
|
package/package.json
CHANGED
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED