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.
Files changed (89) hide show
  1. package/README.md +39 -38
  2. package/docs/CHANGELOG.md +100 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +1 -1
  7. package/docs/SURFACE_PARITY.md +53 -0
  8. package/docs/TRUST_MODEL.md +1 -1
  9. package/docs/WHY_LATTICE.md +1 -1
  10. package/docs/kg-schema.md +1 -1
  11. package/lattice_brain/__init__.py +1 -1
  12. package/lattice_brain/graph/_kg_common.py +335 -0
  13. package/lattice_brain/graph/discovery_index.py +8 -1
  14. package/lattice_brain/graph/ingest.py +43 -9
  15. package/lattice_brain/graph/projection.py +221 -37
  16. package/lattice_brain/graph/rerank.py +160 -0
  17. package/lattice_brain/graph/retrieval.py +90 -455
  18. package/lattice_brain/graph/retrieval_policy.py +174 -0
  19. package/lattice_brain/graph/retrieval_reads.py +459 -0
  20. package/lattice_brain/graph/retrieval_vector.py +122 -2
  21. package/lattice_brain/graph/store.py +2 -0
  22. package/lattice_brain/portability.py +41 -12
  23. package/lattice_brain/quality.py +26 -6
  24. package/lattice_brain/runtime/multi_agent.py +1 -1
  25. package/latticeai/__init__.py +1 -1
  26. package/latticeai/api/chat.py +6 -0
  27. package/latticeai/api/chat_agent_http.py +262 -52
  28. package/latticeai/api/chat_contracts.py +1 -1
  29. package/latticeai/api/chat_intents.py +37 -18
  30. package/latticeai/api/chat_stream.py +76 -2
  31. package/latticeai/api/knowledge_graph.py +35 -1
  32. package/latticeai/core/agent.py +420 -27
  33. package/latticeai/core/enterprise.py +5 -0
  34. package/latticeai/core/file_generation.py +130 -5
  35. package/latticeai/core/legacy_compatibility.py +1 -1
  36. package/latticeai/core/marketplace.py +1 -1
  37. package/latticeai/core/run_store.py +245 -0
  38. package/latticeai/core/workspace_os.py +1 -1
  39. package/latticeai/integrations/telegram_bot.py +82 -23
  40. package/latticeai/models/router.py +25 -12
  41. package/latticeai/services/architecture_readiness.py +1 -1
  42. package/latticeai/services/command_center.py +90 -1
  43. package/latticeai/services/folder_watch.py +5 -0
  44. package/latticeai/services/funnel_metrics.py +9 -1
  45. package/latticeai/services/product_readiness.py +1 -1
  46. package/latticeai/services/search_service.py +43 -13
  47. package/latticeai/services/tool_dispatch.py +56 -0
  48. package/package.json +2 -1
  49. package/scripts/bench_agent_smoke.py +410 -0
  50. package/scripts/check_current_release_docs.mjs +1 -1
  51. package/scripts/funnel_soft_gate.py +192 -0
  52. package/scripts/run_sidecar_e2e.mjs +159 -0
  53. package/src-tauri/Cargo.lock +1 -1
  54. package/src-tauri/Cargo.toml +1 -1
  55. package/src-tauri/tauri.conf.json +1 -1
  56. package/static/app/asset-manifest.json +29 -28
  57. package/static/app/assets/Act-DmxfbqBp.js +1 -0
  58. package/static/app/assets/{Brain-DEY9jLVt.js → Brain-DK_zKCda.js} +2 -2
  59. package/static/app/assets/BrainHome-CCE_0hni.js +2 -0
  60. package/static/app/assets/BrainSignals-r_J68_zh.js +1 -0
  61. package/static/app/assets/{Capture-CVZ09QXi.js → Capture-CvxwzpJZ.js} +1 -1
  62. package/static/app/assets/{CommandPalette-DepwOQFv.js → CommandPalette-CVLiFIQC.js} +1 -1
  63. package/static/app/assets/{Library-Bp0n-HlW.js → Library-4As9VUvy.js} +1 -1
  64. package/static/app/assets/{LivingBrain-DxP4efJF.js → LivingBrain-BVWk58MW.js} +1 -1
  65. package/static/app/assets/{ProductFlow-DRbm7NEq.js → ProductFlow-B-Tz0Um4.js} +1 -1
  66. package/static/app/assets/{ReviewCard-C4HAO7A3.js → ReviewCard-Va3fPQuj.js} +1 -1
  67. package/static/app/assets/{System-ByQcmJW-.js → System-DSR2zKWd.js} +1 -1
  68. package/static/app/assets/{bot-BNDyZLR7.js → bot-VmP0kkeA.js} +1 -1
  69. package/static/app/assets/circle-pause-T9POo4qy.js +1 -0
  70. package/static/app/assets/{circle-play-BkhdcHgd.js → circle-play-Bz5iTD0p.js} +1 -1
  71. package/static/app/assets/{cpu-C6jjYm6i.js → cpu-CJhjRtNq.js} +1 -1
  72. package/static/app/assets/{folder-open-DjGIvDBQ.js → folder-open-B2K_22VI.js} +1 -1
  73. package/static/app/assets/{hard-drive-BlSbwSaT.js → hard-drive-CjJtYqHf.js} +1 -1
  74. package/static/app/assets/{index-Bge3DXW7.css → index-7FAfYm4v.css} +1 -1
  75. package/static/app/assets/{index-CHu7cgj3.js → index-CEu0Wqjl.js} +3 -3
  76. package/static/app/assets/{input-DVDI0YR3.js → input-CSi6OBJ9.js} +1 -1
  77. package/static/app/assets/{navigation-BddhEWA0.js → navigation-BPQqEQwr.js} +1 -1
  78. package/static/app/assets/{network-pYQt5oBu.js → network-Ck1nqc-v.js} +1 -1
  79. package/static/app/assets/{primitives-D7gCdEvS.js → primitives-B2f9N7Dh.js} +1 -1
  80. package/static/app/assets/{shield-alert-K9RKGQeg.js → shield-alert-yA_Y8lOB.js} +1 -1
  81. package/static/app/assets/{textarea-sqQmoBKL.js → textarea-C4wM0D-Z.js} +1 -1
  82. package/static/app/assets/{useFocusTrap-7EV9dFP2.js → useFocusTrap-CsnIhsDJ.js} +1 -1
  83. package/static/app/assets/utils-BqoznzGP.js +7 -0
  84. package/static/app/index.html +4 -4
  85. package/static/sw.js +1 -1
  86. package/static/app/assets/Act-DmdruVKV.js +0 -1
  87. package/static/app/assets/BrainHome-CeNaxjP1.js +0 -2
  88. package/static/app/assets/BrainSignals-CStjIqYi.js +0 -1
  89. 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();
@@ -1584,7 +1584,7 @@ dependencies = [
1584
1584
 
1585
1585
  [[package]]
1586
1586
  name = "lattice-ai-desktop"
1587
- version = "9.9.3"
1587
+ version = "9.9.5"
1588
1588
  dependencies = [
1589
1589
  "plist",
1590
1590
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "9.9.3"
3
+ version = "9.9.5"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "9.9.3",
4
+ "version": "9.9.5",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",
@@ -1,36 +1,37 @@
1
1
  {
2
- "version": "9.9.3",
2
+ "version": "9.9.5",
3
3
  "generated_at": "vite",
4
4
  "entrypoints": {
5
- "app": "/static/app/assets/index-CHu7cgj3.js"
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-CStjIqYi.js": "/static/app/assets/BrainSignals-CStjIqYi.js",
10
- "_LivingBrain-DxP4efJF.js": "/static/app/assets/LivingBrain-DxP4efJF.js",
11
- "_ReviewCard-C4HAO7A3.js": "/static/app/assets/ReviewCard-C4HAO7A3.js",
12
- "_bot-BNDyZLR7.js": "/static/app/assets/bot-BNDyZLR7.js",
13
- "_circle-play-BkhdcHgd.js": "/static/app/assets/circle-play-BkhdcHgd.js",
14
- "_cpu-C6jjYm6i.js": "/static/app/assets/cpu-C6jjYm6i.js",
15
- "_folder-open-DjGIvDBQ.js": "/static/app/assets/folder-open-DjGIvDBQ.js",
16
- "_hard-drive-BlSbwSaT.js": "/static/app/assets/hard-drive-BlSbwSaT.js",
17
- "_input-DVDI0YR3.js": "/static/app/assets/input-DVDI0YR3.js",
18
- "_navigation-BddhEWA0.js": "/static/app/assets/navigation-BddhEWA0.js",
19
- "_network-pYQt5oBu.js": "/static/app/assets/network-pYQt5oBu.js",
20
- "_primitives-D7gCdEvS.js": "/static/app/assets/primitives-D7gCdEvS.js",
21
- "_shield-alert-K9RKGQeg.js": "/static/app/assets/shield-alert-K9RKGQeg.js",
22
- "_textarea-sqQmoBKL.js": "/static/app/assets/textarea-sqQmoBKL.js",
23
- "_useFocusTrap-7EV9dFP2.js": "/static/app/assets/useFocusTrap-7EV9dFP2.js",
24
- "_utils-uQYKXNeq.js": "/static/app/assets/utils-uQYKXNeq.js",
25
- "index.html": "/static/app/assets/index-CHu7cgj3.js",
26
- "assets/index-Bge3DXW7.css": "/static/app/assets/index-Bge3DXW7.css",
27
- "src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-DRbm7NEq.js",
28
- "src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-CeNaxjP1.js",
29
- "src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-DepwOQFv.js",
30
- "src/pages/Act.tsx": "/static/app/assets/Act-DmdruVKV.js",
31
- "src/pages/Brain.tsx": "/static/app/assets/Brain-DEY9jLVt.js",
32
- "src/pages/Capture.tsx": "/static/app/assets/Capture-CVZ09QXi.js",
33
- "src/pages/Library.tsx": "/static/app/assets/Library-Bp0n-HlW.js",
34
- "src/pages/System.tsx": "/static/app/assets/System-ByQcmJW-.js"
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
  }