ltcai 10.0.0 → 10.3.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.
Files changed (214) hide show
  1. package/README.md +43 -32
  2. package/docs/CHANGELOG.md +204 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/HYBRID_CLOUD_KG_STREAMING.md +101 -0
  6. package/docs/MYPY_BACKLOG.md +98 -0
  7. package/docs/ONBOARDING.md +1 -1
  8. package/docs/OPERATIONS.md +1 -1
  9. package/docs/TRUST_MODEL.md +1 -1
  10. package/docs/WHY_LATTICE.md +1 -1
  11. package/docs/kg-schema.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/archive.py +5 -4
  14. package/lattice_brain/conversations.py +14 -3
  15. package/lattice_brain/embeddings.py +12 -2
  16. package/lattice_brain/graph/_kg_common.py +5 -5
  17. package/lattice_brain/graph/_kg_fsutil.py +5 -4
  18. package/lattice_brain/graph/discovery.py +4 -3
  19. package/lattice_brain/graph/discovery_index.py +0 -1
  20. package/lattice_brain/graph/documents.py +3 -2
  21. package/lattice_brain/graph/fusion.py +4 -0
  22. package/lattice_brain/graph/ingest.py +12 -2
  23. package/lattice_brain/graph/projection.py +3 -2
  24. package/lattice_brain/graph/provenance.py +5 -3
  25. package/lattice_brain/graph/rerank.py +4 -1
  26. package/lattice_brain/graph/retrieval.py +0 -1
  27. package/lattice_brain/graph/retrieval_docgen.py +0 -1
  28. package/lattice_brain/graph/retrieval_reads.py +0 -1
  29. package/lattice_brain/graph/retrieval_vector.py +0 -1
  30. package/lattice_brain/graph/schema.py +4 -3
  31. package/lattice_brain/graph/store.py +18 -4
  32. package/lattice_brain/graph/write_master.py +46 -1
  33. package/lattice_brain/ingestion.py +4 -1
  34. package/lattice_brain/portability.py +5 -2
  35. package/lattice_brain/quality.py +12 -5
  36. package/lattice_brain/quiet.py +43 -0
  37. package/lattice_brain/runtime/agent_runtime.py +19 -10
  38. package/lattice_brain/runtime/hooks.py +3 -2
  39. package/lattice_brain/runtime/multi_agent.py +2 -3
  40. package/lattice_brain/sensitivity.py +94 -0
  41. package/lattice_brain/storage/base.py +30 -2
  42. package/lattice_brain/storage/migration.py +3 -2
  43. package/lattice_brain/storage/postgres.py +2 -2
  44. package/lattice_brain/storage/sqlite.py +6 -4
  45. package/lattice_brain/workflow.py +4 -2
  46. package/latticeai/__init__.py +1 -1
  47. package/latticeai/api/admin.py +1 -1
  48. package/latticeai/api/agents.py +4 -2
  49. package/latticeai/api/auth.py +5 -1
  50. package/latticeai/api/automation_intelligence.py +2 -1
  51. package/latticeai/api/browser.py +3 -2
  52. package/latticeai/api/chat.py +28 -17
  53. package/latticeai/api/chat_agent_http.py +22 -8
  54. package/latticeai/api/chat_contracts.py +4 -0
  55. package/latticeai/api/chat_documents.py +6 -2
  56. package/latticeai/api/chat_hybrid.py +82 -0
  57. package/latticeai/api/computer_use.py +8 -3
  58. package/latticeai/api/knowledge_graph.py +1 -1
  59. package/latticeai/api/mcp.py +4 -4
  60. package/latticeai/api/models.py +5 -2
  61. package/latticeai/api/network_boundary.py +220 -0
  62. package/latticeai/api/permissions.py +0 -1
  63. package/latticeai/api/realtime.py +1 -1
  64. package/latticeai/api/security_dashboard.py +1 -1
  65. package/latticeai/api/setup.py +16 -3
  66. package/latticeai/api/static_routes.py +2 -1
  67. package/latticeai/api/tools.py +12 -8
  68. package/latticeai/api/voice_capture.py +3 -1
  69. package/latticeai/api/workflow_designer.py +1 -1
  70. package/latticeai/api/workspace.py +1 -2
  71. package/latticeai/app_factory.py +174 -145
  72. package/latticeai/cli/entrypoint.py +6 -4
  73. package/latticeai/core/agent.py +55 -495
  74. package/latticeai/core/agent_eval.py +2 -2
  75. package/latticeai/core/agent_helpers.py +493 -0
  76. package/latticeai/core/agent_prompts.py +0 -1
  77. package/latticeai/core/agent_registry.py +3 -1
  78. package/latticeai/core/agent_state.py +41 -0
  79. package/latticeai/core/audit.py +1 -1
  80. package/latticeai/core/builtin_hooks.py +2 -1
  81. package/latticeai/core/config.py +0 -1
  82. package/latticeai/core/embedding_providers.py +12 -1
  83. package/latticeai/core/file_generation.py +3 -0
  84. package/latticeai/core/invitations.py +4 -1
  85. package/latticeai/core/io_utils.py +3 -1
  86. package/latticeai/core/legacy_compatibility.py +1 -2
  87. package/latticeai/core/local_embeddings.py +12 -1
  88. package/latticeai/core/marketplace.py +1 -2
  89. package/latticeai/core/mcp_registry.py +0 -1
  90. package/latticeai/core/model_compat.py +1 -1
  91. package/latticeai/core/model_resolution.py +1 -1
  92. package/latticeai/core/network_boundary.py +168 -0
  93. package/latticeai/core/oidc.py +3 -0
  94. package/latticeai/core/permission_mode.py +6 -6
  95. package/latticeai/core/plugins.py +3 -2
  96. package/latticeai/core/policy.py +0 -1
  97. package/latticeai/core/quiet.py +84 -0
  98. package/latticeai/core/realtime.py +3 -2
  99. package/latticeai/core/run_store.py +4 -2
  100. package/latticeai/core/security.py +4 -0
  101. package/latticeai/core/users.py +5 -3
  102. package/latticeai/core/workspace_graph_trace.py +3 -0
  103. package/latticeai/core/workspace_os.py +65 -273
  104. package/latticeai/core/workspace_os_constants.py +126 -0
  105. package/latticeai/core/workspace_os_state.py +180 -0
  106. package/latticeai/core/workspace_os_utils.py +3 -1
  107. package/latticeai/core/workspace_permissions.py +1 -0
  108. package/latticeai/core/workspace_snapshots.py +3 -1
  109. package/latticeai/core/workspace_timeline.py +3 -1
  110. package/latticeai/integrations/telegram_bot.py +25 -16
  111. package/latticeai/models/router.py +6 -3
  112. package/latticeai/runtime/access_runtime.py +3 -1
  113. package/latticeai/runtime/audit_runtime.py +3 -2
  114. package/latticeai/runtime/chat_wiring.py +4 -1
  115. package/latticeai/runtime/history_runtime.py +1 -1
  116. package/latticeai/runtime/history_writer.py +138 -0
  117. package/latticeai/runtime/lifespan_runtime.py +3 -1
  118. package/latticeai/runtime/network_boundary_wiring.py +124 -0
  119. package/latticeai/runtime/persistence_runtime.py +3 -1
  120. package/latticeai/runtime/router_registration.py +11 -1
  121. package/latticeai/services/architecture_readiness.py +1 -2
  122. package/latticeai/services/change_proposals.py +2 -1
  123. package/latticeai/services/cloud_egress_audit.py +85 -0
  124. package/latticeai/services/cloud_extraction.py +129 -0
  125. package/latticeai/services/cloud_streaming.py +266 -0
  126. package/latticeai/services/cloud_token_guard.py +84 -0
  127. package/latticeai/services/command_center.py +2 -1
  128. package/latticeai/services/folder_watch.py +3 -0
  129. package/latticeai/services/funnel_metrics.py +3 -1
  130. package/latticeai/services/hybrid_chat.py +265 -0
  131. package/latticeai/services/hybrid_context.py +228 -0
  132. package/latticeai/services/hybrid_policy.py +178 -0
  133. package/latticeai/services/memory_service.py +1 -1
  134. package/latticeai/services/model_catalog.py +10 -1
  135. package/latticeai/services/model_engines.py +35 -14
  136. package/latticeai/services/model_loading.py +3 -2
  137. package/latticeai/services/model_runtime.py +68 -17
  138. package/latticeai/services/multimodal_streaming.py +123 -0
  139. package/latticeai/services/network_boundary_service.py +154 -0
  140. package/latticeai/services/openai_compatible_adapter.py +100 -0
  141. package/latticeai/services/p_reinforce.py +4 -0
  142. package/latticeai/services/platform_runtime.py +9 -4
  143. package/latticeai/services/process_audit.py +0 -1
  144. package/latticeai/services/product_readiness.py +1 -1
  145. package/latticeai/services/run_executor.py +3 -2
  146. package/latticeai/services/search_service.py +1 -4
  147. package/latticeai/services/setup_detection.py +2 -1
  148. package/latticeai/services/tool_dispatch.py +7 -2
  149. package/latticeai/services/upload_service.py +2 -1
  150. package/latticeai/setup/auto_setup.py +10 -7
  151. package/latticeai/setup/wizard.py +15 -11
  152. package/latticeai/tools/__init__.py +3 -3
  153. package/latticeai/tools/commands.py +7 -7
  154. package/latticeai/tools/computer.py +3 -2
  155. package/latticeai/tools/documents.py +10 -9
  156. package/latticeai/tools/filesystem.py +7 -4
  157. package/latticeai/tools/knowledge.py +2 -0
  158. package/latticeai/tools/local_files.py +1 -1
  159. package/latticeai/tools/network.py +2 -1
  160. package/package.json +7 -3
  161. package/scripts/bench_agent_smoke.py +0 -1
  162. package/scripts/bench_models.py +0 -1
  163. package/scripts/brain_quality_eval.py +7 -2
  164. package/scripts/bump_version.py +2 -1
  165. package/scripts/check_current_release_docs.mjs +1 -1
  166. package/scripts/migrate_brain_storage.py +5 -1
  167. package/scripts/profile_kg.py +2 -7
  168. package/scripts/verify_hf_model_registry.py +2 -2
  169. package/src-tauri/Cargo.lock +1 -1
  170. package/src-tauri/Cargo.toml +1 -1
  171. package/src-tauri/tauri.conf.json +1 -1
  172. package/static/app/asset-manifest.json +37 -37
  173. package/static/app/assets/{Act-BtCREeN1.js → Act-DrKIGZeJ.js} +1 -1
  174. package/static/app/assets/{AdminConsole-TPeeN18T.js → AdminConsole-CEV1VefA.js} +1 -1
  175. package/static/app/assets/{Brain-BKs6JAp0.js → Brain-BZSXnwWU.js} +1 -1
  176. package/static/app/assets/{BrainHome-BPGOvSd6.js → BrainHome-CEBd86k6.js} +1 -1
  177. package/static/app/assets/{BrainSignals-CtzQZ15J.js → BrainSignals-O4s6R7av.js} +1 -1
  178. package/static/app/assets/{Capture-1_NaHWqB.js → Capture-AGbOxsg-.js} +1 -1
  179. package/static/app/assets/{CommandPalette-pqvQOXe4.js → CommandPalette-CeqBjCn2.js} +1 -1
  180. package/static/app/assets/Library-CXnbNiQW.js +1 -0
  181. package/static/app/assets/{LivingBrain-DlQ20Q75.js → LivingBrain-D9Iei2ZJ.js} +1 -1
  182. package/static/app/assets/{ProductFlow-BZvGDRi_.js → ProductFlow-JlXiDfMM.js} +1 -1
  183. package/static/app/assets/{ReviewCard-BWgI0D2s.js → ReviewCard-QQly2bTV.js} +1 -1
  184. package/static/app/assets/System-Bp9ZY4ER.js +1 -0
  185. package/static/app/assets/{activity-Dlfk8YC7.js → activity-CxRPOQ2F.js} +1 -1
  186. package/static/app/assets/{bot-CDvUB76P.js → bot-1bcsWB2s.js} +1 -1
  187. package/static/app/assets/{brain-xczrohrt.js → brain-CxaeKCRM.js} +1 -1
  188. package/static/app/assets/{button-SOdH3Oyf.js → button-ZYFqGan7.js} +1 -1
  189. package/static/app/assets/{circle-pause-CG1ythH4.js → circle-pause-B5NOIqvk.js} +1 -1
  190. package/static/app/assets/{circle-play-HXwvjS6W.js → circle-play-BiJVFXf7.js} +1 -1
  191. package/static/app/assets/{cpu-B0d-rGyk.js → cpu-Vvq0OKTr.js} +1 -1
  192. package/static/app/assets/{download-BGIkTQL6.js → download-SEcXzkx1.js} +1 -1
  193. package/static/app/assets/{folder-open-Dst_Z0_K.js → folder-open-Dw1ff_Qa.js} +1 -1
  194. package/static/app/assets/{hard-drive-D53MsWkV.js → hard-drive-B00fR7_r.js} +1 -1
  195. package/static/app/assets/index-CEkL4_M-.css +2 -0
  196. package/static/app/assets/{index-C_IrlQMV.js → index-Dm9VXl1o.js} +3 -3
  197. package/static/app/assets/{input-C5m0riF6.js → input-DtdWYQEa.js} +1 -1
  198. package/static/app/assets/{network-C5a-E5iS.js → network-CpjBu0kI.js} +1 -1
  199. package/static/app/assets/{primitives-vNXYf58F.js → primitives-CwsudBwc.js} +1 -1
  200. package/static/app/assets/search-CwEJWBEA.js +1 -0
  201. package/static/app/assets/{shield-alert-Cc-WVXqN.js → shield-alert-CpjBc-gQ.js} +1 -1
  202. package/static/app/assets/{textarea-BkZ0EqVO.js → textarea-DUPyjHQs.js} +1 -1
  203. package/static/app/assets/{useFocusTrap-CTtKbAOU.js → useFocusTrap-BWcMtCWH.js} +1 -1
  204. package/static/app/assets/{useQuery-Dx1fi4Wu.js → useQuery-Dg5fPqTS.js} +1 -1
  205. package/static/app/assets/{users-BFpQXtEF.js → users-BgcdTQGM.js} +1 -1
  206. package/static/app/assets/{utils-BA_lmW3J.js → utils-a3YXFtEO.js} +2 -2
  207. package/static/app/assets/workspace-BMUEiXUm.js +1 -0
  208. package/static/app/index.html +4 -4
  209. package/static/sw.js +1 -1
  210. package/static/app/assets/Library-DhvoPvC7.js +0 -1
  211. package/static/app/assets/System-CSMdYLMy.js +0 -1
  212. package/static/app/assets/index-FxDusbr0.css +0 -2
  213. package/static/app/assets/search-DhbSgW6m.js +0 -1
  214. package/static/app/assets/workspace-DBPB0jkX.js +0 -1
