ltcai 10.4.0 → 10.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 +54 -36
- package/docs/CHANGELOG.md +153 -0
- 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/PERMISSION_MODE.md +15 -4
- 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/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os_constants.py +1 -1
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/product_readiness.py +1 -1
- package/package.json +1 -1
- package/scripts/capture_release_evidence.mjs +40 -8
- package/scripts/check_current_release_docs.mjs +1 -1
- 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 +39 -37
- package/static/app/assets/{Act-BK__Y5VE.js → Act-B3MSgNsJ.js} +1 -1
- package/static/app/assets/AdminConsole-Ds8u36lf.js +1 -0
- package/static/app/assets/Brain-XdHCIB6a.js +321 -0
- package/static/app/assets/BrainHome-Dp8gzQoF.js +2 -0
- package/static/app/assets/{BrainSignals-CesSPtUP.js → BrainSignals-D4yZflVt.js} +1 -1
- package/static/app/assets/Capture-BwSZmiZ8.js +1 -0
- package/static/app/assets/CommandPalette-Ds0DnRSC.js +1 -0
- package/static/app/assets/Library-SqzHjyfx.js +1 -0
- package/static/app/assets/{LivingBrain-Bz-h6LBH.js → LivingBrain-DpKt-NKE.js} +1 -1
- package/static/app/assets/{ProductFlow-DAZ7DJCE.js → ProductFlow-BimeVtWH.js} +1 -1
- package/static/app/assets/{ReviewCard-Bv0WGbY6.js → ReviewCard-DVPi1LPZ.js} +1 -1
- package/static/app/assets/System-w-9miIG8.js +1 -0
- package/static/app/assets/{activity-AolpZJCH.js → activity-C0QavXjd.js} +1 -1
- package/static/app/assets/arrow-left-TsAKz-s_.js +1 -0
- package/static/app/assets/{bot-CsVsT2nd.js → bot-C1-MbzCF.js} +1 -1
- package/static/app/assets/brain-CeRqzJVc.js +1 -0
- package/static/app/assets/{button-1BP1PJZ3.js → button-Z-2N8PUb.js} +1 -1
- package/static/app/assets/{circle-pause-5paeCOtq.js → circle-pause-CgjCLdmO.js} +1 -1
- package/static/app/assets/{circle-play-By8mFYRV.js → circle-play-Bj45uClm.js} +1 -1
- package/static/app/assets/{cpu-DvUQxdKe.js → cpu-B-2Chwfy.js} +1 -1
- package/static/app/assets/{download-CFqYG90a.js → download-CKmiOG3C.js} +1 -1
- package/static/app/assets/{folder-open-CVSnp-Dp.js → folder-open-fE7lLvhZ.js} +1 -1
- package/static/app/assets/{hard-drive-Ckr4Vd6-.js → hard-drive-rDl1xsJ1.js} +1 -1
- package/static/app/assets/index-AEIqmjwZ.js +10 -0
- package/static/app/assets/index-DcMODGjM.css +2 -0
- package/static/app/assets/{input-D-JKquXU.js → input-BflJYT5-.js} +1 -1
- package/static/app/assets/permissionCopy-BNNvkXSX.js +1 -0
- package/static/app/assets/{primitives-D8U9OaIo.js → primitives-CP68OWk2.js} +1 -1
- package/static/app/assets/search-B4O4iIgg.js +1 -0
- package/static/app/assets/share-2-CyjG2_yY.js +1 -0
- package/static/app/assets/{shield-alert-DnsvO79P.js → shield-alert-C_JBPWYd.js} +1 -1
- package/static/app/assets/{textarea-4RchwbTa.js → textarea-Ds1Exelb.js} +1 -1
- package/static/app/assets/{useFocusTrap-CFJjy7cS.js → useFocusTrap-BgIZQ4if.js} +1 -1
- package/static/app/assets/{useQuery-3Reu-A4a.js → useQuery-6Bu27NQe.js} +1 -1
- package/static/app/assets/{users-BTxYksxa.js → users-31lxlciQ.js} +1 -1
- package/static/app/assets/{utils-D02Vf-fw.js → utils-C0-C5mZc.js} +1 -1
- package/static/app/assets/workspace-DAB-urHL.js +1 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/AdminConsole-ZrTyN8_F.js +0 -1
- package/static/app/assets/Brain-CYHDXpPB.js +0 -321
- package/static/app/assets/BrainHome-bbJulb5g.js +0 -2
- package/static/app/assets/Capture-p5upXmz2.js +0 -1
- package/static/app/assets/CommandPalette-0zkyC0RY.js +0 -1
- package/static/app/assets/Library-Dt-vABI2.js +0 -1
- package/static/app/assets/System-BhrJQSD_.js +0 -1
- package/static/app/assets/brain-vuppco5y.js +0 -1
- package/static/app/assets/index--0zKF5Ow.js +0 -10
- package/static/app/assets/index-CEkL4_M-.css +0 -2
- package/static/app/assets/network-DB88FZ2T.js +0 -1
- package/static/app/assets/search-B8jsVTw_.js +0 -1
- package/static/app/assets/workspace-CSJNgX-C.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,9 +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  |
|
|
30
31
|
|
|
31
32
|
## Why Lattice AI
|
|
32
33
|
|
|
@@ -57,47 +58,62 @@ First-run flow — wake the Brain, pick the owner, load a recommended model:
|
|
|
57
58
|
|
|
58
59
|
| | | |
|
|
59
60
|
| --- | --- | --- |
|
|
60
|
-
|  |  |  |
|
|
61
62
|
|
|
62
63
|
Screenshot index and capture notes:
|
|
63
|
-
[output/release/v10.
|
|
64
|
+
[output/release/v10.6.0/SCREENSHOT_INDEX.md](output/release/v10.6.0/SCREENSHOT_INDEX.md)
|
|
64
65
|
|
|
65
66
|
## Current Release
|
|
66
67
|
|
|
67
|
-
The current release is **10.
|
|
68
|
-
|
|
69
|
-
10.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
68
|
+
The current release is **10.6.0 — Promoted Panels**:
|
|
69
|
+
|
|
70
|
+
10.5.0 changed the words on each screen. 10.6.0 changes where things sit. Every
|
|
71
|
+
main screen used to open as a row of equal tabs, which asks a first-time user to
|
|
72
|
+
choose before they know what the choices are. Each screen now opens on the panel
|
|
73
|
+
that answers the question that brought you there, and everything else moves
|
|
74
|
+
below it. No feature was removed — every panel is still on the page, it just no
|
|
75
|
+
longer competes for the top of it.
|
|
76
|
+
|
|
77
|
+
- **Each screen leads with one panel instead of a row of equals.** Capture opens
|
|
78
|
+
on a single 자료 추가하기 card holding all three ways to add material —
|
|
79
|
+
파일 올리기 / 폴더 연결하기 / 웹페이지 저장하기 — as a choice inside one card
|
|
80
|
+
rather than three tabs, with progress and connected folders moved to a quieter
|
|
81
|
+
second row. Work opens on 검토함, what is waiting on you, instead of on the
|
|
82
|
+
empty goal composer. The model library answers "which model is running, and
|
|
83
|
+
can I switch it" in a card above the tabs.
|
|
84
|
+
- **The Brain home is one card, not five stacked blocks.** Greeting, composer,
|
|
85
|
+
the add-material row and the autonomy dial now sit inside a single bordered
|
|
86
|
+
station that lifts when you type anywhere in it. The Brain artwork shrank so
|
|
87
|
+
that it introduces the composer rather than headlining the screen.
|
|
88
|
+
- **Everyday and management destinations stopped being one list.** 대화 · 자료 ·
|
|
89
|
+
기억 stay in the primary nav; 작업 · AI 모델 · 설정 became topbar links at
|
|
90
|
+
desktop widths and fold into the menu below that — built from one array so the
|
|
91
|
+
two copies cannot drift, and shown by one breakpoint so they can never both
|
|
92
|
+
appear or both vanish.
|
|
93
|
+
- **The knowledge graph became a subview rather than a third tab.** Memory opens
|
|
94
|
+
on search, with 연결 지도 열기 one button away and a labelled way back.
|
|
95
|
+
- **Seven settings tabs became three named groups** — 나와 작업공간 · 내 데이터
|
|
96
|
+
보관 · 동작 방식과 연결 — so the row reads as a short list of decisions.
|
|
97
|
+
- **Links that named a screen now open that screen.** `#/act/review` and its
|
|
98
|
+
siblings landed on the Brain home for every caller that emitted them — the
|
|
99
|
+
command palette, the daily briefing — because nothing parsed the
|
|
100
|
+
`<screen>/<tab>` form they had always used. The palette also read a private
|
|
101
|
+
second copy of the destination list, so 작업 opened a different screen
|
|
102
|
+
depending on whether you clicked it or searched for it. One list, one parser.
|
|
103
|
+
- **Guarded, not asserted.** The visual sweep walks ten viewport widths and
|
|
104
|
+
fails if a management link is visible in both places at once or in neither, if
|
|
105
|
+
a navigation landmark is unnamed or shares its name with another, or if the
|
|
106
|
+
topbar overflows.
|
|
91
107
|
|
|
92
108
|
Release notes: [RELEASE.md](RELEASE.md) · Full history: [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
|
93
109
|
|
|
94
|
-
Expected artifacts for 10.
|
|
110
|
+
Expected artifacts for 10.6.0 release must use exact filenames:
|
|
95
111
|
|
|
96
|
-
- `dist/ltcai-10.
|
|
97
|
-
- `dist/ltcai-10.
|
|
98
|
-
- `ltcai-10.
|
|
99
|
-
- `dist/ltcai-10.
|
|
100
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_10.
|
|
112
|
+
- `dist/ltcai-10.6.0-py3-none-any.whl`
|
|
113
|
+
- `dist/ltcai-10.6.0.tar.gz`
|
|
114
|
+
- `ltcai-10.6.0.tgz`
|
|
115
|
+
- `dist/ltcai-10.6.0.vsix`
|
|
116
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_10.6.0_aarch64.dmg`
|
|
101
117
|
|
|
102
118
|
Do not use wildcard artifact uploads. Package registry publishing remains owner-run.
|
|
103
119
|
|
|
@@ -132,6 +148,8 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for details and
|
|
|
132
148
|
|
|
133
149
|
| Version | Theme |
|
|
134
150
|
| --- | --- |
|
|
151
|
+
| 10.6.0 | Promoted Panels |
|
|
152
|
+
| 10.5.0 | Everyday Words |
|
|
135
153
|
| 10.4.0 | Named Ground |
|
|
136
154
|
| 10.3.0 | Measured Ground |
|
|
137
155
|
| 10.2.0 | Load-Bearing Fixes |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,159 @@ 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.6.0] - 2026-08-03
|
|
8
|
+
|
|
9
|
+
A layout rebuild, not a copy pass. Every main screen used to open as a row of
|
|
10
|
+
equal tabs; each now opens on the panel that answers the question that brought
|
|
11
|
+
the reader there, with everything else moved below it. No feature was removed —
|
|
12
|
+
every panel is still on its page. Backend behaviour is unchanged;
|
|
13
|
+
`frontend/openapi.json` differs from 10.5.0 only in `info.version`.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- **Capture leads with one card instead of four page-level tabs.** 파일 올리기 /
|
|
17
|
+
폴더 연결하기 / 웹페이지 저장하기 became a `role="group"` method picker inside
|
|
18
|
+
a single `자료 추가하기` station, with the chosen method's form opening in the
|
|
19
|
+
same card. Progress, folder health, connected sources and recent documents
|
|
20
|
+
moved to a two-column `.capture-secondary` row that is always visible instead
|
|
21
|
+
of hidden behind a tab. `#/my-computer`, `#/capture-browser` and `#/pipeline`
|
|
22
|
+
still resolve.
|
|
23
|
+
- **Work opens on 검토함 instead of the empty goal composer.** The shell's 작업
|
|
24
|
+
entry point moved from `#/agents` to `#/review`, the Runs tab leads the tab
|
|
25
|
+
strip, and 검토함 leads 실행 within it. The page heading and description now
|
|
26
|
+
follow the selected tab instead of repeating one sentence on all five.
|
|
27
|
+
- **The model library answers the active model above the tab strip.** A new
|
|
28
|
+
`지금 작동 중인 모델` card names the loaded model in human terms and offers
|
|
29
|
+
one-click switching, listing only models already downloaded, supported and
|
|
30
|
+
loadable — never one that is still awaiting consent. With none loaded it says
|
|
31
|
+
so ("아직 사용할 모델이 없어요").
|
|
32
|
+
- **The Brain home is one bordered station instead of five stacked blocks.**
|
|
33
|
+
Greeting, composer, the ingestion dock and the autonomy dial now live in one
|
|
34
|
+
card that lifts on `:focus-within`; the dock and the dial were two competing
|
|
35
|
+
strips and became one `.brain-station-toolbar` row. The Brain organism shrank
|
|
36
|
+
from 7rem to 5.4rem.
|
|
37
|
+
- **The knowledge graph is a subview, not a third peer tab.** Memory keeps two
|
|
38
|
+
tabs and reaches the graph through a `연결 지도 열기` button, which swaps the
|
|
39
|
+
tab strip for a labelled `기억 화면으로 돌아가기` bar. `#/knowledge-graph`
|
|
40
|
+
still resolves.
|
|
41
|
+
- **Settings' seven flat tabs became three named groups**: 나와 작업공간
|
|
42
|
+
(계정, 작업공간), 내 데이터 보관 (스냅샷, 활동), 동작 방식과 연결 (설정,
|
|
43
|
+
네트워크, 관리). All tab routes are unchanged.
|
|
44
|
+
- **Everyday and management destinations split.** 대화 · 자료 · 기억 stay in the
|
|
45
|
+
primary nav; 작업 · AI 모델 · 설정 render as topbar quick links at ≥960px and
|
|
46
|
+
inside the menu below that. Both copies are built from one array and shown by
|
|
47
|
+
one breakpoint in `shell.css`, so they cannot drift apart and cannot both
|
|
48
|
+
appear or both vanish.
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
- **`#/act/review` never opened the review inbox.** The command palette and the
|
|
52
|
+
daily briefing had always emitted `<screen>/<tab>` hashes, and `parseHash`
|
|
53
|
+
had no case for that shape, so `#/act/review`, `#/act/workflows` and
|
|
54
|
+
`#/brain/graph` all fell through to the Brain home. The generic form is now
|
|
55
|
+
parsed as the last step, after named aliases, so an alias always wins.
|
|
56
|
+
- **The command palette read a private second copy of the destination list.**
|
|
57
|
+
`commandRoutes` in `routes.ts` was not the list the palette rendered, so
|
|
58
|
+
repointing 작업 there changed nothing while the palette kept the old target —
|
|
59
|
+
one label meaning two different screens depending on how it was reached. The
|
|
60
|
+
palette now reads that single list, and its entries are i18n keys rather than
|
|
61
|
+
hardcoded English labels.
|
|
62
|
+
- **The menu's focus trap counted links the browser will not focus.** The menu
|
|
63
|
+
holds a copy of the management links that CSS hides once the topbar shows
|
|
64
|
+
them; those anchors stay in the DOM, so `querySelectorAll` put the trap's
|
|
65
|
+
first/last boundaries on hidden elements, and opening the menu could call
|
|
66
|
+
`focus()` on a `display:none` anchor — which silently does nothing, leaving
|
|
67
|
+
focus on the trigger. Both now filter to elements that are actually rendered.
|
|
68
|
+
- **Both the primary nav and the menu's list were named "화면 이동".** A landmark
|
|
69
|
+
list showed two navigations with the same name and no way to tell them apart.
|
|
70
|
+
The management list is now 관리 and shares the accessible name 관리 화면 이동
|
|
71
|
+
with its topbar twin, which is never visible at the same time.
|
|
72
|
+
- **Release frame 11 shipped a byte-identical copy of frame 06.** With the
|
|
73
|
+
pipeline moved out of its own tab, `#/pipeline` renders the same page as
|
|
74
|
+
`#/capture`, so the full-page capture produced the same file twice while the
|
|
75
|
+
README printed them as different tiles. `scripts/capture_release_evidence.mjs`
|
|
76
|
+
now frames the three-step card itself.
|
|
77
|
+
|
|
78
|
+
### Testing
|
|
79
|
+
- `tests/visual/v3.spec.js` asserts the new hierarchy: Brain home is one card
|
|
80
|
+
containing composer, dock and dial; the graph is reached by button and not by
|
|
81
|
+
tab; Capture has no page-level tabs and keeps its three deep links; the active
|
|
82
|
+
model card precedes the tab strip; the shell link and the command palette open
|
|
83
|
+
the same screen for 작업.
|
|
84
|
+
- A ten-width sweep (390px–1440px) fails if a management link is visible in both
|
|
85
|
+
places or in neither, if the topbar overflows, or if the menu button is
|
|
86
|
+
clipped. A separate check requires every visible `<nav>` to carry a unique
|
|
87
|
+
accessible name.
|
|
88
|
+
- `tests/visual/mock_server.cjs` now serves `POST /models/load` and
|
|
89
|
+
`GET /knowledge-graph/local/health`, so the one-click model switch and the
|
|
90
|
+
folder-health card render during capture instead of being photographed as
|
|
91
|
+
placeholders.
|
|
92
|
+
|
|
93
|
+
## [10.5.0] - 2026-08-03
|
|
94
|
+
|
|
95
|
+
A UI/UX pass for the person who did not build this. No feature was removed;
|
|
96
|
+
vocabulary, ordering, and the default mode a first-run user lands in changed.
|
|
97
|
+
Backend behaviour is unchanged — `frontend/openapi.json` differs from 10.4.0
|
|
98
|
+
only in `info.version`.
|
|
99
|
+
|
|
100
|
+
### Changed
|
|
101
|
+
- **Permission modes are named by what they do to you, not by their enum.**
|
|
102
|
+
엄격 / 신뢰 / 바이패스 → 먼저 물어보기 / 웬만하면 알아서 / 거의 다 알아서
|
|
103
|
+
(`Strict` / `Trusted` / `Bypass` → `Ask me first` / `Mostly on its own` /
|
|
104
|
+
`Almost everything on its own`), each with a one-line summary of what it does
|
|
105
|
+
without asking. The bypass warning now says which kind of action stays
|
|
106
|
+
blocked rather than naming the mode.
|
|
107
|
+
- **`#/pipeline` is reachable in basic mode and named 진행 상황.** Its two raw
|
|
108
|
+
API payload panels are replaced (in basic mode) by an `aria-label`ed ordered
|
|
109
|
+
list of three steps — 내용 읽기 / 뜻 파악하기 / 기억에 연결하기 — with a
|
|
110
|
+
per-step waiting/working/done state. Advanced mode keeps both payload panels.
|
|
111
|
+
- **Ingestion stage names describe the reader's file, not the machine's job**:
|
|
112
|
+
준비 → 파일 여는 중, 파싱 → 내용 읽는 중, 임베딩 → 뜻 파악하는 중, 인덱싱 →
|
|
113
|
+
기억에 연결하는 중, 메모리화 완료 → 기억 완료. The stale-embedding prompt
|
|
114
|
+
became "찾는 방식이 바뀌었어요 / 기억 다시 정리하기".
|
|
115
|
+
- **Run rows are titled by workflow name** (then goal, then title/query, then
|
|
116
|
+
"n번째 작업" in basic mode) instead of a database id; the id moves to a
|
|
117
|
+
secondary line in advanced mode only.
|
|
118
|
+
- **Run and trigger states are translated per token.**
|
|
119
|
+
`act.runStatus.<token>` covers ok/succeeded/completed/retried_ok/
|
|
120
|
+
awaiting_approval/waiting_approval/running/queued/pending/failed/error/
|
|
121
|
+
cancelled/stopped/interrupted/rejected/partial; an unmapped token renders
|
|
122
|
+
"알 수 없음" rather than itself.
|
|
123
|
+
- **Brain stats answer a person's question** — 저장 위치 / 내 컴퓨터 and
|
|
124
|
+
가져가기 / 언제든 내보낼 수 있어요 in place of `schema_version` and the
|
|
125
|
+
storage engine name (both still shown in advanced).
|
|
126
|
+
- **`scripts/capture_release_evidence.mjs` captures in `basic`**, the app's real
|
|
127
|
+
default, instead of `advanced`. Every README screenshot before this release
|
|
128
|
+
showed panels a first-run user never sees. `09-model-setup-status.png` (a
|
|
129
|
+
duplicate of the Brain home once captured in basic) is replaced by
|
|
130
|
+
`09-automation-runs.png`, and `11-knowledge-journey.png` is added.
|
|
131
|
+
- **The walkthrough GIF is encoded against a palette generated from the clip**
|
|
132
|
+
(`palettegen=stats_mode=diff` + `paletteuse=dither=sierra2_4a`) instead of
|
|
133
|
+
ffmpeg's default 256-colour cube, which had been rendering the ivory
|
|
134
|
+
background as dithered yellow and the greens as olive. 1.5 MB → 2.8 MB.
|
|
135
|
+
|
|
136
|
+
### Added
|
|
137
|
+
- `frontend/src/lib/permissionCopy.ts` — one source for permission-mode copy,
|
|
138
|
+
shared by `BrainQuickControls` (home dial) and `PermissionModePanel`
|
|
139
|
+
(Settings), which had each been translating the server catalog separately.
|
|
140
|
+
Lookup is by mode id, falling back to the server's own localized label, so a
|
|
141
|
+
mode added server-side still renders; `PermissionModePanel.test.tsx` asserts
|
|
142
|
+
that fallback so the table cannot become an accidental allowlist.
|
|
143
|
+
- A basic-mode "자동으로 실행되는 작업" summary on the workflows surface:
|
|
144
|
+
workflow name plus 새 자료가 들어오면 / 정해진 시간에 / 내가 눌렀을 때만 /
|
|
145
|
+
조건이 맞으면, and 켜져 있어요 / 지금은 멈춰 있어요. The node canvas and the
|
|
146
|
+
paste-JSON box are author tools and stay in advanced mode.
|
|
147
|
+
- `tests/visual/v3.spec.js`: a sweep over ten plain-mode routes asserting each
|
|
148
|
+
renders, shows no service-unavailable banner, and contains none of a list of
|
|
149
|
+
engine terms; plus a test that the three journey steps render under their
|
|
150
|
+
accessible name. `#/runs` failed the vocabulary assertion before this pass.
|
|
151
|
+
- `Library.test.tsx` covers registry prose that is English-only: a sentence with
|
|
152
|
+
no Hangul and six or more words is now replaced by a written Korean
|
|
153
|
+
explanation instead of being substituted term by term into word salad.
|
|
154
|
+
|
|
155
|
+
### Known gaps
|
|
156
|
+
- The approval card under 작업 → 실행 still labels raw payload fields `Action`,
|
|
157
|
+
`Action Label`, `User Email`. It is visible in `09-automation-runs.png` and is
|
|
158
|
+
published rather than cropped.
|
|
159
|
+
|
|
7
160
|
## [10.4.0] - 2026-08-02
|
|
8
161
|
|
|
9
162
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Community And Plugins
|
|
2
2
|
|
|
3
|
-
Current release: **10.
|
|
3
|
+
Current release: **10.6.0 — Promoted Panels**.
|
|
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.6.0 — Promoted Panels**.
|
|
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.6.0 — Promoted Panels**.
|
|
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/PERMISSION_MODE.md
CHANGED
|
@@ -36,10 +36,21 @@ Env default: `LATTICEAI_PERMISSION_MODE=strict|trusted|bypass`.
|
|
|
36
36
|
|
|
37
37
|
## UI
|
|
38
38
|
|
|
39
|
-
`PermissionModePanel` renders in
|
|
40
|
-
settings tab
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
`PermissionModePanel` renders in **설정 → 혼자 해도 되는 일** (`SystemPage`
|
|
40
|
+
settings tab; the section was called 에이전트 자율성 before 10.5.0). The same
|
|
41
|
+
dial is reachable on the home screen through `BrainQuickControls`.
|
|
42
|
+
|
|
43
|
+
It still renders whatever modes the catalog `/api/permission-mode/catalog`
|
|
44
|
+
returns rather than a hardcoded list, so a mode added server-side appears with
|
|
45
|
+
no frontend change. Since 10.5.0 the *wording* is no longer taken from the
|
|
46
|
+
server for modes the app knows: `frontend/src/lib/permissionCopy.ts` maps mode
|
|
47
|
+
id → plain-language label and summary (`strict` → 먼저 물어보기, `trusted` →
|
|
48
|
+
웬만하면 알아서, `bypass` → 거의 다 알아서), and both surfaces read that one
|
|
49
|
+
module so the dial cannot be named two ways. The server's own localized label
|
|
50
|
+
is the fallback for an id the map does not know — renaming a mode server-side
|
|
51
|
+
therefore changes the UI only for ids the app has no copy for.
|
|
52
|
+
|
|
53
|
+
The apply button stays disabled until
|
|
43
54
|
|
|
44
55
|
* a *different* mode is selected, and
|
|
45
56
|
* for a mode whose catalog entry sets `requires_ack`, the risk acknowledgement
|
package/docs/TRUST_MODEL.md
CHANGED
package/docs/WHY_LATTICE.md
CHANGED
package/docs/kg-schema.md
CHANGED
|
@@ -47,7 +47,7 @@ from typing import Any, Callable, Dict, List, Optional
|
|
|
47
47
|
from ..utils import now_iso as _now
|
|
48
48
|
from .contracts import multi_agent_contract
|
|
49
49
|
|
|
50
|
-
MULTI_AGENT_VERSION = "10.
|
|
50
|
+
MULTI_AGENT_VERSION = "10.6.0"
|
|
51
51
|
|
|
52
52
|
AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
|
|
53
53
|
CORE_PIPELINE = ("planner", "executor", "reviewer")
|
package/latticeai/__init__.py
CHANGED
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
from copy import deepcopy
|
|
11
11
|
from typing import Any, Dict, List, Optional
|
|
12
12
|
|
|
13
|
-
MARKETPLACE_VERSION = "10.
|
|
13
|
+
MARKETPLACE_VERSION = "10.6.0"
|
|
14
14
|
TEMPLATE_KINDS = ("plugin", "workflow", "agent", "ingestion_bridge")
|
|
15
15
|
|
|
16
16
|
|
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
from typing import Dict
|
|
12
12
|
|
|
13
|
-
WORKSPACE_OS_VERSION = "10.
|
|
13
|
+
WORKSPACE_OS_VERSION = "10.6.0"
|
|
14
14
|
|
|
15
15
|
# Workspace types separate single-user Personal workspaces from shared
|
|
16
16
|
# Organization workspaces. Both keep the same local-first JSON store; the type
|
package/package.json
CHANGED
|
@@ -53,12 +53,18 @@ async function main() {
|
|
|
53
53
|
const page = await context.newPage();
|
|
54
54
|
page.setDefaultTimeout(15000);
|
|
55
55
|
|
|
56
|
+
// These frames are the ones the README publishes, so they have to show the
|
|
57
|
+
// product a new person actually lands in. The app's own default is `basic`
|
|
58
|
+
// (frontend/src/store/appStore.ts) — capturing in `advanced` meant every
|
|
59
|
+
// published screenshot showed raw payload panels, storage engines and hook
|
|
60
|
+
// logs that no first-run user is ever shown. The admin console is captured
|
|
61
|
+
// by route below and does not depend on this setting.
|
|
56
62
|
await page.addInitScript(() => {
|
|
57
63
|
if (!sessionStorage.getItem("lattice.releaseEvidence.cleared")) {
|
|
58
64
|
localStorage.removeItem("lattice.productFlow.complete");
|
|
59
65
|
localStorage.removeItem("lattice.productFlow.user");
|
|
60
66
|
localStorage.setItem("lattice.language", "ko");
|
|
61
|
-
localStorage.setItem("lattice.mode", "
|
|
67
|
+
localStorage.setItem("lattice.mode", "basic");
|
|
62
68
|
sessionStorage.setItem("lattice.releaseEvidence.cleared", "true");
|
|
63
69
|
}
|
|
64
70
|
});
|
|
@@ -109,16 +115,34 @@ async function main() {
|
|
|
109
115
|
await page.locator("h1.page-title", { hasText: "Lattice를 내 방식에 맞게 설정하세요." }).waitFor();
|
|
110
116
|
await shot(page, "08-system.png");
|
|
111
117
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
await
|
|
118
|
+
// Captured in `basic`, the Brain page's knowledge-flow strip stays collapsed,
|
|
119
|
+
// so this slot published a second copy of 04. The runs list carries what
|
|
120
|
+
// actually changed instead: runs named the way their author named them, and
|
|
121
|
+
// statuses spoken aloud rather than shown as `awaiting_approval`.
|
|
122
|
+
await page.goto(`${baseURL}/app#/runs`, { waitUntil: "networkidle" });
|
|
123
|
+
await page.locator("h1.page-title").waitFor();
|
|
124
|
+
await page.getByText("내 승인 기다리는 중").first().waitFor();
|
|
125
|
+
await shot(page, "09-automation-runs.png");
|
|
117
126
|
|
|
118
127
|
await page.goto(`${baseURL}/app#/admin/users`, { waitUntil: "networkidle" });
|
|
119
128
|
await page.waitForTimeout(250);
|
|
120
129
|
await shot(page, "10-admin-console.png");
|
|
121
130
|
|
|
131
|
+
// The three named steps a file walks on its way into memory. 10.6.0 moved
|
|
132
|
+
// this out of a tab of its own and into Capture's second row, where it is now
|
|
133
|
+
// always on screen — so `#/pipeline` renders the same page as `#/capture`,
|
|
134
|
+
// and a full-page shot here came out byte-identical to 06. The README prints
|
|
135
|
+
// the two as different tiles, so frame the card this tile is actually about.
|
|
136
|
+
await page.goto(`${baseURL}/app#/pipeline`, { waitUntil: "networkidle" });
|
|
137
|
+
const journeyList = page.getByRole("list", { name: "자료가 기억이 되는 3단계" });
|
|
138
|
+
await journeyList.waitFor();
|
|
139
|
+
const journeyCard = page
|
|
140
|
+
.locator(".capture-secondary-column > *")
|
|
141
|
+
.filter({ has: journeyList })
|
|
142
|
+
.first();
|
|
143
|
+
await page.waitForTimeout(120);
|
|
144
|
+
await journeyCard.screenshot({ path: path.join(screenshots, "11-knowledge-journey.png") });
|
|
145
|
+
|
|
122
146
|
await page.goto(`${baseURL}/app#/review`, { waitUntil: "networkidle" });
|
|
123
147
|
await page.getByText(/Review Center|리뷰 센터|검토함/).first().waitFor();
|
|
124
148
|
const rawError = page.getByText(/not valid JSON|Unexpected token/);
|
|
@@ -137,10 +161,17 @@ async function main() {
|
|
|
137
161
|
if (fs.existsSync(webmTarget)) fs.unlinkSync(webmTarget);
|
|
138
162
|
if (fs.existsSync(gifTarget)) fs.unlinkSync(gifTarget);
|
|
139
163
|
fs.renameSync(recorded, webmTarget);
|
|
164
|
+
// ffmpeg's default GIF palette is a fixed 256-colour cube, which turned the
|
|
165
|
+
// app's ivory background into a dithered yellow and its greens into olive —
|
|
166
|
+
// this GIF is the first thing on the README, so it was publishing a product
|
|
167
|
+
// that does not exist. Generating the palette from the clip itself keeps the
|
|
168
|
+
// real colours.
|
|
140
169
|
execFileSync("ffmpeg", [
|
|
141
170
|
"-y",
|
|
142
171
|
"-i", webmTarget,
|
|
143
|
-
"-
|
|
172
|
+
"-filter_complex",
|
|
173
|
+
"fps=8,scale=960:-1:flags=lanczos,split[s0][s1];" +
|
|
174
|
+
"[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=sierra2_4a",
|
|
144
175
|
"-loop", "0",
|
|
145
176
|
gifTarget,
|
|
146
177
|
], { stdio: "ignore" });
|
|
@@ -161,8 +192,9 @@ Captured from the built React/Vite app served by the release visual API on ${new
|
|
|
161
192
|
| [06-capture.png](screenshots/06-capture.png) | Add Sources |
|
|
162
193
|
| [07-model-library.png](screenshots/07-model-library.png) | Model Library |
|
|
163
194
|
| [08-system.png](screenshots/08-system.png) | System |
|
|
164
|
-
| [09-
|
|
195
|
+
| [09-automation-runs.png](screenshots/09-automation-runs.png) | Automation runs, named and status-spoken |
|
|
165
196
|
| [10-admin-console.png](screenshots/10-admin-console.png) | Separate Admin Console |
|
|
197
|
+
| [11-knowledge-journey.png](screenshots/11-knowledge-journey.png) | Material-to-memory steps |
|
|
166
198
|
| [12-review-center.png](screenshots/12-review-center.png) | Automation Review Center |
|
|
167
199
|
|
|
168
200
|
## Motion Evidence
|
|
@@ -6,7 +6,7 @@ const root = process.cwd();
|
|
|
6
6
|
const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
|
|
7
7
|
const version = pkg.version;
|
|
8
8
|
const releaseDir = `output/release/v${version}`;
|
|
9
|
-
const releaseTheme = "
|
|
9
|
+
const releaseTheme = "Promoted Panels";
|
|
10
10
|
const title = `${version} — ${releaseTheme}`;
|
|
11
11
|
const escapedVersion = version.replaceAll(".", "\\.");
|
|
12
12
|
|
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED