ltcai 7.5.0 → 7.6.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 (43) hide show
  1. package/README.md +49 -42
  2. package/docs/CHANGELOG.md +26 -0
  3. package/frontend/src/components/ProductFlow.tsx +36 -1
  4. package/frontend/src/components/onboarding/recommendationModel.ts +1 -1
  5. package/frontend/src/features/brain/BrainHome.tsx +29 -0
  6. package/frontend/src/i18n.ts +31 -1
  7. package/frontend/src/styles.css +156 -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/local_embeddings.py +4 -3
  12. package/latticeai/core/marketplace.py +1 -1
  13. package/latticeai/core/sessions.py +8 -2
  14. package/latticeai/core/workspace_os.py +1 -1
  15. package/latticeai/models/router.py +19 -0
  16. package/latticeai/services/architecture_readiness.py +101 -0
  17. package/latticeai/services/model_runtime.py +8 -3
  18. package/package.json +1 -1
  19. package/scripts/pts-claudecode-discord-bridge.mjs +20 -3
  20. package/src-tauri/Cargo.lock +1 -1
  21. package/src-tauri/Cargo.toml +1 -1
  22. package/src-tauri/tauri.conf.json +1 -1
  23. package/static/app/asset-manifest.json +28 -28
  24. package/static/app/assets/{Act-Di4tRFWY.js → Act-CSeeIWB4.js} +2 -2
  25. package/static/app/assets/{Act-Di4tRFWY.js.map → Act-CSeeIWB4.js.map} +1 -1
  26. package/static/app/assets/{Brain-BZB3Gy9w.js → Brain-D_Ne4YoR.js} +2 -2
  27. package/static/app/assets/{Brain-BZB3Gy9w.js.map → Brain-D_Ne4YoR.js.map} +1 -1
  28. package/static/app/assets/{Capture-tNyYWxnh.js → Capture-YFRAO4bJ.js} +2 -2
  29. package/static/app/assets/{Capture-tNyYWxnh.js.map → Capture-YFRAO4bJ.js.map} +1 -1
  30. package/static/app/assets/{Library-DAtDDLdg.js → Library-C4zmA8O2.js} +2 -2
  31. package/static/app/assets/{Library-DAtDDLdg.js.map → Library-C4zmA8O2.js.map} +1 -1
  32. package/static/app/assets/{System-DEu0xNUc.js → System-Da-Kxwiz.js} +2 -2
  33. package/static/app/assets/{System-DEu0xNUc.js.map → System-Da-Kxwiz.js.map} +1 -1
  34. package/static/app/assets/{index-Bi_bpigM.css → index-BwmCpRoW.css} +1 -1
  35. package/static/app/assets/index-D1hsexMt.js +17 -0
  36. package/static/app/assets/index-D1hsexMt.js.map +1 -0
  37. package/static/app/assets/{primitives-CdwcE--L.js → primitives-CSsF_Ymb.js} +2 -2
  38. package/static/app/assets/{primitives-CdwcE--L.js.map → primitives-CSsF_Ymb.js.map} +1 -1
  39. package/static/app/assets/{textarea-CqOdBPL1.js → textarea-CJMFSyfQ.js} +2 -2
  40. package/static/app/assets/{textarea-CqOdBPL1.js.map → textarea-CJMFSyfQ.js.map} +1 -1
  41. package/static/app/index.html +2 -2
  42. package/static/app/assets/index-COuGp7_5.js +0 -17
  43. package/static/app/assets/index-COuGp7_5.js.map +0 -1
package/README.md CHANGED
@@ -54,57 +54,63 @@ You need Lattice AI when:
54
54
 
55
55
  ## One-Minute Flow
56
56
 
57
- 1. Launch the app.
57
+ 1. Launch the app and wake the Brain.
58
58
  2. Create or open a local profile.
59
59
  3. Let Lattice explain what this computer can run.
60
- 4. Start with the recommended model, or skip and choose later.
60
+ 4. Start with the recommended model as the Brain's voice, or skip and choose later.
61
61
  5. Talk to your Brain.
62
- 6. Watch memories, topics, relationships, and graph structure emerge from real use.
62
+ 6. Use the memory rings to move from current context to the full knowledge graph.
63
63
  7. Back up, inspect, export, or restore the Brain when you need ownership actions.
64
64
 
65
65
  ## Living Brain Flow
66
66
 
67
- ### 1. Login
67
+ ### 1. Wake Brain
68
+
69
+ The first screen makes the Brain the product. It explains the three-step path:
70
+ confirm owner, check the computer, choose the Brain voice.
71
+
72
+ ### 2. Login
68
73
 
