ltcai 8.4.0 → 8.6.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 +22 -22
- package/desktop/electron/main.cjs +13 -1
- package/desktop/electron/preload.cjs +5 -0
- package/docs/CHANGELOG.md +36 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +2 -2
- package/docs/DEVELOPMENT.md +8 -8
- package/docs/LEGACY_COMPATIBILITY.md +3 -3
- package/docs/ONBOARDING.md +4 -4
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +2 -2
- 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/app_factory.py +1 -0
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/tool_registry.py +2 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/runtime/automation_runtime.py +3 -1
- package/latticeai/runtime/platform_runtime_wiring.py +3 -1
- package/latticeai/services/architecture_readiness.py +2 -2
- package/latticeai/services/product_readiness.py +11 -11
- package/latticeai/services/triggers.py +3 -1
- package/package.json +1 -1
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/capabilities/default.json +3 -0
- package/src-tauri/src/main.rs +32 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +11 -11
- package/static/app/assets/{Act-D5mo4tE4.js → Act-IrojDEWY.js} +1 -1
- package/static/app/assets/{Brain-BVWyQw8A.js → Brain--VODO4HM.js} +2 -2
- package/static/app/assets/Capture-BUP_wJ7s.js +1 -0
- package/static/app/assets/Library-DrVto3cO.js +1 -0
- package/static/app/assets/System-DNrVbcMX.js +1 -0
- package/static/app/assets/index-BaaPtsLp.js +16 -0
- package/static/app/assets/index-_M5aCv21.css +2 -0
- package/static/app/assets/primitives-lz45ZfWY.js +1 -0
- package/static/app/assets/{textarea-e7qaj6Hm.js → textarea-C7uwJsxy.js} +1 -1
- package/static/app/index.html +2 -2
- package/static/app/theme-boot.js +2 -2
- package/static/sw.js +1 -1
- package/static/app/assets/Capture-C1R6GT0t.js +0 -1
- package/static/app/assets/Library-C2wIxpTs.js +0 -1
- package/static/app/assets/System-DE5GRyQR.js +0 -1
- package/static/app/assets/index-CoiuIFFP.js +0 -16
- package/static/app/assets/index-ty1iGgZu.css +0 -2
- 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.
|
|
3
|
+
**Lattice AI 8.6.0 is the local-first Digital Brain platform. This release fixes desktop folder selection for the Tauri localhost app, improves Capture feedback for folder and web source saving, and aligns the new Brain shell navigation with CI-verified visual coverage.**
|
|
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 —
|
|
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
|
[](https://pypi.org/project/ltcai/)
|
|
17
17
|
[](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
|
|
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.
|
|
@@ -204,32 +204,30 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
|
|
|
204
204
|
|
|
205
205
|
## Current Release
|
|
206
206
|
|
|
207
|
-
The current release is **8.
|
|
207
|
+
The current release is **8.6.0 — Desktop Capture & Navigation Reliability**:
|
|
208
208
|
|
|
209
|
-
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
boundaries, unified graph ingestion, and workspace-safe duplicate content
|
|
219
|
-
protections active.
|
|
209
|
+
- The desktop Capture flow can open a native folder picker from the Tauri
|
|
210
|
+
localhost app, fill the selected path, and immediately scan/connect it.
|
|
211
|
+
- Folder picker failures now surface an actionable message instead of silently
|
|
212
|
+
doing nothing, while manual path entry remains available.
|
|
213
|
+
- Web page capture keeps paste, Enter-to-save, and `https://` normalization for
|
|
214
|
+
bare domains.
|
|
215
|
+
- The Brain shell sidebar/navigation and admin entry points are covered by
|
|
216
|
+
updated Visual Smoke tests, while the 8.5 ToolRegistry and Config DI
|
|
217
|
+
hardening remains active.
|
|
220
218
|
|
|
221
|
-
Expected artifacts for 8.
|
|
219
|
+
Expected artifacts for 8.6.0 release must use exact filenames:
|
|
222
220
|
|
|
223
|
-
- `dist/ltcai-8.
|
|
224
|
-
- `dist/ltcai-8.
|
|
225
|
-
- `ltcai-8.
|
|
226
|
-
- `dist/ltcai-8.
|
|
227
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_8.
|
|
221
|
+
- `dist/ltcai-8.6.0-py3-none-any.whl`
|
|
222
|
+
- `dist/ltcai-8.6.0.tar.gz`
|
|
223
|
+
- `ltcai-8.6.0.tgz`
|
|
224
|
+
- `dist/ltcai-8.6.0.vsix`
|
|
225
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_8.6.0_aarch64.dmg`
|
|
228
226
|
|
|
229
227
|
Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
|
|
230
228
|
|
|
231
229
|
See [docs/ROADMAP_RECOMMENDATIONS.md](docs/ROADMAP_RECOMMENDATIONS.md) for the
|
|
232
|
-
strategic roadmap slices applied through 8.
|
|
230
|
+
strategic roadmap slices applied through 8.6.0 and the follow-up tracks.
|
|
233
231
|
|
|
234
232
|
## Known Limitations
|
|
235
233
|
|
|
@@ -246,6 +244,8 @@ strategic roadmap slices applied through 8.4.0 and the follow-up tracks.
|
|
|
246
244
|
|
|
247
245
|
| Version | Theme |
|
|
248
246
|
| --- | --- |
|
|
247
|
+
| 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 |
|
|
248
|
+
| 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
249
|
| 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
250
|
| 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
251
|
| 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,
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,42 @@ existed at that release.
|
|
|
8
8
|
|
|
9
9
|
No unreleased changes.
|
|
10
10
|
|
|
11
|
+
## [8.6.0] - 2026-07-05
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- Added Tauri localhost remote capability coverage so the desktop app can keep
|
|
15
|
+
using local IPC commands after navigating to the FastAPI-served `/app`.
|
|
16
|
+
- Added a regression trust gate for the Tauri localhost capability.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- Improved the Capture source flow: desktop users can choose a folder with the
|
|
20
|
+
native folder picker and immediately scan/connect it, while web page capture
|
|
21
|
+
now supports paste, Enter-to-save, and `https://` normalization for bare
|
|
22
|
+
domains.
|
|
23
|
+
- Updated Visual Smoke coverage for the new Brain shell sidebar and admin
|
|
24
|
+
console entry flow.
|
|
25
|
+
- Version bumped to 8.6.0 across Python, npm, VS Code extension, Tauri, static
|
|
26
|
+
metadata, readiness gates, and current-release documentation.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- Fixed native folder selection from the Tauri production app's localhost
|
|
30
|
+
webview and added visible fallback feedback when the picker is unavailable.
|
|
31
|
+
- Removed negative letter spacing from updated frontend shell styling.
|
|
32
|
+
|
|
33
|
+
## [8.5.0] - 2026-07-01
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- ToolRegistry now reports `ready: true` with full handler/governance/description alignment (added `vision_analyze` policy and description).
|
|
37
|
+
- `tz_name` now flows from central `Config` into `TriggerService` (via updated automation and platform wiring runtimes) for better DI and Config centralization.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
- Full codebase scan completed; improvements prioritized per AGENTS.md (registry, config injection, wiring seams).
|
|
41
|
+
- Version bumped to 8.5.0 across pyproject.toml, package.json, vscode-extension; all current-release doc references synchronized.
|
|
42
|
+
- Documentation sync performed for README, RELEASE.md, docs/CHANGELOG.md and Current release markers.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
- Eliminated ToolRegistry drift for `vision_analyze` (handler existed in tools/ but missing from core registry governance surface used by diagnostics, MCP, and permission views).
|
|
46
|
+
|
|
11
47
|
## [8.4.0] - 2026-07-01
|
|
12
48
|
|
|
13
49
|
### Added
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Community And Plugins
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
4
4
|
|
|
5
|
-
LatticeAI
|
|
5
|
+
LatticeAI defines the path from a strong local-first framework (8.4.0 action-aware baseline, 8.5.0 registry+DI hardening, 8.6.0 capture/navigation reliability) to a
|
|
6
6
|
product ecosystem. The immediate goal is small and practical: make it clear how
|
|
7
7
|
contributors can extend the Brain without weakening local-first trust,
|
|
8
8
|
workspace scoping, or release quality.
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Lattice AI Development
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
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.
|
|
7
|
+
history is intentionally limited to 7.0.0-8.6.0 in `docs/CHANGELOG.md` and
|
|
8
8
|
`RELEASE.md`.
|
|
9
9
|
|
|
10
10
|
## Product Contract
|
|
@@ -112,10 +112,10 @@ For user-facing, API, runtime, release, or packaging changes, check:
|
|
|
112
112
|
Release/publish examples must use exact target-version filenames. Do not
|
|
113
113
|
document wildcard artifact upload commands.
|
|
114
114
|
|
|
115
|
-
For 8.
|
|
115
|
+
For 8.6.0 release work, exact artifacts are:
|
|
116
116
|
|
|
117
|
-
- `dist/ltcai-8.
|
|
118
|
-
- `dist/ltcai-8.
|
|
119
|
-
- `ltcai-8.
|
|
120
|
-
- `dist/ltcai-8.
|
|
121
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_8.
|
|
117
|
+
- `dist/ltcai-8.6.0-py3-none-any.whl`
|
|
118
|
+
- `dist/ltcai-8.6.0.tar.gz`
|
|
119
|
+
- `ltcai-8.6.0.tgz`
|
|
120
|
+
- `dist/ltcai-8.6.0.vsix`
|
|
121
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_8.6.0_aarch64.dmg`
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Legacy Compatibility Map
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
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.
|
|
9
|
+
current 8.6.0 architecture.
|
|
10
10
|
|
|
11
|
-
8.
|
|
11
|
+
8.6.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
|
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Onboarding
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
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,
|
|
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.
|
|
35
|
+
8.6.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.
|
package/docs/TRUST_MODEL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lattice AI Trust Model
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
4
4
|
|
|
5
5
|
Lattice AI is local-first, explicit about external communication, and honest
|
|
6
6
|
when a capability is unavailable.
|
package/docs/WHY_LATTICE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Why Lattice AI Exists
|
|
2
2
|
|
|
3
|
-
Current release: **8.
|
|
3
|
+
Current release: **8.6.0 — Desktop Capture & Navigation Reliability**.
|
|
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.
|
|
35
|
+
In 8.6.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
|
@@ -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.
|
|
24
|
+
MULTI_AGENT_VERSION = "8.6.0"
|
|
25
25
|
|
|
26
26
|
AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
|
|
27
27
|
CORE_PIPELINE = ("planner", "executor", "reviewer")
|
package/latticeai/__init__.py
CHANGED
package/latticeai/app_factory.py
CHANGED
|
@@ -1192,6 +1192,7 @@ def _build(config: "Optional[Config]" = None) -> Dict[str, Any]:
|
|
|
1192
1192
|
agent_registry=AGENT_REGISTRY,
|
|
1193
1193
|
data_dir=DATA_DIR,
|
|
1194
1194
|
append_audit_event=append_audit_event,
|
|
1195
|
+
tz_name=getattr(CONFIG, "timezone", None),
|
|
1195
1196
|
)
|
|
1196
1197
|
_llm_generate_sync = _platform_automation_runtime["_llm_generate_sync"]
|
|
1197
1198
|
PLATFORM = _platform_automation_runtime["PLATFORM"]
|
|
@@ -180,6 +180,7 @@ TOOL_GOVERNANCE: Dict[str, ToolPolicy] = {
|
|
|
180
180
|
risk="exec", destructive=False, shell=False, network=True,
|
|
181
181
|
auto_approve=False, sandbox="system", rollback="none",
|
|
182
182
|
),
|
|
183
|
+
"vision_analyze": _r(sandbox="system"),
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
TOOL_GOVERNANCE_DEFAULT = ToolPolicy(
|
|
@@ -221,6 +222,7 @@ MCP_TOOL_DESCRIPTIONS: Dict[str, str] = {
|
|
|
221
222
|
"computer_status": "Check if Mac desktop control (pyautogui) is available.",
|
|
222
223
|
"chrome_status": "Report Chrome desktop bridge availability.",
|
|
223
224
|
"computer_use_status": "Report Mac desktop-control bridge availability.",
|
|
225
|
+
"vision_analyze": "Analyze a base64-encoded image (e.g. screenshot) using the active multimodal VLM. Returns structured description for agent consumption.",
|
|
224
226
|
"knowledge_save": "Save a note into the local knowledge garden.",
|
|
225
227
|
"knowledge_search": "Search the local knowledge garden.",
|
|
226
228
|
"knowledge_tree": "List local knowledge garden markdown files.",
|
|
@@ -49,7 +49,7 @@ __all__ = [
|
|
|
49
49
|
"remove_skill_directory",
|
|
50
50
|
]
|
|
51
51
|
|
|
52
|
-
WORKSPACE_OS_VERSION = "8.
|
|
52
|
+
WORKSPACE_OS_VERSION = "8.6.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
|
|
@@ -6,7 +6,7 @@ Router registration remains in ``app_factory`` so route order stays unchanged.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from typing import Any, Callable, Dict
|
|
9
|
+
from typing import Any, Callable, Dict, Optional
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def build_automation_runtime(
|
|
@@ -17,6 +17,7 @@ def build_automation_runtime(
|
|
|
17
17
|
workspace_graph: Callable[..., Any],
|
|
18
18
|
append_audit_event: Callable[..., Any],
|
|
19
19
|
hooks: Any,
|
|
20
|
+
tz_name: Optional[str] = None,
|
|
20
21
|
) -> Dict[str, Any]:
|
|
21
22
|
"""Construct automation services and attach the run executor boundary."""
|
|
22
23
|
|
|
@@ -37,6 +38,7 @@ def build_automation_runtime(
|
|
|
37
38
|
),
|
|
38
39
|
data_dir=data_dir,
|
|
39
40
|
review_sink=review_queue,
|
|
41
|
+
tz_name=tz_name,
|
|
40
42
|
)
|
|
41
43
|
agent_runtime = AgentRuntime(
|
|
42
44
|
store=store,
|
|
@@ -7,7 +7,7 @@ surface without changing router order or the legacy exported runtime names.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
-
from typing import Any, Callable, Dict
|
|
10
|
+
from typing import Any, Callable, Dict, Optional
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def build_platform_automation_runtime(
|
|
@@ -24,6 +24,7 @@ def build_platform_automation_runtime(
|
|
|
24
24
|
agent_registry: Any,
|
|
25
25
|
data_dir: Any,
|
|
26
26
|
append_audit_event: Callable[..., Any],
|
|
27
|
+
tz_name: Optional[str] = None,
|
|
27
28
|
) -> Dict[str, Any]:
|
|
28
29
|
"""Build platform services, automation services, and hook bindings.
|
|
29
30
|
|
|
@@ -73,6 +74,7 @@ def build_platform_automation_runtime(
|
|
|
73
74
|
workspace_graph=workspace_graph,
|
|
74
75
|
append_audit_event=append_audit_event,
|
|
75
76
|
hooks=hooks,
|
|
77
|
+
tz_name=tz_name,
|
|
76
78
|
)
|
|
77
79
|
|
|
78
80
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Machine-checkable architecture readiness gates for release work.
|
|
2
2
|
|
|
3
|
-
8.
|
|
3
|
+
8.6.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.
|
|
20
|
+
ARCHITECTURE_VERSION_TARGET = "8.6.0"
|
|
21
21
|
|
|
22
22
|
PREFERRED_REFACTORING_ORDER = [
|
|
23
23
|
"agent-runtime",
|
|
@@ -18,7 +18,7 @@ from typing import Any, Dict, List
|
|
|
18
18
|
|
|
19
19
|
from latticeai.services.architecture_readiness import architecture_readiness
|
|
20
20
|
|
|
21
|
-
PRODUCT_VERSION_TARGET = "8.
|
|
21
|
+
PRODUCT_VERSION_TARGET = "8.6.0"
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
@dataclass(frozen=True)
|
|
@@ -76,10 +76,10 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
76
76
|
evidence=[
|
|
77
77
|
"package.json::release:artifacts",
|
|
78
78
|
"package.json::release:validate",
|
|
79
|
-
"README.md::dist/ltcai-8.
|
|
80
|
-
"README.md::dist/ltcai-8.
|
|
81
|
-
"README.md::dist/ltcai-8.
|
|
82
|
-
"README.md::ltcai-8.
|
|
79
|
+
"README.md::dist/ltcai-8.6.0-py3-none-any.whl",
|
|
80
|
+
"README.md::dist/ltcai-8.6.0.tar.gz",
|
|
81
|
+
"README.md::dist/ltcai-8.6.0.vsix",
|
|
82
|
+
"README.md::ltcai-8.6.0.tgz",
|
|
83
83
|
"scripts/validate_release_artifacts.py",
|
|
84
84
|
"scripts/release_smoke.py",
|
|
85
85
|
"Dockerfile",
|
|
@@ -95,12 +95,12 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
95
95
|
title="Release story is documented and honest",
|
|
96
96
|
evidence=[
|
|
97
97
|
"README.md",
|
|
98
|
-
"README.md::The current release is **8.
|
|
99
|
-
"SECURITY.md::8.
|
|
100
|
-
"vscode-extension/README.md::**8.
|
|
101
|
-
"docs/CHANGELOG.md::## [8.
|
|
98
|
+
"README.md::The current release is **8.6.0",
|
|
99
|
+
"SECURITY.md::8.6.x (latest)",
|
|
100
|
+
"vscode-extension/README.md::**8.6.0",
|
|
101
|
+
"docs/CHANGELOG.md::## [8.6.0]",
|
|
102
102
|
"FEATURE_STATUS.md",
|
|
103
|
-
"RELEASE_NOTES_v8.
|
|
103
|
+
"RELEASE_NOTES_v8.6.0.md",
|
|
104
104
|
"latticeai/core/agent.py::SingleAgentRuntime",
|
|
105
105
|
"latticeai/core/agent.py::AgentRuntime = SingleAgentRuntime",
|
|
106
106
|
"lattice_brain/runtime/contracts.py::runtime-boundary/v1",
|
|
@@ -115,7 +115,7 @@ PRODUCT_GATES: List[ProductGate] = [
|
|
|
115
115
|
id="ecosystem-path",
|
|
116
116
|
title="Community and plugin growth path is explicit",
|
|
117
117
|
evidence=[
|
|
118
|
-
"docs/COMMUNITY_AND_PLUGINS.md::
|
|
118
|
+
"docs/COMMUNITY_AND_PLUGINS.md::8.6.0",
|
|
119
119
|
"docs/PLUGIN_SDK.md",
|
|
120
120
|
"plugins/README.md",
|
|
121
121
|
"plugins/hello-world/plugin.json",
|
|
@@ -49,6 +49,7 @@ class TriggerService:
|
|
|
49
49
|
clock: Callable[[], float] = time.time,
|
|
50
50
|
tick_seconds: float = DEFAULT_TICK_SECONDS,
|
|
51
51
|
review_sink: Optional[Any] = None,
|
|
52
|
+
tz_name: Optional[str] = None,
|
|
52
53
|
) -> None:
|
|
53
54
|
self._store = store
|
|
54
55
|
self._run_workflow = run_workflow
|
|
@@ -63,7 +64,8 @@ class TriggerService:
|
|
|
63
64
|
self._lock = threading.Lock()
|
|
64
65
|
# LATTICE_TZ: wall-clock / display 용. interval 계산은 여전히 unix seconds (duration 기반, drift 방지).
|
|
65
66
|
# describe()와 이벤트에 tz 정보 노출. calendar "daily at HH:MM" semantics 는 추후 cron 확장 시 사용.
|
|
66
|
-
|
|
67
|
+
# Prefer explicit tz_name (from Config) for DI; fall back to env for legacy/compat.
|
|
68
|
+
self._tz_name = (tz_name or os.environ.get("LATTICE_TZ") or "UTC").strip() or "UTC"
|
|
67
69
|
self._tz = None
|
|
68
70
|
if ZoneInfo is not None:
|
|
69
71
|
try:
|
package/package.json
CHANGED
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED
package/src-tauri/src/main.rs
CHANGED
|
@@ -66,6 +66,36 @@ fn shutdown_backend(state: State<'_, BackendState>) -> BackendStatus {
|
|
|
66
66
|
status_from_state(&state)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
#[tauri::command]
|
|
70
|
+
fn select_folder() -> Option<String> {
|
|
71
|
+
native_select_folder()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#[cfg(target_os = "macos")]
|
|
75
|
+
fn native_select_folder() -> Option<String> {
|
|
76
|
+
let output = Command::new("osascript")
|
|
77
|
+
.args([
|
|
78
|
+
"-e",
|
|
79
|
+
r#"POSIX path of (choose folder with prompt "Choose a folder for Lattice AI")"#,
|
|
80
|
+
])
|
|
81
|
+
.output()
|
|
82
|
+
.ok()?;
|
|
83
|
+
if !output.status.success() {
|
|
84
|
+
return None;
|
|
85
|
+
}
|
|
86
|
+
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
|
|
87
|
+
if path.is_empty() {
|
|
88
|
+
None
|
|
89
|
+
} else {
|
|
90
|
+
Some(path)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#[cfg(not(target_os = "macos"))]
|
|
95
|
+
fn native_select_folder() -> Option<String> {
|
|
96
|
+
None
|
|
97
|
+
}
|
|
98
|
+
|
|
69
99
|
fn split_command(command: &str) -> Vec<String> {
|
|
70
100
|
command.split_whitespace().map(|part| part.to_string()).collect()
|
|
71
101
|
}
|
|
@@ -379,7 +409,8 @@ fn main() {
|
|
|
379
409
|
backend_origin,
|
|
380
410
|
backend_status,
|
|
381
411
|
restart_backend,
|
|
382
|
-
shutdown_backend
|
|
412
|
+
shutdown_backend,
|
|
413
|
+
select_folder
|
|
383
414
|
])
|
|
384
415
|
.setup(|app| {
|
|
385
416
|
if let Some(window) = app.get_webview_window("main") {
|