ltcai 7.7.0 → 7.9.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 (61) hide show
  1. package/README.md +38 -26
  2. package/docs/CHANGELOG.md +37 -0
  3. package/docs/DEVELOPMENT.md +1 -2
  4. package/docs/MULTI_AGENT_RUNTIME.md +6 -5
  5. package/docs/V2_ARCHITECTURE.md +3 -2
  6. package/frontend/src/App.tsx +3 -1
  7. package/frontend/src/components/ProductFlow.tsx +19 -23
  8. package/frontend/src/components/onboarding/RecommendationScreen.tsx +11 -12
  9. package/frontend/src/features/brain/BrainConversation.tsx +107 -108
  10. package/frontend/src/features/brain/BrainHome.tsx +32 -33
  11. package/frontend/src/i18n.ts +53 -19
  12. package/frontend/src/pages/Ask.tsx +11 -2
  13. package/frontend/src/pages/Brain.tsx +12 -2
  14. package/frontend/src/styles.css +390 -65
  15. package/lattice_brain/__init__.py +1 -1
  16. package/lattice_brain/runtime/__init__.py +8 -2
  17. package/lattice_brain/runtime/agent_runtime.py +17 -1
  18. package/lattice_brain/runtime/contracts.py +64 -1
  19. package/lattice_brain/runtime/multi_agent.py +1 -1
  20. package/latticeai/__init__.py +1 -1
  21. package/latticeai/core/agent.py +39 -12
  22. package/latticeai/core/marketplace.py +1 -1
  23. package/latticeai/core/workspace_os.py +1 -1
  24. package/latticeai/services/architecture_readiness.py +1 -1
  25. package/latticeai/services/product_readiness.py +22 -15
  26. package/latticeai/services/tool_dispatch.py +15 -3
  27. package/package.json +1 -1
  28. package/scripts/product_readiness.py +1 -1
  29. package/src-tauri/Cargo.lock +1 -1
  30. package/src-tauri/Cargo.toml +1 -1
  31. package/src-tauri/tauri.conf.json +1 -1
  32. package/static/app/asset-manifest.json +28 -28
  33. package/static/app/assets/Act-DOvf59ru.js +2 -0
  34. package/static/app/assets/{Act-CX5hL0Z3.js.map → Act-DOvf59ru.js.map} +1 -1
  35. package/static/app/assets/Brain-C7_0mEiI.js +322 -0
  36. package/static/app/assets/Brain-C7_0mEiI.js.map +1 -0
  37. package/static/app/assets/Capture-B9Tlhzqr.js +2 -0
  38. package/static/app/assets/{Capture-CdFSrZnA.js.map → Capture-B9Tlhzqr.js.map} +1 -1
  39. package/static/app/assets/{Library-CZFVGSmG.js → Library-BJPEEm5O.js} +2 -2
  40. package/static/app/assets/{Library-CZFVGSmG.js.map → Library-BJPEEm5O.js.map} +1 -1
  41. package/static/app/assets/System-D6t9jo9V.js +2 -0
  42. package/static/app/assets/{System-CMoOoUrZ.js.map → System-D6t9jo9V.js.map} +1 -1
  43. package/static/app/assets/index-C7g26IF6.css +2 -0
  44. package/static/app/assets/index-DbcEYJQ2.js +17 -0
  45. package/static/app/assets/{index-B4_drWel.js.map → index-DbcEYJQ2.js.map} +1 -1
  46. package/static/app/assets/primitives-CD38lt4n.js +2 -0
  47. package/static/app/assets/{primitives-CFhU5Rka.js.map → primitives-CD38lt4n.js.map} +1 -1
  48. package/static/app/assets/textarea-BZk6ybp5.js +2 -0
  49. package/static/app/assets/{textarea-uBpGDOJM.js.map → textarea-BZk6ybp5.js.map} +1 -1
  50. package/static/app/index.html +2 -2
  51. package/frontend/src/components/BrainConversation.tsx +0 -533
  52. package/frontend/src/components/FirstRunGuide.tsx +0 -99
  53. package/static/app/assets/Act-CX5hL0Z3.js +0 -2
  54. package/static/app/assets/Brain-m19en5wz.js +0 -322
  55. package/static/app/assets/Brain-m19en5wz.js.map +0 -1
  56. package/static/app/assets/Capture-CdFSrZnA.js +0 -2
  57. package/static/app/assets/System-CMoOoUrZ.js +0 -2
  58. package/static/app/assets/index-B4_drWel.js +0 -17
  59. package/static/app/assets/index-DjpDeE0c.css +0 -2
  60. package/static/app/assets/primitives-CFhU5Rka.js +0 -2
  61. package/static/app/assets/textarea-uBpGDOJM.js +0 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lattice AI
2
2
 
3
- **Lattice AI 7.7 is the complete, finished local-first Digital Brain product. It keeps your knowledge durable across any AI model now undeniably a production-grade professional tool.**
3
+ **Lattice AI 7.9 is the local-first Digital Brain product with cleaner runtime boundaries. It keeps your knowledge durable across any AI model, with Brain Chat Home ready for immediate use and agent execution hardened behind explicit runtime ports.**
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 the finished private AI memory layer wrapped in a Living Brain experience — 7.7 complete product.
14
+ It is the finished private AI memory layer wrapped in a Living Brain experience — now with a clearer 7.9 agent-runtime boundary.
15
15
 
16
16
  [![PyPI Version](https://img.shields.io/pypi/v/ltcai?label=PyPI)](https://pypi.org/project/ltcai/)
17
17
  [![npm Version](https://img.shields.io/npm/v/ltcai?label=npm)](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.9 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
- ![Login](output/release/v7.7.0/screenshots/01-login.png)
81
+ ![Login](output/release/v7.8.0/screenshots/01-login.png)
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
- ![Environment Analysis](output/release/v7.7.0/screenshots/02-environment-analysis.png)
88
+ ![Environment Analysis](output/release/v7.8.0/screenshots/02-environment-analysis.png)
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
- ![Recommended Models](output/release/v7.7.0/screenshots/03-recommended-models.png)
95
+ ![Recommended Models](output/release/v7.8.0/screenshots/03-recommended-models.png)
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
- ![Install and Load](output/release/v7.7.0/screenshots/04-install-load-progress.png)
102
+ ![Install and Load](output/release/v7.8.0/screenshots/04-install-load-progress.png)
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
- ![Brain Chat Home](output/release/v7.7.0/screenshots/05-brain-chat-home.png)
110
+ ![Brain Chat Home](output/release/v7.8.0/screenshots/05-brain-chat-home.png)
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
- ![Review Center](output/release/v7.7.0/screenshots/13-review-center.png)
117
+ ![Review Center](output/release/v7.8.0/screenshots/13-review-center.png)
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
- ![v7.7.0 Living Brain walkthrough](output/release/v7.7.0/gifs/v7.7.0-living-brain-walkthrough.gif)
133
+ ![v7.8.0 Living Brain walkthrough](output/release/v7.8.0/gifs/v7.8.0-living-brain-walkthrough.gif)
130
134
 
131
135
  Screenshot index and capture notes:
132
- [output/release/v7.7.0/SCREENSHOT_INDEX.md](output/release/v7.7.0/SCREENSHOT_INDEX.md)
136
+ [output/release/v7.8.0/SCREENSHOT_INDEX.md](output/release/v7.8.0/SCREENSHOT_INDEX.md)
133
137
 
134
138
  ## Install
135
139
 
@@ -206,30 +210,36 @@ 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.7.0 — Complete Finished Product**:
210
-
211
- - Brain Home now opens with a product command center: readiness score, next best
212
- action, memory/topic/source/proof metrics, and direct actions for adding
213
- sources, inspecting topics, verifying proof, and managing ownership.
214
- - Review Center release evidence is backed by fixtures and tests, with polished
215
- unavailable states instead of raw JSON parse errors.
213
+ The current release is **7.9.0 — Agent Runtime Boundary Hardening**:
214
+
215
+ - The single-agent state machine is now named `SingleAgentRuntime`, while the
216
+ historical `AgentRuntime` import remains as a compatibility alias.
217
+ - The product AgentRuntime facade in `lattice_brain.runtime.agent_runtime`
218
+ remains the unambiguous `/agents` execution and observability boundary.
219
+ - Agent rollback is now an injected runtime port wired through
220
+ `ToolDispatchService`, so the core state machine no longer shells out directly.
221
+ - Both runtime surfaces expose a `runtime-boundary/v1` descriptor so tests and
222
+ API clients can identify the owning execution boundary without relying on
223
+ ambiguous class names.
224
+ - A shared `RuntimeBoundaryProtocol` now fixes the common inspection surface
225
+ while letting each runtime keep its own execution methods.
216
226
  - Product readiness is machine-checkable through `product_readiness()`, which
217
227
  composes the architecture contract with exact artifact/docs/workflow evidence.
218
228
  - CI and release workflows now run frontend lint/typecheck/build gates plus the
219
- 7.7 product readiness score before a tag can be treated as release-safe.
229
+ 7.9 product readiness score before a tag can be treated as release-safe.
220
230
 
221
- Expected artifacts for 7.7.0 release must use exact filenames:
231
+ Expected artifacts for 7.9.0 release must use exact filenames:
222
232
 
223
- - `dist/ltcai-7.7.0-py3-none-any.whl`
224
- - `dist/ltcai-7.7.0.tar.gz`
225
- - `ltcai-7.7.0.tgz`
226
- - `dist/ltcai-7.7.0.vsix`
227
- - `src-tauri/target/release/bundle/dmg/Lattice AI_7.7.0_aarch64.dmg`
233
+ - `dist/ltcai-7.9.0-py3-none-any.whl`
234
+ - `dist/ltcai-7.9.0.tar.gz`
235
+ - `ltcai-7.9.0.tgz`
236
+ - `dist/ltcai-7.9.0.vsix`
237
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_7.9.0_aarch64.dmg`
228
238
 
229
- Do not upload `dist/*`. Package registry publishing remains owner-run.
239
+ Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
230
240
 
231
241
  See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
232
- strategic roadmap slices applied through 7.7.0 and the follow-up tracks.
242
+ strategic roadmap slices applied through 7.9.0 and the follow-up tracks.
233
243
 
234
244
  ## Known Limitations
235
245
 
@@ -246,6 +256,8 @@ strategic roadmap slices applied through 7.7.0 and the follow-up tracks.
246
256
 
247
257
  | Version | Theme |
248
258
  | --- | --- |
259
+ | 7.9.0 | Agent Runtime Boundary Hardening: explicit `SingleAgentRuntime`, compatibility alias preservation, injected rollback port, and release/readiness docs aligned to the product AgentRuntime facade |
260
+ | 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 |
249
261
  | 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 |
250
262
  | 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 |
251
263
  | 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 |
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,43 @@ 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.9.0] - 2026-06-23
10
+
11
+ ### Changed
12
+ - Added `SingleAgentRuntime` as the explicit name for the legacy single-agent
13
+ state machine while preserving `AgentRuntime` as a compatibility alias.
14
+ - Updated tool dispatch to build `SingleAgentRuntime` directly.
15
+ - Moved single-agent git rollback behind an injected `rollback_file` port owned
16
+ by `ToolDispatchService`, keeping shell execution out of the core state
17
+ machine.
18
+ - Added a shared `runtime-boundary/v1` descriptor so product and single-agent
19
+ runtime boundaries are machine-readable in config/tests.
20
+ - Added `RuntimeBoundaryProtocol` as the minimal shared inspection surface for
21
+ runtime-boundary-aware dependency injection.
22
+ - Updated architecture and product readiness targets to 7.9.0.
23
+
24
+ ## [7.8.0] - 2026-06-22
25
+
26
+ ### Changed
27
+ - Rebuilt Brain Chat Home around immediate conversation: chat purpose, starter
28
+ prompts, and the composer now occupy the first viewport.
29
+ - Collapsed source ingestion, readiness, proof, timeline, overview, model
30
+ continuity, and care controls behind one utility drawer.
31
+ - Kept workspace navigation visible on the default Brain surface.
32
+ - Hid default depth controls until the user intentionally travels deeper.
33
+ - Integrated the six post-7.7 UX drafts into the canonical Brain experience:
34
+ first-run value cards, stronger recommendation affordances, product-toned
35
+ Brain Home copy, and routed legacy Brain conversation entry points to the
36
+ canonical Brain Home surface.
37
+ - Removed obsolete Brain conversation and first-run guide components.
38
+ - Moved draft onboarding polish out of inline styles and into the shared design
39
+ stylesheet with responsive behavior and bilingual copy.
40
+ - Updated architecture and product readiness targets to 7.8.0.
41
+ - Refreshed 7.8.0 release screenshots, walkthrough video/GIF, and capture
42
+ notes under `output/release/v7.8.0/`.
43
+
7
44
  ## [7.7.0] - 2026-06-22
8
45
 
9
46
  > 7.7.0 marks the complete, finished product stage for Lattice AI.
@@ -95,5 +95,4 @@ For user-facing, API, runtime, release, or packaging changes, check:
95
95
  - `docs/LEGACY_COMPATIBILITY.md` when root compatibility files change
96
96
 
97
97
  Release/publish examples must use exact target-version filenames. Do not
98
- document wildcard upload commands such as `dist/*`.
99
-
98
+ document wildcard artifact upload commands.
@@ -2,7 +2,7 @@
2
2
 
3
3
  The Multi-Agent Runtime is the **orchestration layer** introduced in v2.0.0 and
4
4
  operationalized in v2.2.0. It sits
5
- *above* the v1.x single-agent state machine ([`AgentRuntime`](../latticeai/core/agent.py))
5
+ *above* the v1.x single-agent state machine ([`SingleAgentRuntime`](../latticeai/core/agent.py))
6
6
  and coordinates a pipeline of named **roles** that hand off work to one another,
7
7
  retry on a failing review, and emit a fully observable, replayable timeline.
8
8
 
@@ -34,20 +34,21 @@ objects durable and inspectable:
34
34
 
35
35
  ## How it relates to the v1 single-agent runtime
36
36
 
37
- v1.x shipped a single-agent state machine — `AgentRuntime` driving
37
+ v1.x shipped a single-agent state machine — `SingleAgentRuntime` driving
38
38
  `PLAN → EXECUTE → VERIFY → DONE` (with `ROLLBACK` / `FAILED` recovery paths) over an
39
- injected `AgentDeps` port. That runtime is unchanged.
39
+ injected `AgentDeps` port. The historical `AgentRuntime` import remains as a
40
+ compatibility alias.
40
41
 
41
42
  v2.0 adds the *orchestration* layer on top: instead of one agent looping through
42
43
  internal phases, the `MultiAgentOrchestrator` drives a **pipeline of distinct roles**
43
44
  (researcher, planner, executor, reviewer, release) that hand off to one another and
44
45
  can rewind on a failing review. The two layers are complementary — the v2
45
46
  orchestrator coordinates roles; an individual role's runner could itself be backed by
46
- the v1 `AgentRuntime` loop or an LLM, but that is an implementation choice behind the
47
+ the v1 `SingleAgentRuntime` loop or an LLM, but that is an implementation choice behind the
47
48
  injected runner port.
48
49
 
49
50
  > **Compatibility.** The Multi-Agent Runtime is purely additive. The v1
50
- > `AgentRuntime` state machine and its `/agent` endpoints are untouched, and the v2
51
+ > `SingleAgentRuntime` state machine and its `/agent` endpoints are untouched, and the v2
51
52
  > API is namespaced under `/agents` (plural) so it never collides with the existing
52
53
  > single-agent `/agent` routes. Existing v1.x data is preserved; new runs are appended
53
54
  > to workspace state and the Knowledge Graph alongside it.
@@ -141,8 +141,9 @@ portable JSON representation (definition only — no run history or scope).
141
141
 
142
142
  ### 1.3 Multi-Agent Runtime 2.0 (`latticeai.core.multi_agent`)
143
143
 
144
- v1.x shipped a single-agent state machine (`latticeai.core.agent.AgentRuntime`:
145
- PLAN → EXECUTE → VERIFY → DONE). v2.0 adds the **orchestration** layer above it:
144
+ v1.x shipped a single-agent state machine (`latticeai.core.agent.SingleAgentRuntime`;
145
+ `latticeai.core.agent.AgentRuntime` remains a compatibility alias) that drives
146
+ PLAN → EXECUTE → VERIFY → DONE. v2.0 adds the **orchestration** layer above it:
146
147
  a pipeline of named roles that hand off to one another, retry on a failing
147
148
  review, and emit a structured timeline that drops straight into the Workspace
148
149
  timeline / Knowledge Graph.
@@ -88,7 +88,9 @@ export default function App() {
88
88
  </React.Suspense>
89
89
  </BrainShell>
90
90
  ) : (
91
- <BrainHome brainState={brainState} intensity={intensity} onBrainChange={setBrain} />
91
+ <BrainShell active="brain">
92
+ <BrainHome brainState={brainState} intensity={intensity} onBrainChange={setBrain} />
93
+ </BrainShell>
92
94
  )}
93
95
  </div>
94
96
  );
@@ -3,7 +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, Shield, Zap, Cpu } from "lucide-react";
6
+ import { ArrowRight, Cpu, Shield, Zap } from "lucide-react";
7
7
  import {
8
8
  AnalysisScreen,
9
9
  InstallScreen,
@@ -107,25 +107,26 @@ export function ProductFlow({ onComplete }: { onComplete: () => void }) {
107
107
 
108
108
  function WakeBrainScreen({ onWake, onUseExisting }: { onWake: () => void; onUseExisting: () => void }) {
109
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
+ ];
110
115
  return (
111
116
  <section className="ritual-wake" aria-label={t(language, "flow.wake.aria")}>
112
117
  <div className="ritual-title">{t(language, "flow.wake.title")}</div>
113
118
  <div className="ritual-subtitle">{t(language, "flow.wake.body")}</div>
114
119
 
115
- {/* 직관적 가치 제안 - 첫눈에 쓰고 싶게 */}
116
- <div className="ritual-value-grid" style={{display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "0.6rem", margin: "1.25rem auto", maxWidth: "620px"}}>
117
- <div style={{border: "1px solid hsl(var(--border)/0.5)", borderRadius: "12px", padding: "0.7rem 0.8rem", background: "hsl(var(--surface))", textAlign: "left"}}>
118
- <div style={{display: "flex", alignItems: "center", gap: "0.4rem", color: "hsl(var(--brain-core))", fontSize: "0.75rem", fontWeight: 700}}><Shield size={14}/> 완전 로컬</div>
119
- <div style={{fontSize: "0.85rem", marginTop: "0.2rem", fontWeight: 600}}>모든 지식과 대화가 이 컴퓨터에만</div>
120
- </div>
121
- <div style={{border: "1px solid hsl(var(--border)/0.5)", borderRadius: "12px", padding: "0.7rem 0.8rem", background: "hsl(var(--surface))", textAlign: "left"}}>
122
- <div style={{display: "flex", alignItems: "center", gap: "0.4rem", color: "hsl(var(--brain-core))", fontSize: "0.75rem", fontWeight: 700}}><Zap size={14}/> 직관적 즉시</div>
123
- <div style={{fontSize: "0.85rem", marginTop: "0.2rem", fontWeight: 600}}>복잡한 설정 없이 3단계로 바로 시작</div>
124
- </div>
125
- <div style={{border: "1px solid hsl(var(--border)/0.5)", borderRadius: "12px", padding: "0.7rem 0.8rem", background: "hsl(var(--surface))", textAlign: "left"}}>
126
- <div style={{display: "flex", alignItems: "center", gap: "0.4rem", color: "hsl(var(--brain-core))", fontSize: "0.75rem", fontWeight: 700}}><Cpu size={14}/> 영원한 Brain</div>
127
- <div style={{fontSize: "0.85rem", marginTop: "0.2rem", fontWeight: 600}}>모델 바꿔도 지식은 그대로 영원히</div>
128
- </div>
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
+ })}
129
130
  </div>
130
131
 
131
132
  <div className="ritual-wake-plan" aria-label={t(language, "flow.wake.plan.aria")}>
@@ -143,20 +144,15 @@ function WakeBrainScreen({ onWake, onUseExisting }: { onWake: () => void; onUseE
143
144
  </div>
144
145
  </div>
145
146
 
146
- <div className="ritual-button-row" style={{marginTop: "1.25rem"}}>
147
- <button
148
- type="button"
149
- className="ritual-full-button"
150
- onClick={onWake}
151
- style={{fontSize: "1.05rem", padding: "0.85rem 2.2rem", display: "inline-flex", alignItems: "center", gap: "0.5rem"}}
152
- >
147
+ <div className="ritual-button-row ritual-button-row-primary">
148
+ <button type="button" className="ritual-full-button ritual-full-button-primary" onClick={onWake}>
153
149
  {t(language, "flow.wake.primary")} <ArrowRight size={18} />
154
150
  </button>
155
151
  <button type="button" className="ritual-secondary-button" onClick={onUseExisting}>
156
152
  {t(language, "flow.wake.existing")}
157
153
  </button>
158
154
  </div>
159
- <div style={{marginTop: "0.8rem", fontSize: "0.72rem", color: "hsl(var(--fg-muted))"}}>평균 2분 안에 첫 대화 시작 · 완전 무료 · 로컬 전용</div>
155
+ <div className="ritual-start-note">{t(language, "flow.wake.startNote")}</div>
160
156
  </section>
161
157
  );
162
158
  }
