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.
- package/README.md +44 -63
- package/docs/CHANGELOG.md +69 -237
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/kg-schema.md +1 -1
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/chat.py +9 -6
- package/latticeai/api/chat_agent_http.py +2 -1
- package/latticeai/api/chat_history.py +4 -2
- package/latticeai/api/chat_intents.py +14 -14
- package/latticeai/api/knowledge_graph.py +5 -4
- package/latticeai/api/local_files.py +25 -15
- package/latticeai/api/mcp.py +15 -11
- package/latticeai/api/memory.py +2 -1
- package/latticeai/api/models.py +39 -24
- package/latticeai/api/network_boundary.py +9 -4
- package/latticeai/api/portability.py +27 -19
- package/latticeai/api/project_sessions.py +7 -5
- package/latticeai/api/review_queue.py +12 -7
- package/latticeai/api/setup.py +10 -11
- package/latticeai/api/static_routes.py +62 -46
- package/latticeai/api/tools.py +7 -6
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/mcp_registry.py +20 -4
- package/latticeai/core/messages.py +222 -0
- package/latticeai/core/workspace_os_constants.py +1 -1
- package/latticeai/integrations/telegram_bot.py +20 -18
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/model_loading.py +63 -27
- package/latticeai/services/product_readiness.py +5 -3
- package/package.json +3 -2
- package/scripts/check_current_release_docs.mjs +4 -2
- package/scripts/check_server_i18n.mjs +96 -0
- package/scripts/release_screen_claims.json +31 -8
- 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 +37 -37
- package/static/app/assets/{Act-CbQNsFgc.js → Act-CC8SpNRm.js} +1 -1
- package/static/app/assets/{AdminConsole-Bs8SR8fE.js → AdminConsole-DGIY_Tb_.js} +1 -1
- package/static/app/assets/{Brain-BZIPsZlH.js → Brain-BDSC2Mol.js} +2 -2
- package/static/app/assets/BrainHome-BYgYp3ON.js +2 -0
- package/static/app/assets/BrainSignals-DYwVFmcO.js +1 -0
- package/static/app/assets/Capture-ClcKLsmI.js +1 -0
- package/static/app/assets/{CommandPalette-Dq_MmPBl.js → CommandPalette-DpwbyF1S.js} +1 -1
- package/static/app/assets/Library-D8VNtffM.js +1 -0
- package/static/app/assets/LivingBrain-CeWwc0NN.js +1 -0
- package/static/app/assets/ProductFlow-CS5CCM4t.js +1 -0
- package/static/app/assets/{ReviewCard-Be7E7X18.js → ReviewCard-Bap4yPfI.js} +1 -1
- package/static/app/assets/System-odPxU1YL.js +1 -0
- package/static/app/assets/arrow-left-J47Yde1U.js +1 -0
- package/static/app/assets/{bot-BR0eoeXY.js → bot-CmvhqTeF.js} +1 -1
- package/static/app/assets/brain-DLT9uuGq.js +1 -0
- package/static/app/assets/{button-U1nU7xX4.js → button-DyppYhFH.js} +1 -1
- package/static/app/assets/{circle-pause-DG5KHjDL.js → circle-pause-Bm5z7EBI.js} +1 -1
- package/static/app/assets/{circle-play-Chhcuq90.js → circle-play-GjKdH0Fg.js} +1 -1
- package/static/app/assets/{cpu-pkOSlT9h.js → cpu-CuVMv-F5.js} +1 -1
- package/static/app/assets/{download-CSRwz923.js → download-C9_946tf.js} +1 -1
- package/static/app/assets/{folder-open-DiMJ7W_7.js → folder-open-B3QKdxib.js} +1 -1
- package/static/app/assets/{hard-drive-iyLPAPdp.js → hard-drive-BwW9Hx4r.js} +1 -1
- package/static/app/assets/{index-_ldE9TAX.js → index-BrUQ-bF8.js} +3 -3
- package/static/app/assets/index-CYb18LtP.css +2 -0
- package/static/app/assets/{input-e_r2hFAY.js → input-Db2Hw2VH.js} +1 -1
- package/static/app/assets/{permissionCopy-9uOHktz3.js → permissionCopy-BpbIHRio.js} +1 -1
- package/static/app/assets/primitives-4B_Ynf7r.js +1 -0
- package/static/app/assets/search-YH-7-x5Y.js +1 -0
- package/static/app/assets/{share-2-DLDJJKmI.js → share-2-BgvRTDPJ.js} +1 -1
- package/static/app/assets/{shield-alert-BTtE-2EZ.js → shield-alert-DWFLyykG.js} +1 -1
- package/static/app/assets/{textarea-Bbzkcgqe.js → textarea-Bk4vEqzT.js} +1 -1
- package/static/app/assets/{useFocusTrap-DJzQd-Za.js → useFocusTrap-CGRXEg_p.js} +1 -1
- package/static/app/assets/{useQuery-6R_tqHRe.js → useQuery-CdPzp3_U.js} +1 -1
- package/static/app/assets/{utils-XDsjcrhS.js → utils-orU8igel.js} +3 -3
- package/static/app/assets/{workspace-CwrG8LHq.js → workspace-Brj2Ylb2.js} +1 -1
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/BrainHome-BaH5MDce.js +0 -2
- package/static/app/assets/BrainSignals-aDt-nSsW.js +0 -1
- package/static/app/assets/Capture-DDv940Bv.js +0 -1
- package/static/app/assets/Library-BkShbqmN.js +0 -1
- package/static/app/assets/LivingBrain-CXb8094H.js +0 -1
- package/static/app/assets/ProductFlow-BaiqFWLO.js +0 -1
- package/static/app/assets/System-DCstbTxC.js +0 -1
- package/static/app/assets/arrow-left-DC9Oquhs.js +0 -1
- package/static/app/assets/brain-BmWa1wea.js +0 -1
- package/static/app/assets/index-BZRvGOM2.css +0 -2
- package/static/app/assets/primitives-CnEAOmg2.js +0 -1
- package/static/app/assets/search-veep4n6f.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/TaeSooPark-PTS/LatticeAI/actions/workflows/ci.yml)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
|
-

