ltcai 9.9.3 → 9.9.5
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 +39 -38
- package/docs/CHANGELOG.md +100 -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/SURFACE_PARITY.md +53 -0
- 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/graph/_kg_common.py +335 -0
- package/lattice_brain/graph/discovery_index.py +8 -1
- package/lattice_brain/graph/ingest.py +43 -9
- package/lattice_brain/graph/projection.py +221 -37
- package/lattice_brain/graph/rerank.py +160 -0
- package/lattice_brain/graph/retrieval.py +90 -455
- package/lattice_brain/graph/retrieval_policy.py +174 -0
- package/lattice_brain/graph/retrieval_reads.py +459 -0
- package/lattice_brain/graph/retrieval_vector.py +122 -2
- package/lattice_brain/graph/store.py +2 -0
- package/lattice_brain/portability.py +41 -12
- package/lattice_brain/quality.py +26 -6
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/chat.py +6 -0
- package/latticeai/api/chat_agent_http.py +262 -52
- package/latticeai/api/chat_contracts.py +1 -1
- package/latticeai/api/chat_intents.py +37 -18
- package/latticeai/api/chat_stream.py +76 -2
- package/latticeai/api/knowledge_graph.py +35 -1
- package/latticeai/core/agent.py +420 -27
- package/latticeai/core/enterprise.py +5 -0
- package/latticeai/core/file_generation.py +130 -5
- package/latticeai/core/legacy_compatibility.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/run_store.py +245 -0
- package/latticeai/core/workspace_os.py +1 -1
- package/latticeai/integrations/telegram_bot.py +82 -23
- package/latticeai/models/router.py +25 -12
- package/latticeai/services/architecture_readiness.py +1 -1
- package/latticeai/services/command_center.py +90 -1
- package/latticeai/services/folder_watch.py +5 -0
- package/latticeai/services/funnel_metrics.py +9 -1
- package/latticeai/services/product_readiness.py +1 -1
- package/latticeai/services/search_service.py +43 -13
- package/latticeai/services/tool_dispatch.py +56 -0
- package/package.json +2 -1
- package/scripts/bench_agent_smoke.py +410 -0
- package/scripts/check_current_release_docs.mjs +1 -1
- package/scripts/funnel_soft_gate.py +192 -0
- package/scripts/run_sidecar_e2e.mjs +159 -0
- 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 +29 -28
- package/static/app/assets/Act-DmxfbqBp.js +1 -0
- package/static/app/assets/{Brain-DEY9jLVt.js → Brain-DK_zKCda.js} +2 -2
- package/static/app/assets/BrainHome-CCE_0hni.js +2 -0
- package/static/app/assets/BrainSignals-r_J68_zh.js +1 -0
- package/static/app/assets/{Capture-CVZ09QXi.js → Capture-CvxwzpJZ.js} +1 -1
- package/static/app/assets/{CommandPalette-DepwOQFv.js → CommandPalette-CVLiFIQC.js} +1 -1
- package/static/app/assets/{Library-Bp0n-HlW.js → Library-4As9VUvy.js} +1 -1
- package/static/app/assets/{LivingBrain-DxP4efJF.js → LivingBrain-BVWk58MW.js} +1 -1
- package/static/app/assets/{ProductFlow-DRbm7NEq.js → ProductFlow-B-Tz0Um4.js} +1 -1
- package/static/app/assets/{ReviewCard-C4HAO7A3.js → ReviewCard-Va3fPQuj.js} +1 -1
- package/static/app/assets/{System-ByQcmJW-.js → System-DSR2zKWd.js} +1 -1
- package/static/app/assets/{bot-BNDyZLR7.js → bot-VmP0kkeA.js} +1 -1
- package/static/app/assets/circle-pause-T9POo4qy.js +1 -0
- package/static/app/assets/{circle-play-BkhdcHgd.js → circle-play-Bz5iTD0p.js} +1 -1
- package/static/app/assets/{cpu-C6jjYm6i.js → cpu-CJhjRtNq.js} +1 -1
- package/static/app/assets/{folder-open-DjGIvDBQ.js → folder-open-B2K_22VI.js} +1 -1
- package/static/app/assets/{hard-drive-BlSbwSaT.js → hard-drive-CjJtYqHf.js} +1 -1
- package/static/app/assets/{index-Bge3DXW7.css → index-7FAfYm4v.css} +1 -1
- package/static/app/assets/{index-CHu7cgj3.js → index-CEu0Wqjl.js} +3 -3
- package/static/app/assets/{input-DVDI0YR3.js → input-CSi6OBJ9.js} +1 -1
- package/static/app/assets/{navigation-BddhEWA0.js → navigation-BPQqEQwr.js} +1 -1
- package/static/app/assets/{network-pYQt5oBu.js → network-Ck1nqc-v.js} +1 -1
- package/static/app/assets/{primitives-D7gCdEvS.js → primitives-B2f9N7Dh.js} +1 -1
- package/static/app/assets/{shield-alert-K9RKGQeg.js → shield-alert-yA_Y8lOB.js} +1 -1
- package/static/app/assets/{textarea-sqQmoBKL.js → textarea-C4wM0D-Z.js} +1 -1
- package/static/app/assets/{useFocusTrap-7EV9dFP2.js → useFocusTrap-CsnIhsDJ.js} +1 -1
- package/static/app/assets/utils-BqoznzGP.js +7 -0
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/static/app/assets/Act-DmdruVKV.js +0 -1
- package/static/app/assets/BrainHome-CeNaxjP1.js +0 -2
- package/static/app/assets/BrainSignals-CStjIqYi.js +0 -1
- package/static/app/assets/utils-uQYKXNeq.js +0 -7
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Start an isolated Lattice sidecar and run Playwright first-value E2E
|
|
4
|
+
* against it (Wave 3.2 residual / v9.9.5).
|
|
5
|
+
*
|
|
6
|
+
* Mirrors scripts/run_integration_tests.mjs isolation rules: never touch
|
|
7
|
+
* the developer's real HOME / ~/.ltcai / Brain vault.
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from "node:child_process";
|
|
10
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync } from "node:fs";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
|
|
14
|
+
const host = process.env.LTCAI_E2E_HOST || "127.0.0.1";
|
|
15
|
+
if (!new Set(["127.0.0.1", "localhost"]).has(host)) {
|
|
16
|
+
throw new Error(`LTCAI_E2E_HOST must be loopback, received: ${host}`);
|
|
17
|
+
}
|
|
18
|
+
const port = process.env.LTCAI_E2E_PORT || "4899";
|
|
19
|
+
if (!/^\d+$/.test(port) || Number(port) < 1 || Number(port) > 65535) {
|
|
20
|
+
throw new Error(`LTCAI_E2E_PORT must be 1–65535, received: ${port}`);
|
|
21
|
+
}
|
|
22
|
+
const baseUrl = `http://${host}:${port}`;
|
|
23
|
+
const venvPython = join(process.cwd(), ".venv", "bin", "python");
|
|
24
|
+
const python = process.env.PYTHON || (existsSync(venvPython) ? venvPython : "python3");
|
|
25
|
+
|
|
26
|
+
const sandboxRoot = mkdtempSync(join(tmpdir(), "ltcai-e2e-"));
|
|
27
|
+
const sandbox = {
|
|
28
|
+
home: join(sandboxRoot, "home"),
|
|
29
|
+
data: join(sandboxRoot, "data"),
|
|
30
|
+
brain: join(sandboxRoot, "brain"),
|
|
31
|
+
agent: join(sandboxRoot, "agent-workspace"),
|
|
32
|
+
vault: join(sandboxRoot, "vault"),
|
|
33
|
+
cache: join(sandboxRoot, "cache"),
|
|
34
|
+
config: join(sandboxRoot, "config"),
|
|
35
|
+
tmp: join(sandboxRoot, "tmp"),
|
|
36
|
+
};
|
|
37
|
+
for (const path of Object.values(sandbox)) mkdirSync(path, { recursive: true });
|
|
38
|
+
|
|
39
|
+
const isolatedEnv = {
|
|
40
|
+
...process.env,
|
|
41
|
+
HOME: sandbox.home,
|
|
42
|
+
USERPROFILE: sandbox.home,
|
|
43
|
+
XDG_CACHE_HOME: sandbox.cache,
|
|
44
|
+
XDG_CONFIG_HOME: sandbox.config,
|
|
45
|
+
XDG_DATA_HOME: join(sandboxRoot, "share"),
|
|
46
|
+
TMPDIR: sandbox.tmp,
|
|
47
|
+
TEMP: sandbox.tmp,
|
|
48
|
+
TMP: sandbox.tmp,
|
|
49
|
+
LATTICEAI_MODE: "local",
|
|
50
|
+
LATTICEAI_HOST: host,
|
|
51
|
+
LATTICEAI_PORT: port,
|
|
52
|
+
LATTICEAI_DATA_DIR: sandbox.data,
|
|
53
|
+
LATTICEAI_BRAIN_DIR: sandbox.brain,
|
|
54
|
+
LATTICEAI_AGENT_ROOT: sandbox.agent,
|
|
55
|
+
LATTICEAI_OBSIDIAN_VAULT_DIR: sandbox.vault,
|
|
56
|
+
LATTICEAI_STORAGE_ENGINE: "sqlite",
|
|
57
|
+
LATTICEAI_POSTGRES_DSN: "",
|
|
58
|
+
LATTICEAI_REQUIRE_AUTH: "false",
|
|
59
|
+
LATTICEAI_ENABLE_TELEGRAM: "false",
|
|
60
|
+
LATTICEAI_AUTOLOAD_MODELS: "false",
|
|
61
|
+
LATTICEAI_ALLOW_MODEL_DOWNLOADS: "false",
|
|
62
|
+
LATTICEAI_AUTO_READ_CHAT_PATHS: "false",
|
|
63
|
+
LATTICEAI_TUNNEL: "false",
|
|
64
|
+
LATTICEAI_DISCORD_PERMISSION_WEBHOOK: "",
|
|
65
|
+
LATTICEAI_DISCORD_BOT_TOKEN: "",
|
|
66
|
+
OIDC_DISCOVERY_URL: "",
|
|
67
|
+
PYTHON_KEYRING_BACKEND: "keyring.backends.null.Keyring",
|
|
68
|
+
LTCAI_E2E_BASE_URL: baseUrl,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
let sandboxCleaned = false;
|
|
72
|
+
function cleanupSandbox() {
|
|
73
|
+
if (sandboxCleaned) return;
|
|
74
|
+
sandboxCleaned = true;
|
|
75
|
+
rmSync(sandboxRoot, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
process.once("exit", cleanupSandbox);
|
|
78
|
+
|
|
79
|
+
function delay(ms) {
|
|
80
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function waitForHealth(url, timeoutMs = 60000) {
|
|
84
|
+
const deadline = Date.now() + timeoutMs;
|
|
85
|
+
let lastError = "";
|
|
86
|
+
while (Date.now() < deadline) {
|
|
87
|
+
try {
|
|
88
|
+
const response = await fetch(`${url}/health`, { signal: AbortSignal.timeout(3000) });
|
|
89
|
+
if (response.ok) return;
|
|
90
|
+
lastError = `HTTP ${response.status}`;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
lastError = String(error?.message || error);
|
|
93
|
+
}
|
|
94
|
+
await delay(500);
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`Timed out waiting for ${url}/health: ${lastError}`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function stop(child) {
|
|
100
|
+
return new Promise((resolve) => {
|
|
101
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
102
|
+
resolve();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const timer = setTimeout(() => {
|
|
106
|
+
if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
|
|
107
|
+
}, 5000);
|
|
108
|
+
child.once("close", () => {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
resolve();
|
|
111
|
+
});
|
|
112
|
+
child.kill("SIGTERM");
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function main() {
|
|
117
|
+
console.log(`[e2e] sandbox ${sandboxRoot}`);
|
|
118
|
+
console.log(`[e2e] starting sidecar at ${baseUrl}`);
|
|
119
|
+
// Same process model as scripts/run_integration_tests.mjs: uvicorn on
|
|
120
|
+
// server:app with an isolated env. Do not double-append /health — the
|
|
121
|
+
// wait helper already probes `${url}/health`.
|
|
122
|
+
const server = spawn(
|
|
123
|
+
python,
|
|
124
|
+
["-m", "uvicorn", "server:app", "--host", host, "--port", port],
|
|
125
|
+
{ stdio: "inherit", env: isolatedEnv, cwd: process.cwd() },
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
let exitCode = 1;
|
|
129
|
+
try {
|
|
130
|
+
await waitForHealth(baseUrl);
|
|
131
|
+
console.log("[e2e] sidecar healthy — running Playwright");
|
|
132
|
+
// Playwright must use the host browser install (npx playwright install).
|
|
133
|
+
// The sidecar isolation rewrites HOME/XDG_* into a disposable sandbox —
|
|
134
|
+
// reusing that env here makes Chromium look under /tmp/.../ms-playwright
|
|
135
|
+
// and fail with "Executable doesn't exist".
|
|
136
|
+
const playwrightEnv = {
|
|
137
|
+
...process.env,
|
|
138
|
+
LTCAI_E2E_BASE_URL: baseUrl,
|
|
139
|
+
};
|
|
140
|
+
const playwright = spawn(
|
|
141
|
+
"npx",
|
|
142
|
+
["playwright", "test", "-c", "playwright.e2e.config.js"],
|
|
143
|
+
{ stdio: "inherit", env: playwrightEnv, cwd: process.cwd() },
|
|
144
|
+
);
|
|
145
|
+
exitCode = await new Promise((resolve, reject) => {
|
|
146
|
+
playwright.on("error", reject);
|
|
147
|
+
playwright.on("close", (code) => resolve(code ?? 1));
|
|
148
|
+
});
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error("[e2e] failed:", error);
|
|
151
|
+
exitCode = 1;
|
|
152
|
+
} finally {
|
|
153
|
+
await stop(server);
|
|
154
|
+
cleanupSandbox();
|
|
155
|
+
}
|
|
156
|
+
process.exit(exitCode);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
main();
|
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "9.9.
|
|
2
|
+
"version": "9.9.5",
|
|
3
3
|
"generated_at": "vite",
|
|
4
4
|
"entrypoints": {
|
|
5
|
-
"app": "/static/app/assets/index-
|
|
5
|
+
"app": "/static/app/assets/index-CEu0Wqjl.js"
|
|
6
6
|
},
|
|
7
7
|
"assets": {
|
|
8
8
|
"../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
|
|
9
|
-
"_BrainSignals-
|
|
10
|
-
"_LivingBrain-
|
|
11
|
-
"_ReviewCard-
|
|
12
|
-
"_bot-
|
|
13
|
-
"_circle-
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"src/
|
|
29
|
-
"src/features/
|
|
30
|
-
"src/
|
|
31
|
-
"src/pages/
|
|
32
|
-
"src/pages/
|
|
33
|
-
"src/pages/
|
|
34
|
-
"src/pages/
|
|
9
|
+
"_BrainSignals-r_J68_zh.js": "/static/app/assets/BrainSignals-r_J68_zh.js",
|
|
10
|
+
"_LivingBrain-BVWk58MW.js": "/static/app/assets/LivingBrain-BVWk58MW.js",
|
|
11
|
+
"_ReviewCard-Va3fPQuj.js": "/static/app/assets/ReviewCard-Va3fPQuj.js",
|
|
12
|
+
"_bot-VmP0kkeA.js": "/static/app/assets/bot-VmP0kkeA.js",
|
|
13
|
+
"_circle-pause-T9POo4qy.js": "/static/app/assets/circle-pause-T9POo4qy.js",
|
|
14
|
+
"_circle-play-Bz5iTD0p.js": "/static/app/assets/circle-play-Bz5iTD0p.js",
|
|
15
|
+
"_cpu-CJhjRtNq.js": "/static/app/assets/cpu-CJhjRtNq.js",
|
|
16
|
+
"_folder-open-B2K_22VI.js": "/static/app/assets/folder-open-B2K_22VI.js",
|
|
17
|
+
"_hard-drive-CjJtYqHf.js": "/static/app/assets/hard-drive-CjJtYqHf.js",
|
|
18
|
+
"_input-CSi6OBJ9.js": "/static/app/assets/input-CSi6OBJ9.js",
|
|
19
|
+
"_navigation-BPQqEQwr.js": "/static/app/assets/navigation-BPQqEQwr.js",
|
|
20
|
+
"_network-Ck1nqc-v.js": "/static/app/assets/network-Ck1nqc-v.js",
|
|
21
|
+
"_primitives-B2f9N7Dh.js": "/static/app/assets/primitives-B2f9N7Dh.js",
|
|
22
|
+
"_shield-alert-yA_Y8lOB.js": "/static/app/assets/shield-alert-yA_Y8lOB.js",
|
|
23
|
+
"_textarea-C4wM0D-Z.js": "/static/app/assets/textarea-C4wM0D-Z.js",
|
|
24
|
+
"_useFocusTrap-CsnIhsDJ.js": "/static/app/assets/useFocusTrap-CsnIhsDJ.js",
|
|
25
|
+
"_utils-BqoznzGP.js": "/static/app/assets/utils-BqoznzGP.js",
|
|
26
|
+
"index.html": "/static/app/assets/index-CEu0Wqjl.js",
|
|
27
|
+
"assets/index-7FAfYm4v.css": "/static/app/assets/index-7FAfYm4v.css",
|
|
28
|
+
"src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-B-Tz0Um4.js",
|
|
29
|
+
"src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-CCE_0hni.js",
|
|
30
|
+
"src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-CVLiFIQC.js",
|
|
31
|
+
"src/pages/Act.tsx": "/static/app/assets/Act-DmxfbqBp.js",
|
|
32
|
+
"src/pages/Brain.tsx": "/static/app/assets/Brain-DK_zKCda.js",
|
|
33
|
+
"src/pages/Capture.tsx": "/static/app/assets/Capture-CvxwzpJZ.js",
|
|
34
|
+
"src/pages/Library.tsx": "/static/app/assets/Library-4As9VUvy.js",
|
|
35
|
+
"src/pages/System.tsx": "/static/app/assets/System-DSR2zKWd.js"
|
|
35
36
|
}
|
|
36
37
|
}
|