@@ -9,6 +9,7 @@ import subprocess
9
9
  import tempfile
10
10
  from typing import Any, Dict
11
11
 
12
+ from latticeai.core.quiet import quiet
12
13
  from latticeai.tools import ToolError
13
14
 
14
15
  _PLATFORM = platform.system()
@@ -27,7 +28,7 @@ def _init_computer_use():
27
28
  _pyautogui = _pag
28
29
  _CU_AVAILABLE = True
29
30
  except Exception:
30
- pass
31
+ quiet()
31
32
 
32
33
  _init_computer_use()
33
34
 
@@ -66,7 +67,7 @@ def computer_screenshot() -> Dict[str, Any]:
66
67
  if os.path.exists(tmp):
67
68
  os.unlink(tmp)
68
69
  except OSError:
69
- pass
70
+ quiet()
70
71
 
71
72
 
72
73
  def computer_open_app(app: str = "Google Chrome") -> Dict[str, Any]:
@@ -5,17 +5,18 @@ from __future__ import annotations
5
5
  from pathlib import Path
6
6
  from typing import Any, Dict, List
7
7
 
8
+ from latticeai.core.quiet import quiet
8
9
  from latticeai.tools import (
9
- ToolError,
10
- _resolve_path,
11
- _relative,
10
+ _CJK_FONT_CANDIDATES,
11
+ _SUPPORTED_READ_EXTENSIONS,
12
+ DOCUMENT_MAX_READ_BYTES,
12
13
  DOCUMENT_OUTPUT_DIR,
14
+ PDF_OUTPUT_DIR,
13
15
  PRESENTATION_OUTPUT_DIR,
14
16
  SPREADSHEET_OUTPUT_DIR,
15
- PDF_OUTPUT_DIR,
16
- DOCUMENT_MAX_READ_BYTES,
17
- _CJK_FONT_CANDIDATES,
18
- _SUPPORTED_READ_EXTENSIONS,
17
+ ToolError,
18
+ _relative,
19
+ _resolve_path,
19
20
  )
