ltcai 11.5.2 → 11.7.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 (443) hide show
  1. package/README.md +93 -148
  2. package/bin/ltcai.js +234 -24
  3. package/docs/CHANGELOG.md +119 -0
  4. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  5. package/docs/DEVELOPMENT.md +8 -6
  6. package/docs/ENTERPRISE.md +2 -1
  7. package/docs/MULTI_AGENT_RUNTIME.md +12 -5
  8. package/docs/ONBOARDING.md +1 -1
  9. package/docs/OPERATIONS.md +6 -3
  10. package/docs/REALTIME_COLLABORATION.md +1 -1
  11. package/docs/TRUST_MODEL.md +1 -1
  12. package/docs/WHY_LATTICE.md +1 -1
  13. package/docs/WORKFLOW_DESIGNER.md +3 -2
  14. package/docs/kg-schema.md +1 -1
  15. package/docs/v11.6.0_ONE_DOOR_PLAN.md +170 -0
  16. package/lattice_brain/__init__.py +42 -79
  17. package/lattice_brain/graph/__init__.py +9 -24
  18. package/lattice_brain/graph/_kg_common/__init__.py +13 -24
  19. package/lattice_brain/ingestion/__init__.py +19 -58
  20. package/lattice_brain/ingestion/pipeline.py +20 -398
  21. package/lattice_brain/multimodal/__init__.py +7 -18
  22. package/lattice_brain/multimodal/images.py +6 -264
  23. package/lattice_brain/multimodal/video.py +8 -247
  24. package/lattice_brain/runtime/__init__.py +8 -79
  25. package/lattice_brain/runtime/hooks.py +22 -584
  26. package/latticeai/__init__.py +1 -1
  27. package/latticeai/api/agent_worker_seam.py +7 -80
  28. package/latticeai/api/health.py +6 -20
  29. package/latticeai/api/local_files.py +16 -613
  30. package/latticeai/api/models.py +12 -87
  31. package/latticeai/api/search.py +17 -255
  32. package/latticeai/api/tools.py +69 -750
  33. package/latticeai/api/voice_capture.py +8 -70
  34. package/latticeai/api/worker_compute.py +842 -0
  35. package/latticeai/api/worker_seams.py +216 -0
  36. package/latticeai/app_factory.py +23 -232
  37. package/latticeai/cli/entrypoint.py +36 -249
  38. package/latticeai/core/agent_permission.py +16 -91
  39. package/latticeai/core/messages.py +89 -531
  40. package/latticeai/runtime/access_runtime.py +0 -14
  41. package/latticeai/runtime/bootstrap.py +10 -21
  42. package/latticeai/runtime/brain_runtime.py +35 -43
  43. package/latticeai/runtime/build_phases/__init__.py +21 -37
  44. package/latticeai/runtime/build_phases/features.py +99 -389
  45. package/latticeai/runtime/build_phases/foundation.py +82 -392
  46. package/latticeai/runtime/build_phases/web.py +91 -408
  47. package/latticeai/runtime/build_phases/worker_profile.py +244 -0
  48. package/latticeai/runtime/lifespan_runtime.py +7 -16
  49. package/latticeai/runtime/platform_services_runtime.py +1 -15
  50. package/latticeai/runtime/runtime_context.py +13 -130
  51. package/latticeai/runtime/security_runtime.py +10 -103
  52. package/latticeai/services/architecture_readiness.py +82 -43
  53. package/latticeai/services/model_runtime/__init__.py +2 -11
  54. package/latticeai/services/model_runtime/service.py +4 -28
  55. package/latticeai/services/p_reinforce.py +10 -261
  56. package/latticeai/services/product_readiness.py +31 -38
  57. package/latticeai/services/search_service.py +37 -795
  58. package/latticeai/services/tool_dispatch.py +30 -386
  59. package/latticeai/services/voice_capture.py +13 -107
  60. package/latticeai/tools/__init__.py +22 -49
  61. package/latticeai/tools/commands.py +0 -163
  62. package/latticeai/tools/computer.py +0 -39
  63. package/latticeai/tools/documents.py +1 -134
  64. package/latticeai/tools/filesystem.py +1 -247
  65. package/latticeai/tools/knowledge.py +1 -52
  66. package/latticeai/tools/local_files.py +0 -20
  67. package/latticeai/worker_app.py +75 -0
  68. package/package.json +2 -3
  69. package/requirements.txt +0 -5
  70. package/scripts/agent_eval.py +16 -28
  71. package/scripts/brain_quality_eval.py +20 -183
  72. package/scripts/bump_version.py +5 -5
  73. package/scripts/check_current_release_docs.mjs +7 -4
  74. package/scripts/check_openapi_drift.mjs +10 -0
  75. package/scripts/check_server_i18n.mjs +2 -18
  76. package/scripts/compose_openapi.py +377 -0
  77. package/scripts/export_openapi.py +32 -4
  78. package/scripts/gen_messages_catalog_fixture.py +302 -0
  79. package/scripts/gen_openapi_fragments.py +365 -0
  80. package/scripts/gen_redact_fixture.py +196 -0
  81. package/scripts/gen_worker_allowlist_fixture.py +115 -0
  82. package/scripts/generate_agent_parity_fixtures.py +33 -14
  83. package/scripts/openapi_route_families.json +2161 -0
  84. package/scripts/release_screen_claims.json +54 -0
  85. package/scripts/run_integration_tests.mjs +134 -29
  86. package/scripts/run_sidecar_e2e.mjs +104 -11
  87. package/scripts/wheel_smoke.py +32 -22
  88. package/src-tauri/Cargo.lock +375 -9
  89. package/src-tauri/Cargo.toml +1 -1
  90. package/src-tauri/src/backend.rs +151 -45
  91. package/src-tauri/src/main.rs +18 -18
  92. package/src-tauri/src/topology.rs +58 -88
  93. package/src-tauri/tauri.conf.json +1 -2
  94. package/static/app/asset-manifest.json +41 -41
  95. package/static/app/assets/{Act-DcQizkl1.js → Act-BPcVAbOL.js} +1 -1
  96. package/static/app/assets/AdminConsole-Bw1ATQL0.js +1 -0
  97. package/static/app/assets/{Brain-3VCSHFcn.js → Brain-CT92Kos0.js} +2 -2
  98. package/static/app/assets/{BrainHome-Qm8eaztx.js → BrainHome-CFBkt1K_.js} +1 -1
  99. package/static/app/assets/{BrainSignals-DS9BtKOW.js → BrainSignals-ReLWF2H8.js} +1 -1
  100. package/static/app/assets/Capture-BsTokYkk.js +1 -0
  101. package/static/app/assets/{Chronicle-BGvuAchH.js → Chronicle-B6f0T9id.js} +1 -1
  102. package/static/app/assets/{CommandPalette-Bqhm0Urn.js → CommandPalette-CuvjTv1u.js} +1 -1
  103. package/static/app/assets/{Library-BV6NnF0a.js → Library-BGJbG9Hd.js} +1 -1
  104. package/static/app/assets/{LivingBrain-GzenJchP.js → LivingBrain-DGYK_Jsa.js} +1 -1
  105. package/static/app/assets/{ProductFlow-DEP6-vML.js → ProductFlow-DXBC6brE.js} +1 -1
  106. package/static/app/assets/{ReviewCard-CNZ7XjWG.js → ReviewCard-HXRle3qq.js} +2 -2
  107. package/static/app/assets/System-CMHSO9qM.js +1 -0
  108. package/static/app/assets/arrow-left-BfmkskWx.js +1 -0
  109. package/static/app/assets/{bot-B_K1Tdmw.js → bot-Cn8bWRuq.js} +1 -1
  110. package/static/app/assets/{brain-DWyaV1L1.js → brain-CQJberbE.js} +1 -1
  111. package/static/app/assets/{button-aTn4s84A.js → button-Ct9f2_oT.js} +1 -1
  112. package/static/app/assets/circle-check-DruOxB-4.js +1 -0
  113. package/static/app/assets/{circle-pause-xKgeGXkT.js → circle-pause-CmzC_apg.js} +1 -1
  114. package/static/app/assets/{circle-play-DkT6tYPX.js → circle-play-D8mW2aQ7.js} +1 -1
  115. package/static/app/assets/{cpu-85xYObUC.js → cpu-DZcdd0PZ.js} +1 -1
  116. package/static/app/assets/{download-B5Fm7YXo.js → download-bv1KEPGQ.js} +1 -1
  117. package/static/app/assets/{folder-open-kk2Xa52u.js → folder-open-d-Pip5gr.js} +1 -1
  118. package/static/app/assets/{hard-drive-DkA3zBW_.js → hard-drive-D20iavUb.js} +1 -1
  119. package/static/app/assets/index-D9x-kSNy.css +2 -0
  120. package/static/app/assets/{index-BMPdTmlY.js → index-Do83hDzJ.js} +3 -3
  121. package/static/app/assets/{input-B0nRf2jO.js → input-BLXVNmj1.js} +1 -1
  122. package/static/app/assets/{link-2-Dwb4gnTc.js → link-2-BPJOFlAy.js} +1 -1
  123. package/static/app/assets/{permissionCopy-CQDUBrOZ.js → permissionCopy-ChdJd493.js} +1 -1
  124. package/static/app/assets/primitives-Cv5tbZBY.js +1 -0
  125. package/static/app/assets/search-CT9aho2j.js +1 -0
  126. package/static/app/assets/{share-2-BsrxFglO.js → share-2-YNX_NtMU.js} +1 -1
  127. package/static/app/assets/{shield-alert-5BStfp2_.js → shield-alert-DuQ3zrVL.js} +1 -1
  128. package/static/app/assets/{textarea-Cg8IUA-k.js → textarea-DqwLnli4.js} +1 -1
  129. package/static/app/assets/{useFocusTrap-CYKvE46M.js → useFocusTrap-ZVI98jaW.js} +1 -1
  130. package/static/app/assets/{useMutation-CSn9t1op.js → useMutation-CVC4qv_D.js} +1 -1
  131. package/static/app/assets/{useQuery-CY2OI2uy.js → useQuery-C7BeG4HU.js} +1 -1
  132. package/static/app/assets/{utils-Ddol2RWD.js → utils-CiFtIdZq.js} +1 -1
  133. package/static/app/assets/{workspace-BqDwOz_p.js → workspace-DQz9vIId.js} +1 -1
  134. package/static/app/index.html +4 -4
  135. package/static/sw.js +1 -1
  136. package/lattice_brain/archive.py +0 -522
  137. package/lattice_brain/context.py +0 -325
  138. package/lattice_brain/conversations.py +0 -382
  139. package/lattice_brain/core.py +0 -82
  140. package/lattice_brain/graph/_kg_contract.py +0 -249
  141. package/lattice_brain/graph/curator.py +0 -676
  142. package/lattice_brain/graph/discovery.py +0 -595
  143. package/lattice_brain/graph/discovery_index/__init__.py +0 -35
  144. package/lattice_brain/graph/discovery_index/cleanup.py +0 -182
  145. package/lattice_brain/graph/discovery_index/extract.py +0 -137
  146. package/lattice_brain/graph/discovery_index/scan.py +0 -411
  147. package/lattice_brain/graph/discovery_index/upsert.py +0 -495
  148. package/lattice_brain/graph/documents.py +0 -380
  149. package/lattice_brain/graph/fusion.py +0 -395
  150. package/lattice_brain/graph/identity.py +0 -175
  151. package/lattice_brain/graph/image_vectors.py +0 -230
  152. package/lattice_brain/graph/ingest.py +0 -829
  153. package/lattice_brain/graph/network.py +0 -205
  154. package/lattice_brain/graph/proactive.py +0 -724
  155. package/lattice_brain/graph/projection/__init__.py +0 -42
  156. package/lattice_brain/graph/projection/curation.py +0 -500
  157. package/lattice_brain/graph/projection/v2_schema.py +0 -518
  158. package/lattice_brain/graph/provenance.py +0 -524
  159. package/lattice_brain/graph/rerank.py +0 -163
  160. package/lattice_brain/graph/retrieval/__init__.py +0 -54
  161. package/lattice_brain/graph/retrieval/context.py +0 -197
  162. package/lattice_brain/graph/retrieval/graph_view.py +0 -319
  163. package/lattice_brain/graph/retrieval/hybrid.py +0 -488
  164. package/lattice_brain/graph/retrieval/maintenance.py +0 -121
  165. package/lattice_brain/graph/retrieval/signals.py +0 -95
  166. package/lattice_brain/graph/retrieval_docgen.py +0 -253
  167. package/lattice_brain/graph/retrieval_policy.py +0 -180
  168. package/lattice_brain/graph/retrieval_reads.py +0 -769
  169. package/lattice_brain/graph/retrieval_vector/__init__.py +0 -42
  170. package/lattice_brain/graph/retrieval_vector/fingerprint.py +0 -97
  171. package/lattice_brain/graph/retrieval_vector/indexing.py +0 -347
  172. package/lattice_brain/graph/retrieval_vector/search.py +0 -560
  173. package/lattice_brain/graph/retrieval_vector/status.py +0 -374
  174. package/lattice_brain/graph/schema.py +0 -792
  175. package/lattice_brain/graph/store.py +0 -268
  176. package/lattice_brain/graph/vector_index/__init__.py +0 -85
  177. package/lattice_brain/graph/vector_index/base.py +0 -167
  178. package/lattice_brain/graph/vector_index/brute_force.py +0 -110
  179. package/lattice_brain/graph/vector_index/hnsw.py +0 -290
  180. package/lattice_brain/graph/vector_index/jobs.py +0 -287
  181. package/lattice_brain/graph/vector_index/quantized.py +0 -148
  182. package/lattice_brain/graph/vector_index/selector.py +0 -161
  183. package/lattice_brain/graph/write_master.py +0 -308
  184. package/lattice_brain/ingestion/_contract.py +0 -90
  185. package/lattice_brain/ingestion/folder_scan.py +0 -57
  186. package/lattice_brain/ingestion/folders.py +0 -258
  187. package/lattice_brain/ingestion/jobs_api.py +0 -107
  188. package/lattice_brain/ingestion/routing.py +0 -295
  189. package/lattice_brain/ingestion_jobs.py +0 -380
  190. package/lattice_brain/memory.py +0 -75
  191. package/lattice_brain/portability/__init__.py +0 -90
  192. package/lattice_brain/portability/_contract.py +0 -42
  193. package/lattice_brain/portability/backups.py +0 -338
  194. package/lattice_brain/portability/bundles.py +0 -136
  195. package/lattice_brain/portability/constants.py +0 -93
  196. package/lattice_brain/portability/fsops.py +0 -138
  197. package/lattice_brain/portability/service.py +0 -41
  198. package/lattice_brain/portability/sharing.py +0 -710
  199. package/lattice_brain/quality.py +0 -543
  200. package/lattice_brain/retrieval_benchmark_fixtures.py +0 -92
  201. package/lattice_brain/runtime/agent_runtime.py +0 -859
  202. package/lattice_brain/runtime/contracts.py +0 -460
  203. package/lattice_brain/runtime/multi_agent.py +0 -942
  204. package/lattice_brain/runtime/statuses.py +0 -10
  205. package/lattice_brain/sealed_box.py +0 -240
  206. package/lattice_brain/self_model.py +0 -675
  207. package/lattice_brain/sensitivity.py +0 -94
  208. package/lattice_brain/storage/__init__.py +0 -22
  209. package/lattice_brain/storage/base.py +0 -100
  210. package/lattice_brain/storage/docker.py +0 -105
  211. package/lattice_brain/storage/factory.py +0 -31
  212. package/lattice_brain/storage/migration.py +0 -191
  213. package/lattice_brain/storage/postgres.py +0 -123
  214. package/lattice_brain/storage/sqlite.py +0 -143
  215. package/lattice_brain/synthesis.py +0 -824
  216. package/lattice_brain/workflow.py +0 -497
  217. package/latticeai/api/admin.py +0 -471
  218. package/latticeai/api/agent_registry.py +0 -105
  219. package/latticeai/api/agents.py +0 -228
  220. package/latticeai/api/auth.py +0 -383
  221. package/latticeai/api/automation_intelligence.py +0 -401
  222. package/latticeai/api/brain_intelligence.py +0 -199
  223. package/latticeai/api/browser.py +0 -493
  224. package/latticeai/api/change_proposals.py +0 -89
  225. package/latticeai/api/chat.py +0 -572
  226. package/latticeai/api/chat_agent_http.py +0 -892
  227. package/latticeai/api/chat_contracts.py +0 -73
  228. package/latticeai/api/chat_documents.py +0 -276
  229. package/latticeai/api/chat_helpers.py +0 -460
  230. package/latticeai/api/chat_history.py +0 -101
  231. package/latticeai/api/chat_hybrid.py +0 -113
  232. package/latticeai/api/chat_intents.py +0 -646
  233. package/latticeai/api/chat_stream.py +0 -216
  234. package/latticeai/api/chronicle.py +0 -63
  235. package/latticeai/api/command_center.py +0 -51
  236. package/latticeai/api/computer_use.py +0 -474
  237. package/latticeai/api/evidence_actions.py +0 -48
  238. package/latticeai/api/features.py +0 -70
  239. package/latticeai/api/funnel_metrics.py +0 -31
  240. package/latticeai/api/garden.py +0 -34
  241. package/latticeai/api/hooks.py +0 -165
  242. package/latticeai/api/index_jobs.py +0 -145
  243. package/latticeai/api/invitations.py +0 -100
  244. package/latticeai/api/knowledge_graph.py +0 -536
  245. package/latticeai/api/marketplace.py +0 -105
  246. package/latticeai/api/mcp.py +0 -482
  247. package/latticeai/api/memory.py +0 -270
  248. package/latticeai/api/network.py +0 -81
  249. package/latticeai/api/network_boundary.py +0 -225
  250. package/latticeai/api/permission_mode.py +0 -61
  251. package/latticeai/api/permissions.py +0 -436
  252. package/latticeai/api/plugins.py +0 -126
  253. package/latticeai/api/portability.py +0 -391
  254. package/latticeai/api/project_sessions.py +0 -114
  255. package/latticeai/api/realtime.py +0 -118
  256. package/latticeai/api/review_queue.py +0 -364
  257. package/latticeai/api/security_dashboard.py +0 -604
  258. package/latticeai/api/setup.py +0 -319
  259. package/latticeai/api/static_routes.py +0 -354
  260. package/latticeai/api/ui_redirects.py +0 -26
  261. package/latticeai/api/workflow_designer.py +0 -394
  262. package/latticeai/api/workspace.py +0 -856
  263. package/latticeai/api/workspace_scope.py +0 -125
  264. package/latticeai/core/agent/__init__.py +0 -93
  265. package/latticeai/core/agent/_contract.py +0 -79
  266. package/latticeai/core/agent/context.py +0 -57
  267. package/latticeai/core/agent/deps.py +0 -125
  268. package/latticeai/core/agent/execution.py +0 -622
  269. package/latticeai/core/agent/planning.py +0 -145
  270. package/latticeai/core/agent/recovery.py +0 -157
  271. package/latticeai/core/agent/runtime.py +0 -210
  272. package/latticeai/core/agent/verification.py +0 -231
  273. package/latticeai/core/agent_eval.py +0 -739
  274. package/latticeai/core/agent_helpers.py +0 -493
  275. package/latticeai/core/agent_profiles.py +0 -110
  276. package/latticeai/core/agent_prompts.py +0 -171
  277. package/latticeai/core/agent_registry.py +0 -232
  278. package/latticeai/core/agent_state.py +0 -41
  279. package/latticeai/core/agent_trace.py +0 -104
  280. package/latticeai/core/artifact_ledger.py +0 -109
  281. package/latticeai/core/audit.py +0 -260
  282. package/latticeai/core/builtin_hooks.py +0 -105
  283. package/latticeai/core/context_builder.py +0 -394
  284. package/latticeai/core/document_generator.py +0 -103
  285. package/latticeai/core/enterprise.py +0 -154
  286. package/latticeai/core/enterprise_admin.py +0 -158
  287. package/latticeai/core/file_generation/__init__.py +0 -115
  288. package/latticeai/core/file_generation/bundles.py +0 -76
  289. package/latticeai/core/file_generation/extraction.py +0 -154
  290. package/latticeai/core/file_generation/inference.py +0 -235
  291. package/latticeai/core/file_generation/orchestration.py +0 -152
  292. package/latticeai/core/file_generation/prompting.py +0 -117
  293. package/latticeai/core/file_generation/repair.py +0 -114
  294. package/latticeai/core/file_generation/sanitize.py +0 -61
  295. package/latticeai/core/file_generation/validation.py +0 -201
  296. package/latticeai/core/invitations.py +0 -132
  297. package/latticeai/core/legacy_compatibility.py +0 -243
  298. package/latticeai/core/logging_safety.py +0 -46
  299. package/latticeai/core/marketplace.py +0 -293
  300. package/latticeai/core/mcp_catalog.py +0 -452
  301. package/latticeai/core/mcp_registry.py +0 -506
  302. package/latticeai/core/network_boundary.py +0 -168
  303. package/latticeai/core/oidc.py +0 -208
  304. package/latticeai/core/plugins.py +0 -432
  305. package/latticeai/core/product_hardening.py +0 -218
  306. package/latticeai/core/project_sessions.py +0 -337
  307. package/latticeai/core/realtime.py +0 -238
  308. package/latticeai/core/run_explain.py +0 -426
  309. package/latticeai/core/run_store.py +0 -252
  310. package/latticeai/core/timezones.py +0 -80
  311. package/latticeai/core/workspace_computer_memory.py +0 -84
  312. package/latticeai/core/workspace_graph_trace.py +0 -155
  313. package/latticeai/core/workspace_indexing.py +0 -102
  314. package/latticeai/core/workspace_memory.py +0 -77
  315. package/latticeai/core/workspace_onboarding.py +0 -104
  316. package/latticeai/core/workspace_os.py +0 -978
  317. package/latticeai/core/workspace_os_constants.py +0 -126
  318. package/latticeai/core/workspace_os_state.py +0 -180
  319. package/latticeai/core/workspace_os_utils.py +0 -103
  320. package/latticeai/core/workspace_permissions.py +0 -101
  321. package/latticeai/core/workspace_plugins.py +0 -97
  322. package/latticeai/core/workspace_relationships.py +0 -99
  323. package/latticeai/core/workspace_reorganization.py +0 -335
  324. package/latticeai/core/workspace_review_items.py +0 -112
  325. package/latticeai/core/workspace_runs.py +0 -726
  326. package/latticeai/core/workspace_skills.py +0 -109
  327. package/latticeai/core/workspace_snapshots.py +0 -198
  328. package/latticeai/core/workspace_timeline.py +0 -110
  329. package/latticeai/integrations/__init__.py +0 -0
  330. package/latticeai/integrations/telegram_bot/__init__.py +0 -123
  331. package/latticeai/integrations/telegram_bot/__main__.py +0 -17
  332. package/latticeai/integrations/telegram_bot/config.py +0 -86
  333. package/latticeai/integrations/telegram_bot/dispatch.py +0 -311
  334. package/latticeai/integrations/telegram_bot/flows.py +0 -478
  335. package/latticeai/integrations/telegram_bot/helpers.py +0 -322
  336. package/latticeai/integrations/telegram_bot/screens.py +0 -394
  337. package/latticeai/runtime/audit_runtime.py +0 -76
  338. package/latticeai/runtime/automation_runtime.py +0 -81
  339. package/latticeai/runtime/chat_wiring.py +0 -141
  340. package/latticeai/runtime/context_runtime.py +0 -66
  341. package/latticeai/runtime/feature_toggle_wiring.py +0 -157
  342. package/latticeai/runtime/history_runtime.py +0 -163
  343. package/latticeai/runtime/history_writer.py +0 -138
  344. package/latticeai/runtime/hooks_runtime.py +0 -77
  345. package/latticeai/runtime/model_wiring.py +0 -68
  346. package/latticeai/runtime/namespace_runtime.py +0 -163
  347. package/latticeai/runtime/network_boundary_wiring.py +0 -117
  348. package/latticeai/runtime/network_config_runtime.py +0 -56
  349. package/latticeai/runtime/permission_mode_wiring.py +0 -112
  350. package/latticeai/runtime/persistence_runtime.py +0 -159
  351. package/latticeai/runtime/platform_runtime_wiring.py +0 -89
  352. package/latticeai/runtime/review_wiring.py +0 -42
  353. package/latticeai/runtime/router_registration.py +0 -693
  354. package/latticeai/runtime/service_singletons.py +0 -55
  355. package/latticeai/runtime/sso_config_runtime.py +0 -128
  356. package/latticeai/runtime/user_key_runtime.py +0 -106
  357. package/latticeai/runtime/web_runtime.py +0 -92
  358. package/latticeai/server_app.py +0 -51
  359. package/latticeai/services/app_context.py +0 -130
  360. package/latticeai/services/automation_execution.py +0 -266
  361. package/latticeai/services/automation_intelligence.py +0 -614
  362. package/latticeai/services/brain_automation.py +0 -191
  363. package/latticeai/services/brain_intelligence/__init__.py +0 -58
  364. package/latticeai/services/brain_intelligence/_contract.py +0 -71
  365. package/latticeai/services/brain_intelligence/consistency.py +0 -193
  366. package/latticeai/services/brain_intelligence/constants.py +0 -47
  367. package/latticeai/services/brain_intelligence/digest.py +0 -258
  368. package/latticeai/services/brain_intelligence/health.py +0 -331
  369. package/latticeai/services/brain_intelligence/proposals.py +0 -259
  370. package/latticeai/services/brain_intelligence/sampling.py +0 -84
  371. package/latticeai/services/brain_intelligence/service.py +0 -48
  372. package/latticeai/services/change_proposals.py +0 -471
  373. package/latticeai/services/chat_service.py +0 -243
  374. package/latticeai/services/chronicle.py +0 -555
  375. package/latticeai/services/cloud_egress_audit.py +0 -85
  376. package/latticeai/services/cloud_extraction.py +0 -129
  377. package/latticeai/services/cloud_streaming.py +0 -268
  378. package/latticeai/services/cloud_token_guard.py +0 -84
  379. package/latticeai/services/command_center.py +0 -548
  380. package/latticeai/services/evidence_actions.py +0 -258
  381. package/latticeai/services/feature_toggles.py +0 -502
  382. package/latticeai/services/folder_watch.py +0 -520
  383. package/latticeai/services/funnel_metrics.py +0 -307
  384. package/latticeai/services/hybrid_chat.py +0 -316
  385. package/latticeai/services/hybrid_context.py +0 -228
  386. package/latticeai/services/hybrid_policy.py +0 -129
  387. package/latticeai/services/interop_bridges.py +0 -978
  388. package/latticeai/services/local_knowledge.py +0 -465
  389. package/latticeai/services/memory_service/__init__.py +0 -52
  390. package/latticeai/services/memory_service/_contract.py +0 -100
  391. package/latticeai/services/memory_service/brief.py +0 -431
  392. package/latticeai/services/memory_service/constants.py +0 -57
  393. package/latticeai/services/memory_service/maintenance.py +0 -138
  394. package/latticeai/services/memory_service/manager.py +0 -186
  395. package/latticeai/services/memory_service/proof.py +0 -136
  396. package/latticeai/services/memory_service/recall.py +0 -225
  397. package/latticeai/services/memory_service/service.py +0 -48
  398. package/latticeai/services/memory_service/stores.py +0 -110
  399. package/latticeai/services/mode_store.py +0 -132
  400. package/latticeai/services/model_recommendation.py +0 -224
  401. package/latticeai/services/model_runtime/cloud.py +0 -87
  402. package/latticeai/services/network_boundary_service.py +0 -117
  403. package/latticeai/services/obsidian_bridge.py +0 -609
  404. package/latticeai/services/openai_compatible_adapter.py +0 -101
  405. package/latticeai/services/permission_mode_service.py +0 -122
  406. package/latticeai/services/platform_runtime.py +0 -366
  407. package/latticeai/services/review_queue.py +0 -380
  408. package/latticeai/services/router_context.py +0 -59
  409. package/latticeai/services/run_executor.py +0 -387
  410. package/latticeai/services/self_model_service.py +0 -171
  411. package/latticeai/services/setup_detection.py +0 -147
  412. package/latticeai/services/triggers.py +0 -378
  413. package/latticeai/services/upload_service.py +0 -172
  414. package/latticeai/services/workspace_service.py +0 -165
  415. package/latticeai/setup/__init__.py +0 -25
  416. package/latticeai/setup/auto_setup.py +0 -846
  417. package/latticeai/setup/demo_corpus.py +0 -98
  418. package/latticeai/setup/wizard/__init__.py +0 -126
  419. package/latticeai/setup/wizard/catalog.py +0 -175
  420. package/latticeai/setup/wizard/detect.py +0 -302
  421. package/latticeai/setup/wizard/install.py +0 -348
  422. package/latticeai/setup/wizard/paths.py +0 -165
  423. package/latticeai/setup/wizard/plans.py +0 -74
  424. package/latticeai/setup/wizard/recommend.py +0 -320
  425. package/scripts/bench_agent_smoke.py +0 -409
  426. package/scripts/bench_models.py +0 -540
  427. package/scripts/bench_vector_index.py +0 -295
  428. package/scripts/funnel_soft_gate.py +0 -192
  429. package/scripts/generate_agent_loop_fixtures.py +0 -994
  430. package/scripts/generate_rust_parity_fixtures.py +0 -908
  431. package/scripts/migrate_brain_storage.py +0 -57
  432. package/scripts/parity_fixture_corpus_context.py +0 -162
  433. package/scripts/parity_fixture_corpus_docgen.py +0 -341
  434. package/scripts/profile_kg.py +0 -355
  435. package/server.py +0 -30
  436. package/static/app/assets/AdminConsole-cf4npybT.js +0 -1
  437. package/static/app/assets/Capture-DiQ219jW.js +0 -1
  438. package/static/app/assets/System-CieofHQa.js +0 -1
  439. package/static/app/assets/arrow-left-kfsrk0mv.js +0 -1
  440. package/static/app/assets/circle-check-qqLug9nU.js +0 -1
  441. package/static/app/assets/index-DxmOfNRi.css +0 -2
  442. package/static/app/assets/primitives-SNp0LRJz.js +0 -1
  443. package/static/app/assets/search-BcHqkjoy.js +0 -1
