ltcai 4.0.0 → 4.0.1
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 +37 -33
- package/docs/CHANGELOG.md +64 -0
- package/docs/REALTIME_COLLABORATION.md +3 -3
- package/docs/V3_FRONTEND.md +9 -8
- package/docs/V4_DIGITAL_BRAIN_RECOVERY.md +86 -43
- package/docs/kg-schema.md +6 -2
- package/docs/spec-vs-impl.md +10 -10
- package/kg_schema.py +2 -603
- package/knowledge_graph.py +37 -4958
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/admin.py +15 -16
- package/latticeai/api/agents.py +13 -6
- package/latticeai/api/auth.py +19 -11
- package/latticeai/api/invitations.py +100 -0
- package/latticeai/api/knowledge_graph.py +4 -11
- package/latticeai/api/plugins.py +3 -6
- package/latticeai/api/realtime.py +4 -7
- package/latticeai/api/static_routes.py +9 -12
- package/latticeai/api/ui_redirects.py +26 -0
- package/latticeai/api/workflow_designer.py +39 -6
- package/latticeai/api/workspace.py +24 -10
- package/latticeai/app_factory.py +88 -17
- package/latticeai/brain/_kg_common.py +1123 -0
- package/latticeai/brain/discovery.py +1455 -0
- package/latticeai/brain/documents.py +218 -0
- package/latticeai/brain/ingest.py +644 -0
- package/latticeai/brain/projection.py +561 -0
- package/latticeai/brain/provenance.py +401 -0
- package/latticeai/brain/retrieval.py +1316 -0
- package/latticeai/brain/schema.py +640 -0
- package/latticeai/brain/store.py +216 -0
- package/latticeai/brain/write_master.py +225 -0
- package/latticeai/core/invitations.py +131 -0
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/multi_agent.py +1 -1
- package/latticeai/core/policy.py +54 -0
- package/latticeai/core/realtime.py +65 -44
- package/latticeai/core/sessions.py +31 -5
- package/latticeai/core/users.py +147 -0
- package/latticeai/core/workspace_os.py +420 -20
- package/latticeai/services/agent_runtime.py +242 -4
- package/latticeai/services/run_executor.py +328 -0
- package/latticeai/services/workspace_service.py +27 -19
- package/package.json +2 -14
- package/scripts/lint_v3.mjs +23 -0
- package/static/v3/asset-manifest.json +21 -14
- package/static/v3/js/{app.356e6452.js → app.c5c80c46.js} +1 -1
- package/static/v3/js/core/{api.7a308b89.js → api.ba0fbf14.js} +58 -1
- package/static/v3/js/core/api.js +57 -0
- package/static/v3/js/core/i18n.880e1fec.js +575 -0
- package/static/v3/js/core/i18n.js +575 -0
- package/static/v3/js/core/routes.37522821.js +101 -0
- package/static/v3/js/core/routes.js +71 -63
- package/static/v3/js/core/{shell.a1657f20.js → shell.e3f6bbfa.js} +67 -38
- package/static/v3/js/core/shell.js +65 -36
- package/static/v3/js/core/{store.204a08b2.js → store.7b2aa044.js} +10 -0
- package/static/v3/js/core/store.js +10 -0
- package/static/v3/js/views/account.eff40715.js +143 -0
- package/static/v3/js/views/account.js +143 -0
- package/static/v3/js/views/activity.0d271ef9.js +67 -0
- package/static/v3/js/views/activity.js +67 -0
- package/static/v3/js/views/{admin-users.03bac88c.js → admin-users.f7ac7b43.js} +4 -6
- package/static/v3/js/views/admin-users.js +4 -6
- package/static/v3/js/views/{agents.014d0b74.js → agents.17c5288d.js} +35 -12
- package/static/v3/js/views/agents.js +35 -12
- package/static/v3/js/views/{chat.e6dd7dd0.js → chat.e250e2cc.js} +23 -0
- package/static/v3/js/views/chat.js +23 -0
- package/static/v3/js/views/{knowledge-graph.5e40cbeb.js → knowledge-graph.4d09c537.js} +27 -7
- package/static/v3/js/views/knowledge-graph.js +27 -7
- package/static/v3/js/views/network.52a4f181.js +97 -0
- package/static/v3/js/views/network.js +97 -0
- package/static/v3/js/views/{planning.9ac3e313.js → planning.4876fd77.js} +26 -5
- package/static/v3/js/views/planning.js +26 -5
- package/static/v3/js/views/runs.b63b2afa.js +144 -0
- package/static/v3/js/views/runs.js +144 -0
- package/static/v3/js/views/{settings.8631fa5e.js → settings.b7140634.js} +7 -8
- package/static/v3/js/views/settings.js +7 -8
- package/static/v3/js/views/snapshots.6f5db095.js +135 -0
- package/static/v3/js/views/snapshots.js +135 -0
- package/static/v3/js/views/{workflows.26c57290.js → workflows.7752225a.js} +87 -2
- package/static/v3/js/views/workflows.js +87 -2
- package/static/v3/js/views/workspace-admin.c466029b.js +156 -0
- package/static/v3/js/views/workspace-admin.js +156 -0
- package/static/account.html +0 -113
- package/static/activity.html +0 -73
- package/static/admin.html +0 -486
- package/static/agents.html +0 -139
- package/static/chat.html +0 -841
- package/static/css/reference/account.css +0 -439
- package/static/css/reference/admin.css +0 -610
- package/static/css/reference/base.css +0 -1661
- package/static/css/reference/chat.css +0 -4623
- package/static/css/reference/graph.css +0 -1016
- package/static/css/responsive.css +0 -861
- package/static/graph.html +0 -122
- package/static/platform.css +0 -104
- package/static/plugins.html +0 -136
- package/static/scripts/account.js +0 -238
- package/static/scripts/admin.js +0 -1614
- package/static/scripts/chat.js +0 -5081
- package/static/scripts/graph.js +0 -1804
- package/static/scripts/platform.js +0 -64
- package/static/scripts/ux.js +0 -167
- package/static/scripts/workspace.js +0 -948
- package/static/v3/js/core/routes.7222343d.js +0 -93
- package/static/workflows.html +0 -146
- package/static/workspace.css +0 -1121
- package/static/workspace.html +0 -357
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Lattice AI v2.0 — shared helpers for the Agentic Workspace Platform pages.
|
|
2
|
-
export const NAV = [
|
|
3
|
-
{ href: "/workspace", label: "Dashboard" },
|
|
4
|
-
{ href: "/plugins/sdk", label: "Plugins" },
|
|
5
|
-
{ href: "/workflows", label: "Workflows" },
|
|
6
|
-
{ href: "/agents", label: "Agents" },
|
|
7
|
-
{ href: "/activity", label: "Activity" },
|
|
8
|
-
{ href: "/chat", label: "Chat" },
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
export function mountHeader(active) {
|
|
12
|
-
const links = NAV.map(
|
|
13
|
-
(n) => `<a href="${n.href}" class="${n.href === active ? "active" : ""}">${n.label}</a>`
|
|
14
|
-
).join("");
|
|
15
|
-
document.body.insertAdjacentHTML(
|
|
16
|
-
"afterbegin",
|
|
17
|
-
`<header class="app"><div class="brand">Lattice AI<small>v2.0 Platform</small></div><nav>${links}</nav></header>`
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export async function api(path, opts = {}) {
|
|
22
|
-
const res = await fetch(path, {
|
|
23
|
-
headers: { "Content-Type": "application/json" },
|
|
24
|
-
credentials: "same-origin",
|
|
25
|
-
...opts,
|
|
26
|
-
});
|
|
27
|
-
if (res.status === 401) {
|
|
28
|
-
location.href = "/account";
|
|
29
|
-
throw new Error("unauthorized");
|
|
30
|
-
}
|
|
31
|
-
const text = await res.text();
|
|
32
|
-
let body;
|
|
33
|
-
try { body = text ? JSON.parse(text) : {}; } catch { body = { raw: text }; }
|
|
34
|
-
if (!res.ok) {
|
|
35
|
-
const detail = body && body.detail ? (typeof body.detail === "string" ? body.detail : JSON.stringify(body.detail)) : res.statusText;
|
|
36
|
-
throw new Error(detail);
|
|
37
|
-
}
|
|
38
|
-
return body;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function el(html) {
|
|
42
|
-
const t = document.createElement("template");
|
|
43
|
-
t.innerHTML = html.trim();
|
|
44
|
-
return t.content.firstElementChild;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function escapeHtml(s) {
|
|
48
|
-
return String(s == null ? "" : s).replace(/[&<>"']/g, (c) =>
|
|
49
|
-
({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c])
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function toast(msg) {
|
|
54
|
-
const node = el(`<div class="toast">${escapeHtml(msg)}</div>`);
|
|
55
|
-
document.body.appendChild(node);
|
|
56
|
-
setTimeout(() => node.remove(), 4000);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function badge(status) {
|
|
60
|
-
const cls = { ok: "ok", ready: "ok", valid: "ok", retried_ok: "ok",
|
|
61
|
-
partial: "warn", retry: "warn", skipped: "warn", available: "warn",
|
|
62
|
-
failed: "err", error: "err", blocked: "err" }[status] || "";
|
|
63
|
-
return `<span class="badge ${cls}">${escapeHtml(status || "?")}</span>`;
|
|
64
|
-
}
|
package/static/scripts/ux.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/* ============================================================================
|
|
2
|
-
* Lattice AI — Shared UX runtime (v2.2.2)
|
|
3
|
-
*
|
|
4
|
-
* 모든 페이지에서 로드된다. 페이지마다 일부 요소가 없을 수 있으므로 전부
|
|
5
|
-
* 방어적으로(존재 확인 후) 동작한다. 기존 chat.js / graph.js / admin.js 의
|
|
6
|
-
* 함수를 재정의하지 않고, 새 전역 기능만 추가한다.
|
|
7
|
-
*
|
|
8
|
-
* - 다크/라이트 테마 (localStorage + OS 선호 + 토글)
|
|
9
|
-
* - 모바일 키보드 inset (--kb-inset) : 입력창이 키보드에 안 가리게
|
|
10
|
-
* - Escape 로 열린 모달/오버레이 닫기
|
|
11
|
-
* - 브레이크포인트 넘으면 열린 드로어 자동 정리
|
|
12
|
-
* - 그래프/관리자 네비 드로어 토글
|
|
13
|
-
* ========================================================================== */
|
|
14
|
-
(function () {
|
|
15
|
-
"use strict";
|
|
16
|
-
|
|
17
|
-
var root = document.documentElement;
|
|
18
|
-
|
|
19
|
-
/* ---------- 1. 테마 ---------- */
|
|
20
|
-
var THEME_KEY = "lt-theme";
|
|
21
|
-
|
|
22
|
-
function systemPrefersDark() {
|
|
23
|
-
return window.matchMedia &&
|
|
24
|
-
window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function storedTheme() {
|
|
28
|
-
try { return localStorage.getItem(THEME_KEY); } catch (e) { return null; }
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function applyTheme(mode) {
|
|
32
|
-
if (mode !== "dark" && mode !== "light") {
|
|
33
|
-
mode = systemPrefersDark() ? "dark" : "light";
|
|
34
|
-
}
|
|
35
|
-
root.setAttribute("data-lt-theme", mode);
|
|
36
|
-
return mode;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// 초기 적용 (FOUC 최소화를 위해 가능한 한 빨리)
|
|
40
|
-
applyTheme(storedTheme());
|
|
41
|
-
|
|
42
|
-
window.setTheme = function (mode) {
|
|
43
|
-
var applied = applyTheme(mode);
|
|
44
|
-
try { localStorage.setItem(THEME_KEY, applied); } catch (e) {}
|
|
45
|
-
return applied;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
window.toggleTheme = function () {
|
|
49
|
-
var cur = root.getAttribute("data-lt-theme") === "dark" ? "dark" : "light";
|
|
50
|
-
return window.setTheme(cur === "dark" ? "light" : "dark");
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// 사용자가 명시 선택을 안 했으면 OS 변화 따라가기
|
|
54
|
-
if (window.matchMedia) {
|
|
55
|
-
try {
|
|
56
|
-
window.matchMedia("(prefers-color-scheme: dark)")
|
|
57
|
-
.addEventListener("change", function (e) {
|
|
58
|
-
if (!storedTheme()) applyTheme(e.matches ? "dark" : "light");
|
|
59
|
-
});
|
|
60
|
-
} catch (e) { /* Safari < 14 */ }
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/* ---------- 2. 모바일 키보드 inset ---------- */
|
|
64
|
-
var vv = window.visualViewport;
|
|
65
|
-
if (vv) {
|
|
66
|
-
var updateKbInset = function () {
|
|
67
|
-
// 레이아웃 뷰포트와 비주얼 뷰포트의 차이 = 키보드(또는 브라우저 UI) 높이
|
|
68
|
-
var inset = Math.max(0, window.innerHeight - vv.height - vv.offsetTop);
|
|
69
|
-
// 작은 값(브라우저 바 미세 변화)은 무시
|
|
70
|
-
root.style.setProperty("--kb-inset", (inset > 80 ? inset : 0) + "px");
|
|
71
|
-
};
|
|
72
|
-
vv.addEventListener("resize", updateKbInset);
|
|
73
|
-
vv.addEventListener("scroll", updateKbInset);
|
|
74
|
-
// 입력에 포커스되면 화면 안으로 스크롤
|
|
75
|
-
document.addEventListener("focusin", function (e) {
|
|
76
|
-
var t = e.target;
|
|
77
|
-
if (t && (t.tagName === "TEXTAREA" || t.tagName === "INPUT")) {
|
|
78
|
-
setTimeout(function () {
|
|
79
|
-
if (t.scrollIntoView) {
|
|
80
|
-
try { t.scrollIntoView({ block: "center", behavior: "smooth" }); }
|
|
81
|
-
catch (err) { t.scrollIntoView(); }
|
|
82
|
-
}
|
|
83
|
-
}, 250);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* ---------- 3. 드로어 토글 (그래프 / 관리자) ---------- */
|
|
89
|
-
function bodyHas(cls) { return document.body.classList.contains(cls); }
|
|
90
|
-
|
|
91
|
-
window.toggleGraphNav = function () {
|
|
92
|
-
document.body.classList.toggle("graph-nav-open");
|
|
93
|
-
};
|
|
94
|
-
window.closeGraphNav = function () {
|
|
95
|
-
document.body.classList.remove("graph-nav-open");
|
|
96
|
-
};
|
|
97
|
-
window.toggleAdminRail = function () {
|
|
98
|
-
document.body.classList.toggle("admin-rail-open");
|
|
99
|
-
};
|
|
100
|
-
window.closeAdminRail = function () {
|
|
101
|
-
document.body.classList.remove("admin-rail-open");
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/* ---------- 4. Escape 로 닫기 ---------- */
|
|
105
|
-
var OVERLAY_SELECTORS = [
|
|
106
|
-
".acct-modal-overlay", ".mcp-modal-overlay", ".mode-modal-overlay",
|
|
107
|
-
".workspace-modal-overlay", ".advanced-settings-overlay", ".model-overlay",
|
|
108
|
-
".perm-overlay", ".onboarding-overlay", ".pipeline-overlay",
|
|
109
|
-
".admin-overlay", ".vpc-overlay", ".status-overlay", ".cu-overlay",
|
|
110
|
-
".file-create-overlay", ".file-editor-overlay", ".local-browser-overlay"
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
function isVisible(el) {
|
|
114
|
-
if (!el) return false;
|
|
115
|
-
var s = window.getComputedStyle(el);
|
|
116
|
-
return s.display !== "none" && s.visibility !== "hidden" && el.offsetParent !== null;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function closeTopOverlay() {
|
|
120
|
-
// 1) 드로어 먼저
|
|
121
|
-
if (bodyHas("sidebar-open")) { document.body.classList.remove("sidebar-open"); return true; }
|
|
122
|
-
if (bodyHas("graph-nav-open")) { window.closeGraphNav(); return true; }
|
|
123
|
-
if (bodyHas("admin-rail-open")) { window.closeAdminRail(); return true; }
|
|
124
|
-
|
|
125
|
-
// 2) 보이는 오버레이를 위에서부터 닫기
|
|
126
|
-
var overlays = document.querySelectorAll(OVERLAY_SELECTORS.join(","));
|
|
127
|
-
for (var i = overlays.length - 1; i >= 0; i--) {
|
|
128
|
-
var el = overlays[i];
|
|
129
|
-
if (isVisible(el)) {
|
|
130
|
-
// 닫기 버튼이 있으면 클릭, 없으면 직접 숨김
|
|
131
|
-
var btn = el.querySelector(
|
|
132
|
-
"[onclick*='close'],.modal-close,.mcp-modal-close,.admin-close,.mode-close,.acct-close"
|
|
133
|
-
);
|
|
134
|
-
if (btn && btn.click) { btn.click(); }
|
|
135
|
-
else { el.style.display = "none"; }
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
document.addEventListener("keydown", function (e) {
|
|
143
|
-
if (e.key === "Escape" || e.keyCode === 27) {
|
|
144
|
-
if (closeTopOverlay()) { e.stopPropagation(); }
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
/* ---------- 5. 브레이크포인트 넘으면 드로어 정리 ---------- */
|
|
149
|
-
if (window.matchMedia) {
|
|
150
|
-
var desktop = window.matchMedia("(min-width: 1025px)");
|
|
151
|
-
var onDesktop = function (e) {
|
|
152
|
-
if (e.matches) {
|
|
153
|
-
document.body.classList.remove("sidebar-open", "graph-nav-open", "admin-rail-open");
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
try { desktop.addEventListener("change", onDesktop); }
|
|
157
|
-
catch (e2) { /* old Safari */ try { desktop.addListener(onDesktop); } catch (e3) {} }
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/* ---------- 6. 새 드로어용 오버레이 백드롭 클릭 ---------- */
|
|
161
|
-
document.addEventListener("click", function (e) {
|
|
162
|
-
var t = e.target;
|
|
163
|
-
if (t && t.classList && t.classList.contains("sidebar-overlay")) {
|
|
164
|
-
document.body.classList.remove("graph-nav-open", "admin-rail-open");
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
})();
|