ltcai 10.8.0 → 10.10.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 (94) hide show
  1. package/README.md +44 -63
  2. package/docs/CHANGELOG.md +69 -237
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +1 -1
  7. package/docs/TRUST_MODEL.md +1 -1
  8. package/docs/WHY_LATTICE.md +1 -1
  9. package/docs/kg-schema.md +1 -1
  10. package/lattice_brain/__init__.py +1 -1
  11. package/lattice_brain/runtime/multi_agent.py +1 -1
  12. package/latticeai/__init__.py +1 -1
  13. package/latticeai/api/chat.py +9 -6
  14. package/latticeai/api/chat_agent_http.py +2 -1
  15. package/latticeai/api/chat_history.py +4 -2
  16. package/latticeai/api/chat_intents.py +14 -14
  17. package/latticeai/api/knowledge_graph.py +5 -4
  18. package/latticeai/api/local_files.py +25 -15
  19. package/latticeai/api/mcp.py +15 -11
  20. package/latticeai/api/memory.py +2 -1
  21. package/latticeai/api/models.py +39 -24
  22. package/latticeai/api/network_boundary.py +9 -4
  23. package/latticeai/api/portability.py +27 -19
  24. package/latticeai/api/project_sessions.py +7 -5
  25. package/latticeai/api/review_queue.py +12 -7
  26. package/latticeai/api/setup.py +10 -11
  27. package/latticeai/api/static_routes.py +62 -46
  28. package/latticeai/api/tools.py +7 -6
  29. package/latticeai/core/legacy_compatibility.py +1 -1
  30. package/latticeai/core/marketplace.py +1 -1
  31. package/latticeai/core/mcp_registry.py +20 -4
  32. package/latticeai/core/messages.py +222 -0
  33. package/latticeai/core/workspace_os_constants.py +1 -1
  34. package/latticeai/integrations/telegram_bot.py +20 -18
  35. package/latticeai/services/architecture_readiness.py +1 -1
  36. package/latticeai/services/model_loading.py +63 -27
  37. package/latticeai/services/product_readiness.py +5 -3
  38. package/package.json +3 -2
  39. package/scripts/check_current_release_docs.mjs +4 -2
  40. package/scripts/check_server_i18n.mjs +96 -0
  41. package/scripts/release_screen_claims.json +31 -8
  42. package/src-tauri/Cargo.lock +1 -1
  43. package/src-tauri/Cargo.toml +1 -1
  44. package/src-tauri/tauri.conf.json +1 -1
  45. package/static/app/asset-manifest.json +37 -37
  46. package/static/app/assets/{Act-CbQNsFgc.js → Act-CC8SpNRm.js} +1 -1
  47. package/static/app/assets/{AdminConsole-Bs8SR8fE.js → AdminConsole-DGIY_Tb_.js} +1 -1
  48. package/static/app/assets/{Brain-BZIPsZlH.js → Brain-BDSC2Mol.js} +2 -2
  49. package/static/app/assets/BrainHome-BYgYp3ON.js +2 -0
  50. package/static/app/assets/BrainSignals-DYwVFmcO.js +1 -0
  51. package/static/app/assets/Capture-ClcKLsmI.js +1 -0
  52. package/static/app/assets/{CommandPalette-Dq_MmPBl.js → CommandPalette-DpwbyF1S.js} +1 -1
  53. package/static/app/assets/Library-D8VNtffM.js +1 -0
  54. package/static/app/assets/LivingBrain-CeWwc0NN.js +1 -0
  55. package/static/app/assets/ProductFlow-CS5CCM4t.js +1 -0
  56. package/static/app/assets/{ReviewCard-Be7E7X18.js → ReviewCard-Bap4yPfI.js} +1 -1
  57. package/static/app/assets/System-odPxU1YL.js +1 -0
  58. package/static/app/assets/arrow-left-J47Yde1U.js +1 -0
  59. package/static/app/assets/{bot-BR0eoeXY.js → bot-CmvhqTeF.js} +1 -1
  60. package/static/app/assets/brain-DLT9uuGq.js +1 -0
  61. package/static/app/assets/{button-U1nU7xX4.js → button-DyppYhFH.js} +1 -1
  62. package/static/app/assets/{circle-pause-DG5KHjDL.js → circle-pause-Bm5z7EBI.js} +1 -1
  63. package/static/app/assets/{circle-play-Chhcuq90.js → circle-play-GjKdH0Fg.js} +1 -1
  64. package/static/app/assets/{cpu-pkOSlT9h.js → cpu-CuVMv-F5.js} +1 -1
  65. package/static/app/assets/{download-CSRwz923.js → download-C9_946tf.js} +1 -1
  66. package/static/app/assets/{folder-open-DiMJ7W_7.js → folder-open-B3QKdxib.js} +1 -1
  67. package/static/app/assets/{hard-drive-iyLPAPdp.js → hard-drive-BwW9Hx4r.js} +1 -1
  68. package/static/app/assets/{index-_ldE9TAX.js → index-BrUQ-bF8.js} +3 -3
  69. package/static/app/assets/index-CYb18LtP.css +2 -0
  70. package/static/app/assets/{input-e_r2hFAY.js → input-Db2Hw2VH.js} +1 -1
  71. package/static/app/assets/{permissionCopy-9uOHktz3.js → permissionCopy-BpbIHRio.js} +1 -1
  72. package/static/app/assets/primitives-4B_Ynf7r.js +1 -0
  73. package/static/app/assets/search-YH-7-x5Y.js +1 -0
  74. package/static/app/assets/{share-2-DLDJJKmI.js → share-2-BgvRTDPJ.js} +1 -1
  75. package/static/app/assets/{shield-alert-BTtE-2EZ.js → shield-alert-DWFLyykG.js} +1 -1
  76. package/static/app/assets/{textarea-Bbzkcgqe.js → textarea-Bk4vEqzT.js} +1 -1
  77. package/static/app/assets/{useFocusTrap-DJzQd-Za.js → useFocusTrap-CGRXEg_p.js} +1 -1
  78. package/static/app/assets/{useQuery-6R_tqHRe.js → useQuery-CdPzp3_U.js} +1 -1
  79. package/static/app/assets/{utils-XDsjcrhS.js → utils-orU8igel.js} +3 -3
  80. package/static/app/assets/{workspace-CwrG8LHq.js → workspace-Brj2Ylb2.js} +1 -1
  81. package/static/app/index.html +4 -4
  82. package/static/sw.js +1 -1
  83. package/static/app/assets/BrainHome-BaH5MDce.js +0 -2
  84. package/static/app/assets/BrainSignals-aDt-nSsW.js +0 -1
  85. package/static/app/assets/Capture-DDv940Bv.js +0 -1
  86. package/static/app/assets/Library-BkShbqmN.js +0 -1
  87. package/static/app/assets/LivingBrain-CXb8094H.js +0 -1
  88. package/static/app/assets/ProductFlow-BaiqFWLO.js +0 -1
  89. package/static/app/assets/System-DCstbTxC.js +0 -1
  90. package/static/app/assets/arrow-left-DC9Oquhs.js +0 -1
  91. package/static/app/assets/brain-BmWa1wea.js +0 -1
  92. package/static/app/assets/index-BZRvGOM2.css +0 -2
  93. package/static/app/assets/primitives-CnEAOmg2.js +0 -1
  94. package/static/app/assets/search-veep4n6f.js +0 -1
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![CI Status](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
12
12
  [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
13
13
 
14
- ![v10.8.0 Living Brain walkthrough](output/release/v10.8.0/gifs/v10.8.0-living-brain-walkthrough.gif)
14
+ ![v10.10.0 Living Brain walkthrough](output/release/v10.10.0/gifs/v10.10.0-living-brain-walkthrough.gif)
15
15
 
16
16
  Chat, files, folders, notes, and web pages all flow into one durable knowledge
17
17
  graph on your computer. Any model — local MLX or cloud — can speak with that
@@ -24,10 +24,10 @@ memory. Nothing leaves your machine without explicit consent.
24
24
 
25
25
  | | |
26
26
  | --- | --- |
27
- | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.8.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.8.0/screenshots/05-memory-graph.png) |
28
- | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.8.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.8.0/screenshots/12-review-center.png) |
29
- | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.8.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.8.0/screenshots/10-admin-console.png) |
30
- | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v10.8.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way ![Settings](output/release/v10.8.0/screenshots/08-system.png) |
27
+ | **Chat with a Brain that remembers** — every conversation grows durable, source-linked memory ![Brain Chat](output/release/v10.10.0/screenshots/04-brain-chat-home.png) | **See how knowledge connects** — a real relationship graph, not a file list ![Memory Graph](output/release/v10.10.0/screenshots/05-memory-graph.png) |
28
+ | **Capture anything** — files, whole folders, notes, screenshots, web pages ![Capture](output/release/v10.10.0/screenshots/06-capture.png) | **Automate with review** — agent changes become proposals you approve first ![Review Center](output/release/v10.10.0/screenshots/12-review-center.png) |
29
+ | **Pick a model in one click** — recommended local models for your hardware ![Recommended Models](output/release/v10.10.0/screenshots/02-recommended-models.png) | **Stay in control** — audit, roles, retention in a separate admin surface ![Admin Console](output/release/v10.10.0/screenshots/10-admin-console.png) |
30
+ | **Watch a file become memory** — three named steps, not a pipeline diagram ![Material to memory](output/release/v10.10.0/screenshots/11-knowledge-journey.png) | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way ![Settings](output/release/v10.10.0/screenshots/08-system.png) |
31
31
 
