ltcai 6.3.0 → 6.4.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 +38 -36
- package/docs/CHANGELOG.md +55 -0
- package/frontend/src/features/review/ReviewCard.tsx +12 -10
- package/frontend/src/features/review/ReviewInbox.tsx +15 -10
- package/frontend/src/i18n.ts +116 -0
- package/frontend/src/pages/Capture.tsx +48 -41
- package/lattice_brain/__init__.py +3 -1
- package/lattice_brain/quality.py +409 -0
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/knowledge_graph.py +71 -10
- package/latticeai/api/local_files.py +2 -0
- package/latticeai/api/memory.py +6 -6
- package/latticeai/api/search.py +9 -1
- package/latticeai/api/tools.py +3 -0
- package/latticeai/app_factory.py +17 -67
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/runtime/access_runtime.py +97 -0
- package/latticeai/runtime/chat_wiring.py +1 -0
- package/latticeai/services/memory_service.py +64 -21
- package/latticeai/services/router_context.py +4 -0
- package/latticeai/services/search_service.py +61 -10
- package/package.json +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 +3 -3
- package/static/app/assets/{index-D76dWuQk.js → index-t1jx1BR9.js} +2 -2
- package/static/app/assets/index-t1jx1BR9.js.map +1 -0
- package/static/app/index.html +1 -1
- package/static/app/assets/index-D76dWuQk.js.map +0 -1
package/README.md
CHANGED
|
@@ -69,42 +69,42 @@ You need Lattice AI when:
|
|
|
69
69
|
Choose the owner of the Brain. The profile is not a SaaS account by default; it
|
|
70
70
|
is the local identity for the knowledge you keep.
|
|
71
71
|
|
|
72
|
-

|
|
73
73
|
|
|
74
74
|
### 2. Environment Analysis
|
|
75
75
|
|
|
76
76
|
See what kind of local AI experience this computer can support before choosing a
|
|
77
77
|
model.
|
|
78
78
|
|
|
79
|
-

|
|
80
80
|
|
|
81
81
|
### 3. Recommended Models
|
|
82
82
|
|
|
83
83
|
Start with a short list: safest recommendation, faster model, stronger model.
|
|
84
84
|
Advanced details stay available without overwhelming first-time users.
|
|
85
85
|
|
|
86
|
-

|
|
87
87
|
|
|
88
88
|
### 4. Install And Load
|
|
89
89
|
|
|
90
90
|
Download and load only after consent. Lattice explains model size, local
|
|
91
91
|
execution, and network use before work starts.
|
|
92
92
|
|
|
93
|
-

|
|
94
94
|
|
|
95
95
|
### 5. Brain Chat
|
|
96
96
|
|
|
97
97
|
Talk normally. Useful decisions and context become memory, then appear later as
|
|
98
98
|
topics, relationships, and graph structure.
|
|
99
99
|
|
|
100
|
-

|
|
101
101
|
|
|
102
102
|
### 6. Review Center
|
|
103
103
|
|
|
104
104
|
Automation results are staged for review before they become durable decisions.
|
|
105
105
|
Snooze, unsnooze, run now, approve, and dismiss actions stay explicit.
|
|
106
106
|
|
|
107
|
-

|
|
108
108
|
|
|
109
109
|
## Brain Depths
|
|
110
110
|
|
|
@@ -120,10 +120,10 @@ The user travels inward from everyday memory to deeper structure:
|
|
|
120
120
|
|
|
121
121
|
Walkthrough:
|
|
122
122
|
|
|
123
|
-