@@ -2,7 +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 { Star, Zap, Gauge, ArrowRight } from "lucide-react";
5
+ import { ArrowRight, Gauge, Star, Zap } from "lucide-react";
6
6
 
7
7
  export function RecommendationScreen({
8
8
  recommendations,
@@ -24,9 +24,9 @@ export function RecommendationScreen({
24
24
 
25
25
  <div className="ritual-model-list">
26
26
  {items[0]?.supported ? (
27
- <div className="ritual-primary-cta" style={{marginBottom: "1rem"}}>
28
- <Button onClick={() => onSelect(items[0])} className="ritual-primary-model-button" style={{display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "1rem"}}>
29
- {t(language, "flow.recommend.primary")} <ArrowRight size={16}/>
27
+ <div className="ritual-primary-cta">
28
+ <Button onClick={() => onSelect(items[0])} className="ritual-primary-model-button">
29
+ {t(language, "flow.recommend.primary")} <ArrowRight size={16} />
30
30
  </Button>
31
31
  <div className="ritual-time-estimate ritual-primary-note">{primaryNote(items[0], language)}</div>
32
32
  <div className="ritual-muted-hint ritual-next-hint">{t(language, "flow.recommend.nextHint")}</div>
@@ -40,24 +40,23 @@ export function RecommendationScreen({
40
40
  className="ritual-model-card"
41
41
  onClick={() => model.supported && onSelect(model)}
42
42
  disabled={!model.supported}
43
- style={{display: "flex", flexDirection: "column", alignItems: "flex-start", gap: "0.3rem"}}
44
43
  >
45
- <div style={{display: "flex", alignItems: "center", gap: "0.4rem", width: "100%"}}>
46
- <Icon size={16} style={{color: "hsl(var(--brain-core))"}} />
47
- <div className="role" style={{marginBottom: 0}}>{rankLabel(model.role, index, language)}</div>
44
+ <div className="ritual-model-heading">
45
+ <Icon size={16} />
46
+ <div className="role">{rankLabel(model.role, index, language)}</div>
48
47
  </div>
49
- <div className="name" style={{fontSize: "1.15rem"}}>{model.shortName}</div>
50
- <div className="reason" style={{fontSize: "0.9rem"}}>
48
+ <div className="name">{model.shortName}</div>
49
+ <div className="reason">
51
50
  {model.reason} · {model.size || t(language, "flow.recommend.sizeReady")}
52
51
  {comparisonLabel(model.role, language) ? (
53
52
  <span className="ritual-model-comparison"> {comparisonLabel(model.role, language)}</span>
54
53
  ) : null}
55
54
  </div>
56
- <div className="ritual-model-stats" style={{marginTop: "0.1rem"}}>
55
+ <div className="ritual-model-stats">
57
56
  <span className="ritual-time-estimate">{timeEstimate(model, language)}</span>
58
57
  </div>
59
58
  {model.supported ? (
60
- <span className="ritual-model-choose" style={{marginTop: "0.2rem", fontWeight: 700}}>{t(language, "flow.recommend.choose")} →</span>
59
+ <span className="ritual-model-choose">{t(language, "flow.recommend.choose")} <ArrowRight size={14} /></span>
61
60
  ) : (
62
61
  <div className="ritual-model-warning">{t(language, "flow.recommend.unsupported")}</div>
63
62
  )}