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.
Files changed (38) hide show
  1. package/README.md +34 -36
  2. package/docs/CHANGELOG.md +25 -2
  3. package/frontend/src/App.tsx +78 -3
  4. package/frontend/src/features/brain/BrainConversation.tsx +20 -2
  5. package/frontend/src/i18n.ts +10 -0
  6. package/frontend/src/routes.ts +31 -17
  7. package/frontend/src/styles.css +83 -0
  8. package/lattice_brain/__init__.py +1 -1
  9. package/lattice_brain/runtime/multi_agent.py +1 -1
  10. package/latticeai/__init__.py +1 -1
  11. package/latticeai/core/marketplace.py +1 -1
  12. package/latticeai/core/workspace_os.py +1 -1
  13. package/package.json +1 -1
  14. package/src-tauri/Cargo.lock +1 -1
  15. package/src-tauri/Cargo.toml +1 -1
  16. package/src-tauri/tauri.conf.json +1 -1
  17. package/static/app/asset-manifest.json +84 -6
  18. package/static/app/assets/Act-DGN37eR4.js +2 -0
  19. package/static/app/assets/Act-DGN37eR4.js.map +1 -0
  20. package/static/app/assets/Brain-HDcIwPHW.js +322 -0
  21. package/static/app/assets/Brain-HDcIwPHW.js.map +1 -0
  22. package/static/app/assets/Capture--eZfb_Ex.js +2 -0
  23. package/static/app/assets/Capture--eZfb_Ex.js.map +1 -0
  24. package/static/app/assets/Library-BbagRFyd.js +2 -0
  25. package/static/app/assets/Library-BbagRFyd.js.map +1 -0
  26. package/static/app/assets/System-C6pd3Mp_.js +2 -0
  27. package/static/app/assets/System-C6pd3Mp_.js.map +1 -0
  28. package/static/app/assets/index-C950aES_.js +17 -0
  29. package/static/app/assets/index-C950aES_.js.map +1 -0
  30. package/static/app/assets/index-ztppMg0c.css +2 -0
  31. package/static/app/assets/primitives-Bcm5lZRu.js +2 -0
  32. package/static/app/assets/primitives-Bcm5lZRu.js.map +1 -0
  33. package/static/app/assets/textarea-C2PLu6_O.js +2 -0
  34. package/static/app/assets/textarea-C2PLu6_O.js.map +1 -0
  35. package/static/app/index.html +2 -2
  36. package/static/app/assets/index-C8toxDpv.css +0 -2
  37. package/static/app/assets/index-CbvcAQ6B.js +0 -16
  38. 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
- ![Login](output/release/v6.5.0/screenshots/01-login.png)
72
+ ![Login](output/release/v6.7.0/screenshots/01-login.png)
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
- ![Environment Analysis](output/release/v6.5.0/screenshots/02-environment-analysis.png)
79
+ ![Environment Analysis](output/release/v6.7.0/screenshots/02-environment-analysis.png)
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
- ![Recommended Models](output/release/v6.5.0/screenshots/03-recommended-models.png)
86
+ ![Recommended Models](output/release/v6.7.0/screenshots/03-recommended-models.png)
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
- ![Install and Load](output/release/v6.5.0/screenshots/04-install-load-progress.png)
93
+ ![Install and Load](output/release/v6.7.0/screenshots/04-install-load-progress.png)
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
- ![Brain Chat Home](output/release/v6.5.0/screenshots/05-brain-chat-home.png)
100
+ ![Brain Chat Home](output/release/v6.7.0/screenshots/05-brain-chat-home.png)
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
- ![Review Center](output/release/v6.5.0/screenshots/13-review-center.png)
107
+ ![Review Center](output/release/v6.7.0/screenshots/13-review-center.png)
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
- ![v6.5.0 Living Brain walkthrough](output/release/v6.5.0/gifs/v6.5.0-living-brain-walkthrough.gif)
123
+ ![v6.7.0 Living Brain walkthrough](output/release/v6.7.0/gifs/v6.7.0-living-brain-walkthrough.gif)
124
124
 
