ltcai 7.6.0 → 7.8.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 +39 -34
- package/docs/CHANGELOG.md +39 -0
- package/frontend/src/App.tsx +4 -2
- package/frontend/src/api/client.ts +9 -2
- package/frontend/src/components/LivingBrain.tsx +9 -1
- package/frontend/src/components/ProductFlow.tsx +27 -3
- package/frontend/src/components/onboarding/RecommendationScreen.tsx +33 -26
- package/frontend/src/features/brain/BrainConversation.tsx +214 -94
- package/frontend/src/features/brain/BrainHome.tsx +32 -28
- package/frontend/src/features/review/ReviewInbox.tsx +2 -2
- package/frontend/src/features/review/reviewHelpers.ts +11 -11
- package/frontend/src/i18n.ts +162 -26
- package/frontend/src/pages/Act.tsx +28 -14
- package/frontend/src/pages/Ask.tsx +11 -2
- package/frontend/src/pages/Brain.tsx +12 -2
- package/frontend/src/routes.ts +6 -6
- package/frontend/src/styles.css +592 -25
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/architecture_readiness.py +25 -7
- package/latticeai/services/product_readiness.py +159 -0
- package/package.json +1 -1
- package/scripts/product_readiness.py +37 -0
- 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-CSeeIWB4.js → Act-DOvf59ru.js} +2 -2
- package/static/app/assets/{Act-CSeeIWB4.js.map → Act-DOvf59ru.js.map} +1 -1
- package/static/app/assets/Brain-C7_0mEiI.js +322 -0
- package/static/app/assets/Brain-C7_0mEiI.js.map +1 -0
- package/static/app/assets/Capture-B9Tlhzqr.js +2 -0
- package/static/app/assets/Capture-B9Tlhzqr.js.map +1 -0
- package/static/app/assets/Library-BJPEEm5O.js +2 -0
- package/static/app/assets/{Library-C4zmA8O2.js.map → Library-BJPEEm5O.js.map} +1 -1
- package/static/app/assets/System-D6t9jo9V.js +2 -0
- package/static/app/assets/{System-Da-Kxwiz.js.map → System-D6t9jo9V.js.map} +1 -1
- package/static/app/assets/index-C7g26IF6.css +2 -0
- package/static/app/assets/index-DbcEYJQ2.js +17 -0
- package/static/app/assets/index-DbcEYJQ2.js.map +1 -0
- package/static/app/assets/primitives-CD38lt4n.js +2 -0
- package/static/app/assets/{primitives-CSsF_Ymb.js.map → primitives-CD38lt4n.js.map} +1 -1
- package/static/app/assets/textarea-BZk6ybp5.js +2 -0
- package/static/app/assets/{textarea-CJMFSyfQ.js.map → textarea-BZk6ybp5.js.map} +1 -1
- package/static/app/index.html +2 -2
- package/frontend/src/components/BrainConversation.tsx +0 -533
- package/frontend/src/components/FirstRunGuide.tsx +0 -99
- package/static/app/assets/Brain-D_Ne4YoR.js +0 -322
- package/static/app/assets/Brain-D_Ne4YoR.js.map +0 -1
- package/static/app/assets/Capture-YFRAO4bJ.js +0 -2
- package/static/app/assets/Capture-YFRAO4bJ.js.map +0 -1
- package/static/app/assets/Library-C4zmA8O2.js +0 -2
- package/static/app/assets/System-Da-Kxwiz.js +0 -2
- package/static/app/assets/index-BwmCpRoW.css +0 -2
- package/static/app/assets/index-D1hsexMt.js +0 -17
- package/static/app/assets/index-D1hsexMt.js.map +0 -1
- package/static/app/assets/primitives-CSsF_Ymb.js +0 -2
- package/static/app/assets/textarea-CJMFSyfQ.js +0 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI
|
|
2
2
|
|
|
3
|
-
**Lattice AI is
|
|
3
|
+
**Lattice AI 7.8 is the glanceable local-first Digital Brain product. It keeps your knowledge durable across any AI model, with Brain Chat Home rebuilt around immediate use instead of dashboard clutter.**
|
|
4
4
|
|
|
5
5
|
**Lattice AI는 모델이 바뀌어도 내 지식과 맥락을 보존하는 로컬 우선 AI 브레인입니다.**
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ downloads, update checks, and other external communication happen only after
|
|
|
11
11
|
explicit consent.
|
|
12
12
|
|
|
13
13
|
It is not a ChatGPT clone, a model launcher, a graph database, or a note app.
|
|
14
|
-
It is
|
|
14
|
+
It is the finished private AI memory layer wrapped in a Living Brain experience — now with a cleaner 7.8 Brain Chat Home.
|
|
15
15
|
|
|
16
16
|
[](https://pypi.org/project/ltcai/)
|
|
17
17
|
[](https://www.npmjs.com/package/ltcai)
|
|
@@ -64,6 +64,10 @@ You need Lattice AI when:
|
|
|
64
64
|
|
|
65
65
|
## Living Brain Flow
|
|
66
66
|
|
|
67
|
+
The screenshots below are release evidence captures. The 7.8 line keeps the
|
|
68
|
+
same first-run flow and rebuilds the Brain Chat Home layout so chat and the
|
|
69
|
+
composer are the first visible action.
|
|
70
|
+
|
|
67
71
|
### 1. Wake Brain
|
|
68
72
|
|
|
69
73
|
The first screen makes the Brain the product. It explains the three-step path:
|
|
@@ -74,28 +78,28 @@ confirm owner, check the computer, choose the Brain voice.
|
|
|
74
78
|
Choose the owner of the Brain. The profile is not a SaaS account by default; it
|
|
75
79
|
is the local identity for the knowledge you keep.
|
|
76
80
|
|
|
77
|
-

|
|
78
82
|
|
|
79
83
|
### 3. Environment Analysis
|
|
80
84
|
|
|
81
85
|
See what kind of local AI experience this computer can support before choosing a
|
|
82
86
|
model.
|
|
83
87
|
|
|
84
|
-

|
|
85
89
|
|
|
86
90
|
### 4. Recommended Models
|
|
87
91
|
|
|
88
92
|
Start with a short list: safest recommendation, faster model, stronger model.
|
|
89
93
|
Advanced details stay available without overwhelming first-time users.
|
|
90
94
|
|
|
91
|
-

|
|
92
96
|
|
|
93
97
|
### 5. Install And Load
|
|
94
98
|
|
|
95
99
|
Download and load only after consent. Lattice explains model size, local
|
|
96
100
|
execution, and network use before work starts.
|
|
97
101
|
|
|
98
|
-

|
|
99
103
|
|
|
100
104
|
### 6. Brain Chat
|
|
101
105
|
|
|
@@ -103,14 +107,14 @@ Talk normally. Useful decisions and context become memory, then appear later as
|
|
|
103
107
|
topics, relationships, graph structure, and the concentric memory rings around
|
|
104
108
|
the Brain.
|
|
105
109
|
|
|
106
|
-

|
|
107
111
|
|
|
108
112
|
### 7. Review Center
|
|
109
113
|
|
|
110
114
|
Automation results are staged for review before they become durable decisions.
|
|
111
115
|
Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
|
|
112
116
|
|
|
113
|
-

|
|
114
118
|
|
|
115
119
|
## Brain Depths
|
|
116
120
|
|
|
@@ -126,10 +130,10 @@ The user travels inward from everyday memory to deeper structure:
|
|
|
126
130
|
|
|
127
131
|
Walkthrough:
|
|
128
132
|
|
|
129
|
-

|
|
130
134
|
|
|
131
135
|
Screenshot index and capture notes:
|
|
132
|
-
[output/release/v7.
|
|
136
|
+
[output/release/v7.7.0/SCREENSHOT_INDEX.md](output/release/v7.7.0/SCREENSHOT_INDEX.md)
|
|
133
137
|
|
|
134
138
|
## Install
|
|
135
139
|
|
|
@@ -206,34 +210,33 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
|
|
|
206
210
|
|
|
207
211
|
## Current Release
|
|
208
212
|
|
|
209
|
-
The current release is **7.
|
|
210
|
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
- Brain
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
- `dist/ltcai-7.
|
|
228
|
-
- `
|
|
229
|
-
- `ltcai-7.
|
|
230
|
-
- `
|
|
231
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_7.6.0_aarch64.dmg`
|
|
213
|
+
The current release is **7.8.0 — Brain Chat Home UX Simplification**:
|
|
214
|
+
|
|
215
|
+
- Brain Chat Home now opens with chat, starter prompts, and the composer as the
|
|
216
|
+
first action. Source ingestion, readiness, proof, timeline, and care controls
|
|
217
|
+
move behind a single utility drawer instead of occupying the first viewport.
|
|
218
|
+
- The default Brain surface now keeps workspace navigation visible, removes
|
|
219
|
+
permanent marketing intro copy, and only reveals deep memory controls after
|
|
220
|
+
the user chooses to travel deeper.
|
|
221
|
+
- Obsolete Brain conversation and first-run guide components were removed so the
|
|
222
|
+
canonical Brain/onboarding implementation is the only path.
|
|
223
|
+
- Product readiness is machine-checkable through `product_readiness()`, which
|
|
224
|
+
composes the architecture contract with exact artifact/docs/workflow evidence.
|
|
225
|
+
- CI and release workflows now run frontend lint/typecheck/build gates plus the
|
|
226
|
+
7.8 product readiness score before a tag can be treated as release-safe.
|
|
227
|
+
|
|
228
|
+
Expected artifacts for 7.8.0 release must use exact filenames:
|
|
229
|
+
|
|
230
|
+
- `dist/ltcai-7.8.0-py3-none-any.whl`
|
|
231
|
+
- `dist/ltcai-7.8.0.tar.gz`
|
|
232
|
+
- `ltcai-7.8.0.tgz`
|
|
233
|
+
- `dist/ltcai-7.8.0.vsix`
|
|
234
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_7.8.0_aarch64.dmg`
|
|
232
235
|
|
|
233
236
|
Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
234
237
|
|
|
235
238
|
See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
|
|
236
|
-
strategic roadmap slices applied through 7.
|
|
239
|
+
strategic roadmap slices applied through 7.8.0 and the follow-up tracks.
|
|
237
240
|
|
|
238
241
|
## Known Limitations
|
|
239
242
|
|
|
@@ -250,6 +253,8 @@ strategic roadmap slices applied through 7.6.0 and the follow-up tracks.
|
|
|
250
253
|
|
|
251
254
|
| Version | Theme |
|
|
252
255
|
| --- | --- |
|
|
256
|
+
| 7.8.0 | Brain Chat Home UX Simplification: chat-first first viewport, visible workspace navigation, collapsed source/status utilities, hidden default depth controls, and removal of obsolete Brain UX components |
|
|
257
|
+
| 7.7.0 | Complete Product Polish: command-center Brain Home, repaired Review Center evidence, exact 7.7 docs/artifacts, product readiness gate, and stronger CI/release checks |
|
|
253
258
|
| 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
259
|
| 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 |
|
|
255
260
|
| 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 |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,45 @@ 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
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [7.8.0] - 2026-06-22
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- Rebuilt Brain Chat Home around immediate conversation: chat purpose, starter
|
|
13
|
+
prompts, and the composer now occupy the first viewport.
|
|
14
|
+
- Collapsed source ingestion, readiness, proof, timeline, overview, model
|
|
15
|
+
continuity, and care controls behind one utility drawer.
|
|
16
|
+
- Kept workspace navigation visible on the default Brain surface.
|
|
17
|
+
- Hid default depth controls until the user intentionally travels deeper.
|
|
18
|
+
- Integrated the six post-7.7 UX drafts into the canonical Brain experience:
|
|
19
|
+
first-run value cards, stronger recommendation affordances, product-toned
|
|
20
|
+
Brain Home copy, and routed legacy Brain conversation entry points to the
|
|
21
|
+
canonical Brain Home surface.
|
|
22
|
+
- Removed obsolete Brain conversation and first-run guide components.
|
|
23
|
+
- Moved draft onboarding polish out of inline styles and into the shared design
|
|
24
|
+
stylesheet with responsive behavior and bilingual copy.
|
|
25
|
+
- Updated architecture and product readiness targets to 7.8.0.
|
|
26
|
+
|
|
27
|
+
## [7.7.0] - 2026-06-22
|
|
28
|
+
|
|
29
|
+
> 7.7.0 marks the complete, finished product stage for Lattice AI.
|
|
30
|
+
> After 7.6.0 architecture closure, this release polishes every surface so that anyone looking at the code, UI, docs, or running app immediately recognizes: "this is now a product".
|
|
31
|
+
|
|
32
|
+
Lattice AI v7.7 delivers the Living Brain as the undeniable center, production-grade runtime contracts, stable ToolRegistry, full ingestion-to-graph flows, bilingual professional UX, and zero-beta signals. Classifiers moved to Production/Stable. All prior gates remain enforced under finished product contract.
|
|
33
|
+
|
|
34
|
+
Package metadata, Tauri, frontend, Python all aligned to 7.7.0. UI/UX microcopy and signals updated to convey finished professional tool.
|
|
35
|
+
|
|
36
|
+
### Productization Highlights
|
|
37
|
+
- Extreme self + claude-code (pts_claudecode) used for polish, evaluation, iteration.
|
|
38
|
+
- "This is a product" bar: clear durable knowledge ownership, no loose ends.
|
|
39
|
+
- Validation: typecheck, unit, cargo, build scripts exercised.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- Package/runtime/static metadata synchronized to 7.7.0.
|
|
43
|
+
- Development status to Production/Stable.
|
|
44
|
+
- All current-release references point to 7.7.0.
|
|
45
|
+
|
|
7
46
|
## [7.6.0] - 2026-06-22
|
|
8
47
|
|
|
9
48
|
> Brain-Centered UX & Architecture Closure. Incorporates the two local review
|
package/frontend/src/App.tsx
CHANGED
|
@@ -88,7 +88,9 @@ export default function App() {
|
|
|
88
88
|
</React.Suspense>
|
|
89
89
|
</BrainShell>
|
|
90
90
|
) : (
|
|
91
|
-
<
|
|
91
|
+
<BrainShell active="brain">
|
|
92
|
+
<BrainHome brainState={brainState} intensity={intensity} onBrainChange={setBrain} />
|
|
93
|
+
</BrainShell>
|
|
92
94
|
)}
|
|
93
95
|
</div>
|
|
94
96
|
);
|
|
@@ -113,7 +115,7 @@ function BrainShell({
|
|
|
113
115
|
aria-current={item.id === active ? "page" : undefined}
|
|
114
116
|
onClick={() => navigateHash(`/${item.path}`)}
|
|
115
117
|
>
|
|
116
|
-
{item.
|
|
118
|
+
{t(language, item.labelKey)}
|
|
117
119
|
</button>
|
|
118
120
|
))}
|
|
119
121
|
<div className="brain-shell-switchers" aria-label={t(language, "shell.workspace.label")}>
|
|
@@ -111,6 +111,13 @@ function friendlyError(error: unknown, fallback: string) {
|
|
|
111
111
|
return fallback;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
function friendlyCaughtError(error: unknown, fallback: string) {
|
|
115
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
116
|
+
if (/not valid JSON|Unexpected token|JSON/i.test(message)) return fallback;
|
|
117
|
+
if (/aborted|abort/i.test(message)) return "Request timed out. Check that the local Lattice service is running.";
|
|
118
|
+
return message || fallback;
|
|
119
|
+
}
|
|
120
|
+
|
|
114
121
|
async function apiJson<T>(
|
|
115
122
|
method: HttpMethod,
|
|
116
123
|
path: string,
|
|
@@ -150,7 +157,7 @@ async function apiJson<T>(
|
|
|
150
157
|
status: 0,
|
|
151
158
|
data: emptyFor(opts.shape),
|
|
152
159
|
source: "unavailable",
|
|
153
|
-
error: err
|
|
160
|
+
error: friendlyCaughtError(err, "The local Lattice service returned an unavailable response."),
|
|
154
161
|
};
|
|
155
162
|
} finally {
|
|
156
163
|
window.clearTimeout(timer);
|
|
@@ -183,7 +190,7 @@ async function openApiJson<T>(
|
|
|
183
190
|
status: 0,
|
|
184
191
|
data: emptyFor(shape),
|
|
185
192
|
source: "unavailable",
|
|
186
|
-
error: err
|
|
193
|
+
error: friendlyCaughtError(err, "The local Lattice service returned an unavailable response."),
|
|
187
194
|
};
|
|
188
195
|
} finally {
|
|
189
196
|
window.clearTimeout(timer);
|
|
@@ -134,7 +134,8 @@ export function LivingBrain({
|
|
|
134
134
|
style={{
|
|
135
135
|
animationDuration: state === "thinking" ? "1.65s" : state === "recalling" ? "2.4s" : "6.8s",
|
|
136
136
|
transform: `scale(${1 + effectiveDepth * 0.12})`,
|
|
137
|
-
opacity: 0.65 + effectiveDepth * 0.05
|
|
137
|
+
opacity: 0.65 + effectiveDepth * 0.05,
|
|
138
|
+
boxShadow: effectiveDepth > 2 ? "0 0 60px hsl(var(--brain-core) / 0.25)" : "none"
|
|
138
139
|
}}
|
|
139
140
|
/>
|
|
140
141
|
|
|
@@ -176,6 +177,13 @@ export function LivingBrain({
|
|
|
176
177
|
<circle cx="50" cy="50" r="28" />
|
|
177
178
|
<path d="M32 50 Q50 32 68 50" />
|
|
178
179
|
<path d="M32 50 Q50 68 68 50" />
|
|
180
|
+
{/* lattice connections for deeper feel */}
|
|
181
|
+
<circle cx="25" cy="35" r="2" fill="hsl(var(--brain-core) / 0.4)" />
|
|
182
|
+
<circle cx="75" cy="35" r="2" fill="hsl(var(--brain-core) / 0.4)" />
|
|
183
|
+
<circle cx="25" cy="65" r="2" fill="hsl(var(--brain-core) / 0.4)" />
|
|
184
|
+
<circle cx="75" cy="65" r="2" fill="hsl(var(--brain-core) / 0.4)" />
|
|
185
|
+
<path d="M25 35 L50 50 L75 35" stroke="hsl(var(--knowledge)/0.3)" strokeWidth="0.4" />
|
|
186
|
+
<path d="M25 65 L50 50 L75 65" stroke="hsl(var(--knowledge)/0.3)" strokeWidth="0.4" />
|
|
179
187
|
</g>
|
|
180
188
|
</svg>
|
|
181
189
|
)}
|
|
@@ -3,6 +3,7 @@ import { latticeApi } from "@/api/client";
|
|
|
3
3
|
import { type BrainState, LivingBrain } from "@/components/LivingBrain";
|
|
4
4
|
import { t } from "@/i18n";
|
|
5
5
|
import { useAppStore } from "@/store/appStore";
|
|
6
|
+
import { ArrowRight, Cpu, Shield, Zap } from "lucide-react";
|
|
6
7
|
import {
|
|
7
8
|
AnalysisScreen,
|
|
8
9
|
InstallScreen,
|
|
@@ -66,6 +67,9 @@ export function ProductFlow({ onComplete }: { onComplete: () => void }) {
|
|
|
66
67
|
<LanguageChooser />
|
|
67
68
|
<div className="ritual-brain">
|
|
68
69
|
<LivingBrain state={brainStateForStep(step)} intensity={step === "install" ? 0.92 : 0.7} size="large" showLabel={false} />
|
|
70
|
+
<div className="ritual-edition" title={t(language, "brain.edition.tip")}>
|
|
71
|
+
{t(language, "brain.edition")}
|
|
72
|
+
</div>
|
|
69
73
|
</div>
|
|
70
74
|
|
|
71
75
|
{step === "wake" && <WakeBrainScreen onWake={() => setStep("login")} onUseExisting={() => completeFlow(onComplete)} />}
|
|
@@ -103,10 +107,28 @@ export function ProductFlow({ onComplete }: { onComplete: () => void }) {
|
|
|
103
107
|
|
|
104
108
|
function WakeBrainScreen({ onWake, onUseExisting }: { onWake: () => void; onUseExisting: () => void }) {
|
|
105
109
|
const language = useAppStore((state) => state.language);
|
|
110
|
+
const valueCards = [
|
|
111
|
+
{ icon: Shield, label: t(language, "flow.wake.value.local.k"), body: t(language, "flow.wake.value.local.v") },
|
|
112
|
+
{ icon: Zap, label: t(language, "flow.wake.value.instant.k"), body: t(language, "flow.wake.value.instant.v") },
|
|
113
|
+
{ icon: Cpu, label: t(language, "flow.wake.value.brain.k"), body: t(language, "flow.wake.value.brain.v") },
|
|
114
|
+
];
|
|
106
115
|
return (
|
|
107
116
|
<section className="ritual-wake" aria-label={t(language, "flow.wake.aria")}>
|
|
108
117
|
<div className="ritual-title">{t(language, "flow.wake.title")}</div>
|
|
109
118
|
<div className="ritual-subtitle">{t(language, "flow.wake.body")}</div>
|
|
119
|
+
|
|
120
|
+
<div className="ritual-value-grid" aria-label={t(language, "flow.wake.value.aria")}>
|
|
121
|
+
{valueCards.map((card) => {
|
|
122
|
+
const Icon = card.icon;
|
|
123
|
+
return (
|
|
124
|
+
<div className="ritual-value-card" key={card.label}>
|
|
125
|
+
<div className="ritual-value-label"><Icon size={14} /> {card.label}</div>
|
|
126
|
+
<div className="ritual-value-body">{card.body}</div>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
})}
|
|
130
|
+
</div>
|
|
131
|
+
|
|
110
132
|
<div className="ritual-wake-plan" aria-label={t(language, "flow.wake.plan.aria")}>
|
|
111
133
|
<div>
|
|
112
134
|
<span>1</span>
|
|
@@ -121,14 +143,16 @@ function WakeBrainScreen({ onWake, onUseExisting }: { onWake: () => void; onUseE
|
|
|
121
143
|
<strong>{t(language, "flow.wake.step.voice")}</strong>
|
|
122
144
|
</div>
|
|
123
145
|
</div>
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
146
|
+
|
|
147
|
+
<div className="ritual-button-row ritual-button-row-primary">
|
|
148
|
+
<button type="button" className="ritual-full-button ritual-full-button-primary" onClick={onWake}>
|
|
149
|
+
{t(language, "flow.wake.primary")} <ArrowRight size={18} />
|
|
127
150
|
</button>
|
|
128
151
|
<button type="button" className="ritual-secondary-button" onClick={onUseExisting}>
|
|
129
152
|
{t(language, "flow.wake.existing")}
|
|
130
153
|
</button>
|
|
131
154
|
</div>
|
|
155
|
+
<div className="ritual-start-note">{t(language, "flow.wake.startNote")}</div>
|
|
132
156
|
</section>
|
|
133
157
|
);
|
|
134
158
|
}
|
|
@@ -2,6 +2,7 @@ import { Button } from "@/components/ui/button";
|
|
|
2
2
|
import { t, type Language } from "@/i18n";
|
|
3
3
|
import { useAppStore } from "@/store/appStore";
|
|
4
4
|
import { fallbackModel, type RecommendedModel } from "./recommendationModel";
|
|
5
|
+
import { ArrowRight, Gauge, Star, Zap } from "lucide-react";
|
|
5
6
|
|
|
6
7
|
export function RecommendationScreen({
|
|
7
8
|
recommendations,
|
|
@@ -25,37 +26,43 @@ export function RecommendationScreen({
|
|
|
25
26
|
{items[0]?.supported ? (
|
|
26
27
|
<div className="ritual-primary-cta">
|
|
27
28
|
<Button onClick={() => onSelect(items[0])} className="ritual-primary-model-button">
|
|
28
|
-
{t(language, "flow.recommend.primary")}
|
|
29
|
+
{t(language, "flow.recommend.primary")} <ArrowRight size={16} />
|
|
29
30
|
</Button>
|
|
30
31
|
<div className="ritual-time-estimate ritual-primary-note">{primaryNote(items[0], language)}</div>
|
|
31
32
|
<div className="ritual-muted-hint ritual-next-hint">{t(language, "flow.recommend.nextHint")}</div>
|
|
32
33
|
</div>
|
|
33
34
|
) : null}
|
|
34
|
-
{items.slice(0, 3).map((model, index) =>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
35
|
+
{items.slice(0, 3).map((model, index) => {
|
|
36
|
+
const Icon = model.role === "best" ? Star : model.role === "faster" ? Zap : Gauge;
|
|
37
|
+
return (
|
|
38
|
+
<button
|
|
39
|
+
key={`${model.role}-${model.id}`}
|
|
40
|
+
className="ritual-model-card"
|
|
41
|
+
onClick={() => model.supported && onSelect(model)}
|
|
42
|
+
disabled={!model.supported}
|
|
43
|
+
>
|
|
44
|
+
<div className="ritual-model-heading">
|
|
45
|
+
<Icon size={16} />
|
|
46
|
+
<div className="role">{rankLabel(model.role, index, language)}</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="name">{model.shortName}</div>
|
|
49
|
+
<div className="reason">
|
|
50
|
+
{model.reason} · {model.size || t(language, "flow.recommend.sizeReady")}
|
|
51
|
+
{comparisonLabel(model.role, language) ? (
|
|
52
|
+
<span className="ritual-model-comparison"> {comparisonLabel(model.role, language)}</span>
|
|
53
|
+
) : null}
|
|
54
|
+
</div>
|
|
55
|
+
<div className="ritual-model-stats">
|
|
56
|
+
<span className="ritual-time-estimate">{timeEstimate(model, language)}</span>
|
|
57
|
+
</div>
|
|
58
|
+
{model.supported ? (
|
|
59
|
+
<span className="ritual-model-choose">{t(language, "flow.recommend.choose")} <ArrowRight size={14} /></span>
|
|
60
|
+
) : (
|
|
61
|
+
<div className="ritual-model-warning">{t(language, "flow.recommend.unsupported")}</div>
|
|
62
|
+
)}
|
|
63
|
+
</button>
|
|
64
|
+
);
|
|
65
|
+
})}
|
|
59
66
|
<div className="ritual-time-note">{t(language, "flow.recommend.timeNote")}</div>
|
|
60
67
|
</div>
|
|
61
68
|
|