32
32
  ## Why Lattice AI
33
33
 
@@ -58,63 +58,52 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
58
58
 
59
59
  | | | |
60
60
  | --- | --- | --- |
61
- | ![Login](output/release/v10.8.0/screenshots/01-login.png) | ![Model install](output/release/v10.8.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.8.0/screenshots/07-model-library.png) |
61
+ | ![Login](output/release/v10.10.0/screenshots/01-login.png) | ![Model install](output/release/v10.10.0/screenshots/03-install-load-progress.png) | ![Model library](output/release/v10.10.0/screenshots/07-model-library.png) |
62
62
 
63
63
  Screenshot index and capture notes:
64
- [output/release/v10.8.0/SCREENSHOT_INDEX.md](output/release/v10.8.0/SCREENSHOT_INDEX.md)
64
+ [output/release/v10.10.0/SCREENSHOT_INDEX.md](output/release/v10.10.0/SCREENSHOT_INDEX.md)
65
65
 
66
66
  ## Current Release
67
67
 
68
- The current release is **10.8.0 — Within Reach**:
69
-
70
- 10.7.0 rearranged all twelve screens. 10.8.0 is about the things that were
71
- already there but out of reach: a button below the fold, a message in a
72
- language you did not choose, a file a small model nearly produced.
73
-
74
- - **The first three screens fit on the screen.** Onboarding rendered a 390px
75
- decorative Brain above *every* step, so on a 1440×900 display the login
76
- form, the recommended model and the install progress all began below the
77
- fold — the first thing the product asked a new person to do was scroll. The
78
- organism is a hero on the welcome step and a 104px mark after it; the
79
- welcome screen itself went from 1175px of content to 770px, so its primary
80
- button is visible without scrolling.
81
- - **One language per screen, including the ones the server writes.** API
82
- messages were literals at the raise site, written in whichever language the
83
- endpoint's author was thinking in — Korean from `auth.py`, English from
84
- `browser.py`. `latticeai/core/messages.py` is a catalog with both, resolved
85
- from `X-Lattice-Language` (falling back to `Accept-Language`); the browser
86
- extension, which showed English and Korean in the same popup, has one too.
87
- `tests/unit/test_server_messages.py` fails on a message that exists in only
88
- one language, and on a router that reverts to a hardcoded literal.
89
- - **A small model's near-miss is no longer thrown away.** File generation
90
- picked the *longest* rejected reply to repair, so a 900-character apology
91
- beat a truncated-but-real HTML document; it now scores candidates by how
92
- close they are to being a file. A byte-identical repeated reply buys one
93
- extra attempt with a prompt that names the repetition. Prose file types
94
- (`.md`, `.txt`) had no validation at all and would save "Sure! Here is the
95
- document:" as the document.
96
- - **Re-indexing costs what changed.** The incremental vector rebuild
97
- materialised every node and chunk in memory and asked one `SELECT` per item
98
- whether it had changed. It streams now, with a single prefetched hash map —
99
- and a settled index performs zero embeddings, asserted rather than assumed.
100
- - **More ground under the frontend.** Statement coverage 47.35% → 52.26%,
101
- 424 → 504 tests, including the app shell (`App.tsx`, previously 0%), the
102
- admin console (0%), the folder picker (2.7%) and the API client.
103
- - **Evidence bound to this build.** `output/release/v10.8.0/` holds the twelve
104
- capture screens, walkthrough gif/webm, and the asset-manifest / mock-server
105
- fingerprints that lint re-checks before merge.
106
- - **Exact artifact names only.** Publish paths list `dist/ltcai-10.8.0-*` and
107
- `ltcai-10.8.0.tgz` — never `dist/*`.
68
+ The current release is **10.10.0 — Quiet Station**:
69
+
70
+ The Brain chat home used to greet you with everything at once — a stats
71
+ sentence, six capture chips, a model banner, an autonomy strip, and two
72
+ shelves stacked under the composer. 10.10.0 rebuilds it around one idea: the
73
+ canvas holds the composer; everything else blooms on demand.
74
+
75
+ - **Stats became a badge.** "기억 13 · 주제 299" sits as a chip beside the
76
+ greeting; hovering (or clicking) it opens a summary popover with a small
77
+ memory/topics/links graph and the memory-map shortcut. The sentence left the
78
+ reading line.
79
+ - **Capture folds behind one +.** 문서 · 이미지 · 파일 · 폴더 · 노트 · 웹 live
80
+ in the composer's Add menu — hover opens it, click pins it, Escape and
81
+ outside-click close it, and an in-flight upload keeps it open.
82
+ - **The model banner became a status pill.** "모델 준비 필요" now sits on the
83
+ hero's right edge with the one accented CTA; the full sentence rides on the
84
+ tooltip and the accessible name.
85
+ - **The shelves became a dock.** 대화 · 통계 · 기억 지도 sit on a quiet rail —
86
+ a left column on desktop, a row above the fold elsewhere — and open a
87
+ focus-trapped drawer over the screen instead of stacking cards under it.
88
+ - **Borders got quieter, colour got scarcer.** Cards float on soft shadow
89
+ instead of rules, and the warm accent appears exactly twice: the send
90
+ button and the model CTA.
91
+ - **The frontend test floor is 100%.** Every statement, branch, function and
92
+ line under `frontend/src` is covered, `vitest` enforces the thresholds, and
93
+ CI runs the coverage gate — a claim the suite fails loudly if it drifts.
94
+ - **Release history starts at 9.0.0.** The 8.x notes left the tree; README,
95
+ the notes index, RELEASE.md and the changelog all begin the public story at
96
+ 9.0.0.
108
97
 
