ltcai 11.2.0 → 11.5.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 (253) hide show
  1. package/README.md +50 -53
  2. package/docs/CHANGELOG.md +87 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/MULTI_AGENT_RUNTIME.md +1 -1
  6. package/docs/ONBOARDING.md +1 -1
  7. package/docs/OPERATIONS.md +6 -2
  8. package/docs/PERMISSION_MODE.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 +2 -2
  12. package/docs/v11.3.0_PLAN.md +202 -0
  13. package/docs/v11.4.0_RUST_FOUNDATION_PLAN.md +181 -0
  14. package/docs/v11.5.0_RUST_COMPLETE_PLAN.md +145 -0
  15. package/lattice_brain/__init__.py +1 -1
  16. package/lattice_brain/graph/_kg_common/__init__.py +287 -0
  17. package/lattice_brain/graph/_kg_common/extraction.py +516 -0
  18. package/lattice_brain/graph/_kg_common/relations.py +161 -0
  19. package/lattice_brain/graph/_kg_common/text.py +479 -0
  20. package/lattice_brain/graph/discovery_index/__init__.py +35 -0
  21. package/lattice_brain/graph/discovery_index/cleanup.py +182 -0
  22. package/lattice_brain/graph/discovery_index/extract.py +137 -0
  23. package/lattice_brain/graph/discovery_index/scan.py +411 -0
  24. package/lattice_brain/graph/discovery_index/upsert.py +495 -0
  25. package/lattice_brain/graph/projection/__init__.py +42 -0
  26. package/lattice_brain/graph/projection/curation.py +500 -0
  27. package/lattice_brain/graph/{projection.py → projection/v2_schema.py} +15 -477
  28. package/lattice_brain/graph/retrieval/__init__.py +54 -0
  29. package/lattice_brain/graph/retrieval/context.py +197 -0
  30. package/lattice_brain/graph/retrieval/graph_view.py +319 -0
  31. package/lattice_brain/graph/retrieval/hybrid.py +488 -0
  32. package/lattice_brain/graph/retrieval/maintenance.py +121 -0
  33. package/lattice_brain/graph/retrieval/signals.py +95 -0
  34. package/lattice_brain/graph/retrieval_vector/__init__.py +42 -0
  35. package/lattice_brain/graph/retrieval_vector/fingerprint.py +97 -0
  36. package/lattice_brain/graph/retrieval_vector/indexing.py +347 -0
  37. package/lattice_brain/graph/retrieval_vector/search.py +560 -0
  38. package/lattice_brain/graph/retrieval_vector/status.py +374 -0
  39. package/lattice_brain/ingestion/__init__.py +130 -0
  40. package/lattice_brain/ingestion/_contract.py +90 -0
  41. package/lattice_brain/ingestion/constants.py +127 -0
  42. package/lattice_brain/ingestion/folder_scan.py +57 -0
  43. package/lattice_brain/ingestion/folders.py +258 -0
  44. package/lattice_brain/ingestion/hashing.py +26 -0
  45. package/lattice_brain/ingestion/jobs_api.py +107 -0
  46. package/lattice_brain/ingestion/models.py +80 -0
  47. package/lattice_brain/ingestion/pipeline.py +486 -0
  48. package/lattice_brain/ingestion/quality.py +209 -0
  49. package/lattice_brain/ingestion/routing.py +295 -0
  50. package/lattice_brain/multimodal/__init__.py +164 -0
  51. package/lattice_brain/multimodal/audio.py +77 -0
  52. package/lattice_brain/multimodal/common.py +118 -0
  53. package/lattice_brain/multimodal/images.py +498 -0
  54. package/lattice_brain/multimodal/ports.py +169 -0
  55. package/lattice_brain/multimodal/video.py +410 -0
  56. package/lattice_brain/portability/__init__.py +90 -0
  57. package/lattice_brain/portability/_contract.py +42 -0
  58. package/lattice_brain/portability/backups.py +338 -0
  59. package/lattice_brain/portability/bundles.py +136 -0
  60. package/lattice_brain/portability/constants.py +93 -0
  61. package/lattice_brain/portability/fsops.py +138 -0
  62. package/lattice_brain/portability/service.py +41 -0
  63. package/lattice_brain/{portability.py → portability/sharing.py} +44 -677
  64. package/lattice_brain/runtime/__init__.py +1 -1
  65. package/lattice_brain/runtime/multi_agent.py +1 -1
  66. package/latticeai/__init__.py +1 -1
  67. package/latticeai/api/chronicle.py +63 -0
  68. package/latticeai/api/index_jobs.py +145 -0
  69. package/latticeai/core/agent/__init__.py +93 -0
  70. package/latticeai/core/agent/_contract.py +79 -0
  71. package/latticeai/core/agent/context.py +57 -0
  72. package/latticeai/core/agent/deps.py +125 -0
  73. package/latticeai/core/agent/execution.py +622 -0
  74. package/latticeai/core/agent/planning.py +145 -0
  75. package/latticeai/core/agent/recovery.py +157 -0
  76. package/latticeai/core/agent/runtime.py +210 -0
  77. package/latticeai/core/agent/verification.py +231 -0
  78. package/latticeai/core/embedding_providers/__init__.py +151 -0
  79. package/latticeai/core/embedding_providers/base.py +199 -0
  80. package/latticeai/core/embedding_providers/captions.py +162 -0
  81. package/latticeai/core/embedding_providers/profiles.py +126 -0
  82. package/latticeai/core/embedding_providers/text.py +350 -0
  83. package/latticeai/core/embedding_providers/vision.py +352 -0
  84. package/latticeai/core/file_generation/__init__.py +115 -0
  85. package/latticeai/core/file_generation/bundles.py +76 -0
  86. package/latticeai/core/file_generation/extraction.py +154 -0
  87. package/latticeai/core/file_generation/inference.py +235 -0
  88. package/latticeai/core/file_generation/orchestration.py +152 -0
  89. package/latticeai/core/file_generation/prompting.py +117 -0
  90. package/latticeai/core/file_generation/repair.py +114 -0
  91. package/latticeai/core/file_generation/sanitize.py +61 -0
  92. package/latticeai/core/file_generation/validation.py +201 -0
  93. package/latticeai/core/legacy_compatibility.py +1 -1
  94. package/latticeai/core/marketplace.py +1 -1
  95. package/latticeai/core/messages.py +14 -0
  96. package/latticeai/core/workspace_os_constants.py +1 -1
  97. package/latticeai/integrations/telegram_bot/__init__.py +123 -0
  98. package/latticeai/integrations/telegram_bot/__main__.py +17 -0
  99. package/latticeai/integrations/telegram_bot/config.py +86 -0
  100. package/latticeai/integrations/telegram_bot/dispatch.py +311 -0
  101. package/latticeai/integrations/telegram_bot/flows.py +478 -0
  102. package/latticeai/integrations/telegram_bot/helpers.py +322 -0
  103. package/latticeai/integrations/telegram_bot/screens.py +394 -0
  104. package/latticeai/models/router/__init__.py +88 -0
  105. package/latticeai/models/router/_contract.py +66 -0
  106. package/latticeai/models/router/branding.py +56 -0
  107. package/latticeai/models/router/catalog.py +69 -0
  108. package/latticeai/models/router/documents.py +199 -0
  109. package/latticeai/models/router/errors.py +37 -0
  110. package/latticeai/models/router/generation.py +258 -0
  111. package/latticeai/models/router/loading.py +291 -0
  112. package/latticeai/models/router/local_models.py +85 -0
  113. package/latticeai/models/router/registry.py +147 -0
  114. package/latticeai/runtime/build_phases/__init__.py +82 -0
  115. package/latticeai/runtime/build_phases/features.py +421 -0
  116. package/latticeai/runtime/build_phases/foundation.py +555 -0
  117. package/latticeai/runtime/build_phases/web.py +492 -0
  118. package/latticeai/runtime/runtime_context.py +1 -0
  119. package/latticeai/services/architecture_readiness.py +48 -19
  120. package/latticeai/services/brain_intelligence/__init__.py +58 -0
  121. package/latticeai/services/brain_intelligence/_contract.py +71 -0
  122. package/latticeai/services/brain_intelligence/consistency.py +193 -0
  123. package/latticeai/services/brain_intelligence/constants.py +47 -0
  124. package/latticeai/services/brain_intelligence/digest.py +258 -0
  125. package/latticeai/services/brain_intelligence/health.py +331 -0
  126. package/latticeai/services/brain_intelligence/proposals.py +264 -0
  127. package/latticeai/services/brain_intelligence/sampling.py +84 -0
  128. package/latticeai/services/brain_intelligence/service.py +48 -0
  129. package/latticeai/services/chronicle.py +557 -0
  130. package/latticeai/services/memory_service/__init__.py +52 -0
  131. package/latticeai/services/memory_service/_contract.py +100 -0
  132. package/latticeai/services/memory_service/brief.py +431 -0
  133. package/latticeai/services/memory_service/constants.py +57 -0
  134. package/latticeai/services/memory_service/maintenance.py +138 -0
  135. package/latticeai/services/memory_service/manager.py +186 -0
  136. package/latticeai/services/memory_service/proof.py +136 -0
  137. package/latticeai/services/memory_service/recall.py +225 -0
  138. package/latticeai/services/memory_service/service.py +48 -0
  139. package/latticeai/services/memory_service/stores.py +110 -0
  140. package/latticeai/services/model_runtime/__init__.py +322 -0
  141. package/latticeai/services/model_runtime/cloud.py +87 -0
  142. package/latticeai/services/model_runtime/download.py +282 -0
  143. package/latticeai/services/model_runtime/engines.py +341 -0
  144. package/latticeai/services/model_runtime/loading.py +178 -0
  145. package/latticeai/services/model_runtime/service.py +129 -0
  146. package/latticeai/services/model_runtime/state.py +131 -0
  147. package/latticeai/services/model_runtime/status.py +255 -0
  148. package/latticeai/services/product_readiness.py +15 -7
  149. package/latticeai/setup/wizard/__init__.py +126 -0
  150. package/latticeai/setup/wizard/catalog.py +172 -0
  151. package/latticeai/setup/wizard/detect.py +323 -0
  152. package/latticeai/setup/wizard/install.py +348 -0
  153. package/latticeai/setup/wizard/paths.py +168 -0
  154. package/latticeai/setup/wizard/plans.py +74 -0
  155. package/latticeai/setup/wizard/recommend.py +320 -0
  156. package/package.json +6 -2
  157. package/scripts/bump_version.py +14 -0
  158. package/scripts/capture_release_evidence.mjs +33 -21
  159. package/scripts/check_current_release_docs.mjs +1 -1
  160. package/scripts/check_i18n_namespace_coverage.mjs +41 -4
  161. package/scripts/check_max_file_lines.mjs +102 -0
  162. package/scripts/check_release_evidence_bound.mjs +30 -15
  163. package/scripts/check_screenshot_pixel_delta.py +34 -4
  164. package/scripts/check_server_i18n.mjs +2 -0
  165. package/scripts/chunking_parity_corpus.py +449 -0
  166. package/scripts/generate_agent_parity_fixtures.py +752 -0
  167. package/scripts/generate_chunking_parity_fixtures.py +259 -0
  168. package/scripts/generate_rust_parity_fixtures.py +997 -0
  169. package/scripts/lib/mock_server_fingerprint.mjs +94 -0
  170. package/scripts/release_screen_claims.json +42 -2
  171. package/src-tauri/Cargo.lock +404 -3
  172. package/src-tauri/Cargo.toml +13 -1
  173. package/src-tauri/src/backend.rs +460 -0
  174. package/src-tauri/src/folder.rs +33 -0
  175. package/src-tauri/src/main.rs +109 -399
  176. package/src-tauri/src/topology.rs +356 -0
  177. package/src-tauri/tauri.conf.json +1 -1
  178. package/static/app/asset-manifest.json +41 -37
  179. package/static/app/assets/Act-CWnxSCgN.js +1 -0
  180. package/static/app/assets/AdminConsole-BEQYU6kF.js +1 -0
  181. package/static/app/assets/{Brain-tuhI4sOC.js → Brain-DWu1BhFg.js} +2 -2
  182. package/static/app/assets/BrainHome-95Hilr9R.js +2 -0
  183. package/static/app/assets/BrainSignals-QdeqCpAF.js +1 -0
  184. package/static/app/assets/Capture-BHpCxnzb.js +1 -0
  185. package/static/app/assets/Chronicle-B4xYKoed.js +1 -0
  186. package/static/app/assets/CommandPalette-BVXnttSz.js +1 -0
  187. package/static/app/assets/Library-DgYcHome.js +1 -0
  188. package/static/app/assets/{LivingBrain-DBwhto14.js → LivingBrain-CrJLDbf7.js} +1 -1
  189. package/static/app/assets/ProductFlow-DFlScKoJ.js +1 -0
  190. package/static/app/assets/ReviewCard-Cy5f48Pj.js +3 -0
  191. package/static/app/assets/System-NF8IfhTa.js +1 -0
  192. package/static/app/assets/arrow-left-DwkSYrjR.js +1 -0
  193. package/static/app/assets/{bot-Cia42c2h.js → bot-CucuhLhm.js} +1 -1
  194. package/static/app/assets/brain-BBnSryW_.js +1 -0
  195. package/static/app/assets/{button-2j2Ijzgq.js → button-C2GUj2Ai.js} +1 -1
  196. package/static/app/assets/circle-check-CxOVPwYq.js +1 -0
  197. package/static/app/assets/{circle-pause-BEFeWpVW.js → circle-pause-CbkWzBmG.js} +1 -1
  198. package/static/app/assets/{circle-play-ujXMcHxl.js → circle-play-7lEaqHdJ.js} +1 -1
  199. package/static/app/assets/{cpu-k4awryFq.js → cpu-DAlCXlIy.js} +1 -1
  200. package/static/app/assets/{download-DFbLJ_ig.js → download-RNhuuJwh.js} +1 -1
  201. package/static/app/assets/{folder-open-7y_b6xkM.js → folder-open-CLW4odzM.js} +1 -1
  202. package/static/app/assets/{hard-drive-Bidh02Kr.js → hard-drive-NKEiDIAJ.js} +1 -1
  203. package/static/app/assets/{index-DwDl9-8Y.css → index-BLPb5lmE.css} +1 -1
  204. package/static/app/assets/index-DMurvUuR.js +10 -0
  205. package/static/app/assets/input-D2UhPC1X.js +1 -0
  206. package/static/app/assets/link-2-6amKbP_P.js +1 -0
  207. package/static/app/assets/{permissionCopy-Bpb83Hx9.js → permissionCopy-Cu9TZtdR.js} +1 -1
  208. package/static/app/assets/primitives-gPsccucr.js +1 -0
  209. package/static/app/assets/search-Cj_TKk_2.js +1 -0
  210. package/static/app/assets/{share-2-BH1M-WNi.js → share-2-Bau7KkPq.js} +1 -1
  211. package/static/app/assets/{shield-alert-BlKdBXcG.js → shield-alert-BufNYypi.js} +1 -1
  212. package/static/app/assets/{textarea-CCWbUfFB.js → textarea-BQnVWhYs.js} +1 -1
  213. package/static/app/assets/{useFocusTrap-YdHQ7pJ1.js → useFocusTrap-B3_w60si.js} +1 -1
  214. package/static/app/assets/useMutation-BHhCflT6.js +1 -0
  215. package/static/app/assets/{useQuery-CXQiwbVT.js → useQuery-rBWfI-5t.js} +1 -1
  216. package/static/app/assets/utils-V_5-wxr5.js +4 -0
  217. package/static/app/assets/workspace-K1zjYUHj.js +1 -0
  218. package/static/app/index.html +4 -4
  219. package/static/sw.js +1 -1
  220. package/lattice_brain/graph/_kg_common.py +0 -1331
  221. package/lattice_brain/graph/discovery_index.py +0 -1141
  222. package/lattice_brain/graph/retrieval.py +0 -1120
  223. package/lattice_brain/graph/retrieval_vector.py +0 -1293
  224. package/lattice_brain/ingestion.py +0 -1525
  225. package/lattice_brain/multimodal.py +0 -1258
  226. package/latticeai/core/agent.py +0 -1465
  227. package/latticeai/core/embedding_providers.py +0 -1196
  228. package/latticeai/core/file_generation.py +0 -1047
  229. package/latticeai/integrations/telegram_bot.py +0 -1390
  230. package/latticeai/models/router.py +0 -1007
  231. package/latticeai/runtime/build_phases.py +0 -1450
  232. package/latticeai/services/brain_intelligence.py +0 -1083
  233. package/latticeai/services/memory_service.py +0 -1177
  234. package/latticeai/services/model_runtime.py +0 -1281
  235. package/latticeai/setup/wizard.py +0 -1310
  236. package/static/app/assets/Act-AWf0SAKp.js +0 -1
  237. package/static/app/assets/AdminConsole-D0u8Tiyj.js +0 -1
  238. package/static/app/assets/BrainHome-Ts7G_Ila.js +0 -2
  239. package/static/app/assets/BrainSignals-jMYgQ2Ar.js +0 -1
  240. package/static/app/assets/Capture-CqOSzyPr.js +0 -1
  241. package/static/app/assets/CommandPalette-DC0Bzh-I.js +0 -1
  242. package/static/app/assets/Library-CX-bbhmK.js +0 -1
  243. package/static/app/assets/ProductFlow-BHA2cfKI.js +0 -1
  244. package/static/app/assets/ReviewCard-BUhCKRNM.js +0 -3
  245. package/static/app/assets/System-Bu2t5hn1.js +0 -1
  246. package/static/app/assets/arrow-left-Dzwa5zRb.js +0 -1
  247. package/static/app/assets/brain-DJMoqrwx.js +0 -1
  248. package/static/app/assets/index-BpYkzcVm.js +0 -10
  249. package/static/app/assets/input-DSlJJxRs.js +0 -1
  250. package/static/app/assets/primitives-BCx6TvfG.js +0 -1
  251. package/static/app/assets/search-Cgy8cCFJ.js +0 -1
  252. package/static/app/assets/utils-zqPZJxdx.js +0 -4
  253. package/static/app/assets/workspace-DXTihhfU.js +0 -1
