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.
- package/README.md +49 -42
- package/docs/CHANGELOG.md +26 -0
- package/frontend/src/components/ProductFlow.tsx +36 -1
- package/frontend/src/components/onboarding/recommendationModel.ts +1 -1
- package/frontend/src/features/brain/BrainHome.tsx +29 -0
- package/frontend/src/i18n.ts +31 -1
- package/frontend/src/styles.css +156 -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/local_embeddings.py +4 -3
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/sessions.py +8 -2
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/models/router.py +19 -0
- package/latticeai/services/architecture_readiness.py +101 -0
- package/latticeai/services/model_runtime.py +8 -3
- package/package.json +1 -1
- package/scripts/pts-claudecode-discord-bridge.mjs +20 -3
- 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 +28 -28
- package/static/app/assets/{Act-Di4tRFWY.js → Act-CSeeIWB4.js} +2 -2
- package/static/app/assets/{Act-Di4tRFWY.js.map → Act-CSeeIWB4.js.map} +1 -1
- package/static/app/assets/{Brain-BZB3Gy9w.js → Brain-D_Ne4YoR.js} +2 -2
- package/static/app/assets/{Brain-BZB3Gy9w.js.map → Brain-D_Ne4YoR.js.map} +1 -1
- package/static/app/assets/{Capture-tNyYWxnh.js → Capture-YFRAO4bJ.js} +2 -2
- package/static/app/assets/{Capture-tNyYWxnh.js.map → Capture-YFRAO4bJ.js.map} +1 -1
- package/static/app/assets/{Library-DAtDDLdg.js → Library-C4zmA8O2.js} +2 -2
- package/static/app/assets/{Library-DAtDDLdg.js.map → Library-C4zmA8O2.js.map} +1 -1
- package/static/app/assets/{System-DEu0xNUc.js → System-Da-Kxwiz.js} +2 -2
- package/static/app/assets/{System-DEu0xNUc.js.map → System-Da-Kxwiz.js.map} +1 -1
- package/static/app/assets/{index-Bi_bpigM.css → index-BwmCpRoW.css} +1 -1
- package/static/app/assets/index-D1hsexMt.js +17 -0
- package/static/app/assets/index-D1hsexMt.js.map +1 -0
- package/static/app/assets/{primitives-CdwcE--L.js → primitives-CSsF_Ymb.js} +2 -2
- package/static/app/assets/{primitives-CdwcE--L.js.map → primitives-CSsF_Ymb.js.map} +1 -1
- package/static/app/assets/{textarea-CqOdBPL1.js → textarea-CJMFSyfQ.js} +2 -2
- package/static/app/assets/{textarea-CqOdBPL1.js.map → textarea-CJMFSyfQ.js.map} +1 -1
- package/static/app/index.html +2 -2
- package/static/app/assets/index-COuGp7_5.js +0 -17
- 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.
|
|
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.
|
|
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
|
-

|
|
73
78
|
|
|
74
|
-
###
|
|
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
|
-

|
|
80
85
|
|
|
81
|
-
###
|
|
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
|
-

|
|
87
92
|
|
|
88
|
-
###
|
|
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
|
-

|
|
94
99
|
|
|
95
|
-
###
|
|
100
|
+
### 6. Brain Chat
|
|
96
101
|
|
|
97
102
|
Talk normally. Useful decisions and context become memory, then appear later as
|
|
98
|
-
topics, relationships, and
|
|
103
|
+
topics, relationships, graph structure, and the concentric memory rings around
|
|
104
|
+
the Brain.
|
|
99
105
|
|
|
100
|
-

|
|
101
107
|
|
|
102
|
-
###
|
|
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
|
-

|
|
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
|
-

|
|
124
130
|
|
|
125
131
|
Screenshot index and capture notes:
|
|
126
|
-
[output/release/v7.
|
|
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.
|
|
204
|
-
|
|
205
|
-
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
Expected artifacts for 7.
|
|
220
|
-
|
|
221
|
-
- `dist/ltcai-7.
|
|
222
|
-
- `dist/ltcai-7.
|
|
223
|
-
- `ltcai-7.
|
|
224
|
-
- `dist/ltcai-7.
|
|
225
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_7.
|
|
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.
|
|
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>("
|
|
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,
|
package/frontend/src/i18n.ts
CHANGED
|
@@ -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",
|
package/frontend/src/styles.css
CHANGED
|
@@ -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;
|
|
@@ -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.
|
|
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")
|
package/latticeai/__init__.py
CHANGED
|
@@ -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
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
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.
|
|
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
|