109
98
  Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
110
99
 
111
- Expected artifacts for 10.8.0 release must use exact filenames:
100
+ Expected artifacts for 10.10.0 release must use exact filenames:
112
101
 
113
- - `dist/ltcai-10.8.0-py3-none-any.whl`
114
- - `dist/ltcai-10.8.0.tar.gz`
115
- - `ltcai-10.8.0.tgz`
116
- - `dist/ltcai-10.8.0.vsix`
117
- - `src-tauri/target/release/bundle/dmg/Lattice AI_10.8.0_aarch64.dmg`
102
+ - `dist/ltcai-10.10.0-py3-none-any.whl`
103
+ - `dist/ltcai-10.10.0.tar.gz`
104
+ - `ltcai-10.10.0.tgz`
105
+ - `dist/ltcai-10.10.0.vsix`
106
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_10.10.0_aarch64.dmg`
118
107
 
119
108
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
120
109
 
@@ -149,6 +138,8 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
149
138
 
150
139
  | Version | Theme |
151
140
  | --- | --- |
141
+ | 10.10.0 | Quiet Station |
142
+ | 10.9.0 | Never Blocks |
152
143
  | 10.8.0 | Within Reach |
153
144
  | 10.7.0 | Plain Surface |
154
145
  | 10.6.4 | Loud Limits |
@@ -183,16 +174,6 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
183
174
  | 9.2.0 | Model-Agnostic File Generation |
184
175
  | 9.1.0 | Code Review Completion & Fail-Closed Runtime |
185
176
  | 9.0.0 | Code Review Closure & Runtime Cleanup |
186
- | 8.9.0 | Scoped Memory & Tool Policy Hardening |
187
- | 8.8.0 | Brain Core Extraction & Recall Proof Hardening |
188
- | 8.7.0 | Runtime State Hygiene & Release Evidence Refresh |
189
- | 8.6.0 | Desktop Capture & Navigation Reliability |
190
- | 8.5.0 | Tool Registry Readiness & Config DI |
191
- | 8.4.0 | Action-Aware Brain Chat |
192
- | 8.3.0 | Orchestrated Brain Readiness |
193
- | 8.2.0 | Brain Brief |
194
- | 8.1.0 | Intuitive Brain Home |
195
- | 8.0.0 | Runtime Architecture Contract |
196
177
 
197
178
  Per-release details: [RELEASE_NOTES.md](RELEASE_NOTES.md)
198
179
 
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,75 @@ 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
+ ## [10.10.0] - 2026-08-06
8
+
9
+ ### Changed
10
+ - Brain 대화 홈 "Quiet Station" 재설계 — 기억/주제 통계가 인사말 줄의 문장에서
11
+ 호버·클릭 팝오버(요약 그래프 + 기억 지도 바로가기)를 여는 배지로, 캡처 칩
12
+ 6개(문서/이미지/파일/폴더/노트/웹)가 컴포저의 `+ 추가` 접이식 메뉴로, 모델
13
+ 준비 배너가 히어로 우측 상태 필로, 하단 서랍 2개(지난 대화 · Brain이 정리한
14
+ 내용)가 좌측 독 레일(대화 · 통계 · 기억 지도)의 포커스 트랩 서랍으로
15
+ 이동했습니다. 카드 보더는 소프트 섀도로 대체되고, 액센트 컬러는 보내기
16
+ 버튼과 모델 CTA 두 곳에만 남습니다.
17
+ - 공개 릴리스 히스토리가 9.0.0부터 시작합니다 — 8.x 릴리스 노트 9개 파일을
18
+ 제거하고 README/RELEASE_NOTES.md/RELEASE.md/CHANGELOG이 같은 경계를
19
+ 서술합니다.
20
+
21
+ ### Fixed
22
+ - 히어로의 `overflow: clip`이 새 통계 팝오버를 잘라내던 문제(클립 제거 —
23
+ 헤일로는 `--aura-blur`로 이미 조여져 있어 가둘 것이 없습니다).
24
+ - 포털 서랍 내부에서 `.brain-care-panel` 계열 중첩 그리드 패널의 행이 2px로
25
+ 붕괴해 버튼이 클릭 불가능하던 문제 — 서랍 본문을 flex 컬럼으로 전환.
26
+ - 호버로 열린 배지/+ 메뉴를 곧바로 이은 클릭이 도로 닫아버리던 경합 —
27
+ 350ms 열림 디바운스.
28
+ - 새 + 버튼 aria-label의 "메뉴 열기" 문구가 셸 메뉴 버튼과 role 매칭
29
+ 충돌하던 문제.
30
+
31
+ ### Added
32
+ - 프론트엔드 커버리지 100% — `frontend/src` 전체 statements/branches/
33
+ functions/lines, vitest thresholds 100, CI 커버리지 게이트.
34
+ - `scripts/release_screen_claims.json`의 10.10.0 항목
35
+ (04-brain-chat-home, min 3%).
36
+ - 비주얼 스펙이 새 홈 계약(+ 메뉴 접힘, 독 서랍, 배지 팝오버, 글로우 기하)을
37
+ 검증합니다.
38
+
39
+ ## [10.9.0] - 2026-08-05
40
+
41
+ ### Fixed
42
+ - 모델 내려받기(`ollama pull`, Hugging Face), 엔진 설치, MCP `pip`/`npm` 설치,
43
+ `/local/sysinfo` 호스트 측정이 `async def` 안에서 그대로 실행되어 실행 중
44
+ 서버 전체가 다른 요청을 처리하지 못하던 문제 — 전부 `asyncio.to_thread`로
45
+ 이관. 최악의 경우 15분(다운로드 타임아웃)간 채팅·`/health`·UI가 모두 멈췄습니다.
46
+ - Telegram 브리지의 사진/문서 업로드가 파일을 이벤트 루프에서 읽던 문제.
47
+ - 캡처 필의 키보드 포커스 테두리가 150ms에 걸쳐 서서히 나타나, 포커스가 닿는
48
+ 순간에는 여전히 idle 색이던 문제(`home-simple.css` transition에서
49
+ `border-color` 제거).
50
+ - 답변이 끝난 뒤에도 Brain 유기체가 "생각 중"에 머물던 문제 — 회상 펄스가
51
+ 건 900ms 타이머가 스트림 종료 시 취소되지 않았습니다.
52
+ - 같은 틱에 두 번 전송될 때 `stopStreaming`이 중단 핸들을 잃던 문제.
53
+ - 환영 화면이 747px 뷰포트에서 770px이라 마지막 안내 문장이 접힌 부분 아래에
54
+ 있던 문제(`@media (max-height: 820px)` 단계 추가).
55
+
56
+ ### Added
57
+ - `tests/unit/test_event_loop_not_blocked.py` — 핸들러 실행 중 티커 코루틴을
58
+ 돌려 이벤트 루프가 실제로 제어권을 받았는지 측정하는 회귀 테스트.
59
+ - `frontend/src/test/fakeChatStream.ts` — 프레임이 시간에 걸쳐 도착하는 가짜
60
+ SSE 하네스. `useBrainChat.test.tsx` 11개 시나리오.
61
+ - `scripts/check_server_i18n.mjs` — 이관 완료 선언된 라우터에서 문자열 리터럴
62
+ detail을 금지하는 lint 게이트(`npm run lint`에 편입).
63
+ - `tests/visual/v3.spec.js` — 환영 화면 fold 테스트, 캡처 필 포커스 테두리.
64
+ - ruff `ASYNC210/220/221/222/230/251` 규칙.
65
+
66
+ ### Changed
67
+ - 서버 메시지 카탈로그를 14개 라우터로 확대(chat, chat_history, chat_intents,
68
+ memory, knowledge_graph, local_files, portability, review_queue,
69
+ project_sessions, network_boundary, models, tools, mcp, setup) — 총 17개.
70
+ `MIGRATED_ROUTERS`와 lint 게이트 목록이 어긋나면 테스트가 실패합니다.
71
+ - `latticeai/services/model_loading.py`: 엔진 준비/다운로드 블록을
72
+ `_prepare_model_sources()`로 추출(워커 스레드에서 실행 가능한 동기 함수).
73
+ - `latticeai/api/static_routes.py`: 호스트 측정을 `_probe_host_capacity()`로
74
+ 추출.
75
+
7
76
  ## [10.8.0] - 2026-08-04
8
77
 
9
78
  ### Fixed
@@ -1596,240 +1665,3 @@ Response to a full code review of 10.1.1 (71/100). All twelve findings.
1596
1665
  bridge notification, no-model, single-answer, direct-file, and agent-file
1597
1666
  response paths out of the main `/chat` handler, with regression coverage for
1598
1667
  the shared fast-path epilogue.
1599
-
1600
- ## [8.9.0] - 2026-07-06
1601
-
1602
- ### Added
1603
- - Added authenticated user/workspace scoping to durable conversation history
1604
- reads and deletes.
1605
- - Added workspace-aware Knowledge Graph search, traversal, relationship, node,
1606
- and chat-context reads.
1607
- - Added direct HTTP/MCP Tool API policy enforcement for registry-governed tools.
1608
- - Added permission approval queue hashing and atomic writes so raw tokens are
1609
- not persisted at rest.
1610
- - Added confirmation-token guarded installer/process command plans with redacted
1611
- local process audit events.
1612
- - Added regression coverage for scoped history, graph scoping, tool policy
1613
- gates, AgentRuntime approval semantics, permission tokens, session TTL
1614
- injection, and model-download runtime config.
1615
-
1616
- ### Changed
1617
- - AgentRuntime now requires explicit human approval for non-auto-approved plans
1618
- and rolls back git-governed tool results even when `success` is omitted.
1619
- - Model download consent now uses configured runtime state instead of direct
1620
- environment-variable reads.
1621
- - Frontend API base logic, CSS token/base rules, and i18n literal checks were
1622
- split into smaller maintainability seams.
1623
- - Version bumped to 8.9.0 across Python, npm, VS Code extension, Tauri, static
1624
- metadata, readiness gates, release notes, and current-release documentation.
1625
- - Documentation now states that SQLite is the live local Brain store; Postgres
1626
- remains optional scale/migration tooling.
1627
-
1628
- ### Fixed
1629
- - Conversation store migration now creates the workspace index only after the
1630
- scope columns exist.
1631
- - Direct `write_file`/`edit_file` policy lookup now blocks system write
1632
- prefixes consistently with local-file approvals.
1633
- - Workspace selection clearing now removes the persisted workspace id.
1634
- - Tauri/local API fetches now include credentials for localhost backend
1635
- sessions.
1636
-
1637
- ## [8.8.0] - 2026-07-06
1638
-
1639
- ### Added
1640
- - Added Brain Core isolation coverage that keeps `lattice_brain` independent of
1641
- product-package imports.
1642
- - Added recall proof quality gates for matched terms, confidence labels, and
1643
- lexical evidence filtering.
1644
- - Added Brain Chat conversation controls for new/resume/delete, stop,
1645
- regenerate, copy, and richer ingestion progress.
1646
-
1647
- ### Changed
1648
- - Removed internal-only Brain shim layers: flat pre-graph modules,
1649
- `latticeai.brain`, and `latticeai.services.agent_runtime`.
1650
- - Updated legacy compatibility reporting so removed shim layers are tracked
1651
- separately from remaining external root shims.
1652
- - Hardened AgentRuntime boundary handling for unknown roles, legacy run
1653
- contracts, and persisted retry budgets.
1654
- - Version bumped to 8.8.0 across Python, npm, VS Code extension, Tauri, static
1655
- metadata, readiness gates, release notes, and current-release documentation.
1656
-
1657
- ### Fixed
1658
- - File ingestion now rejects directory paths before dispatching to document
1659
- ingestion.
1660
- - Memory recall filters low-evidence noise when stronger lexical matches are
1661
- present and surfaces explainable citation confidence.
1662
-
1663
- ## [8.7.0] - 2026-07-05
1664
-
1665
- ### Added
1666
- - Added unit test coverage for model-runtime `STATE` source-of-truth behavior
1667
- and deprecation warnings on legacy global synchronization.
1668
- - Added refreshed 8.7.0 screenshots, walkthrough GIF/WebM, and capture notes
1669
- under `output/release/v8.7.0/`.
1670
-
1671
- ### Changed
1672
- - Reduced internal reliance on bare module globals in
1673
- `latticeai/services/model_runtime.py`; implementation logic now consistently
1674
- reads from the `ModelRuntimeState` instance while globals remain as a legacy
1675
- compatibility surface.
1676
- - Added `DeprecationWarning` to `sync_to_module_globals()` while preserving the
1677
- external shim behavior.
1678
- - Removed a loose `as any` cast from `frontend/src/pages/Act.tsx`.
1679
- - Version bumped to 8.7.0 across Python, npm, VS Code extension, Tauri, static
1680
- metadata, README evidence links, release notes, and current-release
1681
- documentation.
1682
-
1683
- ### Fixed
1684
- - Internal model-runtime functions now prefer the typed state object per the
1685
- project preference for composition over global mutable state.
1686
-
1687
- ## [8.6.0] - 2026-07-05
1688
-
1689
- ### Added
1690
- - Added Tauri localhost remote capability coverage so the desktop app can keep
1691
- using local IPC commands after navigating to the FastAPI-served `/app`.
1692
- - Added a regression trust gate for the Tauri localhost capability.
1693
-
1694
- ### Changed
1695
- - Improved the Capture source flow: desktop users can choose a folder with the
1696
- native folder picker and immediately scan/connect it, while web page capture
1697
- now supports paste, Enter-to-save, and `https://` normalization for bare
1698
- domains.
1699
- - Updated Visual Smoke coverage for the new Brain shell sidebar and admin
1700
- console entry flow.
1701
- - Version bumped to 8.6.0 across Python, npm, VS Code extension, Tauri, static
1702
- metadata, readiness gates, and current-release documentation.
1703
-
1704
- ### Fixed
1705
- - Fixed native folder selection from the Tauri production app's localhost
1706
- webview and added visible fallback feedback when the picker is unavailable.
1707
- - Removed negative letter spacing from updated frontend shell styling.
1708
-
1709
- ## [8.5.0] - 2026-07-01
1710
-
1711
- ### Added
1712
- - ToolRegistry now reports `ready: true` with full handler/governance/description alignment (added `vision_analyze` policy and description).
1713
- - `tz_name` now flows from central `Config` into `TriggerService` (via updated automation and platform wiring runtimes) for better DI and Config centralization.
1714
-
1715
- ### Changed
1716
- - Full codebase scan completed; improvements prioritized per AGENTS.md (registry, config injection, wiring seams).
1717
- - Version bumped to 8.5.0 across pyproject.toml, package.json, vscode-extension; all current-release doc references synchronized.
1718
- - Documentation sync performed for README, RELEASE.md, docs/CHANGELOG.md and Current release markers.
1719
-
1720
- ### Fixed
1721
- - Eliminated ToolRegistry drift for `vision_analyze` (handler existed in tools/ but missing from core registry governance surface used by diagnostics, MCP, and permission views).
1722
-
1723
- ## [8.4.0] - 2026-07-01
1724
-
1725
- ### Added
1726
- - Added a chat-to-agent file action gate so explicit file create/write/save/edit
1727
- requests from Brain Chat execute through the governed workspace file tool.
1728
- - Added regression coverage that verifies `/chat` routes file creation intent to
1729
- the workspace file tool and returns created artifact metadata.
1730
-
1731
- ### Changed
1732
- - Kept ordinary Q&A on `/chat` while routing only explicit side-effect file
1733
- requests into the planner/executor/reviewer tool loop.
1734
- - Synchronized package/runtime/static/Tauri metadata and current-release docs to
1735
- 8.4.0.
1736
-
1737
- ### Fixed
1738
- - Allowed literal `/chat` file writes with user-provided content to execute
1739
- before model loading, while still using a loaded model when content must be
1740
- synthesized.
1741
- - Narrowed file target and content parsing to avoid treating surrounding prose
1742
- as the workspace path or literal file body.
1743
- - Restored model loading dependency exports after the runtime/loading split so
1744
- `/models/load` can prepare local MLX models again.
1745
- - Added the common Gemma 4 26B shorthand alias to the canonical
1746
- `mlx-community/gemma-4-26b-a4b-it-4bit` model id.
1747
- - Updated the local server launcher to run `python -m uvicorn` from the active
1748
- virtual environment, avoiding stale console-script interpreter bindings.
1749
-
1750
- ## [8.3.0] - 2026-07-01
1751
-
1752
- ### Added
1753
- - Added a managed legacy compatibility report for remaining root shims,
1754
- including owners, replacements, reasons, removal phases, and readiness
1755
- metrics.
1756
- - Added AgentRuntime/workflow maturity evidence through lifecycle helper reuse,
1757
- legacy event compatibility, WorkflowEngine boundary/config inspection, and
1758
- centralized legacy workflow step projection.
1759
- - Added graph ingestion coverage for upload-to-pipeline behavior and
1760
- workspace-safe duplicate content.
1761
- - Added 8.3.0 onboarding and community/plugin growth documentation.
1762
-
1763
- ### Changed
1764
- - Routed `/knowledge-graph/ingest` through the unified `IngestionPipeline` when
1765
- available, preserving provenance and hook lifecycle behavior for MCP notes and
1766
- messages.
1767
- - Isolated text/web/note graph node identity by workspace while preserving the
1768
- content hash used for duplicate detection.
1769
- - Converted `mcp_registry.py` and `llm_router.py` into physical module aliases
1770
- for their current implementations.
1771
- - Improved upload client error handling so failed uploads cannot look
1772
- successful.
1773
- - Synchronized package/runtime/static/Tauri metadata and current-release docs to
1774
- 8.3.0.
1775
-
1776
- ### Upgrade Notes
1777
- - Existing legacy-global text/web/note graph nodes are not rewritten in place.
1778
- Re-ingesting the same content with a workspace id can create a separate
1779
- workspace-scoped node; re-index existing sources after upgrading when you want
1780
- provenance to converge on workspace scopes.
1781
-
1782
- ## [8.2.0] - 2026-06-27
1783
-
1784
- ### Added
1785
- - Added an evidence-backed Brain Brief to Brain Home so users can see what to
1786
- notice, what evidence supports it, and what action to take next.
1787
- - Added `GET /api/memory/brain-brief`, backed by `MemoryService.brain_brief()`,
1788
- with honest empty-state guidance and recall/graph/model-proof actions.
1789
- - Added unit coverage for Brain Brief service behavior and the memory API route.
1790
-
1791
- ### Changed
1792
- - Completed the remaining model loading/runtime extraction into
1793
- `model_loading.py` and `model_engines.py` while preserving compatibility
1794
- delegations from `model_runtime.py`.
1795
- - Extracted WorkspaceOS graph trace, agent/workflow run, skill, and snapshot
1796
- comparison ownership into focused manager modules.
1797
- - Wired Knowledge Graph embedding dimensions from the central resolved `Config`
1798
- embedder at app startup.
1799
- - Synchronized Python, npm, VS Code extension, Tauri, workspace, readiness,
1800
- static asset, and current-release documentation versions to 8.2.0.
1801
-
1802
- ## [8.1.0] - 2026-06-27
1803
-
1804
- ### Changed
1805
- - Rebuilt Brain Home around an intuitive first screen with LivingBrain, recent
1806
- memory, connected topic, next-best action, and the composer visible together.
1807
- - Replaced dashboard-style Brain growth metrics with narrative, product-facing
1808
- copy and focused primary actions.
1809
- - Tightened mobile and narrow viewport behavior so the Brain and composer remain
1810
- visible without horizontal overflow.
1811
- - Refreshed release screenshots, walkthrough GIF/WebM, static app assets, and
1812
- exact 8.1.0 artifact metadata.
1813
- - Synchronized Python, npm, VS Code extension, Tauri, workspace, readiness, and
1814
- current-release documentation versions to 8.1.0.
1815
-
1816
- ## [8.0.0] - 2026-06-24
1817
-
1818
- ### Changed
1819
- - Added `lattice-architecture-contract/v1` to make the AgentRuntime,
1820
- ToolRegistry, Config, server decomposition, and Knowledge Graph stabilization
1821
- boundaries explicit and testable for the major architecture line.
1822
- - Added `tool-registry-contract/v1` to the ToolRegistry manifest, including
1823
- dispatch, policy, and permission ownership.
1824
- - Updated architecture and product readiness targets to 8.0.0.
1825
- - Synchronized package/runtime/static/Tauri metadata to 8.0.0.
1826
- - Updated current-release docs and exact artifact names to 8.0.0 while
1827
- setting 8.0.0 as the oldest retained release-history entry.
1828
-
1829
- ### Fixed
1830
- - Made logical Knowledge Graph `replace` imports transactional so malformed
1831
- imports roll back without clearing the existing graph.
1832
- - Locked v2 read-equivalence coverage for `list_documents`, `get_node`,
1833
- `relationship_search`, and `traverse`.
1834
- - Preserved colliding legacy edge labels during logical import/backfill while
1835
- keeping native write-door synonym dedupe canonical.
@@ -1,6 +1,6 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **10.8.0 — Within Reach**.
3
+ Current release: **10.10.0 — Quiet Station**.
4
4
 
