ltcai 8.5.0 → 8.7.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 (50) hide show
  1. package/README.md +35 -33
  2. package/desktop/electron/main.cjs +13 -1
  3. package/desktop/electron/preload.cjs +5 -0
  4. package/docs/CHANGELOG.md +46 -0
  5. package/docs/COMMUNITY_AND_PLUGINS.md +5 -3
  6. package/docs/DEVELOPMENT.md +11 -9
  7. package/docs/LEGACY_COMPATIBILITY.md +3 -3
  8. package/docs/ONBOARDING.md +4 -4
  9. package/docs/TRUST_MODEL.md +1 -1
  10. package/docs/WHY_LATTICE.md +2 -2
  11. package/docs/kg-schema.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/runtime/multi_agent.py +1 -1
  14. package/latticeai/__init__.py +1 -1
  15. package/latticeai/app_factory.py +2 -2
  16. package/latticeai/core/config.py +14 -2
  17. package/latticeai/core/marketplace.py +1 -1
  18. package/latticeai/core/workspace_os.py +1 -1
  19. package/latticeai/models/router.py +3 -2
  20. package/latticeai/runtime/router_registration.py +11 -5
  21. package/latticeai/services/architecture_readiness.py +2 -2
  22. package/latticeai/services/model_runtime.py +52 -28
  23. package/latticeai/services/product_readiness.py +11 -11
  24. package/package.json +3 -2
  25. package/scripts/bump_version.py +2 -0
  26. package/scripts/check_python.py +25 -12
  27. package/src-tauri/Cargo.lock +1 -1
  28. package/src-tauri/Cargo.toml +1 -1
  29. package/src-tauri/capabilities/default.json +3 -0
  30. package/src-tauri/src/main.rs +32 -1
  31. package/src-tauri/tauri.conf.json +1 -1
  32. package/static/app/asset-manifest.json +11 -11
  33. package/static/app/assets/{Act-D5mo4tE4.js → Act-_U7mhXir.js} +1 -1
  34. package/static/app/assets/{Brain-BVWyQw8A.js → Brain-BxyTHZ21.js} +2 -2
  35. package/static/app/assets/Capture-DyDKWNh9.js +1 -0
  36. package/static/app/assets/Library-DJ8KioFM.js +1 -0
  37. package/static/app/assets/System-C0FIb3OO.js +1 -0
  38. package/static/app/assets/index-Bh7IIlyY.js +16 -0
  39. package/static/app/assets/index-_M5aCv21.css +2 -0
  40. package/static/app/assets/primitives-BywkNS3f.js +1 -0
  41. package/static/app/assets/{textarea-e7qaj6Hm.js → textarea-CQ61Rycp.js} +1 -1
  42. package/static/app/index.html +2 -2
  43. package/static/app/theme-boot.js +2 -2
  44. package/static/sw.js +1 -1
  45. package/static/app/assets/Capture-C1R6GT0t.js +0 -1
  46. package/static/app/assets/Library-C2wIxpTs.js +0 -1
  47. package/static/app/assets/System-DE5GRyQR.js +0 -1
  48. package/static/app/assets/index-CoiuIFFP.js +0 -16
  49. package/static/app/assets/index-ty1iGgZu.css +0 -2
  50. package/static/app/assets/primitives-BdsUNXa6.js +0 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lattice AI
2
2
 
3
- **Lattice AI 8.5.0 is the local-first Digital Brain platform. This release hardens the Tool Registry (now drift-free and ready) and improves dependency injection for configuration (e.g. timezone flows through Config to automation runtimes) after full codebase scan and targeted refactors.**
3
+ **Lattice AI 8.7.0 is the local-first Digital Brain platform. This release hardens runtime state ownership, refreshes the checked-in release evidence, and synchronizes package, desktop, extension, and documentation metadata to the 8.7.0 line.**
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 — with ToolRegistry readiness, Config-driven DI for automation, and continued AgentRuntime/Tool wiring seams.
14
+ It is the finished private AI memory layer wrapped in a Living Brain experience — with desktop source capture that uses native folder selection, ToolRegistry readiness, Config-driven DI for automation, and continued AgentRuntime/Tool wiring seams.
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)
@@ -41,7 +41,7 @@ You need Lattice AI when:
41
41
 
