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,355 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Synthetic Knowledge Graph performance / memory profiler.
3
-
4
- Builds a synthetic knowledge graph against a throwaway SQLite path using the
5
- real ``KnowledgeGraphStore`` API (the same construction pattern the unit tests
6
- use: ``KnowledgeGraphStore(db_path, blob_dir)``), then measures wall-time
7
- percentiles (p50/p95) and tracemalloc peak memory for the hot read/write paths:
8
-
9
- * ``ingest_source()`` — ingestion throughput (items/sec)
10
- * ``search()`` — FTS5/LIKE keyword search
11
- * ``context_for_query()`` — RAG context assembly
12
- * ``neighbors()`` / ``traverse()`` — 1-hop and depth-2 graph walks
13
- * ``stats()`` — aggregate counters
14
- * ``rebuild_vector_index()`` / ``vector_search()`` — offline hash-embedder
15
- vector path (skipped gracefully if the vector path is unavailable)
16
-
17
- Everything runs offline: no model downloads, no network, no LLM router — the
18
- concept/triple extractors fall back to their rule-based paths and the default
19
- embedder is the deterministic local hash model.
20
-
21
- Honesty note: this is a *synthetic* baseline. Corpus text is generated from a
22
- fixed vocabulary, so extraction density and FTS selectivity differ from real
23
- user data. Timings include tracemalloc instrumentation overhead (allocation
24
- tracking roughly doubles Python allocation cost), so treat absolute numbers as
25
- upper bounds and use them for release-over-release comparison, not marketing.
26
-
27
- Usage::
28
-
29
- python scripts/profile_kg.py # 5000 sources, 50 queries (~2-2.5 min)
30
- python scripts/profile_kg.py --nodes 500 # quick run (~10 s)
31
- python scripts/profile_kg.py --json # machine-readable output
32
- python scripts/profile_kg.py --db-path /tmp/kg # keep the DB around
33
- """
34
-
35
- from __future__ import annotations
36
-
37
- import argparse
38
- import json
39
- import random
40
- import statistics
41
- import sys
42
- import tempfile
43
- import time
44
- import tracemalloc
45
- from pathlib import Path
46
- from typing import Any, Callable, Dict, List, Optional
47
-
48
- ROOT = Path(__file__).resolve().parent.parent
49
- if str(ROOT) not in sys.path:
50
- sys.path.insert(0, str(ROOT))
51
-
52
- from lattice_brain.graph.store import KnowledgeGraphStore # noqa: E402
53
-
54
- # ── Synthetic corpus ─────────────────────────────────────────────────────────
55
- # Recurring entities so concept nodes are shared across documents and edges
56
- # actually form; a Korean slice exercises the FTS5 trigram path.
57
- ENTITIES = [
58
- "Lattice", "GraphStore", "Kubernetes", "Postgres", "FastAPI", "SQLite",
59
- "Telegram", "MLX", "Embedding", "Pipeline", "Workspace", "Provenance",
60
- "Scheduler", "Retrieval", "Ingestion", "Router", "Registry", "Backup",
61
- ]
62
- FILLER = ["the", "service", "processes", "requests", "and", "stores", "results", "in", "the", "database", "while", "the", "worker", "retries", "failed", "jobs", "and", "reports", "metrics", "to", "the", "dashboard", "for", "the", "on-call", "engineer", "to", "review", "during", "the", "incident"]
63
- KOREAN = ["프로젝트", "일정", "회의", "결정", "지식그래프", "검색", "성능", "메모리"]
64
-
65
-
66
- def _make_text(rng: random.Random, size: str) -> str:
67
- lengths = {"small": 40, "medium": 160, "large": 520} # words
68
- words: List[str] = []
69
- target = lengths[size]
70
- while len(words) < target:
71
- words.extend(rng.sample(FILLER, k=min(8, target - len(words))))
72
- if rng.random() < 0.6:
73
- words.append(rng.choice(ENTITIES))
74
- if rng.random() < 0.25:
75
- words.append(rng.choice(KOREAN))
76
- if rng.random() < 0.1:
77
- words.append(f"{rng.choice(ENTITIES)} improves {rng.choice(ENTITIES)}.")
78
- return " ".join(words)
79
-
80
-
81
- def _pick_size(rng: random.Random) -> str:
82
- r = rng.random()
83
- if r < 0.6:
84
- return "small"
85
- if r < 0.9:
86
- return "medium"
87
- return "large"
88
-
89
-
90
- # ── Measurement helpers ──────────────────────────────────────────────────────
91
- def _percentiles(samples_s: List[float]) -> Dict[str, float]:
92
- if not samples_s:
93
- return {"p50_ms": 0.0, "p95_ms": 0.0, "mean_ms": 0.0}
94
- ordered = sorted(samples_s)
95
-
96
- def q(p: float) -> float:
97
- idx = min(len(ordered) - 1, max(0, round(p * (len(ordered) - 1))))
98
- return ordered[idx]
99
-
100
- return {
101
- "p50_ms": round(q(0.50) * 1000, 3),
102
- "p95_ms": round(q(0.95) * 1000, 3),
103
- "mean_ms": round(statistics.fmean(ordered) * 1000, 3),
104
- }
105
-
106
-
107
- def _timed_phase(fn: Callable[[], List[float]]) -> Dict[str, Any]:
108
- """Run one phase; return sample percentiles + phase peak memory."""
109
- tracemalloc.reset_peak()
110
- wall_start = time.perf_counter()
111
- samples = fn()
112
- wall = time.perf_counter() - wall_start
113
- _, peak = tracemalloc.get_traced_memory()
114
- result = _percentiles(samples)
115
- result.update(
116
- {
117
- "calls": len(samples),
118
- "wall_s": round(wall, 3),
119
- "peak_mem_mb": round(peak / (1024 * 1024), 2),
120
- }
121
- )
122
- return result
123
-
124
-
125
- # ── Profiler ─────────────────────────────────────────────────────────────────
126
- def run_profile(
127
- nodes: int,
128
- queries: int,
129
- db_path: Optional[Path],
130
- seed: int = 42,
131
- ) -> Dict[str, Any]:
132
- rng = random.Random(seed) # noqa: S311 — synthetic profiling data, not a secret
133
- tmp_ctx = None
134
- if db_path is None:
135
- tmp_ctx = tempfile.TemporaryDirectory(prefix="ltcai-profile-kg-")
136
- base = Path(tmp_ctx.name)
137
- else:
138
- base = Path(db_path)
139
- base.mkdir(parents=True, exist_ok=True)
140
-
141
- report: Dict[str, Any] = {
142
- "schema_version": "kg-profile/v1",
143
- "params": {"nodes": nodes, "queries": queries, "seed": seed,
144
- "db_path": str(base), "ephemeral": tmp_ctx is not None},
145
- "phases": {},
146
- "notes": [],
147
- }
148
-
149
- tracemalloc.start()
150
- try:
151
- store = KnowledgeGraphStore(base / "graph.sqlite", base / "blobs")
152
- report["fts_enabled"] = bool(getattr(store, "_fts_enabled", False))
153
-
154
- # Phase 1: ingestion ------------------------------------------------
155
- doc_ids: List[str] = []
156
- char_total = 0
157
-
158
- def _ingest() -> List[float]:
159
- nonlocal char_total
160
- samples: List[float] = []
161
- for i in range(nodes):
162
- size = _pick_size(rng)
163
- text = _make_text(rng, size)
164
- char_total += len(text)
165
- t0 = time.perf_counter()
166
- result = store.ingest_source(
167
- source_type="note",
168
- title=f"Synthetic note {i} {rng.choice(ENTITIES)}",
169
- text=text,
170
- source_uri=f"synthetic://note/{i}",
171
- owner="profiler@example.com",
172
- )
173
- samples.append(time.perf_counter() - t0)
174
- doc_ids.append(result["node_id"])
175
- return samples
176
-
177
- ingest = _timed_phase(_ingest)
178
- ingest["items_per_sec"] = round(nodes / ingest["wall_s"], 1) if ingest["wall_s"] else 0.0
179
- ingest["corpus_chars"] = char_total
180
- report["phases"]["ingest_source"] = ingest
181
-
182
- # Query terms: mix entity names, Korean tokens, and rare misses.
183
- terms = [rng.choice(ENTITIES + KOREAN) for _ in range(max(1, queries))]
184
- for i in range(0, len(terms), 10):
185
- terms[i] = f"missing-term-{i}" # cache-unfriendly misses
186
-
187
- # Phase 2: search ----------------------------------------------------
188
- def _search() -> List[float]:
189
- samples = []
190
- for term in terms:
191
- t0 = time.perf_counter()
192
- store.search(term, limit=30)
193
- samples.append(time.perf_counter() - t0)
194
- return samples
195
-
196
- report["phases"]["search"] = _timed_phase(_search)
197
-
198
- # Phase 3: context_for_query ----------------------------------------
199
- def _context() -> List[float]:
200
- samples = []
201
- for term in terms:
202
- t0 = time.perf_counter()
203
- store.context_for_query(term, limit=6)
204
- samples.append(time.perf_counter() - t0)
205
- return samples
206
-
207
- report["phases"]["context_for_query"] = _timed_phase(_context)
208
-
209
- # Phase 4: neighbors / traverse -------------------------------------
210
- sample_ids = rng.sample(doc_ids, k=min(len(doc_ids), max(1, queries)))
211
-
212
- def _neighbors() -> List[float]:
213
- samples = []
214
- for node_id in sample_ids:
215
- t0 = time.perf_counter()
216
- store.neighbors(node_id)
217
- samples.append(time.perf_counter() - t0)
218
- return samples
219
-
220
- report["phases"]["neighbors"] = _timed_phase(_neighbors)
221
-
222
- def _traverse() -> List[float]:
223
- samples = []
224
- for node_id in sample_ids:
225
- t0 = time.perf_counter()
226
- store.traverse(node_id, depth=2, limit=100)
227
- samples.append(time.perf_counter() - t0)
228
- return samples
229
-
230
- report["phases"]["traverse_depth2"] = _timed_phase(_traverse)
231
-
232
- # Phase 5: stats -----------------------------------------------------
233
- def _stats() -> List[float]:
234
- samples = []
235
- for _ in range(5):
236
- t0 = time.perf_counter()
237
- store.stats()
238
- samples.append(time.perf_counter() - t0)
239
- return samples
240
-
241
- report["phases"]["stats"] = _timed_phase(_stats)
242
- graph_stats = store.stats()
243
- node_counts = graph_stats.get("nodes") or {}
244
- edge_counts = graph_stats.get("edges") or {}
245
- report["graph"] = {
246
- "nodes_total": sum(node_counts.values()) if isinstance(node_counts, dict) else node_counts,
247
- "edges_total": sum(edge_counts.values()) if isinstance(edge_counts, dict) else edge_counts,
248
- "by_node_type": node_counts if isinstance(node_counts, dict) else None,
249
- }
250
-
251
- # Phase 6: vector index (offline hash embedder) ----------------------
252
- try:
253
- def _vector_build() -> List[float]:
254
- t0 = time.perf_counter()
255
- store.rebuild_vector_index(full=True, include_nodes=True, include_chunks=True)
256
- return [time.perf_counter() - t0]
257
-
258
- report["phases"]["rebuild_vector_index"] = _timed_phase(_vector_build)
259
-
260
- # vector_search is a brute-force scan over all stored embeddings
261
- # (O(index size) per query); cap the query count so the default
262
- # profile stays inside its time budget while still sampling p50/p95.
263
- vector_terms = terms[: min(len(terms), 10)]
264
-
265
- def _vector_search() -> List[float]:
266
- samples = []
267
- for term in vector_terms:
268
- t0 = time.perf_counter()
269
- store.vector_search(term, limit=30)
270
- samples.append(time.perf_counter() - t0)
271
- return samples
272
-
273
- report["phases"]["vector_search"] = _timed_phase(_vector_search)
274
- report["notes"].append(
275
- "Vector phase uses the built-in deterministic hash embedder "
276
- "(offline); real embedding providers will be slower to index "
277
- "but produce semantically meaningful rankings."
278
- )
279
- except Exception as exc: # pragma: no cover - environment dependent
280
- report["phases"]["vector"] = {"skipped": True, "reason": str(exc)[:200]}
281
- report["notes"].append(
282
- "Vector phase skipped: the vector path was unavailable in this "
283
- "environment (no embedding provider required for the rest of "
284
- "the profile)."
285
- )
286
-
287
- current, overall_peak = tracemalloc.get_traced_memory()
288
- report["memory"] = {
289
- "tracemalloc_current_mb": round(current / (1024 * 1024), 2),
290
- "phase_peaks_are_reset_per_phase": True,
291
- }
292
- report["db_size_mb"] = round((base / "graph.sqlite").stat().st_size / (1024 * 1024), 2)
293
- report["notes"].append(
294
- "Synthetic baseline: fixed-vocabulary corpus, rule-based extraction, "
295
- "tracemalloc enabled for the whole run (adds allocation-tracking "
296
- "overhead to every timing)."
297
- )
298
- finally:
299
- tracemalloc.stop()
300
- if tmp_ctx is not None:
301
- tmp_ctx.cleanup()
302
-
303
- return report
304
-
305
-
306
- def _print_report(report: Dict[str, Any]) -> None:
307
- p = report["params"]
308
- print("Knowledge Graph synthetic profile")
309
- print(f" sources={p['nodes']} queries={p['queries']} seed={p['seed']}")
310
- print(f" db={p['db_path']} ephemeral={p['ephemeral']} fts_enabled={report.get('fts_enabled')}")
311
- graph = report.get("graph") or {}
312
- print(f" graph: nodes={graph.get('nodes_total')} edges={graph.get('edges_total')} db_size={report.get('db_size_mb')} MB")
313
- print()
314
- header = f" {'phase':<22}{'calls':>6}{'p50 ms':>10}{'p95 ms':>10}{'mean ms':>10}{'wall s':>9}{'peak MB':>9}"
315
- print(header)
316
- print(" " + "-" * (len(header) - 2))
317
- for name, phase in report["phases"].items():
318
- if phase.get("skipped"):
319
- print(f" {name:<22} skipped: {phase.get('reason', '')}")
320
- continue
321
- print(
322
- f" {name:<22}{phase['calls']:>6}{phase['p50_ms']:>10}{phase['p95_ms']:>10}"
323
- f"{phase['mean_ms']:>10}{phase['wall_s']:>9}{phase['peak_mem_mb']:>9}"
324
- )
325
- if "items_per_sec" in phase:
326
- print(f" {'':<22} throughput: {phase['items_per_sec']} items/sec corpus: {phase['corpus_chars']} chars")
327
- print()
328
- for note in report.get("notes", []):
329
- print(f" note: {note}")
330
-
331
-
332
- def main(argv: Optional[List[str]] = None) -> int:
333
- parser = argparse.ArgumentParser(description="Profile KnowledgeGraphStore on a synthetic corpus (offline).")
334
- parser.add_argument("--nodes", type=int, default=5000, help="synthetic sources to ingest (default: 5000)")
335
- parser.add_argument("--queries", type=int, default=50, help="queries per read phase (default: 50)")
336
- parser.add_argument("--db-path", type=Path, default=None, help="directory for the profile DB (default: temp dir, auto-removed)")
337
- parser.add_argument("--json", action="store_true", help="emit the full report as JSON")
338
- parser.add_argument("--seed", type=int, default=42, help="corpus RNG seed (default: 42)")
339
- args = parser.parse_args(argv)
340
-
341
- if args.nodes < 1 or args.nodes > 200_000:
342
- parser.error("--nodes must be between 1 and 200000")
343
- if args.queries < 1 or args.queries > 10_000:
344
- parser.error("--queries must be between 1 and 10000")
345
-
346
- report = run_profile(args.nodes, args.queries, args.db_path, seed=args.seed)
347
- if args.json:
348
- print(json.dumps(report, ensure_ascii=False, indent=2))
349
- else:
350
- _print_report(report)
351
- return 0
352
-
353
-
354
- if __name__ == "__main__":
355
- raise SystemExit(main())
package/server.py DELETED
@@ -1,30 +0,0 @@
1
- """Thin compatibility entrypoint for the Lattice AI FastAPI app.
2
-
3
- The application is built by ``latticeai.app_factory.create_app``; this module
4
- keeps the historical ``server:app`` import path used by uvicorn, Docker, CLI
5
- scripts, and older tests. Attribute access is proxied lazily so that simply
6
- importing ``server`` performs no construction — ``uvicorn server:app`` (or
7
- ``from server import app``) triggers the factory on first access.
8
- """
9
-
10
- from __future__ import annotations
11
-
12
- from typing import Any, List
13
-
14
- from latticeai import server_app as _server_app
15
-
16
-
17
- def __getattr__(name: str) -> Any:
18
- return getattr(_server_app, name)
19
-
20
-
21
- def __dir__() -> List[str]:
22
- return sorted(set(globals()) | set(dir(_server_app)))
23
-
24
-
25
- def main() -> None:
26
- _server_app.main()
27
-
28
-
29
- if __name__ == "__main__":
30
- main()
@@ -1 +0,0 @@
1
- import{C as e,_ as t,b as n,d as r,m as i,o as a,t as o,v as s,x as c}from"./utils-Ddol2RWD.js";import{r as l,t as u}from"./useQuery-CY2OI2uy.js";import{t as d}from"./useMutation-CSn9t1op.js";import{t as f}from"./arrow-left-kfsrk0mv.js";import{t as p}from"./search-BcHqkjoy.js";import{a as m,d as h,u as g}from"./index-BMPdTmlY.js";import{t as _}from"./button-aTn4s84A.js";import"./workspace-BqDwOz_p.js";var v=t(`list-filter`,[[`path`,{d:`M2 5h20`,key:`1fs1ex`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`path`,{d:`M9 19h6`,key:`456am0`}]]),y=e(c()),b=n();function x({onBack:e}){let t=l(),n=s(e=>e.language),[a,c]=y.useState({q:``,actor:``,action:``,severity:``,limit:50}),{summaryQ:u,statsQ:p,usersQ:v,auditQ:x,securityQ:M,securityEventsQ:N,policiesQ:P,rolesQ:F,retentionQ:I,indexQ:L,agentRuntimeQ:R,toolRegistryQ:z,healthSummaryQ:B}=S(a),V=d({mutationFn:r.rebuildIndex,onSuccess:()=>void t.invalidateQueries({queryKey:[`indexStatus`]})}),H=o(v.data?.data),U=o(x.data?.data?.recent_events),W=o(N.data?.data?.events),G=o(P.data?.data?.policies),K=o(F.data?.data?.roles),q=I.data?.data||{},J=B.data?.data||B.data,Y=J?.status===`attention`||typeof J?.issue_count==`number`&&J.issue_count>0;return(0,b.jsxs)(`main`,{className:`admin-console`,"aria-label":i(n,`admin.aria.console`),children:[(0,b.jsxs)(`header`,{className:`admin-console-header`,children:[(0,b.jsxs)(`button`,{className:`admin-back-button`,type:`button`,onClick:e,children:[(0,b.jsx)(f,{className:`h-4 w-4`}),i(n,`admin.back`)]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{children:i(n,`admin.kicker`)}),(0,b.jsx)(`h1`,{children:i(n,`admin.title`)}),(0,b.jsx)(`p`,{children:i(n,`admin.body`)})]}),(0,b.jsx)(m,{compact:!0})]}),(0,b.jsxs)(`section`,{className:`admin-metrics-statement px-4 py-3 border border-border/40 rounded-lg bg-muted/25 text-sm text-muted-foreground flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2`,"aria-label":i(n,`admin.overview`),children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2 font-medium text-foreground`,children:[(0,b.jsx)(g,{className:`h-4 w-4 ${Y?`text-amber-500`:`text-emerald-500`}`}),(0,b.jsx)(`span`,{children:Y?i(n,`admin.health.attention`,{count:String(J?.issue_count||1)}):i(n,`admin.health.ok`)})]}),(0,b.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:i(n,`admin.summaryStatement`,{users:H.length,logs:U.length+W.length,security:O(M.data?.data,`status`)||(M.data?.ok?i(n,`admin.status.ready`):i(n,`admin.status.unavailable`)),index:O(L.data?.data,`status`)||(L.data?.ok?i(n,`admin.status.indexed`):i(n,`admin.status.unknown`))})})]}),(0,b.jsxs)(`section`,{className:`admin-accordion-list flex flex-col gap-4 mt-4`,children:[(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,open:!0,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.users`),` · `,i(n,`admin.panel.people`)]})}),(0,b.jsx)(T,{title:i(n,`admin.panel.users`),eyebrow:i(n,`admin.panel.people`),children:(0,b.jsx)(E,{items:H.slice(0,8),empty:i(n,`admin.empty.users`),render:e=>{let t=e;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`strong`,{children:j(t.name||t.email||t.id,i(n,`admin.fallback.localUser`))}),(0,b.jsx)(`span`,{children:j(t.role||t.status||t.workspace_id,i(n,`admin.fallback.member`))})]})}})})]}),(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.roles`),` · `,i(n,`admin.panel.access`)]})}),(0,b.jsx)(T,{title:i(n,`admin.panel.roles`),eyebrow:i(n,`admin.panel.access`),children:(0,b.jsx)(E,{items:K.slice(0,6),empty:i(n,`admin.empty.roles`),render:e=>{let t=e;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`strong`,{children:[j(t.role,i(n,`admin.fallback.role`)),` · `,j(t.members,`0`),` `,i(n,`admin.metric.users`)]}),(0,b.jsx)(`span`,{children:o(t.caps).slice(0,4).map(e=>j(e,``)).filter(Boolean).join(`, `)||i(n,`admin.fallback.noCaps`)})]})}})})]}),(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.logs`),` · `,i(n,`admin.panel.audit`)]})}),(0,b.jsxs)(T,{title:i(n,`admin.panel.logs`),eyebrow:i(n,`admin.panel.audit`),children:[(0,b.jsx)(w,{language:n,filters:a,onChange:c,matched:x.data?.data?.filters}),(0,b.jsx)(E,{items:U.slice(0,8),empty:i(n,`admin.empty.audit`),render:e=>D(e,n)})]})]}),(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.securityEvents`),` · `,i(n,`admin.panel.protection`)]})}),(0,b.jsx)(T,{title:i(n,`admin.panel.securityEvents`),eyebrow:i(n,`admin.panel.protection`),children:(0,b.jsx)(E,{items:W.slice(0,8),empty:i(n,`admin.empty.security`),render:e=>D(e,n)})})]}),(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.brainOps`),` · `,i(n,`admin.panel.maintenance`)]})}),(0,b.jsxs)(T,{title:i(n,`admin.panel.brainOps`),eyebrow:i(n,`admin.panel.maintenance`),children:[(0,b.jsxs)(`div`,{className:`admin-operation`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`strong`,{children:k(L.data?.data,n)}),(0,b.jsx)(`span`,{children:A(u.data?.data)||A(p.data?.data)||i(n,`admin.brain.summaryFallback`)})]}),(0,b.jsxs)(_,{variant:`outline`,size:`sm`,disabled:V.isPending,onClick:()=>V.mutate(),children:[(0,b.jsx)(h,{className:`h-3.5 w-3.5`}),V.isPending?i(n,`admin.brain.rebuilding`):i(n,`admin.brain.rebuild`)]})]}),(0,b.jsxs)(`div`,{className:`admin-policy-strip`,children:[G.slice(0,5).map((e,t)=>{let r=e;return(0,b.jsx)(`span`,{children:j(r.label||r.name||r.id,i(n,`admin.policy.fallback`))},`${j(r.id||r.name,`policy`)}-${t}`)}),G.length?null:(0,b.jsx)(`span`,{children:i(n,`admin.policy.quiet`)})]}),(0,b.jsxs)(`div`,{className:`admin-retention`,children:[(0,b.jsx)(`strong`,{children:i(n,`admin.retention.days`,{days:j(q.retention_days,`90`)})}),(0,b.jsx)(`span`,{children:i(n,`admin.retention.detail`,{events:j(q.retained_events,`0`),candidates:j(q.prune_candidates,`0`)})})]})]})]}),(0,b.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,b.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,b.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[i(n,`admin.panel.runtimeTrust`),` · `,i(n,`admin.panel.contracts`)]})}),(0,b.jsx)(T,{title:i(n,`admin.panel.runtimeTrust`),eyebrow:i(n,`admin.panel.contracts`),children:(0,b.jsx)(C,{runtime:R.data?.data,registry:z.data?.data,language:n})})]})]})]})}function S(e){let t=y.useMemo(()=>({q:e.q||void 0,actor:e.actor||void 0,action:e.action||void 0,severity:e.severity||void 0,limit:e.limit}),[e]);return{summaryQ:u({queryKey:[`adminSummary`],queryFn:r.adminSummary}),statsQ:u({queryKey:[`adminStats`],queryFn:r.adminStats}),usersQ:u({queryKey:[`adminUsers`],queryFn:r.adminUsers}),auditQ:u({queryKey:[`adminAudit`,t],queryFn:()=>r.adminAudit(t)}),securityQ:u({queryKey:[`adminSecurity`],queryFn:r.adminSecurity}),securityEventsQ:u({queryKey:[`adminSecurityEvents`],queryFn:()=>r.adminSecurityEvents(50)}),policiesQ:u({queryKey:[`adminPolicies`],queryFn:r.adminPolicies}),rolesQ:u({queryKey:[`adminRoles`],queryFn:r.adminRoles}),retentionQ:u({queryKey:[`adminLogRetention`],queryFn:r.adminLogRetention}),indexQ:u({queryKey:[`indexStatus`],queryFn:r.indexStatus}),agentRuntimeQ:u({queryKey:[`agentRuntime`],queryFn:r.agentRuntime}),toolRegistryQ:u({queryKey:[`toolRegistryDiagnostics`],queryFn:r.toolRegistryDiagnostics}),healthSummaryQ:u({queryKey:[`adminHealthSummary`],queryFn:r.adminHealthSummary})}}function C({runtime:e,registry:t,language:n}){let r=e?.runtime||{},a=e?.health||{},o=t?.diagnostics||{},s=!!r.ready,c=!!o.ready,l=j(r.unavailable_reason,s?i(n,`admin.runtime.readyDetail`):i(n,`admin.runtime.blockedFallback`));return(0,b.jsxs)(`div`,{className:`admin-runtime-trust`,children:[(0,b.jsxs)(`div`,{className:`admin-runtime-row`,children:[(0,b.jsx)(`strong`,{children:i(n,`admin.runtime.agent`)}),(0,b.jsx)(`span`,{className:s?`is-ok`:`is-warn`,children:s?i(n,`admin.status.ready`):i(n,`admin.status.unavailable`)}),(0,b.jsx)(`small`,{children:l})]}),(0,b.jsxs)(`div`,{className:`admin-runtime-row`,children:[(0,b.jsx)(`strong`,{children:i(n,`admin.runtime.tools`)}),(0,b.jsx)(`span`,{className:c?`is-ok`:`is-warn`,children:c?i(n,`admin.runtime.aligned`):i(n,`admin.runtime.drift`)}),(0,b.jsx)(`small`,{children:i(n,`admin.runtime.toolCounts`,{registered:j(o.registered_tools,`0`),governed:j(o.governed_tools,`0`),described:j(o.described_tools,`0`)})})]}),(0,b.jsxs)(`div`,{className:`admin-policy-strip`,children:[(0,b.jsx)(`span`,{children:i(n,`admin.runtime.mode`,{mode:j(r.mode,`unknown`)})}),(0,b.jsx)(`span`,{children:i(n,`admin.runtime.execution`,{mode:j(r.execution_mode,`unknown`)})}),(0,b.jsx)(`span`,{children:i(n,`admin.runtime.health`,{status:j(a.status,`unknown`)})})]})]})}function w({filters:e,matched:t,onChange:n,language:r}){return(0,b.jsxs)(`div`,{className:`admin-log-filters`,"aria-label":i(r,`admin.filters.label`),children:[(0,b.jsxs)(`label`,{children:[(0,b.jsx)(p,{className:`h-3.5 w-3.5`}),(0,b.jsx)(`input`,{value:e.q,onChange:e=>n(t=>({...t,q:e.target.value})),placeholder:i(r,`admin.filters.search`),"aria-label":i(r,`admin.filters.searchAria`)})]}),(0,b.jsxs)(`label`,{children:[(0,b.jsx)(v,{className:`h-3.5 w-3.5`}),(0,b.jsxs)(`select`,{value:e.severity,onChange:e=>n(t=>({...t,severity:e.target.value})),"aria-label":i(r,`admin.filters.severityAria`),children:[(0,b.jsx)(`option`,{value:``,children:i(r,`admin.filters.all`)}),(0,b.jsx)(`option`,{value:`informational`,children:i(r,`admin.filters.informational`)}),(0,b.jsx)(`option`,{value:`notice`,children:i(r,`admin.filters.notice`)}),(0,b.jsx)(`option`,{value:`warning`,children:i(r,`admin.filters.warning`)}),(0,b.jsx)(`option`,{value:`high`,children:i(r,`admin.filters.high`)})]})]}),(0,b.jsx)(`span`,{children:i(r,`admin.filters.matched`,{count:j(t?.matched_events,`0`)})})]})}function T({eyebrow:e,title:t,children:n}){return(0,b.jsxs)(`section`,{className:`admin-panel`,children:[(0,b.jsxs)(`div`,{className:`admin-panel-head`,children:[(0,b.jsx)(`span`,{children:e}),(0,b.jsx)(`h2`,{children:t})]}),n]})}function E({items:e,empty:t,render:n}){return e.length?(0,b.jsx)(`div`,{className:`admin-list`,children:e.map((e,t)=>(0,b.jsx)(`div`,{className:`admin-list-row`,children:n(e)},t))}):(0,b.jsx)(`div`,{className:`admin-empty`,children:t})}function D(e,t){let n=j(e.action||e.event||e.type||e.name,i(t,`admin.log.event`)),r=j(e.actor||e.user||e.user_id||e.workspace_id,i(t,`admin.log.system`)),a=j(e.timestamp||e.time||e.created_at||e.ts,i(t,`admin.log.recently`));return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`strong`,{children:n}),(0,b.jsxs)(`span`,{children:[r,` · `,a]})]})}function O(e,t){return M(a(e)?e:{},[t,`health`,`state`,`overall_status`])}function k(e,t){let n=a(e)?e:{},r=n.documents??n.document_count??n.docs,o=n.chunks??n.chunk_count??n.vectors;return r!==void 0||o!==void 0?`${j(r,`0`)} docs · ${j(o,`0`)} chunks`:M(n,[`message`,`detail`,`status`],i(t,`admin.index.ready`))}function A(e){return M(a(e)?e:{},[`summary`,`message`,`status`,`detail`])}function j(e,t=``){return typeof e==`string`&&e.trim()?e:typeof e==`number`&&Number.isFinite(e)?String(e):typeof e==`boolean`?e?`true`:`false`:t}function M(e,t,n=``){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t;if(typeof t==`number`&&Number.isFinite(t))return String(t)}return n}export{x as AdminConsole};
@@ -1 +0,0 @@
1
- import{C as e,_ as t,b as n,d as r,i,m as a,o,t as s,v as c,x as l}from"./utils-Ddol2RWD.js";import{r as u,t as d}from"./useQuery-CY2OI2uy.js";import{t as f}from"./useMutation-CSn9t1op.js";import{_ as p,b as m,c as h,g,h as _,i as v,m as y,n as b,p as x,t as S,u as C,v as w,x as T,y as E}from"./primitives-SNp0LRJz.js";import{t as ee}from"./circle-check-qqLug9nU.js";import{n as D,r as O,t as k}from"./hard-drive-DkA3zBW_.js";import{t as A}from"./folder-open-kk2Xa52u.js";import{t as j}from"./share-2-BsrxFglO.js";import{d as M,i as N}from"./index-BMPdTmlY.js";import{t as P}from"./button-aTn4s84A.js";import{t as F}from"./input-B0nRf2jO.js";import"./workspace-BqDwOz_p.js";var I=t(`clipboard-paste`,[[`path`,{d:`M11 14h10`,key:`1w8e9d`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v1.344`,key:`1e62lh`}],[`path`,{d:`m17 18 4-4-4-4`,key:`z2g111`}],[`path`,{d:`M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113`,key:`bjbb7m`}],[`rect`,{x:`8`,y:`2`,width:`8`,height:`4`,rx:`1`,key:`ublpy`}]]),L=t(`scan-line`,[[`path`,{d:`M3 7V5a2 2 0 0 1 2-2h2`,key:`aa7l1z`}],[`path`,{d:`M17 3h2a2 2 0 0 1 2 2v2`,key:`4qcy5o`}],[`path`,{d:`M21 17v2a2 2 0 0 1-2 2h-2`,key:`6vwrx8`}],[`path`,{d:`M7 21H5a2 2 0 0 1-2-2v-2`,key:`ioqczr`}],[`path`,{d:`M7 12h10`,key:`b7w52i`}]]),R=t(`upload`,[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]),z=e(l()),B=n();function V(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return``}function H(e,t){let n=Number(e[t]);return Number.isFinite(n)&&n>0?Math.round(n):0}function U(e){let t=o(e)?e:{},n=o(t.vector_freshness_global)?t.vector_freshness_global:{};return{vectorStatus:V(n,[`status`])||`unavailable`,vectorPending:H(n,`pending_items`),folders:s(t.folders).flatMap(e=>{let t=o(e)?e:{},n=V(t,[`id`]);if(!n)return[];let r=o(t.files)?t.files:{},i=t.coverage;return[{id:n,label:V(t,[`label`,`root_path`])||n,status:V(t,[`status`]),watchActive:t.watch_active===!0,total:H(r,`total`),indexed:H(r,`indexed`),failed:H(r,`failed`),coverage:typeof i==`number`&&Number.isFinite(i)?i:null,errors:s(t.recent_errors).flatMap(e=>{let t=o(e)?e:{},n=V(t,[`detail`]);return n?[{path:V(t,[`path`]),detail:n}]:[]})}]})}}function W({language:e}){let t=d({queryKey:[`folderMemoryHealth`],queryFn:()=>r.localFolderHealth(),staleTime:3e4}),n=z.useMemo(()=>t.data?.ok?U(t.data.data):null,[t.data]);return!n||!n.folders.length?null:(0,B.jsxs)(`section`,{className:`folder-memory-health`,"data-testid":`folder-memory-health`,children:[(0,B.jsx)(`h3`,{children:a(e,`capture.folderHealth.title`)}),(0,B.jsx)(`ul`,{children:n.folders.map(t=>(0,B.jsxs)(`li`,{"data-testid":`folder-health-${t.id}`,children:[(0,B.jsxs)(`div`,{className:`folder-memory-head`,children:[(0,B.jsx)(`strong`,{children:t.label}),(0,B.jsx)(`span`,{className:`folder-memory-coverage`,children:t.coverage===null?a(e,`capture.folderHealth.unknown`):a(e,`capture.folderHealth.coverage`,{percent:Math.round(t.coverage*100),indexed:t.indexed,total:t.total})})]}),t.coverage===null?null:(0,B.jsx)(`div`,{className:`folder-memory-bar`,role:`progressbar`,"aria-valuenow":Math.round(t.coverage*100),"aria-valuemin":0,"aria-valuemax":100,children:(0,B.jsx)(`span`,{style:{width:`${Math.round(t.coverage*100)}%`}})}),t.watchActive?(0,B.jsx)(`small`,{children:a(e,`capture.folderHealth.watching`)}):null,t.failed>0?(0,B.jsxs)(`details`,{className:`folder-memory-errors`,children:[(0,B.jsx)(`summary`,{children:a(e,`capture.folderHealth.failed`,{count:t.failed})}),(0,B.jsx)(`ul`,{children:t.errors.map(e=>(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`code`,{children:e.path}),(0,B.jsx)(`span`,{children:e.detail})]},`${t.id}-${e.path}-${e.detail}`))})]}):null]},t.id))}),n.vectorPending>0?(0,B.jsx)(`small`,{className:`folder-memory-vector`,children:a(e,`capture.folderHealth.vectorGlobal`,{count:n.vectorPending})}):null]})}var G=[{id:`files`,labelKey:`capture.method.files`,icon:R,path:`capture`},{id:`local`,labelKey:`capture.method.local`,icon:D,path:`my-computer`},{id:`browser`,labelKey:`capture.method.browser`,icon:O,path:`capture-browser`}];function K(e){return G.some(t=>t.id===e)?e:`files`}function q({initialTab:e}){let t=c(e=>e.language),[n,r]=z.useState(()=>K(e));z.useEffect(()=>{r(K(e))},[e]);let i=e=>{r(e),N(`/`+G.find(t=>t.id===e).path)};return(0,B.jsxs)(`div`,{className:`product-page capture-page space-y-5`,children:[(0,B.jsxs)(`header`,{className:`page-hero`,children:[(0,B.jsxs)(`div`,{className:`page-kicker`,children:[(0,B.jsx)(R,{className:`h-4 w-4`}),` `,a(t,`capture.kicker`)]}),(0,B.jsx)(`h1`,{className:`page-title`,children:a(t,`capture.title`)}),(0,B.jsx)(`p`,{className:`page-copy`,children:a(t,`capture.body`)})]}),(0,B.jsxs)(`section`,{className:`capture-station`,"aria-label":a(t,`capture.station.aria`),children:[(0,B.jsxs)(`div`,{className:`capture-station-head`,children:[(0,B.jsx)(`h2`,{children:a(t,`capture.station.title`)}),(0,B.jsx)(`p`,{children:a(t,`capture.station.detail`)})]}),(0,B.jsx)(`div`,{className:`capture-method-switch`,role:`group`,"aria-label":a(t,`capture.method.aria`),children:G.map(({id:e,labelKey:r,icon:o})=>(0,B.jsxs)(`button`,{type:`button`,"aria-pressed":n===e,className:n===e?`is-active`:``,"data-testid":`capture-method-${e}`,onClick:()=>i(e),children:[(0,B.jsx)(o,{className:`h-4 w-4`,"aria-hidden":`true`}),a(t,r)]},e))}),(0,B.jsxs)(`div`,{className:`capture-station-body`,children:[n===`files`?(0,B.jsx)(J,{}):null,n===`local`?(0,B.jsx)(ce,{}):null,n===`browser`?(0,B.jsx)(le,{}):null]})]}),(0,B.jsxs)(`div`,{className:`capture-secondary`,children:[(0,B.jsx)(de,{}),(0,B.jsx)(te,{})]})]})}function J(){let e=c(e=>e.language),t=u(),[n,r]=z.useState([]),i=f({mutationFn:e=>Y(e,r),onSuccess:()=>{t.invalidateQueries({queryKey:[`documents`]}),t.invalidateQueries({queryKey:[`graphStats`]}),t.invalidateQueries({queryKey:[`memoryManager`]})}}),o=z.useCallback(e=>{let t=Array.from(e);t.length&&i.mutate(t)},[i]);return(0,B.jsxs)(`div`,{className:`space-y-4`,children:[(0,B.jsxs)(`label`,{className:`flex min-h-48 cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed border-primary/30 bg-muted/20 p-6 text-center transition hover:border-primary/60 hover:bg-muted/40`,onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault(),o(e.dataTransfer.files)},children:[(0,B.jsx)(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-full bg-primary/10 text-primary`,children:(0,B.jsx)(R,{className:`h-6 w-6`})}),(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`span`,{className:`text-lg font-semibold block`,children:a(e,`capture.files.drop`)}),(0,B.jsx)(`span`,{className:`max-w-md text-sm text-muted-foreground block`,children:a(e,`capture.files.dropDetail`)})]}),(0,B.jsx)(`input`,{type:`file`,multiple:!0,className:`sr-only`,onChange:e=>e.target.files&&o(e.target.files)})]}),(0,B.jsx)(X,{queue:n,onRetry:e=>o([e])})]})}function te(){let e=c(e=>e.language),t=c(e=>e.mode),n=d({queryKey:[`documents`],queryFn:()=>r.documents(200)}),i=d({queryKey:[`localSources`],queryFn:r.localSources}),o=d({queryKey:[`localAgent`],queryFn:r.localAgent});return(0,B.jsxs)(`div`,{className:`capture-secondary-column space-y-4`,children:[(0,B.jsx)(b,{title:a(e,`capture.files.uploaded`),result:n.data,children:t=>(0,B.jsxs)(`div`,{className:`space-y-3`,children:[(0,B.jsx)(v,{items:t.documents||t,titleKey:`filename`,metaKey:`ingest_state`,limit:12}),(0,B.jsx)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm text-muted-foreground`,children:a(e,`capture.files.completed`)})]})}),(0,B.jsx)(W,{language:e}),(0,B.jsx)(b,{title:a(e,`capture.local.sources`),result:i.data,children:t=>(0,B.jsxs)(`div`,{className:`space-y-3`,children:[(0,B.jsx)(v,{items:t.sources,titleKey:`path`,metaKey:`status`}),s(t.sources).map(t=>(0,B.jsx)(S,{label:a(e,`capture.local.stop`,{source:String(t.path||t.id||a(e,`capture.local.source`))}),action:()=>r.localWatchStop(String(t.id||t.source_id)),invalidate:[`localSources`]},String(t.id||t.source_id||t.path)))]})}),t===`basic`?null:(0,B.jsx)(b,{title:a(e,`capture.local.access`),result:o.data,children:e=>(0,B.jsx)(C,{value:e})})]})}async function Y(e,t){let n=e.map(e=>({id:`${e.name}-${e.size}-${e.lastModified}-${Date.now()}`,file:e,name:ie(e),size:e.size,status:`queued`}));t(e=>[...n,...e].slice(0,12));let i=[];for(let e of n){t(t=>t.map(t=>t.id===e.id?{...t,status:`uploading`}:t));let n=await r.uploadDocument(e.file);i.push(n),t(t=>t.map(t=>t.id===e.id?{...t,status:n.ok?`done`:`failed`,result:n}:t))}return i}function X({queue:e,onRetry:t}){let n=c(e=>e.language);return e.length?(0,B.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.map(e=>{let r=ne(e,n);return(0,B.jsxs)(`div`,{className:`rounded-md border border-border bg-background/55 p-3 text-sm`,children:[(0,B.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[e.status===`done`?(0,B.jsx)(ee,{className:`h-4 w-4 text-emerald-400`}):e.status===`failed`?(0,B.jsx)(T,{className:`h-4 w-4 text-amber-400`}):(0,B.jsx)(m,{className:`h-4 w-4 animate-spin text-primary`}),e.name]}),(0,B.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[Math.max(1,Math.round(e.size/1024)),` KB · `,r]})]}),e.status===`failed`?(0,B.jsxs)(P,{size:`sm`,variant:`outline`,onClick:()=>t(e.file),children:[(0,B.jsx)(M,{className:`h-3.5 w-3.5`}),` `,a(n,`capture.retry`)]}):null]}),e.result?(0,B.jsx)(h,{result:e.result,successLabel:a(n,`capture.files.success`)}):null]},e.id)})}):null}function ne(e,t){if(e.status===`queued`)return a(t,`capture.files.queued`);if(e.status===`uploading`)return a(t,`capture.files.uploading`);if(!e.result?.ok)return e.result?.error||a(t,`capture.files.failed`);let n=e.result.data||{},r=String(n.node_id||n.graph_node||n.provenance_id||``);return r?a(t,`capture.files.capturedWithNode`,{node:r}):a(t,`capture.files.captured`)}var re={webkitdirectory:``,directory:``};function ie(e){return e.webkitRelativePath||e.name}function ae(e){return(e[0]?.webkitRelativePath||``).split(`/`).filter(Boolean)[0]||``}function Z(){let e=window;return!!(e.__TAURI__?.core?.invoke||e.latticeDesktop?.selectFolder||e.__TAURI_INTERNALS__&&window.location.protocol===`tauri:`)}function oe(e){return e instanceof DOMException&&e.name===`AbortError`}async function se(e){let t=[];if(typeof e.values==`function`){for await(let n of e.values())t.push(n);return t}if(typeof e.entries==`function`)for await(let[,n]of e.entries())t.push(n);return t}async function Q(e){let t=[];for(let n of await se(e)){if(n.kind===`file`){t.push(await n.getFile());continue}t.push(...await Q(n))}return t}function ce(){let e=c(e=>e.language),t=u(),n=z.useRef(null),[i,o]=z.useState(``),[s,l]=z.useState(null),[d,p]=z.useState(``),[g,_]=z.useState(!1),[v,y]=z.useState([]),b=f({mutationFn:e=>r.connectFolder(e.trim()),onSuccess:()=>{l(null),t.invalidateQueries({queryKey:[`localSources`]}),t.invalidateQueries({queryKey:[`graphStats`]}),t.invalidateQueries({queryKey:[`memoryManager`]})}}),x=f({mutationFn:e=>Y(e,y),onSuccess:()=>{t.invalidateQueries({queryKey:[`documents`]}),t.invalidateQueries({queryKey:[`graphStats`]}),t.invalidateQueries({queryKey:[`memoryManager`]})}}),S=z.useCallback((t,n)=>{if(!t.length){l(a(e,`capture.local.emptyFolder`));return}l(null),p(n||ae(t)||a(e,`capture.local.browserFolder`)),x.mutate(t)},[x,e]),C=z.useCallback(async()=>{if(!g){_(!0),l(null);try{let t=window.showDirectoryPicker;if(!Z()&&typeof t==`function`){let e=await t.call(window);S(await Q(e),e.name);return}if(Z()){let e=await r.selectFolder();if(e){p(``),o(e),b.mutate(e);return}}if(typeof t==`function`){let e=await t.call(window);S(await Q(e),e.name);return}if(n.current){n.current.click();return}l(a(e,`capture.local.pickUnavailable`))}catch(t){oe(t)||l(a(e,`capture.local.pickUnavailable`))}finally{_(!1)}}},[S,g,b,e]),w=z.useCallback(()=>{let e=i.trim();e&&(l(null),p(``),b.mutate(e))},[b,i]),T=(x.data||[]).find(e=>!e.ok)?.error,E=!!(x.error||T);return(0,B.jsxs)(`div`,{className:`space-y-3`,children:[(0,B.jsxs)(`div`,{className:`capture-intake-lead`,children:[(0,B.jsx)(D,{className:`h-4 w-4`,"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:a(e,`capture.local.title`)}),(0,B.jsx)(`p`,{children:a(e,`capture.local.description`)})]})]}),(0,B.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>{e.preventDefault(),w()},children:[(0,B.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,B.jsx)(F,{value:i,onChange:e=>o(e.target.value),placeholder:a(e,`capture.local.placeholder`)}),(0,B.jsxs)(P,{type:`button`,variant:`outline`,disabled:g||b.isPending||x.isPending,onClick:()=>void C(),children:[g?(0,B.jsx)(m,{className:`h-4 w-4 animate-spin`}):(0,B.jsx)(A,{className:`h-4 w-4`}),g?a(e,`capture.local.choosing`):a(e,`capture.local.choose`)]})]}),(0,B.jsx)(`input`,{ref:n,type:`file`,multiple:!0,className:`sr-only`,"aria-hidden":`true`,tabIndex:-1,...re,onChange:e=>{let t=Array.from(e.currentTarget.files||[]);e.currentTarget.value=``,S(t)}}),(0,B.jsxs)(P,{type:`submit`,disabled:!i.trim()||b.isPending,children:[b.isPending?(0,B.jsx)(m,{className:`h-4 w-4 animate-spin`}):(0,B.jsx)(L,{className:`h-4 w-4`}),a(e,`capture.local.connect`)]})]}),s?(0,B.jsx)(h,{result:{ok:!1,status:0,data:{},source:`unavailable`,error:s}}):null,b.data?(0,B.jsx)(h,{result:b.data,successLabel:a(e,`capture.local.success`)}):null,d?(0,B.jsx)(h,{result:{ok:x.isPending||!E,status:E?0:200,data:{folder:d},source:E?`unavailable`:`live`,error:x.error?a(e,`capture.local.browserImportFailed`):T},successLabel:x.isPending?a(e,`capture.local.browserImporting`):a(e,`capture.local.browserImportSuccess`,{folder:d})}):null,(0,B.jsx)(X,{queue:v,onRetry:e=>S([e],d)})]})}function le(){let e=c(e=>e.language),t=u(),[n,i]=z.useState(``),o=f({mutationFn:e=>r.browserReadUrl(e),onSuccess:()=>{t.invalidateQueries({queryKey:[`graphStats`]}),t.invalidateQueries({queryKey:[`memoryManager`]})}}),s=z.useCallback(()=>{let e=$(n);e&&(i(e),o.mutate(e))},[o,n]),l=z.useCallback(async()=>{let e=$(await navigator.clipboard?.readText().catch(()=>``)||``);e&&(i(e),o.mutate(e))},[o]);return(0,B.jsxs)(`div`,{className:`space-y-3`,children:[(0,B.jsxs)(`div`,{className:`capture-intake-lead`,children:[(0,B.jsx)(O,{className:`h-4 w-4`,"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:a(e,`capture.browser.title`)}),(0,B.jsx)(`p`,{children:a(e,`capture.browser.description`)})]})]}),(0,B.jsxs)(`form`,{className:`flex flex-col gap-2 sm:flex-row`,onSubmit:e=>{e.preventDefault(),s()},children:[(0,B.jsx)(F,{value:n,onChange:e=>i(e.target.value),placeholder:a(e,`capture.browser.placeholder`),inputMode:`url`}),(0,B.jsxs)(P,{type:`button`,variant:`outline`,disabled:o.isPending,onClick:()=>void l(),children:[(0,B.jsx)(I,{className:`h-4 w-4`}),` `,a(e,`capture.browser.paste`)]}),(0,B.jsxs)(P,{type:`submit`,disabled:!n.trim()||o.isPending,children:[o.isPending?(0,B.jsx)(m,{className:`h-4 w-4 animate-spin`}):(0,B.jsx)(L,{className:`h-4 w-4`}),a(e,`capture.browser.capture`)]})]}),o.data?(0,B.jsx)(h,{result:o.data,successLabel:a(e,`capture.browser.success`)}):null]})}function $(e){let t=e.trim();return t?/^https?:\/\//i.test(t)?t:/^[\w.-]+\.[a-z]{2,}([/:?#].*)?$/i.test(t)?`https://${t}`:t:``}function ue(e,t,n){let r=o(e)?e:{},i=o(t)?t:{},a=o(n)?n:{};o(i.pipelines)&&i.pipelines;let s=(...e)=>{for(let t of e){if(typeof t==`number`&&Number.isFinite(t)&&t>=0)return Math.round(t);let e=Number(t);if(Number.isFinite(e)&&e>0)return Math.round(e)}},c=s(r.received),l=s(r.extracted),u=s(r.connected),d=s(l,i.total,i.total_items,a.nodes,a.total_nodes)||0,f=s(u,a.edges,a.total_edges)||0,p=s(i.pending,i.pending_items)||0,m=(e,t)=>{let n=r.stages||{};for(let t of e){let e=n[t],r=typeof e==`object`&&e?e.status:e;if(r===`done`||r===`working`||r===`waiting`||r===`error`)return r}return t},h=c===void 0?p?`working`:d?`done`:`waiting`:c>0?`done`:`waiting`,g=l===void 0?d?`done`:`waiting`:l>0?`done`:`waiting`,_=u===void 0?f?`done`:`waiting`:u>0?`done`:`waiting`,v=m([`read`,`received`],h),y=m([`understand`,`extracted`],g),b=m([`connect`,`connected`],_);return{remembered:d,connections:f,waiting:p,received:c??p,extracted:l??d,connected:u??f,steps:[{key:`read`,state:v,count:c??(d||p)},{key:`understand`,state:y,count:l??d},{key:`connect`,state:b,count:u??f}]}}function de(){let e=c(e=>e.language),t=c(e=>e.mode),n=d({queryKey:[`index`],queryFn:r.indexStatus}),o=d({queryKey:[`graphStats`],queryFn:r.graphStats}),s=d({queryKey:[`pipelineStatus`],queryFn:r.pipelineStatus}),l=ue(s.data?.data||s.data,n.data?.data,o.data?.data),u={read:L,understand:E,connect:j},f=!!(l.remembered||l.connections||l.received&&l.received>0);return(0,B.jsxs)(`div`,{className:`capture-secondary-column space-y-4`,children:[(0,B.jsxs)(x,{children:[(0,B.jsxs)(g,{children:[(0,B.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,B.jsx)(L,{className:`h-4 w-4`}),` `,a(e,`capture.pipeline.journey.title`)]}),(0,B.jsx)(_,{children:a(e,`capture.pipeline.journey.detail`)})]}),(0,B.jsxs)(y,{className:`space-y-4`,children:[(0,B.jsx)(`ol`,{className:`capture-journey flex flex-col md:flex-row gap-3 items-stretch`,"aria-label":a(e,`capture.pipeline.journey.aria`),children:l.steps.map(({key:t,state:n,count:r})=>{let i=u[t];return(0,B.jsxs)(`li`,{className:`capture-journey-step is-${n} flex-1 p-3 rounded-lg border border-border/60 bg-muted/20 flex flex-col justify-between`,children:[(0,B.jsxs)(`div`,{className:`capture-journey-step-header flex items-center gap-2`,children:[(0,B.jsx)(`span`,{className:`capture-journey-mark`,"aria-hidden":`true`,children:(0,B.jsx)(i,{className:`h-4 w-4`})}),(0,B.jsxs)(`div`,{className:`capture-journey-copy min-w-0 flex-1`,children:[(0,B.jsx)(`strong`,{className:`block text-sm`,children:a(e,`capture.pipeline.step.${t}`)}),(0,B.jsx)(`small`,{className:`block text-xs text-muted-foreground`,children:a(e,`capture.pipeline.step.${t}.detail`)})]})]}),(0,B.jsxs)(`div`,{className:`capture-journey-step-meta flex items-center justify-between gap-2 mt-3 pt-2 border-t border-border/40 text-xs`,children:[(0,B.jsx)(w,{variant:`muted`,className:`capture-journey-count`,children:a(e,`ui.value.records`,{count:r})}),(0,B.jsx)(`span`,{className:`capture-journey-state`,children:a(e,`capture.pipeline.step.${n}`)})]})]},t)})}),f?(0,B.jsxs)(`div`,{className:`flex flex-wrap gap-2 text-sm pt-2`,children:[(0,B.jsx)(w,{variant:`success`,children:a(e,`capture.pipeline.count.remembered`,{count:i(l.extracted)})}),(0,B.jsx)(w,{variant:`muted`,children:a(e,`capture.pipeline.count.connections`,{count:i(l.connected)})}),(0,B.jsx)(w,{variant:l.waiting?`warning`:`muted`,children:l.waiting?a(e,`capture.pipeline.count.waiting`,{count:i(l.waiting)}):a(e,`capture.pipeline.count.none`)})]}):(0,B.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:a(e,`capture.pipeline.empty`)})]})]}),(0,B.jsxs)(x,{children:[(0,B.jsxs)(g,{children:[(0,B.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,B.jsx)(k,{className:`h-4 w-4`}),` `,a(e,`capture.pipeline.refresh`)]}),(0,B.jsx)(_,{children:a(e,`capture.pipeline.description`)})]}),(0,B.jsx)(y,{children:(0,B.jsx)(S,{label:a(e,`capture.pipeline.rebuild`),action:()=>r.rebuildIndex(),invalidate:[`index`]})})]}),t===`basic`?null:(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(b,{title:a(e,`capture.pipeline.status`),result:n.data,children:e=>(0,B.jsx)(C,{value:e})}),(0,B.jsx)(b,{title:a(e,`capture.pipeline.growth`),result:o.data,children:e=>(0,B.jsx)(C,{value:e})})]})]})}export{q as CapturePage};
@@ -1 +0,0 @@
1
- import{C as e,_ as t,b as n,c as r,d as i,m as a,o,t as s,v as c,x as l}from"./utils-Ddol2RWD.js";import{r as u,t as d}from"./useQuery-CY2OI2uy.js";import{t as f}from"./useMutation-CSn9t1op.js";import{_ as p,a as m,c as h,d as g,g as _,h as v,i as y,l as b,m as x,n as S,p as C,r as w,s as T,t as E,u as D,v as O}from"./primitives-SNp0LRJz.js";import{t as k}from"./circle-check-qqLug9nU.js";import{a as A,i as j,n as M,r as N,t as P}from"./permissionCopy-CQDUBrOZ.js";import{t as F}from"./shield-alert-5BStfp2_.js";import{g as ee,i as I,t as L,u as R}from"./index-BMPdTmlY.js";import{t as z}from"./button-aTn4s84A.js";import{t as B}from"./input-B0nRf2jO.js";import"./workspace-BqDwOz_p.js";var te=t(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),V=t(`users`,[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]),H=e(l()),U=n(),ne={low:`success`,medium:`warning`,high:`danger`};function W(e,t){return t===`ko`&&e.label_ko||e.label}function G(e,t){return t===`ko`&&e.summary_ko||e.summary}function K(e,t){return t===`ko`&&e.warning_ko||e.warning||``}function re(){let e=u(),t=c(e=>e.language),[n,r]=H.useState(null),[o,s]=H.useState(!1),[l,m]=H.useState(``),h=d({queryKey:[`networkBoundary`],queryFn:i.networkBoundary}),g=f({mutationFn:e=>i.setNetworkBoundary(e.mode,e.ack),onSuccess:t=>{t.ok&&(e.invalidateQueries({queryKey:[`networkBoundary`]}),r(null),s(!1))}}),y=f({mutationFn:e=>i.setHybridPolicy(e),onSuccess:()=>e.invalidateQueries({queryKey:[`networkBoundary`]})}),b=f({mutationFn:e=>i.previewCloudContext(e)}),[S,T]=H.useState([]),E=f({mutationFn:e=>i.setNodeSensitivity(e.nodeId,e.localOnly),onSuccess:(e,t)=>{e.ok&&T(e=>t.localOnly?[...e,t.nodeId]:e.filter(e=>e!==t.nodeId))}}),D=h.data?.ok?h.data.data:void 0,k=D?.catalog??[],A=D?.mode??``,j=n??A,M=k.find(e=>e.id===j),N=M?.requires_ack&&j!==A?M:void 0,P=N!==void 0&&!o,ee=j===A,I=D?.policy??{},L=b.data?.ok?b.data.data:void 0;return h.isLoading?(0,U.jsxs)(C,{children:[(0,U.jsx)(_,{children:(0,U.jsx)(p,{children:a(t,`system.network.title`)})}),(0,U.jsx)(x,{children:(0,U.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:a(t,`ui.loading`)})})]}):!D||k.length===0?(0,U.jsxs)(C,{children:[(0,U.jsx)(_,{children:(0,U.jsx)(p,{children:a(t,`system.network.title`)})}),(0,U.jsx)(x,{children:(0,U.jsx)(w,{title:a(t,`ui.requestUnavailable`),detail:h.data?.error})})]}):(0,U.jsxs)(C,{"data-testid":`network-boundary-panel`,children:[(0,U.jsxs)(_,{children:[(0,U.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,U.jsx)(te,{className:`h-4 w-4`,"aria-hidden":`true`}),a(t,`system.network.title`)]}),(0,U.jsx)(v,{children:a(t,`system.network.hint`)})]}),(0,U.jsxs)(x,{className:`space-y-3`,children:[(0,U.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[a(t,`system.network.current`),`:`,` `,(0,U.jsx)(`strong`,{"data-testid":`network-boundary-active`,children:t===`ko`&&D.label_ko||D.label})]}),(0,U.jsx)(`div`,{className:`space-y-2`,role:`radiogroup`,"aria-label":a(t,`system.network.title`),children:k.map(e=>{let n=e.id===j;return(0,U.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"data-testid":`network-boundary-option-${e.id}`,onClick:()=>{r(e.id),s(!1),g.reset()},className:`w-full rounded-md border p-3 text-left transition ${n?`border-primary bg-accent`:`border-border hover:bg-accent/50`}`,children:[(0,U.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`strong`,{className:`text-sm`,children:W(e,t)}),(0,U.jsx)(O,{variant:ne[e.risk]||`warning`,children:a(t,`system.permission.risk.${e.risk}`)}),e.id===A?(0,U.jsx)(O,{variant:`muted`,children:a(t,`system.network.current`)}):null]}),(0,U.jsx)(`p`,{className:`mt-1 block text-xs text-muted-foreground`,children:G(e,t)})]},e.id)})}),N?(0,U.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border bg-muted p-3`,children:[(0,U.jsxs)(`p`,{className:`flex items-start gap-2 text-xs`,children:[(0,U.jsx)(F,{className:`mt-0.5 h-4 w-4 shrink-0`,"aria-hidden":`true`}),(0,U.jsx)(`span`,{children:K(N,t)})]}),(0,U.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,"data-testid":`network-boundary-ack`,checked:o,onChange:e=>s(e.target.checked)}),a(t,`system.network.ack`)]})]}):null,(0,U.jsx)(z,{"data-testid":`network-boundary-apply`,disabled:ee||P||g.isPending,onClick:()=>g.mutate({mode:j,ack:o}),children:a(t,`system.network.apply`)}),g.data&&!g.data.ok?(0,U.jsx)(w,{title:a(t,`ui.requestUnavailable`),detail:g.data.error}):null,g.data?.ok?(0,U.jsx)(O,{variant:`success`,"data-testid":`network-boundary-applied`,children:a(t,`ui.requestCompleted`)}):null,(0,U.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border p-3`,children:[(0,U.jsx)(`p`,{className:`text-xs font-medium`,children:a(t,`system.network.preview.title`)}),(0,U.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:a(t,`system.network.preview.hint`)}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(`input`,{type:`text`,"data-testid":`network-boundary-probe`,value:l,onChange:e=>m(e.target.value),placeholder:a(t,`system.network.preview.placeholder`),className:`min-w-0 flex-1 rounded-md border border-border bg-background px-2 py-1 text-xs`}),(0,U.jsx)(z,{variant:`outline`,"data-testid":`network-boundary-preview`,disabled:!l.trim()||b.isPending,onClick:()=>b.mutate(l.trim()),children:a(t,`system.network.preview.run`)})]}),L?(0,U.jsxs)(`div`,{className:`space-y-1`,"data-testid":`network-boundary-preview-result`,children:[L.allows_cloud?null:(0,U.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:a(t,`system.network.preview.localOnly`)}),L.would_block?(0,U.jsx)(O,{variant:`danger`,children:a(t,`system.network.preview.blocked`)}):null,L.titles.length===0?(0,U.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:a(t,`system.network.preview.empty`)}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[a(t,`system.network.preview.count`,{count:L.titles.length}),` · `,a(t,`system.network.preview.tokens`,{tokens:L.token_estimate})]}),(0,U.jsx)(`ul`,{className:`space-y-0.5`,children:L.titles.map((e,n)=>{let r=L.node_ids[n],i=r?S.includes(r):!1;return(0,U.jsxs)(`li`,{className:`flex items-start justify-between gap-2 text-xs`,children:[(0,U.jsxs)(`span`,{className:i?`line-through opacity-60`:void 0,children:[`· `,e]}),r?(0,U.jsx)(`button`,{type:`button`,"data-testid":`network-boundary-hold-${n}`,className:`shrink-0 underline underline-offset-2 opacity-80 hover:opacity-100`,disabled:E.isPending,onClick:()=>E.mutate({nodeId:r,localOnly:!i}),children:a(t,i?`system.network.preview.release`:`system.network.preview.hold`)}):null]},`${r||e}-${n}`)})})]})]}):null,b.data&&!b.data.ok?(0,U.jsx)(w,{title:a(t,`ui.requestUnavailable`),detail:b.data.error}):null]}),D.allows_cloud?(0,U.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border p-3`,"data-testid":`network-boundary-policy`,children:[(0,U.jsx)(`p`,{className:`text-xs font-medium`,children:a(t,`system.network.policy.title`)}),(0,U.jsxs)(`label`,{className:`flex items-start gap-2 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,"data-testid":`network-boundary-auto-commit`,checked:!!I.auto_commit,disabled:y.isPending,onChange:e=>y.mutate({auto_commit:e.target.checked})}),(0,U.jsxs)(`span`,{children:[a(t,`system.network.policy.autoCommit`),(0,U.jsx)(`span`,{className:`mt-0.5 block text-muted-foreground`,children:a(t,`system.network.policy.autoCommitHint`)})]})]}),(0,U.jsxs)(`label`,{className:`flex items-start gap-2 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,"data-testid":`network-boundary-multimodal`,checked:!!I.allow_multimodal,disabled:y.isPending,onChange:e=>y.mutate({allow_multimodal:e.target.checked})}),(0,U.jsxs)(`span`,{children:[a(t,`system.network.policy.multimodal`),(0,U.jsx)(`span`,{className:`mt-0.5 block text-muted-foreground`,children:a(t,`system.network.policy.multimodalHint`)})]})]})]}):null,(0,U.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,U.jsx)(`p`,{className:`text-xs font-medium`,children:a(t,`system.network.guards`)}),(0,U.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:a(t,`system.network.guards.detail`)}),(0,U.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:a(t,`system.network.preview.autoHeld`)})]})]})]})}var q={low:`success`,medium:`warning`,high:`danger`};function ie(){let e=u(),t=c(e=>e.language),[n,r]=H.useState(null),[o,s]=H.useState(!1),l=d({queryKey:[`permissionMode`],queryFn:i.permissionMode}),m=f({mutationFn:e=>i.setPermissionMode(e.mode,e.ack),onSuccess:t=>{t.ok&&(e.invalidateQueries({queryKey:[`permissionMode`]}),r(null),s(!1))}}),h=l.data?.ok?l.data.data:void 0,g=h?.catalog??[],y=h?.mode??``,b=n??y,S=g.find(e=>e.id===b),T=S?.requires_ack&&b!==y?S:void 0,E=T!==void 0&&!o,D=b===y;return l.isLoading?(0,U.jsxs)(C,{children:[(0,U.jsx)(_,{children:(0,U.jsx)(p,{children:a(t,`system.permission.title`)})}),(0,U.jsx)(x,{children:(0,U.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:a(t,`ui.loading`)})})]}):!h||g.length===0?(0,U.jsxs)(C,{children:[(0,U.jsx)(_,{children:(0,U.jsx)(p,{children:a(t,`system.permission.title`)})}),(0,U.jsx)(x,{children:(0,U.jsx)(w,{title:a(t,`ui.requestUnavailable`),detail:l.data?.error})})]}):(0,U.jsxs)(C,{"data-testid":`permission-mode-panel`,children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(t,`system.permission.title`)}),(0,U.jsx)(v,{children:a(t,`system.permission.hint`)})]}),(0,U.jsxs)(x,{className:`space-y-3`,children:[(0,U.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[a(t,`system.permission.current`),`:`,` `,(0,U.jsx)(`strong`,{"data-testid":`permission-mode-active`,children:P(h,t)})]}),(0,U.jsx)(`div`,{className:`space-y-2`,role:`radiogroup`,"aria-label":a(t,`system.permission.title`),children:g.map(e=>{let n=e.id===b;return(0,U.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"data-testid":`permission-mode-option-${e.id}`,onClick:()=>{r(e.id),s(!1),m.reset()},className:`w-full rounded-md border p-3 text-left transition ${n?`border-primary bg-accent`:`border-border hover:bg-accent/50`}`,children:[(0,U.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,U.jsx)(`strong`,{className:`text-sm`,children:M(e,t)}),(0,U.jsx)(O,{variant:q[e.risk]||`warning`,children:a(t,`system.permission.risk.${e.risk}`)}),e.id===y?(0,U.jsx)(O,{variant:`muted`,children:a(t,`system.permission.current`)}):null]}),(0,U.jsx)(`p`,{className:`mt-1 block text-xs text-muted-foreground`,children:N(e,t)})]},e.id)})}),T?(0,U.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border bg-muted p-3`,children:[(0,U.jsxs)(`p`,{className:`flex items-start gap-2 text-xs`,children:[(0,U.jsx)(F,{className:`mt-0.5 h-4 w-4 shrink-0`}),(0,U.jsx)(`span`,{children:j(T,t)})]}),(0,U.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,U.jsx)(`input`,{type:`checkbox`,"data-testid":`permission-mode-ack`,checked:o,onChange:e=>s(e.target.checked)}),a(t,`system.permission.ack`)]})]}):null,(0,U.jsx)(z,{"data-testid":`permission-mode-apply`,disabled:D||E||m.isPending,onClick:()=>m.mutate({mode:b,ack:o}),children:a(t,`system.permission.apply`)}),m.data&&!m.data.ok?(0,U.jsx)(w,{title:a(t,`ui.requestUnavailable`),detail:m.data.error}):null,m.data?.ok?(0,U.jsx)(O,{variant:`success`,"data-testid":`permission-mode-applied`,children:a(t,`ui.requestCompleted`)}):null,(0,U.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,U.jsx)(`p`,{className:`text-xs font-medium`,children:a(t,`system.permission.guards`)}),(0,U.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:a(t,`system.permission.guards.detail`)})]})]})]})}var J=[{id:`identity`,labelKey:`system.group.identity`},{id:`data`,labelKey:`system.group.data`},{id:`system`,labelKey:`system.group.system`}],Y=[{id:`account`,labelKey:`system.tab.account`,group:`identity`},{id:`workspaces`,labelKey:`system.tab.workspaces`,group:`identity`},{id:`snapshots`,labelKey:`system.tab.snapshots`,group:`data`},{id:`activity`,labelKey:`system.tab.activity`,group:`data`},{id:`settings`,labelKey:`system.tab.settings`,group:`system`},{id:`network`,labelKey:`system.tab.network`,group:`system`},{id:`admin`,labelKey:`system.tab.admin`,group:`system`}];function X({initialTab:e}){let t=c(e=>e.mode),n=c(e=>e.language),[r,i]=H.useState(e||`account`);H.useEffect(()=>{Y.some(t=>t.id===e)&&i(e)},[e]);let o=t===`basic`?Y.filter(e=>e.id===`account`||e.id===`workspaces`||e.id===`snapshots`||e.id===`settings`):Y,s=e=>{i(e),I(`/`+{account:`account`,workspaces:`workspace-admin`,snapshots:`snapshots`,activity:`activity`,network:`network`,settings:`settings`,admin:`system-admin`}[e])};return(0,U.jsxs)(`div`,{className:`product-page settings-page space-y-5 pb-8`,children:[(0,U.jsxs)(`header`,{className:`page-hero`,children:[(0,U.jsxs)(`div`,{className:`page-kicker`,children:[(0,U.jsx)(R,{className:`h-4 w-4`}),` `,a(n,`system.kicker`)]}),(0,U.jsx)(`h1`,{className:`page-title`,children:a(n,`system.title`)}),(0,U.jsx)(`p`,{className:`page-copy`,children:a(n,`system.body`)})]}),(0,U.jsx)(`div`,{className:`flex flex-wrap items-end gap-x-6 gap-y-3`,"data-testid":`system-tab-groups`,children:J.map(e=>({group:e,items:o.filter(t=>t.group===e.id)})).filter(({items:e})=>e.length>0).map(({group:e,items:t})=>{let i=`system-group-${e.id}`;return(0,U.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,U.jsx)(`span`,{id:i,className:`px-1 text-xs font-medium text-muted-foreground`,children:a(n,e.labelKey)}),(0,U.jsx)(g,{ariaLabelledBy:i,tabs:t.map(e=>({id:e.id,label:a(n,e.labelKey)})),value:r,onChange:e=>s(e)})]},e.id)})}),r===`account`?(0,U.jsx)(Z,{}):null,r===`workspaces`?(0,U.jsx)(oe,{}):null,r===`settings`?(0,U.jsx)(ue,{}):null,r===`snapshots`?(0,U.jsx)(se,{}):null,r===`activity`?(0,U.jsx)(ce,{}):null,r===`network`?(0,U.jsx)(le,{}):null,r===`admin`?(0,U.jsx)(ve,{}):null]})}function Z(){let e=u(),t=c(e=>e.language),n=c(e=>e.setWorkspaceId),r=d({queryKey:[`profile`],queryFn:i.profile}),o=d({queryKey:[`sso`],queryFn:i.ssoConfig}),[s,l]=H.useState(``),[g,y]=H.useState(``),[b,w]=H.useState(``),[T,D]=H.useState(``),[O,k]=H.useState(``),A=e=>{e.ok&&(L(),n(null))},j=f({mutationFn:()=>i.login(s,g),onSuccess:A}),M=f({mutationFn:()=>i.register({email:s,password:g,name:b,nickname:T}),onSuccess:A}),N=f({mutationFn:()=>i.updateProfile({name:b,nickname:T}),onSuccess:()=>e.invalidateQueries({queryKey:[`profile`]})}),P=f({mutationFn:()=>i.changePassword(g,O)});return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(t,`system.account.profile`),result:r.data,children:e=>(0,U.jsx)(m,{data:e})}),(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,U.jsx)(ee,{className:`h-4 w-4`}),` `,a(t,`system.account.title`)]}),(0,U.jsx)(v,{children:a(t,`system.account.detail`)})]}),(0,U.jsxs)(x,{className:`flex flex-col gap-3`,children:[(0,U.jsx)(B,{value:s,onChange:e=>l(e.target.value),placeholder:a(t,`system.account.email`)}),(0,U.jsx)(B,{type:`password`,value:g,onChange:e=>y(e.target.value),placeholder:a(t,`system.account.password`)}),(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,U.jsx)(B,{value:b,onChange:e=>w(e.target.value),placeholder:a(t,`system.account.name`)}),(0,U.jsx)(B,{value:T,onChange:e=>D(e.target.value),placeholder:a(t,`system.account.nickname`)})]}),(0,U.jsx)(B,{type:`password`,value:O,onChange:e=>k(e.target.value),placeholder:a(t,`system.account.newPassword`)}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(z,{onClick:()=>j.mutate(),disabled:!s||!g||j.isPending,children:a(t,`system.account.login`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>M.mutate(),disabled:!s||!g||M.isPending,children:a(t,`system.account.register`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>N.mutate(),disabled:N.isPending,children:a(t,`system.account.save`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>P.mutate(),disabled:!g||!O||P.isPending,children:a(t,`system.account.changePassword`)}),(0,U.jsx)(E,{label:a(t,`system.account.logout`),action:()=>i.logout(),onSuccess:A})]}),[j.data,M.data,N.data,P.data].filter(Boolean).map((e,n)=>(0,U.jsx)(h,{result:e,successLabel:a(t,`system.account.requestDone`)},n))]})]}),(0,U.jsx)(S,{title:a(t,`system.account.signInOptions`),result:o.data,children:e=>(0,U.jsx)(ae,{data:e})})]})}function ae({data:e}){let t=c(e=>e.mode),n=c(e=>e.language),r=!!e.enabled||s(e.providers).length>0;return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)($,{title:a(n,r?`system.account.signIn.sso`:`system.account.signIn.localOnly`),status:a(n,r?`system.value.enabled`:`system.storage.local.badge`),detail:a(n,r?`system.account.signIn.ssoDetail`:`system.account.signIn.localOnlyDetail`)}),t===`basic`?null:(0,U.jsx)(D,{value:e})]})}function oe(){let e=u(),t=c(e=>e.language),{setWorkspaceId:n}=c(),r=d({queryKey:[`workspaceRegistry`],queryFn:i.workspaceRegistry}),o=d({queryKey:[`invitations`],queryFn:i.invitations}),[l,m]=H.useState(``),[h,g]=H.useState(``),[b,w]=H.useState(``),T=f({mutationFn:()=>i.createOrg(l),onSuccess:()=>e.invalidateQueries({queryKey:[`workspaceRegistry`]})}),D=f({mutationFn:()=>i.createInvitation({email:h||null,role:`member`,expires_hours:168}),onSuccess:()=>e.invalidateQueries({queryKey:[`invitations`]})}),O=f({mutationFn:()=>i.acceptInvitation(b),onSuccess:()=>e.invalidateQueries({queryKey:[`workspaceRegistry`]})}),k=s(r.data?.data?.workspaces);return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(t,`system.workspace.yours`),result:r.data,children:()=>(0,U.jsx)(`div`,{className:`flex flex-col gap-2`,children:k.map(e=>{let r=String(e.workspace_id||e.id);return(0,U.jsx)(`div`,{className:`rounded-md border border-border p-3`,children:(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`div`,{className:`font-medium`,children:String(e.name||r)}),(0,U.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[String(e.type||``),` · `,String(e.your_role||e.role||``)]})]}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(z,{variant:`outline`,onClick:()=>n(r),children:a(t,`system.workspace.use`)}),(0,U.jsx)(E,{label:a(t,`system.workspace.activate`),action:()=>i.activateWorkspace(r),invalidate:[`workspaceRegistry`]}),(0,U.jsx)(E,{label:a(t,`system.workspace.archive`),action:()=>i.archiveWorkspace(r),invalidate:[`workspaceRegistry`],variant:`destructive`})]})]})},r)})})}),(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,U.jsx)(V,{className:`h-4 w-4`}),` `,a(t,`system.workspace.organizations`)]}),(0,U.jsx)(v,{children:a(t,`system.workspace.organizationsHint`)})]}),(0,U.jsxs)(x,{className:`flex flex-col gap-3`,children:[(0,U.jsx)(B,{value:l,onChange:e=>m(e.target.value),placeholder:a(t,`system.workspace.orgPlaceholder`)}),(0,U.jsx)(z,{disabled:!l.trim()||T.isPending,onClick:()=>T.mutate(),children:a(t,`system.workspace.createOrg`)}),(0,U.jsx)(B,{value:h,onChange:e=>g(e.target.value),placeholder:a(t,`system.workspace.inviteeEmail`)}),(0,U.jsx)(z,{variant:`outline`,disabled:D.isPending,onClick:()=>D.mutate(),children:a(t,`system.workspace.createInvite`)}),(0,U.jsx)(B,{value:b,onChange:e=>w(e.target.value),placeholder:a(t,`system.workspace.inviteToken`)}),(0,U.jsx)(z,{variant:`outline`,disabled:!b.trim()||O.isPending,onClick:()=>O.mutate(),children:a(t,`system.workspace.acceptInvite`)}),(0,U.jsx)(S,{title:a(t,`system.workspace.invitations`),result:o.data,children:e=>(0,U.jsx)(y,{items:e.invitations,titleKey:`token`,metaKey:`role`})})]})]})]})}function se(){let e=c(e=>e.language),t=d({queryKey:[`snapshots`],queryFn:i.snapshots}),n=d({queryKey:[`timeMachine`],queryFn:i.timeMachine}),[r,o]=H.useState(``),[l,u]=H.useState(``),[m,g]=H.useState(``),b=f({mutationFn:()=>i.createSnapshot(r||a(e,`system.snapshots.defaultName`))}),w=f({mutationFn:()=>i.compareSnapshots(l,m)}),T=s(t.data?.data?.snapshots);return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(e,`system.snapshots.title`),result:t.data,children:()=>(0,U.jsx)(`div`,{className:`space-y-2`,children:T.map(t=>{let n=String(t.id||t.snapshot_id);return(0,U.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,U.jsx)(`div`,{className:`font-medium`,children:String(t.name||n)}),(0,U.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,U.jsx)(E,{label:a(e,`system.snapshots.export`),action:()=>i.exportSnapshot(n)}),(0,U.jsx)(E,{label:a(e,`system.snapshots.mergeRestore`),action:()=>i.restoreSnapshot(n),variant:`outline`})]})]},n)})})}),(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(e,`system.snapshots.actions`)}),(0,U.jsx)(v,{children:a(e,`system.snapshots.actionsHint`)})]}),(0,U.jsxs)(x,{className:`flex flex-col gap-3`,children:[(0,U.jsx)(B,{value:r,onChange:e=>o(e.target.value),placeholder:a(e,`system.snapshots.namePlaceholder`)}),(0,U.jsx)(z,{onClick:()=>b.mutate(),disabled:b.isPending,children:a(e,`system.snapshots.create`)}),(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,U.jsx)(B,{value:l,onChange:e=>u(e.target.value),placeholder:a(e,`system.snapshots.beforeId`)}),(0,U.jsx)(B,{value:m,onChange:e=>g(e.target.value),placeholder:a(e,`system.snapshots.afterId`)})]}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>w.mutate(),disabled:!l||!m||w.isPending,children:a(e,`system.snapshots.compare`)}),w.data?(0,U.jsx)(h,{result:w.data,successLabel:a(e,`system.snapshots.compareDone`)}):null]})]}),(0,U.jsx)(S,{title:a(e,`system.snapshots.timeline`),result:n.data,children:e=>(0,U.jsx)(y,{items:e.events||e,titleKey:`event`,metaKey:`type`,limit:14})})]})}function ce(){let e=c(e=>e.language),t=d({queryKey:[`realtimeFeed`],queryFn:i.realtimeFeed}),n=d({queryKey:[`presence`],queryFn:i.presence});return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(e,`system.activity.feed`),result:t.data,children:e=>(0,U.jsx)(y,{items:e.events,titleKey:`event_type`,metaKey:`area`,limit:14})}),(0,U.jsx)(S,{title:a(e,`system.activity.presence`),result:n.data,children:e=>(0,U.jsx)(de,{data:e})})]})}function le(){let e=u(),t=c(e=>e.language),n=d({queryKey:[`networkIdentity`],queryFn:i.networkIdentity}),r=d({queryKey:[`networkPeers`],queryFn:i.networkPeers}),[o,l]=H.useState(``),[m,g]=H.useState(``),[y,b]=H.useState(``),w=f({mutationFn:()=>i.pairPeer({name:o,base_url:m,public_key:y}),onSuccess:()=>e.invalidateQueries({queryKey:[`networkPeers`]})});return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(t,`system.network.identity`),result:n.data,children:e=>(0,U.jsx)(fe,{data:e})}),(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsxs)(p,{className:`flex items-center gap-2`,children:[(0,U.jsx)(A,{className:`h-4 w-4`}),` `,a(t,`system.network.pair`)]}),(0,U.jsx)(v,{children:a(t,`system.network.pairHint`)})]}),(0,U.jsxs)(x,{className:`grid gap-3`,children:[(0,U.jsx)(B,{value:o,onChange:e=>l(e.target.value),placeholder:a(t,`system.network.deviceName`)}),(0,U.jsx)(B,{value:m,onChange:e=>g(e.target.value),placeholder:a(t,`system.network.address`)}),(0,U.jsx)(B,{value:y,onChange:e=>b(e.target.value),placeholder:a(t,`system.network.publicKey`)}),(0,U.jsx)(z,{disabled:!o||!m||!y||w.isPending,onClick:()=>w.mutate(),children:a(t,`system.network.pair`)}),w.data?(0,U.jsx)(h,{result:w.data,successLabel:a(t,`system.network.pairDone`)}):null]})]}),(0,U.jsx)(S,{title:a(t,`system.network.peers`),result:r.data,className:`xl:col-span-2`,children:e=>(0,U.jsx)(`div`,{className:`grid gap-2`,children:s(e.peers).map(e=>{let n=String(e.peer_id||e.id);return(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md border border-border p-3`,children:[(0,U.jsxs)(`div`,{children:[(0,U.jsx)(`div`,{className:`font-medium`,children:String(e.name||n)}),(0,U.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:String(e.base_url||``)})]}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(E,{label:a(t,`system.network.pushWorkspace`),action:()=>i.pushPeer(n,c.getState().workspaceId)}),(0,U.jsx)(E,{label:a(t,`system.network.unpair`),action:()=>i.unpairPeer(n),invalidate:[`networkPeers`],variant:`destructive`})]})]},n)})})})]})}function ue(){let e=u(),{theme:t,setTheme:n,mode:r,setMode:o}=c(),s=c(e=>e.language),l=d({queryKey:[`health`],queryFn:i.health}),m=d({queryKey:[`sysinfo`],queryFn:i.sysinfo}),g=d({queryKey:[`computerMemory`],queryFn:i.computerMemory}),y=d({queryKey:[`brainStorage`],queryFn:i.brainStorage}),b=d({queryKey:[`backupHealth`],queryFn:i.backupHealth}),[w,T]=H.useState(``),[O,A]=H.useState(`lattice_brain`),[j,M]=H.useState(!1),[N,P]=H.useState(``),[F,ee]=H.useState(``),[I,L]=H.useState(``),[R,te]=H.useState(!1),[V,ne]=H.useState(!1),W=f({mutationFn:e=>i.dockerPostgres({consent:e,dry_run:!e,port:5432})}),G=f({mutationFn:()=>i.migratePostgres({dsn:w,schema_name:O||`lattice_brain`,dry_run:!0})}),K=f({mutationFn:()=>i.brainArchive({path:N.trim()||null,passphrase:I}),onSuccess:()=>e.invalidateQueries({queryKey:[`backupHealth`]})}),q=f({mutationFn:()=>i.brainArchiveInspect({path:F,passphrase:I||null})}),J=f({mutationFn:()=>i.brainArchiveVerify({path:F,passphrase:I})}),Y=f({mutationFn:()=>i.brainArchiveRestore({path:F,passphrase:I,dry_run:!0,confirm:!1})}),X=f({mutationFn:()=>i.brainArchiveRestore({path:F,passphrase:I,dry_run:!1,confirm:R}),onSuccess:()=>{e.invalidateQueries({queryKey:[`brainStorage`]}),e.invalidateQueries({queryKey:[`backupHealth`]})}}),Z=f({mutationFn:()=>i.brainArchiveImport({path:F,passphrase:I,dry_run:!0,confirm:!1})}),ae=f({mutationFn:()=>i.brainArchiveImport({path:F,passphrase:I,dry_run:!1,confirm:V}),onSuccess:()=>{e.invalidateQueries({queryKey:[`brainStorage`]}),e.invalidateQueries({queryKey:[`backupHealth`]})}});return(0,U.jsxs)(`div`,{className:`flex flex-col gap-4 max-w-[54rem]`,children:[(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(s,`system.panel.appearance`)}),(0,U.jsx)(v,{children:a(s,`system.panel.appearance.hint`)})]}),(0,U.jsxs)(x,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(z,{variant:t===`dark`?`default`:`outline`,onClick:()=>n(`dark`),children:a(s,`system.theme.dark`)}),(0,U.jsx)(z,{variant:t===`light`?`default`:`outline`,onClick:()=>n(`light`),children:a(s,`system.theme.light`)})]})]}),(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(s,`system.panel.detailLevel`)}),(0,U.jsx)(v,{children:a(s,`system.panel.detailLevel.hint`)})]}),(0,U.jsx)(x,{className:`flex flex-wrap gap-2`,children:[`basic`,`advanced`,`admin`].map(e=>(0,U.jsx)(z,{variant:r===e?`default`:`outline`,onClick:()=>o(e),children:a(s,`shell.mode.${e}`)},e))})]}),(0,U.jsx)(ie,{}),(0,U.jsx)(re,{}),(0,U.jsx)(S,{title:r===`basic`?a(s,`system.panel.brainStatus`):a(s,`system.panel.serverHealth`),result:l.data,children:e=>(0,U.jsx)(pe,{data:e})}),(0,U.jsx)(S,{title:r===`basic`?a(s,`system.panel.readiness`):a(s,`system.panel.hostTelemetry`),result:m.data,children:e=>{if(r===`basic`){let t=String(e?.readiness||`roomy`),n=t===`tight`||t===`low`||t===`roomy`?`system.readiness.${t}`:`system.readiness.plenty`;return(0,U.jsxs)(`div`,{className:`flex items-center gap-2.5 p-3 rounded-lg border border-border/60 bg-muted/20 text-sm text-foreground`,children:[(0,U.jsx)(k,{className:`h-4 w-4 ${t===`low`?`text-rose-500`:t===`tight`?`text-amber-500`:`text-emerald-500`} flex-shrink-0`,"aria-hidden":`true`}),(0,U.jsx)(`span`,{children:a(s,n)})]})}return(0,U.jsx)(D,{value:e})}}),(0,U.jsx)(S,{title:r===`basic`?a(s,`system.storage.title`):a(s,`system.panel.brainStorage`),result:y.data,children:e=>(0,U.jsx)(me,{data:e,mode:r,language:s})}),r===`basic`?null:(0,U.jsx)(S,{title:a(s,`system.backup.health`),result:b.data,children:e=>(0,U.jsx)(he,{data:e})}),r===`basic`?null:(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(s,`system.archive.title`)}),(0,U.jsx)(v,{children:a(s,`system.archive.detail`)})]}),(0,U.jsxs)(x,{className:`flex flex-col gap-3`,children:[(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,U.jsx)(B,{value:N,onChange:e=>P(e.target.value),placeholder:a(s,`system.archive.exportPath`)}),(0,U.jsx)(B,{value:F,onChange:e=>ee(e.target.value),placeholder:a(s,`system.archive.restorePath`)})]}),(0,U.jsx)(B,{type:`password`,value:I,onChange:e=>L(e.target.value),placeholder:a(s,`system.archive.passphrase`)}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(z,{onClick:()=>K.mutate(),disabled:!I||K.isPending,children:a(s,`system.archive.export`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>q.mutate(),disabled:!F||q.isPending,children:a(s,`system.archive.inspect`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>J.mutate(),disabled:!F||!I||J.isPending,children:a(s,`system.archive.verify`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>Y.mutate(),disabled:!F||!I||Y.isPending,children:a(s,`system.archive.restoreDryRun`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>Z.mutate(),disabled:!F||!I||Z.isPending,children:a(s,`system.archive.importDryRun`)}),(0,U.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,U.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>te(e.target.checked)}),a(s,`system.archive.confirmRestore`)]}),(0,U.jsx)(z,{variant:`destructive`,onClick:()=>X.mutate(),disabled:!F||!I||!R||X.isPending,children:a(s,`system.archive.restore`)}),(0,U.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,U.jsx)(`input`,{type:`checkbox`,checked:V,onChange:e=>ne(e.target.checked)}),a(s,`system.archive.confirmImport`)]}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>ae.mutate(),disabled:!F||!I||!V||ae.isPending,children:a(s,`system.archive.import`)})]}),[K.data,q.data,J.data,Y.data,X.data,Z.data,ae.data].filter(Boolean).map((e,t)=>(0,U.jsx)(h,{result:e,successLabel:a(s,`system.archive.requestDone`)},t))]})]}),r===`basic`?null:(0,U.jsxs)(C,{children:[(0,U.jsxs)(_,{children:[(0,U.jsx)(p,{children:a(s,`system.scale.title`)}),(0,U.jsx)(v,{children:a(s,`system.scale.detail`)})]}),(0,U.jsxs)(x,{className:`flex flex-col gap-3`,children:[(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,U.jsx)(B,{value:w,onChange:e=>T(e.target.value),placeholder:a(s,`system.scale.dsn`)}),(0,U.jsx)(B,{value:O,onChange:e=>A(e.target.value),placeholder:a(s,`system.scale.schema`)})]}),(0,U.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,U.jsx)(z,{variant:`outline`,onClick:()=>W.mutate(!1),disabled:W.isPending,children:a(s,`system.scale.dockerPlan`)}),(0,U.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,U.jsx)(`input`,{type:`checkbox`,checked:j,onChange:e=>M(e.target.checked)}),a(s,`system.scale.dockerConsent`)]}),(0,U.jsx)(z,{onClick:()=>W.mutate(!0),disabled:!j||W.isPending,children:a(s,`system.scale.dockerStart`)}),(0,U.jsx)(z,{variant:`outline`,onClick:()=>G.mutate(),disabled:!w||G.isPending,children:a(s,`system.scale.migrationPlan`)})]}),W.data?(0,U.jsx)(h,{result:W.data,successLabel:a(s,`system.scale.dockerDone`)}):null,G.data?(0,U.jsx)(h,{result:G.data,successLabel:a(s,`system.scale.migrationDone`)}):null]})]}),r===`basic`?null:(0,U.jsx)(S,{title:a(s,`system.computerMemory.title`),result:g.data,children:e=>(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(D,{value:e}),(0,U.jsxs)(`div`,{className:`flex gap-2`,children:[(0,U.jsx)(E,{label:a(s,`system.computerMemory.enable`),action:()=>i.setComputerMemory(!0),invalidate:[`computerMemory`]}),(0,U.jsx)(E,{label:a(s,`system.computerMemory.disable`),action:()=>i.setComputerMemory(!1),invalidate:[`computerMemory`],variant:`destructive`})]})]})})]})}function Q(e,t,n){return t==null||t===``?n:typeof t==`boolean`?a(e,t?`system.value.enabled`:`system.value.disabled`):String(t)}function de({data:e}){let t=c(e=>e.language),n=s(e.presence||e.clients||e);return n.length?(0,U.jsx)(y,{items:n,titleKey:`user`,metaKey:`workspace_id`}):(0,U.jsx)(w,{title:a(t,`system.presence.empty`),detail:a(t,`system.presence.emptyDetail`)})}function fe({data:e}){let t=c(e=>e.mode),n=c(e=>e.language),i=Q(n,e.public_key,``);return t===`basic`?(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)($,{title:a(n,`system.device.thisMac`),status:a(n,`system.value.trusted`),detail:a(n,`system.device.thisMacDetail`)}),(0,U.jsx)(O,{variant:`muted`,children:Q(n,e.algorithm,a(n,`system.value.localIdentity`))})]}):(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,U.jsx)(O,{variant:`success`,children:a(n,`system.value.localDevice`)}),(0,U.jsx)(O,{variant:`muted`,children:Q(n,e.algorithm,a(n,`system.value.identityKey`))})]}),(0,U.jsx)(m,{data:{device_id:e.device_id||e.id||a(n,`system.value.notReported`),fingerprint:e.fingerprint||a(n,`system.value.notReported`),public_key:i?r(i.replace(/\s+/g,` `),72):a(n,`system.value.notReported`)}})]})}function pe({data:e}){let t=c(e=>e.mode),n=c(e=>e.language);return t===`basic`?(0,U.jsx)($,{title:a(n,`system.health.title`),status:a(n,`system.health.ok`),detail:a(n,`system.health.detail`)}):(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(b,{stats:[{label:a(n,`system.health.status`),value:e.status||e.ok||a(n,`system.value.reported`)},{label:a(n,`system.health.version`),value:e.version||a(n,`system.value.notReported`)},{label:a(n,`system.health.mode`),value:e.mode||e.environment||a(n,`system.value.local`)},{label:a(n,`system.health.port`),value:e.port||e.backend_port||a(n,`system.value.configured`)}]}),(0,U.jsx)(D,{value:e})]})}function me({data:e,mode:t,language:n}){let r=o(e.active)?e.active:e,i=o(e.postgres)?e.postgres:{},s=o(e.backup_health)?e.backup_health:{},c=r.vector_search||r.vector||e.vector_search||e.sqlite_vec,l=!!(i.available||i.connected||i.enabled),u=!!c&&String(c).toLowerCase()!==`not reported`;return t===`basic`?(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)($,{title:a(n,`system.storage.local.title`),status:a(n,`system.storage.local.badge`),detail:a(n,`system.storage.local.detail`)}),(0,U.jsx)($,{title:a(n,`system.storage.search.title`),status:u?a(n,`system.storage.search.on`):a(n,`system.storage.search.pending`),detail:u?a(n,`system.storage.search.detailOn`):a(n,`system.storage.search.detailPending`)})]}):(0,U.jsxs)(`div`,{className:`space-y-4`,children:[(0,U.jsx)(b,{stats:[{label:a(n,`system.storage.activeEngine`),value:r.engine||e.engine||a(n,`system.storage.sqlite`)},{label:a(n,`system.storage.sqliteDefault`),value:r.engine===`postgres`?a(n,`system.value.scaleMode`):a(n,`system.value.enabled`)},{label:a(n,`system.storage.vector`),value:c||a(n,`system.value.notReported`)},{label:a(n,`system.storage.postgres`),value:l?a(n,`system.value.available`):a(n,`system.value.optional`)}]}),(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:[(0,U.jsx)($,{title:a(n,`system.storage.sqlite`),status:r.available===!1?a(n,`system.value.unavailable`):a(n,`system.value.default`),detail:Q(n,r.reason||r.path||e.path,a(n,`system.storage.sqliteDetail`))}),(0,U.jsx)($,{title:a(n,`system.storage.vector`),status:Q(n,c,a(n,`system.value.reported`)),detail:Q(n,r.vector_reason||r.sqlite_vec_reason||e.vector_reason,a(n,`system.storage.vectorDetail`))}),(0,U.jsx)($,{title:a(n,`system.storage.postgres`),status:l?a(n,`system.value.available`):a(n,`system.value.notEnabled`),detail:Q(n,i.reason||i.dsn||i.status,a(n,`system.storage.postgresDetail`))})]}),Object.keys(s).length?(0,U.jsx)(D,{value:{backup_health:s}}):null]})}function he({data:e}){let t=c(e=>e.language);return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(b,{stats:[{label:a(t,`system.backup.available`),value:e.available===!1?a(t,`system.value.no`):a(t,`system.value.yes`)},{label:a(t,`system.backup.backups`),value:e.count||e.backups||0},{label:a(t,`system.backup.encrypted`),value:e.encrypted_archives||0},{label:a(t,`system.backup.zip`),value:e.zip_backups||0}]}),(0,U.jsx)(m,{data:{directory:e.directory||a(t,`system.value.notReported`),latest:e.latest||a(t,`system.value.noneReported`),last_verified:e.last_verified||e.verified_at||a(t,`system.value.notReported`),failure:e.error||e.reason||a(t,`system.value.noneReported`)}})]})}function $({title:e,status:t,detail:n}){let r=/unavailable|failed|denied|disabled|not enabled|사용 불가|실패|거부|비활성|활성화되지 않음/i.test(t)?`warning`:`success`;return(0,U.jsxs)(`div`,{className:`rounded-md border border-border bg-background p-3`,children:[(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,U.jsx)(`div`,{className:`font-medium`,children:e}),(0,U.jsx)(O,{variant:r,children:t})]}),(0,U.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:n})]})}function ge({data:e}){let t=c(e=>e.language),n=o(e.startup)?e.startup:{},r=o(e.privacy)?e.privacy:{},i=o(e.storage)?e.storage:{},s=o(e.backup)?e.backup:{},l=o(e.device_identity)?e.device_identity:{},u=o(e.permissions)?e.permissions:{};return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(b,{stats:[{label:a(t,`system.hardening.version`),value:e.version||a(t,`system.value.reported`)},{label:a(t,`system.hardening.localOnly`),value:r.local_only_default??n.local_only_default??a(t,`system.value.reported`)},{label:a(t,`system.hardening.storage`),value:o(i.active)?i.active.engine:a(t,`system.value.reported`)},{label:a(t,`system.hardening.backups`),value:s.count||s.available||a(t,`system.value.reported`)}]}),(0,U.jsxs)(`div`,{className:`flex flex-col sm:flex-row flex-wrap gap-3`,children:[(0,U.jsx)($,{title:a(t,`system.hardening.startup`),status:a(t,n.network_exposed?`system.value.networkExposed`:`system.value.localOnly`),detail:a(t,`system.hardening.startupDetail`)}),(0,U.jsx)($,{title:a(t,`system.hardening.integrations`),status:a(t,r.local_only_default===!1?`system.value.reviewRequired`:`system.value.optIn`),detail:a(t,`system.hardening.integrationsDetail`)}),(0,U.jsx)($,{title:a(t,`system.hardening.identity`),status:Q(t,l.algorithm||l.fingerprint,a(t,`system.value.reported`)),detail:Q(t,l.storage,a(t,`system.hardening.identityStorage`))}),(0,U.jsx)($,{title:a(t,`system.hardening.permissions`),status:a(t,u.destructive_restore_requires_confirmation===!1?`system.value.reviewRequired`:`system.value.guarded`),detail:a(t,`system.hardening.permissionsDetail`)})]})]})}function _e({data:e}){let t=c(e=>e.language),n=o(e.cards)?e.cards:{},r=o(e.severity_counts)?e.severity_counts:{};return(0,U.jsxs)(`div`,{className:`space-y-3`,children:[(0,U.jsx)(b,{stats:[{label:a(t,`system.security.eventsToday`),value:n.events_today||0},{label:a(t,`system.security.highRisk`),value:n.high_risk_events||r.high||0},{label:a(t,`system.security.review`),value:n.review_required||0},{label:a(t,`system.security.riskRate`),value:e.risk_rate||0}]}),(0,U.jsx)(D,{value:{severity_counts:r,sensitive_fields:e.field_counts||{}}})]})}function ve(){let e=c(e=>e.mode),t=c(e=>e.language),n=d({queryKey:[`adminSummary`],queryFn:i.adminSummary}),r=d({queryKey:[`adminUsers`],queryFn:i.adminUsers}),o=d({queryKey:[`adminAudit`],queryFn:()=>i.adminAudit()}),s=d({queryKey:[`adminRoles`],queryFn:i.adminRoles}),l=d({queryKey:[`adminPolicies`],queryFn:i.adminPolicies}),u=d({queryKey:[`adminProductHardening`],queryFn:i.adminProductHardening}),f=d({queryKey:[`adminSecurity`],queryFn:i.adminSecurity}),p=d({queryKey:[`vpcStatus`],queryFn:i.vpcStatus});return e===`admin`?(0,U.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,U.jsx)(S,{title:a(t,`system.admin.summary`),result:n.data,children:e=>(0,U.jsx)(m,{data:e})}),(0,U.jsx)(S,{title:a(t,`system.admin.users`),result:r.data,children:e=>(0,U.jsx)(y,{items:e,titleKey:`email`,metaKey:`role`})}),(0,U.jsx)(S,{title:a(t,`system.admin.audit`),result:o.data,children:e=>(0,U.jsx)(y,{items:e.recent_events||e,titleKey:`act`,metaKey:`sev`})}),(0,U.jsx)(S,{title:a(t,`system.admin.roles`),result:s.data,children:e=>(0,U.jsx)(y,{items:e.roles||e,titleKey:`role`,metaKey:`members`})}),(0,U.jsx)(S,{title:a(t,`system.admin.policies`),result:l.data,children:e=>(0,U.jsx)(y,{items:e.policies||e,titleKey:`label`,metaKey:`enforced`})}),(0,U.jsx)(S,{title:a(t,`system.admin.hardening`),result:u.data,children:e=>(0,U.jsx)(ge,{data:e})}),(0,U.jsx)(S,{title:a(t,`system.admin.security`),result:f.data,children:e=>(0,U.jsx)(_e,{data:e})}),(0,U.jsx)(S,{title:a(t,`system.admin.vpc`),result:p.data,children:e=>(0,U.jsxs)(`div`,{className:`space-y-2`,children:[(0,U.jsx)(O,{variant:`muted`,children:a(t,`system.admin.communityUnavailable`)}),(0,U.jsx)(D,{value:e})]})})]}):(0,U.jsx)(T,{title:a(t,`system.admin.controls`),detail:a(t,`system.admin.controlsDetail`),target:`admin`})}export{X as SystemPage};
@@ -1 +0,0 @@
1
- import{_ as e}from"./utils-Ddol2RWD.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
@@ -1 +0,0 @@
1
- import{_ as e}from"./utils-Ddol2RWD.js";var t=e(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]);export{t};