5
5
  LatticeAI defines the path from a strong local-first framework (8.4.0
6
6
  action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation
@@ -3,7 +3,7 @@
3
3
  > **Status: canonical** — current contributor guidance, kept in sync with the
4
4
  > current release.
5
5
 
6
- Current release: **10.8.0 — Within Reach**.
6
+ Current release: **10.10.0 — Quiet Station**.
7
7
 
8
8
  This document is for contributors working on the local-first Digital Brain
9
9
  codebase. Product positioning and quick start stay in `README.md`; release
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **10.8.0 — Within Reach**.
3
+ Current release: **10.10.0 — Quiet Station**.
4
4
 
5
5
  The first-run goal is a five-minute path from "I opened the app" to "my Brain
6
6
  has a source, a question, and proof." This page is the product contract behind
@@ -1,4 +1,4 @@
1
- # Lattice AI — Operations Guide (v10.8.0)
1
+ # Lattice AI — Operations Guide (v10.10.0)
2
2
 
3
3
  > **Status: canonical** — kept in sync with the current release. Storage layout
4
4
  > below reflects the SQLite live Brain store and workspace scoping, not the
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **10.8.0 — Within Reach**.
3
+ Current release: **10.10.0 — Quiet Station**.
4
4
 
5
5
  Lattice AI is local-first, explicit about external communication, and honest
6
6
  when a capability is unavailable.
@@ -1,6 +1,6 @@
1
1
  # Why Lattice AI Exists
2
2
 
3
- Current release: **10.8.0 — Within Reach**.
3
+ Current release: **10.10.0 — Quiet Station**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **10.8.0 — Within Reach**.
3
+ Current release: **10.10.0 — Quiet Station**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `lattice_brain/graph/schema.py`
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "10.8.0"
29
+ __version__ = "10.10.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -49,7 +49,7 @@ from typing import Any, Callable, Dict, List, Optional
49
49
  from ..utils import now_iso as _now
50
50
  from .contracts import multi_agent_contract
51
51
 
52
- MULTI_AGENT_VERSION = "10.8.0"
52
+ MULTI_AGENT_VERSION = "10.10.0"
53
53
 
54
54
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
55
55
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "10.8.0"
3
+ __version__ = "10.10.0"
@@ -51,6 +51,7 @@ from latticeai.api.chat_hybrid import (
51
51
  )
52
52
  from latticeai.api.chat_intents import ChatIntentController
53
53
  from latticeai.api.chat_stream import stream_chat
54
+ from latticeai.core.messages import DEFAULT_LANGUAGE, resolve_language, translate
54
55
  from latticeai.core.project_sessions import ProjectSessionStore
55
56
  from latticeai.core.run_store import AgentRunStore
56
57
  from latticeai.services.app_context import AppContext
@@ -122,12 +123,13 @@ def create_chat_router(context: AppContext) -> APIRouter:
122
123
  def authenticated_identity(
123
124
  current_user: str,
124
125
  claimed_email: Optional[str],
126
+ language: str = DEFAULT_LANGUAGE,
125
127
  ) -> Optional[str]:
126
128
  if current_user and claimed_email:
127
129
  if current_user.strip().lower() != claimed_email.strip().lower():
128
130
  raise HTTPException(
129
131
  status_code=403,
130
- detail="user_email must match the authenticated user.",
132
+ detail=translate("common.user_mismatch", language),
131
133
  )
132
134
  return current_user or claimed_email or None
133
135
 
@@ -239,12 +241,12 @@ def create_chat_router(context: AppContext) -> APIRouter:
239
241
  notify=notify_chat_message,
240
242
  )