125
125
  Screenshot index and capture notes:
126
- [output/release/v6.5.0/SCREENSHOT_INDEX.md](output/release/v6.5.0/SCREENSHOT_INDEX.md)
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 Preparation
202
-
203
- The current development target is **6.6.0 Brain Proof Runtime**:
204
-
205
- - Brain Home now shows backend-owned proof that the Brain is a durable context
206
- store: saved context count, active-model continuity, graph/vector depth, and
207
- the most recent recallable item.
208
- - Brain Home now gives first-time users a direct document upload CTA in the
209
- empty state and composer, backed by workspace-scoped document ingestion.
210
- - `/api/memory/brain-proof` combines Memory Manager readiness, unified recall,
211
- graph/vector state, and the active model id so the first screen can say
212
- "model changed, context stayed" without guessing in the frontend.
213
- - App-factory interaction wiring now passes active-model state into the Memory
214
- router through typed runtime context, keeping Brain proof assembly out of the
215
- monolithic factory body.
216
- - The release keeps the 6.4.0/6.5.0 Brain readiness and quality hardening intact
217
- while making the first-five-minute value proposition visible.
218
- - The release remains local-first: no automatic web/email/calendar ingestion,
219
- no package publishing, no production deployment, and no external reranker or
220
- embedding API use without explicit opt-in.
221
-
222
- Expected artifacts for 6.6.0 release must use exact filenames:
223
-
224
- - `dist/ltcai-6.6.0-py3-none-any.whl`
225
- - `dist/ltcai-6.6.0.tar.gz`
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 release-preparation target. Older entries are
4
- historical and may describe behavior as it existed at that release.
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.
@@ -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
- <ActPage initialTab={parsed.tab} />
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>{modelName}</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")}
@@ -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.",
@@ -9,19 +9,29 @@ import {
9
9
 
10
10
  export type PrimaryRoute = "brain" | "memory" | "capture" | "act" | "library" | "system";
11
11
 
12
- export const primaryRoutes = [
13
- { id: "brain", label: "Brain", icon: Brain, description: "Talk with your living Brain" },
14
- { id: "memory", label: "Memory", icon: Database, description: "Recall what your Brain remembers" },
15
- { id: "capture", label: "Files", icon: FolderInput, description: "Bring in files, folders, and pages" },
16
- { id: "act", label: "Automations", icon: Workflow, description: "Turn goals into supervised runs" },
17
- { id: "library", label: "Models", icon: Library, description: "Choose the local model powering your Brain" },
18
- { id: "system", label: "Settings", icon: Settings, description: "Keep your Brain safe and portable" },
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 routeAliases: Record<string, { primary: PrimaryRoute; tab?: string }> = {
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: "workflows", label: "Automations", icon: Workflow },
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 direct = primaryRoutes.find((route) => route.id === path);
71
- if (direct) return { primary: direct.id as PrimaryRoute, tab: undefined, path };
72
- const aliased = routeAliases[path] || routeAliases[path.split("?")[0]];
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
 
@@ -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);
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "6.6.0"
29
+ __version__ = "6.7.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -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.6.0"
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")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "6.6.0"
3
+ __version__ = "6.7.0"
@@ -11,7 +11,7 @@ from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
13
 
14
- MARKETPLACE_VERSION = "6.6.0"
14
+ MARKETPLACE_VERSION = "6.7.0"
15
15
  TEMPLATE_KINDS = ("plugin", "workflow", "agent")
16
16
 
17
17
 
@@ -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.6.0"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "6.6.0",
3
+ "version": "6.7.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -1654,7 +1654,7 @@ dependencies = [
1654
1654
 
1655
1655
  [[package]]
1656
1656
  name = "lattice-ai-desktop"
1657
- version = "6.6.0"
1657
+ version = "6.7.0"
1658
1658
  dependencies = [
1659
1659
  "plist",
1660
1660
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "6.6.0"
3
+ version = "6.7.0"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "6.6.0",
4
+ "version": "6.7.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",