20
21
 
21
22
 
@@ -117,9 +118,9 @@ def create_pdf(title: str, body, filename: str = "document.pdf") -> Dict[str, An
117
118
  from reportlab.lib.pagesizes import A4
118
119
  from reportlab.lib.styles import ParagraphStyle
119
120
  from reportlab.lib.units import mm
120
- from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
121
121
  from reportlab.pdfbase import pdfmetrics
122
122
  from reportlab.pdfbase.ttfonts import TTFont
123
+ from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer
123
124
  except Exception as exc:
124
125
  raise ToolError("reportlab is not installed. Run `pip install reportlab`.") from exc
125
126
 
@@ -135,7 +136,7 @@ def create_pdf(title: str, body, filename: str = "document.pdf") -> Dict[str, An
135
136
  pdfmetrics.registerFont(TTFont("KoreanFont", font_path))
136
137
  font_name = "KoreanFont"
137
138
  except Exception:
138
- pass
139
+ quiet()
139
140
  break
140
141
 
141
142
  title_style = ParagraphStyle("Title", fontName=font_name, fontSize=18, spaceAfter=8, leading=24)
@@ -15,13 +15,14 @@ from pathlib import Path
15
15
  from typing import Any, Dict, List, Optional, Tuple
16
16
 
17
17
  import latticeai.tools as tools
18
+ from latticeai.core.quiet import quiet
18
19
  from latticeai.tools import (
19
- ToolError,
20
- ensure_agent_root,
21
- _resolve_path,
22
- _relative,
23
20
  MAX_FILE_BYTES,
24
21
  TEXT_EXTENSIONS,
22
+ ToolError,
23
+ _relative,
24
+ _resolve_path,
25
+ ensure_agent_root,
25
26
  )
26
27
 
27
28
 
@@ -219,6 +220,7 @@ def grep(
219
220
  try:
220
221
  lines = file_path.read_text(encoding="utf-8").splitlines()
221
222
  except (UnicodeDecodeError, OSError):
223
+ quiet()
222
224
  continue
223
225
 
224
226
  files_scanned += 1
@@ -340,6 +342,7 @@ def search_files(query: str, path: str = ".", max_results: int = 20) -> Dict[str
340
342
  try:
341
343
  lines = file_path.read_text(encoding="utf-8").splitlines()
342
344
  except UnicodeDecodeError:
345
+ quiet()
343
346
  continue
344
347
  for index, line in enumerate(lines, start=1):
345
348
  if query_lower in line.lower():
@@ -6,6 +6,7 @@ import hashlib
6
6
  from pathlib import Path
7
7
  from typing import Any, Dict, List, Optional
8
8
 
9
+ from latticeai.core.quiet import quiet
9
10
  from latticeai.services.p_reinforce import BRAIN_DIR, STRUCTURE
10
11
  from latticeai.tools import MAX_FILE_BYTES, ToolError
11
12
 
@@ -97,6 +98,7 @@ def knowledge_search(
97
98
  try:
98
99
  content = file_path.read_text(encoding="utf-8")
99
100
  except UnicodeDecodeError:
101
+ quiet()
100
102
  continue
101
103
  if query_lower in content.lower() or query_lower in file_path.name.lower():
102
104
  results.append(
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from typing import Any, Dict
7
7
 
8
8
  from latticeai.core.tool_registry import LOCAL_WRITE_BLOCKED_PREFIXES
9
- from latticeai.tools import ToolError, LOCAL_MAX_FILE_BYTES
9
+ from latticeai.tools import LOCAL_MAX_FILE_BYTES, ToolError
10
10
 
11
11
 
12
12
  def local_list(path: str) -> Dict[str, Any]:
@@ -7,6 +7,7 @@ import socket
7
7
  import subprocess
8
8
  from typing import Any, Dict, List
9
9
 
10
+ from latticeai.core.quiet import quiet
10
11
 
11
12
 
12
13
  def _run_network_command(parts: List[str], timeout: int = 5) -> str:
@@ -44,7 +45,7 @@ def network_status() -> Dict[str, Any]:
44
45
  sock.connect(("8.8.8.8", 80))
45
46
  guessed_ip = sock.getsockname()[0]
46
47
  except Exception:
47
- pass
48
+ quiet()
48
49
  if guessed_ip and guessed_ip not in local_ips.values():
49
50
  local_ips["default_route"] = guessed_ip
50
51
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "10.0.0",
3
+ "version": "10.3.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "check:python": "node scripts/run_python.mjs scripts/check_python.py",
27
27
  "lint": "npm run lint:python && node --check tests/visual/mock_server.cjs && node --check tests/visual/v3.spec.js && npm run lint:frontend && npm run frontend:openapi:check && node scripts/check_i18n_literals.mjs && npm run check:i18n-namespaces && npm run check:bundle && npm run check:legacy-debt && npm run test:browser-extension && npm run test:vscode-extension",
28
28
  "check:legacy-debt": "node scripts/check_legacy_debt.mjs",
29
- "lint:python": "node scripts/run_python.mjs -m ruff check .",
29
+ "lint:python": "node scripts/run_python.mjs -m ruff check . && npm run typecheck:python",
30
30
  "lint:frontend": "node scripts/lint_frontend.mjs",
31
31
  "check:bundle": "node scripts/check_bundle_budget.mjs",
32
32
  "docs:check-links": "node scripts/check_markdown_links.mjs && node scripts/check_doc_status.mjs",
@@ -59,7 +59,10 @@
59
59
  "publish:openvsx": "cd vscode-extension && npm run package:vsix && npm run publish:openvsx",
60
60
  "publish:all": "npm run release:artifacts && npm run release:validate && npm publish ltcai-$npm_package_version.tgz --access public && node scripts/run_python.mjs -m twine upload --skip-existing dist/ltcai-$npm_package_version.tar.gz dist/ltcai-$npm_package_version-py3-none-any.whl && cd vscode-extension && npm run publish:vscode && npm run publish:openvsx",
61
61
  "test:vscode-extension": "cd vscode-extension && npm run build && cd .. && node --test tests/vscode-extension.test.cjs",
62
- "check:i18n-namespaces": "node scripts/check_i18n_namespace_coverage.mjs"
62
+ "check:i18n-namespaces": "node scripts/check_i18n_namespace_coverage.mjs",
63
+ "typecheck:python": "node scripts/run_python.mjs -m mypy",
64
+ "test:coverage": "node scripts/run_python.mjs -m pytest tests/ -q --cov --cov-report=term:skip-covered",
65
+ "test:frontend:coverage": "vitest run --coverage"
63
66
  },
64
67
  "keywords": [
65
68
  "ltcai",
@@ -135,6 +138,7 @@
135
138
  "@types/react": "^19.2.17",
136
139
  "@types/react-dom": "^19.2.3",
137
140
  "@vitejs/plugin-react": "^6.0.2",
141
+ "@vitest/coverage-v8": "^4.1.10",
138
142
  "autoprefixer": "^10.5.0",
139
143
  "class-variance-authority": "^0.7.1",
140
144
  "clsx": "^2.1.1",
@@ -73,7 +73,6 @@ from latticeai.core.agent_prompts import ( # noqa: E402
73
73
  )
74
74
  from latticeai.tools import ToolError # noqa: E402
75
75
 
76
-
77
76
  # ── canonical smoke tasks ────────────────────────────────────────────────
78
77
  # Small, file-flavored tasks users actually ask for. The tool port is canned,
79
78
  # so the measurement is "can this model steer the real loop to completion",
@@ -82,7 +82,6 @@ from latticeai.core.file_generation import ( # noqa: E402
82
82
  validate_file_content,
83
83
  )
84
84
 
85
-
86
85
  # ── Scripted corpora ─────────────────────────────────────────────────────
87
86
  # Each entry is one model output for a canonical agent turn. The tiers encode
88
87
  # how the SAME intent degrades as model quality drops. All "should_parse=True"
@@ -18,9 +18,14 @@ if str(REPO_ROOT) not in sys.path:
18
18
 
19
19
  from lattice_brain.graph.store import KnowledgeGraphStore # noqa: E402
20
20
  from lattice_brain.quality import RetrievalBenchmarkRunner # noqa: E402
21
- from latticeai.services.search_service import SearchService # noqa: E402
21
+ from lattice_brain.retrieval_benchmark_fixtures import ( # noqa: E402
22
+ DOCUMENTS,
23
+ FIXTURE_NAME,
24
+ QUERIES,
25
+ TOP_K,
26
+ )
22
27
  from latticeai.services.memory_service import MemoryService # noqa: E402
23
- from lattice_brain.retrieval_benchmark_fixtures import DOCUMENTS, FIXTURE_NAME, QUERIES, TOP_K # noqa: E402
28
+ from latticeai.services.search_service import SearchService # noqa: E402
24
29
 
25
30
 
26
31
  class _EvalStore:
@@ -24,7 +24,8 @@ REPO = Path(__file__).resolve().parents[1]
24
24
  TARGETS = [
25
25
  ("latticeai/__init__.py", "regex", r'(__version__ = ")([^"]+)(")'),
26
26
  ("lattice_brain/__init__.py", "regex", r'(__version__ = ")([^"]+)(")'),
27
- ("latticeai/core/workspace_os.py", "regex", r'(WORKSPACE_OS_VERSION = ")([^"]+)(")'),
27
+ # Moved out of workspace_os.py in 10.2.0 when the vocabulary was split off.
28
+ ("latticeai/core/workspace_os_constants.py", "regex", r'(WORKSPACE_OS_VERSION = ")([^"]+)(")'),
28
29
  ("latticeai/core/marketplace.py", "regex", r'(MARKETPLACE_VERSION = ")([^"]+)(")'),
29
30
  ("lattice_brain/runtime/multi_agent.py", "regex", r'(MULTI_AGENT_VERSION = ")([^"]+)(")'),
30
31
  ("latticeai/services/architecture_readiness.py", "regex", r'(ARCHITECTURE_VERSION_TARGET = ")([^"]+)(")'),
@@ -6,7 +6,7 @@ const root = process.cwd();
6
6
  const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
7
7
  const version = pkg.version;
8
8
  const releaseDir = `output/release/v${version}`;
9
- const releaseTheme = "Plain Language";
9
+ const releaseTheme = "Measured Ground";
10
10
  const title = `${version} — ${releaseTheme}`;
11
11
  const escapedVersion = version.replaceAll(".", "\\.");
12
12
 
@@ -13,7 +13,11 @@ import argparse
13
13
  import json
14
14
  from pathlib import Path
15
15
 
16
- from lattice_brain.storage import DockerPostgresWizard, PostgresEngine, SQLiteToPostgresMigrator
16
+ from lattice_brain.storage import (
17
+ DockerPostgresWizard,
18
+ PostgresEngine,
19
+ SQLiteToPostgresMigrator,
20
+ )
17
21
 
18
22
 
19
23
  def _print_json(value: object) -> None:
@@ -51,7 +51,6 @@ if str(ROOT) not in sys.path:
51
51
 
52
52
  from lattice_brain.graph.store import KnowledgeGraphStore # noqa: E402
53
53
 
54
-
55
54
  # ── Synthetic corpus ─────────────────────────────────────────────────────────
56
55
  # Recurring entities so concept nodes are shared across documents and edges
57
56
  # actually form; a Korean slice exercises the FTS5 trigram path.
@@ -60,11 +59,7 @@ ENTITIES = [
60
59
  "Telegram", "MLX", "Embedding", "Pipeline", "Workspace", "Provenance",
61
60
  "Scheduler", "Retrieval", "Ingestion", "Router", "Registry", "Backup",
62
61
  ]
63
- FILLER = (
64
- "the service processes requests and stores results in the database "
65
- "while the worker retries failed jobs and reports metrics to the "
66
- "dashboard for the on-call engineer to review during the incident "
67
- ).split()
62
+ FILLER = ["the", "service", "processes", "requests", "and", "stores", "results", "in", "the", "database", "while", "the", "worker", "retries", "failed", "jobs", "and", "reports", "metrics", "to", "the", "dashboard", "for", "the", "on-call", "engineer", "to", "review", "during", "the", "incident"]
68
63
  KOREAN = ["프로젝트", "일정", "회의", "결정", "지식그래프", "검색", "성능", "메모리"]
69
64
 
70
65
 
@@ -134,7 +129,7 @@ def run_profile(
134
129
  db_path: Optional[Path],
135
130
  seed: int = 42,
136
131
  ) -> Dict[str, Any]:
137
- rng = random.Random(seed)
132
+ rng = random.Random(seed) # noqa: S311 — synthetic profiling data, not a secret
138
133
  tmp_ctx = None
139
134
  if db_path is None:
140
135
  tmp_ctx = tempfile.TemporaryDirectory(prefix="ltcai-profile-kg-")
@@ -40,8 +40,8 @@ sys.path.insert(0, str(REPO_ROOT))
40
40
 
41
41
  try:
42
42
  from latticeai.services.model_capability_registry import (
43
- get_all_capabilities,
44
43
  ModelCapability,
44
+ get_all_capabilities,
45
45
  )
46
46
  except Exception as e:
47
47
  print("ERROR: Could not import model_capability_registry:", e)
@@ -210,7 +210,7 @@ def main() -> int:
210
210
  print("-" * 88)
211
211
 
212
212
  results: List[Dict[str, Any]] = []
213
- tmp = Path("/tmp/lattice_verify_hf")
213
+ tmp = Path("/tmp/lattice_verify_hf") # noqa: S108 — developer verification scratch dir
214
214
  tmp.mkdir(exist_ok=True)
215
215
 
216
216
  missing_critical = 0
@@ -1584,7 +1584,7 @@ dependencies = [
1584
1584
 
1585
1585
  [[package]]
1586
1586
  name = "lattice-ai-desktop"
1587
- version = "10.0.0"
1587
+ version = "10.3.0"
1588
1588
  dependencies = [
1589
1589
  "plist",
1590
1590
  "serde",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "10.0.0"
3
+ version = "10.3.0"
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": "10.0.0",
4
+ "version": "10.3.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",
@@ -1,45 +1,45 @@
1
1
  {
2
- "version": "10.0.0",
2
+ "version": "10.3.0",
3
3
  "generated_at": "vite",
4
4
  "entrypoints": {
5
- "app": "/static/app/assets/index-C_IrlQMV.js"
5
+ "app": "/static/app/assets/index-Dm9VXl1o.js"
6
6
  },
7
7
  "assets": {
8
8
  "../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
9
- "_BrainSignals-CtzQZ15J.js": "/static/app/assets/BrainSignals-CtzQZ15J.js",
10
- "_LivingBrain-DlQ20Q75.js": "/static/app/assets/LivingBrain-DlQ20Q75.js",
11
- "_ReviewCard-BWgI0D2s.js": "/static/app/assets/ReviewCard-BWgI0D2s.js",
12
- "_activity-Dlfk8YC7.js": "/static/app/assets/activity-Dlfk8YC7.js",
13
- "_bot-CDvUB76P.js": "/static/app/assets/bot-CDvUB76P.js",
14
- "_brain-xczrohrt.js": "/static/app/assets/brain-xczrohrt.js",
15
- "_button-SOdH3Oyf.js": "/static/app/assets/button-SOdH3Oyf.js",
16
- "_circle-pause-CG1ythH4.js": "/static/app/assets/circle-pause-CG1ythH4.js",
17
- "_circle-play-HXwvjS6W.js": "/static/app/assets/circle-play-HXwvjS6W.js",
18
- "_cpu-B0d-rGyk.js": "/static/app/assets/cpu-B0d-rGyk.js",
19
- "_download-BGIkTQL6.js": "/static/app/assets/download-BGIkTQL6.js",
20
- "_folder-open-Dst_Z0_K.js": "/static/app/assets/folder-open-Dst_Z0_K.js",
21
- "_hard-drive-D53MsWkV.js": "/static/app/assets/hard-drive-D53MsWkV.js",
22
- "_input-C5m0riF6.js": "/static/app/assets/input-C5m0riF6.js",
23
- "_network-C5a-E5iS.js": "/static/app/assets/network-C5a-E5iS.js",
24
- "_primitives-vNXYf58F.js": "/static/app/assets/primitives-vNXYf58F.js",
25
- "_search-DhbSgW6m.js": "/static/app/assets/search-DhbSgW6m.js",
26
- "_shield-alert-Cc-WVXqN.js": "/static/app/assets/shield-alert-Cc-WVXqN.js",
27
- "_textarea-BkZ0EqVO.js": "/static/app/assets/textarea-BkZ0EqVO.js",
28
- "_useFocusTrap-CTtKbAOU.js": "/static/app/assets/useFocusTrap-CTtKbAOU.js",
29
- "_useQuery-Dx1fi4Wu.js": "/static/app/assets/useQuery-Dx1fi4Wu.js",
30
- "_users-BFpQXtEF.js": "/static/app/assets/users-BFpQXtEF.js",
31
- "_utils-BA_lmW3J.js": "/static/app/assets/utils-BA_lmW3J.js",
32
- "_workspace-DBPB0jkX.js": "/static/app/assets/workspace-DBPB0jkX.js",
33
- "index.html": "/static/app/assets/index-C_IrlQMV.js",
34
- "assets/index-FxDusbr0.css": "/static/app/assets/index-FxDusbr0.css",
35
- "src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-BZvGDRi_.js",
36
- "src/features/admin/AdminConsole.tsx": "/static/app/assets/AdminConsole-TPeeN18T.js",
37
- "src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-BPGOvSd6.js",
38
- "src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-pqvQOXe4.js",
39
- "src/pages/Act.tsx": "/static/app/assets/Act-BtCREeN1.js",
40
- "src/pages/Brain.tsx": "/static/app/assets/Brain-BKs6JAp0.js",
41
- "src/pages/Capture.tsx": "/static/app/assets/Capture-1_NaHWqB.js",
42
- "src/pages/Library.tsx": "/static/app/assets/Library-DhvoPvC7.js",
43
- "src/pages/System.tsx": "/static/app/assets/System-CSMdYLMy.js"
9
+ "_BrainSignals-O4s6R7av.js": "/static/app/assets/BrainSignals-O4s6R7av.js",
10
+ "_LivingBrain-D9Iei2ZJ.js": "/static/app/assets/LivingBrain-D9Iei2ZJ.js",
11
+ "_ReviewCard-QQly2bTV.js": "/static/app/assets/ReviewCard-QQly2bTV.js",
12
+ "_activity-CxRPOQ2F.js": "/static/app/assets/activity-CxRPOQ2F.js",
13
+ "_bot-1bcsWB2s.js": "/static/app/assets/bot-1bcsWB2s.js",
14
+ "_brain-CxaeKCRM.js": "/static/app/assets/brain-CxaeKCRM.js",
15
+ "_button-ZYFqGan7.js": "/static/app/assets/button-ZYFqGan7.js",
16
+ "_circle-pause-B5NOIqvk.js": "/static/app/assets/circle-pause-B5NOIqvk.js",
17
+ "_circle-play-BiJVFXf7.js": "/static/app/assets/circle-play-BiJVFXf7.js",
18
+ "_cpu-Vvq0OKTr.js": "/static/app/assets/cpu-Vvq0OKTr.js",
19
+ "_download-SEcXzkx1.js": "/static/app/assets/download-SEcXzkx1.js",
20
+ "_folder-open-Dw1ff_Qa.js": "/static/app/assets/folder-open-Dw1ff_Qa.js",
21
+ "_hard-drive-B00fR7_r.js": "/static/app/assets/hard-drive-B00fR7_r.js",
22
+ "_input-DtdWYQEa.js": "/static/app/assets/input-DtdWYQEa.js",
23
+ "_network-CpjBu0kI.js": "/static/app/assets/network-CpjBu0kI.js",
24
+ "_primitives-CwsudBwc.js": "/static/app/assets/primitives-CwsudBwc.js",
25
+ "_search-CwEJWBEA.js": "/static/app/assets/search-CwEJWBEA.js",
26
+ "_shield-alert-CpjBc-gQ.js": "/static/app/assets/shield-alert-CpjBc-gQ.js",
27
+ "_textarea-DUPyjHQs.js": "/static/app/assets/textarea-DUPyjHQs.js",
28
+ "_useFocusTrap-BWcMtCWH.js": "/static/app/assets/useFocusTrap-BWcMtCWH.js",
29
+ "_useQuery-Dg5fPqTS.js": "/static/app/assets/useQuery-Dg5fPqTS.js",
30
+ "_users-BgcdTQGM.js": "/static/app/assets/users-BgcdTQGM.js",
31
+ "_utils-a3YXFtEO.js": "/static/app/assets/utils-a3YXFtEO.js",
32
+ "_workspace-BMUEiXUm.js": "/static/app/assets/workspace-BMUEiXUm.js",
33
+ "index.html": "/static/app/assets/index-Dm9VXl1o.js",
34
+ "assets/index-CEkL4_M-.css": "/static/app/assets/index-CEkL4_M-.css",
35
+ "src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-JlXiDfMM.js",
36
+ "src/features/admin/AdminConsole.tsx": "/static/app/assets/AdminConsole-CEV1VefA.js",
37
+ "src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-CEBd86k6.js",
38
+ "src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-CeqBjCn2.js",
39
+ "src/pages/Act.tsx": "/static/app/assets/Act-DrKIGZeJ.js",
40
+ "src/pages/Brain.tsx": "/static/app/assets/Brain-BZSXnwWU.js",
41
+ "src/pages/Capture.tsx": "/static/app/assets/Capture-AGbOxsg-.js",
42
+ "src/pages/Library.tsx": "/static/app/assets/Library-CXnbNiQW.js",
43
+ "src/pages/System.tsx": "/static/app/assets/System-Bp9ZY4ER.js"
44
44
  }
45
45
  }