241
243
 
242
- def request_model(model_id: Optional[str]) -> Optional[str]:
244
+ def request_model(model_id: Optional[str], language: str = DEFAULT_LANGUAGE) -> Optional[str]:
243
245
  selected = model_id or model_router.current_model_id
244
246
  if model_id and model_id not in model_router.loaded_model_ids:
245
247
  raise HTTPException(
246
248
  status_code=404,
247
- detail=f"Model '{model_id}' not loaded.",
249
+ detail=translate("chat.model_not_loaded", language, model=model_id),
248
250
  )
249
251
  return selected
250
252
 
@@ -258,7 +260,7 @@ def create_chat_router(context: AppContext) -> APIRouter:
258
260
  len(req.image_data) if req.image_data else 0,
259
261
  len(req.message or ""),
260
262
  )
261
- effective_email = authenticated_identity(current_user, req.user_email)
263
+ effective_email = authenticated_identity(current_user, req.user_email, resolve_language(request))
262
264
  workspace_id = write_workspace(
263
265
  workspace_scope_from_request(request),
264
266
  current_user,
@@ -293,7 +295,7 @@ def create_chat_router(context: AppContext) -> APIRouter:
293
295
  history_user=history_user,
294
296
  )
295
297
 
296
- selected_model_id = request_model(req.model)
298
+ selected_model_id = request_model(req.model, resolve_language(request))
297
299
  file_intent = is_file_action_request(req.message)
