ltcai 7.4.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 +50 -41
- package/docs/CHANGELOG.md +52 -0
- package/docs/ROADMAP_RECOMMENDATIONS.md +15 -1
- 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/retrieval_benchmark_fixtures.py +48 -12
- package/lattice_brain/runtime/agent_runtime.py +20 -4
- package/lattice_brain/runtime/contracts.py +55 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agents.py +3 -3
- package/latticeai/api/realtime.py +3 -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 +6 -3
- package/scripts/brain_quality_eval.py +11 -8
- package/scripts/pts-claudecode-discord-bridge.mjs +20 -3
- package/src-tauri/Cargo.lock +626 -1089
- package/src-tauri/Cargo.toml +3 -6
- package/src-tauri/src/main.rs +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/core-CwxXejkd.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,33 +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
|
-
|
|
220
|
-
|
|
221
|
-
- `dist/ltcai-7.
|
|
222
|
-
- `ltcai-7.
|
|
223
|
-
- `
|
|
224
|
-
- `
|
|
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`
|
|
225
232
|
|
|
226
233
|
Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
227
234
|
|
|
228
235
|
See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
|
|
229
|
-
strategic roadmap slices applied through 7.
|
|
236
|
+
strategic roadmap slices applied through 7.6.0 and the follow-up tracks.
|
|
230
237
|
|
|
231
238
|
## Known Limitations
|
|
232
239
|
|
|
@@ -243,6 +250,8 @@ strategic roadmap slices applied through 7.4.0 and the follow-up tracks.
|
|
|
243
250
|
|
|
244
251
|
| Version | Theme |
|
|
245
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 |
|
|
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 |
|
|
246
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 |
|
|
247
256
|
| 7.3.0 | Runtime Contract & Retrieval Quality: shared agent-run contract across runtimes plus deterministic hybrid recall/ranking regression gates |
|
|
248
257
|
| 7.2.0 | Runtime Trust Baseline: agent run preview/readiness, simulation-mode guardrails, live ToolRegistry manifest/diagnostics, and tests for dispatch/governance/catalog drift |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,58 @@ 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
|
+
|
|
30
|
+
## [7.5.0] - 2026-06-20
|
|
31
|
+
|
|
32
|
+
> Runtime Debt Burn-down & Release Risk Cleanup. Turns the 7.4.0 contract
|
|
33
|
+
> envelope into a consumed API surface, expands retrieval quality to a 250+
|
|
34
|
+
> record local corpus fixture, and removes release/security warnings.
|
|
35
|
+
|
|
36
|
+
### Added
|
|
37
|
+
- `extract_contract`, `require_contract`, `contract_view`, and `contract_views`
|
|
38
|
+
helpers for consumers that need a surface-agnostic `agent-run-contract/v1`
|
|
39
|
+
projection.
|
|
40
|
+
- AgentRuntime status/list/detail/events and realtime feed responses now expose
|
|
41
|
+
compact `contracts` views alongside legacy payloads.
|
|
42
|
+
- Deterministic 250+ record retrieval benchmark corpus while keeping 12 judged
|
|
43
|
+
queries and real `KnowledgeGraphStore` + `SearchService` execution.
|
|
44
|
+
- Refreshed README release evidence screenshots and walkthrough GIF under
|
|
45
|
+
`output/release/v7.5.0/`.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
- Tauri Rust/CLI dependencies are updated within the Tauri 2 line, removing the
|
|
49
|
+
old transitive `block v0.1.6` future-incompatibility warning.
|
|
50
|
+
- npm dependency overrides move `js-yaml` to a non-vulnerable version; `npm
|
|
51
|
+
audit` reports 0 vulnerabilities.
|
|
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.
|
|
56
|
+
- Package/runtime/static metadata is synchronized to 7.5.0; package publish and
|
|
57
|
+
deployment remain owner-run only.
|
|
58
|
+
|
|
7
59
|
## [7.4.0] - 2026-06-20
|
|
8
60
|
|
|
9
61
|
> Runtime Contract Convergence & Corpus Retrieval. Completes the
|
|
@@ -30,6 +30,19 @@ small release-sized work. The operating principle stays unchanged:
|
|
|
30
30
|
Knowledge Graph corpus and scores SearchService hybrid retrieval with judged
|
|
31
31
|
queries, recall, precision, NDCG, and must-include hit-rate thresholds.
|
|
32
32
|
|
|
33
|
+
## 7.5.0 Applied Slice
|
|
34
|
+
|
|
35
|
+
7.5.0 burns down the remaining 7.4.0 risk instead of deferring it:
|
|
36
|
+
|
|
37
|
+
- Contract consumption: AgentRuntime and realtime feed APIs now emit compact
|
|
38
|
+
`contracts` views so UI, replay, admin, and export consumers can depend on the
|
|
39
|
+
shared family envelope directly.
|
|
40
|
+
- Retrieval scale: the corpus fixture now runs against 250+ local records while
|
|
41
|
+
keeping judged queries, graded relevance, and must-include expectations.
|
|
42
|
+
- Release trust: stale artifact mixing is handled through clean exact-version
|
|
43
|
+
artifact generation, npm audit findings are cleared, and the Tauri 2 stack is
|
|
44
|
+
updated past the old `block v0.1.6` future-incompatibility warning.
|
|
45
|
+
|
|
33
46
|
## Near-Term Tracks
|
|
34
47
|
|
|
35
48
|
1. Retrieval quality and scale
|
|
@@ -43,7 +56,8 @@ small release-sized work. The operating principle stays unchanged:
|
|
|
43
56
|
- Surface conflict resolution for contradictory memories.
|
|
44
57
|
|
|
45
58
|
3. Runtime convergence
|
|
46
|
-
-
|
|
59
|
+
- Migrate remaining UI run/replay/admin components to read the API-level
|
|
60
|
+
compact contract views as their primary source.
|
|
47
61
|
- Keep simulation mode explicit and never record it as product success.
|
|
48
62
|
- Route tools through explicit registry/governance contracts.
|
|
49
63
|
|
|
@@ -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;
|