69
74
  Choose the owner of the Brain. The profile is not a SaaS account by default; it
70
75
  is the local identity for the knowledge you keep.
71
76
 
72
- ![Login](output/release/v7.5.0/screenshots/01-login.png)
77
+ ![Login](output/release/v7.6.0/screenshots/01-login.png)
73
78
 
74
- ### 2. Environment Analysis
79
+ ### 3. Environment Analysis
75
80
 
76
81
  See what kind of local AI experience this computer can support before choosing a
77
82
  model.
78
83
 
79
- ![Environment Analysis](output/release/v7.5.0/screenshots/02-environment-analysis.png)
84
+ ![Environment Analysis](output/release/v7.6.0/screenshots/02-environment-analysis.png)
80
85
 
81
- ### 3. Recommended Models
86
+ ### 4. Recommended Models
82
87
 
83
88
  Start with a short list: safest recommendation, faster model, stronger model.
84
89
  Advanced details stay available without overwhelming first-time users.
85
90
 
86
- ![Recommended Models](output/release/v7.5.0/screenshots/03-recommended-models.png)
91
+ ![Recommended Models](output/release/v7.6.0/screenshots/03-recommended-models.png)
87
92
 
88
- ### 4. Install And Load
93
+ ### 5. Install And Load
89
94
 
90
95
  Download and load only after consent. Lattice explains model size, local
91
96
  execution, and network use before work starts.
92
97
 
93
- ![Install and Load](output/release/v7.5.0/screenshots/04-install-load-progress.png)
98
+ ![Install and Load](output/release/v7.6.0/screenshots/04-install-load-progress.png)
94
99
 
95
- ### 5. Brain Chat
100
+ ### 6. Brain Chat
96
101
 
97
102
  Talk normally. Useful decisions and context become memory, then appear later as
98
- topics, relationships, and graph structure.
103
+ topics, relationships, graph structure, and the concentric memory rings around
104
+ the Brain.
99
105
 
100
- ![Brain Chat Home](output/release/v7.5.0/screenshots/05-brain-chat-home.png)
106
+ ![Brain Chat Home](output/release/v7.6.0/screenshots/05-brain-chat-home.png)
101
107
 
102
- ### 6. Review Center
108
+ ### 7. Review Center
103
109
 
104
110
  Automation results are staged for review before they become durable decisions.
105
111
  Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
106
112
 
107
- ![Review Center](output/release/v7.5.0/screenshots/13-review-center.png)
113
+ ![Review Center](output/release/v7.6.0/screenshots/13-review-center.png)
108
114
 
109
115
  ## Brain Depths
110
116
 
@@ -120,10 +126,10 @@ The user travels inward from everyday memory to deeper structure:
120
126
 
121
127
  Walkthrough:
122
128
 
123
- ![v7.5.0 Living Brain walkthrough](output/release/v7.5.0/gifs/v7.5.0-living-brain-walkthrough.gif)
129
+ ![v7.6.0 Living Brain walkthrough](output/release/v7.6.0/gifs/v7.6.0-living-brain-walkthrough.gif)
124
130
 
125
131
  Screenshot index and capture notes:
126
- [output/release/v7.5.0/SCREENSHOT_INDEX.md](output/release/v7.5.0/SCREENSHOT_INDEX.md)
132
+ [output/release/v7.6.0/SCREENSHOT_INDEX.md](output/release/v7.6.0/SCREENSHOT_INDEX.md)
127
133
 
128
134
  ## Install
129
135
 
@@ -200,34 +206,34 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
200
206
 
201
207
  ## Current Release
202
208
 
203
- The current release is **7.5.0 Runtime Debt Burn-down & Release Risk Cleanup**:
204
-
205
- - Agent runs, workflow runs, audit events, and realtime events now carry the
206
- `agent-run-contract/v1` family envelope, so replay, admin review, and live
207
- feeds can inspect run identity, runtime, status, timeline, and artifacts
208
- through one contract shape.
209
- - AgentRuntime and realtime API responses now expose compact `contracts` views
210
- so downstream consumers can read the common envelope instead of re-parsing
211
- surface-specific records.
212
- - Brain quality evaluation now runs a real KnowledgeGraphStore + SearchService
213
- corpus fixture with 250+ records, judged queries, recall, precision, NDCG,
214
- and must-include hit-rate thresholds.
215
- - Release risk cleanup removes stale-artifact upload ambiguity, clears npm audit
216
- findings, and updates the Tauri 2 stack so the old `block v0.1.6`
217
- future-incompatibility warning is gone.
218
-
219
- Expected artifacts for 7.5.0 release must use exact filenames:
220
-
221
- - `dist/ltcai-7.5.0-py3-none-any.whl`
222
- - `dist/ltcai-7.5.0.tar.gz`
223
- - `ltcai-7.5.0.tgz`
224
- - `dist/ltcai-7.5.0.vsix`
225
- - `src-tauri/target/release/bundle/dmg/Lattice AI_7.5.0_aarch64.dmg`
209
+ The current release is **7.6.0 Brain-Centered UX & Architecture Closure**:
210
+
211
+ - First-run onboarding now starts with a dedicated Wake Brain surface before
212
+ owner/profile setup, so the first impression is the local Brain rather than a
213
+ generic account or model wizard.
214
+ - Brain Home now includes concentric memory rings around the Living Brain plus
215
+ direct depth controls, letting users move from Now to Memory, Topics,
216
+ Relationships, and the full graph.
217
+ - Architecture review closure is machine-checkable through the 7.6 readiness
218
+ contract covering AgentRuntime, ToolRegistry, central Config, server
219
+ decomposition, Knowledge Graph hardening, and Brain UX.
220
+ - The two local review files (`review.md` and
221
+ `ux-brain-simplification-review.md`) are incorporated into this release line:
222
+ architecture gaps are covered by explicit boundaries/tests, and UX gaps are
223
+ closed by the Brain-first wake flow plus ring-based progressive disclosure.
224
+
225
+ Expected artifacts for 7.6.0 release must use exact filenames:
226
+
227
+ - `dist/ltcai-7.6.0-py3-none-any.whl`
228
+ - `dist/ltcai-7.6.0.tar.gz`
229
+ - `ltcai-7.6.0.tgz`
230
+ - `dist/ltcai-7.6.0.vsix`
231
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_7.6.0_aarch64.dmg`
226
232
 
227
233
  Do not upload `dist/*`. Package registry publishing remains owner-run.
228
234
 
229
235
  See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
230
- strategic roadmap slices applied through 7.5.0 and the follow-up tracks.
236
+ strategic roadmap slices applied through 7.6.0 and the follow-up tracks.
231
237
 
232
238
  ## Known Limitations
233
239
 
@@ -244,6 +250,7 @@ strategic roadmap slices applied through 7.5.0 and the follow-up tracks.
244
250
 
245
251
  | Version | Theme |
246
252
  | --- | --- |
253
+ | 7.6.0 | Brain-Centered UX & Architecture Closure: Wake Brain first-run surface, concentric memory rings with direct depth controls, and machine-checkable closure of the two architecture/UX review files |
247
254
  | 7.5.0 | Runtime Debt Burn-down & Release Risk Cleanup: API consumers get normalized contract views, retrieval quality uses a 250+ record corpus fixture, stale artifact risk is removed, npm audit is clean, and Tauri is updated past the old block warning |
248
255
  | 7.4.0 | Runtime Contract Convergence & Corpus Retrieval: agent/workflow/audit/realtime records share the agent-run-contract/v1 family, and retrieval quality gates run against a real corpus-scale fixture |
249
256
  | 7.3.0 | Runtime Contract & Retrieval Quality: shared agent-run contract across runtimes plus deterministic hybrid recall/ranking regression gates |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,29 @@ The top entry is either the current unreleased main-branch work or the current
4
4
  release line. Older entries are historical and may describe behavior as it
5
5
  existed at that release.
6
6
 
7
+ ## [7.6.0] - 2026-06-22
8
+
9
+ > Brain-Centered UX & Architecture Closure. Incorporates the two local review
10
+ > files into the release line with a Wake Brain first-run surface, memory rings
11
+ > plus direct depth controls, and machine-checkable architecture readiness gates.
12
+
13
+ ### Added
14
+ - Wake Brain first-run entry before owner/profile setup, reducing onboarding to
15
+ the product promise first and the setup mechanics second.
16
+ - Concentric memory rings around Brain Home plus direct controls for Now, Memory,
17
+ Topics, Relationships, and Full Graph navigation.
18
+ - `latticeai.services.architecture_readiness.architecture_readiness()` and
19
+ `tests/unit/test_v76_review_completion.py` to keep AgentRuntime, ToolRegistry,
20
+ Config, server decomposition, KG hardening, and Brain UX review closure under
21
+ test.
22
+
23
+ ### Changed
24
+ - Package/runtime/static metadata is synchronized to 7.6.0; package publish and
25
+ deployment remain owner-run only.
26
+ - README and release docs now describe 7.6.0 as the current release and point to
27
+ refreshed 7.6.0 screenshots, walkthrough GIF, and release evidence index under
28
+ `output/release/v7.6.0/`.
29
+
7
30
  ## [7.5.0] - 2026-06-20
8
31
 
9
32
  > Runtime Debt Burn-down & Release Risk Cleanup. Turns the 7.4.0 contract
@@ -27,6 +50,9 @@ existed at that release.
27
50
  - npm dependency overrides move `js-yaml` to a non-vulnerable version; `npm
28
51
  audit` reports 0 vulnerabilities.
29
52
  - CI lint compatibility is restored for the Brain quality gate script.
53
+ - Local MLX model preparation now recognizes valid existing Hugging Face cache
54
+ snapshots, avoiding an unnecessary re-download when the model already exists
55
+ outside Lattice's managed `~/.ltcai/hf-models` directory.
30
56
  - Package/runtime/static metadata is synchronized to 7.5.0; package publish and
31
57
  deployment remain owner-run only.
32
58
 
@@ -27,7 +27,7 @@ export function readProductFlowComplete() {
27
27
 
28
28
  export function ProductFlow({ onComplete }: { onComplete: () => void }) {
29
29
  const language = useAppStore((state) => state.language);
30
- const [step, setStep] = React.useState<FlowStep>("login");
30
+ const [step, setStep] = React.useState<FlowStep>("wake");
31
31
  const [analysis, setAnalysis] = React.useState<FlowAnalysis | null>(null);
32
32
  const [analysisError, setAnalysisError] = React.useState<string | null>(null);
33
33
  const [selected, setSelected] = React.useState<RecommendedModel | null>(null);
@@ -68,6 +68,8 @@ export function ProductFlow({ onComplete }: { onComplete: () => void }) {
68
68
  <LivingBrain state={brainStateForStep(step)} intensity={step === "install" ? 0.92 : 0.7} size="large" showLabel={false} />
69
69
  </div>
70
70
 
71
+ {step === "wake" && <WakeBrainScreen onWake={() => setStep("login")} onUseExisting={() => completeFlow(onComplete)} />}
72
+
71
73
  {step === "login" && <LoginScreen onSuccess={() => setStep("analysis")} />}
72
74
 
73
75
  {step === "analysis" && (
@@ -99,12 +101,45 @@ export function ProductFlow({ onComplete }: { onComplete: () => void }) {
99
101
  );
100
102
  }
101
103
 
104
+ function WakeBrainScreen({ onWake, onUseExisting }: { onWake: () => void; onUseExisting: () => void }) {
105
+ const language = useAppStore((state) => state.language);
106
+ return (
107
+ <section className="ritual-wake" aria-label={t(language, "flow.wake.aria")}>
108
+ <div className="ritual-title">{t(language, "flow.wake.title")}</div>
109
+ <div className="ritual-subtitle">{t(language, "flow.wake.body")}</div>
110
+ <div className="ritual-wake-plan" aria-label={t(language, "flow.wake.plan.aria")}>
111
+ <div>
112
+ <span>1</span>
113
+ <strong>{t(language, "flow.wake.step.identity")}</strong>
114
+ </div>
115
+ <div>
116
+ <span>2</span>
117
+ <strong>{t(language, "flow.wake.step.check")}</strong>
118
+ </div>
119
+ <div>
120
+ <span>3</span>
121
+ <strong>{t(language, "flow.wake.step.voice")}</strong>
122
+ </div>
123
+ </div>
124
+ <div className="ritual-button-row">
125
+ <button type="button" className="ritual-full-button" onClick={onWake}>
126
+ {t(language, "flow.wake.primary")}
127
+ </button>
128
+ <button type="button" className="ritual-secondary-button" onClick={onUseExisting}>
129
+ {t(language, "flow.wake.existing")}
130
+ </button>
131
+ </div>
132
+ </section>
133
+ );
134
+ }
135
+
102
136
  function completeFlow(onComplete: () => void) {
103
137
  try { localStorage.setItem(FLOW_COMPLETE_KEY, "true"); } catch {}
104
138
  onComplete();
105
139
  }
106
140
 
107
141
  function brainStateForStep(step: FlowStep): BrainState {
142
+ if (step === "wake") return "idle";
108
143
  if (step === "analysis") return "listening";
109
144
  if (step === "recommend") return "recalling";
110
145
  if (step === "install") return "thinking";
@@ -1,6 +1,6 @@
1
1
  import { asArray } from "@/lib/utils";
2
2
 
3
- export type FlowStep = "login" | "analysis" | "recommend" | "install";
3
+ export type FlowStep = "wake" | "login" | "analysis" | "recommend" | "install";
4
4
  export type ApiData = Record<string, unknown>;
5
5
 
6
6
  export type FlowAnalysis = {
@@ -494,6 +494,8 @@ export function BrainHome({
494
494
  onInteract={deepen}
495
495
  />
496
496
 
497
+ <BrainDepthRings explorationDepth={explorationDepth} onOpenDepth={jumpToDepth} />
498
+
497
499
  <div className="brain-depth-badge" aria-live="polite">
498
500
  <span>{t(language, "brain.level")} {explorationDepth}</span>
499
501
  <strong>{t(language, `brain.depth.${explorationDepth}`)}</strong>
@@ -576,6 +578,33 @@ export function BrainHome({
576
578
  );
577
579
  }
578
580
 
581
+ function BrainDepthRings({
582
+ explorationDepth,
583
+ onOpenDepth,
584
+ }: {
585
+ explorationDepth: BrainDepth;
586
+ onOpenDepth: (depth: BrainDepth) => void;
587
+ }) {
588
+ const language = useAppStore((state) => state.language);
589
+ return (
590
+ <div className="brain-memory-rings" aria-label={t(language, "brain.rings.aria")}>
591
+ {DEPTHS.map((depth, index) => (
592
+ <button
593
+ key={depth.level}
594
+ type="button"
595
+ className={`brain-memory-ring ring-${depth.level} ${depth.level <= explorationDepth ? "is-revealed" : ""}`}
596
+ aria-current={depth.level === explorationDepth ? "step" : undefined}
597
+ onClick={() => onOpenDepth(depth.level)}
598
+ style={{ "--ring-delay": `${index * 70}ms` } as React.CSSProperties}
599
+ >
600
+ <span>{depth.level}</span>
601
+ <strong>{t(language, `brain.rings.${depth.level}`)}</strong>
602
+ </button>
603
+ ))}
604
+ </div>
605
+ );
606
+ }
607
+
579
608
  function toMessageProof(proof: BrainProof, query: string, fallbackModelName: string): MessageProof {
580
609
  return {
581
610
  query,
@@ -32,7 +32,7 @@ export const COPY: Record<Language, TextMap> = {
32
32
  "brain.aria.exploration": "Brain 탐색",
33
33
  "brain.aria.quickViews": "Brain 빠른 보기",
34
34
  "brain.depthRail.aria": "Brain 깊이 진행 상태",
35
- "brain.aria.conversation": "대화",
35
+ "brain.aria.conversation": "Brain과의 대화",
36
36
  "brain.aria.ownership": "Brain 소유 보장",
37
37
  "brain.aria.actions": "Brain 주요 작업",
38
38
  "brain.aria.starterPrompts": "시작 프롬프트",
@@ -232,6 +232,12 @@ export const COPY: Record<Language, TextMap> = {
232
232
  "brain.graph.focus.smooth": "선택한 노드로 부드럽게 포커스 이동하고 이웃을 강조합니다.",
233
233
  "brain.graph.focus.recent": "최근 추가됨",
234
234
  "brain.graph.focus.clear": "포커스 해제",
235
+ "brain.rings.aria": "Brain 기억 깊이 링",
236
+ "brain.rings.1": "지금",
237
+ "brain.rings.2": "기억",
238
+ "brain.rings.3": "주제",
239
+ "brain.rings.4": "관계",
240
+ "brain.rings.5": "그래프",
235
241
  "care.title": "내 Brain 돌보기",
236
242
  "care.subtitle": "내 컴퓨터에 두고, 필요하면 옮길 수 있습니다.",
237
243
  "care.private": "개인 보관",
@@ -463,6 +469,15 @@ export const COPY: Record<Language, TextMap> = {
463
469
  "flow.install.timelineQuick": "잠깐",
464
470
  "flow.install.expectedCompletion": "끝나면 바로 Brain이 열립니다.",
465
471
  "flow.shell": "내 로컬 AI 브레인 만들기",
472
+ "flow.wake.aria": "Brain 깨우기",
473
+ "flow.wake.title": "내 Brain을 깨웁니다.",
474
+ "flow.wake.body": "이 Brain은 이 컴퓨터에 살고, 모델은 목소리처럼 바꿔도 내 기억과 지식 그래프는 계속 남습니다.",
475
+ "flow.wake.plan.aria": "Brain 시작 단계",
476
+ "flow.wake.step.identity": "주인 확인",
477
+ "flow.wake.step.check": "컴퓨터 확인",
478
+ "flow.wake.step.voice": "목소리 선택",
479
+ "flow.wake.primary": "Brain 깨우기",
480
+ "flow.wake.existing": "이미 있는 Brain 열기",
466
481
  "flow.login.title": "내 AI 브레인의 주인을 정합니다.",
467
482
  "flow.login.body": "Lattice AI는 내 지식과 맥락을 이 컴퓨터에 보관하는 로컬 우선 AI 브레인입니다. 모델은 바꿀 수 있고, 외부 전송은 사용자가 선택할 때만 시작됩니다.",
468
483
  "flow.name": "이름",
@@ -790,6 +805,12 @@ export const COPY: Record<Language, TextMap> = {
790
805
  "brain.graph.focus.smooth": "Smoothly focuses the selected node and highlights its neighbors.",
791
806
  "brain.graph.focus.recent": "Recently added",
792
807
  "brain.graph.focus.clear": "Clear focus",
808
+ "brain.rings.aria": "Brain memory depth rings",
809
+ "brain.rings.1": "Now",
810
+ "brain.rings.2": "Memory",
811
+ "brain.rings.3": "Topics",
812
+ "brain.rings.4": "Relations",
813
+ "brain.rings.5": "Graph",
793
814
  "care.title": "Care for my Brain",
794
815
  "care.subtitle": "Own it locally. Keep it portable.",
795
816
  "care.private": "Private",
@@ -1021,6 +1042,15 @@ export const COPY: Record<Language, TextMap> = {
1021
1042
  "flow.install.timelineQuick": "moment",
1022
1043
  "flow.install.expectedCompletion": "When it finishes, your Brain opens right away.",
1023
1044
  "flow.shell": "Create your local AI Brain",
1045
+ "flow.wake.aria": "Wake your Brain",
1046
+ "flow.wake.title": "Wake your Brain.",
1047
+ "flow.wake.body": "This Brain lives on this computer. You can change the model like a voice while your memories and knowledge graph remain yours.",
1048
+ "flow.wake.plan.aria": "Brain start steps",
1049
+ "flow.wake.step.identity": "Confirm owner",
1050
+ "flow.wake.step.check": "Check computer",
1051
+ "flow.wake.step.voice": "Choose voice",
1052
+ "flow.wake.primary": "Wake Brain",
1053
+ "flow.wake.existing": "Open existing Brain",
1024
1054
  "flow.login.title": "Choose the owner of your AI Brain.",
1025
1055
  "flow.login.body": "Lattice AI is a local-first Digital Brain that keeps your knowledge on this computer. Models can change; external transfer starts only when you choose it.",
1026
1056
  "flow.name": "Name",
@@ -1187,6 +1187,16 @@ body {
1187
1187
  50% { transform: scale(1.035); opacity: 0.95; }
1188
1188
  }
1189
1189
 
1190
+ @keyframes ring-breathe {
1191
+ 0%, 100% { transform: translate(-50%, -50%) scale(0.99); }
1192
+ 50% { transform: translate(-50%, -50%) scale(1.012); }
1193
+ }
1194
+
1195
+ @keyframes ring-label-breathe {
1196
+ 0%, 100% { opacity: 0.72; }
1197
+ 50% { opacity: 1; }
1198
+ }
1199
+
1190
1200
  @keyframes brain-living-breathe {
1191
1201
  0%,
1192
1202
  100% {
@@ -2384,6 +2394,90 @@ body {
2384
2394
  line-height: 1.05;
2385
2395
  }
2386
2396
 
2397
+ .brain-memory-rings {
2398
+ position: absolute;
2399
+ inset: 11.5% 13%;
2400
+ z-index: 4;
2401
+ pointer-events: none;
2402
+ }
2403
+
2404
+ .brain-memory-ring {
2405
+ position: absolute;
2406
+ left: 50%;
2407
+ top: 50%;
2408
+ display: flex;
2409
+ align-items: flex-start;
2410
+ justify-content: center;
2411
+ transform: translate(-50%, calc(-50% - var(--ring-radius)));
2412
+ border: 0;
2413
+ background: transparent;
2414
+ color: hsl(var(--fg-muted));
2415
+ padding: 0;
2416
+ pointer-events: none;
2417
+ opacity: 0.72;
2418
+ animation: ring-label-breathe 5.8s ease-in-out infinite;
2419
+ animation-delay: var(--ring-delay, 0ms);
2420
+ }
2421
+
2422
+ .brain-memory-ring::before {
2423
+ content: "";
2424
+ position: absolute;
2425
+ left: 50%;
2426
+ top: 50%;
2427
+ width: var(--ring-size);
2428
+ height: var(--ring-size);
2429
+ transform: translate(-50%, calc(-50% + var(--ring-radius)));
2430
+ border: 1px solid hsl(var(--border) / 0.38);
2431
+ border-radius: 999px;
2432
+ background: radial-gradient(circle, transparent 62%, hsl(var(--brain-core) / 0.045) 63%, transparent 70%);
2433
+ pointer-events: none;
2434
+ }
2435
+
2436
+ .brain-memory-ring.ring-1 { --ring-size: 14.2rem; --ring-radius: 7.1rem; }
2437
+ .brain-memory-ring.ring-2 { --ring-size: 17.9rem; --ring-radius: 8.95rem; }
2438
+ .brain-memory-ring.ring-3 { --ring-size: 21.6rem; --ring-radius: 10.8rem; }
2439
+ .brain-memory-ring.ring-4 { --ring-size: 25.3rem; --ring-radius: 12.65rem; }
2440
+ .brain-memory-ring.ring-5 { --ring-size: 29rem; --ring-radius: 14.5rem; }
2441
+
2442
+ .brain-memory-ring span,
2443
+ .brain-memory-ring strong {
2444
+ border-radius: 999px;
2445
+ background: hsl(var(--surface-glass));
2446
+ box-shadow: 0 8px 24px hsl(200 30% 3% / 0.14);
2447
+ backdrop-filter: blur(16px);
2448
+ }
2449
+
2450
+ .brain-memory-ring span {
2451
+ margin-right: 0.22rem;
2452
+ padding: 0.14rem 0.38rem;
2453
+ color: hsl(var(--brain-core));
2454
+ font-size: 0.58rem;
2455
+ font-weight: 900;
2456
+ }
2457
+
2458
+ .brain-memory-ring strong {
2459
+ max-width: 5.8rem;
2460
+ overflow: hidden;
2461
+ padding: 0.14rem 0.46rem;
2462
+ text-overflow: ellipsis;
2463
+ white-space: nowrap;
2464
+ font-size: 0.66rem;
2465
+ font-weight: 760;
2466
+ }
2467
+
2468
+ .brain-memory-ring:hover,
2469
+ .brain-memory-ring:focus-visible,
2470
+ .brain-memory-ring.is-revealed {
2471
+ border-color: hsl(var(--brain-core) / 0.52);
2472
+ color: hsl(var(--fg));
2473
+ outline: none;
2474
+ opacity: 1;
2475
+ }
2476
+
2477
+ .brain-memory-ring[aria-current="step"] {
2478
+ box-shadow: 0 0 0 1px hsl(var(--brain-core) / 0.32), 0 0 38px hsl(var(--brain-core) / 0.16);
2479
+ }
2480
+
2387
2481
  .brain-depth-actions {
2388
2482
  position: absolute;
2389
2483
  left: 50%;
@@ -3747,6 +3841,18 @@ body {
3747
3841
  .brain-depth-actions button {
3748
3842
  flex: 0 0 auto;
3749
3843
  }
3844
+ .brain-memory-rings {
3845
+ inset: 16% 7%;
3846
+ }
3847
+ .brain-memory-ring.ring-1 { --ring-size: 10rem; --ring-radius: 5rem; }
3848
+ .brain-memory-ring.ring-2 { --ring-size: 12.5rem; --ring-radius: 6.25rem; }
3849
+ .brain-memory-ring.ring-3 { --ring-size: 15.1rem; --ring-radius: 7.55rem; }
3850
+ .brain-memory-ring.ring-4 { --ring-size: 17.7rem; --ring-radius: 8.85rem; }
3851
+ .brain-memory-ring.ring-5 { --ring-size: 20.2rem; --ring-radius: 10.1rem; }
3852
+ .brain-memory-ring strong {
3853
+ max-width: 4.6rem;
3854
+ font-size: 0.58rem;
3855
+ }
3750
3856
  .brain-depth-rail {
3751
3857
  top: 0.35rem;
3752
3858
  width: min(100vw - 1rem, 25rem);
@@ -3841,6 +3947,56 @@ body {
3841
3947
  margin: 0 auto 1.75rem;
3842
3948
  }
3843
3949
 
3950
+ .ritual-wake {
3951
+ display: grid;
3952
+ gap: 1rem;
3953
+ }
3954
+
3955
+ .ritual-wake-plan {
3956
+ display: grid;
3957
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3958
+ gap: 0.65rem;
3959
+ margin: 0 auto;
3960
+ width: min(100%, 640px);
3961
+ }
3962
+
3963
+ .ritual-wake-plan div {
3964
+ border: 1px solid hsl(var(--border) / 0.58);
3965
+ border-radius: 8px;
3966
+ background: hsl(var(--bg) / 0.46);
3967
+ padding: 0.82rem 0.75rem;
3968
+ text-align: left;
3969
+ }
3970
+
3971
+ .ritual-wake-plan span {
3972
+ display: inline-grid;
3973
+ place-items: center;
3974
+ width: 1.55rem;
3975
+ height: 1.55rem;
3976
+ border-radius: 999px;
3977
+ background: hsl(var(--brain-core) / 0.12);
3978
+ color: hsl(var(--brain-core));
3979
+ font-size: 0.72rem;
3980
+ font-weight: 900;
3981
+ }
3982
+
3983
+ .ritual-wake-plan strong {
3984
+ display: block;
3985
+ margin-top: 0.45rem;
3986
+ font-size: 0.92rem;
3987
+ line-height: 1.22;
3988
+ }
3989
+
3990
+ .ritual-secondary-button {
3991
+ min-height: 2.75rem;
3992
+ border: 1px solid hsl(var(--border) / 0.64);
3993
+ border-radius: 8px;
3994
+ background: hsl(var(--surface-glass));
3995
+ color: hsl(var(--fg));
3996
+ padding: 0 1.1rem;
3997
+ font-weight: 760;
3998
+ }
3999
+
3844
4000
  .ritual-title {
3845
4001
  font-size: clamp(1.85rem, 5vw, 2.85rem);
3846
4002
  font-weight: 680;
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "7.5.0"
29
+ __version__ = "7.6.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, List, Optional
21
21
  from .contracts import multi_agent_contract
22
22
 
23
23
 
24
- MULTI_AGENT_VERSION = "7.5.0"
24
+ MULTI_AGENT_VERSION = "7.6.0"
25
25
 
26
26
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
27
27
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "7.5.0"
3
+ __version__ = "7.6.0"
@@ -11,14 +11,15 @@ from __future__ import annotations
11
11
 
12
12
  import hashlib
13
13
  import math
14
- import os
15
14
  import re
16
15
  import struct
17
16
  from dataclasses import dataclass
18
17
  from typing import Iterable, List
19
18
 
20
-
21
- DEFAULT_EMBEDDING_DIM = int(os.getenv("LATTICEAI_VECTOR_DIM", "384"))
19
+ # Default controlled via latticeai.core.config.Config.embedding_dim (LATTICEAI_VECTOR_DIM).
20
+ # Removed direct os.getenv per 7.6.0 config centralization (review.md item 3).
21
+ # Callers that need override should pass dim= from Config.
22
+ DEFAULT_EMBEDDING_DIM = 384
22
23
  EMBEDDING_MODEL_ID = f"lattice-local-hash-v1:{DEFAULT_EMBEDDING_DIM}"
23
24
 
24
25
 
@@ -11,7 +11,7 @@ from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
13
 
14
- MARKETPLACE_VERSION = "7.5.0"
14
+ MARKETPLACE_VERSION = "7.6.0"
15
15
  TEMPLATE_KINDS = ("plugin", "workflow", "agent")
16
16
 
17
17
 
@@ -9,7 +9,6 @@ upgrade; the raw token never touches disk again).
9
9
  import hashlib
10
10
  import json
11
11
  import logging
12
- import os
13
12
  import secrets
14
13
  import threading
15
14
  import time
@@ -32,7 +31,14 @@ def _looks_hashed(key: str) -> bool:
32
31
 
33
32
 
34
33
  def _sessions_file(data_dir: Optional[Path] = None) -> Path:
35
- d = data_dir or Path(os.getenv("LATTICEAI_DATA_DIR") or (Path.home() / ".ltcai"))
34
+ if data_dir is None:
35
+ try:
36
+ from latticeai.core.config import Config
37
+ data_dir = Config.from_env().data_dir
38
+ except Exception:
39
+ import os
40
+ data_dir = Path(os.getenv("LATTICEAI_DATA_DIR") or (Path.home() / ".ltcai"))
41
+ d = data_dir
36
42
  d.mkdir(parents=True, exist_ok=True)
37
43
  return d / "sessions.json"
38
44
 
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, Iterable, List, Optional
21
21
  from lattice_brain.runtime.contracts import realtime_event_contract, run_record_contract, workflow_run_contract
22
22
 
23
23
 
24
- WORKSPACE_OS_VERSION = "7.5.0"
24
+ WORKSPACE_OS_VERSION = "7.6.0"
25
25
 
26
26
  # Workspace types separate single-user Personal workspaces from shared
27
27
  # Organization workspaces. Both keep the same local-first JSON store; the type