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
@@ -51,574 +51,132 @@ LANGUAGE_HEADER = "x-lattice-language"
51
51
 
52
52
 
53
53
  MESSAGES: Dict[str, Dict[str, str]] = {
54
- # ── auth ────────────────────────────────────────────────────────────
55
- "auth.password_too_weak": {
56
- "ko": "비밀번호는 8자 이상이며 영문자와 숫자를 모두 포함해야 합니다.",
57
- "en": "Your password needs at least 8 characters, including letters and numbers.",
54
+ # ── agent_seam ────────────────────────────────────────────────────────
55
+ "agent_seam.disabled": {
56
+ "ko": '워커 시임이 꺼져 있습니다. 호스트가 직접 띄운 워커에서만 열립니다.',
57
+ "en": 'The worker seam is off. It opens only in a worker the host started itself.',
58
58
  },
59
- "auth.invitation_required": {
60
- "ko": "유효한 서명 초대 권한이 필요합니다.",
61
- "en": "A valid signed invitation is required.",
59
+ "agent_seam.max_tokens_out_of_range": {
60
+ "ko": '한 번에 만들 길이는 {min}에서 {max} 사이여야 합니다.',
61
+ "en": 'Ask for between {min} and {max} tokens in one completion.',
62
62
  },
63
- "auth.registration_disabled": {
64
- "ko": "회원가입이 비활성화되어 있습니다. 관리자에게 문의하세요.",
65
- "en": "Sign-up is turned off. Ask an administrator to enable it.",
63
+ "agent_seam.message_required": {
64
+ "ko": '모델에 보낼 내용을 적어주세요.',
65
+ "en": 'Write the message to send to the model.',
66
66
  },
67
- "auth.email_taken": {
68
- "ko": "이미 존재하는 이메일입니다.",
69
- "en": "That email address is already registered.",
67
+ "agent_seam.temperature_out_of_range": {
68
+ "ko": '온도는 {min}에서 {max} 사이여야 합니다.',
69
+ "en": 'Temperature has to be between {min} and {max}.',
70
70
  },
71
- "auth.bad_credentials": {
72
- "ko": "이메일 또는 비밀번호가 틀렸습니다.",
73
- "en": "That email address or password is not correct.",
71
+ "agent_seam.tool_blocked": {
72
+ "ko": "'{tool}' 도구는 어떤 모드에서도 차단됩니다 ({reason}).",
73
+ "en": "'{tool}' is blocked in every mode ({reason}).",
74
74
  },
75
- "auth.account_disabled": {
76
- "ko": "비활성화된 계정입니다.",
77
- "en": "This account has been disabled.",
75
+ "agent_seam.tool_fail_closed": {
76
+ "ko": "'{tool}' 도구는 기존 내용을 바꾸지만 검토할 수 있는 제안으로 만들 수 없어 차단했습니다 ({reason}).",
77
+ "en": "'{tool}' would change existing content but cannot be staged as a reviewable proposal, so it is blocked ({reason}).",
78
78
  },
79
- "auth.login_required": {
80
- "ko": "인증이 필요합니다.",
81
- "en": "You need to sign in first.",
79
+ "agent_seam.tool_required": {
80
+ "ko": '실행할 도구 이름이 필요합니다.',
81
+ "en": 'A tool name to run is required.',
82
82
  },
83
+ # ── auth ────────────────────────────────────────────────────────
83
84
  "auth.user_not_found": {
84
- "ko": "사용자를 찾을 수 없습니다.",
85
- "en": "No such user.",
86
- },
87
- "auth.current_password_wrong": {
88
- "ko": "현재 비밀번호가 틀렸습니다.",
89
- "en": "Your current password is not correct.",
90
- },
91
- "auth.name_required": {
92
- "ko": "이름을 입력해주세요.",
93
- "en": "Please enter a name.",
94
- },
95
- "auth.nickname_required": {
96
- "ko": "닉네임을 입력해주세요.",
97
- "en": "Please enter a nickname.",
98
- },
99
- # ── SSO ─────────────────────────────────────────────────────────────
100
- "sso.not_configured": {
101
- "ko": "SSO가 설정되지 않았습니다.",
102
- "en": "Single sign-on is not set up.",
103
- },
104
- "sso.invalid_state": {
105
- "ko": "유효하지 않은 SSO 상태입니다.",
106
- "en": "That sign-on request is no longer valid. Please start again.",
107
- },
108
- "sso.config_error": {
109
- "ko": "SSO 설정 오류입니다.",
110
- "en": "Single sign-on is misconfigured.",
111
- },
112
- "sso.no_id_token": {
113
- "ko": "ID 토큰을 받지 못했습니다.",
114
- "en": "The identity provider did not return an ID token.",
115
- },
116
- "sso.token_verification_failed": {
117
- "ko": "SSO 토큰 검증에 실패했습니다.",
118
- "en": "The sign-on token could not be verified.",
119
- },
120
- "sso.provider_verification_failed": {
121
- "ko": "SSO 공급자 검증에 실패했습니다.",
122
- "en": "The sign-on provider could not be verified.",
85
+ "ko": '사용자를 찾을 수 없습니다.',
86
+ "en": 'No such user.',
123
87
  },
124
- "sso.email_unavailable": {
125
- "ko": "이메일을 확인할 수 없습니다.",
126
- "en": "The identity provider did not share an email address.",
127
- },
128
- "sso.invitation_required": {
129
- "ko": "신규 SSO 계정에는 유효한 서명 초대 권한이 필요합니다.",
130
- "en": "New single sign-on accounts need a valid signed invitation.",
131
- },
132
- # ── admin ───────────────────────────────────────────────────────────
133
- "admin.invalid_role": {
134
- "ko": "role은 admin 또는 user만 가능합니다.",
135
- "en": "Role must be either 'admin' or 'user'.",
136
- },
137
- "admin.cannot_disable_self": {
138
- "ko": "자기 자신은 비활성화할 수 없습니다.",
139
- "en": "You cannot disable your own account.",
140
- },
141
- "admin.cannot_delete_self": {
142
- "ko": "자기 자신은 삭제할 수 없습니다.",
143
- "en": "You cannot delete your own account.",
144
- },
145
- # ── capture / ingestion ─────────────────────────────────────────────
146
- "capture.ingestion_disabled": {
147
- "ko": "지식 그래프 수집이 꺼져 있습니다.",
148
- "en": "Knowledge Graph ingestion is turned off.",
149
- },
150
- "capture.payload_too_large": {
151
- "ko": "보낸 내용이 너무 큽니다.",
152
- "en": "That capture is too large to accept.",
153
- },
154
- "capture.nothing_to_capture": {
155
- "ko": "저장할 내용이 없습니다. 텍스트나 페이지 내용을 함께 보내주세요.",
156
- "en": "Nothing to capture — send text, html, or a selection.",
157
- },
158
- # ── shared ──────────────────────────────────────────────────────────
159
- "common.user_mismatch": {
160
- "ko": "로그인한 사용자와 요청한 사용자가 다릅니다.",
161
- "en": "user_email must match the authenticated user.",
162
- },
163
- "common.workspace_mismatch": {
164
- "ko": "작업 공간 지정이 서로 다릅니다.",
165
- "en": "Workspace selectors must match.",
166
- },
167
- "common.workspace_unreadable": {
168
- "ko": "'{workspace}' 작업 공간을 읽을 권한이 없습니다.",
169
- "en": "Workspace '{workspace}' is not readable.",
170
- },
171
- "common.file_not_found": {
172
- "ko": "파일을 찾을 수 없습니다.",
173
- "en": "File not found.",
174
- },
175
- "common.path_required": {
176
- "ko": "경로를 입력해주세요.",
177
- "en": "A path is required.",
178
- },
179
- "common.graph_disabled": {
180
- "ko": "지식 그래프가 꺼져 있습니다.",
181
- "en": "The Knowledge Graph is turned off.",
182
- },
183
- "common.graph_unavailable": {
184
- "ko": "지식 그래프를 사용할 수 없습니다.",
185
- "en": "The Knowledge Graph is not available.",
186
- },
187
- # ── chat ────────────────────────────────────────────────────────────
88
+ # ── chat ────────────────────────────────────────────────────────
188
89
  "chat.model_not_loaded": {
189
90
  "ko": "'{model}' 모델이 아직 준비되지 않았습니다.",
190
91
  "en": "Model '{model}' is not loaded.",
191
92
  },
192
- "chat.no_model_loaded": {
193
- "ko": "불러온 모델이 없습니다. 모델을 먼저 준비해주세요.",
194
- "en": "No model is loaded. Prepare a model first.",
195
- },
196
- "chat.conversation_not_found": {
197
- "ko": "대화를 찾을 수 없습니다.",
198
- "en": "That conversation no longer exists.",
199
- },
200
- "chat.file_name_collision": {
201
- "ko": "'{name}' 이름의 파일이 너무 많습니다. 다른 이름을 지정해 주세요.",
202
- "en": "Too many files are already named '{name}'. Please choose another name.",
203
- },
204
- "chat.file_generation_failed": {
205
- "ko": "파일 내용을 만들지 못했습니다.",
206
- "en": "The file content could not be generated.",
207
- },
208
- # ── memory / graph ──────────────────────────────────────────────────
209
- "memory.unknown_source": {
210
- "ko": "'{source}'는 알 수 없는 기억 출처입니다.",
211
- "en": "Unknown memory source: {source}.",
212
- },
213
- # ── self-model (personal ontology) ──────────────────────────────────
214
- "self_model.invalid_kind": {
215
- "ko": "나 / 선호 / 습관 / 결정 / 관계 중 하나를 골라주세요.",
216
- "en": "Choose one of: trait, preference, habit, decision, relationship.",
217
- },
218
- "self_model.text_required": {
219
- "ko": "저장할 내용을 적어주세요.",
220
- "en": "Please write what should be remembered.",
221
- },
222
- "self_model.not_found": {
223
- "ko": "그 항목은 이미 없습니다.",
224
- "en": "That entry is already gone.",
225
- },
226
- "self_model.not_self_model": {
227
- "ko": "내 프로필 항목이 아니라서 지울 수 없습니다.",
228
- "en": "That is not a profile entry, so it cannot be removed here.",
229
- },
230
- "self_model.not_a_proposal": {
231
- "ko": "그 검토 항목은 내 프로필 제안이 아닙니다.",
232
- "en": "That review item is not a profile proposal.",
233
- },
234
- "self_model.empty_proposal": {
235
- "ko": "그 제안에는 저장할 내용이 없습니다.",
236
- "en": "That proposal carries nothing to save.",
237
- },
238
- "self_model.graph_unavailable": {
239
- "ko": "지식 그래프가 꺼져 있어 내 프로필을 쓸 수 없습니다.",
240
- "en": "The knowledge graph is off, so the profile cannot be written.",
241
- },
242
- "self_model.queue_unavailable": {
243
- "ko": "검토함이 연결되어 있지 않아 제안을 처리할 수 없습니다.",
244
- "en": "The review queue is not connected, so proposals cannot be handled.",
245
- },
246
- "self_model.invalid": {
247
- "ko": "내 프로필을 바꾸지 못했습니다.",
248
- "en": "The profile could not be changed.",
249
- },
250
- "graph.node_id_required": {
251
- "ko": "노드 식별자가 필요합니다.",
252
- "en": "A node id is required.",
253
- },
254
- "graph.node_not_found": {
255
- "ko": "노드를 찾을 수 없습니다.",
256
- "en": "That node was not found.",
257
- },
258
- "graph.unsupported_type": {
259
- "ko": "지원하는 종류: message, ai_response, note",
260
- "en": "Supported types are: message, ai_response, note.",
261
- },
262
- # ── ingestion / folders ─────────────────────────────────────────────
263
- "ingestion.job_not_found": {
264
- "ko": "수집 작업을 찾을 수 없습니다.",
265
- "en": "That ingestion job was not found.",
266
- },
267
- "ingestion.watch_unavailable": {
268
- "ko": "폴더 감시 기능을 사용할 수 없습니다.",
269
- "en": "The folder watch service is unavailable.",
270
- },
271
- "ingestion.watch_enable_failed": {
272
- "ko": "폴더 감시를 켜지 못했습니다.",
273
- "en": "Turning folder watch on did not succeed.",
274
- },
275
- "ingestion.watch_selector_required": {
276
- "ko": "감시 항목 또는 경로가 필요합니다.",
277
- "en": "A watch id or a path is required.",
278
- },
279
- "ingestion.watch_not_found": {
280
- "ko": "감시 중인 폴더를 찾을 수 없습니다.",
281
- "en": "That watched folder was not found.",
282
- },
283
- "portability.verification_failed": {
284
- "ko": "보관 파일 검증에 실패했습니다.",
285
- "en": "Archive verification failed.",
286
- },
287
- "portability.brain_network_disabled": {
288
- "ko": "다른 Brain과의 공유 기능이 꺼져 있습니다. 기본값이 꺼짐이며, "
289
- "LATTICEAI_BRAIN_NETWORK=1 로 직접 켜야 사용할 수 있습니다.",
290
- "en": "Sharing with another Brain is off. It is off by default; set "
291
- "LATTICEAI_BRAIN_NETWORK=1 to turn it on.",
292
- },
293
- "portability.review_queue_unavailable": {
294
- "ko": "검토함이 연결되어 있지 않아 받은 지식을 제안으로 쌓을 수 없습니다.",
295
- "en": "The review queue is not connected, so received knowledge cannot be queued as proposals.",
296
- },
297
- "ingestion.vault_path_required": {
298
- "ko": "Obsidian 보관함 폴더 경로가 필요합니다.",
299
- "en": "An Obsidian vault folder path is required.",
300
- },
301
- # ── review queue ────────────────────────────────────────────────────
302
- "review.item_not_found": {
303
- "ko": "검토 항목을 찾을 수 없습니다.",
304
- "en": "That review item was not found.",
305
- },
306
- "review.cannot_approve_in_status": {
307
- "ko": "'{status}' 상태의 검토 항목은 승인할 수 없습니다.",
308
- "en": "A review item in status '{status}' cannot be approved.",
309
- },
310
- "review.bulk_ids_required": {
311
- "ko": "한꺼번에 처리할 검토 항목을 하나 이상 골라 주세요.",
312
- "en": "Choose at least one review item to act on.",
313
- },
314
- "review.bulk_too_many": {
315
- "ko": "한 번에 최대 {cap}개까지 처리할 수 있습니다.",
316
- "en": "At most {cap} items can be handled in one request.",
317
- },
318
- # ── interop bridges (Notion export / git / mail / calendar) ──────────
319
- "ingestion.interop_path_required": {
320
- "ko": "불러올 파일이나 폴더 경로가 필요합니다.",
321
- "en": "A file or folder path to read is required.",
322
- },
323
- "ingestion.interop_unknown_source": {
324
- "ko": "알 수 없는 연동 종류입니다: {source}",
325
- "en": "Unknown interop source: {source}",
326
- },
327
- "ingestion.vault_watch_unavailable": {
328
- "ko": "보관함 자동 확인 기능을 사용할 수 없습니다.",
329
- "en": "Vault watch is unavailable.",
330
- },
331
- "ingestion.vault_watch_disabled": {
332
- "ko": "보관함 자동 확인은 기본으로 꺼져 있습니다. 설정에서 켜야 사용할 수 있습니다.",
333
- "en": "Vault watch is off by default; turn it on in settings to use it.",
334
- },
335
- # ── projects ────────────────────────────────────────────────────────
336
- "project.not_found": {
337
- "ko": "프로젝트를 찾을 수 없습니다.",
338
- "en": "That project was not found.",
339
- },
340
- # ── network boundary ────────────────────────────────────────────────
341
- "boundary.policy_not_configured": {
342
- "ko": "혼합 검색 정책 서비스가 설정되지 않았습니다.",
343
- "en": "The hybrid policy service is not configured.",
344
- },
345
- # ── feature toggles ─────────────────────────────────────────────────
346
- # The switchboard renders from the server (see
347
- # ``latticeai/services/feature_toggles.py``), so every label and one-line
348
- # explanation a person reads lives here. The rule for the summaries: say
349
- # what turning it *on* does, in the words someone who never read the
350
- # environment-variable docs would use.
351
- "features.note": {
352
- "ko": "모두 지금 바로 적용됩니다. 다시 시작하지 않아도 됩니다.",
353
- "en": "Every switch here takes effect right away — no restart needed.",
354
- },
355
- "features.unknown": {
356
- "ko": "그런 기능은 없습니다: {feature}",
357
- "en": "There is no such feature: {feature}",
358
- },
359
- "features.invalid_value": {
360
- "ko": "이 기능에 쓸 수 없는 값입니다: {value}",
361
- "en": "That is not a value this feature can take: {value}",
362
- },
363
- "features.choice.install_required": {
364
- "ko": "설치 필요 — {reason}",
365
- "en": "Install required — {reason}",
366
- },
367
- "features.allow_multimodal.label": {
368
- "ko": "사진·녹음도 기억하기",
369
- "en": "Remember pictures and recordings",
370
- },
371
- "features.allow_multimodal.summary": {
372
- "ko": "폴더를 읽을 때 글뿐 아니라 사진과 녹음도 함께 저장합니다.",
373
- "en": "A folder scan stores pictures and recordings too, not just text.",
374
- },
375
- "features.video_ingest.label": {
376
- "ko": "영상도 함께",
377
- "en": "Include videos",
378
- },
379
- "features.video_ingest.summary": {
380
- "ko": "사진·녹음을 켠 상태에서, 영상은 장면과 자막으로 저장합니다.",
381
- "en": "With the switch above on, videos are stored as keyframes and subtitles.",
382
- },
383
- "features.vault_watch.label": {
384
- "ko": "노트 보관함 지켜보기",
385
- "en": "Watch my notes vault",
386
- },
387
- "features.vault_watch.summary": {
388
- "ko": "밖에 있는 노트 보관함이 바뀌면 알아서 다시 읽어옵니다.",
389
- "en": "When an outside notes vault changes, it is re-read on its own.",
390
- },
391
- "features.brain_network.label": {
392
- "ko": "골라서 나누기",
393
- "en": "Share selected knowledge",
394
- },
395
- "features.brain_network.summary": {
396
- "ko": "내가 고른 기억 묶음만 다른 기기로 내보내고 받아올 수 있습니다.",
397
- "en": "Lets you export a hand-picked slice of memory to another device, and receive one.",
398
- },
399
- "features.brain_network.caution": {
400
- "ko": "이 기능만 기억을 이 컴퓨터 밖으로 내보냅니다. 받은 내용은 바로 합쳐지지 않고 검토함으로 갑니다.",
401
- "en": "This is the one switch that sends memory off this computer. Anything received waits in the review inbox instead of merging.",
402
- },
403
- "features.synthesis.label": {
404
- "ko": "스스로 정리하기",
405
- "en": "Tidy up on its own",
406
- },
407
- "features.synthesis.summary": {
408
- "ko": "자료가 쌓이면 알아서 훑어보고, 고칠 거리를 검토함에 제안합니다.",
409
- "en": "As material piles up, the Brain reviews it and proposes tidy-ups in the review inbox.",
410
- },
411
- "features.auto_vector_index.label": {
412
- "ko": "넣자마자 검색 준비",
413
- "en": "Make new material searchable at once",
414
- },
415
- "features.auto_vector_index.summary": {
416
- "ko": "새 자료를 넣으면 바로 의미 검색까지 준비합니다. 끄면 나중에 한 번에 만듭니다.",
417
- "en": "New material is prepared for meaning-based search immediately; off means you rebuild later.",
418
- },
419
- "features.auto_late_fusion.label": {
420
- "ko": "글로 사진 찾기",
421
- "en": "Find pictures by typing",
422
- },
423
- "features.auto_late_fusion.summary": {
424
- "ko": "글로 물어봐도 사진까지 함께 찾습니다. 사진을 읽는 모델이 있어야 켜집니다.",
425
- "en": "A typed question also searches pictures — needs a vision model that shares the same space.",
426
- },
427
- "features.fusion_rrf.label": {
428
- "ko": "검색 결과 합치는 방식 바꾸기",
429
- "en": "Blend search results by rank",
430
- },
431
- "features.fusion_rrf.summary": {
432
- "ko": "점수 대신 순위로 합칩니다. 검색 채널마다 점수 크기가 달라도 흔들리지 않습니다.",
433
- "en": "Combines channels by position instead of score, so mismatched score scales stop skewing results.",
434
- },
435
- "features.graph_expansion.label": {
436
- "ko": "옆에 있는 기억까지 보기",
437
- "en": "Look at neighbouring memories",
438
- },
439
- "features.graph_expansion.summary": {
440
- "ko": "찾은 기억과 바로 이어진 기억도 후보로 넣습니다. 답은 넓어지고 조금 흐려집니다.",
441
- "en": "Adds memories one link away from a hit as candidates — wider answers, slightly less focused.",
442
- },
443
- "features.vector_backend.label": {
444
- "ko": "의미 검색 방식",
445
- "en": "Meaning-search engine",
446
- },
447
- "features.vector_backend.summary": {
448
- "ko": "빠르기와 정확함 사이에서 고릅니다. 기본값은 전부 훑어보는 정확한 방식입니다.",
449
- "en": "Trade speed against exactness. The default compares everything and is exact.",
450
- },
451
- "features.vector_backend.choice.brute": {
452
- "ko": "전부 비교 (정확)",
453
- "en": "Compare everything (exact)",
454
- },
455
- "features.vector_backend.choice.quantized": {
456
- "ko": "간추려 비교 (빠름)",
457
- "en": "Compare compressed (faster)",
93
+ # ── common ────────────────────────────────────────────────────────
94
+ "common.file_not_found": {
95
+ "ko": '파일을 찾을 수 없습니다.',
96
+ "en": 'File not found.',
458
97
  },
459
- "features.vector_backend.choice.hnsw": {
460
- "ko": "근사 검색 (가장 빠름)",
461
- "en": "Approximate search (fastest)",
98
+ # ── models ────────────────────────────────────────────────────────
99
+ "models.download_consent_required": {
100
+ "ko": '모델 내려받기는 사용자가 직접 동의해야 시작됩니다.',
101
+ "en": 'Model downloads require explicit consent (allow_download=true).',
462
102
  },
463
- # ── models ──────────────────────────────────────────────────────────
464
- "models.other_user_credentials": {
465
- "ko": "다른 사용자의 모델 자격 증명을 사용할 수 없습니다.",
466
- "en": "You cannot use another user's model credentials.",
103
+ "models.download_not_automated": {
104
+ "ko": '{provider} 엔진의 모델 내려받기는 아직 자동화되지 않았습니다.',
105
+ "en": 'Model downloads for the {provider} engine are not automated yet.',
467
106
  },
468
- "models.download_consent_required": {
469
- "ko": "모델 내려받기는 사용자가 직접 동의해야 시작됩니다.",
470
- "en": "Model downloads require explicit consent (allow_download=true).",
107
+ "models.download_timeout": {
108
+ "ko": '모델 내려받기 시간이 초과되었습니다.',
109
+ "en": 'The model download timed out.',
471
110
  },
472
111
  "models.identifier_empty": {
473
- "ko": "모델 식별자가 비어 있습니다.",
474
- "en": "The model identifier is empty.",
112
+ "ko": '모델 식별자가 비어 있습니다.',
113
+ "en": 'The model identifier is empty.',
475
114
  },
476
115
  "models.name_empty": {
477
- "ko": "모델 이름이 비어 있습니다.",
478
- "en": "The model name is empty.",
116
+ "ko": '모델 이름이 비어 있습니다.',
117
+ "en": 'The model name is empty.',
479
118
  },
480
119
  "models.ollama_missing": {
481
- "ko": "Ollama가 설치되어 있지 않습니다.",
482
- "en": "Ollama is not installed.",
120
+ "ko": 'Ollama가 설치되어 있지 않습니다.',
121
+ "en": 'Ollama is not installed.',
483
122
  },
484
- "models.download_timeout": {
485
- "ko": "모델 내려받기 시간이 초과되었습니다.",
486
- "en": "The model download timed out.",
487
- },
488
- "models.pull_failed": {
489
- "ko": "모델 내려받기에 실패했습니다.",
490
- "en": "The model download failed.",
491
- },
492
- "models.download_not_automated": {
493
- "ko": "{provider} 엔진의 모델 내려받기는 아직 자동화되지 않았습니다.",
494
- "en": "Model downloads for the {provider} engine are not automated yet.",
495
- },
496
- "models.unknown_provider": {
497
- "ko": "알 수 없는 제공자입니다.",
498
- "en": "Unknown provider.",
499
- },
500
- "models.api_key_empty": {
501
- "ko": "API 키가 비어 있습니다.",
502
- "en": "The API key is empty.",
503
- },
504
- "models.other_user_api_key": {
505
- "ko": "다른 사용자의 API 키를 설정할 권한이 없습니다.",
506
- "en": "You are not allowed to set another user's API key.",
123
+ "models.other_user_credentials": {
124
+ "ko": '다른 사용자의 모델 자격 증명을 사용할 수 없습니다.',
125
+ "en": "You cannot use another user's model credentials.",
507
126
  },
508
- "models.sign_in_required": {
509
- "ko": "사용자 확인이 필요합니다. 로그인 후 다시 시도하세요.",
510
- "en": "Sign in first, then try again.",
127
+ "models.public_mode_blocks_local": {
128
+ "ko": '공개 모드에서는 로컬 MLX 모델을 불러올 수 없습니다. openai:, openrouter:, groq:, together: 모델을 쓰거나 LATTICEAI_ALLOW_LOCAL_MODELS=true 로 설정하세요.',
129
+ "en": 'Public mode does not load local MLX models. Use an openai:, openrouter:, groq: or together: model, or set LATTICEAI_ALLOW_LOCAL_MODELS=true.',
511
130
  },
512
- # ── tools / files ───────────────────────────────────────────────────
513
- "tools.pdf_render_failed": {
514
- "ko": "PDF를 그리지 못했습니다: {reason}",
515
- "en": "The PDF could not be rendered: {reason}",
131
+ "models.pull_failed": {
132
+ "ko": '모델 내려받기에 실패했습니다.',
133
+ "en": 'The model download failed.',
516
134
  },
135
+ # ── tools ────────────────────────────────────────────────────────
517
136
  "tools.path_outside_workspace": {
518
- "ko": "경로가 작업 공간 밖입니다.",
519
- "en": "That path is outside the workspace.",
520
- },
521
- "tools.directory_not_found": {
522
- "ko": "디렉터리를 찾을 수 없습니다.",
523
- "en": "That directory was not found.",
524
- },
525
- # ── chronicle ───────────────────────────────────────────────────────
526
- "chronicle.bad_date": {
527
- "ko": "날짜를 읽을 수 없습니다. 2026-08-11 처럼 연-월-일로 적어 주세요.",
528
- "en": "That date could not be read. Write it as year-month-day, like 2026-08-11.",
529
- },
530
- "chronicle.bad_timestamp": {
531
- "ko": "시점을 읽을 수 없습니다. 2026-08-11T09:00:00 처럼 적어 주세요.",
532
- "en": "That moment could not be read. Write it like 2026-08-11T09:00:00.",
533
- },
534
- # ── index jobs ──────────────────────────────────────────────────────
535
- "index.limit_out_of_range": {
536
- "ko": "한 번에 처리할 개수는 {min}에서 {max} 사이여야 합니다.",
537
- "en": "Ask for between {min} and {max} items in one pass.",
137
+ "ko": '경로가 작업 공간 밖입니다.',
138
+ "en": 'That path is outside the workspace.',
538
139
  },
539
- # ── AI-Worker seam (the Rust loop's three calls back into Python) ────
540
- "agent_seam.disabled": {
541
- "ko": "워커 시임이 꺼져 있습니다. 호스트가 직접 띄운 워커에서만 열립니다.",
542
- "en": "The worker seam is off. It opens only in a worker the host started itself.",
543
- },
544
- "agent_seam.message_required": {
545
- "ko": "모델에 보낼 내용을 적어주세요.",
546
- "en": "Write the message to send to the model.",
547
- },
548
- "agent_seam.max_tokens_out_of_range": {
549
- "ko": "한 번에 만들 길이는 {min}에서 {max} 사이여야 합니다.",
550
- "en": "Ask for between {min} and {max} tokens in one completion.",
551
- },
552
- "agent_seam.temperature_out_of_range": {
553
- "ko": "온도는 {min}에서 {max} 사이여야 합니다.",
554
- "en": "Temperature has to be between {min} and {max}.",
555
- },
556
- "agent_seam.tool_required": {
557
- "ko": "실행할 도구 이름이 필요합니다.",
558
- "en": "A tool name to run is required.",
559
- },
560
- "agent_seam.tool_blocked": {
561
- "ko": "'{tool}' 도구는 어떤 모드에서도 차단됩니다 ({reason}).",
562
- "en": "'{tool}' is blocked in every mode ({reason}).",
563
- },
564
- "agent_seam.tool_fail_closed": {
565
- "ko": "'{tool}' 도구는 기존 내용을 바꾸지만 검토할 수 있는 제안으로 "
566
- "만들 수 없어 차단했습니다 ({reason}).",
567
- "en": "'{tool}' would change existing content but cannot be staged as a "
568
- "reviewable proposal, so it is blocked ({reason}).",
140
+ "tools.pdf_render_failed": {
141
+ "ko": 'PDF를 그리지 못했습니다: {reason}',
142
+ "en": 'The PDF could not be rendered: {reason}',
569
143
  },
570
- "agent_seam.proposals_unavailable": {
571
- "ko": "변경 제안 서비스가 연결되어 있지 않습니다.",
572
- "en": "The change proposal service is not connected.",
144
+ # ── worker_compute ────────────────────────────────────────────────────────
145
+ "worker_compute.audio_too_large": {
146
+ "ko": '오디오가 {size} bytes 입니다. 한도는 {limit} bytes 입니다.',
147
+ "en": 'The audio is {size} bytes; the limit is {limit} bytes.',
573
148
  },
574
- # ── MCP / setup ─────────────────────────────────────────────────────
575
- "mcp.connector_not_found": {
576
- "ko": "커넥터를 찾을 수 없습니다.",
577
- "en": "That connector was not found.",
149
+ "worker_compute.audio_unsupported": {
150
+ "ko": "'{suffix}' 은(는) 지원하는 오디오 형식이 아닙니다. {allowed} 만 가능합니다.",
151
+ "en": "'{suffix}' is not a supported audio container. Supported: {allowed}.",
578
152
  },
579
- "mcp.name_required": {
580
- "ko": "이름은 필수입니다.",
581
- "en": "A name is required.",
153
+ "worker_compute.content_invalid": {
154
+ "ko": '본문을 base64로 읽지 못했습니다: {reason}',
155
+ "en": 'The payload is not valid base64: {reason}',
582
156
  },
583
- "mcp.package_required": {
584
- "ko": "패키지는 필수입니다.",
585
- "en": "A package is required.",
157
+ "worker_compute.embedder_unavailable": {
158
+ "ko": '임베딩 공급자가 연결되어 있지 않습니다.',
159
+ "en": 'No embedding provider is connected to this worker.',
586
160
  },
587
- "mcp.item_not_found": {
588
- "ko": "항목을 찾을 수 없습니다.",
589
- "en": "That item was not found.",
161
+ "worker_compute.extract_kind_invalid": {
162
+ "ko": "'{kind}' 은(는) 추출 종류가 아닙니다. {allowed} 중 하나여야 합니다.",
163
+ "en": "'{kind}' is not an extraction kind. Use one of {allowed}.",
590
164
  },
591
- "mcp.unknown_id": {
592
- "ko": "알 수 없는 MCP입니다: {mcp_id}",
593
- "en": "Unknown MCP: {mcp_id}",
165
+ "worker_compute.kind_invalid": {
166
+ "ko": "'{kind}' 은(는) 임베딩 종류가 아닙니다. {allowed} 중 하나여야 합니다.",
167
+ "en": "'{kind}' is not an embedding kind. Use one of {allowed}.",
594
168
  },
595
- "setup.unknown_permission": {
596
- "ko": "알 수 없는 권한 설정입니다.",
597
- "en": "Unknown permission setting.",
169
+ "worker_compute.parse_failed": {
170
+ "ko": '문서를 읽지 못했습니다: {reason}',
171
+ "en": 'The document could not be parsed: {reason}',
598
172
  },
599
- "models.public_mode_blocks_local": {
600
- "ko": (
601
- "공개 모드에서는 로컬 MLX 모델을 불러올 수 없습니다. "
602
- "openai:, openrouter:, groq:, together: 모델을 쓰거나 "
603
- "LATTICEAI_ALLOW_LOCAL_MODELS=true 로 설정하세요."
604
- ),
605
- "en": (
606
- "Public mode does not load local MLX models. Use an openai:, "
607
- "openrouter:, groq: or together: model, or set "
608
- "LATTICEAI_ALLOW_LOCAL_MODELS=true."
609
- ),
173
+ "worker_compute.render_failed": {
174
+ "ko": "'{kind}' 문서 생성이 실패했습니다: {reason}",
175
+ "en": "Rendering the '{kind}' document failed: {reason}",
610
176
  },
611
- "models.public_model_missing": {
612
- "ko": (
613
- "공개 모델이 준비되지 않았습니다. OPENAI_API_KEY 와 "
614
- "LATTICEAI_PUBLIC_MODEL={model} 을 설정하거나, OpenAI 호환 모델로 "
615
- "/models/load 를 호출하세요."
616
- ),
617
- "en": (
618
- "No public model is loaded. Set OPENAI_API_KEY and "
619
- "LATTICEAI_PUBLIC_MODEL={model}, or call /models/load with an "
620
- "OpenAI-compatible model."
621
- ),
177
+ "worker_compute.render_unavailable": {
178
+ "ko": "이 워커는 '{kind}' 문서를 만들 수 없습니다: {reason}",
179
+ "en": "This worker cannot render '{kind}' documents: {reason}",
622
180
  },
623
181
  }
624
182