42
42
  - Chat with a Brain that remembers useful context instead of treating every
43
43
  session as disposable.
44
- - Add documents, local folders, notes, screenshots, and conversations with
44
+ - Add documents, selected local folders, notes, screenshots, and web pages with
45
45
  source-aware memory.
46
46
  - See recent memories, older memories, topics, relationships, and the full
47
47
  knowledge graph when you want deeper structure.
@@ -65,9 +65,9 @@ You need Lattice AI when:
65
65
  ## Living Brain Flow
66
66
 
67
67
  The screenshots below are the latest checked-in visual evidence captures from
68
- the 8.2 Brain Home release. The 8.3 line keeps that first-run flow focused on
69
- the Brain while adding clearer onboarding, stronger workflow/runtime
70
- boundaries, and better ingestion proof behind the scenes.
68
+ the 8.7.0 release. They keep the first-run Brain flow, memory graph, source
69
+ capture, model library, system view, admin console, and review center visible as
70
+ release gates.
71
71
 
72
72
  ### 1. Wake Brain
73
73
 
@@ -79,21 +79,21 @@ confirm owner, check the computer, choose the Brain voice.
79
79
  Choose the owner of the Brain. The profile is not a SaaS account by default; it
80
80
  is the local identity for the knowledge you keep.
81
81
 
82
- ![Login](output/release/v8.2.0/screenshots/01-login.png)
82
+ ![Login](output/release/v8.7.0/screenshots/01-login.png)
83
83
 
84
84
  ### 3. Recommended Models
85
85
 
86
86
  Start with a short list: safest recommendation, faster model, stronger model.
87
87
  Advanced details stay available without overwhelming first-time users.
88
88
 
89
- ![Recommended Models](output/release/v8.2.0/screenshots/02-recommended-models.png)
89
+ ![Recommended Models](output/release/v8.7.0/screenshots/02-recommended-models.png)
90
90
 
91
91
  ### 4. Install And Load
92
92
 
93
93
  Download and load only after consent. Lattice explains model size, local
94
94
  execution, and network use before work starts.
95
95
 
96
- ![Install and Load](output/release/v8.2.0/screenshots/03-install-load-progress.png)
96
+ ![Install and Load](output/release/v8.7.0/screenshots/03-install-load-progress.png)
97
97
 
98
98
  ### 5. Brain Chat
99
99
 
@@ -101,14 +101,14 @@ Talk normally. Useful decisions and context become memory, then appear later as
101
101
  topics, relationships, graph structure, and the concentric memory rings around
102
102
  the Brain.
103
103
 
104
- ![Brain Brief Home](output/release/v8.2.0/screenshots/04-brain-chat-home.png)
104
+ ![Brain Brief Home](output/release/v8.7.0/screenshots/04-brain-chat-home.png)
105
105
 
106
106
  ### 6. Review Center
107
107
 
108
108
  Automation results are staged for review before they become durable decisions.
109
109
  Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
110
110
 
111
- ![Review Center](output/release/v8.2.0/screenshots/12-review-center.png)
111
+ ![Review Center](output/release/v8.7.0/screenshots/12-review-center.png)
112
112
 
113
113
  ## Brain Depths
114
114
 
@@ -124,10 +124,10 @@ The user travels inward from everyday memory to deeper structure:
124
124
 
125
125
  Walkthrough:
126
126
 
127
- ![v8.2.0 Living Brain walkthrough](output/release/v8.2.0/gifs/v8.2.0-living-brain-walkthrough.gif)
127
+ ![v8.7.0 Living Brain walkthrough](output/release/v8.7.0/gifs/v8.7.0-living-brain-walkthrough.gif)
128
128
 
129
129
  Screenshot index and capture notes:
130
- [output/release/v8.2.0/SCREENSHOT_INDEX.md](output/release/v8.2.0/SCREENSHOT_INDEX.md)
130
+ [output/release/v8.7.0/SCREENSHOT_INDEX.md](output/release/v8.7.0/SCREENSHOT_INDEX.md)
131
131
 
132
132
  ## Install
133
133
 
@@ -190,7 +190,6 @@ Main validation set:
190
190
 
191
191
  ```bash
192
192
  npm run check:python
193
- node scripts/run_python.mjs -m ruff check .
194
193
  npm run lint
195
194
  npm run typecheck
196
195
  npm run test:unit
@@ -200,36 +199,36 @@ npm run desktop:tauri:check
200
199
  npm run docs:check-links
201
200
  ```
202
201
 
202
+ `npm run lint` includes the Python Ruff baseline, frontend TypeScript lint
203
+ gate, visual smoke syntax checks, and i18n literal checks.
204
+
203
205
  See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
204
206
 
205
207
  ## Current Release
206
208
 
207
- The current release is **8.5.0 — Tool Registry Readiness & Config DI**:
209
+ The current release is **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**:
208
210
 
209
- - Brain Chat now routes explicit file create/write/save/edit requests through
210
- the governed workspace file tool instead of treating them as ordinary prose
211
- generation.
212
- - Requests such as `hello.md 파일 만들어줘` are executed through
213
- `write_file`/`edit_file` style tool paths, and created artifacts are returned
214
- in the chat response.
215
- - Normal Q&A stays on the low-friction `/chat` generation path; only explicit
216
- side-effect requests move into the tool-running agent loop.
217
- - The release keeps the 8.3.0 managed legacy inventory, AgentRuntime/workflow
218
- boundaries, unified graph ingestion, and workspace-safe duplicate content
219
- protections active.
211
+ - Internal model-runtime logic now reads from the typed `ModelRuntimeState`
212
+ object instead of the legacy module-global compatibility surface.
213
+ - `sync_to_module_globals()` remains available for external shims, but now emits
214
+ a `DeprecationWarning` so new code does not rebuild global-state coupling.
215
+ - The 8.7.0 release evidence refresh updates screenshots, walkthrough GIF/WebM,
216
+ package/runtime/static/Tauri metadata, and current-release documentation.
217
+ - The 8.6 desktop Capture reliability and 8.5 ToolRegistry/Config DI hardening
218
+ remain active release guarantees.
220
219
 
221
- Expected artifacts for 8.5.0 release must use exact filenames:
220
+ Expected artifacts for 8.7.0 release must use exact filenames:
222
221
 
223
- - `dist/ltcai-8.5.0-py3-none-any.whl`
224
- - `dist/ltcai-8.5.0.tar.gz`
225
- - `ltcai-8.5.0.tgz`
226
- - `dist/ltcai-8.5.0.vsix`
227
- - `src-tauri/target/release/bundle/dmg/Lattice AI_8.5.0_aarch64.dmg`
222
+ - `dist/ltcai-8.7.0-py3-none-any.whl`
223
+ - `dist/ltcai-8.7.0.tar.gz`
224
+ - `ltcai-8.7.0.tgz`
225
+ - `dist/ltcai-8.7.0.vsix`
226
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_8.7.0_aarch64.dmg`
228
227
 
229
228
  Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
230
229
 
231
230
  See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
232
- strategic roadmap slices applied through 8.5.0 and the follow-up tracks.
231
+ strategic roadmap slices applied through 8.7.0 and the follow-up tracks.
233
232
 
234
233
  ## Known Limitations
235
234
 
@@ -246,6 +245,9 @@ strategic roadmap slices applied through 8.5.0 and the follow-up tracks.
246
245
 
247
246
  | Version | Theme |
248
247
  | --- | --- |
248
+ | 8.7.0 | Runtime State Hygiene & Release Evidence Refresh: model-runtime internals prefer typed state over legacy globals, compatibility sync is deprecated, 8.7.0 visual evidence is refreshed, and all release metadata/docs are synchronized |
249
+ | 8.6.0 | Desktop Capture & Navigation Reliability: native folder selection works from the Tauri localhost app, picker failures surface in Capture, web saving remains one-action, and the Brain shell sidebar/admin flow is CI-covered |
250
+ | 8.5.0 | Tool Registry Readiness & Config DI: ToolRegistry drift removed, `tz_name` flows through central Config into automation runtimes, and current-release documentation is synchronized |
249
251
  | 8.4.0 | Action-Aware Brain Chat: explicit file create/write/save/edit requests from Brain Chat route into the governed workspace file tool so files are actually created instead of returned as code-only answers |
250
252
  | 8.3.0 | Orchestrated Brain Readiness: managed legacy shim inventory, stronger AgentRuntime/workflow boundaries, unified graph ingestion, workspace-safe duplicate content, first-run onboarding, and explicit community/plugin growth path |
251
253
  | 8.2.0 | Brain Brief: evidence-backed home briefing, honest empty-state guidance, recall/graph/model-proof next actions, and continued model/workspace runtime extraction |
@@ -1,10 +1,21 @@
1
- const { app, BrowserWindow } = require("electron");
1
+ const { app, BrowserWindow, dialog, ipcMain } = require("electron");
2
2
  const { spawn } = require("node:child_process");
3
3
  const path = require("node:path");
4
4
 
5
5
  const origin = process.env.LATTICEAI_DESKTOP_BACKEND_ORIGIN || "http://127.0.0.1:8765";
6
6
  let backend = null;
7
7
 
8
+ ipcMain.handle("lattice:select-folder", async (event) => {
9
+ const win = BrowserWindow.fromWebContents(event.sender);
10
+ const options = {
11
+ title: "Choose a folder for Lattice AI",
12
+ properties: ["openDirectory"],
13
+ };
14
+ const result = win ? await dialog.showOpenDialog(win, options) : await dialog.showOpenDialog(options);
15
+ if (result.canceled || !result.filePaths.length) return null;
16
+ return result.filePaths[0];
17
+ });
18
+
8
19
  function startBackend() {
9
20
  if (process.env.LATTICEAI_DESKTOP_NO_BACKEND) return;
10
21
  const command = process.env.LATTICEAI_DESKTOP_BACKEND_CMD || "python3 ltcai_cli.py --host 127.0.0.1 --port 8765";
@@ -25,6 +36,7 @@ function createWindow() {
25
36
  minHeight: 720,
26
37
  title: "Lattice AI",
27
38
  webPreferences: {
39
+ preload: path.join(__dirname, "preload.cjs"),
28
40
  contextIsolation: true,
29
41
  nodeIntegration: false,
30
42
  sandbox: true,
@@ -0,0 +1,5 @@
1
+ const { contextBridge, ipcRenderer } = require("electron");
2
+
3
+ contextBridge.exposeInMainWorld("latticeDesktop", {
4
+ selectFolder: () => ipcRenderer.invoke("lattice:select-folder"),
5
+ });
package/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,52 @@ existed at that release.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [8.7.0] - 2026-07-05
10
+
11
+ ### Added
12
+ - Added unit test coverage for model-runtime `STATE` source-of-truth behavior
13
+ and deprecation warnings on legacy global synchronization.
14
+ - Added refreshed 8.7.0 screenshots, walkthrough GIF/WebM, and capture notes
15
+ under `output/release/v8.7.0/`.
16
+
17
+ ### Changed
18
+ - Reduced internal reliance on bare module globals in
19
+ `latticeai/services/model_runtime.py`; implementation logic now consistently
20
+ reads from the `ModelRuntimeState` instance while globals remain as a legacy
21
+ compatibility surface.
22
+ - Added `DeprecationWarning` to `sync_to_module_globals()` while preserving the
23
+ external shim behavior.
24
+ - Removed a loose `as any` cast from `frontend/src/pages/Act.tsx`.
25
+ - Version bumped to 8.7.0 across Python, npm, VS Code extension, Tauri, static
26
+ metadata, README evidence links, release notes, and current-release
27
+ documentation.
28
+
29
+ ### Fixed
30
+ - Internal model-runtime functions now prefer the typed state object per the
31
+ project preference for composition over global mutable state.
32
+
33
+ ## [8.6.0] - 2026-07-05
34
+
35
+ ### Added
36
+ - Added Tauri localhost remote capability coverage so the desktop app can keep
37
+ using local IPC commands after navigating to the FastAPI-served `/app`.
38
+ - Added a regression trust gate for the Tauri localhost capability.
39
+
40
+ ### Changed
41
+ - Improved the Capture source flow: desktop users can choose a folder with the
42
+ native folder picker and immediately scan/connect it, while web page capture
43
+ now supports paste, Enter-to-save, and `https://` normalization for bare
44
+ domains.
45
+ - Updated Visual Smoke coverage for the new Brain shell sidebar and admin
46
+ console entry flow.
47
+ - Version bumped to 8.6.0 across Python, npm, VS Code extension, Tauri, static
48
+ metadata, readiness gates, and current-release documentation.
49
+
50
+ ### Fixed
51
+ - Fixed native folder selection from the Tauri production app's localhost
52
+ webview and added visible fallback feedback when the picker is unavailable.
53
+ - Removed negative letter spacing from updated frontend shell styling.
54
+
9
55
  ## [8.5.0] - 2026-07-01
10
56
 
11
57
  ### Added
@@ -1,9 +1,11 @@
1
1
  # Community And Plugins
2
2
 
3
- Current release: **8.5.0 - Registry Polish & Config DI**.
3
+ Current release: **8.7.0 Runtime State Hygiene & Release Evidence Refresh**.
4
4
 
5
- LatticeAI defines the path from a strong local-first framework (8.4.0 action-aware baseline, 8.5.0 registry+DI hardening) to a
6
- product ecosystem. The immediate goal is small and practical: make it clear how
5
+ LatticeAI defines the path from a strong local-first framework (8.4.0
6
+ action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation
7
+ reliability, and 8.7.0 runtime-state hygiene) to a product ecosystem. The
8
+ immediate goal is small and practical: make it clear how
7
9
  contributors can extend the Brain without weakening local-first trust,
8
10
  workspace scoping, or release quality.
9
11
 
@@ -1,10 +1,10 @@
1
1
  # Lattice AI Development
2
2
 
3
- Current release: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
4
4
 
5
5
  This document is for contributors working on the local-first Digital Brain
6
6
  codebase. Product positioning and quick start stay in `README.md`; release
7
- history is intentionally limited to 7.0.0-8.5.0 in `docs/CHANGELOG.md` and
7
+ history is intentionally limited to 7.0.0-8.7.0 in `docs/CHANGELOG.md` and
8
8
  `RELEASE.md`.
9
9
 
10
10
  ## Product Contract
@@ -49,13 +49,15 @@ API, UI, or release work, run:
49
49
 
50
50
  ```bash
51
51
  npm run check:python
52
- node scripts/run_python.mjs -m ruff check .
53
52
  npm run lint
54
53
  npm run typecheck
55
54
  npm run test:unit
56
55
  npm run docs:check-links
57
56
  ```
58
57
 
58
+ `npm run lint` runs the Python Ruff baseline, frontend TypeScript lint gate,
59
+ visual smoke syntax checks, and i18n literal checks.
60
+
59
61
  Use these when the change touches the relevant surface:
60
62
 
61
63
  ```bash
@@ -112,10 +114,10 @@ For user-facing, API, runtime, release, or packaging changes, check:
112
114
  Release/publish examples must use exact target-version filenames. Do not
113
115
  document wildcard artifact upload commands.
114
116
 
115
- For 8.5.0 release work, exact artifacts are:
117
+ For 8.7.0 release work, exact artifacts are:
116
118
 
117
- - `dist/ltcai-8.5.0-py3-none-any.whl`
118
- - `dist/ltcai-8.5.0.tar.gz`
119
- - `ltcai-8.5.0.tgz`
120
- - `dist/ltcai-8.5.0.vsix`
121
- - `src-tauri/target/release/bundle/dmg/Lattice AI_8.5.0_aarch64.dmg`
119
+ - `dist/ltcai-8.7.0-py3-none-any.whl`
120
+ - `dist/ltcai-8.7.0.tar.gz`
121
+ - `ltcai-8.7.0.tgz`
122
+ - `dist/ltcai-8.7.0.vsix`
123
+ - `src-tauri/target/release/bundle/dmg/Lattice AI_8.7.0_aarch64.dmg`
@@ -1,14 +1,14 @@
1
1
  # Legacy Compatibility Map
2
2
 
3
- Current release: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
4
4
 
5
5
  Lattice AI is moving toward a smaller, modular architecture centered on
6
6
  `lattice_brain`, `latticeai.services`, `latticeai.api`, and `latticeai.runtime`.
7
7
  Some root-level modules remain packaged for compatibility with older imports,
8
8
  CLI entrypoints, or extension workflows. Their presence does not define the
9
- current 8.5.0 architecture.
9
+ current 8.7.0 architecture.
10
10
 
11
- 8.5.0 also tracks the inner compatibility layers that sit below the root
11
+ 8.7.0 also tracks the inner compatibility layers that sit below the root
12
12
  modules. The managed inventory lives in `latticeai.core.legacy_compatibility`
13
13
  and groups shims by layer:
14
14
 
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Onboarding
2
2
 
3
- Current release: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
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
@@ -12,8 +12,8 @@ read the docs first.
12
12
  1. Wake the Brain and confirm the local owner profile.
13
13
  2. Let Lattice inspect local model/runtime readiness.
14
14
  3. Pick the recommended Brain voice or skip model loading.
15
- 4. Add one source: upload a file, connect a folder, save a note, or capture a
16
- browser/source event.
15
+ 4. Add one source: upload a file, choose and scan a folder, save a note, or
16
+ capture a browser/source event.
17
17
  5. Ask one grounded question and inspect the answer proof.
18
18
  6. Open the Knowledge Graph only when the user wants source-level evidence.
19
19
  7. Back up the Brain once useful memory exists.
@@ -32,7 +32,7 @@ read the docs first.
32
32
 
33
33
  ## Release Gate
34
34
 
35
- 8.5.0 treats onboarding as a release gate, not marketing copy. The current
35
+ 8.7.0 treats onboarding as a release gate, not marketing copy. The current
36
36
  machine-checkable product readiness report requires this five-minute contract,
37
37
  the Brain Home surface, setup helpers, graph ingestion tests, and exact release
38
38
  artifact documentation before the release can be called complete.
@@ -1,6 +1,6 @@
1
1
  # Lattice AI Trust Model
2
2
 
3
- Current release: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
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: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
4
4
 
5
5
  **Lattice AI is a local-first Digital Brain that keeps your knowledge durable
6
6
  across any AI model.**
@@ -32,7 +32,7 @@ The graph matters, but it is not the product identity. The product identity is a
32
32
  local-first Digital Brain: a place where the user can talk, add sources, watch
33
33
  memory grow, and inspect the Knowledge Graph when they need proof.
34
34
 
35
- In 8.5.0 the first screen is intentionally not a dashboard. The living Brain,
35
+ In 8.7.0 the first screen is intentionally not a dashboard. The living Brain,
36
36
  conversation composer, evidence-backed Brain Brief, and five-minute onboarding
37
37
  path appear together so the user immediately knows what matters, what to add,
38
38
  and why the answer is grounded in local memory.
package/docs/kg-schema.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Knowledge Graph Schema
2
2
 
3
- Current release: **8.5.0 — Tool Registry Readiness & Config DI**.
3
+ Current release: **8.7.0 — Runtime State Hygiene & Release Evidence Refresh**.
4
4
 
5
5
  명세 출처: `lattice_ai_full_spec.pptx` 슬라이드 20·21·22
6
6
  구현: `kg_schema.py`
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "8.5.0"
29
+ __version__ = "8.7.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -21,7 +21,7 @@ from typing import Any, Callable, Dict, List, Optional
21
21
  from .contracts import multi_agent_contract
22
22
 
23
23
 
24
- MULTI_AGENT_VERSION = "8.5.0"
24
+ MULTI_AGENT_VERSION = "8.7.0"
25
25
 
26
26
  AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
27
27
  CORE_PIPELINE = ("planner", "executor", "reviewer")
@@ -1,3 +1,3 @@
1
1
  """Lattice AI - modular server package."""
2
2
 
3
- __version__ = "8.5.0"
3
+ __version__ = "8.7.0"
@@ -107,7 +107,7 @@ def _build(config: "Optional[Config]" = None) -> Dict[str, Any]:
107
107
  enforce_rate_limit as _enforce_rate_limit,
108
108
  )
109
109
  from latticeai.core.audit import (
110
- get_audit_log as _get_audit_log,
110
+ get_audit_log as _get_audit_log, # noqa: F401 - legacy server_app attr exported via locals()
111
111
  classify_sensitive_message as _classify_sensitive_message,
112
112
  build_sensitivity_report as _build_sensitivity_report,
113
113
  build_admin_audit_report as _build_admin_audit_report,
@@ -992,7 +992,7 @@ def _build(config: "Optional[Config]" = None) -> Dict[str, Any]:
992
992
  create_admin_router=create_admin_router,
993
993
  require_admin=require_admin,
994
994
  get_history=get_history,
995
- get_audit_log=_get_audit_log,
995
+ get_audit_log=get_audit_log,
996
996
  audit_file=AUDIT_FILE,
997
997
  public_user=public_user,
998
998
  load_vpc_config=load_vpc_config,
@@ -43,7 +43,12 @@ def _bool(env: Mapping[str, str], key: str, default: bool = False) -> bool:
43
43
  raw = env.get(key)
44
44
  if raw is None:
45
45
  return default
46
- return raw.strip().lower() in {"1", "true", "yes", "on"}
46
+ normalized = raw.strip().lower()
47
+ if normalized in {"1", "true", "yes", "on"}:
48
+ return True
49
+ if normalized in {"0", "false", "no", "off"}:
50
+ return False
51
+ return default
47
52
 
48
53
 
49
54
  def _int(env: Mapping[str, str], key: str, default: int) -> int:
@@ -56,6 +61,13 @@ def _int(env: Mapping[str, str], key: str, default: int) -> int:
56
61
  return default
57
62
 
58
63
 
64
+ def _port(env: Mapping[str, str], key: str, default: int) -> int:
65
+ port = _int(env, key, default)
66
+ if 1 <= port <= 65535:
67
+ return port
68
+ return default
69
+
70
+
59
71
  @dataclass(frozen=True)
60
72
  class Config:
61
73
  """Everything a caller must know about app-level settings.
@@ -146,7 +158,7 @@ class Config:
146
158
  is_public = app_mode == "public"
147
159
 
148
160
  host = _value(env, "LATTICEAI_HOST", "127.0.0.1")
149
- port = _int(env, "LATTICEAI_PORT", 4825)
161
+ port = _port(env, "LATTICEAI_PORT", 4825)
150
162
  network_exposed = not host_is_loopback(host)
151
163
 
152
164
  cors_extra = [item.strip() for item in _value(env, "LATTICEAI_CORS_ALLOWED_ORIGINS", "").split(",") if item.strip()]
@@ -11,7 +11,7 @@ from copy import deepcopy
11
11
  from typing import Any, Dict, List, Optional
12
12
 
13
13
 
14
- MARKETPLACE_VERSION = "8.5.0"
14
+ MARKETPLACE_VERSION = "8.7.0"
15
15
  TEMPLATE_KINDS = ("plugin", "workflow", "agent")
16
16
 
17
17
 
@@ -49,7 +49,7 @@ __all__ = [
49
49
  "remove_skill_directory",
50
50
  ]
51
51
 
52
- WORKSPACE_OS_VERSION = "8.5.0"
52
+ WORKSPACE_OS_VERSION = "8.7.0"
53
53
 
54
54
  # Workspace types separate single-user Personal workspaces from shared
55
55
  # Organization workspaces. Both keep the same local-first JSON store; the type
@@ -13,8 +13,9 @@ import time
13
13
  from dataclasses import dataclass
14
14
  from pathlib import Path
15
15
 
16
- # Set MLX_VLM_DRAFT_KIND to 'mtp' to enable the Gemma 4 assistant MTP drafter.
17
- os.environ["MLX_VLM_DRAFT_KIND"] = "mtp"
16
+ # Default Gemma 4 assistant drafting to MTP without overriding an operator's
17
+ # explicit MLX runtime choice.
18
+ os.environ.setdefault("MLX_VLM_DRAFT_KIND", "mtp")
18
19
 
19
20
  from concurrent.futures import ThreadPoolExecutor
20
21
  from typing import AsyncIterator, Dict, Optional, Tuple, List
@@ -162,16 +162,22 @@ def build_auth_admin_security_router_bundle(
162
162
  append_audit_event=append_audit_event,
163
163
  )
164
164
 
165
- def security_audit_events_safe() -> list[dict[str, Any]]:
165
+ def audit_log_events_safe() -> list[dict[str, Any]]:
166
166
  try:
167
- return get_audit_log(audit_file)
167
+ return get_audit_log()
168
+ except TypeError:
169
+ try:
170
+ return get_audit_log(audit_file)
171
+ except Exception as exc: # pragma: no cover - defensive legacy behavior
172
+ logger.warning("security audit events load failed: %s", exc)
173
+ return []
168
174
  except Exception as exc: # pragma: no cover - defensive legacy behavior
169
175
  logger.warning("security audit events load failed: %s", exc)
170
176
  return []
171
177
 
172
178
  def security_list_uploaded_files() -> list[dict[str, Any]]:
173
179
  files: list[dict[str, Any]] = []
174
- for idx, event in enumerate(security_audit_events_safe()):
180
+ for idx, event in enumerate(audit_log_events_safe()):
175
181
  if event.get("event_type") != "document_upload":
176
182
  continue
177
183
  files.append({
@@ -191,7 +197,7 @@ def build_auth_admin_security_router_bundle(
191
197
  security_router = create_security_router(
192
198
  require_admin=require_admin,
193
199
  get_history=get_history,
194
- get_audit_events=security_audit_events_safe,
200
+ get_audit_events=audit_log_events_safe,
195
201
  classify_sensitive_message=classify_sensitive_message,
196
202
  build_sensitivity_report=build_sensitivity_report,
197
203
  list_uploaded_files=security_list_uploaded_files,
@@ -205,7 +211,7 @@ def build_auth_admin_security_router_bundle(
205
211
  "security_router": security_router,
206
212
  "_graph_stats_safe": graph_stats_safe,
207
213
  "_product_hardening_status": product_hardening_status,
208
- "_security_audit_events_safe": security_audit_events_safe,
214
+ "_security_audit_events_safe": audit_log_events_safe,
209
215
  "_security_list_uploaded_files": security_list_uploaded_files,
210
216
  }
211
217
 
@@ -1,6 +1,6 @@
1
1
  """Machine-checkable architecture readiness gates for release work.
2
2
 
3
- 8.5.0 keeps the major architecture priorities under an explicit release
3
+ 8.7.0 keeps the major architecture priorities under an explicit release
4
4
  contract while product maturity work reduces visible beta seams. AgentRuntime, ToolRegistry,
5
5
  central Config, decomposed server runtime, and Knowledge Graph stabilization
6
6
  must remain discoverable, ordered, and backed by tests before the release can be
@@ -17,7 +17,7 @@ from typing import Any, Dict, List
17
17
  from latticeai.core.legacy_compatibility import legacy_shim_report
18
18
 
19
19
 
20
- ARCHITECTURE_VERSION_TARGET = "8.5.0"
20
+ ARCHITECTURE_VERSION_TARGET = "8.7.0"
21
21
 
22
22
  PREFERRED_REFACTORING_ORDER = [
23
23
  "agent-runtime",