|
|
124
124
|
|
|
125
125
|
Screenshot index and capture notes:
|
|
126
|
-
[output/release/v6.
|
|
126
|
+
[output/release/v6.4.0/SCREENSHOT_INDEX.md](output/release/v6.4.0/SCREENSHOT_INDEX.md)
|
|
127
127
|
|
|
128
128
|
## Install
|
|
129
129
|
|
|
@@ -200,34 +200,31 @@ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for developer workflow details.
|
|
|
200
200
|
|
|
201
201
|
## Current Release Preparation
|
|
202
202
|
|
|
203
|
-
The current development target is **6.
|
|
204
|
-
|
|
205
|
-
- `
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
-
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
- `dist/ltcai-6.
|
|
227
|
-
- `
|
|
228
|
-
- `ltcai-6.3.0.tgz`
|
|
229
|
-
- `dist/ltcai-6.3.0.vsix`
|
|
230
|
-
- `src-tauri/target/release/bundle/dmg/Lattice AI_6.3.0_aarch64.dmg`
|
|
203
|
+
The current development target is **6.4.0 Digital Brain Quality Hardening**:
|
|
204
|
+
|
|
205
|
+
- `lattice_brain.quality` adds a non-destructive Brain quality layer for
|
|
206
|
+
embedding fallback labelling, drift/re-index planning, BM25 lexical scoring,
|
|
207
|
+
hybrid fusion, reranker fallback contracts, memory candidate quality,
|
|
208
|
+
graph-edge confidence/evidence scoring, structured context guardrails, and
|
|
209
|
+
retrieval benchmark metrics.
|
|
210
|
+
- Graph/search API reads now carry workspace scope through graph, node,
|
|
211
|
+
neighborhood, relationship, keyword, vector, graph, and hybrid search paths.
|
|
212
|
+
- Memory Manager prune, compact, and clear operations are scoped to the
|
|
213
|
+
caller's workspace and owner boundary; unscoped graph clearing from Memory
|
|
214
|
+
Manager is blocked until a workspace-safe graph delete path exists.
|
|
215
|
+
- Digital Brain quality documentation now records the 6.4.0 baseline, risk
|
|
216
|
+
register, validation checklist, and intentionally deferred work.
|
|
217
|
+
- The release remains local-first: no automatic web/email/calendar ingestion,
|
|
218
|
+
no package publishing, no production deployment, and no external reranker or
|
|
219
|
+
embedding API use without explicit opt-in.
|
|
220
|
+
|
|
221
|
+
Expected artifacts for 6.4.0 release must use exact filenames:
|
|
222
|
+
|
|
223
|
+
- `dist/ltcai-6.4.0-py3-none-any.whl`
|
|
224
|
+
- `dist/ltcai-6.4.0.tar.gz`
|
|
225
|
+
- `ltcai-6.4.0.tgz`
|
|
226
|
+
- `dist/ltcai-6.4.0.vsix`
|
|
227
|
+
- `src-tauri/target/release/bundle/dmg/Lattice AI_6.4.0_aarch64.dmg`
|
|
231
228
|
|
|
232
229
|
Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
233
230
|
|
|
@@ -246,6 +243,11 @@ Do not upload `dist/*`. Package registry publishing remains owner-run.
|
|
|
246
243
|
|
|
247
244
|
| Version | Theme |
|
|
248
245
|
| --- | --- |
|
|
246
|
+
| 6.4.0 | Digital Brain Quality Hardening: workspace-scoped graph/search/memory reads and mutations, Brain quality primitives, structured context guardrails, and retrieval benchmark coverage |
|
|
247
|
+
| 6.3.1 | Access Runtime / i18n Follow-up: app-factory access-control extraction, focused access runtime tests, and Capture/Review Center i18n coverage |
|
|
248
|
+
| 6.3.0 | Product Hardening Completion: Brain archive/provenance/ingestion UX polish, Review Center Run Now contract hardening, local model runtime status, app-factory review wiring, shim smoke, i18n guard, and exact release artifacts |
|
|
249
|
+
| 6.2.0 | Product Decomposition / Release Smoke Automation: App and ProductFlow feature extraction, legacy root shim shrink, model download consent UX, typed router contexts, localized smoke tests, and wheel/npm/static/Tauri release smoke |
|
|
250
|
+
| 6.1.0 | Product Hardening / Digital Brain Completion: local Brain entry without a loaded model, Brain memory/backup loop, Review Center semantics, ToolRegistry authorization boundary, and root CLI/runtime compatibility |
|
|
249
251
|
| 6.0.0 | Product Reset / Review Center Completion: Snoozed filter, Unsnooze, OpenAPI-derived Review typing, Review feature extraction, v6 docs and scorecard |
|
|
250
252
|
| 5.6.0 | Brain Automation Review Center: workspace-scoped automation review inbox, source-aware provenance, guarded approve/dismiss/snooze/run_now actions, and Act Review tab |
|
|
251
253
|
| 5.5.0 | Release Coordination: synchronized package/runtime/static versions and release docs for the 5.5.0 line while preserving v5.4.0 Brain Automation Scheduler behavior |
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,61 @@
|
|
|
3
3
|
The top entry is the current release-preparation target. Older entries are
|
|
4
4
|
historical and may describe behavior as it existed at that release.
|
|
5
5
|
|
|
6
|
+
## [6.4.0] - 2026-06-17
|
|
7
|
+
|
|
8
|
+
> Digital Brain Quality Hardening. Tightens workspace-scoped Brain retrieval
|
|
9
|
+
> and memory mutation boundaries while adding non-destructive quality primitives
|
|
10
|
+
> for embeddings, retrieval, memory, graph validation, context assembly, and
|
|
11
|
+
> benchmarks.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- `lattice_brain.quality` with embedding fallback labelling, drift/re-index
|
|
15
|
+
planning, BM25 lexical scoring, hybrid fusion, reranker fallback contracts,
|
|
16
|
+
memory candidate scoring/deduplication/conflict/retention helpers, graph edge
|
|
17
|
+
confidence/evidence metrics, structured context guardrails, and retrieval
|
|
18
|
+
benchmark metric calculation.
|
|
19
|
+
- `docs/v6.4/BRAIN_QUALITY_BASELINE.md` documenting the 6.4.0 Digital Brain
|
|
20
|
+
quality baseline, risk register, validation items, and deferred work.
|
|
21
|
+
- Refreshed README release evidence screenshots and walkthrough GIF under
|
|
22
|
+
`output/release/v6.4.0/`.
|
|
23
|
+
- Unit coverage for Brain quality primitives and workspace-scoped graph/search
|
|
24
|
+
and memory-manager mutation boundaries.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- `/api/graph*`, `/knowledge-graph/*`, and hybrid-search service paths now
|
|
28
|
+
preserve workspace scope across graph, node, neighborhood, relationship,
|
|
29
|
+
keyword, vector, graph, and hybrid retrieval.
|
|
30
|
+
- Memory Manager prune, compact, and clear operations now intersect requested
|
|
31
|
+
ids/kinds with the caller's scoped memory set.
|
|
32
|
+
- Memory Manager graph clear is blocked because the existing graph clear path
|
|
33
|
+
is not workspace-scoped.
|
|
34
|
+
- Package/runtime/static metadata is synchronized to 6.4.0; package publish and
|
|
35
|
+
deployment remain owner-run only.
|
|
36
|
+
|
|
37
|
+
## [6.3.1] - 2026-06-17
|
|
38
|
+
|
|
39
|
+
> Access Runtime / i18n Follow-up. Closes the next app-factory decomposition
|
|
40
|
+
> slice and finishes Capture/Review Center localization coverage on top of the
|
|
41
|
+
> v6.3.0 product-hardening line.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
- Moved app-factory access-control helper closures into
|
|
45
|
+
`latticeai.runtime.access_runtime` while preserving role lookup, token
|
|
46
|
+
extraction, user enforcement, admin enforcement, and public user projection
|
|
47
|
+
call signatures.
|
|
48
|
+
- Capture tabs, headings, placeholders, action labels, upload details, folder
|
|
49
|
+
connection copy, browser capture copy, and pipeline controls now use the
|
|
50
|
+
shared Korean/English i18n map.
|
|
51
|
+
- Review Center inbox/card copy, status badges, empty states, Run Now feedback,
|
|
52
|
+
snooze/unsnooze labels, and action aria labels now use the shared i18n map.
|
|
53
|
+
- README release evidence screenshots and walkthrough GIF are refreshed under
|
|
54
|
+
`output/release/v6.3.1/`.
|
|
55
|
+
- Package/runtime/static metadata is synchronized to 6.3.1; package publish and
|
|
56
|
+
deployment remain owner-run only.
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
- Focused unit coverage for the extracted access runtime auth/admin behavior.
|
|
60
|
+
|
|
6
61
|
## [6.3.0] - 2026-06-16
|
|
7
62
|
|
|
8
63
|
> Product Hardening Completion. Completes the 6.2 decomposition follow-up by
|
|
@@ -3,6 +3,7 @@ import type { ApiResult, ReviewItem } from "@/api/client";
|
|
|
3
3
|
import { ActionButton, KeyValueList } from "@/components/primitives";
|
|
4
4
|
import { Badge } from "@/components/ui/badge";
|
|
5
5
|
import { Button } from "@/components/ui/button";
|
|
6
|
+
import { t } from "@/i18n";
|
|
6
7
|
import { useAppStore } from "@/store/appStore";
|
|
7
8
|
import {
|
|
8
9
|
formatSnoozedUntil,
|
|
@@ -22,6 +23,7 @@ type ReviewCardProps = {
|
|
|
22
23
|
|
|
23
24
|
export function ReviewCard({ item, feedback, onAction }: ReviewCardProps) {
|
|
24
25
|
const mode = useAppStore((state) => state.mode);
|
|
26
|
+
const language = useAppStore((state) => state.language);
|
|
25
27
|
const provenance = item.provenance || {};
|
|
26
28
|
const payload = item.payload || {};
|
|
27
29
|
const hadRun = hasRunBefore(item);
|
|
@@ -45,10 +47,10 @@ export function ReviewCard({ item, feedback, onAction }: ReviewCardProps) {
|
|
|
45
47
|
<div className="mt-3 flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-muted/24 p-3 text-sm">
|
|
46
48
|
<div>
|
|
47
49
|
<div className="font-medium">{formatSnoozedUntil(item.snoozed_until)}</div>
|
|
48
|
-
<p className="mt-1 text-muted-foreground">
|
|
50
|
+
<p className="mt-1 text-muted-foreground">{t(language, "review.snoozed.detail")}</p>
|
|
49
51
|
</div>
|
|
50
52
|
<Button size="sm" variant="outline" onClick={() => onAction(item, "unsnooze")} disabled={!actionable}>
|
|
51
|
-
<RotateCcw className="h-3.5 w-3.5" />
|
|
53
|
+
<RotateCcw className="h-3.5 w-3.5" /> {t(language, "review.unsnooze")}
|
|
52
54
|
</Button>
|
|
53
55
|
</div>
|
|
54
56
|
) : null}
|
|
@@ -73,24 +75,24 @@ export function ReviewCard({ item, feedback, onAction }: ReviewCardProps) {
|
|
|
73
75
|
{actionable ? (
|
|
74
76
|
<div className="mt-4 grid gap-2">
|
|
75
77
|
<p className="text-xs leading-5 text-muted-foreground">
|
|
76
|
-
|
|
78
|
+
{t(language, "review.runNow.detail")}
|
|
77
79
|
</p>
|
|
78
|
-
<div className="flex flex-wrap gap-2" aria-label="
|
|
80
|
+
<div className="flex flex-wrap gap-2" aria-label={t(language, "review.actions.aria")}>
|
|
79
81
|
<ActionButton
|
|
80
|
-
label=
|
|
81
|
-
successLabel={hadRun ? "
|
|
82
|
+
label={t(language, "review.runNow")}
|
|
83
|
+
successLabel={hadRun ? t(language, "review.regenerated") : t(language, "review.executed")}
|
|
82
84
|
action={() => onAction(item, "run_now", hadRun)}
|
|
83
85
|
invalidate={[]}
|
|
84
86
|
/>
|
|
85
|
-
<ActionButton label="
|
|
86
|
-
{!snoozed ? <ActionButton label=
|
|
87
|
-
<ActionButton label="
|
|
87
|
+
<ActionButton label={t(language, "review.approve")} action={() => onAction(item, "approve")} invalidate={[]} />
|
|
88
|
+
{!snoozed ? <ActionButton label={t(language, "review.snoozeDay")} action={() => onAction(item, "snooze")} invalidate={[]} /> : null}
|
|
89
|
+
<ActionButton label={t(language, "review.dismiss")} action={() => onAction(item, "dismiss")} invalidate={[]} variant="destructive" />
|
|
88
90
|
</div>
|
|
89
91
|
</div>
|
|
90
92
|
) : null}
|
|
91
93
|
{feedback ? (
|
|
92
94
|
<p className={`mt-2 text-xs ${/fail|error|unavailable/i.test(feedback) ? "text-amber-300" : "text-emerald-300"}`}>
|
|
93
|
-
{feedback} -
|
|
95
|
+
{feedback} - {t(language, "review.feedback.open")}
|
|
94
96
|
</p>
|
|
95
97
|
) : null}
|
|
96
98
|
</div>
|
|
@@ -4,6 +4,8 @@ import { latticeApi, type ReviewItem, type ReviewSourceFilter, type ReviewStatus
|
|
|
4
4
|
import { EmptyState, LoadingPanel, Tabs } from "@/components/primitives";
|
|
5
5
|
import { Badge } from "@/components/ui/badge";
|
|
6
6
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
7
|
+
import { t } from "@/i18n";
|
|
8
|
+
import { useAppStore } from "@/store/appStore";
|
|
7
9
|
import { ReviewCard } from "./ReviewCard";
|
|
8
10
|
import {
|
|
9
11
|
defaultSnoozeUntil,
|
|
@@ -13,6 +15,7 @@ import {
|
|
|
13
15
|
} from "./reviewHelpers";
|
|
14
16
|
|
|
15
17
|
export function ReviewInbox() {
|
|
18
|
+
const language = useAppStore((state) => state.language);
|
|
16
19
|
const qc = useQueryClient();
|
|
17
20
|
const [statusFilter, setStatusFilter] = React.useState<ReviewStatusFilter>("pending");
|
|
18
21
|
const [sourceFilter, setSourceFilter] = React.useState<ReviewSourceFilter>("all");
|
|
@@ -41,7 +44,7 @@ export function ReviewInbox() {
|
|
|
41
44
|
if (!result.ok) {
|
|
42
45
|
setRunFeedback((prev) => ({
|
|
43
46
|
...prev,
|
|
44
|
-
[item.id]: result.error ||
|
|
47
|
+
[item.id]: result.error || t(language, "review.action.failed", { action }),
|
|
45
48
|
}));
|
|
46
49
|
return result;
|
|
47
50
|
}
|
|
@@ -52,7 +55,9 @@ export function ReviewInbox() {
|
|
|
52
55
|
const runId = String(payload.last_run_id || provenance.run_id || "");
|
|
53
56
|
setRunFeedback((prev) => ({
|
|
54
57
|
...prev,
|
|
55
|
-
[item.id]: runId
|
|
58
|
+
[item.id]: runId
|
|
59
|
+
? `${hadRunBefore ? t(language, "review.regenerated") : t(language, "review.executed")} · ${runId}`
|
|
60
|
+
: hadRunBefore ? t(language, "review.regenerated") : t(language, "review.executed"),
|
|
56
61
|
}));
|
|
57
62
|
} else {
|
|
58
63
|
setRunFeedback((prev) => {
|
|
@@ -66,18 +71,18 @@ export function ReviewInbox() {
|
|
|
66
71
|
return result;
|
|
67
72
|
};
|
|
68
73
|
|
|
69
|
-
if (reviews.isLoading) return <LoadingPanel title="
|
|
74
|
+
if (reviews.isLoading) return <LoadingPanel title={t(language, "review.inbox.title")} />;
|
|
70
75
|
|
|
71
76
|
return (
|
|
72
77
|
<Card>
|
|
73
78
|
<CardHeader className="gap-3">
|
|
74
79
|
<div className="flex flex-wrap items-start justify-between gap-3">
|
|
75
80
|
<div>
|
|
76
|
-
<CardTitle>
|
|
77
|
-
<CardDescription>
|
|
81
|
+
<CardTitle>{t(language, "review.inbox.title")}</CardTitle>
|
|
82
|
+
<CardDescription>{t(language, "review.inbox.description")}</CardDescription>
|
|
78
83
|
</div>
|
|
79
84
|
{reviews.data ? (
|
|
80
|
-
<Badge variant={reviews.data.ok ? "success" : "warning"}>{reviews.data.ok ? "connected" : "unavailable"}</Badge>
|
|
85
|
+
<Badge variant={reviews.data.ok ? "success" : "warning"}>{reviews.data.ok ? t(language, "review.status.connected") : t(language, "review.status.unavailable")}</Badge>
|
|
81
86
|
) : null}
|
|
82
87
|
</div>
|
|
83
88
|
<div className="grid gap-2">
|
|
@@ -96,13 +101,13 @@ export function ReviewInbox() {
|
|
|
96
101
|
<CardContent>
|
|
97
102
|
{reviews.isError || (reviews.data && !reviews.data.ok) ? (
|
|
98
103
|
<EmptyState
|
|
99
|
-
title="
|
|
100
|
-
detail={reviews.data?.error || "
|
|
104
|
+
title={t(language, "review.inbox.loadError")}
|
|
105
|
+
detail={reviews.data?.error || t(language, "review.inbox.unavailable")}
|
|
101
106
|
/>
|
|
102
107
|
) : !items.length ? (
|
|
103
108
|
<EmptyState
|
|
104
|
-
title="
|
|
105
|
-
detail={statusFilter === "snoozed" ? "
|
|
109
|
+
title={t(language, "review.inbox.empty")}
|
|
110
|
+
detail={statusFilter === "snoozed" ? t(language, "review.inbox.emptySnoozed") : t(language, "review.inbox.emptyPending")}
|
|
106
111
|
/>
|
|
107
112
|
) : (
|
|
108
113
|
<div className="grid gap-3">
|
package/frontend/src/i18n.ts
CHANGED
|
@@ -109,6 +109,64 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
109
109
|
"care.result.path": "파일: {path}",
|
|
110
110
|
"care.result.contents": "기억 {memories}개 · 연결 {links}개 · 대화 {conversations}개",
|
|
111
111
|
"care.result.dryRun": "미리보기만 실행되어 현재 Brain은 바뀌지 않았습니다.",
|
|
112
|
+
"capture.tab.files": "파일",
|
|
113
|
+
"capture.tab.local": "폴더",
|
|
114
|
+
"capture.tab.browser": "웹",
|
|
115
|
+
"capture.tab.pipeline": "흐름",
|
|
116
|
+
"capture.kicker": "추가",
|
|
117
|
+
"capture.title": "중요한 자료를 Brain에 넣으세요.",
|
|
118
|
+
"capture.body": "파일을 넣고, 폴더를 연결하고, 웹페이지를 저장하세요. Lattice는 배운 생각의 출처를 함께 기억합니다.",
|
|
119
|
+
"capture.retry": "다시 시도",
|
|
120
|
+
"capture.files.title": "문서 추가",
|
|
121
|
+
"capture.files.description": "파일을 선택하면 Lattice가 검색과 기억에 들어갈 수 있게 준비합니다.",
|
|
122
|
+
"capture.files.drop": "파일을 놓거나 문서를 선택",
|
|
123
|
+
"capture.files.dropDetail": "각 파일은 대기열에 들어가고, 파싱된 뒤 Memory에 저장되며, 출처 메타데이터와 함께 Brain 그래프에 연결됩니다.",
|
|
124
|
+
"capture.files.uploaded": "업로드된 문서",
|
|
125
|
+
"capture.files.completed": "완료된 업로드는 Memory에 들어간 뒤 여기에 표시됩니다. 그래프 링크는 파싱 후 잠시 더 만들어질 수 있습니다.",
|
|
126
|
+
"capture.files.success": "Brain과 그래프 대기열에 들어감",
|
|
127
|
+
"capture.files.queued": "수집 대기열에서 대기 중",
|
|
128
|
+
"capture.files.uploading": "파싱 후 Memory로 전송 중",
|
|
129
|
+
"capture.files.failed": "Brain에 들어가기 전에 수집에 실패했습니다.",
|
|
130
|
+
"capture.files.captured": "출처 메타데이터와 함께 수집됨",
|
|
131
|
+
"capture.files.capturedWithNode": "출처 메타데이터와 함께 수집됨 · {node}",
|
|
132
|
+
"capture.local.title": "폴더 연결",
|
|
133
|
+
"capture.local.description": "Lattice가 기억해야 할 폴더를 지정하세요.",
|
|
134
|
+
"capture.local.placeholder": "이 Mac의 폴더 경로",
|
|
135
|
+
"capture.local.connect": "폴더 연결",
|
|
136
|
+
"capture.local.success": "폴더 연결 요청됨",
|
|
137
|
+
"capture.local.sources": "연결된 출처",
|
|
138
|
+
"capture.local.access": "폴더 접근",
|
|
139
|
+
"capture.browser.title": "웹페이지 저장",
|
|
140
|
+
"capture.browser.description": "유용한 내용을 기억할 수 있게 페이지를 수집합니다.",
|
|
141
|
+
"capture.browser.placeholder": "https://example.com/article",
|
|
142
|
+
"capture.browser.capture": "URL 수집",
|
|
143
|
+
"capture.browser.success": "URL 수집 요청됨",
|
|
144
|
+
"capture.pipeline.status": "처리 상태",
|
|
145
|
+
"capture.pipeline.growth": "Brain 성장",
|
|
146
|
+
"capture.pipeline.refresh": "기억 새로고침",
|
|
147
|
+
"capture.pipeline.description": "수집한 자료를 Lattice가 다시 확인해야 할 때 검색을 새로고침합니다.",
|
|
148
|
+
"capture.pipeline.rebuild": "검색 인덱스 다시 만들기",
|
|
149
|
+
"review.inbox.title": "검토함",
|
|
150
|
+
"review.inbox.description": "결정 대기 중인 자동화 제안입니다. 지금 실행은 승인 없이 미리보기만 수행합니다.",
|
|
151
|
+
"review.status.connected": "연결됨",
|
|
152
|
+
"review.status.unavailable": "사용 불가",
|
|
153
|
+
"review.inbox.loadError": "검토함을 불러올 수 없습니다.",
|
|
154
|
+
"review.inbox.unavailable": "지금은 검토 대기열을 사용할 수 없습니다.",
|
|
155
|
+
"review.inbox.empty": "검토할 항목 없음",
|
|
156
|
+
"review.inbox.emptySnoozed": "일시 중지된 항목은 해제되거나 다시 대기 상태가 될 때까지 여기에 표시됩니다.",
|
|
157
|
+
"review.inbox.emptyPending": "자동화가 검토 대기열을 사용하면 새 제안이 여기에 표시됩니다.",
|
|
158
|
+
"review.snoozed.detail": "해당 시점까지 대기열에서 빠져 있습니다. 일시 중지 해제 시 즉시 돌아옵니다.",
|
|
159
|
+
"review.unsnooze": "일시 중지 해제",
|
|
160
|
+
"review.runNow.detail": "지금 실행은 승인 없이 작업을 미리봅니다. 결과가 맞으면 승인하거나 기각하세요.",
|
|
161
|
+
"review.actions.aria": "검토 작업",
|
|
162
|
+
"review.runNow": "지금 실행",
|
|
163
|
+
"review.regenerated": "다시 생성됨",
|
|
164
|
+
"review.executed": "실행됨",
|
|
165
|
+
"review.approve": "승인",
|
|
166
|
+
"review.snoozeDay": "하루 일시 중지",
|
|
167
|
+
"review.dismiss": "기각",
|
|
168
|
+
"review.feedback.open": "승인 또는 기각 전까지 항목은 열린 상태로 유지됩니다.",
|
|
169
|
+
"review.action.failed": "{action} 실패",
|
|
112
170
|
"admin.back": "Brain",
|
|
113
171
|
"admin.aria.console": "Lattice 관리자",
|
|
114
172
|
"admin.kicker": "분리된 관리자 작업공간",
|
|
@@ -372,6 +430,64 @@ export const COPY: Record<Language, TextMap> = {
|
|
|
372
430
|
"care.result.path": "File: {path}",
|
|
373
431
|
"care.result.contents": "{memories} memories · {links} links · {conversations} conversations",
|
|
374
432
|
"care.result.dryRun": "Preview only; your current Brain was not changed.",
|
|
433
|
+
"capture.tab.files": "Files",
|
|
434
|
+
"capture.tab.local": "Folders",
|
|
435
|
+
"capture.tab.browser": "Web",
|
|
436
|
+
"capture.tab.pipeline": "Flow",
|
|
437
|
+
"capture.kicker": "Add",
|
|
438
|
+
"capture.title": "Feed the brain what matters.",
|
|
439
|
+
"capture.body": "Drop in files, connect folders, or save a page. Lattice remembers the origin of every idea it learns.",
|
|
440
|
+
"capture.retry": "Retry",
|
|
441
|
+
"capture.files.title": "Add documents",
|
|
442
|
+
"capture.files.description": "Choose files and Lattice will prepare them for search and memory.",
|
|
443
|
+
"capture.files.drop": "Drop files or choose documents",
|
|
444
|
+
"capture.files.dropDetail": "Each file is queued, parsed, written to Memory, and linked into the Brain graph with source metadata.",
|
|
445
|
+
"capture.files.uploaded": "Uploaded documents",
|
|
446
|
+
"capture.files.completed": "Completed uploads appear here after they enter Memory. Graph links may continue building briefly after parsing finishes.",
|
|
447
|
+
"capture.files.success": "Entered Brain and graph queue",
|
|
448
|
+
"capture.files.queued": "Waiting in the ingest queue",
|
|
449
|
+
"capture.files.uploading": "Parsing and sending to Memory",
|
|
450
|
+
"capture.files.failed": "Ingest failed before it entered the Brain",
|
|
451
|
+
"capture.files.captured": "Captured with source metadata",
|
|
452
|
+
"capture.files.capturedWithNode": "Captured with source metadata · {node}",
|
|
453
|
+
"capture.local.title": "Connect a folder",
|
|
454
|
+
"capture.local.description": "Point Lattice at a folder you want it to remember.",
|
|
455
|
+
"capture.local.placeholder": "Folder path on this Mac",
|
|
456
|
+
"capture.local.connect": "Connect Folder",
|
|
457
|
+
"capture.local.success": "Folder connection requested",
|
|
458
|
+
"capture.local.sources": "Connected sources",
|
|
459
|
+
"capture.local.access": "Folder access",
|
|
460
|
+
"capture.browser.title": "Save a web page",
|
|
461
|
+
"capture.browser.description": "Capture a page so Lattice can remember the useful parts.",
|
|
462
|
+
"capture.browser.placeholder": "https://example.com/article",
|
|
463
|
+
"capture.browser.capture": "Capture URL",
|
|
464
|
+
"capture.browser.success": "URL capture requested",
|
|
465
|
+
"capture.pipeline.status": "Processing status",
|
|
466
|
+
"capture.pipeline.growth": "Brain growth",
|
|
467
|
+
"capture.pipeline.refresh": "Refresh memory",
|
|
468
|
+
"capture.pipeline.description": "Refresh search when you want Lattice to re-check captured material.",
|
|
469
|
+
"capture.pipeline.rebuild": "Rebuild retrieval index",
|
|
470
|
+
"review.inbox.title": "Review inbox",
|
|
471
|
+
"review.inbox.description": "Automation suggestions waiting for your decision. Run now previews without approving.",
|
|
472
|
+
"review.status.connected": "connected",
|
|
473
|
+
"review.status.unavailable": "unavailable",
|
|
474
|
+
"review.inbox.loadError": "Could not load review inbox",
|
|
475
|
+
"review.inbox.unavailable": "The review queue is not available right now.",
|
|
476
|
+
"review.inbox.empty": "Nothing to review",
|
|
477
|
+
"review.inbox.emptySnoozed": "Snoozed items will appear here until they are unsnoozed or become pending again.",
|
|
478
|
+
"review.inbox.emptyPending": "When automations opt into the review queue, new suggestions will appear here.",
|
|
479
|
+
"review.snoozed.detail": "This stays out of the pending queue until then. Unsnooze brings it back immediately.",
|
|
480
|
+
"review.unsnooze": "Unsnooze",
|
|
481
|
+
"review.runNow.detail": "Run now previews the action without approving it. Approve or dismiss when the result looks right.",
|
|
482
|
+
"review.actions.aria": "Review actions",
|
|
483
|
+
"review.runNow": "Run now",
|
|
484
|
+
"review.regenerated": "Regenerated",
|
|
485
|
+
"review.executed": "Executed",
|
|
486
|
+
"review.approve": "Approve",
|
|
487
|
+
"review.snoozeDay": "Snooze 1 day",
|
|
488
|
+
"review.dismiss": "Dismiss",
|
|
489
|
+
"review.feedback.open": "item stays open until you approve or dismiss.",
|
|
490
|
+
"review.action.failed": "{action} failed",
|
|
375
491
|
"admin.back": "Brain",
|
|
376
492
|
"admin.aria.console": "Lattice Admin",
|
|
377
493
|
"admin.kicker": "Separate admin workspace",
|