|
|
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  | **See how knowledge connects** — a real relationship graph, not a file list  |
|
|
28
|
+
| **Capture anything** — files, whole folders, notes, screenshots, web pages  | **Automate with review** — agent changes become proposals you approve first  |
|
|
29
|
+
| **Pick a model in one click** — recommended local models for your hardware  | **Stay in control** — audit, roles, retention in a separate admin surface  |
|
|
30
|
+
| **Watch a file become memory** — three named steps, not a pipeline diagram  | **Say how much it may do alone** — one dial in plain words; dangerous actions stay blocked either way  |
|
|
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
|
-
|  |  |  |
|
|
62
62
|
|
|
63
63
|
Screenshot index and capture notes:
|
|
64
|
-
[output/release/v10.
|
|
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.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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.
|
|
100
|
+
Expected artifacts for 10.10.0 release must use exact filenames:
|
|
112
101
|
|
|
113
|
-
- `dist/ltcai-10.
|
|
114
|
-
- `dist/ltcai-10.
|
|
115
|
-
- `ltcai-10.
|
|
116
|
-
- `dist/ltcai-10.
|
|
117
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_10.
|
|
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.
|
|
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
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -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.
|
|
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
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **10.
|
|
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
|
package/docs/OPERATIONS.md
CHANGED
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED
package/docs/kg-schema.md
CHANGED
|
@@ -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.
|
|
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")
|
package/latticeai/__init__.py
CHANGED
package/latticeai/api/chat.py
CHANGED
|
@@ -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="
|
|
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=
|
|
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(
|