ltcai 4.0.1 → 4.2.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 +33 -24
- package/desktop/electron/main.cjs +44 -0
- package/docs/CHANGELOG.md +84 -0
- package/docs/V4_1_FRONTEND_ARCHITECTURE_REVIEW.md +65 -0
- package/docs/V4_1_FRONTEND_MIGRATION_REPORT.md +70 -0
- package/docs/V4_1_VALIDATION_REPORT.md +47 -0
- package/docs/V4_2_BRAIN_CORE_ARCHITECTURE.md +97 -0
- package/docs/V4_2_STORAGE_MIGRATION_REPORT.md +91 -0
- package/docs/V4_2_VALIDATION_REPORT.md +89 -0
- package/docs/V4_DIGITAL_BRAIN_RECOVERY.md +31 -26
- package/frontend/index.html +24 -0
- package/frontend/openapi.json +14436 -0
- package/frontend/src/App.tsx +184 -0
- package/frontend/src/api/client.ts +320 -0
- package/frontend/src/api/openapi.ts +16921 -0
- package/frontend/src/components/primitives.tsx +204 -0
- package/frontend/src/components/ui/badge.tsx +27 -0
- package/frontend/src/components/ui/button.tsx +37 -0
- package/frontend/src/components/ui/card.tsx +22 -0
- package/frontend/src/components/ui/input.tsx +16 -0
- package/frontend/src/components/ui/textarea.tsx +16 -0
- package/frontend/src/lib/utils.ts +33 -0
- package/frontend/src/main.tsx +23 -0
- package/frontend/src/pages/Act.tsx +245 -0
- package/frontend/src/pages/Ask.tsx +200 -0
- package/frontend/src/pages/Brain.tsx +267 -0
- package/frontend/src/pages/Capture.tsx +158 -0
- package/frontend/src/pages/Library.tsx +187 -0
- package/frontend/src/pages/System.tsx +378 -0
- package/frontend/src/routes.ts +85 -0
- package/frontend/src/store/appStore.ts +54 -0
- package/frontend/src/styles.css +107 -0
- package/kg_schema.py +1 -1
- package/knowledge_graph.py +4 -4
- package/lattice_brain/__init__.py +70 -0
- package/lattice_brain/_kg_common.py +1 -0
- package/lattice_brain/archive.py +133 -0
- package/lattice_brain/context.py +3 -0
- package/lattice_brain/conversations.py +3 -0
- package/lattice_brain/core.py +82 -0
- package/lattice_brain/discovery.py +1 -0
- package/lattice_brain/documents.py +1 -0
- package/lattice_brain/embeddings.py +82 -0
- package/lattice_brain/identity.py +13 -0
- package/lattice_brain/ingest.py +1 -0
- package/lattice_brain/memory.py +3 -0
- package/lattice_brain/network.py +1 -0
- package/lattice_brain/projection.py +1 -0
- package/lattice_brain/provenance.py +1 -0
- package/lattice_brain/retrieval.py +1 -0
- package/lattice_brain/schema.py +1 -0
- package/lattice_brain/storage/__init__.py +22 -0
- package/lattice_brain/storage/base.py +72 -0
- package/lattice_brain/storage/docker.py +105 -0
- package/lattice_brain/storage/factory.py +31 -0
- package/lattice_brain/storage/migration.py +190 -0
- package/lattice_brain/storage/postgres.py +123 -0
- package/lattice_brain/storage/sqlite.py +128 -0
- package/lattice_brain/store.py +3 -0
- package/lattice_brain/write_master.py +1 -0
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/portability.py +69 -0
- package/latticeai/api/setup.py +5 -4
- package/latticeai/api/static_routes.py +4 -4
- package/latticeai/app_factory.py +17 -10
- package/latticeai/brain/__init__.py +6 -6
- package/latticeai/brain/_kg_common.py +1 -1
- package/latticeai/brain/network.py +1 -1
- package/latticeai/brain/retrieval.py +15 -0
- package/latticeai/brain/store.py +22 -6
- package/latticeai/core/config.py +8 -0
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/multi_agent.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/services/kg_portability.py +82 -1
- package/package.json +55 -15
- package/scripts/build_frontend_assets.mjs +38 -0
- package/scripts/bump_version.py +4 -1
- package/scripts/export_openapi.py +31 -0
- package/scripts/lint_frontend.mjs +91 -0
- package/scripts/migrate_brain_storage.py +53 -0
- package/scripts/run_python.mjs +47 -0
- package/scripts/wheel_smoke.py +3 -0
- package/src-tauri/Cargo.lock +4833 -0
- package/src-tauri/Cargo.toml +19 -0
- package/src-tauri/build.rs +3 -0
- package/src-tauri/capabilities/default.json +7 -0
- package/src-tauri/src/main.rs +78 -0
- package/src-tauri/tauri.conf.json +39 -0
- package/static/app/asset-manifest.json +32 -0
- package/static/app/assets/core-CwxXejkd.js +2 -0
- package/static/app/assets/core-CwxXejkd.js.map +1 -0
- package/static/app/assets/index-CDjiH_se.css +2 -0
- package/static/app/assets/index-C_HAkbAg.js +333 -0
- package/static/app/assets/index-C_HAkbAg.js.map +1 -0
- package/static/app/index.html +25 -0
- package/static/manifest.json +2 -2
- package/static/sw.js +4 -4
- package/scripts/build_v3_assets.mjs +0 -170
- package/scripts/lint_v3.mjs +0 -120
- package/static/v3/asset-manifest.json +0 -63
- package/static/v3/css/lattice.base.49deefb5.css +0 -128
- package/static/v3/css/lattice.base.css +0 -128
- package/static/v3/css/lattice.components.cde18231.css +0 -472
- package/static/v3/css/lattice.components.css +0 -472
- package/static/v3/css/lattice.shell.29d36d85.css +0 -452
- package/static/v3/css/lattice.shell.css +0 -452
- package/static/v3/css/lattice.tokens.304cbc40.css +0 -135
- package/static/v3/css/lattice.tokens.css +0 -135
- package/static/v3/css/lattice.views.0a18b6c5.css +0 -360
- package/static/v3/css/lattice.views.css +0 -360
- package/static/v3/index.html +0 -68
- package/static/v3/js/app.c5c80c46.js +0 -26
- package/static/v3/js/app.js +0 -26
- package/static/v3/js/core/api.ba0fbf14.js +0 -625
- package/static/v3/js/core/api.js +0 -625
- package/static/v3/js/core/components.f25b3b93.js +0 -230
- package/static/v3/js/core/components.js +0 -230
- package/static/v3/js/core/dom.a2773eb0.js +0 -148
- package/static/v3/js/core/dom.js +0 -148
- package/static/v3/js/core/i18n.880e1fec.js +0 -575
- package/static/v3/js/core/i18n.js +0 -575
- package/static/v3/js/core/router.584570f2.js +0 -37
- package/static/v3/js/core/router.js +0 -37
- package/static/v3/js/core/routes.37522821.js +0 -101
- package/static/v3/js/core/routes.js +0 -101
- package/static/v3/js/core/shell.e3f6bbfa.js +0 -420
- package/static/v3/js/core/shell.js +0 -420
- package/static/v3/js/core/store.7b2aa044.js +0 -123
- package/static/v3/js/core/store.js +0 -123
- package/static/v3/js/views/account.eff40715.js +0 -143
- package/static/v3/js/views/account.js +0 -143
- package/static/v3/js/views/activity.0d271ef9.js +0 -67
- package/static/v3/js/views/activity.js +0 -67
- package/static/v3/js/views/admin-audit.660a1fb1.js +0 -185
- package/static/v3/js/views/admin-audit.js +0 -185
- package/static/v3/js/views/admin-permissions.a7ae5f09.js +0 -177
- package/static/v3/js/views/admin-permissions.js +0 -177
- package/static/v3/js/views/admin-policies.3658fd86.js +0 -102
- package/static/v3/js/views/admin-policies.js +0 -102
- package/static/v3/js/views/admin-private-vpc.7d342d36.js +0 -135
- package/static/v3/js/views/admin-private-vpc.js +0 -135
- package/static/v3/js/views/admin-security.07c66b72.js +0 -180
- package/static/v3/js/views/admin-security.js +0 -180
- package/static/v3/js/views/admin-users.f7ac7b43.js +0 -166
- package/static/v3/js/views/admin-users.js +0 -166
- package/static/v3/js/views/agents.17c5288d.js +0 -564
- package/static/v3/js/views/agents.js +0 -564
- package/static/v3/js/views/chat.e250e2cc.js +0 -624
- package/static/v3/js/views/chat.js +0 -624
- package/static/v3/js/views/files.adad14c1.js +0 -365
- package/static/v3/js/views/files.js +0 -365
- package/static/v3/js/views/graph-canvas.17c15d65.js +0 -509
- package/static/v3/js/views/graph-canvas.js +0 -509
- package/static/v3/js/views/home.24f8b8ae.js +0 -200
- package/static/v3/js/views/home.js +0 -200
- package/static/v3/js/views/hooks.37895880.js +0 -220
- package/static/v3/js/views/hooks.js +0 -220
- package/static/v3/js/views/hybrid-search.2fb63ed9.js +0 -194
- package/static/v3/js/views/hybrid-search.js +0 -194
- package/static/v3/js/views/knowledge-graph.4d09c537.js +0 -529
- package/static/v3/js/views/knowledge-graph.js +0 -529
- package/static/v3/js/views/marketplace.ab0583d4.js +0 -141
- package/static/v3/js/views/marketplace.js +0 -141
- package/static/v3/js/views/mcp.99b5c6a7.js +0 -114
- package/static/v3/js/views/mcp.js +0 -114
- package/static/v3/js/views/memory.4ebdf474.js +0 -147
- package/static/v3/js/views/memory.js +0 -147
- package/static/v3/js/views/models.a1ffa147.js +0 -256
- package/static/v3/js/views/models.js +0 -256
- package/static/v3/js/views/my-computer.d9d9ae1c.js +0 -463
- package/static/v3/js/views/my-computer.js +0 -463
- package/static/v3/js/views/network.52a4f181.js +0 -97
- package/static/v3/js/views/network.js +0 -97
- package/static/v3/js/views/pipeline.c522f1ce.js +0 -157
- package/static/v3/js/views/pipeline.js +0 -157
- package/static/v3/js/views/planning.4876fd77.js +0 -174
- package/static/v3/js/views/planning.js +0 -174
- package/static/v3/js/views/runs.b63b2afa.js +0 -144
- package/static/v3/js/views/runs.js +0 -144
- package/static/v3/js/views/settings.b7140634.js +0 -317
- package/static/v3/js/views/settings.js +0 -317
- package/static/v3/js/views/skills.c6c2f965.js +0 -109
- package/static/v3/js/views/skills.js +0 -109
- package/static/v3/js/views/snapshots.6f5db095.js +0 -135
- package/static/v3/js/views/snapshots.js +0 -135
- package/static/v3/js/views/tools.e4f11276.js +0 -108
- package/static/v3/js/views/tools.js +0 -108
- package/static/v3/js/views/workflows.7752225a.js +0 -213
- package/static/v3/js/views/workflows.js +0 -213
- package/static/v3/js/views/workspace-admin.c466029b.js +0 -156
- package/static/v3/js/views/workspace-admin.js +0 -156
|
@@ -1,575 +0,0 @@
|
|
|
1
|
-
/* ============================================================================
|
|
2
|
-
* Lattice AI v3 — i18n runtime
|
|
3
|
-
*
|
|
4
|
-
* Small, local-first dictionary loader for the SPA shell. The language choice is
|
|
5
|
-
* stored on this device and applied without a backend round trip.
|
|
6
|
-
* ========================================================================== */
|
|
7
|
-
|
|
8
|
-
export const LANG_KEY = "lt3-lang";
|
|
9
|
-
const DEFAULT_LANG = "en";
|
|
10
|
-
const SUPPORTED = new Set(["en", "ko"]);
|
|
11
|
-
|
|
12
|
-
function readLang() {
|
|
13
|
-
try {
|
|
14
|
-
const saved = localStorage.getItem(LANG_KEY);
|
|
15
|
-
return SUPPORTED.has(saved) ? saved : DEFAULT_LANG;
|
|
16
|
-
} catch {
|
|
17
|
-
return DEFAULT_LANG;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let currentLang = readLang();
|
|
22
|
-
|
|
23
|
-
export function getI18nLanguage() {
|
|
24
|
-
return currentLang;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function setI18nLanguage(lang) {
|
|
28
|
-
currentLang = SUPPORTED.has(lang) ? lang : DEFAULT_LANG;
|
|
29
|
-
try { localStorage.setItem(LANG_KEY, currentLang); } catch {}
|
|
30
|
-
document.documentElement.setAttribute("lang", currentLang);
|
|
31
|
-
return currentLang;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function languageOptions() {
|
|
35
|
-
return [
|
|
36
|
-
{ key: "en", label: "English" },
|
|
37
|
-
{ key: "ko", label: "한국어" },
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function t(key, vars = {}) {
|
|
42
|
-
const value = (DICT[currentLang] && DICT[currentLang][key]) || DICT.en[key] || key;
|
|
43
|
-
return String(value).replace(/\{([a-zA-Z0-9_]+)\}/g, (_m, name) => (
|
|
44
|
-
vars[name] == null ? "" : String(vars[name])
|
|
45
|
-
));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
setI18nLanguage(currentLang);
|
|
49
|
-
|
|
50
|
-
const DICT = {
|
|
51
|
-
en: {
|
|
52
|
-
"group.brain": "Brain",
|
|
53
|
-
"group.ask": "Ask",
|
|
54
|
-
"group.capture": "Capture",
|
|
55
|
-
"group.act": "Act",
|
|
56
|
-
"group.library": "Library",
|
|
57
|
-
"group.system": "System",
|
|
58
|
-
"group.admin": "Administration",
|
|
59
|
-
|
|
60
|
-
"route.home.label": "Overview",
|
|
61
|
-
"route.home.title": "Overview",
|
|
62
|
-
"route.home.desc": "Your digital brain at a glance.",
|
|
63
|
-
"route.account.label": "Account",
|
|
64
|
-
"route.account.title": "Account",
|
|
65
|
-
"route.account.desc": "Sign in, register, update profile, and manage local credentials.",
|
|
66
|
-
"route.chat.label": "Chat",
|
|
67
|
-
"route.chat.title": "Chat",
|
|
68
|
-
"route.chat.desc": "Grounded conversation over your brain, with provenance.",
|
|
69
|
-
"route.files.label": "Files",
|
|
70
|
-
"route.files.title": "Files",
|
|
71
|
-
"route.files.desc": "Connected sources and indexed documents.",
|
|
72
|
-
"route.hybridSearch.label": "Search",
|
|
73
|
-
"route.hybridSearch.title": "Hybrid Search",
|
|
74
|
-
"route.hybridSearch.desc": "Graph structure fused with vector similarity.",
|
|
75
|
-
"route.knowledgeGraph.label": "Knowledge Graph",
|
|
76
|
-
"route.knowledgeGraph.title": "Knowledge Graph",
|
|
77
|
-
"route.knowledgeGraph.desc": "Your digital brain — every source converges here.",
|
|
78
|
-
"route.memory.label": "Memory",
|
|
79
|
-
"route.memory.title": "Memory",
|
|
80
|
-
"route.memory.desc": "Long-term workspace, project, agent, and conversation memory.",
|
|
81
|
-
"route.models.label": "Models",
|
|
82
|
-
"route.models.title": "Models",
|
|
83
|
-
"route.models.desc": "Local MLX models and embeddings.",
|
|
84
|
-
"route.agents.label": "Agents",
|
|
85
|
-
"route.agents.title": "Agents",
|
|
86
|
-
"route.agents.desc": "Multi-agent roles, runs, and handoffs.",
|
|
87
|
-
"route.runs.label": "Runs",
|
|
88
|
-
"route.runs.title": "Run Inbox",
|
|
89
|
-
"route.runs.desc": "Live run progress, cancellation, approvals, and decisions.",
|
|
90
|
-
"route.workflows.label": "Workflows",
|
|
91
|
-
"route.workflows.title": "Workflow Agents",
|
|
92
|
-
"route.workflows.desc": "Trigger, agent chain, tools, memory, and result.",
|
|
93
|
-
"route.skills.label": "Skills",
|
|
94
|
-
"route.skills.title": "Skills",
|
|
95
|
-
"route.skills.desc": "Install, enable, and manage skills.",
|
|
96
|
-
"route.hooks.label": "Hooks",
|
|
97
|
-
"route.hooks.title": "Hooks",
|
|
98
|
-
"route.hooks.desc": "Lifecycle hooks across runs, tools, and workflows.",
|
|
99
|
-
"route.mcp.label": "MCP",
|
|
100
|
-
"route.mcp.title": "MCP Manager",
|
|
101
|
-
"route.mcp.desc": "Connected MCP servers, tools, and health.",
|
|
102
|
-
"route.workspaceAdmin.label": "Workspaces",
|
|
103
|
-
"route.workspaceAdmin.title": "Workspaces",
|
|
104
|
-
"route.workspaceAdmin.desc": "Organizations, members, invitations, activation, and roles.",
|
|
105
|
-
"route.snapshots.label": "Snapshots",
|
|
106
|
-
"route.snapshots.title": "Snapshots",
|
|
107
|
-
"route.snapshots.desc": "Create, compare, export, and merge-restore workspace checkpoints.",
|
|
108
|
-
"route.activity.label": "Activity",
|
|
109
|
-
"route.activity.title": "Activity",
|
|
110
|
-
"route.activity.desc": "Realtime feed, presence, and workspace time-machine events.",
|
|
111
|
-
"route.network.label": "Network",
|
|
112
|
-
"route.network.title": "Brain Network",
|
|
113
|
-
"route.network.desc": "Device fingerprint, peer registry, pairing, and signed pushes.",
|
|
114
|
-
"route.settings.label": "Settings",
|
|
115
|
-
"route.settings.title": "Settings",
|
|
116
|
-
"route.settings.desc": "Appearance, workspace, language, and integrations.",
|
|
117
|
-
"route.pipeline.label": "Pipeline",
|
|
118
|
-
"route.pipeline.title": "Pipeline",
|
|
119
|
-
"route.pipeline.desc": "Ingest, embed, and graph-build flows.",
|
|
120
|
-
"route.planning.label": "Planning",
|
|
121
|
-
"route.planning.title": "Autonomous Planning",
|
|
122
|
-
"route.planning.desc": "Goal, plan, execute, review, and replan.",
|
|
123
|
-
"route.myComputer.label": "My Computer",
|
|
124
|
-
"route.myComputer.title": "My Computer",
|
|
125
|
-
"route.myComputer.desc": "Local hardware, memory, and runtime.",
|
|
126
|
-
"route.marketplace.label": "Marketplace",
|
|
127
|
-
"route.marketplace.title": "Marketplace",
|
|
128
|
-
"route.marketplace.desc": "Agent templates, agents, plugins, and skills.",
|
|
129
|
-
"route.tools.label": "Tools",
|
|
130
|
-
"route.tools.title": "Tool Registry",
|
|
131
|
-
"route.tools.desc": "Local, workspace, and MCP tools with governance.",
|
|
132
|
-
"route.adminUsers.label": "Users",
|
|
133
|
-
"route.adminUsers.title": "Users",
|
|
134
|
-
"route.adminUsers.desc": "Workspace members and access.",
|
|
135
|
-
"route.adminPermissions.label": "Permissions",
|
|
136
|
-
"route.adminPermissions.title": "Permissions",
|
|
137
|
-
"route.adminPermissions.desc": "Roles and capability mapping.",
|
|
138
|
-
"route.adminAudit.label": "Audit Logs",
|
|
139
|
-
"route.adminAudit.title": "Audit Logs",
|
|
140
|
-
"route.adminAudit.desc": "Activity and access trail.",
|
|
141
|
-
"route.adminSecurity.label": "Security",
|
|
142
|
-
"route.adminSecurity.title": "Security",
|
|
143
|
-
"route.adminSecurity.desc": "Sensitive-data signals and DLP.",
|
|
144
|
-
"route.adminPolicies.label": "Policies",
|
|
145
|
-
"route.adminPolicies.title": "Policies",
|
|
146
|
-
"route.adminPolicies.desc": "Governance and enforcement.",
|
|
147
|
-
"route.adminVpc.label": "Private VPC",
|
|
148
|
-
"route.adminVpc.title": "Private VPC",
|
|
149
|
-
"route.adminVpc.desc": "Network isolation and peering.",
|
|
150
|
-
|
|
151
|
-
"shell.skip": "Skip to content",
|
|
152
|
-
"shell.primary": "Primary",
|
|
153
|
-
"shell.closeMenu": "Close menu",
|
|
154
|
-
"shell.privateRuntime": "Private runtime",
|
|
155
|
-
"shell.account": "Account",
|
|
156
|
-
"shell.toggleTheme": "Toggle theme",
|
|
157
|
-
"shell.openMenu": "Open menu",
|
|
158
|
-
"shell.searchCommands": "Search & commands",
|
|
159
|
-
"shell.workspaceMode": "Workspace mode",
|
|
160
|
-
"shell.mode.basic": "Basic",
|
|
161
|
-
"shell.mode.advanced": "Advanced",
|
|
162
|
-
"shell.mode.admin": "Admin",
|
|
163
|
-
"shell.adminCrumb": "Admin",
|
|
164
|
-
"shell.you": "You",
|
|
165
|
-
"shell.local": "local",
|
|
166
|
-
"shell.member": "member",
|
|
167
|
-
"shell.indexPending": "Local index pending",
|
|
168
|
-
"shell.indexReady": "{ready}/{total} retrieval signals ready",
|
|
169
|
-
"shell.startBackend": "Start backend to sync live state",
|
|
170
|
-
"shell.graphVectorHybrid": "Graph · vector · hybrid",
|
|
171
|
-
"shell.documentTitle": "{title} · Lattice AI",
|
|
172
|
-
"shell.viewFailed": "View \"{label}\" failed to load.",
|
|
173
|
-
"shell.newOrganization": "New organization",
|
|
174
|
-
"shell.orgCreationOpens": "Organization creation opens in Workspaces",
|
|
175
|
-
"shell.goTo": "Go to",
|
|
176
|
-
"shell.actions": "Actions",
|
|
177
|
-
"shell.toggleLightDark": "Toggle light / dark theme",
|
|
178
|
-
"shell.newChat": "New chat",
|
|
179
|
-
"shell.runHybridSearch": "Run hybrid search",
|
|
180
|
-
"shell.palettePlaceholder": "Search views, run a command…",
|
|
181
|
-
"shell.commandPalette": "Command palette",
|
|
182
|
-
"shell.noMatches": "No matches",
|
|
183
|
-
|
|
184
|
-
"common.live": "Live",
|
|
185
|
-
"common.unavailable": "Unavailable",
|
|
186
|
-
"common.loading": "Loading",
|
|
187
|
-
"common.refresh": "Refresh",
|
|
188
|
-
"common.save": "Save",
|
|
189
|
-
"common.create": "Create",
|
|
190
|
-
"common.cancel": "Cancel",
|
|
191
|
-
"common.stop": "Stop",
|
|
192
|
-
"common.approve": "Approve",
|
|
193
|
-
"common.deny": "Deny",
|
|
194
|
-
"common.run": "Run",
|
|
195
|
-
"common.status": "Status",
|
|
196
|
-
"common.name": "Name",
|
|
197
|
-
"common.role": "Role",
|
|
198
|
-
"common.type": "Type",
|
|
199
|
-
"common.actions": "Actions",
|
|
200
|
-
"common.created": "Created",
|
|
201
|
-
"common.updated": "Updated",
|
|
202
|
-
"common.never": "Never",
|
|
203
|
-
"common.none": "None",
|
|
204
|
-
"common.owner": "Owner",
|
|
205
|
-
"common.admin": "Admin",
|
|
206
|
-
"common.member": "Member",
|
|
207
|
-
"common.viewer": "Viewer",
|
|
208
|
-
|
|
209
|
-
"account.eyebrow": "Identity",
|
|
210
|
-
"account.title": "Account",
|
|
211
|
-
"account.sub": "Token-native login, profile, password, and SSO status.",
|
|
212
|
-
"account.login": "Sign in",
|
|
213
|
-
"account.register": "Register",
|
|
214
|
-
"account.email": "Email",
|
|
215
|
-
"account.password": "Password",
|
|
216
|
-
"account.newPassword": "New password",
|
|
217
|
-
"account.currentPassword": "Current password",
|
|
218
|
-
"account.name": "Name",
|
|
219
|
-
"account.nickname": "Nickname",
|
|
220
|
-
"account.profile": "Profile",
|
|
221
|
-
"account.changePassword": "Change password",
|
|
222
|
-
"account.logout": "Log out",
|
|
223
|
-
"account.sso": "SSO",
|
|
224
|
-
"account.signedIn": "Signed in",
|
|
225
|
-
"account.notSignedIn": "Not signed in",
|
|
226
|
-
"account.passwordRule": "Password must be at least 8 alphanumeric characters.",
|
|
227
|
-
"account.loginOk": "Signed in.",
|
|
228
|
-
"account.registerOk": "Account registered.",
|
|
229
|
-
"account.profileOk": "Profile updated.",
|
|
230
|
-
"account.passwordOk": "Password changed.",
|
|
231
|
-
"account.logoutOk": "Signed out.",
|
|
232
|
-
|
|
233
|
-
"workspace.eyebrow": "System",
|
|
234
|
-
"workspace.title": "Workspaces",
|
|
235
|
-
"workspace.sub": "Organization workspace management, membership, invitations, activation, and roles.",
|
|
236
|
-
"workspace.createOrg": "Create organization",
|
|
237
|
-
"workspace.orgName": "Organization name",
|
|
238
|
-
"workspace.activate": "Activate",
|
|
239
|
-
"workspace.archive": "Archive",
|
|
240
|
-
"workspace.members": "Members",
|
|
241
|
-
"workspace.invitations": "Invitations",
|
|
242
|
-
"workspace.inviteEmail": "Invite email",
|
|
243
|
-
"workspace.inviteToken": "Invitation token",
|
|
244
|
-
"workspace.acceptInvite": "Accept invitation",
|
|
245
|
-
"workspace.addMember": "Add member",
|
|
246
|
-
"workspace.userId": "User ID",
|
|
247
|
-
"workspace.memberAdded": "Member saved.",
|
|
248
|
-
"workspace.inviteCreated": "Invitation created.",
|
|
249
|
-
"workspace.inviteAccepted": "Invitation accepted.",
|
|
250
|
-
"workspace.activated": "Workspace activated.",
|
|
251
|
-
"workspace.archived": "Workspace archived.",
|
|
252
|
-
|
|
253
|
-
"snapshots.eyebrow": "System",
|
|
254
|
-
"snapshots.title": "Snapshots",
|
|
255
|
-
"snapshots.sub": "Create, compare, export, and merge-restore workspace checkpoints.",
|
|
256
|
-
"snapshots.create": "Create snapshot",
|
|
257
|
-
"snapshots.name": "Snapshot name",
|
|
258
|
-
"snapshots.compare": "Compare",
|
|
259
|
-
"snapshots.export": "Export",
|
|
260
|
-
"snapshots.restore": "Merge restore",
|
|
261
|
-
"snapshots.timeline": "Time machine",
|
|
262
|
-
"snapshots.created": "Snapshot created.",
|
|
263
|
-
"snapshots.restored": "Snapshot merge-restored.",
|
|
264
|
-
|
|
265
|
-
"activity.eyebrow": "System",
|
|
266
|
-
"activity.title": "Activity",
|
|
267
|
-
"activity.sub": "Realtime feed, presence, and time-machine events.",
|
|
268
|
-
"activity.feed": "Realtime feed",
|
|
269
|
-
"activity.presence": "Presence",
|
|
270
|
-
"activity.timeMachine": "Time machine",
|
|
271
|
-
|
|
272
|
-
"runs.eyebrow": "Act",
|
|
273
|
-
"runs.title": "Run Inbox",
|
|
274
|
-
"runs.sub": "Live progress, cancellation, approval pauses, and local permission decisions.",
|
|
275
|
-
"runs.agentRuns": "Agent runs",
|
|
276
|
-
"runs.workflowRuns": "Workflow runs",
|
|
277
|
-
"runs.approvals": "Approvals",
|
|
278
|
-
"runs.progress": "Progress",
|
|
279
|
-
"runs.mode": "Mode",
|
|
280
|
-
"runs.approvalPaused": "Approval pause",
|
|
281
|
-
"runs.cancelled": "Cancellation requested.",
|
|
282
|
-
"runs.decided": "Decision recorded.",
|
|
283
|
-
|
|
284
|
-
"network.eyebrow": "System",
|
|
285
|
-
"network.title": "Brain Network",
|
|
286
|
-
"network.sub": "Device fingerprint, peer registry, pairing, and signed pushes.",
|
|
287
|
-
"network.identity": "Device identity",
|
|
288
|
-
"network.peers": "Peers",
|
|
289
|
-
"network.pair": "Pair peer",
|
|
290
|
-
"network.peerName": "Peer name",
|
|
291
|
-
"network.baseUrl": "Base URL",
|
|
292
|
-
"network.publicKey": "Public key",
|
|
293
|
-
"network.push": "Push",
|
|
294
|
-
"network.unpair": "Unpair",
|
|
295
|
-
"network.paired": "Peer paired.",
|
|
296
|
-
"network.unpaired": "Peer removed.",
|
|
297
|
-
"network.pushed": "Signed push completed.",
|
|
298
|
-
|
|
299
|
-
"chat.whyContext": "Why this context",
|
|
300
|
-
"chat.traceUnavailable": "Trace appears after the next grounded answer.",
|
|
301
|
-
"chat.traceQuestion": "Question",
|
|
302
|
-
"chat.traceConfidence": "Confidence",
|
|
303
|
-
"chat.traceReasons": "Reasons",
|
|
304
|
-
|
|
305
|
-
"kg.provenanceCoverage": "Provenance coverage",
|
|
306
|
-
"kg.coveredNodes": "Covered nodes",
|
|
307
|
-
"kg.uncoveredTypes": "Uncovered types",
|
|
308
|
-
"kg.sourceTypes": "Source types",
|
|
309
|
-
|
|
310
|
-
"settings.language": "Language",
|
|
311
|
-
"settings.languageSaved": "Interface language set to {language}.",
|
|
312
|
-
},
|
|
313
|
-
ko: {
|
|
314
|
-
"group.brain": "브레인",
|
|
315
|
-
"group.ask": "질문",
|
|
316
|
-
"group.capture": "수집",
|
|
317
|
-
"group.act": "실행",
|
|
318
|
-
"group.library": "라이브러리",
|
|
319
|
-
"group.system": "시스템",
|
|
320
|
-
"group.admin": "관리",
|
|
321
|
-
|
|
322
|
-
"route.home.label": "개요",
|
|
323
|
-
"route.home.title": "개요",
|
|
324
|
-
"route.home.desc": "디지털 브레인의 현재 상태입니다.",
|
|
325
|
-
"route.account.label": "계정",
|
|
326
|
-
"route.account.title": "계정",
|
|
327
|
-
"route.account.desc": "로그인, 가입, 프로필, 로컬 자격 증명을 관리합니다.",
|
|
328
|
-
"route.chat.label": "채팅",
|
|
329
|
-
"route.chat.title": "채팅",
|
|
330
|
-
"route.chat.desc": "출처가 남는 브레인 기반 대화입니다.",
|
|
331
|
-
"route.files.label": "파일",
|
|
332
|
-
"route.files.title": "파일",
|
|
333
|
-
"route.files.desc": "연결된 소스와 색인된 문서입니다.",
|
|
334
|
-
"route.hybridSearch.label": "검색",
|
|
335
|
-
"route.hybridSearch.title": "하이브리드 검색",
|
|
336
|
-
"route.hybridSearch.desc": "그래프 구조와 벡터 유사도를 결합합니다.",
|
|
337
|
-
"route.knowledgeGraph.label": "지식 그래프",
|
|
338
|
-
"route.knowledgeGraph.title": "지식 그래프",
|
|
339
|
-
"route.knowledgeGraph.desc": "모든 소스가 모이는 디지털 브레인입니다.",
|
|
340
|
-
"route.memory.label": "메모리",
|
|
341
|
-
"route.memory.title": "메모리",
|
|
342
|
-
"route.memory.desc": "워크스페이스, 프로젝트, 에이전트, 대화 메모리입니다.",
|
|
343
|
-
"route.models.label": "모델",
|
|
344
|
-
"route.models.title": "모델",
|
|
345
|
-
"route.models.desc": "로컬 MLX 모델과 임베딩입니다.",
|
|
346
|
-
"route.agents.label": "에이전트",
|
|
347
|
-
"route.agents.title": "에이전트",
|
|
348
|
-
"route.agents.desc": "멀티 에이전트 역할, 실행, 핸드오프입니다.",
|
|
349
|
-
"route.runs.label": "실행함",
|
|
350
|
-
"route.runs.title": "실행함",
|
|
351
|
-
"route.runs.desc": "실시간 진행, 취소, 승인, 결정을 관리합니다.",
|
|
352
|
-
"route.workflows.label": "워크플로",
|
|
353
|
-
"route.workflows.title": "워크플로 에이전트",
|
|
354
|
-
"route.workflows.desc": "트리거, 에이전트 체인, 도구, 메모리, 결과입니다.",
|
|
355
|
-
"route.skills.label": "스킬",
|
|
356
|
-
"route.skills.title": "스킬",
|
|
357
|
-
"route.skills.desc": "스킬을 설치하고 활성화합니다.",
|
|
358
|
-
"route.hooks.label": "훅",
|
|
359
|
-
"route.hooks.title": "훅",
|
|
360
|
-
"route.hooks.desc": "실행, 도구, 워크플로 생명주기 훅입니다.",
|
|
361
|
-
"route.mcp.label": "MCP",
|
|
362
|
-
"route.mcp.title": "MCP 관리자",
|
|
363
|
-
"route.mcp.desc": "연결된 MCP 서버와 도구 상태입니다.",
|
|
364
|
-
"route.workspaceAdmin.label": "워크스페이스",
|
|
365
|
-
"route.workspaceAdmin.title": "워크스페이스",
|
|
366
|
-
"route.workspaceAdmin.desc": "조직, 멤버, 초대, 활성화, 역할을 관리합니다.",
|
|
367
|
-
"route.snapshots.label": "스냅샷",
|
|
368
|
-
"route.snapshots.title": "스냅샷",
|
|
369
|
-
"route.snapshots.desc": "워크스페이스 체크포인트를 생성, 비교, 내보내고 병합 복원합니다.",
|
|
370
|
-
"route.activity.label": "활동",
|
|
371
|
-
"route.activity.title": "활동",
|
|
372
|
-
"route.activity.desc": "실시간 피드, 접속 상태, 타임머신 이벤트입니다.",
|
|
373
|
-
"route.network.label": "네트워크",
|
|
374
|
-
"route.network.title": "브레인 네트워크",
|
|
375
|
-
"route.network.desc": "장치 지문, 피어 등록, 페어링, 서명 푸시입니다.",
|
|
376
|
-
"route.settings.label": "설정",
|
|
377
|
-
"route.settings.title": "설정",
|
|
378
|
-
"route.settings.desc": "화면, 워크스페이스, 언어, 통합 설정입니다.",
|
|
379
|
-
"route.pipeline.label": "파이프라인",
|
|
380
|
-
"route.pipeline.title": "파이프라인",
|
|
381
|
-
"route.pipeline.desc": "수집, 임베딩, 그래프 구축 흐름입니다.",
|
|
382
|
-
"route.planning.label": "계획",
|
|
383
|
-
"route.planning.title": "자율 계획",
|
|
384
|
-
"route.planning.desc": "목표, 계획, 실행, 리뷰, 재계획입니다.",
|
|
385
|
-
"route.myComputer.label": "내 컴퓨터",
|
|
386
|
-
"route.myComputer.title": "내 컴퓨터",
|
|
387
|
-
"route.myComputer.desc": "로컬 하드웨어, 메모리, 런타임입니다.",
|
|
388
|
-
"route.marketplace.label": "마켓플레이스",
|
|
389
|
-
"route.marketplace.title": "마켓플레이스",
|
|
390
|
-
"route.marketplace.desc": "에이전트 템플릿, 플러그인, 스킬입니다.",
|
|
391
|
-
"route.tools.label": "도구",
|
|
392
|
-
"route.tools.title": "도구 레지스트리",
|
|
393
|
-
"route.tools.desc": "로컬, 워크스페이스, MCP 도구와 거버넌스입니다.",
|
|
394
|
-
"route.adminUsers.label": "사용자",
|
|
395
|
-
"route.adminUsers.title": "사용자",
|
|
396
|
-
"route.adminUsers.desc": "워크스페이스 멤버와 접근입니다.",
|
|
397
|
-
"route.adminPermissions.label": "권한",
|
|
398
|
-
"route.adminPermissions.title": "권한",
|
|
399
|
-
"route.adminPermissions.desc": "역할과 기능 매핑입니다.",
|
|
400
|
-
"route.adminAudit.label": "감사 로그",
|
|
401
|
-
"route.adminAudit.title": "감사 로그",
|
|
402
|
-
"route.adminAudit.desc": "활동과 접근 기록입니다.",
|
|
403
|
-
"route.adminSecurity.label": "보안",
|
|
404
|
-
"route.adminSecurity.title": "보안",
|
|
405
|
-
"route.adminSecurity.desc": "민감 데이터 신호와 DLP입니다.",
|
|
406
|
-
"route.adminPolicies.label": "정책",
|
|
407
|
-
"route.adminPolicies.title": "정책",
|
|
408
|
-
"route.adminPolicies.desc": "거버넌스와 집행입니다.",
|
|
409
|
-
"route.adminVpc.label": "프라이빗 VPC",
|
|
410
|
-
"route.adminVpc.title": "프라이빗 VPC",
|
|
411
|
-
"route.adminVpc.desc": "네트워크 격리와 피어링입니다.",
|
|
412
|
-
|
|
413
|
-
"shell.skip": "본문으로 건너뛰기",
|
|
414
|
-
"shell.primary": "기본 내비게이션",
|
|
415
|
-
"shell.closeMenu": "메뉴 닫기",
|
|
416
|
-
"shell.privateRuntime": "프라이빗 런타임",
|
|
417
|
-
"shell.account": "계정",
|
|
418
|
-
"shell.toggleTheme": "테마 전환",
|
|
419
|
-
"shell.openMenu": "메뉴 열기",
|
|
420
|
-
"shell.searchCommands": "검색 및 명령",
|
|
421
|
-
"shell.workspaceMode": "워크스페이스 모드",
|
|
422
|
-
"shell.mode.basic": "기본",
|
|
423
|
-
"shell.mode.advanced": "고급",
|
|
424
|
-
"shell.mode.admin": "관리자",
|
|
425
|
-
"shell.adminCrumb": "관리자",
|
|
426
|
-
"shell.you": "사용자",
|
|
427
|
-
"shell.local": "로컬",
|
|
428
|
-
"shell.member": "멤버",
|
|
429
|
-
"shell.indexPending": "로컬 색인 대기 중",
|
|
430
|
-
"shell.indexReady": "{ready}/{total} 검색 신호 준비됨",
|
|
431
|
-
"shell.startBackend": "백엔드를 시작하면 실시간 상태가 동기화됩니다",
|
|
432
|
-
"shell.graphVectorHybrid": "그래프 · 벡터 · 하이브리드",
|
|
433
|
-
"shell.documentTitle": "{title} · Lattice AI",
|
|
434
|
-
"shell.viewFailed": "\"{label}\" 뷰를 불러오지 못했습니다.",
|
|
435
|
-
"shell.newOrganization": "새 조직",
|
|
436
|
-
"shell.orgCreationOpens": "조직 생성은 워크스페이스에서 열립니다",
|
|
437
|
-
"shell.goTo": "이동",
|
|
438
|
-
"shell.actions": "작업",
|
|
439
|
-
"shell.toggleLightDark": "라이트/다크 테마 전환",
|
|
440
|
-
"shell.newChat": "새 채팅",
|
|
441
|
-
"shell.runHybridSearch": "하이브리드 검색 실행",
|
|
442
|
-
"shell.palettePlaceholder": "뷰 검색 또는 명령 실행…",
|
|
443
|
-
"shell.commandPalette": "명령 팔레트",
|
|
444
|
-
"shell.noMatches": "결과 없음",
|
|
445
|
-
|
|
446
|
-
"common.live": "실시간",
|
|
447
|
-
"common.unavailable": "사용 불가",
|
|
448
|
-
"common.loading": "불러오는 중",
|
|
449
|
-
"common.refresh": "새로고침",
|
|
450
|
-
"common.save": "저장",
|
|
451
|
-
"common.create": "생성",
|
|
452
|
-
"common.cancel": "취소",
|
|
453
|
-
"common.stop": "중지",
|
|
454
|
-
"common.approve": "승인",
|
|
455
|
-
"common.deny": "거부",
|
|
456
|
-
"common.run": "실행",
|
|
457
|
-
"common.status": "상태",
|
|
458
|
-
"common.name": "이름",
|
|
459
|
-
"common.role": "역할",
|
|
460
|
-
"common.type": "유형",
|
|
461
|
-
"common.actions": "작업",
|
|
462
|
-
"common.created": "생성됨",
|
|
463
|
-
"common.updated": "수정됨",
|
|
464
|
-
"common.never": "없음",
|
|
465
|
-
"common.none": "없음",
|
|
466
|
-
"common.owner": "소유자",
|
|
467
|
-
"common.admin": "관리자",
|
|
468
|
-
"common.member": "멤버",
|
|
469
|
-
"common.viewer": "뷰어",
|
|
470
|
-
|
|
471
|
-
"account.eyebrow": "아이덴티티",
|
|
472
|
-
"account.title": "계정",
|
|
473
|
-
"account.sub": "토큰 기반 로그인, 프로필, 비밀번호, SSO 상태입니다.",
|
|
474
|
-
"account.login": "로그인",
|
|
475
|
-
"account.register": "가입",
|
|
476
|
-
"account.email": "이메일",
|
|
477
|
-
"account.password": "비밀번호",
|
|
478
|
-
"account.newPassword": "새 비밀번호",
|
|
479
|
-
"account.currentPassword": "현재 비밀번호",
|
|
480
|
-
"account.name": "이름",
|
|
481
|
-
"account.nickname": "닉네임",
|
|
482
|
-
"account.profile": "프로필",
|
|
483
|
-
"account.changePassword": "비밀번호 변경",
|
|
484
|
-
"account.logout": "로그아웃",
|
|
485
|
-
"account.sso": "SSO",
|
|
486
|
-
"account.signedIn": "로그인됨",
|
|
487
|
-
"account.notSignedIn": "로그인되지 않음",
|
|
488
|
-
"account.passwordRule": "비밀번호는 8자 이상의 영문/숫자여야 합니다.",
|
|
489
|
-
"account.loginOk": "로그인했습니다.",
|
|
490
|
-
"account.registerOk": "계정을 만들었습니다.",
|
|
491
|
-
"account.profileOk": "프로필을 저장했습니다.",
|
|
492
|
-
"account.passwordOk": "비밀번호를 변경했습니다.",
|
|
493
|
-
"account.logoutOk": "로그아웃했습니다.",
|
|
494
|
-
|
|
495
|
-
"workspace.eyebrow": "시스템",
|
|
496
|
-
"workspace.title": "워크스페이스",
|
|
497
|
-
"workspace.sub": "조직 워크스페이스, 멤버, 초대, 활성화, 역할을 관리합니다.",
|
|
498
|
-
"workspace.createOrg": "조직 생성",
|
|
499
|
-
"workspace.orgName": "조직 이름",
|
|
500
|
-
"workspace.activate": "활성화",
|
|
501
|
-
"workspace.archive": "보관",
|
|
502
|
-
"workspace.members": "멤버",
|
|
503
|
-
"workspace.invitations": "초대",
|
|
504
|
-
"workspace.inviteEmail": "초대 이메일",
|
|
505
|
-
"workspace.inviteToken": "초대 토큰",
|
|
506
|
-
"workspace.acceptInvite": "초대 수락",
|
|
507
|
-
"workspace.addMember": "멤버 추가",
|
|
508
|
-
"workspace.userId": "사용자 ID",
|
|
509
|
-
"workspace.memberAdded": "멤버를 저장했습니다.",
|
|
510
|
-
"workspace.inviteCreated": "초대를 만들었습니다.",
|
|
511
|
-
"workspace.inviteAccepted": "초대를 수락했습니다.",
|
|
512
|
-
"workspace.activated": "워크스페이스를 활성화했습니다.",
|
|
513
|
-
"workspace.archived": "워크스페이스를 보관했습니다.",
|
|
514
|
-
|
|
515
|
-
"snapshots.eyebrow": "시스템",
|
|
516
|
-
"snapshots.title": "스냅샷",
|
|
517
|
-
"snapshots.sub": "워크스페이스 체크포인트를 생성, 비교, 내보내고 병합 복원합니다.",
|
|
518
|
-
"snapshots.create": "스냅샷 생성",
|
|
519
|
-
"snapshots.name": "스냅샷 이름",
|
|
520
|
-
"snapshots.compare": "비교",
|
|
521
|
-
"snapshots.export": "내보내기",
|
|
522
|
-
"snapshots.restore": "병합 복원",
|
|
523
|
-
"snapshots.timeline": "타임머신",
|
|
524
|
-
"snapshots.created": "스냅샷을 만들었습니다.",
|
|
525
|
-
"snapshots.restored": "스냅샷을 병합 복원했습니다.",
|
|
526
|
-
|
|
527
|
-
"activity.eyebrow": "시스템",
|
|
528
|
-
"activity.title": "활동",
|
|
529
|
-
"activity.sub": "실시간 피드, 접속 상태, 타임머신 이벤트입니다.",
|
|
530
|
-
"activity.feed": "실시간 피드",
|
|
531
|
-
"activity.presence": "접속 상태",
|
|
532
|
-
"activity.timeMachine": "타임머신",
|
|
533
|
-
|
|
534
|
-
"runs.eyebrow": "실행",
|
|
535
|
-
"runs.title": "실행함",
|
|
536
|
-
"runs.sub": "실시간 진행, 취소, 승인 대기, 로컬 권한 결정을 처리합니다.",
|
|
537
|
-
"runs.agentRuns": "에이전트 실행",
|
|
538
|
-
"runs.workflowRuns": "워크플로 실행",
|
|
539
|
-
"runs.approvals": "승인",
|
|
540
|
-
"runs.progress": "진행",
|
|
541
|
-
"runs.mode": "모드",
|
|
542
|
-
"runs.approvalPaused": "승인 대기",
|
|
543
|
-
"runs.cancelled": "취소를 요청했습니다.",
|
|
544
|
-
"runs.decided": "결정을 기록했습니다.",
|
|
545
|
-
|
|
546
|
-
"network.eyebrow": "시스템",
|
|
547
|
-
"network.title": "브레인 네트워크",
|
|
548
|
-
"network.sub": "장치 지문, 피어 등록, 페어링, 서명 푸시입니다.",
|
|
549
|
-
"network.identity": "장치 아이덴티티",
|
|
550
|
-
"network.peers": "피어",
|
|
551
|
-
"network.pair": "피어 연결",
|
|
552
|
-
"network.peerName": "피어 이름",
|
|
553
|
-
"network.baseUrl": "기본 URL",
|
|
554
|
-
"network.publicKey": "공개 키",
|
|
555
|
-
"network.push": "푸시",
|
|
556
|
-
"network.unpair": "연결 해제",
|
|
557
|
-
"network.paired": "피어를 연결했습니다.",
|
|
558
|
-
"network.unpaired": "피어를 제거했습니다.",
|
|
559
|
-
"network.pushed": "서명 푸시를 완료했습니다.",
|
|
560
|
-
|
|
561
|
-
"chat.whyContext": "이 컨텍스트가 쓰인 이유",
|
|
562
|
-
"chat.traceUnavailable": "다음 근거 기반 답변 후 trace가 표시됩니다.",
|
|
563
|
-
"chat.traceQuestion": "질문",
|
|
564
|
-
"chat.traceConfidence": "신뢰도",
|
|
565
|
-
"chat.traceReasons": "이유",
|
|
566
|
-
|
|
567
|
-
"kg.provenanceCoverage": "출처 기록 커버리지",
|
|
568
|
-
"kg.coveredNodes": "출처 있는 노드",
|
|
569
|
-
"kg.uncoveredTypes": "출처 없는 유형",
|
|
570
|
-
"kg.sourceTypes": "소스 유형",
|
|
571
|
-
|
|
572
|
-
"settings.language": "언어",
|
|
573
|
-
"settings.languageSaved": "인터페이스 언어를 {language}(으)로 설정했습니다.",
|
|
574
|
-
},
|
|
575
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/* ============================================================================
|
|
2
|
-
* Lattice AI v3 — Hash router
|
|
3
|
-
* Maps location.hash → { key, params }. Hash routing keeps the SPA shell
|
|
4
|
-
* served by a single static route (/app) with no server-side rewrites.
|
|
5
|
-
* #/home → { key: "home" }
|
|
6
|
-
* #/admin/users → { key: "admin/users" }
|
|
7
|
-
* #/chat?new=1 → { key: "chat", params: { new: "1" } }
|
|
8
|
-
* ========================================================================== */
|
|
9
|
-
|
|
10
|
-
export function createRouter({ onRoute, fallback = "home" }) {
|
|
11
|
-
function parse() {
|
|
12
|
-
let hash = location.hash.replace(/^#\/?/, "");
|
|
13
|
-
let query = "";
|
|
14
|
-
const qi = hash.indexOf("?");
|
|
15
|
-
if (qi >= 0) { query = hash.slice(qi + 1); hash = hash.slice(0, qi); }
|
|
16
|
-
const key = hash.replace(/\/+$/, "") || fallback;
|
|
17
|
-
const params = {};
|
|
18
|
-
if (query) new URLSearchParams(query).forEach((v, k) => { params[k] = v; });
|
|
19
|
-
return { key, params };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function handle() { onRoute(parse()); }
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
start() {
|
|
26
|
-
window.addEventListener("hashchange", handle);
|
|
27
|
-
if (!location.hash) { location.replace("#/" + fallback); }
|
|
28
|
-
else { handle(); }
|
|
29
|
-
},
|
|
30
|
-
current: parse,
|
|
31
|
-
navigate(key, params) {
|
|
32
|
-
const qs = params && Object.keys(params).length ? "?" + new URLSearchParams(params).toString() : "";
|
|
33
|
-
const next = "#/" + String(key).replace(/^#?\/?/, "") + qs;
|
|
34
|
-
if (location.hash === next) handle(); else location.hash = next;
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/* ============================================================================
|
|
2
|
-
* Lattice AI v3 — Hash router
|
|
3
|
-
* Maps location.hash → { key, params }. Hash routing keeps the SPA shell
|
|
4
|
-
* served by a single static route (/app) with no server-side rewrites.
|
|
5
|
-
* #/home → { key: "home" }
|
|
6
|
-
* #/admin/users → { key: "admin/users" }
|
|
7
|
-
* #/chat?new=1 → { key: "chat", params: { new: "1" } }
|
|
8
|
-
* ========================================================================== */
|
|
9
|
-
|
|
10
|
-
export function createRouter({ onRoute, fallback = "home" }) {
|
|
11
|
-
function parse() {
|
|
12
|
-
let hash = location.hash.replace(/^#\/?/, "");
|
|
13
|
-
let query = "";
|
|
14
|
-
const qi = hash.indexOf("?");
|
|
15
|
-
if (qi >= 0) { query = hash.slice(qi + 1); hash = hash.slice(0, qi); }
|
|
16
|
-
const key = hash.replace(/\/+$/, "") || fallback;
|
|
17
|
-
const params = {};
|
|
18
|
-
if (query) new URLSearchParams(query).forEach((v, k) => { params[k] = v; });
|
|
19
|
-
return { key, params };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function handle() { onRoute(parse()); }
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
start() {
|
|
26
|
-
window.addEventListener("hashchange", handle);
|
|
27
|
-
if (!location.hash) { location.replace("#/" + fallback); }
|
|
28
|
-
else { handle(); }
|
|
29
|
-
},
|
|
30
|
-
current: parse,
|
|
31
|
-
navigate(key, params) {
|
|
32
|
-
const qs = params && Object.keys(params).length ? "?" + new URLSearchParams(params).toString() : "";
|
|
33
|
-
const next = "#/" + String(key).replace(/^#?\/?/, "") + qs;
|
|
34
|
-
if (location.hash === next) handle(); else location.hash = next;
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|