298
300
  if file_intent and context.funnel_metrics is not None:
299
301
  context.funnel_metrics.increment("file_requests")
@@ -303,11 +305,12 @@ def create_chat_router(context: AppContext) -> APIRouter:
303
305
  model_id=selected_model_id,
304
306
  effective_email=effective_email,
305
307
  workspace_id=workspace_id,
308
+ language=resolve_language(request),
306
309
  )
307
310
  if direct_response is not None:
308
311
  return direct_response
309
312
  if not selected_model_id:
310
- return intent_controller.no_model_response()
313
+ return intent_controller.no_model_response(resolve_language(request))
311
314
  if file_intent:
312
315
  return await intent_controller.route_file_to_agent(
313
316
  req,
@@ -29,6 +29,7 @@ from latticeai.api.chat_helpers import (
29
29
  )
30
30
  from latticeai.api.chat_stream import agent_live_stream
31
31
  from latticeai.core.agent import AgentRunContext, AgentState, normalize_plan
32
+ from latticeai.core.messages import resolve_language
32
33
  from latticeai.core.quiet import quiet
33
34
  from latticeai.core.run_explain import explain_run
34
35
 
@@ -266,7 +267,7 @@ class AgentHTTPController:
266
267
  """
267
268
  current_user = self.require_user(request)
268
269
  self.enforce_rate_limit(current_user, "agent")
269
- effective_email = self.authenticated_identity(current_user, req.user_email)
270
+ effective_email = self.authenticated_identity(current_user, req.user_email, resolve_language(request))
270
271
  header_workspace = workspace_scope_from_request(request)
271
272
  if req.workspace_id and header_workspace and req.workspace_id != header_workspace:
272
273
  raise HTTPException(