@@ -0,0 +1,421 @@
1
+ """Phases 9-10: platform features and the interaction routers.
2
+
3
+ The tail of the build order — everything that mounts routers on the finished
4
+ application. Split out of the single ``build_phases`` module in v11.3.0.
5
+
6
+ Every heavy import lives *inside* a phase, never at module scope.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from latticeai.runtime.runtime_context import RuntimeContext
12
+
13
+
14
+ # ── phase 7: platform features ───────────────────────────────────────────────
15
+ def phase_platform_features(ctx: RuntimeContext) -> None:
16
+ """Workspace platform, automation, review queue, command centre, proposals."""
17
+ ctx.enter("platform_features")
18
+
19
+ from latticeai.api.agents import create_agents_router
20
+ from latticeai.api.automation_intelligence import (
21
+ create_automation_intelligence_router,
22
+ )
23
+ from latticeai.api.change_proposals import create_change_proposals_router
24
+ from latticeai.api.chronicle import create_chronicle_router
25
+ from latticeai.api.command_center import create_command_center_router
26
+ from latticeai.api.evidence_actions import create_evidence_actions_router
27
+ from latticeai.api.funnel_metrics import create_funnel_metrics_router
28
+ from latticeai.api.index_jobs import create_index_jobs_router
29
+ from latticeai.api.marketplace import create_marketplace_router
30
+ from latticeai.api.plugins import create_plugins_router
31
+ from latticeai.api.project_sessions import create_project_sessions_router
32
+ from latticeai.api.realtime import create_realtime_router
33
+ from latticeai.api.voice_capture import create_voice_capture_router
34
+ from latticeai.api.workflow_designer import create_workflow_designer_router
35
+ from latticeai.api.workspace import _workspace_scope_from_request
36
+ from latticeai.core.project_sessions import ProjectSessionStore
37
+ from latticeai.runtime.hooks_runtime import (
38
+ bind_builtin_hook_runners,
39
+ bind_trigger_hook_runner,
40
+ )
41
+ from latticeai.runtime.platform_runtime_wiring import (
42
+ build_platform_automation_runtime,
43
+ )
44
+ from latticeai.runtime.router_registration import (
45
+ register_platform_feature_routers,
46
+ )
47
+ from latticeai.services.change_proposals import ChangeProposalService
48
+ from latticeai.services.chronicle import ChronicleService
49
+ from latticeai.services.command_center import CommandCenterService
50
+ from latticeai.services.evidence_actions import EvidenceActionService
51
+ from latticeai.services.tool_dispatch import get_tool_permission
52
+ from latticeai.services.voice_capture import VoiceCaptureService
53
+ from latticeai.tools import resolve_workspace_path
54
+
55
+ # v2 Agentic Workspace Platform: cross-system wiring.
56
+ platform_automation_runtime = build_platform_automation_runtime(
57
+ model_router=ctx.model_router,
58
+ workspace_store=ctx.WORKSPACE_OS,
59
+ workspace_service=ctx.WORKSPACE_SERVICE,
60
+ plugin_registry=ctx.PLUGIN_REGISTRY,
61
+ get_current_user=ctx.get_current_user,
62
+ workspace_graph=ctx._workspace_graph,
63
+ workspace_scope_from_request=_workspace_scope_from_request,
64
+ get_tool_permission=get_tool_permission,
65
+ hooks=ctx.HOOKS_REGISTRY,
66
+ agent_registry=ctx.AGENT_REGISTRY,
67
+ data_dir=ctx.DATA_DIR,
68
+ append_audit_event=ctx.append_audit_event,
69
+ memory_service=ctx.MEMORY_SERVICE,
70
+ tz_name=getattr(ctx.CONFIG, "timezone", None),
71
+ )
72
+ ctx.adopt(
73
+ platform_automation_runtime,
74
+ "_llm_generate_sync",
75
+ "PLATFORM",
76
+ "_automation_runtime",
77
+ "REVIEW_QUEUE",
78
+ "TRIGGER_SERVICE",
79
+ "AGENT_RUNTIME",
80
+ "RUN_EXECUTOR",
81
+ )
82
+ bind_trigger_hook_runner(
83
+ registry=ctx.HOOKS_REGISTRY, trigger_service=ctx.TRIGGER_SERVICE
84
+ )
85
+ ctx.app.state.run_executor = ctx.RUN_EXECUTOR
86
+ ctx.app.state.run_reconciliation = ctx.RUN_EXECUTOR.reconcile_startup()
87
+ ctx.TRIGGER_SERVICE.start()
88
+
89
+ bind_builtin_hook_runners(
90
+ registry=ctx.HOOKS_REGISTRY,
91
+ append_audit_event=ctx.append_audit_event,
92
+ get_tool_permission=get_tool_permission,
93
+ classify_sensitive_message=ctx.classify_sensitive_message,
94
+ )
95
+
96
+ register_platform_feature_routers(
97
+ ctx.app,
98
+ create_plugins_router=create_plugins_router,
99
+ plugin_registry=ctx.PLUGIN_REGISTRY,
100
+ require_user=ctx.require_user,
101
+ require_admin=ctx.require_admin,
102
+ append_audit_event=ctx.append_audit_event,
103
+ platform=ctx.PLATFORM,
104
+ ui_file_response=ctx.ui_file_response,
105
+ static_dir=ctx.STATIC_DIR,
106
+ create_workflow_designer_router=create_workflow_designer_router,
107
+ store=ctx.WORKSPACE_OS,
108
+ get_current_user=ctx.get_current_user,
109
+ workspace_graph=ctx._workspace_graph,
110
+ hooks=ctx.HOOKS_REGISTRY,
111
+ run_executor=ctx.RUN_EXECUTOR,
112
+ trigger_service=ctx.TRIGGER_SERVICE,
113
+ create_agents_router=create_agents_router,
114
+ agent_runtime=ctx.AGENT_RUNTIME,
115
+ create_marketplace_router=create_marketplace_router,
116
+ template_catalog=ctx.TEMPLATE_CATALOG,
117
+ create_realtime_router=create_realtime_router,
118
+ realtime_bus=ctx.REALTIME_BUS,
119
+ )
120
+
121
+ ctx.app.include_router(
122
+ create_automation_intelligence_router(
123
+ service=ctx.AUTOMATION_INTELLIGENCE,
124
+ store=ctx.WORKSPACE_OS,
125
+ require_user=ctx.require_user,
126
+ gate_read=ctx.PLATFORM.gate_read,
127
+ gate_write=ctx.PLATFORM.gate_write,
128
+ append_audit_event=ctx.append_audit_event,
129
+ workspace_graph=ctx._workspace_graph,
130
+ run_executor=ctx.RUN_EXECUTOR,
131
+ review_queue=ctx.REVIEW_QUEUE,
132
+ )
133
+ )
134
+ # UX funnel metrics (backlog #16): admin-only runtime counters.
135
+ ctx.app.include_router(
136
+ create_funnel_metrics_router(
137
+ service=ctx.FUNNEL_METRICS,
138
+ require_admin=ctx.require_admin,
139
+ )
140
+ )
141
+
142
+ ctx.set(
143
+ COMMAND_CENTER=CommandCenterService(
144
+ conversation_store=ctx.CONVERSATIONS,
145
+ knowledge_graph=ctx.KNOWLEDGE_GRAPH,
146
+ store=ctx.WORKSPACE_OS,
147
+ search_service=ctx.SEARCH_SERVICE,
148
+ brain_intelligence=ctx.BRAIN_INTELLIGENCE,
149
+ automation_intelligence=ctx.AUTOMATION_INTELLIGENCE,
150
+ review_queue=ctx.REVIEW_QUEUE,
151
+ enable_graph=ctx.ENABLE_GRAPH,
152
+ )
153
+ )
154
+ ctx.app.include_router(
155
+ create_command_center_router(
156
+ service=ctx.COMMAND_CENTER,
157
+ require_user=ctx.require_user,
158
+ gate_read=ctx.PLATFORM.gate_read,
159
+ )
160
+ )
161
+
162
+ # Brain Chronicle (v11.3.0): the bitemporal columns v11.1.0 started
163
+ # writing, read back as a timeline. Pure reads over the Brain's own
164
+ # storage — no schema of its own, nothing to write, nothing to migrate.
165
+ ctx.set(
166
+ CHRONICLE=ChronicleService(
167
+ knowledge_graph=ctx.KNOWLEDGE_GRAPH,
168
+ conversations=ctx.CONVERSATIONS,
169
+ enable_graph=ctx.ENABLE_GRAPH,
170
+ )
171
+ )
172
+ ctx.app.include_router(
173
+ create_chronicle_router(
174
+ service=ctx.CHRONICLE,
175
+ require_user=ctx.require_user,
176
+ gate_read=ctx.PLATFORM.gate_read,
177
+ )
178
+ )
179
+
180
+ # Index jobs (v11.5.0): the embed backlog has been durable since 11.1.0 and
181
+ # had no trigger — the only drain was a pipeline method no scheduler could
182
+ # reach. This is the HTTP surface lattice-jobs ticks.
183
+ ctx.app.include_router(
184
+ create_index_jobs_router(
185
+ pipeline=ctx.INGESTION_PIPELINE if ctx.ENABLE_GRAPH else None,
186
+ knowledge_graph=ctx.KNOWLEDGE_GRAPH if ctx.ENABLE_GRAPH else None,
187
+ require_user=ctx.require_user,
188
+ gate_read=ctx.PLATFORM.gate_read,
189
+ gate_write=ctx.PLATFORM.gate_write,
190
+ )
191
+ )
192
+
193
+ ctx.set(
194
+ CHANGE_PROPOSALS=ChangeProposalService(
195
+ review_queue=ctx.REVIEW_QUEUE,
196
+ resolve_path=resolve_workspace_path,
197
+ audit=ctx.append_audit_event,
198
+ )
199
+ )
200
+ # Proposal-first mutations: the agent loop consults the governor so
201
+ # additive creates run with minimal friction while changes and deletions
202
+ # of existing files are staged for review instead of applied.
203
+ ctx.CHAT_AGENT_RUNTIME.deps.change_governor = ctx.CHANGE_PROPOSALS
204
+ ctx.app.include_router(
205
+ create_change_proposals_router(
206
+ service=ctx.CHANGE_PROPOSALS,
207
+ require_user=ctx.require_user,
208
+ gate_read=ctx.PLATFORM.gate_read,
209
+ gate_write=ctx.PLATFORM.gate_write,
210
+ )
211
+ )
212
+
213
+ # Evidence → action (v9.9.6): an answer's citations become ready-to-send,
214
+ # evidence-scoped follow-ups. Deterministic composition only — execution
215
+ # stays on the chat/file-generation path.
216
+ ctx.set(
217
+ EVIDENCE_ACTIONS_SERVICE=EvidenceActionService(
218
+ node_reader=getattr(ctx.KNOWLEDGE_GRAPH, "get_node", None)
219
+ )
220
+ )
221
+ ctx.app.include_router(
222
+ create_evidence_actions_router(
223
+ service=ctx.EVIDENCE_ACTIONS_SERVICE,
224
+ require_user=ctx.require_user,
225
+ allowed_workspaces_for=ctx._allowed_workspaces_for,
226
+ )
227
+ )
228
+
229
+ # Voice memo capture (v9.9.7): the shortest path from a thought to the
230
+ # Brain. Transcription is an optional local port — absent, the memo is
231
+ # still stored and the response says it is not searchable. v11.1.0 shares
232
+ # that one port with multi-modal ingestion, so a memo and a scanned
233
+ # recording can never disagree about whether this machine can hear.
234
+ ctx.set(
235
+ VOICE_CAPTURE=VoiceCaptureService(
236
+ pipeline=ctx.INGESTION_PIPELINE if ctx.ENABLE_GRAPH else None,
237
+ transcriber=ctx.MULTIMODAL_PORTS.transcriber,
238
+ )
239
+ )
240
+ ctx.app.include_router(
241
+ create_voice_capture_router(
242
+ service=ctx.VOICE_CAPTURE,
243
+ require_user=ctx.require_user,
244
+ gate_write=ctx.PLATFORM.gate_write,
245
+ append_audit_event=ctx.append_audit_event,
246
+ )
247
+ )
248
+
249
+ # Multi-turn project loop (v9.9.6): work spanning several runs keeps its
250
+ # files, open TODOs, and last honest verification in one project session.
251
+ ctx.set(PROJECT_SESSIONS=ProjectSessionStore(ctx.DATA_DIR / "project_sessions"))
252
+ ctx.app.include_router(
253
+ create_project_sessions_router(
254
+ store=ctx.PROJECT_SESSIONS,
255
+ require_user=ctx.require_user,
256
+ gate_read=ctx.PLATFORM.gate_read,
257
+ gate_write=ctx.PLATFORM.gate_write,
258
+ )
259
+ )
260
+
261
+
262
+ # ── phase 8: interaction routers ─────────────────────────────────────────────
263
+ def phase_interaction(ctx: RuntimeContext) -> None:
264
+ """Model, chat, search, tools, hooks, memory and brain tail routers."""
265
+ ctx.enter("interaction")
266
+
267
+ from fastapi import HTTPException
268
+
269
+ from latticeai.api.agent_registry import create_agent_registry_router
270
+ from latticeai.api.brain_intelligence import create_brain_intelligence_router
271
+ from latticeai.api.browser import create_browser_router
272
+ from latticeai.api.chat import create_chat_router
273
+ from latticeai.api.garden import create_garden_router
274
+ from latticeai.api.health import create_health_router
275
+ from latticeai.api.hooks import create_hooks_router
276
+ from latticeai.api.memory import create_memory_router
277
+ from latticeai.api.models import create_models_router
278
+ from latticeai.api.network import create_network_router
279
+ from latticeai.api.portability import create_portability_router
280
+ from latticeai.api.review_queue import create_review_queue_router
281
+ from latticeai.api.search import create_search_router
282
+ from latticeai.api.setup import create_setup_router
283
+ from latticeai.api.tools import create_tools_router
284
+ from latticeai.core.model_compat import (
285
+ list_cached_profiles as _list_compat_profiles,
286
+ )
287
+ from latticeai.runtime.chat_wiring import build_interaction_contexts
288
+ from latticeai.runtime.model_wiring import register_model_runtime_routers
289
+ from latticeai.runtime.platform_services_runtime import build_brain_network
290
+ from latticeai.runtime.review_wiring import build_review_run_now_runner
291
+ from latticeai.runtime.router_registration import (
292
+ register_health_and_model_routers,
293
+ register_interaction_routers,
294
+ register_review_and_brain_tail_routers,
295
+ )
296
+ from latticeai.services.model_runtime import (
297
+ CLOUD_VERIFY_TTL_SECONDS,
298
+ ENGINE_MODEL_CATALOG,
299
+ MODEL_ENGINE_ALIASES,
300
+ download_hf_model,
301
+ ensure_ollama_server,
302
+ filter_lower_family_versions,
303
+ local_binary,
304
+ normalize_local_model_request,
305
+ sse_event,
306
+ )
307
+
308
+ service = ctx.model_runtime_service
309
+ ctx.set(
310
+ model_runtime=register_model_runtime_routers(
311
+ app=ctx.app,
312
+ create_health_router=create_health_router,
313
+ create_models_router=create_models_router,
314
+ register_health_and_model_routers=register_health_and_model_routers,
315
+ model_router=ctx.model_router,
316
+ runtime_service=service,
317
+ runtime_features=service.runtime_features,
318
+ is_public_mode=ctx.IS_PUBLIC_MODE,
319
+ engine_status=service.engine_status,
320
+ get_current_user=ctx.get_current_user,
321
+ require_auth=ctx.REQUIRE_AUTH,
322
+ app_version=ctx.APP_VERSION,
323
+ app_mode=ctx.APP_MODE,
324
+ require_user=ctx.require_user,
325
+ require_admin=ctx.require_admin,
326
+ load_users=ctx.load_users,
327
+ get_user_role=ctx.get_user_role,
328
+ install_engine=service.install_engine,
329
+ verify_cloud_models=service.verify_cloud_models,
330
+ normalize_local_model_request=normalize_local_model_request,
331
+ download_hf_model=download_hf_model,
332
+ prepare_and_load_model=service.prepare_and_load_model,
333
+ prepare_and_load_model_stream=service.prepare_and_load_model_stream,
334
+ sse_event=sse_event,
335
+ ensure_ollama_server=ensure_ollama_server,
336
+ local_binary=local_binary,
337
+ filter_lower_family_versions=filter_lower_family_versions,
338
+ list_compat_profiles=_list_compat_profiles,
339
+ set_user_api_key=ctx.set_user_api_key,
340
+ engine_model_catalog=ENGINE_MODEL_CATALOG,
341
+ model_engine_aliases=MODEL_ENGINE_ALIASES,
342
+ cloud_verify_ttl_seconds=CLOUD_VERIFY_TTL_SECONDS,
343
+ allow_local_models=ctx.ALLOW_LOCAL_MODELS,
344
+ )
345
+ )
346
+
347
+ _tool_router_context, interaction_router_context = build_interaction_contexts(
348
+ config=ctx.CONFIG,
349
+ ingestion_pipeline=ctx.INGESTION_PIPELINE,
350
+ data_dir=ctx.DATA_DIR,
351
+ static_dir=ctx.STATIC_DIR,
352
+ model_router=ctx.model_router,
353
+ require_user=ctx.require_user,
354
+ require_admin=ctx.require_admin,
355
+ get_current_user=ctx.get_current_user,
356
+ clear_history=ctx.clear_history,
357
+ append_audit_event=ctx.append_audit_event,
358
+ enforce_rate_limit=ctx.enforce_rate_limit,
359
+ bytes_match_extension=ctx._bytes_match_extension,
360
+ classify_sensitive_message=ctx.classify_sensitive_message,
361
+ save_to_history=ctx.save_to_history,
362
+ enable_graph=ctx.ENABLE_GRAPH,
363
+ knowledge_graph=ctx.KNOWLEDGE_GRAPH,
364
+ require_graph=ctx._require_graph,
365
+ local_kg_watcher=ctx.LOCAL_KG_WATCHER,
366
+ load_mcp_installs=ctx.load_mcp_installs,
367
+ recommend_mcps=ctx.recommend_mcps,
368
+ install_mcp=ctx.install_mcp,
369
+ mcp_public_item=ctx.mcp_public_item,
370
+ hooks=ctx.HOOKS_REGISTRY,
371
+ workspace_service=ctx.WORKSPACE_SERVICE,
372
+ chat_context=ctx.app_context,
373
+ search_service=ctx.SEARCH_SERVICE,
374
+ allowed_workspaces_for=ctx._allowed_workspaces_for,
375
+ embedding_info=ctx._embedding_info,
376
+ agent_registry=ctx.AGENT_REGISTRY,
377
+ memory_service=ctx.MEMORY_SERVICE,
378
+ platform=ctx.PLATFORM,
379
+ active_model_getter=lambda: ctx.model_router.current_model_id or "",
380
+ brain_intelligence=ctx.BRAIN_INTELLIGENCE,
381
+ )
382
+ register_interaction_routers(
383
+ ctx.app,
384
+ interaction_context=interaction_router_context,
385
+ create_chat_router=create_chat_router,
386
+ create_search_router=create_search_router,
387
+ create_tools_router=create_tools_router,
388
+ create_hooks_router=create_hooks_router,
389
+ create_agent_registry_router=create_agent_registry_router,
390
+ create_memory_router=create_memory_router,
391
+ create_brain_intelligence_router=create_brain_intelligence_router,
392
+ )
393
+
394
+ register_review_and_brain_tail_routers(
395
+ ctx.app,
396
+ create_review_queue_router=create_review_queue_router,
397
+ review_queue=ctx.REVIEW_QUEUE,
398
+ require_user=ctx.require_user,
399
+ gate_read=ctx.PLATFORM.gate_read,
400
+ gate_write=ctx.PLATFORM.gate_write,
401
+ run_review_item=build_review_run_now_runner(ctx.PLATFORM, HTTPException),
402
+ append_audit_event=ctx.append_audit_event,
403
+ # Approving a change_proposal from the Review Center applies the
404
+ # staged content through the same service the agent governor uses.
405
+ change_proposals=ctx.CHANGE_PROPOSALS,
406
+ create_browser_router=create_browser_router,
407
+ ingestion_pipeline=ctx.INGESTION_PIPELINE,
408
+ workspace_service=ctx.WORKSPACE_SERVICE,
409
+ create_portability_router=create_portability_router,
410
+ kg_portability=ctx.KG_PORTABILITY,
411
+ require_admin=ctx.require_admin,
412
+ build_brain_network=build_brain_network,
413
+ device_identity=ctx.DEVICE_IDENTITY,
414
+ data_dir=ctx.DATA_DIR,
415
+ create_network_router=create_network_router,
416
+ create_garden_router=create_garden_router,
417
+ gardener=ctx.gardener,
418
+ create_setup_router=create_setup_router,
419
+ model_router=ctx.model_router,
420
+ knowledge_graph=ctx.KNOWLEDGE_GRAPH,
421
+ )