@@ -1,8 +1,16 @@
1
- """Model / engine API router.
1
+ """Model / engine API router — the MLX lifecycle this process owns.
2
2
 
3
- Extracted from ``server_app.py`` in v1.3.0. Paths and schemas unchanged:
4
- ``/models*``, ``/engines*`` (install/verify-cloud/pull-model/prepare-model[/stream]),
5
- ``/setup/set-api-key``.
3
+ Extracted from ``server_app.py`` in v1.3.0 with the whole ``/models*`` +
4
+ ``/engines*`` + ``/setup/set-api-key`` surface. v11.6.0 kept the eight routes
5
+ that are *this interpreter's* business — loading, switching and unloading MLX
6
+ models, and the resolve → download-if-consented → load → smoke prepare flow —
7
+ and moved the rest to ``lattice-host``: engine installation and cloud-key
8
+ verification are host operations, ``/setup/set-api-key`` is account state, and
9
+ the two catalogue reads (``/models/compat-profiles``, ``/models/recommendations``)
10
+ are product views.
11
+
12
+ The download itself stays because it is ``huggingface_hub`` / ``ollama``
13
+ running here (v11.6.0 gateway integration §4a).
6
14
 
7
15
  Mirrors the established router-factory convention: the heavy provider/runtime
8
16
  helpers are injected as bound service callables. This module owns the sole
@@ -66,15 +74,6 @@ class LoadModelRequest(BaseModel):
66
74
  allow_download: bool = False
67
75
 
68
76
 
69
- class InstallEngineRequest(BaseModel):
70
- engine: str
71
- confirmation_token: Optional[str] = None
72
-
73
-
74
- class SetApiKeyRequest(BaseModel):
75
- provider: str
76
- key: str
77
- user_email: Optional[str] = None
78
77
 
79
78
 
80
79
  class PullModelRequest(BaseModel):
@@ -89,21 +88,12 @@ class PrepareModelRequest(BaseModel):
89
88
  allow_download: bool = False
90
89
 
91
90
 
92
- class VerifyCloudRequest(BaseModel):
93
- force: bool = False
94
- provider: Optional[str] = None
95
-
96
91
 
97
92
  def create_models_router(
98
93
  *,
99
94
  model_router: Any,
100
95
  require_user: Callable[[Request], str],
101
96
  require_admin: Callable[[Request], tuple],
102
- get_current_user: Callable[[Request], Optional[str]],
103
- load_users: Callable[[], Dict],
104
- get_user_role: Callable[..., str],
105
- install_engine: Callable[..., Dict],
106
- verify_cloud_models: Callable[..., Any],
107
97
  normalize_local_model_request: Callable[..., str],
108
98
  download_hf_model: Callable[..., Dict],
109
99
  prepare_and_load_model: Callable[..., Any],
@@ -114,10 +104,8 @@ def create_models_router(
114
104
  engine_status: Callable[[], List[Dict]],
115
105
  filter_lower_family_versions: Callable[[List[Dict]], List[Dict]],
116
106
  list_compat_profiles: Callable[[], Any],
117
- set_user_api_key: Callable[..., None],
118
107
  engine_model_catalog: Dict,
119
108
  model_engine_aliases: Dict,
120
- cloud_verify_ttl_seconds: int,
121
109
  is_public_mode: bool,
122
110
  allow_local_models: bool,
123
111
  require_auth: bool,
@@ -127,7 +115,6 @@ def create_models_router(
127
115
  _router = model_router
128
116
  ENGINE_MODEL_CATALOG = engine_model_catalog
129
117
  MODEL_ENGINE_ALIASES = model_engine_aliases
130
- CLOUD_VERIFY_TTL_SECONDS = cloud_verify_ttl_seconds
131
118
  IS_PUBLIC_MODE = is_public_mode
132
119
  ALLOW_LOCAL_MODELS = allow_local_models
133
120
  REQUIRE_AUTH = require_auth
@@ -302,29 +289,6 @@ def create_models_router(
302
289
 
303
290
  # ── Engines ───────────────────────────────────────────────────────────
304
291
 
305
- @router.post("/engines/install")
306
- async def engines_install(req: InstallEngineRequest, request: Request):
307
- _authorize_model_admin(request)
308
- try:
309
- # `install_engine` shells out with a 900s timeout. On the event loop
310
- # that is a fifteen-minute freeze of the entire server — no chat, no
311
- # status, no UI — for one admin installing an engine.
312
- if req.confirmation_token:
313
- return await asyncio.to_thread(
314
- install_engine, req.engine, confirmation_token=req.confirmation_token
315
- )
316
- return await asyncio.to_thread(install_engine, req.engine)
317
- except ModelRuntimeError as exc:
318
- _raise_model_http(exc)
319
-
320
- @router.post("/engines/verify-cloud")
321
- async def engines_verify_cloud(req: VerifyCloudRequest, request: Request):
322
- _authorize_model_admin(request)
323
- try:
324
- results = await verify_cloud_models(force=req.force, provider_filter=req.provider)
325
- except ModelRuntimeError as exc:
326
- _raise_model_http(exc)
327
- return {"verified": results, "ttl_seconds": CLOUD_VERIFY_TTL_SECONDS}
328
292
 
329
293
  @router.post("/engines/pull-model")
330
294
  async def pull_ollama_model(req: PullModelRequest, request: Request):
@@ -452,22 +416,6 @@ def create_models_router(
452
416
  headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
453
417
  )
454
418
 
455
- @router.post("/setup/set-api-key")
456
- async def set_api_key(req: SetApiKeyRequest, request: Request):
457
- from latticeai.models.router import OPENAI_COMPATIBLE_PROVIDERS
458
- config = OPENAI_COMPATIBLE_PROVIDERS.get(req.provider)
459
- if not config:
460
- raise http_error(400, "models.unknown_provider", resolve_language(request))
461
- if not req.key.strip():
462
- raise http_error(400, "models.api_key_empty", resolve_language(request))
463
- current_user = require_user(request)
464
- if REQUIRE_AUTH and req.user_email and _normalized_identity(req.user_email) != _normalized_identity(current_user):
465
- raise http_error(403, "models.other_user_api_key", resolve_language(request))
466
- target_email = str(_effective_email(current_user, req.user_email) or "").strip()
467
- if not target_email:
468
- raise http_error(400, "models.sign_in_required", resolve_language(request))
469
- set_user_api_key(target_email, req.provider, req.key.strip())
470
- return {"ok": True, "provider": req.provider, "user_email": target_email, "scope": "user"}
471
419
 
472
420
  # ── Models ────────────────────────────────────────────────────────────
473
421
 
@@ -503,10 +451,6 @@ def create_models_router(
503
451
  },
504
452
  }
505
453
 
506
- @router.get("/models/compat-profiles")
507
- async def list_model_compat_profiles(request: Request):
508
- require_user(request)
509
- return {"profiles": _list_compat_profiles()}
510
454
 
511
455
  @router.post("/models/load")
512
456
  async def load_model(req: LoadModelRequest, request: Request):
@@ -562,24 +506,5 @@ def create_models_router(
562
506
  _router.unload_all()
563
507
  return {"status": "ok", "unloaded": unloaded}
564
508
 
565
- @router.get("/models/recommendations")
566
- async def model_recommendations(request: Request, engine: str = "local_mlx"):
567
- """Hardware-aware tri-state model recommendation for this machine.
568
-
569
- 5.2.0: now includes rich capability fields (hf_repo_id, verification,
570
- hardware, load_strategy, license, safety_notes) from the structured registry.
571
- """
572
- require_user(request)
573
- from latticeai.services.model_recommendation import recommend_catalog
574
- from latticeai.setup.auto_setup import probe as auto_setup_probe
575
-
576
- profile = await asyncio.to_thread(lambda: auto_setup_probe().to_json())
577
- catalog = recommend_catalog(profile, engine=engine)
578
- try:
579
- from latticeai.services.model_catalog import get_verified_models
580
- reg_meta = {"version": "5.2.0", "verified_total": len(get_verified_models())}
581
- except Exception:
582
- reg_meta = {"version": "5.2.0"}
583
- return {"profile": profile, "recommendations": catalog, "registry": reg_meta}
584
509
 
585
510
  return router
@@ -1,89 +1,25 @@
1
- """v3 knowledge graph, vector, and hybrid search API contracts."""
1
+ """The embedder report — what this worker will turn text into.
2
+
3
+ v3 shipped this module as the knowledge-graph / vector / hybrid search API: 15
4
+ routes over the store, the ANN index and the fusion ranker. v11.6.0 moved
5
+ retrieval into ``lattice-retrieval`` and the index write door into
6
+ ``lattice-jobs``, and what stays in Python is the half that is a fact about
7
+ *this process*: which embedding provider resolved, at what width, and whether
8
+ it is the one that was asked for.
9
+
10
+ ``GET /api/embeddings/status`` therefore reports the **embedder**, not the
11
+ index. Index completeness is a native jobs route now, and reporting it from
12
+ here would have meant re-opening a store the worker no longer holds.
13
+ """
2
14
 
3
15
  from __future__ import annotations
4
16
 
5
17
  from typing import Any, Callable, Dict, NoReturn, Optional
6
18
 
7
19
  from fastapi import APIRouter, HTTPException, Request
8
- from pydantic import BaseModel, Field
9
20
 
10
21
  from latticeai.core.embedding_providers import embedding_provider_profiles
11
- from latticeai.services.search_service import DEFAULT_HYBRID_WEIGHTS, SearchService
12
-
13
-
14
- class SearchRequest(BaseModel):
15
- query: str = Field(..., min_length=1)
16
- limit: int = 30
17
-
18
-
19
- class VectorSearchRequest(SearchRequest):
20
- min_score: float = 0.0
21
-
22
-
23
- class HybridSearchRequest(SearchRequest):
24
- keyword_limit: int = 30
25
- vector_limit: int = 30
26
- graph_limit: int = 30
27
- weights: Optional[Dict[str, float]] = None
28
- #: Opt in to scoring this text query against the *image* index too
29
- #: (v11.2.0). Only possible when a shared-space vision model is
30
- #: configured; when it is not, the response says so instead of quietly
31
- #: returning the text-only ranking as if fusion had happened.
32
- image_fusion: bool = False
33
-
34
-
35
- class GraphSearchRequest(SearchRequest):
36
- #: How far to walk out from the directly-matching nodes. The service
37
- #: clamps this to 0–3; 0 means "matches only, no expansion".
38
- expand_depth: int = 1
39
-
40
-
41
- class GraphNodeRequest(BaseModel):
42
- node_id: str = Field(..., min_length=1)
43
- include_neighbors: bool = True
44
- depth: int = 1
45
- limit: int = 100
46
-
47
-
48
- class RelationshipSearchRequest(BaseModel):
49
- query: str = ""
50
- node_id: str = ""
51
- relationship_type: str = ""
52
- limit: int = 30
53
-
54
-
55
- class IndexRebuildRequest(BaseModel):
56
- full: bool = False
57
- include_nodes: bool = True
58
- include_chunks: bool = True
59
-
60
-
61
- class _ScopedSearchService:
62
- """Injects the caller's workspace scope into every search call —
63
- enforcement lives at this one chokepoint, not in each handler."""
64
-
65
- _SCOPED = {
66
- "keyword_search",
67
- "vector_search",
68
- "graph_search",
69
- "hybrid_search",
70
- "graph",
71
- "node",
72
- "relationships",
73
- }
74
-
75
- def __init__(self, service: SearchService, allowed):
76
- self._service = service
77
- self._allowed = allowed
78
-
79
- def __getattr__(self, name):
80
- attr = getattr(self._service, name)
81
- if name in self._SCOPED:
82
- def scoped(*args, **kwargs):
83
- kwargs.setdefault("allowed_workspaces", self._allowed)
84
- return attr(*args, **kwargs)
85
- return scoped
86
- return attr
22
+ from latticeai.services.search_service import SearchService
87
23
 
88
24
 
89
25
  def create_search_router(
@@ -91,188 +27,14 @@ def create_search_router(
91
27
  service: SearchService,
92
28
  require_user: Callable[[Request], str],
93
29
  embedding_info: Optional[Callable[[], Dict[str, Any]]] = None,
94
- allowed_workspaces_for: Optional[Callable[[Optional[str]], Any]] = None,
95
30
  ) -> APIRouter:
96
31
  router = APIRouter()
97
32
 
98
- def _guarded(request: Request) -> "_ScopedSearchService":
99
- user = require_user(request)
100
- allowed = None
101
- if allowed_workspaces_for is not None and user:
102
- allowed = allowed_workspaces_for(user)
103
- return _ScopedSearchService(service, allowed)
104
-
105
- def _raise_graph_error(exc: Exception) -> NoReturn:
106
- # NoReturn, not None: every handler ends with this in its except
33
+ def _raise_embedder_error(exc: Exception) -> NoReturn:
34
+ # NoReturn, not None: both handlers end with this in their except
107
35
  # branch, and without it each one reads as a missing return.
108
36
  raise HTTPException(status_code=404, detail=str(exc)) from exc
109
37
 
110
- @router.post("/api/search/hybrid")
111
- async def hybrid_search(req: HybridSearchRequest, request: Request) -> Dict[str, Any]:
112
- try:
113
- return _guarded(request).hybrid_search(
114
- req.query,
115
- limit=req.limit,
116
- keyword_limit=req.keyword_limit,
117
- vector_limit=req.vector_limit,
118
- graph_limit=req.graph_limit,
119
- weights=req.weights or DEFAULT_HYBRID_WEIGHTS,
120
- image_fusion=req.image_fusion,
121
- )
122
- except ValueError as exc:
123
- _raise_graph_error(exc)
124
-
125
- @router.get("/api/search/hybrid")
126
- async def hybrid_search_get(
127
- q: str, request: Request, limit: int = 30, image_fusion: bool = False,
128
- ) -> Dict[str, Any]:
129
- try:
130
- return _guarded(request).hybrid_search(q, limit=limit, image_fusion=image_fusion)
131
- except ValueError as exc:
132
- _raise_graph_error(exc)
133
-
134
- @router.get("/api/search/image-query")
135
- async def image_query_status(request: Request) -> Dict[str, Any]:
136
- """Whether a typed question can reach the image index on this install."""
137
- require_user(request)
138
- return service.image_query_status()
139
-
140
- @router.post("/api/search/keyword")
141
- async def keyword_search(req: SearchRequest, request: Request) -> Dict[str, Any]:
142
- try:
143
- return _guarded(request).keyword_search(req.query, limit=req.limit)
144
- except ValueError as exc:
145
- _raise_graph_error(exc)
146
-
147
- @router.get("/api/search/keyword")
148
- async def keyword_search_get(q: str, request: Request, limit: int = 30) -> Dict[str, Any]:
149
- try:
150
- return _guarded(request).keyword_search(q, limit=limit)
151
- except ValueError as exc:
152
- _raise_graph_error(exc)
153
-
154
- @router.post("/api/search/vector")
155
- async def vector_search(req: VectorSearchRequest, request: Request) -> Dict[str, Any]:
156
- try:
157
- return _guarded(request).vector_search(req.query, limit=req.limit, min_score=req.min_score)
158
- except ValueError as exc:
159
- _raise_graph_error(exc)
160
-
161
- @router.get("/api/search/vector")
162
- async def vector_search_get(
163
- q: str,
164
- request: Request,
165
- limit: int = 30,
166
- min_score: float = 0.0,
167
- ) -> Dict[str, Any]:
168
- try:
169
- return _guarded(request).vector_search(q, limit=limit, min_score=min_score)
170
- except ValueError as exc:
171
- _raise_graph_error(exc)
172
-
173
- @router.post("/api/search/graph")
174
- async def graph_search(req: GraphSearchRequest, request: Request) -> Dict[str, Any]:
175
- """Relationship-aware search: direct matches plus what they connect to.
176
-
177
- The third retrieval channel. It was in ``_ScopedSearchService._SCOPED``
178
- from the start — so the workspace guard was ready for it — but no
179
- handler ever called it, which made the allow-list entry the only
180
- evidence the channel was supposed to be reachable at all.
181
- """
182
- try:
183
- return _guarded(request).graph_search(
184
- req.query,
185
- limit=req.limit,
186
- expand_depth=req.expand_depth,
187
- )
188
- except ValueError as exc:
189
- _raise_graph_error(exc)
190
-
191
- @router.get("/api/graph")
192
- async def graph(request: Request, limit: int = 300) -> Dict[str, Any]:
193
- try:
194
- return _guarded(request).graph(limit=limit)
195
- except ValueError as exc:
196
- _raise_graph_error(exc)
197
-
198
- @router.get("/api/graph/node")
199
- async def graph_node(
200
- node_id: str,
201
- request: Request,
202
- include_neighbors: bool = True,
203
- depth: int = 1,
204
- limit: int = 100,
205
- ) -> Dict[str, Any]:
206
- try:
207
- return _guarded(request).node(
208
- node_id,
209
- include_neighbors=include_neighbors,
210
- depth=depth,
211
- limit=limit,
212
- )
213
- except ValueError as exc:
214
- raise HTTPException(status_code=404, detail=str(exc)) from exc
215
-
216
- @router.post("/api/graph/node")
217
- async def graph_node_post(req: GraphNodeRequest, request: Request) -> Dict[str, Any]:
218
- try:
219
- return _guarded(request).node(
220
- req.node_id,
221
- include_neighbors=req.include_neighbors,
222
- depth=req.depth,
223
- limit=req.limit,
224
- )
225
- except ValueError as exc:
226
- raise HTTPException(status_code=404, detail=str(exc)) from exc
227
-
228
- @router.get("/api/graph/relationship")
229
- async def graph_relationship(
230
- request: Request,
231
- q: str = "",
232
- node_id: str = "",
233
- relationship_type: str = "",
234
- limit: int = 30,
235
- ) -> Dict[str, Any]:
236
- try:
237
- return _guarded(request).relationships(
238
- query=q,
239
- node_id=node_id,
240
- relationship_type=relationship_type,
241
- limit=limit,
242
- )
243
- except ValueError as exc:
244
- _raise_graph_error(exc)
245
-
246
- @router.post("/api/graph/relationship")
247
- async def graph_relationship_post(req: RelationshipSearchRequest, request: Request) -> Dict[str, Any]:
248
- try:
249
- return _guarded(request).relationships(
250
- query=req.query,
251
- node_id=req.node_id,
252
- relationship_type=req.relationship_type,
253
- limit=req.limit,
254
- )
255
- except ValueError as exc:
256
- _raise_graph_error(exc)
257
-
258
- @router.get("/api/index/status")
259
- async def index_status(request: Request) -> Dict[str, Any]:
260
- try:
261
- return _guarded(request).index_status()
262
- except ValueError as exc:
263
- _raise_graph_error(exc)
264
-
265
- @router.post("/api/index/rebuild")
266
- async def index_rebuild(req: IndexRebuildRequest, request: Request) -> Dict[str, Any]:
267
- try:
268
- return _guarded(request).rebuild_index(
269
- full=req.full,
270
- include_nodes=req.include_nodes,
271
- include_chunks=req.include_chunks,
272
- )
273
- except ValueError as exc:
274
- _raise_graph_error(exc)
275
-
276
38
  @router.get("/api/embeddings/status")
277
39
  async def embeddings_status(request: Request, refresh: bool = False) -> Dict[str, Any]:
278
40
  require_user(request)
@@ -280,7 +42,7 @@ def create_search_router(
280
42
  try:
281
43
  return service.embeddings_status(resolved=resolved, refresh=refresh)
282
44
  except ValueError as exc:
283
- _raise_graph_error(exc)
45
+ _raise_embedder_error(exc)
284
46
 
285
47
  @router.get("/api/embeddings/providers")
286
48
  async def embeddings_providers(request: Request) -> Dict[str, Any]: