ltcai 9.9.5 → 9.9.9

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 (132) hide show
  1. package/README.md +41 -36
  2. package/docs/CHANGELOG.md +193 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +1 -1
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +3 -1
  7. package/docs/PERMISSION_MODE.md +107 -0
  8. package/docs/SURFACE_PARITY.md +38 -8
  9. package/docs/TRUST_MODEL.md +1 -1
  10. package/docs/WHY_LATTICE.md +1 -1
  11. package/docs/kg-schema.md +1 -1
  12. package/lattice_brain/__init__.py +1 -1
  13. package/lattice_brain/context.py +39 -4
  14. package/lattice_brain/graph/_kg_common.py +189 -14
  15. package/lattice_brain/graph/curator.py +62 -0
  16. package/lattice_brain/graph/discovery.py +76 -0
  17. package/lattice_brain/graph/ingest.py +37 -7
  18. package/lattice_brain/graph/retrieval_vector.py +10 -0
  19. package/lattice_brain/ingestion.py +9 -106
  20. package/lattice_brain/ingestion_jobs.py +133 -0
  21. package/lattice_brain/runtime/multi_agent.py +1 -1
  22. package/latticeai/__init__.py +1 -1
  23. package/latticeai/api/brain_intelligence.py +8 -0
  24. package/latticeai/api/chat.py +9 -0
  25. package/latticeai/api/chat_agent_http.py +119 -2
  26. package/latticeai/api/chat_contracts.py +9 -0
  27. package/latticeai/api/chat_documents.py +16 -0
  28. package/latticeai/api/evidence_actions.py +48 -0
  29. package/latticeai/api/permission_mode.py +61 -0
  30. package/latticeai/api/project_sessions.py +112 -0
  31. package/latticeai/api/voice_capture.py +89 -0
  32. package/latticeai/app_factory.py +53 -0
  33. package/latticeai/core/agent.py +381 -43
  34. package/latticeai/core/agent_permission.py +160 -0
  35. package/latticeai/core/agent_profiles.py +110 -0
  36. package/latticeai/core/artifact_ledger.py +109 -0
  37. package/latticeai/core/context_builder.py +101 -2
  38. package/latticeai/core/legacy_compatibility.py +1 -1
  39. package/latticeai/core/marketplace.py +1 -1
  40. package/latticeai/core/permission_mode.py +296 -0
  41. package/latticeai/core/project_sessions.py +337 -0
  42. package/latticeai/core/run_explain.py +421 -0
  43. package/latticeai/core/run_store.py +5 -0
  44. package/latticeai/core/workspace_os.py +15 -80
  45. package/latticeai/core/workspace_review_items.py +107 -0
  46. package/latticeai/integrations/telegram_bot.py +188 -0
  47. package/latticeai/runtime/chat_wiring.py +8 -0
  48. package/latticeai/runtime/context_runtime.py +11 -0
  49. package/latticeai/runtime/permission_mode_wiring.py +116 -0
  50. package/latticeai/runtime/router_registration.py +9 -0
  51. package/latticeai/services/app_context.py +3 -0
  52. package/latticeai/services/architecture_readiness.py +1 -1
  53. package/latticeai/services/brain_intelligence.py +105 -0
  54. package/latticeai/services/evidence_actions.py +254 -0
  55. package/latticeai/services/funnel_metrics.py +111 -16
  56. package/latticeai/services/local_knowledge.py +26 -0
  57. package/latticeai/services/memory_service.py +12 -0
  58. package/latticeai/services/permission_mode_service.py +170 -0
  59. package/latticeai/services/product_readiness.py +1 -1
  60. package/latticeai/services/tool_dispatch.py +73 -4
  61. package/latticeai/services/voice_capture.py +189 -0
  62. package/package.json +5 -3
  63. package/scripts/check_bundle_budget.mjs +11 -0
  64. package/scripts/check_current_release_docs.mjs +1 -1
  65. package/scripts/check_i18n_namespace_coverage.mjs +148 -0
  66. package/skills/meeting_notes/SKILL.md +82 -0
  67. package/skills/meeting_notes/examples.md +41 -0
  68. package/skills/meeting_notes/risk.json +9 -0
  69. package/skills/meeting_notes/schema.json +55 -0
  70. package/skills/weekly_review/SKILL.md +75 -0
  71. package/skills/weekly_review/examples.md +39 -0
  72. package/skills/weekly_review/risk.json +9 -0
  73. package/skills/weekly_review/schema.json +55 -0
  74. package/src-tauri/Cargo.lock +1 -1
  75. package/src-tauri/Cargo.toml +1 -1
  76. package/src-tauri/tauri.conf.json +1 -1
  77. package/static/app/asset-manifest.json +37 -29
  78. package/static/app/assets/Act-BFbpl2_Y.js +1 -0
  79. package/static/app/assets/AdminConsole-DaZPha9Y.js +1 -0
  80. package/static/app/assets/Brain-DGrV0heZ.js +321 -0
  81. package/static/app/assets/BrainHome-Re6Zxh_W.js +2 -0
  82. package/static/app/assets/BrainSignals-BQ11jDpJ.js +1 -0
  83. package/static/app/assets/Capture-DRaf1zLH.js +1 -0
  84. package/static/app/assets/CommandPalette-DAKPm4uJ.js +1 -0
  85. package/static/app/assets/LanguageSwitcher-BgTwHoWv.js +1 -0
  86. package/static/app/assets/Library-BVtrSt12.js +1 -0
  87. package/static/app/assets/LivingBrain-7glOmK0R.js +1 -0
  88. package/static/app/assets/ProductFlow-cB3EFinZ.js +1 -0
  89. package/static/app/assets/ReviewCard-CShhHS-w.js +3 -0
  90. package/static/app/assets/System-B4nQDy8a.js +1 -0
  91. package/static/app/assets/{bot-VmP0kkeA.js → bot-DtKkLfXj.js} +1 -1
  92. package/static/app/assets/brain-wVV63_1z.js +1 -0
  93. package/static/app/assets/button-BTxZDMFJ.js +1 -0
  94. package/static/app/assets/{circle-pause-T9POo4qy.js → circle-pause--qxF9-EO.js} +1 -1
  95. package/static/app/assets/{circle-play-Bz5iTD0p.js → circle-play-89x3S6jm.js} +1 -1
  96. package/static/app/assets/{cpu-CJhjRtNq.js → cpu-DTUI63vo.js} +1 -1
  97. package/static/app/assets/download-EJS5_O0f.js +1 -0
  98. package/static/app/assets/{folder-open-B2K_22VI.js → folder-open-BL9zYTnc.js} +1 -1
  99. package/static/app/assets/{hard-drive-CjJtYqHf.js → hard-drive-BFnwi1Lu.js} +1 -1
  100. package/static/app/assets/index-BFtDYI6l.js +10 -0
  101. package/static/app/assets/index-BY9bpxyx.css +2 -0
  102. package/static/app/assets/input-DEz5UjBz.js +1 -0
  103. package/static/app/assets/{network-Ck1nqc-v.js → network-zKa3jAwl.js} +1 -1
  104. package/static/app/assets/primitives-jNrZm2O9.js +1 -0
  105. package/static/app/assets/search-ku6-_6wY.js +1 -0
  106. package/static/app/assets/shield-alert-CpHeCsaF.js +1 -0
  107. package/static/app/assets/textarea-DpcQkn75.js +1 -0
  108. package/static/app/assets/{useFocusTrap-CsnIhsDJ.js → useFocusTrap-58TNCONM.js} +1 -1
  109. package/static/app/assets/{navigation-BPQqEQwr.js → useQuery-CcVlXlBd.js} +1 -1
  110. package/static/app/assets/users-C0cFMj6o.js +1 -0
  111. package/static/app/assets/utils-DYf7pqrR.js +7 -0
  112. package/static/app/assets/workspace-CjthHsLN.js +1 -0
  113. package/static/app/index.html +4 -4
  114. package/static/sw.js +1 -1
  115. package/static/app/assets/Act-DmxfbqBp.js +0 -1
  116. package/static/app/assets/Brain-DK_zKCda.js +0 -321
  117. package/static/app/assets/BrainHome-CCE_0hni.js +0 -2
  118. package/static/app/assets/BrainSignals-r_J68_zh.js +0 -1
  119. package/static/app/assets/Capture-CvxwzpJZ.js +0 -1
  120. package/static/app/assets/CommandPalette-CVLiFIQC.js +0 -1
  121. package/static/app/assets/Library-4As9VUvy.js +0 -1
  122. package/static/app/assets/LivingBrain-BVWk58MW.js +0 -1
  123. package/static/app/assets/ProductFlow-B-Tz0Um4.js +0 -1
  124. package/static/app/assets/ReviewCard-Va3fPQuj.js +0 -3
  125. package/static/app/assets/System-DSR2zKWd.js +0 -1
  126. package/static/app/assets/index-7FAfYm4v.css +0 -2
  127. package/static/app/assets/index-CEu0Wqjl.js +0 -10
  128. package/static/app/assets/input-CSi6OBJ9.js +0 -1
  129. package/static/app/assets/primitives-B2f9N7Dh.js +0 -1
  130. package/static/app/assets/shield-alert-yA_Y8lOB.js +0 -1
  131. package/static/app/assets/textarea-C4wM0D-Z.js +0 -1
  132. package/static/app/assets/utils-BqoznzGP.js +0 -7
@@ -0,0 +1 @@
1
+ import{f as e,g as t,h as n,m as r,p as i,t as a,u as o,v as s,x as c,y as l}from"./utils-DYf7pqrR.js";import{i as u,r as d,t as f}from"./LivingBrain-7glOmK0R.js";import{n as p,t as m}from"./input-DEz5UjBz.js";import{t as h}from"./cpu-DTUI63vo.js";import{s as g,y as _}from"./index-BFtDYI6l.js";import"./brain-wVV63_1z.js";import{t as v}from"./button-BTxZDMFJ.js";var y=n(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]),b=n(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),x=n(`star`,[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`,key:`r04s7s`}]]),S=n(`zap`,[[`path`,{d:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`,key:`1xq2db`}]]),C=c(l());r({ko:{"flow.analysis.fact.computer":`컴퓨터`,"flow.analysis.fact.memory":`메모리`,"flow.analysis.fact.graphics":`그래픽`,"flow.analysis.fact.support":`로컬 지원`,"flow.analysis.fact.models":`모델`,"flow.analysis.checking":`확인 중`,"flow.analysis.fact.computerDetail":`운영체제와 칩`,"flow.analysis.fact.memoryDetail":`로컬 사고를 위한 여유 공간`,"flow.analysis.fact.graphicsDetail":`로컬 가속 지원`,"flow.analysis.fact.supportDetail":`설치된 모델 도우미`,"flow.analysis.fact.modelsDetail":`설치된 로컬 Brain`,"flow.analysis.apple":`Apple Silicon Mac`,"flow.analysis.detected":`감지됨`,"flow.analysis.localReady":`로컬 가속 준비됨`,"flow.analysis.standardLocal":`표준 로컬 모드`,"flow.analysis.supportReady":`준비됨`,"flow.analysis.supportInstall":`준비 예정`,"flow.analysis.modelsInstalled":`{count}개 이미 설치됨`,"flow.analysis.noModels":`아직 설치된 모델 없음`,"flow.analysis.readyDetail":`로컬 Digital Brain 사용 준비 완료`,"flow.analysis.memoryReadyDetail":`추천 모델에 충분한 컨텍스트`,"flow.analysis.graphicsReadyDetail":`Lattice가 가장 좋은 경로를 선택합니다.`,"flow.analysis.supportReadyDetail":`설치된 모델 도우미가 감지되었습니다.`,"flow.analysis.supportInstallDetail":`Lattice가 필요한 항목을 추가합니다.`,"flow.analysis.modelsReadyDetail":`즉시 로드할 수 있는 모델이 있습니다.`,"flow.analysis.modelsInstallDetail":`Lattice가 첫 설치를 안내합니다.`,"flow.recommend.reason.best":`최적 경험`,"flow.recommend.reason.faster":`빠른 선택`,"flow.recommend.reason.advanced":`고급 선택`,"flow.recommend.reason.default":`추천`,"flow.recommend.sizeReady":`준비됨`,"flow.recommend.fallbackName":`추천 Brain`,"flow.install.stage.download":`모델 파일을 받는 중입니다.`,"flow.install.stage.validate":`Brain이 응답할 수 있는지 확인 중입니다.`,"flow.install.stage.load":`Brain을 불러오는 중입니다.`,"flow.install.stage.error":`확인이 필요한 일이 있습니다.`,"flow.install.step.install":`준비`,"flow.install.step.download":`다운로드`,"flow.install.step.ready":`로컬 확인`,"flow.install.step.validate":`확인`,"flow.install.step.load":`로드`,"flow.analysis.hardware.icon.chip":`🖥️`,"flow.analysis.hardware.icon.ram":`🧠`,"flow.analysis.hardware.icon.gpu":`⚡`,"flow.analysis.hardware.icon.support":`🧩`,"flow.analysis.hardware.icon.models":`📦`,"flow.analysis.hardware.label.chip":`컴퓨터 (운영체제와 칩)`,"flow.analysis.hardware.label.ram":`메모리 (생각할 작업 공간, RAM)`,"flow.analysis.hardware.label.gpu":`그래픽 (계산을 도와주는 GPU)`,"flow.analysis.hardware.label.support":`로컬 지원 (모델 실행 도우미)`,"flow.analysis.hardware.label.models":`모델 (설치된 AI Brain)`,"flow.recommend.timeEstimate":`다운로드 약 {download} · 첫 응답 약 {response}초`,"flow.recommend.timeEstimate.ready":`다운로드 불필요 · 첫 응답 약 {response}초`,"flow.recommend.timeEstimate.unknown":`다운로드 시간 미확인 · 첫 응답 약 {response}초`,"flow.recommend.timeNote":`네트워크 속도에 따라 달라질 수 있어요.`,"flow.recommend.minutes":`{count}분`,"flow.recommend.comparison.faster":`(더 빠름)`,"flow.recommend.comparison.advanced":`(더 강력함)`,"flow.recommend.choose":`이 모델 선택`,"flow.recommend.primaryNote":`약 {time} 후 사용 준비 완료`,"flow.recommend.primaryNote.ready":`다운로드 없이 바로 사용 준비 완료`,"flow.recommend.primaryNote.unknown":`다운로드 시간 확인 후 사용 준비`,"flow.recommend.nextHint":`선택하면 다운로드와 준비 화면으로 넘어가고, 끝나면 바로 Brain이 열립니다.`,"flow.recommend.nextHint.ready":`선택하면 준비 확인 화면으로 넘어가고, 끝나면 바로 Brain이 열립니다.`,"flow.install.expectedTitle":`예상 진행`,"flow.install.expected":`약 {download} 다운로드 후 약 {response}초 안에 첫 응답`,"flow.install.expected.ready":`다운로드 없이 약 {response}초 안에 첫 응답`,"flow.install.expected.unknown":`다운로드 후 약 {response}초 안에 첫 응답`,"flow.install.timelineStep.download":`모델 다운로드`,"flow.install.timelineStep.ready":`로컬 모델 확인`,"flow.install.timelineStep.validate":`응답 확인`,"flow.install.timelineStep.load":`Brain에 로드`,"flow.install.timelineApprox":`약 {time}`,"flow.install.timelineQuick":`잠깐`,"flow.install.expectedCompletion":`끝나면 바로 Brain이 열립니다.`,"flow.shell":`내 로컬 AI 브레인 만들기`,"flow.wake.aria":`Brain 깨우기`,"flow.wake.title":`내 지식이 살아나는 Brain을 시작하세요.`,"flow.wake.body":`Lattice AI는 이 컴퓨터 안에서 내 대화, 문서, 결정이 오래 남는 작업 기억이 되게 합니다. 모델은 바꿔도 Brain은 계속 내 것입니다.`,"flow.wake.value.aria":`Brain 시작 가치`,"flow.wake.value.local.k":`완전 로컬`,"flow.wake.value.local.v":`지식과 대화는 이 컴퓨터에서 먼저 정리됩니다.`,"flow.wake.value.instant.k":`바로 이해`,"flow.wake.value.instant.v":`복잡한 설정 대신 3단계로 첫 대화를 엽니다.`,"flow.wake.value.brain.k":`지속되는 Brain`,"flow.wake.value.brain.v":`모델을 바꿔도 내 기억과 그래프는 이어집니다.`,"flow.wake.plan.aria":`Brain 시작 단계`,"flow.wake.step.identity":`주인 확인`,"flow.wake.step.check":`컴퓨터 확인`,"flow.wake.step.voice":`목소리 선택`,"flow.wake.primary":`Brain 지금 깨우기`,"flow.wake.existing":`기존 Brain 열기`,"flow.wake.startNote":`평균 2분 안에 첫 대화 시작 · 로컬 우선 · 사용자가 제어`,"flow.login.title":`이 Brain의 주인을 정합니다.`,"flow.login.body":`프로필은 로컬 Brain의 소유권을 묶는 기준입니다. 기존 Brain이 있으면 새로 만들기 전에 먼저 안전하게 확인합니다.`,"flow.name":`이름`,"flow.name.placeholder":`나`,"flow.email":`이메일`,"flow.email.placeholder":`you@local`,"flow.password":`비밀번호`,"flow.password.placeholder":`로컬 Brain 비밀번호`,"flow.login.busy":`Brain 여는 중...`,"flow.login.submit":`내 Brain 시작하기`,"flow.login.note":`이 프로필은 내 AI 브레인의 주인입니다. 기존 Brain과 다른 이메일이면 새로 만들지 않고 먼저 확인합니다.`,"flow.login.passwordLocal":`이 비밀번호는 이 컴퓨터의 Brain 전용입니다. 클라우드로 전송되지 않습니다.`,"flow.login.missing":`이름과 이메일, 비밀번호를 입력하면 기존 Brain을 안전하게 확인합니다.`,"flow.login.otherEmail":`이 컴퓨터의 기존 Brain과 다른 이메일입니다. 오타인지 확인해 주세요.`,"flow.login.wrongPassword":`기존 Brain 이메일은 맞지만 비밀번호가 다릅니다. 비밀번호를 다시 확인해 주세요.`,"flow.login.unavailable":`로컬 프로필을 열 수 없습니다. 이메일과 비밀번호를 확인해 주세요.`,"flow.promise.memory.k":`오래 남는 지식`,"flow.promise.memory.v":`내 일이 장기 기억이 됩니다.`,"flow.promise.model.k":`교체 가능한 모델`,"flow.promise.model.v":`모델은 목소리이고, 자산은 Brain입니다.`,"flow.promise.ownership.k":`사용자 소유`,"flow.promise.ownership.v":`백업, 복원, 이동을 직접 결정합니다.`,"flow.promise.aria":`Lattice AI 제품 약속`,"flow.analysis.title":`이 컴퓨터에 맞는 Brain 경험을 확인합니다.`,"flow.analysis.body":`스펙 점수가 아니라, 이 Mac에서 어떤 로컬 AI 브레인 경험이 편한지 보여드립니다. 확인은 로컬 상태를 읽는 것이고, 클라우드 모델은 선택 사항입니다.`,"flow.analysis.finding":`가장 편한 설정을 찾는 중...`,"flow.analysis.ready":`추천 모델을 바로 시작할 수 있게 준비했습니다.`,"flow.analysis.wait":`잠시만 기다리면 자동으로 정리됩니다.`,"flow.analysis.error":`Lattice가 이 컴퓨터를 끝까지 확인하지 못했습니다. 그래도 안전한 기본값으로 계속할 수 있습니다.`,"flow.analysis.continue":`추천 모델 보기`,"flow.analysis.bestFit":`{model}이 이 컴퓨터에 가장 잘 맞습니다.`,"flow.analysis.privateRecommended":`이 컴퓨터에는 개인 로컬 Brain을 추천합니다.`,"flow.analysis.os.windows":`Windows PC`,"flow.analysis.os.linux":`Linux 컴퓨터`,"flow.recommend.title":`추천대로 시작하세요.`,"flow.recommend.environment.apple":`컴퓨터 준비 완료: 로컬 MLX 지원(Apple Silicon, {ram}GB RAM 감지)`,"flow.recommend.environment.standard":`권장: 가벼운 로컬 모델로 시작하세요({ram}GB RAM 감지)`,"flow.recommend.body":`모델은 Brain의 현재 목소리입니다. 추천, 빠른 선택, 강한 선택만 먼저 보여드려 바로 결정할 수 있게 합니다.`,"flow.recommend.primary":`추천으로 바로 시작`,"flow.recommend.unsupported":`이 컴퓨터에서 추가 확인이 필요합니다`,"flow.recommend.back":`뒤로`,"flow.recommend.skip":`모델 없이 Brain 열기`,"flow.recommend.hint":`잘 모르겠다면 추천대로 시작하면 됩니다.`,"flow.recommend.loading":`이 컴퓨터에 맞는 모델을 확인하는 중...`,"flow.recommend.unavailable.aria":`로컬 모델 준비 상태`,"flow.recommend.unavailable.title":`지금은 이 컴퓨터에서 바로 쓸 로컬 모델을 준비하지 못했습니다.`,"flow.recommend.unavailable.probe":`Lattice가 이 컴퓨터의 로컬 환경을 확인하지 못했습니다. 네트워크와 로컬 서비스 상태를 확인한 뒤 다시 시도해 주세요.`,"flow.recommend.unavailable.empty":`이 컴퓨터에서 바로 실행할 수 있는 추천 모델을 찾지 못했습니다. 다시 확인하거나, 모델 없이 Brain을 먼저 열 수 있습니다.`,"flow.recommend.unavailable.retry":`다시 확인`,"flow.recommend.unavailable.hint":`모델은 나중에 라이브러리에서 언제든 추가할 수 있습니다.`,"flow.recommend.rank.best":`추천`,"flow.recommend.rank.faster":`빠른 선택`,"flow.recommend.rank.advanced":`고급 선택`,"flow.recommend.rank.choice":`선택 {index}`,"flow.install.title":`모델을 설치하고 시작합니다.`,"flow.install.title.ready":`모델을 준비하고 시작합니다.`,"flow.install.body":`이 모델이 Brain의 로컬 목소리가 됩니다. 다운로드는 사용자가 시작할 때만 진행되고, 실행과 기억은 이 컴퓨터에서 유지됩니다.`,"flow.install.body.ready":`이 모델이 Brain의 로컬 목소리가 됩니다. 이미 준비된 모델은 외부 다운로드 없이 응답 확인과 로드만 진행합니다.`,"flow.install.wait":`Brain이 사용할 모델을 기다리고 있습니다.`,"flow.install.prepare":`Brain 준비 중입니다.`,"flow.install.done":`Brain이 준비되었습니다.`,"flow.install.note":`큰 모델은 다운로드에 몇 분 이상 걸릴 수 있습니다. 진행률은 모델 런타임이 알려주는 만큼 표시하고, 멈춘 것처럼 보여도 현재 단계가 유지됩니다.`,"flow.install.note.ready":`로컬 응답 확인은 보통 잠깐이면 끝납니다. 실패하면 다른 모델을 고르거나 나중에 다시 시도할 수 있습니다.`,"flow.install.retry":`다른 모델을 고르거나 다시 시도할 수 있습니다.`,"flow.install.back":`다른 모델 고르기`,"flow.install.start":`다운로드하고 시작하기`,"flow.install.startReady":`준비하고 시작하기`,"flow.install.busy":`모델 준비 중...`,"flow.install.enter":`Brain으로 들어가기`,"flow.install.later":`나중에 하기`,"flow.install.local":`모델 다운로드와 외부 통신은 사용자가 시작할 때만 진행됩니다.`,"flow.install.local.ready":`이 선택은 외부 다운로드 없이 로컬 준비 상태만 확인합니다.`,"flow.consent.title":`다운로드 전 확인`,"flow.consent.readyTitle":`로컬 준비 상태`,"flow.consent.body":`시작하면 아래 모델 파일을 외부 저장소에서 받아 이 컴퓨터에 저장합니다.`,"flow.consent.ready":`이미 준비된 모델입니다. 시작해도 외부 다운로드를 요청하지 않고 로컬에서 응답 가능 여부만 확인합니다.`,"flow.consent.state":`다운로드 필요`,"flow.consent.stateReady":`없음`,"flow.consent.size":`다운로드 크기`,"flow.consent.sizeUnknown":`런타임 확인 후 표시`,"flow.consent.location":`저장 위치`,"flow.consent.external":`외부 접속 대상`,"flow.consent.externalUnknown":`런타임 확인 후 표시`,"flow.consent.externalNone":`선택 전 외부 접속 없음`},en:{"flow.analysis.fact.computer":`Computer`,"flow.analysis.fact.memory":`Memory`,"flow.analysis.fact.graphics":`Graphics`,"flow.analysis.fact.support":`Local Support`,"flow.analysis.fact.models":`Models`,"flow.analysis.checking":`Checking`,"flow.analysis.fact.computerDetail":`Operating system and chip`,"flow.analysis.fact.memoryDetail":`Available room for local thinking`,"flow.analysis.fact.graphicsDetail":`Local acceleration support`,"flow.analysis.fact.supportDetail":`Installed model helpers`,"flow.analysis.fact.modelsDetail":`Installed local Brains`,"flow.analysis.apple":`Apple Silicon Mac`,"flow.analysis.detected":`Detected`,"flow.analysis.localReady":`Local acceleration ready`,"flow.analysis.standardLocal":`Standard local mode`,"flow.analysis.supportReady":`Ready`,"flow.analysis.supportInstall":`Will be prepared`,"flow.analysis.modelsInstalled":`{count} already installed`,"flow.analysis.noModels":`None installed yet`,"flow.analysis.readyDetail":`Ready for local Digital Brain use`,"flow.analysis.memoryReadyDetail":`Enough context for the recommended model`,"flow.analysis.graphicsReadyDetail":`Lattice will choose the best available path`,"flow.analysis.supportReadyDetail":`Installed model helpers detected`,"flow.analysis.supportInstallDetail":`Lattice will add what is needed`,"flow.analysis.modelsReadyDetail":`One can be loaded immediately`,"flow.analysis.modelsInstallDetail":`Lattice will guide the first install`,"flow.recommend.reason.best":`Best Experience`,"flow.recommend.reason.faster":`Faster`,"flow.recommend.reason.advanced":`Advanced`,"flow.recommend.reason.default":`Recommended`,"flow.recommend.sizeReady":`ready`,"flow.recommend.fallbackName":`Recommended Brain`,"flow.install.stage.download":`Getting the model files.`,"flow.install.stage.validate":`Checking that the Brain can answer.`,"flow.install.stage.load":`Loading the Brain.`,"flow.install.stage.error":`Something needs attention.`,"flow.install.step.install":`Install`,"flow.install.step.download":`Download`,"flow.install.step.ready":`Local check`,"flow.install.step.validate":`Validate`,"flow.install.step.load":`Load`,"flow.analysis.hardware.icon.chip":`🖥️`,"flow.analysis.hardware.icon.ram":`🧠`,"flow.analysis.hardware.icon.gpu":`⚡`,"flow.analysis.hardware.icon.support":`🧩`,"flow.analysis.hardware.icon.models":`📦`,"flow.analysis.hardware.label.chip":`Computer (operating system and chip)`,"flow.analysis.hardware.label.ram":`Memory (working space to think, RAM)`,"flow.analysis.hardware.label.gpu":`Graphics (the GPU that speeds up math)`,"flow.analysis.hardware.label.support":`Local support (helpers that run models)`,"flow.analysis.hardware.label.models":`Models (AI Brains already installed)`,"flow.recommend.timeEstimate":`Download about {download} · first reply about {response}s`,"flow.recommend.timeEstimate.ready":`No download needed · first reply about {response}s`,"flow.recommend.timeEstimate.unknown":`Download time unknown · first reply about {response}s`,"flow.recommend.timeNote":`Actual time depends on your network speed.`,"flow.recommend.minutes":`{count} min`,"flow.recommend.comparison.faster":`(faster)`,"flow.recommend.comparison.advanced":`(more capable)`,"flow.recommend.choose":`Choose this model`,"flow.recommend.primaryNote":`Ready to use in about {time}`,"flow.recommend.primaryNote.ready":`Ready with no download`,"flow.recommend.primaryNote.unknown":`Ready after download time is confirmed`,"flow.recommend.nextHint":`Choosing takes you to download and setup, then your Brain opens automatically.`,"flow.recommend.nextHint.ready":`Choosing takes you to a readiness check, then your Brain opens automatically.`,"flow.install.expectedTitle":`What to expect`,"flow.install.expected":`About {download} to download, then a first reply within about {response}s`,"flow.install.expected.ready":`No download — first reply within about {response}s`,"flow.install.expected.unknown":`After download, a first reply within about {response}s`,"flow.install.timelineStep.download":`Download model`,"flow.install.timelineStep.ready":`Check local model`,"flow.install.timelineStep.validate":`Check the reply`,"flow.install.timelineStep.load":`Load into Brain`,"flow.install.timelineApprox":`about {time}`,"flow.install.timelineQuick":`moment`,"flow.install.expectedCompletion":`When it finishes, your Brain opens right away.`,"flow.shell":`Create your local AI Brain`,"flow.wake.aria":`Wake your Brain`,"flow.wake.title":`Start the Brain where your knowledge comes alive.`,"flow.wake.body":`Lattice AI turns your conversations, documents, and decisions into durable working memory on this computer. Models can change while your Brain remains yours.`,"flow.wake.value.aria":`Brain startup value`,"flow.wake.value.local.k":`Fully local`,"flow.wake.value.local.v":`Knowledge and conversations are organized on this computer first.`,"flow.wake.value.instant.k":`Clear start`,"flow.wake.value.instant.v":`Open the first conversation in three guided steps.`,"flow.wake.value.brain.k":`Durable Brain`,"flow.wake.value.brain.v":`Your memories and graph continue even when models change.`,"flow.wake.plan.aria":`Brain start steps`,"flow.wake.step.identity":`Confirm owner`,"flow.wake.step.check":`Check computer`,"flow.wake.step.voice":`Choose voice`,"flow.wake.primary":`Wake Brain`,"flow.wake.existing":`Open existing Brain`,"flow.wake.startNote":`First conversation in about 2 minutes · local-first · user controlled`,"flow.login.title":`Choose the owner of this Brain.`,"flow.login.body":`Your profile anchors ownership of the local Brain. If a Brain already exists here, Lattice checks safely before creating anything new.`,"flow.name":`Name`,"flow.name.placeholder":`You`,"flow.email":`Email`,"flow.email.placeholder":`you@local`,"flow.password":`Password`,"flow.password.placeholder":`Local Brain password`,"flow.login.busy":`Opening Brain...`,"flow.login.submit":`Start my Brain`,"flow.login.note":`This profile owns your AI Brain. If the email differs from this computer's Brain, Lattice checks before creating anything new.`,"flow.login.passwordLocal":`This password is only for the Brain on this computer. It is not sent to the cloud.`,"flow.login.missing":`Enter your name, email, and password so Lattice can safely check your Brain.`,"flow.login.otherEmail":`This email differs from the Brain on this computer. Please check for a typo.`,"flow.login.wrongPassword":`The email matches this Brain, but the password is different. Please check it again.`,"flow.login.unavailable":`Could not open the local profile. Check your email and password.`,"flow.promise.memory.k":`Durable knowledge`,"flow.promise.memory.v":`Your work becomes long-term memory.`,"flow.promise.model.k":`Replaceable models`,"flow.promise.model.v":`The model is the voice; the Brain is the asset.`,"flow.promise.ownership.k":`User owned`,"flow.promise.ownership.v":`You decide when to back up, restore, or move it.`,"flow.promise.aria":`Lattice AI product promise`,"flow.analysis.title":`Checking the Brain experience for this computer.`,"flow.analysis.body":`This is not a spec score. Lattice reads local capability and explains which local AI Brain experience will feel comfortable on this Mac. Cloud models remain optional.`,"flow.analysis.finding":`Finding the easiest setup...`,"flow.analysis.ready":`Your recommended model is ready to start.`,"flow.analysis.wait":`This will be summarized automatically in a moment.`,"flow.analysis.error":`Lattice could not finish checking this computer. You can still continue with a safe default.`,"flow.analysis.continue":`View recommended models`,"flow.analysis.bestFit":`{model} looks like the best fit.`,"flow.analysis.privateRecommended":`A private local Brain is recommended for this computer.`,"flow.analysis.os.windows":`Windows PC`,"flow.analysis.os.linux":`Linux computer`,"flow.recommend.title":`Start with the recommendation.`,"flow.recommend.environment.apple":`Computer ready: local MLX supported (Apple Silicon, {ram}GB RAM detected)`,"flow.recommend.environment.standard":`Recommended: start with a lighter local model ({ram}GB RAM detected)`,"flow.recommend.body":`The model is your Brain's current voice. Lattice shows the recommendation, a faster choice, and a stronger choice first so you can decide quickly.`,"flow.recommend.primary":`Start with recommendation`,"flow.recommend.unsupported":`This computer needs one more check`,"flow.recommend.back":`Back`,"flow.recommend.skip":`Open Brain without a model`,"flow.recommend.hint":`If unsure, start with the recommendation.`,"flow.recommend.loading":`Checking which model fits this computer...`,"flow.recommend.unavailable.aria":`Local model readiness`,"flow.recommend.unavailable.title":`A local model isn't ready to run on this computer yet.`,"flow.recommend.unavailable.probe":`Lattice couldn't check this computer's local environment. Check your network and local services, then try again.`,"flow.recommend.unavailable.empty":`No recommended model can run on this computer right now. Try checking again, or open your Brain without a model first.`,"flow.recommend.unavailable.retry":`Check again`,"flow.recommend.unavailable.hint":`You can add a model anytime later from the library.`,"flow.recommend.rank.best":`Best Experience`,"flow.recommend.rank.faster":`Faster`,"flow.recommend.rank.advanced":`Advanced`,"flow.recommend.rank.choice":`Choice {index}`,"flow.install.title":`Install the model and start.`,"flow.install.title.ready":`Prepare the model and start.`,"flow.install.body":`This model becomes your Brain's local voice. Download starts only when you choose it; execution and memory stay on this computer.`,"flow.install.body.ready":`This model becomes your Brain's local voice. Because it is already ready, Lattice only checks the reply path and loads it locally.`,"flow.install.wait":`Waiting for the model your Brain will use.`,"flow.install.prepare":`Preparing your Brain.`,"flow.install.done":`Your Brain is ready.`,"flow.install.note":`Large models can take several minutes to download. Progress is shown when the model runtime reports it; a steady stage still means work is continuing.`,"flow.install.note.ready":`The local reply check usually takes a moment. If it fails, choose another model or try again later.`,"flow.install.retry":`Choose another model or try again.`,"flow.install.back":`Choose another model`,"flow.install.start":`Download and start`,"flow.install.startReady":`Check and start`,"flow.install.busy":`Preparing model...`,"flow.install.enter":`Enter Brain`,"flow.install.later":`Do later`,"flow.install.local":`Downloads and external communication start only when you choose them.`,"flow.install.local.ready":`This choice checks local readiness without starting an external download.`,"flow.consent.title":`Before downloading`,"flow.consent.readyTitle":`Local readiness`,"flow.consent.body":`Starting will fetch these model files from an external repository and store them on this computer.`,"flow.consent.ready":`This model is already ready. Starting checks whether it can answer locally without requesting an external download.`,"flow.consent.state":`Download needed`,"flow.consent.stateReady":`No`,"flow.consent.size":`Download size`,"flow.consent.sizeUnknown":`Reported by runtime`,"flow.consent.location":`Storage location`,"flow.consent.external":`External target`,"flow.consent.externalUnknown":`Reported by runtime`,"flow.consent.externalNone":`No external connection before selection`}});function ee(e){let t=j(e?.models),n=[...a(t.recommended),...a(t.catalog)],r=j(e?.recommendations?.recommendations),i=a(r.models),o=j(r.top_pick),s=new Map;for(let e of[...i,...n]){let t=String(e.id||e.model_id||e.recommended_load_id||``);t&&s.set(t,{...s.get(t)||{},...e})}o.id&&!s.has(String(o.id))&&s.set(String(o.id),o);let c=Array.from(s.values()).map(E).filter(e=>e.id),l=c.filter(e=>e.supported),u=l.length?l:c,d=(e=>u.find(t=>t.id===String(e)))(o.id)||(e=>u.find(t=>e.test(`${t.name} ${t.id}`)))(/gemma.*12|12b/i)||u[0],f=u.find(e=>e.id!==d?.id&&/qwen|8b|7b/i.test(`${e.name} ${e.id}`))||u.find(e=>e.id!==d?.id),p=u.find(e=>e.id!==d?.id&&e.id!==f?.id&&/26b|32b|70b|advanced/i.test(`${e.name} ${e.id}`))||u.find(e=>e.id!==d?.id&&e.id!==f?.id);return[d?{...d,role:`best`,reason:d.reason||`best`}:null,f?{...f,role:`faster`,reason:f.reason||`faster`}:null,p?{...p,role:`advanced`,reason:p.reason||`advanced`}:null].filter(Boolean)}function w(e){let{analysis:t,endpoints:n}=e;if(!n)return{status:`loading`,recommendations:[],reason:null,failedEndpoints:[]};let r=Object.keys(n).filter(e=>!n[e]);if(!(n.recommendations||n.models))return{status:`unavailable`,recommendations:[],reason:`probe_failed`,failedEndpoints:r};let i=ee(t).filter(e=>e.supported);return i.length?{status:`ready`,recommendations:i,reason:null,failedEndpoints:r}:{status:`unavailable`,recommendations:[],reason:`no_supported_model`,failedEndpoints:r}}function T(){return{id:`mlx-community/Qwen3-VL-8B-Instruct-4bit`,loadId:`mlx-community/Qwen3-VL-8B-Instruct-4bit`,engine:`local_mlx`,name:`Qwen3-VL 8B`,shortName:`Qwen 3`,family:`Qwen 3`,size:``,role:`best`,reason:`best`,supported:!0,downloadRequired:!1,downloadSize:``,storageLocation:`~/.latticeai/models`,externalHost:``,estimatedDownloadMinutes:0,estimatedFirstResponseSeconds:5,parameterBillions:8}}function E(e){let t=j(e.runtime_compatibility),n=String(e.id||e.model_id||e.recommended_load_id||``),r=String(e.recommended_load_id||e.load_id||n),i=String(e.display_name||e.name||n||`recommended_brain`),a=e.load_status!==`unsupported`&&e.load_status!==`runtime_update_needed`&&e.status!==`not_recommended`&&t.supported!==!1,o=!!e.download_required,s=o?String(e.download_size||e.size||``):``,c=D(`${i} ${n}`);return{id:n,loadId:r,engine:String(e.recommended_engine||e.engine||`local_mlx`),name:i,shortName:A(i||n),family:A(String(e.family||i||`local_brain`)),size:String(e.size||``),role:`best`,reason:String(e.reason||``),supported:a,downloadRequired:o,downloadSize:s,storageLocation:String(e.storage_location||e.local_path||`~/.latticeai/models`),externalHost:o?k(e):``,estimatedDownloadMinutes:o?ne(s):0,estimatedFirstResponseSeconds:O(c),parameterBillions:c}}function te(e){let t=String(e||``).match(/([\d.]+)\s*(t|g|m)?b?/i);if(!t)return null;let n=Number(t[1]);if(!Number.isFinite(n)||n<=0)return null;let r=(t[2]||`g`).toLowerCase();return r===`t`?n*1024*1024:r===`m`?n:n*1024}function ne(e){let t=te(e);if(t===null)return null;let n=t/(15/8)/60;return Math.max(1,Math.round(n))}function D(e){let t=String(e||``).match(/(\d{1,3}(?:\.\d)?)\s*b\b/i);if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)&&n>0?n:null}function O(e){return e===null?8:e<=9?5:e<=16?10:e<=40?18:30}function k(e){let t=String(e.source_url||e.download_url||e.repository||e.provider||e.id||``);return t?/huggingface|hf\\.co|mlx-community/i.test(t)?`huggingface`:/ollama/i.test(t)?`ollama`:t.replace(/^https?:\/\//,``).split(`/`)[0]||t:``}function A(e){return String(e||`recommended_brain`).replace(/^mlx-community\//i,``).replace(/[-_]?Instruct/gi,``).replace(/[-_]?4bit/gi,``).replace(/Qwen3[-_ ]?VL/gi,`Qwen 3`).replace(/Qwen3/gi,`Qwen 3`).replace(/Gemma[-_ ]?4/gi,`Gemma 4`).replace(/A4B/gi,``).replace(/[-_]+/g,` `).replace(/\s+/g,` `).trim()}function j(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}var M=s();function N({model:e}){let n=t(e=>e.language),r=e.downloadRequired?[{label:i(n,`flow.consent.size`),value:e.downloadSize||i(n,`flow.consent.sizeUnknown`)},{label:i(n,`flow.consent.location`),value:e.storageLocation},{label:i(n,`flow.consent.external`),value:e.externalHost||i(n,`flow.consent.externalUnknown`)}]:[{label:i(n,`flow.consent.state`),value:i(n,`flow.consent.stateReady`)},{label:i(n,`flow.consent.location`),value:e.storageLocation},{label:i(n,`flow.consent.external`),value:i(n,`flow.consent.externalNone`)}],a=e.downloadRequired?`flow.consent.title`:`flow.consent.readyTitle`;return(0,M.jsxs)(`section`,{className:`ritual-consent-panel`,"aria-label":i(n,a),children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:i(n,a)}),(0,M.jsx)(`p`,{children:e.downloadRequired?i(n,`flow.consent.body`):i(n,`flow.consent.ready`)})]}),(0,M.jsx)(`dl`,{children:r.map(e=>(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:e.label}),(0,M.jsx)(`dd`,{children:e.value})]},e.label))})]})}function P({model:e,onBack:n,onComplete:r,onLater:a}){let s=t(e=>e.language),[c,l]=C.useState(!1),[u,d]=C.useState(`idle`),[m,h]=C.useState(0),[g,_]=C.useState(i(s,`flow.install.wait`)),[y,b]=C.useState(null);async function x(){l(!0),b(null),d(`install`),h(8),_(i(s,`flow.install.prepare`));let t=await o.streamModelPrepare({model:e.loadId,engine:e.engine||`local_mlx`,allow_download:e.downloadRequired},{onProgress:e=>{let t=L(String(e.stage||``));d(t),h(Number(e.percent||R(t))),_(z(e,t,s))},onDone:()=>{d(`done`),h(100),_(i(s,`flow.install.done`))},onError:e=>{d(`error`),b(U(e))}});l(!1),t.ok?(d(`done`),h(100),_(i(s,`flow.install.done`)),window.setTimeout(r,700)):(d(`error`),b(U(t.data)))}let S=u===`download`?`thinking`:u===`validate`?`recalling`:u===`load`?`synthesizing`:u===`done`?`idle`:`listening`;return(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(s,e.downloadRequired?`flow.install.title`:`flow.install.title.ready`)}),(0,M.jsxs)(`div`,{className:`ritual-subtitle`,children:[(0,M.jsx)(`strong`,{children:e.shortName}),` — `,e.reason,`.`,(0,M.jsx)(`br`,{}),i(s,e.downloadRequired?`flow.install.body`:`flow.install.body.ready`)]}),(0,M.jsxs)(`section`,{className:`ritual-card ritual-expected-card`,"aria-label":i(s,`flow.install.expectedTitle`),children:[(0,M.jsx)(`div`,{className:`ritual-fact-label`,children:i(s,`flow.install.expectedTitle`)}),(0,M.jsx)(`div`,{className:`ritual-time-estimate ritual-expected-line`,children:F(e,s)}),(0,M.jsx)(`ol`,{className:`ritual-timeline`,children:I(e,s).map(e=>(0,M.jsxs)(`li`,{className:`ritual-timeline-step`,children:[(0,M.jsx)(`span`,{className:`ritual-timeline-name`,children:e.name}),(0,M.jsx)(`span`,{className:`ritual-timeline-time`,children:e.time})]},e.key))}),(0,M.jsx)(`div`,{className:`ritual-muted-hint`,children:i(s,`flow.install.expectedCompletion`)})]}),(0,M.jsx)(`div`,{className:`ritual-install-brain`,children:(0,M.jsx)(f,{state:S,intensity:u===`download`||u===`load`?.96:.82,size:`normal`})}),(0,M.jsx)(N,{model:e}),(0,M.jsxs)(`div`,{className:`ritual-progress`,children:[(0,M.jsx)(`div`,{className:`ritual-stage-list`,children:[`install`,`download`,`validate`,`load`].map(t=>(0,M.jsxs)(`div`,{className:`ritual-stage ${H(u,t)}`,children:[(0,M.jsx)(p,{className:`ritual-stage-icon`}),(0,M.jsx)(`span`,{children:B(t,s,e)})]},t))}),(0,M.jsx)(`div`,{className:`ritual-bar`,children:(0,M.jsx)(`span`,{className:`ritual-bar-fill ${V(m)}`})})]}),(0,M.jsx)(`div`,{className:`ritual-status`,children:g}),(0,M.jsx)(`div`,{className:`ritual-card ritual-status-card`,children:i(s,e.downloadRequired?`flow.install.note`:`flow.install.note.ready`)}),y&&(0,M.jsxs)(`div`,{className:`ritual-card ritual-error-card ritual-install-error`,role:`alert`,children:[y,(0,M.jsx)(`div`,{className:`ritual-error-detail`,children:i(s,`flow.install.retry`)})]}),(0,M.jsxs)(`div`,{className:`ritual-button-row`,children:[(0,M.jsx)(v,{variant:`ghost`,onClick:n,disabled:c,children:i(s,`flow.install.back`)}),(0,M.jsx)(v,{variant:`outline`,onClick:a,disabled:c,children:i(s,`flow.install.later`)}),u===`done`?(0,M.jsx)(v,{onClick:r,children:i(s,`flow.install.enter`)}):(0,M.jsx)(v,{onClick:x,disabled:c||!e.supported,children:c?i(s,`flow.install.busy`):i(s,e.downloadRequired?`flow.install.start`:`flow.install.startReady`)})]}),(0,M.jsx)(`div`,{className:`ritual-local-note`,children:i(s,e.downloadRequired?`flow.install.local`:`flow.install.local.ready`)})]})}function F(e,t){let n=e.estimatedFirstResponseSeconds;return!e.downloadRequired||e.estimatedDownloadMinutes===0?i(t,`flow.install.expected.ready`,{response:n}):e.estimatedDownloadMinutes===null?i(t,`flow.install.expected.unknown`,{response:n}):i(t,`flow.install.expected`,{download:i(t,`flow.recommend.minutes`,{count:e.estimatedDownloadMinutes}),response:n})}function I(e,t){let n=e.downloadRequired&&e.estimatedDownloadMinutes?i(t,`flow.install.timelineApprox`,{time:i(t,`flow.recommend.minutes`,{count:e.estimatedDownloadMinutes})}):i(t,`flow.install.timelineQuick`);return[{key:`download`,name:i(t,e.downloadRequired?`flow.install.timelineStep.download`:`flow.install.timelineStep.ready`),time:n},{key:`validate`,name:i(t,`flow.install.timelineStep.validate`),time:i(t,`flow.install.timelineQuick`)},{key:`load`,name:i(t,`flow.install.timelineStep.load`),time:i(t,`flow.install.timelineApprox`,{time:`${e.estimatedFirstResponseSeconds}s`})}]}function L(e){return/download|pull|weights/i.test(e)?`download`:/smoke|validate|verify|test/i.test(e)?`validate`:/load|ready/i.test(e)?`load`:/done|complete/i.test(e)?`done`:`install`}function R(e){return e===`install`?20:e===`download`?55:e===`validate`?82:e===`load`?94:e===`done`?100:8}function z(e,t,n){let r={install:i(n,`flow.install.prepare`),download:i(n,`flow.install.stage.download`),validate:i(n,`flow.install.stage.validate`),load:i(n,`flow.install.stage.load`),done:i(n,`flow.install.done`),idle:i(n,`flow.install.wait`),error:i(n,`flow.install.stage.error`)}[t];return W(String(e.user_message||e.message||r))}function B(e,t,n){return e===`download`&&!n.downloadRequired?i(t,`flow.install.step.ready`):i(t,`flow.install.step.${e}`)}function V(e){return`progress-${Math.max(0,Math.min(100,Math.round(e/10)*10))}`}function H(e,t){let n=[`idle`,`install`,`download`,`validate`,`load`,`done`],r=n.indexOf(e),i=n.indexOf(t);return e===`error`?`is-error`:e===`done`||r>i?`is-done`:e===t?`is-active`:``}function U(e){let t=j(e),n=a(t.recovery_guidance).map(W).filter(Boolean);return[W(String(t.user_message||t.reason||t.error||`The selected model could not be loaded.`)),...n.slice(0,2)].join(` `)}function W(e){return String(e||``).replace(/gemma4_unified/gi,`this model format`).replace(/mlx[-_ ]?vlm|mlx[-_ ]?lm|local_mlx|\bmlx\b|\bgguf\b|\bollama\b|huggingface|hugging face/gi,`local model support`).replace(/runtime/gi,`model support`).replace(/No module named ['\"][^'\"]+['\"]/gi,`A local support component is missing`).replace(/\s+/g,` `).trim()}function G(){let n=t(e=>e.language),r=t(e=>e.setLanguage);return(0,M.jsx)(`div`,{className:`language-switcher ritual-language`,"aria-label":i(n,`language.label`),children:[`ko`,`en`].map(t=>(0,M.jsx)(`button`,{type:`button`,className:n===t?`is-active`:``,onClick:()=>r(t),"aria-pressed":n===t,children:e[t]},t))})}var K=`lattice.productFlow.user`;function q(){try{let e=localStorage.getItem(K);return e?JSON.parse(e):null}catch{}return null}function J({onSuccess:e}){let n=t(e=>e.language),[r,a]=C.useState(()=>q()?.email||`you@local`),[s,c]=C.useState(``),[l,u]=C.useState(()=>q()?.name||`You`),[d,f]=C.useState(!1),[p,h]=C.useState(null);async function g(t){t.preventDefault();let a=r.trim(),c=s.trim(),u=l.trim()||a.split(`@`)[0]||`You`;if(!a||!c){h(i(n,`flow.login.missing`));return}f(!0),h(null);let d=q(),p=await o.login(a,c);if(!p.ok){if((await o.profile()).ok&&(!d?.email||d.email===a)){try{localStorage.setItem(K,JSON.stringify({email:a,name:u}))}catch{}f(!1),e();return}if(d?.email&&d.email!==a){f(!1),h(i(n,`flow.login.otherEmail`));return}if(d?.email===a){f(!1),h(i(n,`flow.login.wrongPassword`));return}(await o.register({email:a,password:c,name:u,nickname:u})).ok&&(p=await o.login(a,c))}if(!p.ok){f(!1),h(i(n,`flow.login.unavailable`));return}try{localStorage.setItem(K,JSON.stringify({email:a,name:u}))}catch{}f(!1),e()}return(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(n,`flow.login.title`)}),(0,M.jsx)(`div`,{className:`ritual-subtitle`,children:i(n,`flow.login.body`)}),(0,M.jsx)(Y,{}),(0,M.jsxs)(`form`,{onSubmit:g,className:`ritual-card ritual-form`,children:[(0,M.jsxs)(`div`,{className:`ritual-field-stack`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-field-label`,children:i(n,`flow.name`)}),(0,M.jsx)(m,{value:l,onChange:e=>u(e.target.value),placeholder:i(n,`flow.name.placeholder`),autoComplete:`name`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-field-label`,children:i(n,`flow.email`)}),(0,M.jsx)(m,{value:r,onChange:e=>a(e.target.value),type:`email`,placeholder:i(n,`flow.email.placeholder`),autoComplete:`email`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-field-label`,children:i(n,`flow.password`)}),(0,M.jsx)(m,{value:s,onChange:e=>c(e.target.value),type:`password`,placeholder:i(n,`flow.password.placeholder`),autoComplete:`current-password`})]})]}),p&&(0,M.jsx)(`div`,{className:`ritual-error`,role:`alert`,children:p}),(0,M.jsx)(`div`,{className:`ritual-muted-hint`,children:i(n,`flow.login.passwordLocal`)}),(0,M.jsx)(v,{type:`submit`,disabled:d||!r.trim()||!s.trim(),className:`ritual-full-button`,children:d?i(n,`flow.login.busy`):i(n,`flow.login.submit`)}),(0,M.jsx)(`div`,{className:`ritual-note`,children:i(n,`flow.login.note`)})]})]})}function Y(){let e=t(e=>e.language);return(0,M.jsxs)(`div`,{className:`ritual-promise`,"aria-label":i(e,`flow.promise.aria`),children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:i(e,`flow.promise.memory.k`)}),(0,M.jsx)(`strong`,{children:i(e,`flow.promise.memory.v`)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:i(e,`flow.promise.model.k`)}),(0,M.jsx)(`strong`,{children:i(e,`flow.promise.model.v`)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:i(e,`flow.promise.ownership.k`)}),(0,M.jsx)(`strong`,{children:i(e,`flow.promise.ownership.v`)})]})]})}function X({status:e,reason:n,recommendations:r,analysis:a,onBack:o,onRetry:s,onSkipModel:c,onSelect:l}){let f=t(e=>e.language);if(e===`loading`)return(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(f,`flow.recommend.title`)}),(0,M.jsx)(`div`,{className:`ritual-subtitle`,children:i(f,`flow.recommend.body`)}),(0,M.jsxs)(`div`,{className:`ritual-scan-banner is-loading`,role:`status`,children:[(0,M.jsx)(`span`,{className:`ritual-scan-dot pulsing`}),(0,M.jsx)(`span`,{children:i(f,`flow.recommend.loading`)})]}),(0,M.jsxs)(`div`,{className:`ritual-action-row`,children:[(0,M.jsx)(v,{variant:`ghost`,onClick:o,children:i(f,`flow.recommend.back`)}),(0,M.jsx)(v,{variant:`outline`,onClick:c,children:i(f,`flow.recommend.skip`)})]})]});if(e===`unavailable`){let e=n===`no_supported_model`?`flow.recommend.unavailable.empty`:`flow.recommend.unavailable.probe`;return(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(f,`flow.recommend.title`)}),(0,M.jsx)(`section`,{className:`ritual-card ritual-error-card ritual-unavailable-card`,role:`alert`,"aria-label":i(f,`flow.recommend.unavailable.aria`),children:(0,M.jsxs)(`div`,{className:`ritual-inline-row`,children:[(0,M.jsx)(g,{className:`ritual-core-icon`,"aria-hidden":`true`}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-strong-text`,children:i(f,`flow.recommend.unavailable.title`)}),(0,M.jsx)(`div`,{className:`ritual-muted-text`,children:i(f,e)})]})]})}),(0,M.jsxs)(`div`,{className:`ritual-button-row ritual-button-row-primary`,children:[(0,M.jsxs)(`button`,{type:`button`,className:`ritual-full-button ritual-full-button-primary`,onClick:s,children:[(0,M.jsx)(d,{size:16}),` `,i(f,`flow.recommend.unavailable.retry`)]}),(0,M.jsx)(`button`,{type:`button`,className:`ritual-secondary-button`,onClick:c,children:i(f,`flow.recommend.skip`)})]}),(0,M.jsxs)(`div`,{className:`ritual-action-row`,children:[(0,M.jsx)(v,{variant:`ghost`,onClick:o,children:i(f,`flow.recommend.back`)}),(0,M.jsx)(`div`,{className:`ritual-muted-hint`,children:i(f,`flow.recommend.unavailable.hint`)})]})]})}let p=r;function m(e,t){if(!e)return(0,M.jsxs)(`div`,{className:`ritual-scan-banner is-loading`,children:[(0,M.jsx)(`span`,{className:`ritual-scan-dot pulsing`}),(0,M.jsx)(`span`,{children:i(t,`flow.analysis.checking`)})]});let n=j(e.recommendations?.recommendations),r=j(e.setup?.environment),a=j(e.recommendations?.profile),o={...r,...a},s=Number(n.ram_gb||Number(o.ram_mb||0)/1024||0);return n.apple_silicon||String(o.arch||``).includes(`arm`)?(0,M.jsxs)(`div`,{className:`ritual-scan-banner is-success`,children:[(0,M.jsx)(`span`,{className:`ritual-scan-dot is-success`}),(0,M.jsx)(`span`,{children:i(t,`flow.recommend.environment.apple`,{ram:Math.round(s)})})]}):(0,M.jsxs)(`div`,{className:`ritual-scan-banner is-warning`,children:[(0,M.jsx)(`span`,{className:`ritual-scan-dot is-warning`}),(0,M.jsx)(`span`,{children:i(t,`flow.recommend.environment.standard`,{ram:Math.round(s)})})]})}return(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(f,`flow.recommend.title`)}),(0,M.jsx)(`div`,{className:`ritual-subtitle`,children:i(f,`flow.recommend.body`)}),m(a,f),(0,M.jsxs)(`div`,{className:`ritual-model-list`,children:[p[0]?.supported?(0,M.jsxs)(`div`,{className:`ritual-primary-cta`,children:[(0,M.jsxs)(v,{onClick:()=>l(p[0]),className:`ritual-primary-model-button`,children:[i(f,`flow.recommend.primary`),` `,(0,M.jsx)(u,{size:16})]}),(0,M.jsx)(`div`,{className:`ritual-time-estimate ritual-primary-note`,children:ie(p[0],f)}),(0,M.jsx)(`div`,{className:`ritual-muted-hint ritual-next-hint`,children:i(f,p[0].downloadRequired?`flow.recommend.nextHint`:`flow.recommend.nextHint.ready`)})]}):null,p.slice(0,3).map((e,t)=>{let n=e.role===`best`?x:e.role===`faster`?S:y;return(0,M.jsxs)(`button`,{className:`ritual-model-card`,onClick:()=>e.supported&&l(e),disabled:!e.supported,children:[(0,M.jsxs)(`div`,{className:`ritual-model-heading`,children:[(0,M.jsx)(n,{size:16}),(0,M.jsx)(`div`,{className:`role`,children:ae(e.role,t,f)})]}),(0,M.jsx)(`div`,{className:`name`,children:e.shortName}),(0,M.jsxs)(`div`,{className:`reason`,children:[e.reason,` · `,e.size||i(f,`flow.recommend.sizeReady`),Q(e.role,f)?(0,M.jsxs)(`span`,{className:`ritual-model-comparison`,children:[` `,Q(e.role,f)]}):null]}),(0,M.jsx)(`div`,{className:`ritual-model-stats`,children:(0,M.jsx)(`span`,{className:`ritual-time-estimate`,children:re(e,f)})}),e.supported?(0,M.jsxs)(`span`,{className:`ritual-model-choose`,children:[i(f,`flow.recommend.choose`),` `,(0,M.jsx)(u,{size:14})]}):(0,M.jsx)(`div`,{className:`ritual-model-warning`,children:i(f,`flow.recommend.unsupported`)})]},`${e.role}-${e.id}`)}),(0,M.jsx)(`div`,{className:`ritual-time-note`,children:i(f,`flow.recommend.timeNote`)})]}),(0,M.jsxs)(`div`,{className:`ritual-action-row`,children:[(0,M.jsx)(v,{variant:`ghost`,onClick:o,children:i(f,`flow.recommend.back`)}),(0,M.jsx)(v,{variant:`outline`,onClick:c,children:i(f,`flow.recommend.skip`)}),(0,M.jsx)(`div`,{className:`ritual-muted-hint`,children:i(f,`flow.recommend.hint`)})]})]})}function Z(e,t){return i(t,`flow.recommend.minutes`,{count:e})}function re(e,t){let n=e.estimatedFirstResponseSeconds;return!e.downloadRequired||e.estimatedDownloadMinutes===0?i(t,`flow.recommend.timeEstimate.ready`,{response:n}):e.estimatedDownloadMinutes===null?i(t,`flow.recommend.timeEstimate.unknown`,{response:n}):i(t,`flow.recommend.timeEstimate`,{download:Z(e.estimatedDownloadMinutes,t),response:n})}function ie(e,t){return!e.downloadRequired||e.estimatedDownloadMinutes===0?i(t,`flow.recommend.primaryNote.ready`):e.estimatedDownloadMinutes===null?i(t,`flow.recommend.primaryNote.unknown`):i(t,`flow.recommend.primaryNote`,{time:Z(e.estimatedDownloadMinutes,t)})}function Q(e,t){return e===`faster`?i(t,`flow.recommend.comparison.faster`):e===`advanced`?i(t,`flow.recommend.comparison.advanced`):``}function ae(e,t,n){return e===`best`?i(n,`flow.recommend.rank.best`):e===`faster`?i(n,`flow.recommend.rank.faster`):e===`advanced`?i(n,`flow.recommend.rank.advanced`):i(n,`flow.recommend.rank.choice`,{index:t+1})}function oe({onComplete:e}){let n=t(e=>e.language),[r,a]=C.useState(`wake`),[s,c]=C.useState(null),[l,u]=C.useState(null),[d,p]=C.useState(0),[m,h]=C.useState(null),g=C.useMemo(()=>w({analysis:s,endpoints:l}),[s,l]);C.useEffect(()=>{let e=!1;async function t(){let[t,n,r,i]=await Promise.all([o.setupScan(),o.modelRecommendations(`local_mlx`),o.models(),o.sysinfo()]);e||(c({setup:t.ok?t.data:null,recommendations:n.ok?n.data:null,models:r.ok?r.data:null,sysinfo:i.ok?i.data:null}),u({setup:t.ok,recommendations:n.ok,models:r.ok,sysinfo:i.ok}))}return t(),()=>{e=!0}},[d]);let _=C.useCallback(()=>{c(null),u(null),p(e=>e+1)},[]);return(0,M.jsx)(`div`,{className:`ritual-shell`,"aria-label":i(n,`flow.shell`),children:(0,M.jsxs)(`div`,{className:`ritual-container`,children:[(0,M.jsx)(G,{}),(0,M.jsxs)(`div`,{className:`ritual-brain`,children:[(0,M.jsx)(f,{state:ce(r),intensity:r===`install`?.92:.7,size:`large`,showLabel:!1}),(0,M.jsx)(`div`,{className:`ritual-edition`,title:i(n,`brain.edition.tip`),children:i(n,`brain.edition`)})]}),r===`wake`&&(0,M.jsx)(se,{onWake:()=>a(`login`),onUseExisting:()=>$(e)}),r===`login`&&(0,M.jsx)(J,{onSuccess:()=>a(`recommend`)}),r===`recommend`&&(0,M.jsx)(X,{status:g.status,reason:g.reason,recommendations:g.recommendations,analysis:s,onBack:()=>a(`login`),onRetry:_,onSkipModel:()=>$(e),onSelect:e=>{h(e),a(`install`)}}),r===`install`&&(0,M.jsx)(P,{model:m||g.recommendations[0]||T(),onBack:()=>a(`recommend`),onComplete:()=>$(e),onLater:()=>$(e)})]})})}function se({onWake:e,onUseExisting:n}){let r=t(e=>e.language),a=[{icon:b,label:i(r,`flow.wake.value.local.k`),body:i(r,`flow.wake.value.local.v`)},{icon:S,label:i(r,`flow.wake.value.instant.k`),body:i(r,`flow.wake.value.instant.v`)},{icon:h,label:i(r,`flow.wake.value.brain.k`),body:i(r,`flow.wake.value.brain.v`)}];return(0,M.jsxs)(`section`,{className:`ritual-wake`,"aria-label":i(r,`flow.wake.aria`),children:[(0,M.jsx)(`div`,{className:`ritual-title`,children:i(r,`flow.wake.title`)}),(0,M.jsx)(`div`,{className:`ritual-subtitle`,children:i(r,`flow.wake.body`)}),(0,M.jsx)(`div`,{className:`ritual-value-grid`,"aria-label":i(r,`flow.wake.value.aria`),children:a.map(e=>{let t=e.icon;return(0,M.jsxs)(`div`,{className:`ritual-value-card`,children:[(0,M.jsxs)(`div`,{className:`ritual-value-label`,children:[(0,M.jsx)(t,{size:14}),` `,e.label]}),(0,M.jsx)(`div`,{className:`ritual-value-body`,children:e.body})]},e.label)})}),(0,M.jsxs)(`div`,{className:`ritual-wake-plan`,"aria-label":i(r,`flow.wake.plan.aria`),children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:`1`}),(0,M.jsx)(`strong`,{children:i(r,`flow.wake.step.identity`)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:`2`}),(0,M.jsx)(`strong`,{children:i(r,`flow.wake.step.check`)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`span`,{children:`3`}),(0,M.jsx)(`strong`,{children:i(r,`flow.wake.step.voice`)})]})]}),(0,M.jsxs)(`div`,{className:`ritual-button-row ritual-button-row-primary`,children:[(0,M.jsxs)(`button`,{type:`button`,className:`ritual-full-button ritual-full-button-primary`,onClick:e,children:[i(r,`flow.wake.primary`),` `,(0,M.jsx)(u,{size:18})]}),(0,M.jsx)(`button`,{type:`button`,className:`ritual-secondary-button`,onClick:n,children:i(r,`flow.wake.existing`)})]}),(0,M.jsx)(`div`,{className:`ritual-start-note`,children:i(r,`flow.wake.startNote`)})]})}function $(e){_(),e()}function ce(e){return e===`wake`?`idle`:e===`analysis`?`listening`:e===`recommend`?`recalling`:e===`install`?`thinking`:`idle`}export{oe as ProductFlow};
@@ -0,0 +1,3 @@
1
+ import{a as e,g as t,h as n,p as r,u as i,v as a,x as o,y as s}from"./utils-DYf7pqrR.js";import{r as c}from"./useQuery-CcVlXlBd.js";import{t as l}from"./workspace-CjthHsLN.js";import{a as u,t as d,v as f}from"./primitives-jNrZm2O9.js";import{t as p}from"./input-DEz5UjBz.js";import{u as m}from"./index-BFtDYI6l.js";import{t as h}from"./button-BTxZDMFJ.js";var g=n(`file-exclamation-point`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),_=n(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]),v=n(`message-circle-question-mark`,[[`path`,{d:`M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719`,key:`1sd12s`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),y=o(s()),b=400,x=40,S=400;function C(e){return new TextEncoder().encode(e).length}async function w(e){let t=globalThis.crypto?.subtle;if(!t)return``;let n=await t.digest(`SHA-256`,new TextEncoder().encode(e));return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function T(e,t,n){let r=[`--- a/${n}`,`+++ b/${n}`],i=e.length?e.split(`
2
+ `):[],a=t.length?t.split(`
3
+ `):[];if(i.length>S||a.length>S)return[...r,...i.map(e=>`-${e}`),...a.map(e=>`+${e}`)].slice(0,b);let o=i.length,s=a.length,c=Array.from({length:o+1},()=>new Uint32Array(s+1));for(let e=o-1;e>=0;--e)for(let t=s-1;t>=0;--t)c[e][t]=i[e]===a[t]?c[e+1][t+1]+1:Math.max(c[e+1][t],c[e][t+1]);let l=[],u=0,d=0;for(;u<o&&d<s;)i[u]===a[d]?(u+=1,d+=1):c[u+1][d]>=c[u][d+1]?(l.push(`-${i[u]}`),u+=1):(l.push(`+${a[d]}`),d+=1);for(;u<o;)l.push(`-${i[u++]}`);for(;d<s;)l.push(`+${a[d++]}`);return l.length?[...r,...l].slice(0,b):[]}async function E(t){let n=await i.proposalDetail(t);if(!n.ok)throw Error(n.error||`HTTP ${n.status}`);let r=n.data,a=e(r.payload)?r.payload:{},o=typeof a.path==`string`?a.path:``,s=typeof r.kind==`string`&&r.kind?r.kind:`file_update`;if(!o)throw Error(`proposal payload has no path`);let c=typeof a.new_content==`string`?a.new_content:``,l=await i.readWorkspaceFile(o);if(!l.ok&&l.status!==404)throw Error(l.error||`HTTP ${l.status}`);let u=l.ok,d=l.ok?l.data.content:``;if(s===`file_update`&&u&&d===c)return await i.rejectProposal(t,`rebase: content already applied`),`already_applied`;if(s===`file_delete`&&!u)return await i.rejectProposal(t,`rebase: file already deleted`),`already_applied`;let f=s===`file_delete`?``:c,p=T(d,f,o),m=u?await w(d):``,h=await i.createReviewItem({title:typeof r.title==`string`&&r.title?r.title:o,summary:typeof r.summary==`string`?r.summary:``,source:`change_proposal`,kind:s,payload:{path:o,diff:p,...s===`file_delete`?{}:{new_content:c},tier:s===`file_delete`?`large`:p.length<=x?`small`:`large`,before_bytes:C(d),after_bytes:C(f),...m||!u?{base_exists:u,base_sha256:m}:{}},provenance:{proposed_by:`user_rebase`,reason:`rebased_from:${t}`,source_detail:`proposal_conflict_rebase`}});if(!h.ok)throw Error(h.error||`HTTP ${h.status}`);let g=String(h.data.id||``);return await i.rejectProposal(t,g?`rebased_to:${g}`:`rebased`),`rebased`}var D=a();function O({language:e,itemId:t,onResolved:n}){let i=c(),[a,o]=y.useState(null),s=l({mutationFn:()=>E(t),onSuccess:async e=>{o(e),await Promise.all([i.invalidateQueries({queryKey:[`pendingProposals`]}),i.invalidateQueries({queryKey:[`proposalCounts`]}),i.invalidateQueries({queryKey:[`automationReviews`]}),i.invalidateQueries({queryKey:[`reviewItems`]})]),n?.(e)}});return(0,D.jsxs)(`div`,{className:`proposal-conflict-note`,role:`alert`,"data-testid":`proposal-conflict-note`,children:[(0,D.jsxs)(`div`,{className:`proposal-conflict-head`,children:[(0,D.jsx)(g,{className:`h-4 w-4`,"aria-hidden":`true`}),(0,D.jsx)(`strong`,{children:r(e,`proposals.conflict.title`)})]}),(0,D.jsx)(`p`,{children:r(e,`proposals.conflict.detail`)}),a===`rebased`?(0,D.jsx)(`p`,{className:`proposal-conflict-done`,role:`status`,children:r(e,`proposals.conflict.rebased`)}):a===`already_applied`?(0,D.jsx)(`p`,{className:`proposal-conflict-done`,role:`status`,children:r(e,`proposals.conflict.alreadyApplied`)}):(0,D.jsxs)(`button`,{type:`button`,className:`proposal-conflict-rebase`,disabled:s.isPending,onClick:()=>s.mutate(),children:[(0,D.jsx)(m,{className:`h-3.5 w-3.5`,"aria-hidden":`true`}),s.isPending?r(e,`proposals.conflict.rebasing`):r(e,`proposals.conflict.rebase`)]}),s.isError?(0,D.jsx)(`small`,{className:`proposal-conflict-error`,children:r(e,`proposals.conflict.failed`,{reason:s.error instanceof Error?s.error.message:String(s.error)})}):null]})}var k=[{id:`pending`,labelKey:`review.filter.status.pending`},{id:`snoozed`,labelKey:`review.filter.status.snoozed`},{id:`all`,labelKey:`review.filter.status.all`},{id:`approved`,labelKey:`review.filter.status.approved`},{id:`dismissed`,labelKey:`review.filter.status.dismissed`}],A=[{id:`all`,labelKey:`review.filter.source.all`},{id:`workflow_run`,labelKey:`review.filter.source.workflow_run`},{id:`trigger`,labelKey:`review.filter.source.trigger`},{id:`kg_change_digest`,labelKey:`review.filter.source.kg_change_digest`},{id:`chat_followup`,labelKey:`review.filter.source.chat_followup`},{id:`agent_followup`,labelKey:`review.filter.source.agent_followup`},{id:`change_proposal`,labelKey:`review.filter.source.change_proposal`}];function j(e){return e===`pending`?`warning`:e===`snoozed`?`muted`:e===`approved`?`success`:e===`dismissed`?`danger`:`muted`}var M={pending:`review.itemStatus.pending`,snoozed:`review.itemStatus.snoozed`,approved:`review.itemStatus.approved`,dismissed:`review.itemStatus.dismissed`};function N(e,t){let n=M[t];return n?r(e,n):t}var P={workflow_run:`review.source.workflow_run`,trigger:`review.source.trigger`,kg_change_digest:`review.source.kg_change_digest`,chat_followup:`review.source.chat_followup`,agent_followup:`review.source.agent_followup`,change_proposal:`review.source.change_proposal`};function F(e,t){let n=t?P[t]:void 0;return n?r(e,n):t||r(e,`review.source.automation`)}function I(e,t,n){let r=t.source_detail;if(r!=null&&String(r).trim())return String(r);let i=t.trigger_id;return i!=null&&String(i).trim()?String(i):F(e,n)}var L={read:`review.risk.read`,write:`review.risk.write`,write_scoped:`review.risk.write_scoped`,exec:`review.risk.exec`,destructive:`review.risk.destructive`};function R(e,t){let n=typeof t==`string`?t.trim():``;if(!n)return``;let i=L[n];return i?r(e,i):n}var z={read:`review.change.read`,additive:`review.change.additive`,mutation:`review.change.mutation`,destructive:`review.change.destructive`,exec:`review.change.exec`};function B(e,t){let n=typeof t==`string`?t.trim():``;if(!n)return``;let i=z[n];return i?r(e,i):n}function V(){let e=new Date;return e.setDate(e.getDate()+1),e.toISOString()}function H(e,t){if(!t)return r(e,`review.snoozed.badge`);let n=new Date(t);return Number.isNaN(n.getTime())?r(e,`review.snoozed.until`,{value:t}):r(e,`review.snoozed.until`,{value:new Intl.DateTimeFormat(e===`ko`?`ko-KR`:`en-US`,{dateStyle:`medium`,timeStyle:`short`}).format(n)})}function U(e){return e.effective_status===`pending`||e.effective_status===`snoozed`}function W(e){let t=e.payload||{},n=e.provenance||{};return!!(t.last_run_id||n.run_id)}var G=24;function K({language:e,diff:t,path:n,className:i=``}){if(!t.length)return null;let a=t.slice(0,G),o=t.length-a.length;return(0,D.jsxs)(`figure`,{className:`m-0 grid gap-1 ${i}`,children:[(0,D.jsxs)(`figcaption`,{className:`flex flex-wrap items-baseline gap-2 text-xs text-muted-foreground`,children:[(0,D.jsx)(`strong`,{className:`font-medium text-foreground`,children:r(e,`proposals.diff.header`)}),n?(0,D.jsx)(`code`,{className:`break-all`,children:n}):null]}),(0,D.jsx)(`pre`,{className:`pending-proposal-diff`,"aria-label":r(e,`proposals.diff`),children:a.map((e,t)=>(0,D.jsx)(`span`,{className:`block ${q(e)}`,children:e||` `},t))}),o>0?(0,D.jsx)(`small`,{className:`text-xs text-muted-foreground`,children:r(e,`proposals.diff.more`,{count:o})}):null]})}function q(e){return/^\+(?!\+\+)/.test(e)?`text-success`:/^-(?!--)/.test(e)?`text-destructive`:``}function J({item:e,feedback:n,onAction:i}){let a=t(e=>e.mode),o=t(e=>e.language),[s,c]=y.useState(``),l=e.provenance||{},g=e.payload||{},_=W(e),v=e.effective_status===`snoozed`,b=U(e),x=e.source===`change_proposal`,S=e.source!==`chat_followup`&&e.source!==`agent_followup`&&!x,C=Array.isArray(g.diff)?g.diff:[],w=String(g.tier||`small`),T=typeof g.path==`string`&&g.path.trim()?g.path:void 0,E=R(o,l.risk),k=B(o,l.change_class),A=typeof l.tool==`string`&&l.tool.trim()?l.tool:``,M=typeof l.proposed_by==`string`&&l.proposed_by.trim()?l.proposed_by:``;return(0,D.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-4`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,D.jsx)(`div`,{className:`font-medium`,children:e.title}),e.summary?(0,D.jsx)(`p`,{className:`mt-1 text-sm leading-6 text-muted-foreground`,children:e.summary}):null]}),(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(f,{variant:`muted`,children:F(o,e.source)}),x?(0,D.jsx)(f,{variant:`muted`,children:r(o,e.kind===`file_delete`?`proposals.kind.delete`:w===`large`?`proposals.tier.large`:`proposals.tier.small`)}):null,(0,D.jsx)(f,{variant:j(e.effective_status),children:N(o,e.effective_status)})]})]}),x&&C.length>0?(0,D.jsx)(K,{language:o,diff:C,path:T,className:`mt-3`}):null,v?(0,D.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center justify-between gap-3 rounded-md border border-border bg-muted/24 p-3 text-sm`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`font-medium`,children:H(o,e.snoozed_until)}),(0,D.jsx)(`p`,{className:`mt-1 text-muted-foreground`,children:r(o,`review.snoozed.detail`)})]}),(0,D.jsxs)(h,{size:`sm`,variant:`outline`,onClick:()=>i(e,`unsnooze`),disabled:!b,children:[(0,D.jsx)(m,{className:`h-3.5 w-3.5`}),` `,r(o,`review.unsnooze`)]})]}):null,E||k||A||M?(0,D.jsxs)(`div`,{className:`mt-3 grid gap-2`,children:[k||E?(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[k?(0,D.jsx)(f,{variant:`muted`,children:k}):null,E?(0,D.jsx)(f,{variant:`muted`,children:E}):null]}):null,A?(0,D.jsxs)(`p`,{className:`m-0 text-sm text-muted-foreground`,children:[(0,D.jsx)(`span`,{className:`font-medium text-foreground`,children:r(o,`review.summary.tool`)}),` · `,A]}):null,M?(0,D.jsxs)(`p`,{className:`m-0 text-sm text-muted-foreground`,children:[(0,D.jsx)(`span`,{className:`font-medium text-foreground`,children:r(o,`review.summary.proposedBy`)}),` · `,M]}):null]}):null,a===`basic`?null:(0,D.jsxs)(`details`,{className:`mt-3 rounded-md border border-border`,children:[(0,D.jsx)(`summary`,{className:`cursor-pointer select-none p-3 text-sm font-medium text-muted-foreground`,children:r(o,`review.technical.title`)}),(0,D.jsx)(`div`,{className:`p-3 pt-0`,children:(0,D.jsx)(u,{data:{workflow:l.workflow_id,trigger:l.trigger_id,run:g.last_run_id||l.run_id,...x?{path:g.path}:{},source_detail:I(o,l,e.source),snoozed_until:e.snoozed_until,created_at:e.created_at,updated_at:e.updated_at},limit:x?12:8})})]}),b?(0,D.jsxs)(`div`,{className:`mt-4 grid gap-2`,children:[(0,D.jsx)(`p`,{className:`text-xs leading-5 text-muted-foreground`,children:r(o,S?`review.runNow.detail`:x?`review.proposal.detail`:e.source===`agent_followup`?`review.agent.detail`:`review.chat.detail`)}),x?(0,D.jsx)(p,{value:s,onChange:e=>c(e.target.value),placeholder:r(o,`review.proposal.rejectReason`),"aria-label":r(o,`review.proposal.rejectReason`)}):null,(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-2`,"aria-label":r(o,`review.actions.aria`),children:[S?(0,D.jsx)(d,{label:r(o,`review.runNow`),successLabel:_?r(o,`review.regenerated`):r(o,`review.executed`),action:()=>i(e,`run_now`,_),invalidate:[]}):null,(0,D.jsx)(d,{label:r(o,x?`proposals.approve`:`review.approve`),action:()=>i(e,`approve`),invalidate:[]}),v?null:(0,D.jsx)(d,{label:r(o,`review.snoozeDay`),action:()=>i(e,`snooze`),invalidate:[]}),(0,D.jsx)(d,{label:r(o,x?`proposals.reject`:`review.dismiss`),action:()=>i(e,`dismiss`,!1,x?s:void 0),invalidate:[],variant:`destructive`})]})]}):null,n?.conflict&&x?(0,D.jsx)(O,{language:o,itemId:e.id}):n?(0,D.jsxs)(`p`,{className:`mt-2 text-xs ${n.tone===`error`?`text-warning`:`text-success`}`,children:[n.message,` - `,r(o,`review.feedback.open`),n.detail&&n.detail!==n.message?(0,D.jsx)(`span`,{className:`mt-0.5 block text-[11px] opacity-75`,children:n.detail}):null]}):null]})}export{k as a,_ as c,A as i,J as n,O as o,V as r,v as s,K as t};
@@ -0,0 +1 @@
1
+ import{a as e,g as t,p as n,s as r,t as i,u as a,v as o,x as s,y as c}from"./utils-DYf7pqrR.js";import{r as l,t as u}from"./useQuery-CcVlXlBd.js";import{t as d}from"./workspace-CjthHsLN.js";import{_ as f,a as p,c as m,d as h,g,h as _,i as v,l as y,m as b,n as x,p as S,r as C,s as w,t as T,u as E,v as D}from"./primitives-jNrZm2O9.js";import{t as O}from"./input-DEz5UjBz.js";import{t as k}from"./network-zKa3jAwl.js";import{t as A}from"./shield-alert-CpHeCsaF.js";import{t as j}from"./users-C0cFMj6o.js";import{c as M,h as ee,i as N,t as P}from"./index-BFtDYI6l.js";import{t as F}from"./button-BTxZDMFJ.js";var I=s(c()),L=o(),R={low:`success`,medium:`warning`,high:`danger`};function z(e,t){return t===`ko`&&e.label_ko||e.label}function B(e,t){return t===`ko`&&e.summary_ko||e.summary}function te(e,t){return t===`ko`&&e.warning_ko||e.warning||``}function ne(){let e=l(),r=t(e=>e.language),[i,o]=I.useState(null),[s,c]=I.useState(!1),p=u({queryKey:[`permissionMode`],queryFn:a.permissionMode}),m=d({mutationFn:e=>a.setPermissionMode(e.mode,e.ack),onSuccess:t=>{t.ok&&(e.invalidateQueries({queryKey:[`permissionMode`]}),o(null),c(!1))}}),h=p.data?.ok?p.data.data:void 0,v=h?.catalog??[],y=h?.mode??``,x=i??y,w=v.find(e=>e.id===x),T=!!w?.requires_ack&&x!==y,E=T&&!s,O=x===y;return p.isLoading?(0,L.jsxs)(S,{children:[(0,L.jsx)(g,{children:(0,L.jsx)(f,{children:n(r,`system.permission.title`)})}),(0,L.jsx)(b,{children:(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n(r,`ui.loading`)})})]}):!h||v.length===0?(0,L.jsxs)(S,{children:[(0,L.jsx)(g,{children:(0,L.jsx)(f,{children:n(r,`system.permission.title`)})}),(0,L.jsx)(b,{children:(0,L.jsx)(C,{title:n(r,`ui.requestUnavailable`),detail:p.data?.error})})]}):(0,L.jsxs)(S,{"data-testid":`permission-mode-panel`,children:[(0,L.jsxs)(g,{children:[(0,L.jsx)(f,{children:n(r,`system.permission.title`)}),(0,L.jsx)(_,{children:n(r,`system.permission.hint`)})]}),(0,L.jsxs)(b,{className:`space-y-3`,children:[(0,L.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[n(r,`system.permission.current`),`:`,` `,(0,L.jsx)(`strong`,{"data-testid":`permission-mode-active`,children:r===`ko`&&h.label_ko||h.label})]}),(0,L.jsx)(`div`,{className:`space-y-2`,role:`radiogroup`,"aria-label":n(r,`system.permission.title`),children:v.map(e=>{let t=e.id===x;return(0,L.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":t,"data-testid":`permission-mode-option-${e.id}`,onClick:()=>{o(e.id),c(!1),m.reset()},className:`w-full rounded-md border p-3 text-left transition ${t?`border-primary bg-accent`:`border-border hover:bg-accent/50`}`,children:[(0,L.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,L.jsx)(`strong`,{className:`text-sm`,children:z(e,r)}),(0,L.jsx)(D,{variant:R[e.risk]||`warning`,children:n(r,`system.permission.risk.${e.risk}`)}),e.id===y?(0,L.jsx)(D,{variant:`muted`,children:n(r,`system.permission.current`)}):null]}),(0,L.jsx)(`span`,{className:`mt-1 block text-xs text-muted-foreground`,children:B(e,r)})]},e.id)})}),T?(0,L.jsxs)(`div`,{className:`space-y-2 rounded-md border border-border bg-muted p-3`,children:[(0,L.jsxs)(`p`,{className:`flex items-start gap-2 text-xs`,children:[(0,L.jsx)(A,{className:`mt-0.5 h-4 w-4 shrink-0`}),(0,L.jsx)(`span`,{children:w?te(w,r):``})]}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,L.jsx)(`input`,{type:`checkbox`,"data-testid":`permission-mode-ack`,checked:s,onChange:e=>c(e.target.checked)}),n(r,`system.permission.ack`)]})]}):null,(0,L.jsx)(F,{"data-testid":`permission-mode-apply`,disabled:O||E||m.isPending,onClick:()=>m.mutate({mode:x,ack:s}),children:n(r,`system.permission.apply`)}),m.data&&!m.data.ok?(0,L.jsx)(C,{title:n(r,`ui.requestUnavailable`),detail:m.data.error}):null,m.data?.ok?(0,L.jsx)(D,{variant:`success`,"data-testid":`permission-mode-applied`,children:n(r,`ui.requestCompleted`)}):null,(0,L.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,L.jsx)(`p`,{className:`text-xs font-medium`,children:n(r,`system.permission.guards`)}),(0,L.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n(r,`system.permission.guards.detail`)})]})]})]})}var V=[{id:`account`,labelKey:`system.tab.account`},{id:`workspaces`,labelKey:`system.tab.workspaces`},{id:`snapshots`,labelKey:`system.tab.snapshots`},{id:`activity`,labelKey:`system.tab.activity`},{id:`network`,labelKey:`system.tab.network`},{id:`settings`,labelKey:`system.tab.settings`},{id:`admin`,labelKey:`system.tab.admin`}];function H({initialTab:e}){let r=t(e=>e.mode),i=t(e=>e.language),[a,o]=I.useState(e||`account`);I.useEffect(()=>{V.some(t=>t.id===e)&&o(e)},[e]);let s=e=>{o(e),N(`/`+{account:`account`,workspaces:`workspace-admin`,snapshots:`snapshots`,activity:`activity`,network:`network`,settings:`settings`,admin:`system-admin`}[e])};return(0,L.jsxs)(`div`,{className:`product-page settings-page space-y-5`,children:[(0,L.jsxs)(`header`,{className:`page-hero`,children:[(0,L.jsxs)(`div`,{className:`page-kicker`,children:[(0,L.jsx)(M,{className:`h-4 w-4`}),` `,n(i,`system.kicker`)]}),(0,L.jsx)(`h1`,{className:`page-title`,children:n(i,`system.title`)}),(0,L.jsx)(`p`,{className:`page-copy`,children:n(i,`system.body`)})]}),(0,L.jsx)(h,{tabs:(r===`basic`?V.filter(e=>e.id===`account`||e.id===`workspaces`||e.id===`snapshots`||e.id===`settings`):V).map(e=>({id:e.id,label:n(i,e.labelKey)})),value:a,onChange:e=>s(e)}),a===`account`?(0,L.jsx)(U,{}):null,a===`workspaces`?(0,L.jsx)(W,{}):null,a===`snapshots`?(0,L.jsx)(G,{}):null,a===`activity`?(0,L.jsx)(K,{}):null,a===`network`?(0,L.jsx)(q,{}):null,a===`settings`?(0,L.jsx)(J,{}):null,a===`admin`?(0,L.jsx)(se,{}):null]})}function U(){let e=l(),r=t(e=>e.language),i=t(e=>e.setWorkspaceId),o=u({queryKey:[`profile`],queryFn:a.profile}),s=u({queryKey:[`sso`],queryFn:a.ssoConfig}),[c,h]=I.useState(``),[v,y]=I.useState(``),[C,w]=I.useState(``),[D,k]=I.useState(``),[A,j]=I.useState(``),M=e=>{e.ok&&(P(),i(null))},N=d({mutationFn:()=>a.login(c,v),onSuccess:M}),R=d({mutationFn:()=>a.register({email:c,password:v,name:C,nickname:D}),onSuccess:M}),z=d({mutationFn:()=>a.updateProfile({name:C,nickname:D}),onSuccess:()=>e.invalidateQueries({queryKey:[`profile`]})}),B=d({mutationFn:()=>a.changePassword(v,A)});return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,L.jsx)(x,{title:n(r,`system.account.profile`),result:o.data,children:e=>(0,L.jsx)(p,{data:e})}),(0,L.jsxs)(S,{children:[(0,L.jsxs)(g,{children:[(0,L.jsxs)(f,{className:`flex items-center gap-2`,children:[(0,L.jsx)(ee,{className:`h-4 w-4`}),` `,n(r,`system.account.title`)]}),(0,L.jsx)(_,{children:n(r,`system.account.detail`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsx)(O,{value:c,onChange:e=>h(e.target.value),placeholder:n(r,`system.account.email`)}),(0,L.jsx)(O,{type:`password`,value:v,onChange:e=>y(e.target.value),placeholder:n(r,`system.account.password`)}),(0,L.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,L.jsx)(O,{value:C,onChange:e=>w(e.target.value),placeholder:n(r,`system.account.name`)}),(0,L.jsx)(O,{value:D,onChange:e=>k(e.target.value),placeholder:n(r,`system.account.nickname`)})]}),(0,L.jsx)(O,{type:`password`,value:A,onChange:e=>j(e.target.value),placeholder:n(r,`system.account.newPassword`)}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(F,{onClick:()=>N.mutate(),disabled:!c||!v||N.isPending,children:n(r,`system.account.login`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>R.mutate(),disabled:!c||!v||R.isPending,children:n(r,`system.account.register`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>z.mutate(),disabled:z.isPending,children:n(r,`system.account.save`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>B.mutate(),disabled:!v||!A||B.isPending,children:n(r,`system.account.changePassword`)}),(0,L.jsx)(T,{label:n(r,`system.account.logout`),action:()=>a.logout(),onSuccess:M})]}),[N.data,R.data,z.data,B.data].filter(Boolean).map((e,t)=>(0,L.jsx)(m,{result:e,successLabel:n(r,`system.account.requestDone`)},t))]})]}),(0,L.jsx)(x,{title:n(r,`system.account.signInOptions`),result:s.data,className:`xl:col-span-2`,children:e=>(0,L.jsx)(E,{value:e})})]})}function W(){let e=l(),r=t(e=>e.language),{setWorkspaceId:o}=t(),s=u({queryKey:[`workspaceRegistry`],queryFn:a.workspaceRegistry}),c=u({queryKey:[`invitations`],queryFn:a.invitations}),[p,m]=I.useState(``),[h,y]=I.useState(``),[C,w]=I.useState(``),E=d({mutationFn:()=>a.createOrg(p),onSuccess:()=>e.invalidateQueries({queryKey:[`workspaceRegistry`]})}),D=d({mutationFn:()=>a.createInvitation({email:h||null,role:`member`,expires_hours:168}),onSuccess:()=>e.invalidateQueries({queryKey:[`invitations`]})}),k=d({mutationFn:()=>a.acceptInvitation(C),onSuccess:()=>e.invalidateQueries({queryKey:[`workspaceRegistry`]})}),A=i(s.data?.data?.workspaces);return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[1.1fr_0.9fr]`,children:[(0,L.jsx)(x,{title:n(r,`system.workspace.yours`),result:s.data,children:()=>(0,L.jsx)(`div`,{className:`grid gap-2`,children:A.map(e=>{let t=String(e.workspace_id||e.id);return(0,L.jsx)(`div`,{className:`rounded-md border border-border p-3`,children:(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`font-medium`,children:String(e.name||t)}),(0,L.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[String(e.type||``),` · `,String(e.your_role||e.role||``)]})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(F,{variant:`outline`,onClick:()=>o(t),children:n(r,`system.workspace.use`)}),(0,L.jsx)(T,{label:n(r,`system.workspace.activate`),action:()=>a.activateWorkspace(t),invalidate:[`workspaceRegistry`]}),(0,L.jsx)(T,{label:n(r,`system.workspace.archive`),action:()=>a.archiveWorkspace(t),invalidate:[`workspaceRegistry`],variant:`destructive`})]})]})},t)})})}),(0,L.jsxs)(S,{children:[(0,L.jsxs)(g,{children:[(0,L.jsxs)(f,{className:`flex items-center gap-2`,children:[(0,L.jsx)(j,{className:`h-4 w-4`}),` `,n(r,`system.workspace.organizations`)]}),(0,L.jsx)(_,{children:n(r,`system.workspace.organizationsHint`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsx)(O,{value:p,onChange:e=>m(e.target.value),placeholder:n(r,`system.workspace.orgPlaceholder`)}),(0,L.jsx)(F,{disabled:!p.trim()||E.isPending,onClick:()=>E.mutate(),children:n(r,`system.workspace.createOrg`)}),(0,L.jsx)(O,{value:h,onChange:e=>y(e.target.value),placeholder:n(r,`system.workspace.inviteeEmail`)}),(0,L.jsx)(F,{variant:`outline`,disabled:D.isPending,onClick:()=>D.mutate(),children:n(r,`system.workspace.createInvite`)}),(0,L.jsx)(O,{value:C,onChange:e=>w(e.target.value),placeholder:n(r,`system.workspace.inviteToken`)}),(0,L.jsx)(F,{variant:`outline`,disabled:!C.trim()||k.isPending,onClick:()=>k.mutate(),children:n(r,`system.workspace.acceptInvite`)}),(0,L.jsx)(x,{title:n(r,`system.workspace.invitations`),result:c.data,children:e=>(0,L.jsx)(v,{items:e.invitations,titleKey:`token`,metaKey:`role`})})]})]})]})}function G(){let e=t(e=>e.language),r=u({queryKey:[`snapshots`],queryFn:a.snapshots}),o=u({queryKey:[`timeMachine`],queryFn:a.timeMachine}),[s,c]=I.useState(``),[l,p]=I.useState(``),[h,y]=I.useState(``),C=d({mutationFn:()=>a.createSnapshot(s||n(e,`system.snapshots.defaultName`))}),w=d({mutationFn:()=>a.compareSnapshots(l,h)}),E=i(r.data?.data?.snapshots);return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,L.jsx)(x,{title:n(e,`system.snapshots.title`),result:r.data,children:()=>(0,L.jsx)(`div`,{className:`space-y-2`,children:E.map(t=>{let r=String(t.id||t.snapshot_id);return(0,L.jsxs)(`div`,{className:`rounded-md border border-border p-3`,children:[(0,L.jsx)(`div`,{className:`font-medium`,children:String(t.name||r)}),(0,L.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[(0,L.jsx)(T,{label:n(e,`system.snapshots.export`),action:()=>a.exportSnapshot(r)}),(0,L.jsx)(T,{label:n(e,`system.snapshots.mergeRestore`),action:()=>a.restoreSnapshot(r),variant:`outline`})]})]},r)})})}),(0,L.jsxs)(S,{children:[(0,L.jsxs)(g,{children:[(0,L.jsx)(f,{children:n(e,`system.snapshots.actions`)}),(0,L.jsx)(_,{children:n(e,`system.snapshots.actionsHint`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsx)(O,{value:s,onChange:e=>c(e.target.value),placeholder:n(e,`system.snapshots.namePlaceholder`)}),(0,L.jsx)(F,{onClick:()=>C.mutate(),disabled:C.isPending,children:n(e,`system.snapshots.create`)}),(0,L.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:[(0,L.jsx)(O,{value:l,onChange:e=>p(e.target.value),placeholder:n(e,`system.snapshots.beforeId`)}),(0,L.jsx)(O,{value:h,onChange:e=>y(e.target.value),placeholder:n(e,`system.snapshots.afterId`)})]}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>w.mutate(),disabled:!l||!h||w.isPending,children:n(e,`system.snapshots.compare`)}),w.data?(0,L.jsx)(m,{result:w.data,successLabel:n(e,`system.snapshots.compareDone`)}):null]})]}),(0,L.jsx)(x,{title:n(e,`system.snapshots.timeline`),result:o.data,className:`xl:col-span-2`,children:e=>(0,L.jsx)(v,{items:e.events||e,titleKey:`event`,metaKey:`type`,limit:14})})]})}function K(){let e=t(e=>e.language),r=u({queryKey:[`realtimeFeed`],queryFn:a.realtimeFeed}),i=u({queryKey:[`presence`],queryFn:a.presence});return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,L.jsx)(x,{title:n(e,`system.activity.feed`),result:r.data,children:e=>(0,L.jsx)(v,{items:e.events,titleKey:`event_type`,metaKey:`area`,limit:14})}),(0,L.jsx)(x,{title:n(e,`system.activity.presence`),result:i.data,children:e=>(0,L.jsx)(X,{data:e})})]})}function q(){let e=l(),r=t(e=>e.language),o=u({queryKey:[`networkIdentity`],queryFn:a.networkIdentity}),s=u({queryKey:[`networkPeers`],queryFn:a.networkPeers}),[c,p]=I.useState(``),[h,v]=I.useState(``),[y,C]=I.useState(``),w=d({mutationFn:()=>a.pairPeer({name:c,base_url:h,public_key:y}),onSuccess:()=>e.invalidateQueries({queryKey:[`networkPeers`]})});return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[0.8fr_1.2fr]`,children:[(0,L.jsx)(x,{title:n(r,`system.network.identity`),result:o.data,children:e=>(0,L.jsx)(Z,{data:e})}),(0,L.jsxs)(S,{children:[(0,L.jsxs)(g,{children:[(0,L.jsxs)(f,{className:`flex items-center gap-2`,children:[(0,L.jsx)(k,{className:`h-4 w-4`}),` `,n(r,`system.network.pair`)]}),(0,L.jsx)(_,{children:n(r,`system.network.pairHint`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsx)(O,{value:c,onChange:e=>p(e.target.value),placeholder:n(r,`system.network.deviceName`)}),(0,L.jsx)(O,{value:h,onChange:e=>v(e.target.value),placeholder:n(r,`system.network.address`)}),(0,L.jsx)(O,{value:y,onChange:e=>C(e.target.value),placeholder:n(r,`system.network.publicKey`)}),(0,L.jsx)(F,{disabled:!c||!h||!y||w.isPending,onClick:()=>w.mutate(),children:n(r,`system.network.pair`)}),w.data?(0,L.jsx)(m,{result:w.data,successLabel:n(r,`system.network.pairDone`)}):null]})]}),(0,L.jsx)(x,{title:n(r,`system.network.peers`),result:s.data,className:`xl:col-span-2`,children:e=>(0,L.jsx)(`div`,{className:`grid gap-2`,children:i(e.peers).map(e=>{let i=String(e.peer_id||e.id);return(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 rounded-md border border-border p-3`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`font-medium`,children:String(e.name||i)}),(0,L.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:String(e.base_url||``)})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(T,{label:n(r,`system.network.pushWorkspace`),action:()=>a.pushPeer(i,t.getState().workspaceId)}),(0,L.jsx)(T,{label:n(r,`system.network.unpair`),action:()=>a.unpairPeer(i),invalidate:[`networkPeers`],variant:`destructive`})]})]},i)})})})]})}function J(){let e=l(),{theme:r,setTheme:i,mode:o,setMode:s}=t(),c=t(e=>e.language),p=u({queryKey:[`health`],queryFn:a.health}),h=u({queryKey:[`sysinfo`],queryFn:a.sysinfo}),v=u({queryKey:[`computerMemory`],queryFn:a.computerMemory}),C=u({queryKey:[`brainStorage`],queryFn:a.brainStorage}),w=u({queryKey:[`backupHealth`],queryFn:a.backupHealth}),[D,k]=I.useState(``),[A,j]=I.useState(`lattice_brain`),[M,ee]=I.useState(!1),[N,P]=I.useState(``),[R,z]=I.useState(``),[B,te]=I.useState(``),[V,H]=I.useState(!1),[U,W]=I.useState(!1),G=d({mutationFn:e=>a.dockerPostgres({consent:e,dry_run:!e,port:5432})}),K=d({mutationFn:()=>a.migratePostgres({dsn:D,schema_name:A||`lattice_brain`,dry_run:!0})}),q=d({mutationFn:()=>a.brainArchive({path:N.trim()||null,passphrase:B}),onSuccess:()=>e.invalidateQueries({queryKey:[`backupHealth`]})}),J=d({mutationFn:()=>a.brainArchiveInspect({path:R,passphrase:B||null})}),Y=d({mutationFn:()=>a.brainArchiveVerify({path:R,passphrase:B})}),X=d({mutationFn:()=>a.brainArchiveRestore({path:R,passphrase:B,dry_run:!0,confirm:!1})}),Z=d({mutationFn:()=>a.brainArchiveRestore({path:R,passphrase:B,dry_run:!1,confirm:V}),onSuccess:()=>{e.invalidateQueries({queryKey:[`brainStorage`]}),e.invalidateQueries({queryKey:[`backupHealth`]})}}),Q=d({mutationFn:()=>a.brainArchiveImport({path:R,passphrase:B,dry_run:!0,confirm:!1})}),$=d({mutationFn:()=>a.brainArchiveImport({path:R,passphrase:B,dry_run:!1,confirm:U}),onSuccess:()=>{e.invalidateQueries({queryKey:[`brainStorage`]}),e.invalidateQueries({queryKey:[`backupHealth`]})}});return(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-3`,children:[(0,L.jsxs)(S,{children:[(0,L.jsxs)(g,{children:[(0,L.jsx)(f,{children:n(c,`system.panel.appearance`)}),(0,L.jsx)(_,{children:n(c,`system.panel.appearance.hint`)})]}),(0,L.jsxs)(b,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(F,{variant:r===`dark`?`default`:`outline`,onClick:()=>i(`dark`),children:n(c,`system.theme.dark`)}),(0,L.jsx)(F,{variant:r===`light`?`default`:`outline`,onClick:()=>i(`light`),children:n(c,`system.theme.light`)}),[`basic`,`advanced`,`admin`].map(e=>(0,L.jsx)(F,{variant:o===e?`default`:`outline`,onClick:()=>s(e),children:n(c,`shell.mode.${e}`)},e))]})]}),(0,L.jsx)(ne,{}),(0,L.jsx)(x,{title:o===`basic`?n(c,`system.panel.brainStatus`):n(c,`system.panel.serverHealth`),result:p.data,children:e=>(0,L.jsx)(re,{data:e})}),(0,L.jsx)(x,{title:o===`basic`?n(c,`system.panel.readiness`):n(c,`system.panel.hostTelemetry`),result:h.data,children:e=>o===`basic`?(0,L.jsx)(y,{stats:[{label:n(c,`system.stat.cpu`),value:`${String(e.cpu_pct||`0`)}%`},{label:n(c,`system.stat.memory`),value:`${String(e.ram_pct||`0`)}%`},{label:n(c,`system.stat.gpu`),value:`${String(e.gpu_mem_pct||`0`)}%`},{label:n(c,`system.stat.localStatus`),value:n(c,`system.stat.ready`)}]}):(0,L.jsx)(E,{value:e})}),(0,L.jsx)(x,{title:o===`basic`?n(c,`system.storage.title`):n(c,`system.panel.brainStorage`),result:C.data,className:`xl:col-span-3`,children:e=>(0,L.jsx)(ie,{data:e,mode:o,language:c})}),o===`basic`?null:(0,L.jsx)(x,{title:n(c,`system.backup.health`),result:w.data,className:`xl:col-span-3`,children:e=>(0,L.jsx)(ae,{data:e})}),o===`basic`?null:(0,L.jsxs)(S,{className:`xl:col-span-3`,children:[(0,L.jsxs)(g,{children:[(0,L.jsx)(f,{children:n(c,`system.archive.title`)}),(0,L.jsx)(_,{children:n(c,`system.archive.detail`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_1fr]`,children:[(0,L.jsx)(O,{value:N,onChange:e=>P(e.target.value),placeholder:n(c,`system.archive.exportPath`)}),(0,L.jsx)(O,{value:R,onChange:e=>z(e.target.value),placeholder:n(c,`system.archive.restorePath`)})]}),(0,L.jsx)(O,{type:`password`,value:B,onChange:e=>te(e.target.value),placeholder:n(c,`system.archive.passphrase`)}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(F,{onClick:()=>q.mutate(),disabled:!B||q.isPending,children:n(c,`system.archive.export`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>J.mutate(),disabled:!R||J.isPending,children:n(c,`system.archive.inspect`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>Y.mutate(),disabled:!R||!B||Y.isPending,children:n(c,`system.archive.verify`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>X.mutate(),disabled:!R||!B||X.isPending,children:n(c,`system.archive.restoreDryRun`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>Q.mutate(),disabled:!R||!B||Q.isPending,children:n(c,`system.archive.importDryRun`)}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:V,onChange:e=>H(e.target.checked)}),n(c,`system.archive.confirmRestore`)]}),(0,L.jsx)(F,{variant:`destructive`,onClick:()=>Z.mutate(),disabled:!R||!B||!V||Z.isPending,children:n(c,`system.archive.restore`)}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:U,onChange:e=>W(e.target.checked)}),n(c,`system.archive.confirmImport`)]}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>$.mutate(),disabled:!R||!B||!U||$.isPending,children:n(c,`system.archive.import`)})]}),[q.data,J.data,Y.data,X.data,Z.data,Q.data,$.data].filter(Boolean).map((e,t)=>(0,L.jsx)(m,{result:e,successLabel:n(c,`system.archive.requestDone`)},t))]})]}),o===`basic`?null:(0,L.jsxs)(S,{className:`xl:col-span-3`,children:[(0,L.jsxs)(g,{children:[(0,L.jsx)(f,{children:n(c,`system.scale.title`)}),(0,L.jsx)(_,{children:n(c,`system.scale.detail`)})]}),(0,L.jsxs)(b,{className:`grid gap-3`,children:[(0,L.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-[1fr_220px]`,children:[(0,L.jsx)(O,{value:D,onChange:e=>k(e.target.value),placeholder:n(c,`system.scale.dsn`)}),(0,L.jsx)(O,{value:A,onChange:e=>j(e.target.value),placeholder:n(c,`system.scale.schema`)})]}),(0,L.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,L.jsx)(F,{variant:`outline`,onClick:()=>G.mutate(!1),disabled:G.isPending,children:n(c,`system.scale.dockerPlan`)}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:M,onChange:e=>ee(e.target.checked)}),n(c,`system.scale.dockerConsent`)]}),(0,L.jsx)(F,{onClick:()=>G.mutate(!0),disabled:!M||G.isPending,children:n(c,`system.scale.dockerStart`)}),(0,L.jsx)(F,{variant:`outline`,onClick:()=>K.mutate(),disabled:!D||K.isPending,children:n(c,`system.scale.migrationPlan`)})]}),G.data?(0,L.jsx)(m,{result:G.data,successLabel:n(c,`system.scale.dockerDone`)}):null,K.data?(0,L.jsx)(m,{result:K.data,successLabel:n(c,`system.scale.migrationDone`)}):null]})]}),o===`basic`?null:(0,L.jsx)(x,{title:n(c,`system.computerMemory.title`),result:v.data,className:`xl:col-span-3`,children:e=>(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(E,{value:e}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(T,{label:n(c,`system.computerMemory.enable`),action:()=>a.setComputerMemory(!0),invalidate:[`computerMemory`]}),(0,L.jsx)(T,{label:n(c,`system.computerMemory.disable`),action:()=>a.setComputerMemory(!1),invalidate:[`computerMemory`],variant:`destructive`})]})]})})]})}function Y(e,t,r=n(e,`system.value.notReported`)){return t==null||t===``?r:typeof t==`boolean`?n(e,t?`system.value.enabled`:`system.value.disabled`):String(t)}function X({data:e}){let r=t(e=>e.language),a=i(e.presence||e.clients||e);return a.length?(0,L.jsx)(v,{items:a,titleKey:`user`,metaKey:`workspace_id`}):(0,L.jsx)(C,{title:n(r,`system.presence.empty`),detail:n(r,`system.presence.emptyDetail`)})}function Z({data:e}){let i=t(e=>e.mode),a=t(e=>e.language),o=Y(a,e.public_key,``);return i===`basic`?(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(Q,{title:n(a,`system.device.thisMac`),status:n(a,`system.value.trusted`),detail:n(a,`system.device.thisMacDetail`)}),(0,L.jsx)(D,{variant:`muted`,children:Y(a,e.algorithm,n(a,`system.value.localIdentity`))})]}):(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,L.jsx)(D,{variant:`success`,children:n(a,`system.value.localDevice`)}),(0,L.jsx)(D,{variant:`muted`,children:Y(a,e.algorithm,n(a,`system.value.identityKey`))})]}),(0,L.jsx)(p,{data:{device_id:e.device_id||e.id||n(a,`system.value.notReported`),fingerprint:e.fingerprint||n(a,`system.value.notReported`),public_key:o?r(o.replace(/\s+/g,` `),72):n(a,`system.value.notReported`)}})]})}function re({data:e}){let r=t(e=>e.mode),i=t(e=>e.language);return r===`basic`?(0,L.jsx)(Q,{title:n(i,`system.health.title`),status:n(i,`system.health.ok`),detail:n(i,`system.health.detail`)}):(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(y,{stats:[{label:n(i,`system.health.status`),value:e.status||e.ok||n(i,`system.value.reported`)},{label:n(i,`system.health.version`),value:e.version||n(i,`system.value.notReported`)},{label:n(i,`system.health.mode`),value:e.mode||e.environment||n(i,`system.value.local`)},{label:n(i,`system.health.port`),value:e.port||e.backend_port||n(i,`system.value.configured`)}]}),(0,L.jsx)(E,{value:e})]})}function ie({data:t,mode:r=`advanced`,language:i=`en`}){let a=e(t.active)?t.active:t,o=e(t.postgres)?t.postgres:{},s=e(t.backup_health)?t.backup_health:{},c=a.vector_search||a.vector||t.vector_search||t.sqlite_vec,l=!!(o.available||o.connected||o.enabled),u=!!c&&String(c).toLowerCase()!==`not reported`;return r===`basic`?(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(Q,{title:n(i,`system.storage.local.title`),status:n(i,`system.storage.local.badge`),detail:n(i,`system.storage.local.detail`)}),(0,L.jsx)(Q,{title:n(i,`system.storage.search.title`),status:u?n(i,`system.storage.search.on`):n(i,`system.storage.search.pending`),detail:u?n(i,`system.storage.search.detailOn`):n(i,`system.storage.search.detailPending`)})]}):(0,L.jsxs)(`div`,{className:`space-y-4`,children:[(0,L.jsx)(y,{stats:[{label:n(i,`system.storage.activeEngine`),value:a.engine||t.engine||n(i,`system.storage.sqlite`)},{label:n(i,`system.storage.sqliteDefault`),value:a.engine===`postgres`?n(i,`system.value.scaleMode`):n(i,`system.value.enabled`)},{label:n(i,`system.storage.vector`),value:c||n(i,`system.value.notReported`)},{label:n(i,`system.storage.postgres`),value:l?n(i,`system.value.available`):n(i,`system.value.optional`)}]}),(0,L.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-3`,children:[(0,L.jsx)(Q,{title:n(i,`system.storage.sqlite`),status:a.available===!1?n(i,`system.value.unavailable`):n(i,`system.value.default`),detail:Y(i,a.reason||a.path||t.path,n(i,`system.storage.sqliteDetail`))}),(0,L.jsx)(Q,{title:n(i,`system.storage.vector`),status:Y(i,c,n(i,`system.value.reported`)),detail:Y(i,a.vector_reason||a.sqlite_vec_reason||t.vector_reason,n(i,`system.storage.vectorDetail`))}),(0,L.jsx)(Q,{title:n(i,`system.storage.postgres`),status:l?n(i,`system.value.available`):n(i,`system.value.notEnabled`),detail:Y(i,o.reason||o.dsn||o.status,n(i,`system.storage.postgresDetail`))})]}),Object.keys(s).length?(0,L.jsx)(E,{value:{backup_health:s}}):null]})}function ae({data:e}){let r=t(e=>e.language);return(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(y,{stats:[{label:n(r,`system.backup.available`),value:e.available===!1?n(r,`system.value.no`):n(r,`system.value.yes`)},{label:n(r,`system.backup.backups`),value:e.count||e.backups||0},{label:n(r,`system.backup.encrypted`),value:e.encrypted_archives||0},{label:n(r,`system.backup.zip`),value:e.zip_backups||0}]}),(0,L.jsx)(p,{data:{directory:e.directory||n(r,`system.value.notReported`),latest:e.latest||n(r,`system.value.noneReported`),last_verified:e.last_verified||e.verified_at||n(r,`system.value.notReported`),failure:e.error||e.reason||n(r,`system.value.noneReported`)}})]})}function Q({title:e,status:t,detail:n}){let r=/unavailable|failed|denied|disabled|not enabled|사용 불가|실패|거부|비활성|활성화되지 않음/i.test(t)?`warning`:`success`;return(0,L.jsxs)(`div`,{className:`rounded-md border border-border bg-background p-3`,children:[(0,L.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,L.jsx)(`div`,{className:`font-medium`,children:e}),(0,L.jsx)(D,{variant:r,children:t})]}),(0,L.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:n})]})}function $({data:r}){let i=t(e=>e.language),a=e(r.startup)?r.startup:{},o=e(r.privacy)?r.privacy:{},s=e(r.storage)?r.storage:{},c=e(r.backup)?r.backup:{},l=e(r.device_identity)?r.device_identity:{},u=e(r.permissions)?r.permissions:{};return(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(y,{stats:[{label:n(i,`system.hardening.version`),value:r.version||n(i,`system.value.reported`)},{label:n(i,`system.hardening.localOnly`),value:o.local_only_default??a.local_only_default??n(i,`system.value.reported`)},{label:n(i,`system.hardening.storage`),value:e(s.active)?s.active.engine:n(i,`system.value.reported`)},{label:n(i,`system.hardening.backups`),value:c.count||c.available||n(i,`system.value.reported`)}]}),(0,L.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,L.jsx)(Q,{title:n(i,`system.hardening.startup`),status:n(i,a.network_exposed?`system.value.networkExposed`:`system.value.localOnly`),detail:n(i,`system.hardening.startupDetail`)}),(0,L.jsx)(Q,{title:n(i,`system.hardening.integrations`),status:n(i,o.local_only_default===!1?`system.value.reviewRequired`:`system.value.optIn`),detail:n(i,`system.hardening.integrationsDetail`)}),(0,L.jsx)(Q,{title:n(i,`system.hardening.identity`),status:Y(i,l.algorithm||l.fingerprint,n(i,`system.value.reported`)),detail:Y(i,l.storage,n(i,`system.hardening.identityStorage`))}),(0,L.jsx)(Q,{title:n(i,`system.hardening.permissions`),status:n(i,u.destructive_restore_requires_confirmation===!1?`system.value.reviewRequired`:`system.value.guarded`),detail:n(i,`system.hardening.permissionsDetail`)})]})]})}function oe({data:r}){let i=t(e=>e.language),a=e(r.cards)?r.cards:{},o=e(r.severity_counts)?r.severity_counts:{};return(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(y,{stats:[{label:n(i,`system.security.eventsToday`),value:a.events_today||0},{label:n(i,`system.security.highRisk`),value:a.high_risk_events||o.high||0},{label:n(i,`system.security.review`),value:a.review_required||0},{label:n(i,`system.security.riskRate`),value:r.risk_rate||0}]}),(0,L.jsx)(E,{value:{severity_counts:o,sensitive_fields:r.field_counts||{}}})]})}function se(){let e=t(e=>e.mode),r=t(e=>e.language),i=u({queryKey:[`adminSummary`],queryFn:a.adminSummary}),o=u({queryKey:[`adminUsers`],queryFn:a.adminUsers}),s=u({queryKey:[`adminAudit`],queryFn:()=>a.adminAudit()}),c=u({queryKey:[`adminRoles`],queryFn:a.adminRoles}),l=u({queryKey:[`adminPolicies`],queryFn:a.adminPolicies}),d=u({queryKey:[`adminProductHardening`],queryFn:a.adminProductHardening}),f=u({queryKey:[`adminSecurity`],queryFn:a.adminSecurity}),m=u({queryKey:[`vpcStatus`],queryFn:a.vpcStatus});return e===`admin`?(0,L.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,L.jsx)(x,{title:n(r,`system.admin.summary`),result:i.data,children:e=>(0,L.jsx)(p,{data:e})}),(0,L.jsx)(x,{title:n(r,`system.admin.users`),result:o.data,children:e=>(0,L.jsx)(v,{items:e,titleKey:`email`,metaKey:`role`})}),(0,L.jsx)(x,{title:n(r,`system.admin.audit`),result:s.data,children:e=>(0,L.jsx)(v,{items:e.recent_events||e,titleKey:`act`,metaKey:`sev`})}),(0,L.jsx)(x,{title:n(r,`system.admin.roles`),result:c.data,children:e=>(0,L.jsx)(v,{items:e.roles||e,titleKey:`role`,metaKey:`members`})}),(0,L.jsx)(x,{title:n(r,`system.admin.policies`),result:l.data,children:e=>(0,L.jsx)(v,{items:e.policies||e,titleKey:`label`,metaKey:`enforced`})}),(0,L.jsx)(x,{title:n(r,`system.admin.hardening`),result:d.data,children:e=>(0,L.jsx)($,{data:e})}),(0,L.jsx)(x,{title:n(r,`system.admin.security`),result:f.data,children:e=>(0,L.jsx)(oe,{data:e})}),(0,L.jsx)(x,{title:n(r,`system.admin.vpc`),result:m.data,className:`xl:col-span-2`,children:e=>(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(D,{variant:`muted`,children:n(r,`system.admin.communityUnavailable`)}),(0,L.jsx)(E,{value:e})]})})]}):(0,L.jsx)(w,{title:n(r,`system.admin.controls`),detail:n(r,`system.admin.controlsDetail`),target:`admin`})}export{H as SystemPage};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]);export{t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]);export{t};
@@ -0,0 +1 @@
1
+ import{m as e}from"./utils-DYf7pqrR.js";e({ko:{"brain.level":`단계`,"brain.depth.1":`지금 기억`,"brain.depth.2":`오래된 기억`,"brain.depth.3":`주제`,"brain.depth.4":`관계`,"brain.depth.5":`전체 지식 그래프`,"brain.depthTitle.1":`깊이 1: 현재 맥락`,"brain.depthLabel.1":`살아있는 Brain`,"brain.depthLabel.2":`기억 계층`,"brain.depthLabel.3":`지식 계층`,"brain.depthLabel.4":`관계 계층`,"brain.depthLabel.5":`지식 그래프`,"brain.view.memories":`기억 보기`,"brain.view.topics":`주제 보기`,"brain.view.relationships":`관계 보기`,"brain.view.graph":`그래프로 보기`,"brain.surface":`돌아가기`,"brain.aria.home":`Lattice Brain`,"brain.aria.exploration":`Brain 탐색`,"brain.aria.quickViews":`Brain 빠른 보기`,"brain.depthRail.aria":`Brain 깊이 진행 상태`,"brain.aria.conversation":`Brain과의 대화`,"brain.aria.ownership":`Brain 소유 보장`,"brain.aria.actions":`Brain 주요 작업`,"brain.aria.starterPrompts":`시작 프롬프트`,"brain.aria.overview":`Brain 한눈에 보기`,"brain.aria.graph":`지식 그래프`,"brain.edition":`정식 제품`,"brain.edition.tip":`Lattice AI {version} — 한눈에 바로 쓰는 디지털 브레인`,"brain.local":`로컬 우선`,"brain.portable":`이동 가능`,"brain.private":`개인 소유`,"brain.admin":`관리자 콘솔`,"brain.command.aria":`제품 상태와 다음 행동`,"brain.command.kicker":`제품 상태판`,"brain.command.title":`지금 바로 쓸 수 있는 Brain`,"brain.command.score":`제품 준비도`,"brain.command.next":`다음 행동`,"brain.command.next.empty":`첫 자료를 넣고 바로 질문하세요.`,"brain.command.next.forming":`주제를 열어 기억이 어떻게 묶이는지 확인하세요.`,"brain.command.next.alive":`근거를 확인하고 필요하면 모델을 바꿔 보세요.`,"brain.command.metrics":`Brain 제품 지표`,"brain.command.metric.memories":`기억 {count}개`,"brain.command.metric.topics":`주제 {count}개`,"brain.command.metric.sources":`정상 출처 {count}개`,"brain.command.metric.proof":`근거 {count}개`,"brain.command.source.empty":`아직 수집 전`,"brain.command.action.add":`자료 넣기`,"brain.command.action.find":`주제 확인`,"brain.command.action.find.detail":`기억이 묶인 구조 보기`,"brain.command.action.proof":`근거 확인`,"brain.command.action.own":`소유권 관리`,"brain.command.action.own.detail":`백업, 복원, 설정`,"brain.command.signal.local":`로컬 우선`,"brain.command.signal.private":`명시 동의`,"brain.command.signal.portable":`백업 가능`,"brain.chatHome.aria":`Brain Chat Home`,"brain.chatHome.contextAria":`Brain 상태와 자료 패널`,"brain.chatHome.headerLine":`필요한 일부터 바로 시작하세요.`,"brain.chatHome.kicker":`Lattice Brain`,"brain.chatHome.title":`무엇을 해볼까요?`,"brain.chatHome.body":`질문하거나 자료를 넣으면 Brain이 기억하고 연결해 다음 답변에 사용합니다.`,"brain.chatHome.utility":`Brain 세부 정보`,"brain.chatHome.utility.basic":`자료와 Brain 관리`,"brain.files.title":`파일을 만들었어요`,"brain.files.download":`다운로드`,"brain.files.downloading":`내려받는 중…`,"brain.files.downloadError":`다운로드하지 못했어요: {reason}`,"brain.files.hint":`이 컴퓨터의 Lattice 작업 폴더에 안전하게 저장되어 있어요.`,"brain.files.repaired":`자동 보정됨 — 내용을 한번 확인해 주세요`,"brain.agent.needsReview":`완료를 검증하지 못했어요 — 결과를 직접 확인해 주세요.`,"brain.agent.failed":`작업을 끝까지 완료하지 못했어요. 다시 시도해 주세요.`,"brain.code.copy":`복사`,"brain.code.copied":`복사했어요`,"brain.code.save":`파일로 저장`,"brain.code.saving":`저장 중…`,"brain.code.saveError":`파일로 저장하지 못했어요: {reason}`,"brain.firstScreen.aria":`Brain 첫 화면`,"brain.home.kicker":`내 기억이 자라는 곳`,"brain.home.insights":`Brain이 정리한 내용`,"brain.home.shelf.close":`Brain 보조 패널 닫기`,"brain.home.insights.detail":`기억, 연결, 다음 행동을 필요할 때 확인하세요`,"brain.firstScreen.title":`말하고, 넣으면, Brain이 연결합니다.`,"brain.firstScreen.body":`대화와 컴퓨터의 파일·폴더가 기억으로 들어오고, 실제 지식 그래프와 다음 자동화로 이어집니다.`,"brain.firstScreen.state.quiet":`아직 기억할 내용을 기다리고 있어요`,"brain.firstScreen.state.forming":`새 내용을 정리하고 있어요`,"brain.firstScreen.state.alive":`기억을 사용할 준비가 됐어요`,"brain.firstScreen.readiness":`Brain 준비도 {score}%`,"brain.firstScreen.memoryAria":`Brain이 기억하고 연결한 내용`,"brain.firstScreen.memory":`방금 기억한 것`,"brain.firstScreen.memory.empty":`아직 없습니다. 첫 생각이나 문서를 넣어보세요.`,"brain.firstScreen.memory.with":`{title}`,"brain.firstScreen.connection":`연결 중인 주제`,"brain.firstScreen.concept.empty":`자료가 들어오면 관련 주제가 여기에 보입니다.`,"brain.firstScreen.concept.with":`{title}`,"brain.firstScreen.next":`다음 행동`,"brain.firstScreen.next.source":`문서나 메모를 넣으면 Brain이 바로 기억을 만들기 시작합니다.`,"brain.firstScreen.next.ask":`첫 질문을 던지면 Brain이 가진 기억을 기준으로 답합니다.`,"brain.firstScreen.next.graph":`기억 그래프에서 Brain이 연결한 내용을 확인해보세요.`,"brain.firstScreen.actions":`Brain 첫 화면 주요 행동`,"brain.firstScreen.action.talk":`Brain에게 말하기`,"brain.firstScreen.action.source":`자료 넣기`,"brain.firstScreen.action.graph":`기억 그래프 보기`,"brain.living.aria":`살아 있는 나의 Brain`,"brain.living.open":`Brain의 실제 지식 그래프 열기`,"brain.living.graph":`내 지식 그래프 중심`,"brain.living.depth":`Brain 깊이 {depth}`,"brain.living.state.idle":`기억을 지키는 중`,"brain.living.state.listening":`듣는 중`,"brain.living.state.thinking":`함께 생각하는 중`,"brain.living.state.recalling":`기억을 불러오는 중`,"brain.living.state.synthesizing":`연결을 만드는 중`,"brain.living.state.planning":`계획하는 중`,"brain.living.state.acting":`실행하는 중`,"brain.living.state.resting":`곁에서 기다리는 중`,"brain.flow.sources.aria":`Brain으로 들어오는 지식 출처`,"brain.flow.sources":`들어오는 지식`,"brain.flow.vital":`Brain 생명 신호`,"brain.flow.memory":`기억하는 Brain`,"brain.flow.graph":`실제 지식 그래프`,"brain.flow.graph.aria":`실제 주제 {concepts}개와 관계 {relationships}개로 구성된 지식 그래프`,"brain.flow.graph.empty":`첫 대화나 자료가 들어오면 실제 주제와 연결이 여기에서 생겨납니다.`,"brain.flow.graph.empty.short":`첫 연결을 만드는 중`,"brain.flow.node.aria":`{type} 주제 {label}를 지식 그래프에서 열기`,"brain.flow.source.empty":`첫 대화나 자료를 기다리는 중`,"brain.flow.status.emerged":`새 기억 {memories}개와 주제 {entities}개가 실제 Brain에 연결됐습니다.`,"brain.flow.status.ready":`{focus} 주변의 기억과 연결을 유지하고 있습니다.`,"brain.flow.status.empty":`질문하거나 자료를 넣으면 Brain이 기억과 연결을 만들기 시작합니다.`,"brain.flow.path.aria":`지식이 기억과 자동화로 이어지는 흐름`,"brain.flow.path.input":`입력`,"brain.flow.path.waiting":`대기 중`,"brain.flow.path.memory":`기억`,"brain.flow.path.memoryCount":`실제 기억 {count}개`,"brain.flow.path.connections":`연결`,"brain.flow.path.graphCount":`주제 {concepts} · 관계 {relationships}`,"brain.flow.path.automation":`다음 행동`,"brain.flow.path.actionCount":`기억 기반 제안 {count}개`,"brain.flow.conversation":`이번 대화`,"brain.flow.conversation.ready":`대화를 Brain 기억으로 보관`,"brain.flow.relationships":`실제 관계 {count}개`,"brain.automation.kicker":`기억에서 실행으로`,"brain.automation.title":`이 기억으로 Brain이 할 수 있는 일`,"brain.automation.more":`모든 기억 기반 행동 보기`,"brain.automation.close":`기억 기반 행동 닫기`,"brain.automation.body":`현재 기억의 초점과 근거를 바탕으로 다음 질문, 검토, Agent 실행을 제안합니다.`,"brain.automation.basedOn":`이 기억을 근거로 추천`,"brain.automation.empty":`기억이 더 생기면 Brain이 근거가 있는 자동화를 이곳에 제안합니다.`,"brain.automation.guard":`추천은 기억을 근거로 만들고, 실행은 사용자가 선택한 뒤 시작됩니다.`,"brain.automation.intent.ask":`기억으로 질문`,"brain.automation.intent.delegate":`Agent 실행`,"brain.automation.intent.review":`검토함에 초안`,"brain.automation.intent.route":`그래프에서 확인`,"brain.brief.aria":`Brain 브리핑`,"brain.brief.kicker":`한눈에 보기`,"brain.brief.headline.quiet":`아직 비어 있지만 바로 시작할 수 있습니다`,"brain.brief.headline.forming":`새 기억이 주제로 묶이는 중입니다`,"brain.brief.headline.alive":`지금 참고할 만한 기억이 있습니다`,"brain.brief.body.quiet":`첫 자료나 질문을 넣으면 이 자리에 방금 배운 내용과 다음 행동이 표시됩니다.`,"brain.brief.body.forming":`{focus}를 중심으로 기억을 연결하고 있습니다.`,"brain.brief.body.alive":`{focus}를 바로 물어보거나 그래프에서 연결을 확인할 수 있습니다.`,"brain.brief.focus":`지금 볼 것`,"brain.brief.focus.empty":`아직 첫 기억이 없습니다`,"brain.brief.focus.empty.detail":`문서, 노트, 웹페이지, 질문 중 하나로 시작하세요.`,"brain.brief.evidence.aria":`Brain 브리핑 근거`,"brain.brief.evidence.durable":`저장 근거`,"brain.brief.evidence.durable.detail":`로컬에 남아 모델을 바꿔도 유지되는 기억 수`,"brain.brief.evidence.graph":`그래프 주제`,"brain.brief.evidence.graph.detail":`지식 그래프에서 확인 가능한 주제 수`,"brain.brief.evidence.sources":`정상 출처`,"brain.brief.evidence.sources.detail":`사용 가능한 기억 계층 수`,"brain.brief.actions":`Brain 브리핑 다음 행동`,"brain.brief.action.add":`자료 넣기`,"brain.brief.action.add.detail":`파일, 폴더, 노트, 웹`,"brain.brief.action.ask":`바로 질문`,"brain.brief.action.ask.detail":`입력창으로 이동`,"brain.brief.action.topics":`연결 보기`,"brain.brief.action.topics.detail":`그래프에서 주제 확인`,"brain.brief.action.verify":`근거 확인`,"brain.brief.action.verify.detail":`모델을 바꿔도 유지되는지 보기`,"brain.brief.action.backup":`백업 관리`,"brain.brief.action.backup.detail":`Brain을 내보내고 보관`,"brain.suggestions.aria":`Brain 추천 질문`,"brain.suggestions.title":`이렇게 시작해 보세요`,"brain.proactive.aria":`Brain 추천 실행`,"brain.proactive.title":`Brain이 먼저 추천하는 실행`,"brain.proactive.addSource.label":`자료부터 넣기`,"brain.proactive.addSource.detail":`Brain이 기억할 첫 자료를 추가`,"brain.proactive.seed.label":`기억 시드 만들기`,"brain.proactive.seed.detail":`무엇을 기억해야 할지 대화로 정리`,"brain.proactive.evidence.label":`근거 검토`,"brain.proactive.evidence.detail":`확실한 사실과 약한 신호 분리`,"brain.proactive.delegate.label":`Agent에게 맡기기`,"brain.proactive.delegate.detail":`현재 초점을 실행 계획으로 위임`,"brain.proactive.review.label":`검토 작업으로 저장`,"brain.proactive.review.detail":`Review Center에서 승인할 초안 생성`,"brain.proactive.map.label":`연결 지도 보기`,"brain.proactive.map.detail":`관련 주제를 그래프에서 확인`,"brain.proactive.weekly.label":`주간 Brain 점검`,"brain.proactive.weekly.detail":`변화/결정/위임 후보를 검토 초안으로`,"brain.proactive.trail.aria":`Brain 추천 실행 기록`,"brain.proactive.trail.title":`최근 실행`,"brain.proactive.status.running":`진행 중`,"brain.proactive.status.completed":`완료`,"brain.proactive.status.failed":`실패`,"brain.proactive.intent.ask":`Brain 질문`,"brain.proactive.intent.delegate":`Agent 위임`,"brain.proactive.intent.review":`Review 초안`,"brain.proactive.intent.route":`화면 이동`,"brain.suggestion.start.label":`시작 가이드`,"brain.suggestion.start.detail":`첫 기억을 만들 자료와 질문 추천`,"brain.suggestion.start.prompt":`내 Brain을 시작하기 위해 지금 넣으면 좋은 자료와 첫 질문을 추천해줘.`,"brain.suggestion.context.label":`자료 준비`,"brain.suggestion.context.detail":`지금 넣을 만한 맥락 정리`,"brain.suggestion.context.prompt":`내가 지금 Brain에 넣으면 가장 도움이 될 문서, 메모, 웹페이지를 우선순위로 정리해줘.`,"brain.suggestion.focus.label":`초점 정리`,"brain.suggestion.focus.detail":`현재 기억에서 다음 행동 뽑기`,"brain.suggestion.focus.prompt":`{focus}를 기준으로 지금 확인해야 할 핵심 결정과 다음 행동을 정리해줘.`,"brain.suggestion.evidence.label":`근거 확인`,"brain.suggestion.evidence.detail":`Brain이 기억한 근거로 답변`,"brain.suggestion.evidence.prompt":`{focus}에 대해 Brain이 가진 근거를 인용해서 답해줘.`,"brain.suggestion.graph.label":`연결 탐색`,"brain.suggestion.graph.detail":`그래프에 묶인 관련 주제 보기`,"brain.suggestion.graph.prompt":`{focus}와 연결된 주제를 근거와 함께 설명해줘.`,"brain.suggestion.history.label":`후속 작업`,"brain.suggestion.history.detail":`최근 대화에서 이어갈 일 찾기`,"brain.suggestion.history.prompt":`{focus}와 관련해서 최근 대화에서 놓친 후속 작업을 뽑아줘.`,"brain.tab.conversation":`대화`,"brain.tab.memory":`내 자료`,"brain.tab.knowledge":`찾기`,"brain.tab.relationships":`관계`,"brain.tab.graph":`연결 지도`,"brain.tab.portability":`돌보기`,"brain.headline.conversation":`Brain과 대화하세요.`,"brain.headline.memory":`저장된 기억과 출처를 확인하세요.`,"brain.headline.knowledge":`기억에서 찾아보세요.`,"brain.headline.relationships":`관계 — 왜 그런지 알 때.`,"brain.headline.graph":`기억 사이의 연결을 살펴보세요.`,"brain.headline.portability":`Brain 돌보기.`,"brain.search.title":`기억 찾기`,"brain.search.detail":`대화와 추가한 자료에서 필요한 내용을 찾습니다.`,"brain.search.placeholder":`사람, 문서, 주제로 검색`,"brain.search.cta":`찾기`,"brain.search.results":`검색 결과`,"brain.group.knowledge":`지식`,"brain.group.source":`출처`,"brain.group.activity":`활동`,"brain.group.memory":`기억`,"brain.group.people":`사람`,"brain.group.system":`시스템`,"brain.group.other":`기타`,"graph.search.basic":`생각, 파일, 사람, 노트 검색…`,"graph.search.advanced":`그래프 라벨, 유형, 출처 검색…`,"graph.group.all":`모든 묶음`,"graph.labels.important":`중요한 이름만`,"graph.labels.all":`모든 이름`,"graph.labels.off":`이름 숨기기`,"graph.fit":`화면 맞춤`,"graph.canvas.aria":`지식 그래프 캔버스 — 화살표 키로 항목을 이동하고 Enter로 열어요`,"graph.deep.title":`연결 지도`,"graph.deep.summary":`저장된 {total}개 중에서 생각 {nodes}개와 연결 {edges}개를 보여드려요.`,"graph.filtered":`{count}개 숨김`,"graph.allInView":`모두 보이는 중`,"graph.importance":`중요도`,"graph.clearFocus":`선택 해제`,"graph.searchAll":`전체 기억에서 찾기`,"graph.collapsed":`접힘`,"graph.focus.title":`자세히 보기`,"graph.focus.desc":`항목을 누르면 왜 중요한지 알려드려요.`,"graph.importanceBadge":`중요도 {n}`,"graph.source.none":`출처 기록 없음`,"graph.created.none":`저장 시각 기록 없음`,"graph.copySource":`출처 복사`,"graph.collapsedGroup":`접힌 묶음`,"graph.expandGroup":`묶음 펼치기`,"graph.nothingSelected.title":`아직 선택한 항목이 없어요`,"graph.nothingSelected.detail":`그래프에서 항목이나 묶음을 눌러 보세요.`,"graph.empty.title":`아직 연결된 기억이 없어요`,"graph.empty.detail":`문서, 노트, 폴더를 넣으면 출처와 함께 연결된 기억이 만들어져요.`,"graph.important.title":`중요한 항목`,"graph.important.desc":`지금 가장 많이 연결된 항목이에요.`,"graph.advanced.title":`관계 자세히 보기`,"graph.advanced.desc.basic":`연결이 어떻게 이어지는지 자세히 보고 싶을 때 여세요.`,"graph.advanced.desc.other":`관계, 출처, 그래프 구조를 살펴봅니다.`,"graph.minImportance.aria":`최소 관계 중요도`,"graph.coverage":`출처 반영률`,"brain.action.add":`넣기`,"brain.action.find":`찾기`,"brain.action.model":`모델`,"brain.action.settings":`설정`,"brain.empty.kicker":`시작 예시`,"brain.empty.title":`아래 문장을 눌러 바로 시작할 수 있습니다.`,"brain.empty.body":`문서를 넣고 싶으면 입력창의 문서 버튼을 누르세요.`,"brain.empty.trail.label":`첫 Brain 흐름`,"brain.empty.trail.save":`1. 첫 기억 저장`,"brain.empty.trail.recall":`2. Brain Home에서 확인`,"brain.empty.trail.backup":`3. 백업으로 소유`,"brain.home.line":`대화할수록 선명해지는, 내 로컬 지식의 중심`,"brain.prompt.remember":`내 자료에서 중요한 결정을 찾아줘`,"brain.prompt.know":`이 문서의 핵심만 정리해줘`,"brain.prompt.plan":`지금 해야 할 일을 우선순위로 정리해줘`,"brain.placeholder":`질문하거나, 자료를 붙여 넣거나, 할 일을 적어보세요`,"brain.composer.attachments":`자료 첨부`,"brain.composer.hint":`Enter로 보내기 · Shift+Enter로 줄바꿈`,"brain.upload.cta":`파일/문서 넣기`,"brain.upload.ctaShort":`문서`,"brain.upload.uploading":`넣는 중`,"brain.upload.hint":`업로드하면 실제 기억과 그래프로 다시 보입니다.`,"brain.upload.pending":`{name}을 Brain에 넣는 중입니다.`,"brain.upload.saved":`{name}이 Brain에 저장됐습니다.`,"brain.upload.failed":`문서를 넣지 못했습니다: {reason}`,"brain.ingest.aria":`Brain에 넣기`,"brain.ingest.kicker":`Brain에게 가르치기`,"brain.ingest.title":`컴퓨터의 자료를 선택하면 기억과 그래프로 들어갑니다.`,"brain.ingest.dock.title":`파일 · 폴더 · 노트 · 웹`,"brain.ingest.dock.close":`자료 입력 닫기`,"brain.ingest.type.chat":`대화`,"brain.ingest.file":`파일 넣기`,"brain.ingest.file.detail":`PDF, 문서, 표, 메모`,"brain.ingest.folder":`폴더 넣기`,"brain.ingest.folder.placeholder":`로컬 폴더 경로`,"brain.ingest.note":`노트 넣기`,"brain.ingest.note.placeholder":`결정이나 맥락을 붙여넣기`,"brain.ingest.web":`웹 넣기`,"brain.ingest.web.placeholder":`https://...`,"brain.ingest.folder.pending":`{path} 폴더를 Brain에 연결 중입니다.`,"brain.ingest.folder.saved":`{path} 폴더가 Brain에 연결됐습니다.`,"brain.ingest.folder.failed":`폴더를 넣지 못했습니다: {reason}`,"brain.ingest.note.pending":`노트를 Brain에 저장 중입니다.`,"brain.ingest.note.saved":`노트가 Brain에 저장됐습니다.`,"brain.ingest.note.failed":`노트를 넣지 못했습니다: {reason}`,"brain.ingest.web.pending":`{url}을 읽어 Brain에 넣는 중입니다.`,"brain.ingest.web.saved":`{url}이 Brain에 저장됐습니다.`,"brain.ingest.web.failed":`웹 페이지를 넣지 못했습니다: {reason}`,"brain.ingest.type.file":`파일`,"brain.ingest.type.folder":`폴더`,"brain.ingest.type.note":`노트`,"brain.ingest.type.web":`웹`,"brain.ingest.cta.file":`선택해서 바로 넣기`,"brain.ingest.cta.folder":`경로를 넣고 Enter`,"brain.ingest.cta.note":`내용을 붙여넣고 Enter`,"brain.ingest.cta.web":`URL을 넣고 Enter`,"brain.ingest.active":`{label} 처리 중`,"brain.ingest.progress.aria":`{label} 수집 진행 상태`,"brain.ingest.stage.preparing":`준비`,"brain.ingest.stage.parsing":`파싱`,"brain.ingest.stage.embedding":`임베딩`,"brain.ingest.stage.indexing":`인덱싱`,"brain.ingest.stage.complete":`메모리화 완료`,"brain.ingest.stage.error":`실패`,"brain.ingest.stage.error.hint":`Brain에 들어가지 못했습니다`,"brain.ingest.stage.preparing.hint":`원본을 읽어들이는 중`,"brain.ingest.stage.parsing.hint":`텍스트와 구조를 추출하는 중`,"brain.ingest.stage.embedding.hint":`의미 벡터로 변환하는 중`,"brain.ingest.stage.indexing.hint":`지식 그래프에 연결하는 중`,"brain.ingest.stage.complete.hint":`내 지식으로 들어왔습니다`,"brain.ingest.result":`새 기억 {memories}개 · 새 엔티티 {entities}개`,"brain.ingest.result.empty":`기존 지식과 통합됨`,"brain.ingest.quality.low":`이 자료는 내용을 읽어내기 어려웠어요. 일부가 빠졌거나 부정확할 수 있어요.`,"brain.freshness.pending":`일부 지식이 최신 인덱싱을 기다리고 있어요 ({count}건). 답변에는 곧 반영됩니다.`,"brain.freshness.staleEmbedder":`임베딩 모델이 바뀌었어요`,"brain.freshness.staleEmbedder.detail":`예전 모델로 만든 색인이 남아 있어 검색 품질이 떨어질 수 있어요. 다시 인덱싱하면 해결됩니다.`,"brain.freshness.reindex":`다시 인덱싱하기`,"brain.freshness.reindex.running":`다시 인덱싱하는 중…`,"brain.freshness.reindex.failed":`다시 인덱싱에 실패했어요. 잠시 후 다시 시도해 주세요.`,"brain.contextQuality.limited":`이번 답변은 저장된 지식 연결이 적은 상태에서 만들어졌어요.`,"brain.contextQuality.reason":`이유: {reason}`,"brain.jobs.aria":`백그라운드 수집 작업`,"brain.jobs.title":`자료를 정리하는 중`,"brain.jobs.progress":`{processed}/{total} 처리`,"brain.jobs.progressAria":`수집 진행률: {total}개 중 {processed}개 처리`,"brain.jobs.failedCount":`실패 {count}건`,"brain.jobs.resume":`이어서 처리`,"brain.jobs.resuming":`다시 시작하는 중…`,"brain.jobs.status.queued":`대기 중`,"brain.jobs.status.running":`진행 중`,"brain.jobs.status.completed":`완료`,"brain.jobs.status.failed":`실패`,"brain.jobs.status.partial":`부분 완료`,"brain.jobs.report.title":`폴더 수집을 마쳤어요`,"brain.jobs.report.titlePartial":`폴더 수집을 일부 마쳤어요`,"brain.jobs.report.documents":`+{count} 문서`,"brain.jobs.report.vector":`벡터 인덱스 {percent}% 최신`,"brain.jobs.report.skipped":`건너뛰거나 실패한 파일`,"brain.jobs.report.dismiss":`수집 결과 닫기`,"brain.preview.open":`미리보기`,"brain.preview.close":`미리보기 닫기`,"brain.preview.aria":`파일 미리보기: {name}`,"brain.preview.loading":`미리보기를 불러오는 중…`,"brain.preview.error":`미리보기를 불러오지 못했어요: {reason}`,"brain.preview.sandboxNote":`안전한 미리보기 — 스크립트와 외부 연결은 실행되지 않아요.`,"brain.dnd.title":`여기에 놓아 Brain에 추가`,"brain.dnd.detail":`파일을 놓으면 바로 기억으로 정리해 드려요.`,"brain.timeline.aria":`최근 메모리 생성 타임라인`,"brain.timeline.emergenceTitle":`방금 생긴 지식`,"brain.timeline.recent":`최근 수집`,"brain.timeline.newMemories":`새 기억 {count}개`,"brain.timeline.newEntities":`새 엔티티 {count}개`,"brain.timeline.at":`{time}`,"brain.timeline.justNow":`방금`,"brain.timeline.minutesAgo":`{count}분 전`,"brain.timeline.empty":`아직 수집 기록이 없습니다. 위에서 무엇이든 넣어보세요.`,"brain.image":`이미지`,"brain.unavailable":`지금은 응답할 수 없습니다`,"brain.noModel.message":`아직 불러온 모델이 없습니다. 모델 선택 화면에서 로컬 모델을 준비한 뒤 다시 보내 주세요.`,"brain.noModel.status":`모델을 먼저 준비해야 대화를 시작할 수 있습니다.`,"brain.noModel.banner":`아직 Brain의 목소리(모델)가 준비되지 않았습니다. 준비 후 바로 대화할 수 있어요.`,"brain.noModel.cta":`모델 준비하기`,"brain.newChat":`새 대화`,"brain.stop":`중지`,"brain.stopped":`응답 생성을 중단했습니다.`,"brain.stopped.empty":`(응답이 중단되었습니다)`,"brain.history.title":`지난 대화`,"brain.history.hint":`Brain이 기억하는 최근 대화입니다. 눌러서 이어가세요.`,"brain.history.aria":`지난 대화 목록`,"brain.history.messages":`메시지 {count}개`,"brain.history.resumeAria":`대화 이어가기: {title}`,"brain.history.deleteAria":`대화 삭제: {title}`,"brain.history.deleteConfirm":`한 번 더 누르면 삭제`,"brain.history.deleted":`대화를 삭제했습니다.`,"brain.history.deleteFailed":`대화를 삭제하지 못했습니다: {reason}`,"brain.history.loading":`대화를 불러오는 중...`,"brain.history.loadFailed":`대화를 불러오지 못했습니다: {reason}`,"brain.history.emptyConversation":`저장된 메시지가 없습니다`,"brain.history.resumed":`지난 대화를 이어갑니다. 이어서 말해 보세요.`,"brain.history.showMore":`더 보기 ({count}개)`,"brain.history.showLess":`접기`,"brain.message.copy":`복사`,"brain.message.copied":`복사됨`,"brain.message.copyAria":`응답 전체 복사`,"brain.message.regenerate":`다시 생성`,"brain.message.regenerateAria":`마지막 질문에 다시 답변 받기`,"brain.message.saveTask":`작업함에 저장`,"brain.message.saveTaskAria":`이 답변을 검토함 작업 초안으로 저장`,"brain.message.followup.aria":`답변 후속 질문`,"brain.message.followup.checklist":`체크리스트로`,"brain.message.followup.checklist.prompt":`방금 답변을 실행 가능한 체크리스트로 바꿔줘.`,"brain.message.followup.evidence":`근거/불확실성`,"brain.message.followup.evidence.prompt":`방금 답변의 근거와 아직 불확실한 부분을 분리해서 보여줘.`,"brain.message.followup.next":`다음 3가지`,"brain.message.followup.next.prompt":`방금 답변을 기준으로 내가 다음에 해야 할 3가지를 우선순위로 정리해줘.`,"brain.imageAttached":`이미지 첨부됨`,"brain.send":`보내기`,"brain.saved":`기억에 저장됨 · 연결된 주제 {topics}개 · 관련 기억 {memories}개`,"brain.saved.detail":`출처와 함께 나중에 다시 불러올 수 있습니다.`,"brain.action.defaultTitle":`Brain 답변 후속 작업`,"brain.action.saved":`작업 초안이 Review Center에 저장됨`,"brain.action.saveFailed":`작업 초안을 저장하지 못했습니다: {reason}`,"brain.delegate.title":`Agent team`,"brain.delegate.detail":`현재 초안을 목표로 위임하고 결과를 Brain에 남깁니다.`,"brain.delegate.cta":`위임`,"brain.delegate.running":`위임 중...`,"brain.delegate.saved":`Brain 갱신됨`,"brain.delegate.done":`에이전트 결과가 Brain 메모리로 합성되었습니다.`,"brain.delegate.failed":`에이전트 위임 실패: {reason}`,"brain.recalled":`기억을 다시 꺼냈습니다: {title}`,"brain.overview.kicker":`Brain 한눈에 보기`,"brain.overview.title":`기억과 주제를 바로 확인하세요.`,"brain.overview.graph":`전체 그래프`,"brain.overview.agent":`Agent 결과`,"brain.overview.agentEmpty":`위임 결과가 생기면 여기에 강조됩니다.`,"brain.overview.recent":`최근 기억`,"brain.overview.recentEmpty":`아직 최근 기억이 없습니다.`,"brain.overview.older":`이전 기억`,"brain.overview.olderEmpty":`대화가 쌓이면 과거 기억이 보입니다.`,"brain.overview.topics":`주요 주제`,"brain.overview.topicsEmpty":`주제가 형성되는 중입니다.`,"brain.readiness.kicker":`Brain 준비도`,"brain.readiness.aria":`Brain 준비도 점수`,"brain.readiness.quiet":`첫 기억을 기다리고 있습니다.`,"brain.readiness.forming":`기억이 주제로 자라는 중입니다.`,"brain.readiness.alive":`기억과 관계가 연결되어 있습니다.`,"brain.readiness.start":`첫 기억 보기`,"brain.readiness.grow":`주제 키우기`,"brain.readiness.map":`지도 보기`,"brain.proof.aria":`Brain 증거`,"brain.proof.context":`다시 불러올 맥락`,"brain.proof.contextValue":`{count}개 저장됨`,"brain.proof.contextEmpty":`첫 기억 대기`,"brain.proof.model":`모델 교체 후에도 유지`,"brain.proof.noModel":`모델 미로드`,"brain.proof.modelPending":`저장 후 증명됨`,"brain.proof.store":`지식 저장소`,"brain.proof.storeValue":`주제 {topics}개 · 기억 조각 {vectors}개`,"brain.proof.recall":`방금 Brain이 다시 꺼낸 기억`,"brain.proof.recallEmpty.kicker":`Brain 증거 자리`,"brain.proof.recallEmpty.title":`첫 대화 후 여기에 다시 꺼낸 기억이 표시됩니다.`,"brain.proof.recallEmpty.detail":`아직 저장된 기억이 없어, 예시를 꾸며내는 대신 실제 기억이 쌓이기를 기다립니다.`,"brain.proof.recallPending":`기억은 저장됐고, 다시 꺼낼 준비를 하고 있습니다.`,"brain.proof.recallPending.detail":`인덱싱이 끝나면 이 자리에서 실제 기억을 다시 보여줍니다.`,"brain.modelDemo.aria":`모델 교체 증거`,"brain.modelDemo.kicker":`모델 독립 Brain`,"brain.modelDemo.proven":`현재 기억은 모델 밖에 남아 있습니다.`,"brain.modelDemo.pending":`첫 기억이 저장되면 모델 교체 증거가 생깁니다.`,"brain.modelDemo.detail":`현재 모델: {model}. 같은 질문으로 Brain 증거를 다시 확인할 수 있습니다.`,"brain.modelDemo.verify":`같은 증거 확인`,"brain.modelDemo.change":`모델 바꾸기`,"brain.modelDemo.needQuestion":`먼저 질문하거나 기억을 넣으면 같은 증거를 다시 확인할 수 있습니다.`,"brain.modelDemo.checking":`{model}에서 같은 Brain 증거를 다시 확인 중입니다.`,"brain.modelDemo.done":`{model}에서도 같은 Brain 증거를 확인했습니다.`,"brain.proof.unavailable":`Brain 근거를 확인하지 못했습니다: {reason}`,"brain.answerProof.aria":`답변 출처와 기억 근거`,"brain.answerProof.title":`기억 근거와 출처`,"brain.answerProof.modelProven":`{model} 밖에 남은 Brain 증거`,"brain.answerProof.modelPending":`{model} 응답 · 증거 저장 대기`,"brain.answerProof.empty":`아직 연결된 출처가 없습니다. 기억이 인덱싱되면 여기에 표시됩니다.`,"brain.citation.chip":`출처 {num}`,"brain.citation.chip.long":`출처 {num}: {title}`,"brain.citation.expand":`출처 열기`,"brain.citation.close":`출처 닫기`,"brain.citation.preview.from":`출처: `,"brain.citation.preview.snippet":`발췌: `,"brain.citation.keyboard.tip":`스페이스/엔터로 출처를 열고, ESC로 닫습니다.`,"brain.citation.region":`본문에서 참조한 출처 인용`,"brain.citation.announce.open":`{num}번 출처를 열었습니다: {title}`,"brain.citation.announce.close":`출처 미리보기를 닫았습니다.`,"brain.citation.count":`이 답변은 {count}개의 출처를 인용합니다.`,"brain.citation.score":`관련도 {score}%`,"brain.memory.empty.kicker":`첫 기억`,"brain.memory.empty":`기억이 조용합니다.`,"brain.knowledge.empty":`지식이 형성되는 중입니다.`,"brain.graph.empty":`아직 맞는 지식이 없습니다.`,"brain.graph.summaryFallback":`이 개념은 가장 깊은 지식 계층의 일부입니다.`,"brain.graph.focused":`대화와 문서에서 함께 나온 내용이 선으로 이어집니다.`,"brain.graph.emptyFocus":`대화, 문서, 프로젝트를 쌓으면 Brain 그래프가 자랍니다.`,"brain.graph.search":`검색`,"brain.graph.searchAria":`지식 그래프 검색`,"brain.graph.control.panel":`그래프 탐색 컨트롤`,"brain.graph.control.filter":`필터`,"brain.graph.control.types":`엔티티 타입`,"brain.graph.control.allTypes":`전체 타입`,"brain.graph.control.time":`시간 탐색`,"brain.graph.control.dateRange":`최근 추가 강조 범위`,"brain.graph.control.resetFilters":`필터 초기화`,"brain.graph.control.recentWindow":`최근 {days}일`,"brain.graph.control.allTime":`전체 기간`,"brain.graph.control.toggleType":`{type} 타입 표시 전환`,"brain.graph.search.typeahead":`검색 추천`,"brain.graph.search.typeaheadAria":`검색 추천 결과`,"brain.graph.search.noMatches":`일치하는 노드가 없습니다.`,"brain.graph.search.matchCount":`{count}개 일치`,"brain.graph.focus.neighbors":`이웃 {count}개 강조`,"brain.graph.focus.smooth":`선택한 노드로 부드럽게 포커스 이동하고 이웃을 강조합니다.`,"brain.graph.focus.recent":`최근 추가됨`,"brain.graph.focus.clear":`포커스 해제`,"brain.rings.aria":`Brain 기억 깊이 링`,"brain.rings.1":`지금`,"brain.rings.2":`기억`,"brain.rings.3":`주제`,"brain.rings.4":`관계`,"brain.rings.5":`그래프`,"care.title":`내 Brain 돌보기`,"care.subtitle":`내 컴퓨터에 두고, 필요하면 옮길 수 있습니다.`,"care.private":`개인 보관`,"care.ownershipModel":`소유 모델`,"care.export":`내보내기`,"care.export.detail":`다른 곳으로 가져가기`,"care.backup":`백업`,"care.backup.detail":`복사본 저장`,"care.backup.count":`백업 {count}개`,"care.backup.ready":`백업 준비됨`,"care.archive":`보관 파일`,"care.archive.detail":`암호화된 Brain`,"care.path.placeholder":`확인하거나 미리 볼 보관 파일 경로`,"care.path.label":`Brain 보관 파일 경로`,"care.passphrase.placeholder":`보관 파일 비밀번호`,"care.passphrase.label":`Brain 보관 파일 비밀번호`,"care.passphrase.confirmPlaceholder":`비밀번호 다시 입력`,"care.passphrase.confirmLabel":`Brain 보관 파일 비밀번호 확인`,"care.passphrase.tooShort":`비밀번호는 12자 이상이어야 합니다.`,"care.passphrase.tooSimple":`대문자, 소문자, 숫자, 기호 중 3종류 이상을 섞어 주세요.`,"care.passphrase.mismatch":`비밀번호 확인이 일치하지 않습니다.`,"care.passphrase.strong":`비밀번호 강도가 충분합니다.`,"care.path.ready":`보관 파일 경로 형식이 올바릅니다.`,"care.path.invalidChars":`보관 파일 경로에 사용할 수 없는 문자가 있습니다.`,"care.path.extension":`.latticebrain, .zip, .json 파일만 확인할 수 있습니다.`,"care.inspect":`확인`,"care.restorePreview":`복원 미리보기`,"care.note":`복원 미리보기는 Brain을 바꾸지 않고 보관 파일만 확인합니다. 실제 복원은 설정에서 확정합니다.`,"care.working":`진행 중`,"care.result.error":`Brain 관리 작업을 완료하지 못했습니다.`,"care.result.completed":`Brain 관리 작업 완료`,"care.result.path":`파일: {path}`,"care.result.contents":`기억 {memories}개 · 연결 {links}개 · 대화 {conversations}개`,"care.result.dryRun":`미리보기만 실행되어 현재 Brain은 바뀌지 않았습니다.`,"intelligence.title":`Brain 지능 진단`,"intelligence.subtitle":`Brain이 스스로 지식 상태를 점검합니다.`,"intelligence.loading":`진단 중...`,"intelligence.unavailable":`진단 정보를 불러오지 못했습니다.`,"intelligence.score":`종합 점수`,"intelligence.grade.excellent":`아주 좋음`,"intelligence.grade.good":`좋음`,"intelligence.grade.attention":`관심 필요`,"intelligence.grade.critical":`정리 필요`,"intelligence.grade.unknown":`데이터 없음`,"intelligence.dim.freshness":`신선도`,"intelligence.dim.connectivity":`연결성`,"intelligence.dim.embedding_coverage":`검색 준비`,"intelligence.dim.consistency":`일관성`,"intelligence.actions":`추천 관리 작업`,"intelligence.action.rebuild_vector_index":`의미 검색 색인 다시 만들기`,"intelligence.action.review_orphans":`연결 없는 기억 살펴보기`,"intelligence.action.refresh_stale_knowledge":`오래된 지식 다시 확인하기`,"intelligence.action.resolve_contradictions":`서로 어긋나는 기억 정리하기`,"intelligence.insights":`최근 활동`,"intelligence.insights.recent":`최근 7일 새 지식 {count}개`,"intelligence.insights.stale":`오래된 지식 {count}개`,"intelligence.insights.orphans":`연결 없는 지식 {count}개`,"intelligence.contradictions":`어긋나는 기억 {count}건`,"intelligence.consolidate":`중복 정리 미리보기`,"intelligence.consolidate.working":`확인 중...`,"intelligence.consolidate.none":`중복된 기억이 없습니다.`,"intelligence.consolidate.found":`중복 기억 {memories}개 · 중복 연결 {edges}개 발견`,"intelligence.consolidate.apply":`중복 기억 정리 실행`,"intelligence.consolidate.applied":`중복 기억 {count}개를 정리했습니다.`,"brain.answerProof.citationsLabel":`근거 출처 {count}개`,"brain.answerProof.marker":`출처 {index}로 이동`,"brain.answerProof.markerShort":`출처 {index}`,"brain.answerProof.citationItem":`출처 {index}: {title}`,"brain.answerProof.modelLine":`{model} 기준 답변 근거`,"brain.answerProof.why.aria":`이 근거를 고른 이유`,"brain.answerProof.matched":`일치한 단어`,"brain.answerProof.matched.none":`저장된 기억에서 직접 찾음`,"brain.answerProof.confidence.high":`일치 강함`,"brain.answerProof.confidence.medium":`일치 보통`,"brain.answerProof.confidence.low":`일치 약함`,"brain.garden.title":`내 지식 정원`,"brain.garden.loading":`정원을 둘러보는 중…`,"brain.garden.unavailable":`아직 정원을 볼 수 없어요. 자료를 조금 더 모아 보세요.`,"brain.garden.bed.recent":`최근 들어온 것`,"brain.garden.bed.contradictions":`서로 어긋나는 것`,"brain.garden.bed.stale":`오래된 것`,"brain.garden.bed.frequent":`자주 쓰는 것`,"brain.garden.empty.recent":`최근에 새로 들어온 자료가 없어요.`,"brain.garden.empty.contradictions":`지금은 어긋나는 내용이 없어요.`,"brain.garden.empty.stale":`오래 방치된 자료가 없어요.`,"brain.garden.empty.frequent":`아직 자주 연결되는 주제가 없어요.`,"brain.evidenceActions.open":`이 근거로 바로 만들기`,"brain.evidenceActions.title":`이 근거로 만들 수 있는 것`,"brain.evidenceActions.loading":`만들 수 있는 것을 찾는 중…`,"brain.evidenceActions.unavailable":`이 답변의 출처로는 바로 만들 수 있는 게 없습니다.`,"brain.rings.peek.aria":`{label} 미리 보기 · {count}개`,"brain.rings.peek.title":`{label} 미리 보기`,"brain.rings.peek.summary":`{count}개의 연결이 이 층에 있습니다.`,"brain.rings.count":`{count}개`,"brain.rings.close":`미리 보기 닫기`,"brain.rings.deeper":`이 층 자세히 보기`,"brain.rings.empty.now":`아직 최근 대화 기억이 없어요. 지금 말을 걸어보세요.`,"brain.rings.empty.memories":`아직 오래 남는 기억이 없어요. 문서나 메모를 넣어주세요.`,"brain.rings.empty.topics":`주제는 기억이 쌓이면 스스로 생겨납니다.`,"brain.rings.empty.graph":`연결이 생기면 전체 그래프가 열립니다.`,"brain.home.wakingHint":`Brain이 막 깨어났어요. 아무 말이나 걸거나 문서 하나를 넣어주면 첫 기억이 생깁니다.`,"brain.firstFive.title":`첫 5분`,"brain.firstFive.aria":`처음 5분 안내`,"brain.firstFive.subtitle":`세 가지만 해보면 Brain이 무엇을 해주는지 바로 느낄 수 있어요.`,"brain.firstFive.progress":`{done}/{total} 완료`,"brain.firstFive.dismiss":`이 안내 닫기`,"brain.firstFive.step.ask":`Brain에게 첫 질문하기`,"brain.firstFive.step.ask.detail":`추천 질문을 입력창에 채워 드려요. 보내기만 누르면 됩니다.`,"brain.firstFive.step.add":`자료 하나 넣어보기`,"brain.firstFive.step.add.detail":`파일, 메모, 웹 주소 무엇이든 좋아요. 실제로 들어가는 순간 완료돼요.`,"brain.firstFive.step.learned":`Brain이 배운 것 확인하기`,"brain.firstFive.step.learned.detail":`방금 넣은 내용이 어떻게 정리됐는지 보여드려요.`,"brain.firstFive.step.done":`완료`,"brain.approval.aria":`에이전트 실행 승인`,"brain.approval.title":`실행 전에 승인이 필요해요`,"brain.approval.summaryLabel":`계획 요약`,"brain.approval.expiry":`{time}까지 결정하지 않으면 만료돼요.`,"brain.approval.approve":`승인하고 실행`,"brain.approval.edit":`수정해서 실행`,"brain.approval.cancel":`취소`,"brain.approval.running":`실행 중...`,"brain.approval.edit.label":`계획 수정 (JSON)`,"brain.approval.edit.run":`이 계획으로 실행`,"brain.approval.edit.close":`수정 닫기`,"brain.approval.edit.invalid":`계획 JSON을 해석할 수 없어요. 형식을 확인해 주세요.`,"brain.approval.resolved":`승인 후 실행을 마쳤어요.`,"brain.approval.cancelled":`계획을 취소했어요. 실행된 작업은 없습니다.`,"brain.approval.expired":`승인 시간이 만료되었습니다 — 다시 요청해주세요.`,"brain.approval.error":`승인 처리에 실패했어요: {reason}`,"brain.grounding.supported":`근거 있음`,"brain.grounding.none":`근거 없음`,"brain.fvl.title":`30초 체험`,"brain.fvl.aria":`30초 체험 안내`,"brain.fvl.dismiss":`이 안내 닫기`,"brain.fvl.subtitle":`샘플 자료 3개를 넣고 바로 질문해서, Brain이 기억으로 답하는 걸 확인해 보세요.`,"brain.fvl.start":`샘플 자료 3개 넣어보기`,"brain.fvl.starting":`넣는 중...`,"brain.fvl.installed":`샘플 자료 {count}개가 Brain에 들어갔어요.`,"brain.fvl.docs.aria":`데모 문서 목록`,"brain.fvl.doc.duplicate":`이미 있음`,"brain.fvl.ask.title":`이제 이렇게 물어보세요`,"brain.fvl.chips.aria":`추천 질문`,"brain.fvl.next.title":`다음 단계`,"brain.fvl.filegen.chip":`이 내용으로 HTML 페이지 만들어보기`,"brain.fvl.filegen.prompt":`방금 대화한 새싹 가든 프로젝트 내용을 간단한 HTML 소개 페이지로 만들어서 파일로 저장해줘.`,"brain.fvl.done":`체험 완료! 이제 진짜 자료를 넣어보세요.`,"brain.fvl.remove":`데모 데이터 지우기`,"brain.fvl.removing":`지우는 중...`,"brain.fvl.error":`실패했어요: {reason}`,"brain.fvl.connectCta":`내 폴더 연결하기`,"brain.fvl.cleanupCta":`샘플 정리하기`,"brain.steps.aria":`에이전트 실행 단계`,"brain.steps.live":`{count}단계 진행 중`,"brain.steps.summary":`{count}단계 실행됨`,"brain.steps.planned":`계획 수립`,"brain.steps.tool":`도구 실행`,"brain.steps.tool.failed":`도구 실행 실패`,"brain.steps.proposed":`변경 제안으로 저장`,"brain.steps.blocked":`정책으로 차단됨`,"brain.steps.parseError":`모델 응답 보정`,"brain.steps.verdict":`검증 결과`,"brain.steps.final":`마무리`,"brain.steps.state":`상태 변경`,"brain.steps.rollback":`변경 되돌림`,"brain.steps.step":`단계`,"brain.sourceModal.aria":`출처 원문: {title}`,"brain.sourceModal.open":`원문 보기`,"brain.sourceModal.openAria":`출처 원문 보기: {title}`,"brain.sourceModal.close":`원문 닫기`,"brain.sourceModal.loading":`원문을 불러오는 중…`,"brain.sourceModal.error":`원문을 불러오지 못했어요: {reason}`,"brain.sourceModal.empty":`이 출처에는 저장된 본문이 없어요.`,"brain.sourceModal.provenance":`출처 정보`,"brain.watch.aria":`폴더 감시 상태`,"brain.watch.title":`연결된 폴더 감시`,"brain.watch.notLive":`실시간 아님 — 주기 스캔`,"brain.watch.scan.never":`아직 스캔 전`,"brain.watch.scan.now":`방금 스캔`,"brain.watch.scan.minutes":`{count}분 전 스캔`,"brain.watch.scan.hours":`{count}시간 전 스캔`,"brain.watch.scan.days":`{count}일 전 스캔`,"brain.watch.ingested":`+{count} 반영`,"brain.watch.tracked":`{count}개 파일 추적 중`,"brain.watch.errors":`최근 오류`,"brain.approval.countdown":`남은 시간 {time}`,"brain.approval.countdown.warning":`2분 안에 만료돼요 — 지금 결정해 주세요.`,"brain.approval.expiredReplan":`다시 계획하기`,"brain.approval.pendingNotice":`승인을 기다리는 작업이 있어요: {goal}`,"brain.approval.pendingNotice.generic":`승인을 기다리는 작업이 있어요.`,"brain.approval.pendingNotice.aria":`승인 대기 실행 알림`,"brain.approval.pendingNotice.expiry":`{time}까지 유효해요. 원래 대화의 승인 카드에서 이어가거나, 같은 요청을 다시 보내 주세요.`,"brain.approval.pendingNotice.hint":`원래 대화의 승인 카드에서 이어가거나, 같은 요청을 다시 보내 주세요.`,"brain.files.brainOk":`Brain에 기억됨 ✓`,"brain.files.brainPending":`기억 대기 중`,"brain.files.brainFailed":`기억 실패`,"brain.agent.repairs":`모델 응답을 {count}회 보정했어요`,"brain.agent.explanation.why":`왜 이렇게 끝났는지 요약한 설명입니다.`,"brain.stats.memories":`기억`,"brain.stats.links":`연결`,"brain.stats.memoryKinds":`기억 종류`,"brain.stats.linkKinds":`연결 종류`,"brain.stats.sources":`출처`,"brain.stats.items":`항목`,"brain.stats.bytes":`바이트`,"brain.stats.health":`상태`,"brain.stats.format":`Brain 형식`,"brain.stats.storage":`저장소`,"brain.value.reported":`보고됨`,"brain.graph.nodeStats":`중요도 {importance} · 연결 {links}개`,"brain.memory.recall.title":`기억 다시 찾기`,"brain.memory.recall.detail":`저장된 기억을 검색하고 관리합니다.`,"brain.memory.recall.placeholder":`다시 찾을 기억의 내용...`,"brain.memory.recall.action":`찾기`,"brain.memory.recall.completed":`기억 검색 완료`,"brain.memory.compact":`압축 정리`,"brain.memory.rebuildVector":`벡터 다시 만들기`,"brain.sources.title":`출처와 이력`,"brain.sources.detail":`기억이 어디에서 왔는지 확인합니다.`,"brain.sources.loading":`출처 불러오는 중`,"brain.sources.empty":`아직 출처가 없습니다`,"brain.sources.emptyDetail":`새 기억의 대화, 수동 입력, 문서 또는 가져오기 출처가 여기에 표시됩니다.`,"brain.sources.fallback":`출처 {index}`,"brain.sources.createdUnknown":`생성 시간이 기록되지 않음`,"brain.sources.inspectable":`확인 가능`,"brain.sources.missingProvenance":`출처 이력 없음`,"brain.sources.copy":`출처 복사`,"brain.sources.legacyMissing":`이전 기억에는 출처 경로나 대화가 기록되지 않았습니다. 검색은 가능하지만 출처 이력이 완전하지 않습니다.`,"brain.sources.type.chat":`대화`,"brain.sources.type.document":`문서`,"brain.sources.type.import":`가져오기`,"brain.sources.type.manual":`수동 입력`,"brain.sources.type.unknown":`알 수 없는 출처`,"brain.portability.title":`내보내기와 백업`,"brain.portability.detail":`Brain 데이터를 내보내거나 백업하고 가져옵니다.`,"brain.portability.export":`Brain 내보내기`,"brain.portability.backup":`백업 만들기`,"brain.portability.importPlaceholder":`가져오기 미리보기를 위해 내보낸 Brain 데이터를 붙여넣으세요`,"brain.portability.previewImport":`가져오기 미리보기`,"brain.portability.importCompleted":`가져오기 미리보기 완료`},en:{"brain.level":`Level`,"brain.depth.1":`Now memory`,"brain.depth.2":`Older memory`,"brain.depth.3":`Topics`,"brain.depth.4":`Relationships`,"brain.depth.5":`Full knowledge graph`,"brain.depthTitle.1":`Depth 1: Active Context`,"brain.depthLabel.1":`Living Brain`,"brain.depthLabel.2":`Memory Layer`,"brain.depthLabel.3":`Knowledge Layer`,"brain.depthLabel.4":`Relationship Layer`,"brain.depthLabel.5":`Knowledge Graph`,"brain.view.memories":`Memories`,"brain.view.topics":`Topics`,"brain.view.relationships":`Relationships`,"brain.view.graph":`Graph`,"brain.surface":`Back`,"brain.aria.home":`Lattice Brain`,"brain.aria.exploration":`Brain exploration`,"brain.aria.quickViews":`Brain quick views`,"brain.depthRail.aria":`Brain depth progress`,"brain.aria.conversation":`Conversation`,"brain.aria.ownership":`Brain ownership guarantees`,"brain.aria.actions":`Brain primary actions`,"brain.aria.starterPrompts":`Starter prompts`,"brain.aria.overview":`Brain overview`,"brain.aria.graph":`Knowledge Graph`,"brain.edition":`Production Ready`,"brain.edition.tip":`Lattice AI {version} — a Digital Brain you can understand and use at a glance`,"brain.local":`Local-first`,"brain.portable":`Portable`,"brain.private":`Private`,"brain.admin":`Admin Console`,"brain.command.aria":`Product status and next action`,"brain.command.kicker":`Product command center`,"brain.command.title":`A Brain ready to use now`,"brain.command.score":`Product readiness`,"brain.command.next":`Next action`,"brain.command.next.empty":`Add a first source, then ask immediately.`,"brain.command.next.forming":`Open topics to see how memories are grouping.`,"brain.command.next.alive":`Check the evidence, then switch models whenever you like.`,"brain.command.metrics":`Brain product metrics`,"brain.command.metric.memories":`{count} memories`,"brain.command.metric.topics":`{count} topics`,"brain.command.metric.sources":`{count} healthy sources`,"brain.command.metric.proof":`{count} pieces of evidence`,"brain.command.source.empty":`No ingestion yet`,"brain.command.action.add":`Add source`,"brain.command.action.find":`Inspect topics`,"brain.command.action.find.detail":`See grouped memory structure`,"brain.command.action.proof":`See the evidence`,"brain.command.action.own":`Manage ownership`,"brain.command.action.own.detail":`Backup, restore, settings`,"brain.command.signal.local":`Local-first`,"brain.command.signal.private":`Consent gated`,"brain.command.signal.portable":`Backup ready`,"brain.chatHome.aria":`Brain Chat Home`,"brain.chatHome.contextAria":`Brain status and source panel`,"brain.chatHome.headerLine":`Start with the work in front of you.`,"brain.chatHome.kicker":`Lattice Brain`,"brain.chatHome.title":`What should we work on?`,"brain.chatHome.body":`Ask or add sources. Your Brain remembers, connects, and uses them in later answers.`,"brain.chatHome.utility":`Brain details`,"brain.chatHome.utility.basic":`Sources and Brain settings`,"brain.files.title":`Your file is ready`,"brain.files.download":`Download`,"brain.files.downloading":`Downloading…`,"brain.files.downloadError":`Could not download: {reason}`,"brain.files.hint":`Saved safely in your Lattice workspace folder on this computer.`,"brain.files.repaired":`Auto-repaired — please double-check the content`,"brain.agent.needsReview":`Completion could not be verified — please check the result yourself.`,"brain.agent.failed":`The task could not be completed. Please try again.`,"brain.code.copy":`Copy`,"brain.code.copied":`Copied`,"brain.code.save":`Save as file`,"brain.code.saving":`Saving…`,"brain.code.saveError":`Could not save as a file: {reason}`,"brain.firstScreen.aria":`Brain first screen`,"brain.home.kicker":`Where your memory grows`,"brain.home.insights":`What Brain has organized`,"brain.home.shelf.close":`Close Brain support panel`,"brain.home.insights.detail":`Open memory, connections, and next steps when you need them`,"brain.firstScreen.title":`Talk or add something. Brain connects it.`,"brain.firstScreen.body":`Chats, files, and folders become durable memory, a real knowledge graph, and grounded automation.`,"brain.firstScreen.state.quiet":`Waiting for something to remember`,"brain.firstScreen.state.forming":`Organizing something new`,"brain.firstScreen.state.alive":`Your memory is ready to use`,"brain.firstScreen.readiness":`Brain readiness {score}%`,"brain.firstScreen.memoryAria":`What your Brain remembers and connects`,"brain.firstScreen.memory":`Just remembered`,"brain.firstScreen.memory.empty":`Nothing yet. Add the first thought or document.`,"brain.firstScreen.memory.with":`{title}`,"brain.firstScreen.connection":`Connecting topic`,"brain.firstScreen.concept.empty":`Related topics appear here as sources arrive.`,"brain.firstScreen.concept.with":`{title}`,"brain.firstScreen.next":`Next best step`,"brain.firstScreen.next.source":`Add a document or note and your Brain will start forming memory.`,"brain.firstScreen.next.ask":`Ask the first question and your Brain will answer from what it knows.`,"brain.firstScreen.next.graph":`Open the memory graph to see what your Brain connected.`,"brain.firstScreen.actions":`Primary Brain actions`,"brain.firstScreen.action.talk":`Talk to Brain`,"brain.firstScreen.action.source":`Add sources`,"brain.firstScreen.action.graph":`View graph`,"brain.living.aria":`Your living Brain`,"brain.living.open":`Open Brain's real knowledge graph`,"brain.living.graph":`The center of your knowledge graph`,"brain.living.depth":`Brain depth {depth}`,"brain.living.state.idle":`Keeping your memory`,"brain.living.state.listening":`Listening`,"brain.living.state.thinking":`Thinking with you`,"brain.living.state.recalling":`Recalling memory`,"brain.living.state.synthesizing":`Making connections`,"brain.living.state.planning":`Planning`,"brain.living.state.acting":`Acting`,"brain.living.state.resting":`Waiting with you`,"brain.flow.sources.aria":`Knowledge sources entering Brain`,"brain.flow.sources":`Knowledge coming in`,"brain.flow.vital":`Brain vital signal`,"brain.flow.memory":`The remembering Brain`,"brain.flow.graph":`Real knowledge graph`,"brain.flow.graph.aria":`Knowledge graph with {concepts} real topics and {relationships} relationships`,"brain.flow.graph.empty":`Your first chat or source will create real topics and connections here.`,"brain.flow.graph.empty.short":`Forming the first connection`,"brain.flow.node.aria":`Open {type} topic {label} in the knowledge graph`,"brain.flow.source.empty":`Waiting for the first chat or source`,"brain.flow.status.emerged":`{memories} new memories and {entities} topics entered the real Brain.`,"brain.flow.status.ready":`Keeping memory and connections around {focus} ready.`,"brain.flow.status.empty":`Ask or add a source and Brain will start forming memory and connections.`,"brain.flow.path.aria":`How knowledge becomes memory and automation`,"brain.flow.path.input":`Input`,"brain.flow.path.waiting":`Waiting`,"brain.flow.path.memory":`Memory`,"brain.flow.path.memoryCount":`{count} real memories`,"brain.flow.path.connections":`Connections`,"brain.flow.path.graphCount":`{concepts} topics · {relationships} links`,"brain.flow.path.automation":`Next action`,"brain.flow.path.actionCount":`{count} memory-based suggestions`,"brain.flow.conversation":`This conversation`,"brain.flow.conversation.ready":`Conversation kept in Brain memory`,"brain.flow.relationships":`{count} real relationships`,"brain.automation.kicker":`From memory to action`,"brain.automation.title":`What Brain can do with this memory`,"brain.automation.more":`View all memory-grounded actions`,"brain.automation.close":`Close memory-grounded actions`,"brain.automation.body":`Brain suggests questions, reviews, and Agent work from the current memory focus and its evidence.`,"brain.automation.basedOn":`Suggested from this memory`,"brain.automation.empty":`As memory grows, Brain will suggest evidence-backed automation here.`,"brain.automation.guard":`Suggestions come from memory; execution begins only after you choose one.`,"brain.automation.intent.ask":`Ask from memory`,"brain.automation.intent.delegate":`Run Agent`,"brain.automation.intent.review":`Draft for review`,"brain.automation.intent.route":`Inspect graph`,"brain.brief.aria":`Brain briefing`,"brain.brief.kicker":`At a glance`,"brain.brief.headline.quiet":`Empty, but ready to start`,"brain.brief.headline.forming":`New memory is forming into topics`,"brain.brief.headline.alive":`There is memory worth using now`,"brain.brief.body.quiet":`Add a source or ask a question; this space will show what your Brain just learned and what to do next.`,"brain.brief.body.forming":`Your Brain is connecting memory around {focus}.`,"brain.brief.body.alive":`Ask about {focus} now, or open the graph to inspect the links.`,"brain.brief.focus":`Focus now`,"brain.brief.focus.empty":`No first memory yet`,"brain.brief.focus.empty.detail":`Start with a document, note, web page, or question.`,"brain.brief.evidence.aria":`Brain brief evidence`,"brain.brief.evidence.durable":`saved`,"brain.brief.evidence.durable.detail":`Memories kept on your computer that stay even if you change models`,"brain.brief.evidence.graph":`topics`,"brain.brief.evidence.graph.detail":`Topics visible in the Knowledge Graph`,"brain.brief.evidence.sources":`sources`,"brain.brief.evidence.sources.detail":`Available memory tiers`,"brain.brief.actions":`Brain brief next actions`,"brain.brief.action.add":`Add source`,"brain.brief.action.add.detail":`Files, folders, notes, web`,"brain.brief.action.ask":`Ask now`,"brain.brief.action.ask.detail":`Jump to the composer`,"brain.brief.action.topics":`Inspect links`,"brain.brief.action.topics.detail":`Open connected topics`,"brain.brief.action.verify":`Verify proof`,"brain.brief.action.verify.detail":`See what stays even if you change models`,"brain.brief.action.backup":`Manage backup`,"brain.brief.action.backup.detail":`Export and keep your Brain`,"brain.suggestions.aria":`Brain suggested questions`,"brain.suggestions.title":`Try one of these`,"brain.proactive.aria":`Brain suggested actions`,"brain.proactive.title":`Brain suggests doing next`,"brain.proactive.addSource.label":`Add a source`,"brain.proactive.addSource.detail":`Give Brain something useful to remember`,"brain.proactive.seed.label":`Seed memory`,"brain.proactive.seed.detail":`Talk through what Brain should remember`,"brain.proactive.evidence.label":`Review evidence`,"brain.proactive.evidence.detail":`Split facts, weak signals, and risks`,"brain.proactive.delegate.label":`Delegate to Agent`,"brain.proactive.delegate.detail":`Turn the current focus into an execution plan`,"brain.proactive.review.label":`Save review task`,"brain.proactive.review.detail":`Create a Review Center draft for approval`,"brain.proactive.map.label":`Open connection map`,"brain.proactive.map.detail":`Inspect related graph topics`,"brain.proactive.weekly.label":`Weekly Brain review`,"brain.proactive.weekly.detail":`Draft changes, decisions, and delegation candidates`,"brain.proactive.trail.aria":`Brain suggested action activity`,"brain.proactive.trail.title":`Recent action trail`,"brain.proactive.status.running":`Running`,"brain.proactive.status.completed":`Completed`,"brain.proactive.status.failed":`Failed`,"brain.proactive.intent.ask":`Brain ask`,"brain.proactive.intent.delegate":`Agent delegation`,"brain.proactive.intent.review":`Review draft`,"brain.proactive.intent.route":`Navigation`,"brain.suggestion.start.label":`Start guide`,"brain.suggestion.start.detail":`Suggest first sources and questions`,"brain.suggestion.start.prompt":`Recommend the best sources and first questions to start my Brain.`,"brain.suggestion.context.label":`Prepare context`,"brain.suggestion.context.detail":`Prioritize what to add next`,"brain.suggestion.context.prompt":`Prioritize the documents, notes, and webpages that would be most useful to add to my Brain now.`,"brain.suggestion.focus.label":`Focus brief`,"brain.suggestion.focus.detail":`Turn current memory into next actions`,"brain.suggestion.focus.prompt":`Using {focus}, summarize the key decisions I should check now and the next actions.`,"brain.suggestion.evidence.label":`Check evidence`,"brain.suggestion.evidence.detail":`Answer from remembered proof`,"brain.suggestion.evidence.prompt":`Answer about {focus} using citations from the evidence my Brain has.`,"brain.suggestion.graph.label":`Explore links`,"brain.suggestion.graph.detail":`Inspect related graph topics`,"brain.suggestion.graph.prompt":`Explain the topics connected to {focus} with supporting evidence.`,"brain.suggestion.history.label":`Follow-ups`,"brain.suggestion.history.detail":`Find work hidden in recent chats`,"brain.suggestion.history.prompt":`Find the follow-up work I may have missed in recent conversations related to {focus}.`,"brain.tab.conversation":`Chat`,"brain.tab.memory":`My sources`,"brain.tab.knowledge":`Search`,"brain.tab.relationships":`Relationships`,"brain.tab.graph":`Connections`,"brain.tab.portability":`Care`,"brain.headline.conversation":`Talk to your Brain.`,"brain.headline.memory":`Review saved memories and their sources.`,"brain.headline.knowledge":`Find something in your memory.`,"brain.headline.relationships":`Relationships, when you need the why.`,"brain.headline.graph":`Explore how your memories connect.`,"brain.headline.portability":`Care for the Brain.`,"brain.search.title":`Search memory`,"brain.search.detail":`Find what you need across conversations and added sources.`,"brain.search.placeholder":`Search people, documents, or topics`,"brain.search.cta":`Search`,"brain.search.results":`Results`,"brain.group.knowledge":`Knowledge`,"brain.group.source":`Sources`,"brain.group.activity":`Activity`,"brain.group.memory":`Memory`,"brain.group.people":`People`,"brain.group.system":`System`,"brain.group.other":`Other`,"graph.search.basic":`Search ideas, files, people, and notes…`,"graph.search.advanced":`Search graph labels, types, provenance…`,"graph.group.all":`All groups`,"graph.labels.important":`Important labels`,"graph.labels.all":`All labels`,"graph.labels.off":`Hide labels`,"graph.fit":`Fit`,"graph.canvas.aria":`Knowledge graph canvas — use the arrow keys to move between items and Enter to open one`,"graph.deep.title":`Connection map`,"graph.deep.summary":`Showing {nodes} ideas and {edges} connections out of {total} saved items.`,"graph.filtered":`{count} hidden`,"graph.allInView":`all in view`,"graph.importance":`Importance`,"graph.clearFocus":`Clear selection`,"graph.searchAll":`Search all memories`,"graph.collapsed":`collapsed`,"graph.focus.title":`Details`,"graph.focus.desc":`Click any item to see why it matters.`,"graph.importanceBadge":`{n} importance`,"graph.source.none":`No source recorded`,"graph.created.none":`No saved time recorded`,"graph.copySource":`Copy source`,"graph.collapsedGroup":`Collapsed group`,"graph.expandGroup":`Expand group`,"graph.nothingSelected.title":`Nothing selected yet`,"graph.nothingSelected.detail":`Click an item or group in the graph.`,"graph.empty.title":`No connected memories yet`,"graph.empty.detail":`Add a document, note, or folder and Lattice builds connected memories with sources.`,"graph.important.title":`Important items`,"graph.important.desc":`What's most connected right now.`,"graph.advanced.title":`Explore relationships`,"graph.advanced.desc.basic":`Open this when you want to see how things connect.`,"graph.advanced.desc.other":`Explore relationships, sources, and graph structure.`,"graph.minImportance.aria":`Minimum relationship importance`,"graph.coverage":`Source coverage`,"brain.action.add":`Add`,"brain.action.find":`Find`,"brain.action.model":`Model`,"brain.action.settings":`Settings`,"brain.empty.kicker":`Try one`,"brain.empty.title":`Pick a starter or write your own.`,"brain.empty.body":`Use the Document button when you want to add a file.`,"brain.empty.trail.label":`First Brain flow`,"brain.empty.trail.save":`1. Save first memory`,"brain.empty.trail.recall":`2. See it in Brain Home`,"brain.empty.trail.backup":`3. Own it with backup`,"brain.home.line":`The center of your local knowledge, clearer with every conversation`,"brain.prompt.remember":`Find the important decisions in my sources`,"brain.prompt.know":`Summarize the key points in this document`,"brain.prompt.plan":`Prioritize what I should do next`,"brain.placeholder":`Ask a question, paste a source, or describe a task`,"brain.composer.attachments":`Attach sources`,"brain.composer.hint":`Enter to send · Shift+Enter for a new line`,"brain.upload.cta":`Add file or document`,"brain.upload.ctaShort":`Document`,"brain.upload.uploading":`Adding...`,"brain.upload.hint":`After upload, it reappears as real memory and graph context.`,"brain.upload.pending":`Adding {name} to Brain.`,"brain.upload.saved":`{name} was saved to Brain.`,"brain.upload.failed":`Could not add the document: {reason}`,"brain.ingest.aria":`Add to Brain`,"brain.ingest.kicker":`Teach your Brain`,"brain.ingest.title":`Choose something on your computer and watch it enter memory and the graph.`,"brain.ingest.dock.title":`Files · folders · notes · web`,"brain.ingest.dock.close":`Close source input`,"brain.ingest.type.chat":`Chat`,"brain.ingest.file":`Add file`,"brain.ingest.file.detail":`PDFs, docs, tables, notes`,"brain.ingest.folder":`Add folder`,"brain.ingest.folder.placeholder":`Local folder path`,"brain.ingest.note":`Add note`,"brain.ingest.note.placeholder":`Paste a decision or context`,"brain.ingest.web":`Add web`,"brain.ingest.web.placeholder":`https://...`,"brain.ingest.folder.pending":`Connecting {path} to Brain.`,"brain.ingest.folder.saved":`{path} is connected to Brain.`,"brain.ingest.folder.failed":`Could not add the folder: {reason}`,"brain.ingest.note.pending":`Saving note to Brain.`,"brain.ingest.note.saved":`Note was saved to Brain.`,"brain.ingest.note.failed":`Could not add the note: {reason}`,"brain.ingest.web.pending":`Reading {url} into Brain.`,"brain.ingest.web.saved":`{url} was saved to Brain.`,"brain.ingest.web.failed":`Could not add the web page: {reason}`,"brain.ingest.type.file":`File`,"brain.ingest.type.folder":`Folder`,"brain.ingest.type.note":`Note`,"brain.ingest.type.web":`Web`,"brain.ingest.cta.file":`Pick a file to add now`,"brain.ingest.cta.folder":`Enter a path and press Enter`,"brain.ingest.cta.note":`Paste content and press Enter`,"brain.ingest.cta.web":`Enter a URL and press Enter`,"brain.ingest.active":`Processing {label}`,"brain.ingest.progress.aria":`Ingestion progress for {label}`,"brain.ingest.stage.preparing":`Preparing`,"brain.ingest.stage.parsing":`Parsing`,"brain.ingest.stage.embedding":`Embedding`,"brain.ingest.stage.indexing":`Indexing`,"brain.ingest.stage.complete":`Memorized`,"brain.ingest.stage.error":`Failed`,"brain.ingest.stage.error.hint":`It did not enter Brain`,"brain.ingest.stage.preparing.hint":`Reading the source`,"brain.ingest.stage.parsing.hint":`Extracting text and structure`,"brain.ingest.stage.embedding.hint":`Turning into semantic vectors`,"brain.ingest.stage.indexing.hint":`Linking into the knowledge graph`,"brain.ingest.stage.complete.hint":`It is now part of your knowledge`,"brain.ingest.result":`{memories} new memories · {entities} new entities`,"brain.ingest.result.empty":`Merged into existing knowledge`,"brain.ingest.quality.low":`This source was hard to read. Some content may be missing or inaccurate.`,"brain.freshness.pending":`Some knowledge is still waiting for indexing ({count} items). It will reach answers shortly.`,"brain.freshness.staleEmbedder":`The embedding model changed`,"brain.freshness.staleEmbedder.detail":`Part of the index was built with the previous model, so recall may be weaker. Re-indexing fixes it.`,"brain.freshness.reindex":`Re-index now`,"brain.freshness.reindex.running":`Re-indexing…`,"brain.freshness.reindex.failed":`Re-indexing failed. Please try again shortly.`,"brain.contextQuality.limited":`This answer was produced with limited graph-backed context.`,"brain.contextQuality.reason":`Reason: {reason}`,"brain.jobs.aria":`Background ingestion jobs`,"brain.jobs.title":`Organizing your sources`,"brain.jobs.progress":`{processed}/{total} processed`,"brain.jobs.progressAria":`Ingestion progress: {processed} of {total} processed`,"brain.jobs.failedCount":`{count} failed`,"brain.jobs.resume":`Resume`,"brain.jobs.resuming":`Resuming…`,"brain.jobs.status.queued":`Queued`,"brain.jobs.status.running":`Running`,"brain.jobs.status.completed":`Completed`,"brain.jobs.status.failed":`Failed`,"brain.jobs.status.partial":`Partially completed`,"brain.jobs.report.title":`Folder ingest complete`,"brain.jobs.report.titlePartial":`Folder ingest partially complete`,"brain.jobs.report.documents":`+{count} documents`,"brain.jobs.report.vector":`vector index {percent}% fresh`,"brain.jobs.report.skipped":`Skipped or failed files`,"brain.jobs.report.dismiss":`Dismiss ingest report`,"brain.preview.open":`Preview`,"brain.preview.close":`Close preview`,"brain.preview.aria":`File preview: {name}`,"brain.preview.loading":`Loading preview…`,"brain.preview.error":`Could not load the preview: {reason}`,"brain.preview.sandboxNote":`Safe preview — scripts and external connections never run.`,"brain.dnd.title":`Drop to add to your Brain`,"brain.dnd.detail":`Dropped files are organized into memories right away.`,"brain.timeline.aria":`Recent memory emergence timeline`,"brain.timeline.emergenceTitle":`Knowledge that just emerged`,"brain.timeline.recent":`Recent ingestion`,"brain.timeline.newMemories":`{count} new memories`,"brain.timeline.newEntities":`{count} new entities`,"brain.timeline.at":`{time}`,"brain.timeline.justNow":`just now`,"brain.timeline.minutesAgo":`{count}m ago`,"brain.timeline.empty":`No ingestion yet. Add anything above to begin.`,"brain.image":`Image`,"brain.unavailable":`Temporarily unavailable`,"brain.noModel.message":`No model is loaded yet. Open Models, prepare a local model, then send the message again.`,"brain.noModel.status":`Load a model before starting chat.`,"brain.noModel.banner":`Your Brain's voice (a model) isn't ready yet. Prepare one to start talking.`,"brain.noModel.cta":`Prepare a model`,"brain.newChat":`New chat`,"brain.stop":`Stop`,"brain.stopped":`Stopped generating the response.`,"brain.stopped.empty":`(Response stopped)`,"brain.history.title":`Past conversations`,"brain.history.hint":`Recent conversations your Brain remembers. Click one to continue.`,"brain.history.aria":`Past conversation list`,"brain.history.messages":`{count} messages`,"brain.history.resumeAria":`Resume conversation: {title}`,"brain.history.deleteAria":`Delete conversation: {title}`,"brain.history.deleteConfirm":`Press again to delete`,"brain.history.deleted":`Conversation deleted.`,"brain.history.deleteFailed":`Could not delete the conversation: {reason}`,"brain.history.loading":`Loading conversation...`,"brain.history.loadFailed":`Could not load the conversation: {reason}`,"brain.history.emptyConversation":`No saved messages`,"brain.history.resumed":`Continuing your past conversation. Pick up where you left off.`,"brain.history.showMore":`Show more ({count})`,"brain.history.showLess":`Show less`,"brain.message.copy":`Copy`,"brain.message.copied":`Copied`,"brain.message.copyAria":`Copy the whole response`,"brain.message.regenerate":`Regenerate`,"brain.message.regenerateAria":`Answer the last question again`,"brain.message.saveTask":`Save task`,"brain.message.saveTaskAria":`Save this answer as a review inbox task draft`,"brain.message.followup.aria":`Answer follow-up questions`,"brain.message.followup.checklist":`Checklist`,"brain.message.followup.checklist.prompt":`Turn your previous answer into an actionable checklist.`,"brain.message.followup.evidence":`Evidence / uncertainty`,"brain.message.followup.evidence.prompt":`Separate the evidence in your previous answer from the parts that are still uncertain.`,"brain.message.followup.next":`Next 3`,"brain.message.followup.next.prompt":`Prioritize the next 3 things I should do based on your previous answer.`,"brain.imageAttached":`Image attached`,"brain.send":`Send`,"brain.saved":`Saved to memory · {topics} linked topics · {memories} related memories`,"brain.saved.detail":`Available later with source-aware recall.`,"brain.action.defaultTitle":`Brain answer follow-up`,"brain.action.saved":`Task draft saved to Review Center`,"brain.action.saveFailed":`Could not save the task draft: {reason}`,"brain.delegate.title":`Agent team`,"brain.delegate.detail":`Delegate the current draft as a goal and keep the result in Brain.`,"brain.delegate.cta":`Delegate`,"brain.delegate.running":`Delegating...`,"brain.delegate.saved":`Brain updated`,"brain.delegate.done":`Agent result synthesized into Brain memory.`,"brain.delegate.failed":`Agent delegation failed: {reason}`,"brain.recalled":`Recalled this memory: {title}`,"brain.overview.kicker":`Brain at a glance`,"brain.overview.title":`See memories and topics immediately.`,"brain.overview.graph":`Full graph`,"brain.overview.agent":`Agent outcomes`,"brain.overview.agentEmpty":`Delegated outcomes will stand out here.`,"brain.overview.recent":`Recent memories`,"brain.overview.recentEmpty":`No recent memories yet.`,"brain.overview.older":`Earlier memories`,"brain.overview.olderEmpty":`Earlier memories appear as conversations accumulate.`,"brain.overview.topics":`Main topics`,"brain.overview.topicsEmpty":`Topics are still forming.`,"brain.readiness.kicker":`Brain readiness`,"brain.readiness.aria":`Brain readiness score`,"brain.readiness.quiet":`Waiting for the first memory.`,"brain.readiness.forming":`Memories are becoming topics.`,"brain.readiness.alive":`Memories and relationships are connected.`,"brain.readiness.start":`View first memory`,"brain.readiness.grow":`Grow topics`,"brain.readiness.map":`Open map`,"brain.proof.aria":`Brain proof`,"brain.proof.context":`Recallable context`,"brain.proof.contextValue":`{count} saved`,"brain.proof.contextEmpty":`Waiting for first memory`,"brain.proof.model":`Survives model switches`,"brain.proof.noModel":`No model loaded`,"brain.proof.modelPending":`Proven after saving`,"brain.proof.store":`Knowledge store`,"brain.proof.storeValue":`{topics} topics · {vectors} memory pieces`,"brain.proof.recall":`Just recalled by Brain`,"brain.proof.recallEmpty.kicker":`Brain proof slot`,"brain.proof.recallEmpty.title":`After your first exchange, recalled memory appears here.`,"brain.proof.recallEmpty.detail":`No saved memory yet — Lattice waits for real memory instead of inventing a placeholder example.`,"brain.proof.recallPending":`Saved — getting ready to bring it back.`,"brain.proof.recallPending.detail":`When indexing finishes, this slot shows the actual memory Brain can bring back.`,"brain.modelDemo.aria":`Model switch proof`,"brain.modelDemo.kicker":`Model-independent Brain`,"brain.modelDemo.proven":`This memory lives outside the model.`,"brain.modelDemo.pending":`After the first memory is saved, model-switch proof appears.`,"brain.modelDemo.detail":`Current model: {model}. Recheck the same question against Brain evidence.`,"brain.modelDemo.verify":`Recheck same evidence`,"brain.modelDemo.change":`Switch model`,"brain.modelDemo.needQuestion":`Ask a question or add memory first, then recheck the same evidence.`,"brain.modelDemo.checking":`Rechecking the same Brain evidence with {model}.`,"brain.modelDemo.done":`The same Brain evidence is visible with {model}.`,"brain.proof.unavailable":`Brain evidence could not be verified: {reason}`,"brain.answerProof.aria":`Answer sources and memory proof`,"brain.answerProof.title":`Evidence and sources`,"brain.answerProof.modelProven":`Brain evidence outside {model}`,"brain.answerProof.modelPending":`{model} response · evidence pending`,"brain.answerProof.empty":`No linked source yet. Indexed memory appears here.`,"brain.citation.chip":`Source {num}`,"brain.citation.chip.long":`Source {num}: {title}`,"brain.citation.expand":`Expand source`,"brain.citation.close":`Close source`,"brain.citation.preview.from":`From: `,"brain.citation.preview.snippet":`Excerpt: `,"brain.citation.keyboard.tip":`Press Space or Enter to expand a source, Escape to close.`,"brain.citation.region":`Source citations referenced in the answer`,"brain.citation.announce.open":`Opened source {num}: {title}`,"brain.citation.announce.close":`Closed source preview.`,"brain.citation.count":`This answer cites {count} source(s).`,"brain.citation.score":`Relevance {score}%`,"brain.memory.empty.kicker":`First memory`,"brain.memory.empty":`Memory is quiet`,"brain.knowledge.empty":`Knowledge is forming`,"brain.graph.empty":`No matching knowledge yet`,"brain.graph.summaryFallback":`This concept is part of the deepest knowledge layer.`,"brain.graph.focused":`Ideas that appeared together in conversations and documents are connected by lines.`,"brain.graph.emptyFocus":`Your Brain graph grows as you add conversations, documents, and projects.`,"brain.graph.search":`Search`,"brain.graph.searchAria":`Search knowledge graph`,"brain.graph.control.panel":`Graph exploration controls`,"brain.graph.control.filter":`Filter`,"brain.graph.control.types":`Entity types`,"brain.graph.control.allTypes":`All types`,"brain.graph.control.time":`Time exploration`,"brain.graph.control.dateRange":`Recently added window`,"brain.graph.control.resetFilters":`Reset filters`,"brain.graph.control.recentWindow":`Last {days} days`,"brain.graph.control.allTime":`All time`,"brain.graph.control.toggleType":`Toggle {type} type`,"brain.graph.search.typeahead":`Search suggestions`,"brain.graph.search.typeaheadAria":`Search suggestion results`,"brain.graph.search.noMatches":`No matching nodes`,"brain.graph.search.matchCount":`{count} matches`,"brain.graph.focus.neighbors":`{count} neighbors highlighted`,"brain.graph.focus.smooth":`Smoothly focuses the selected node and highlights its neighbors.`,"brain.graph.focus.recent":`Recently added`,"brain.graph.focus.clear":`Clear focus`,"brain.rings.aria":`Brain memory depth rings`,"brain.rings.1":`Now`,"brain.rings.2":`Memory`,"brain.rings.3":`Topics`,"brain.rings.4":`Relations`,"brain.rings.5":`Graph`,"care.title":`Care for my Brain`,"care.subtitle":`Own it locally. Keep it portable.`,"care.private":`Private`,"care.ownershipModel":`Ownership model`,"care.export":`Export`,"care.export.detail":`Take it with you`,"care.backup":`Backup`,"care.backup.detail":`Save a copy`,"care.backup.count":`{count} backups`,"care.backup.ready":`Backups ready`,"care.archive":`Archive`,"care.archive.detail":`Encrypted Brain`,"care.path.placeholder":`Paste an archive path to inspect or preview`,"care.path.label":`Brain archive path`,"care.passphrase.placeholder":`Archive passphrase`,"care.passphrase.label":`Brain archive passphrase`,"care.passphrase.confirmPlaceholder":`Repeat passphrase`,"care.passphrase.confirmLabel":`Confirm Brain archive passphrase`,"care.passphrase.tooShort":`Use at least 12 characters.`,"care.passphrase.tooSimple":`Mix at least three of uppercase, lowercase, numbers, and symbols.`,"care.passphrase.mismatch":`Passphrases do not match.`,"care.passphrase.strong":`Passphrase strength is sufficient.`,"care.path.ready":`Archive path format looks valid.`,"care.path.invalidChars":`Archive path contains unsupported characters.`,"care.path.extension":`Use a .latticebrain, .zip, or .json archive.`,"care.inspect":`Inspect`,"care.restorePreview":`Restore preview`,"care.note":`Restore preview checks an archive without changing your Brain. Confirmed restore stays in Settings.`,"care.working":`Working`,"care.result.error":`Brain care action could not complete.`,"care.result.completed":`Brain care action completed.`,"care.result.path":`File: {path}`,"care.result.contents":`{memories} memories · {links} links · {conversations} conversations`,"care.result.dryRun":`Preview only; your current Brain was not changed.`,"intelligence.title":`Brain intelligence check`,"intelligence.subtitle":`Your Brain diagnoses its own knowledge.`,"intelligence.loading":`Diagnosing...`,"intelligence.unavailable":`Diagnosis is unavailable right now.`,"intelligence.score":`Overall score`,"intelligence.grade.excellent":`Excellent`,"intelligence.grade.good":`Good`,"intelligence.grade.attention":`Needs attention`,"intelligence.grade.critical":`Needs care`,"intelligence.grade.unknown":`No data yet`,"intelligence.dim.freshness":`Freshness`,"intelligence.dim.connectivity":`Connectivity`,"intelligence.dim.embedding_coverage":`Search readiness`,"intelligence.dim.consistency":`Consistency`,"intelligence.actions":`Recommended care`,"intelligence.action.rebuild_vector_index":`Rebuild the semantic search index`,"intelligence.action.review_orphans":`Review disconnected memories`,"intelligence.action.refresh_stale_knowledge":`Revisit stale knowledge`,"intelligence.action.resolve_contradictions":`Resolve conflicting memories`,"intelligence.insights":`Recent activity`,"intelligence.insights.recent":`{count} new items in the last 7 days`,"intelligence.insights.stale":`{count} stale items`,"intelligence.insights.orphans":`{count} disconnected items`,"intelligence.contradictions":`{count} conflicting memories`,"intelligence.consolidate":`Preview duplicate cleanup`,"intelligence.consolidate.working":`Checking...`,"intelligence.consolidate.none":`No duplicate memories found.`,"intelligence.consolidate.found":`Found {memories} duplicate memories · {edges} duplicate links`,"intelligence.consolidate.apply":`Clean up duplicate memories`,"intelligence.consolidate.applied":`Cleaned up {count} duplicate memories.`,"brain.answerProof.citationsLabel":`{count} evidence sources`,"brain.answerProof.marker":`Jump to source {index}`,"brain.answerProof.markerShort":`Source {index}`,"brain.answerProof.citationItem":`Source {index}: {title}`,"brain.answerProof.modelLine":`Evidence behind this {model} answer`,"brain.answerProof.why.aria":`Why this evidence was chosen`,"brain.answerProof.matched":`Matched words`,"brain.answerProof.matched.none":`Found directly in stored memory`,"brain.answerProof.confidence.high":`Strong match`,"brain.answerProof.confidence.medium":`Fair match`,"brain.answerProof.confidence.low":`Weak match`,"brain.garden.title":`My knowledge garden`,"brain.garden.loading":`Walking the garden…`,"brain.garden.unavailable":`No garden to show yet. Add a little more material first.`,"brain.garden.bed.recent":`Newly arrived`,"brain.garden.bed.contradictions":`Disagrees with itself`,"brain.garden.bed.stale":`Gone stale`,"brain.garden.bed.frequent":`Most relied on`,"brain.garden.empty.recent":`Nothing new arrived recently.`,"brain.garden.empty.contradictions":`Nothing contradicts itself right now.`,"brain.garden.empty.stale":`Nothing has been left untouched.`,"brain.garden.empty.frequent":`No topic is heavily connected yet.`,"brain.evidenceActions.open":`Build from this evidence`,"brain.evidenceActions.title":`What you can build from this evidence`,"brain.evidenceActions.loading":`Looking for what this evidence supports…`,"brain.evidenceActions.unavailable":`Nothing can be built directly from this answer's sources.`,"brain.rings.peek.aria":`Peek at {label} · {count} items`,"brain.rings.peek.title":`Peek at {label}`,"brain.rings.peek.summary":`{count} connections live in this layer.`,"brain.rings.count":`{count} items`,"brain.rings.close":`Close peek`,"brain.rings.deeper":`Open this layer`,"brain.rings.empty.now":`No recent conversation memory yet. Say something now.`,"brain.rings.empty.memories":`No durable memories yet. Add a document or a note.`,"brain.rings.empty.topics":`Topics emerge on their own as memories build up.`,"brain.rings.empty.graph":`The full graph opens once connections form.`,"brain.home.wakingHint":`Your Brain just woke up. Say anything or drop in one document and its first memory will form.`,"brain.firstFive.title":`First 5 minutes`,"brain.firstFive.aria":`First five minutes guide`,"brain.firstFive.subtitle":`Three small steps and you will feel what your Brain can do.`,"brain.firstFive.progress":`{done}/{total} done`,"brain.firstFive.dismiss":`Dismiss this guide`,"brain.firstFive.step.ask":`Ask your Brain a first question`,"brain.firstFive.step.ask.detail":`We fill a starter question into the box — just press send.`,"brain.firstFive.step.add":`Add one file or note`,"brain.firstFive.step.add.detail":`A file, a note, or a web address — anything works. It completes once something really goes in.`,"brain.firstFive.step.learned":`See what your Brain learned`,"brain.firstFive.step.learned.detail":`See how what you just added was organized.`,"brain.firstFive.step.done":`Done`,"brain.approval.aria":`Agent run approval`,"brain.approval.title":`Approval needed before running`,"brain.approval.summaryLabel":`Plan summary`,"brain.approval.expiry":`Expires if you don't decide by {time}.`,"brain.approval.approve":`Approve and run`,"brain.approval.edit":`Edit and run`,"brain.approval.cancel":`Cancel`,"brain.approval.running":`Running...`,"brain.approval.edit.label":`Edit plan (JSON)`,"brain.approval.edit.run":`Run this plan`,"brain.approval.edit.close":`Close editor`,"brain.approval.edit.invalid":`Could not parse the plan JSON. Please check the format.`,"brain.approval.resolved":`Approved and finished running.`,"brain.approval.cancelled":`Plan cancelled. Nothing was executed.`,"brain.approval.expired":`The approval window expired — please ask again.`,"brain.approval.error":`Approval failed: {reason}`,"brain.grounding.supported":`Sources used`,"brain.grounding.none":`No sources`,"brain.fvl.title":`30-second tour`,"brain.fvl.aria":`30-second tour guide`,"brain.fvl.dismiss":`Dismiss this guide`,"brain.fvl.subtitle":`Add 3 sample documents, then ask right away and watch your Brain answer from memory.`,"brain.fvl.start":`Add 3 sample documents`,"brain.fvl.starting":`Adding...`,"brain.fvl.installed":`{count} sample documents went into your Brain.`,"brain.fvl.docs.aria":`Demo document list`,"brain.fvl.doc.duplicate":`already there`,"brain.fvl.ask.title":`Now try asking`,"brain.fvl.chips.aria":`Suggested questions`,"brain.fvl.next.title":`Next step`,"brain.fvl.filegen.chip":`Turn this into an HTML page`,"brain.fvl.filegen.prompt":`Turn what we just discussed about the Saessak Garden project into a simple HTML intro page and save it as a file.`,"brain.fvl.done":`Tour complete! Now add your real documents.`,"brain.fvl.remove":`Remove demo data`,"brain.fvl.removing":`Removing...`,"brain.fvl.error":`Failed: {reason}`,"brain.fvl.connectCta":`Connect my folder`,"brain.fvl.cleanupCta":`Clean up samples`,"brain.steps.aria":`Agent run steps`,"brain.steps.live":`Step {count} in progress`,"brain.steps.summary":`{count} steps executed`,"brain.steps.planned":`Plan created`,"brain.steps.tool":`Tool run`,"brain.steps.tool.failed":`Tool run failed`,"brain.steps.proposed":`Saved as change proposal`,"brain.steps.blocked":`Blocked by policy`,"brain.steps.parseError":`Model output repaired`,"brain.steps.verdict":`Verification verdict`,"brain.steps.final":`Wrap-up`,"brain.steps.state":`State change`,"brain.steps.rollback":`Rolled back`,"brain.steps.step":`Step`,"brain.sourceModal.aria":`Source text: {title}`,"brain.sourceModal.open":`View source`,"brain.sourceModal.openAria":`View source text: {title}`,"brain.sourceModal.close":`Close source view`,"brain.sourceModal.loading":`Loading source text…`,"brain.sourceModal.error":`Could not load the source text: {reason}`,"brain.sourceModal.empty":`This source has no stored text.`,"brain.sourceModal.provenance":`Provenance`,"brain.watch.aria":`Folder watch status`,"brain.watch.title":`Watched folders`,"brain.watch.notLive":`Not real-time — periodic scans`,"brain.watch.scan.never":`Not scanned yet`,"brain.watch.scan.now":`Scanned just now`,"brain.watch.scan.minutes":`Scanned {count}m ago`,"brain.watch.scan.hours":`Scanned {count}h ago`,"brain.watch.scan.days":`Scanned {count}d ago`,"brain.watch.ingested":`+{count} added`,"brain.watch.tracked":`Tracking {count} files`,"brain.watch.errors":`Recent errors`,"brain.approval.countdown":`Time left {time}`,"brain.approval.countdown.warning":`Expires in under 2 minutes — please decide now.`,"brain.approval.expiredReplan":`Plan again`,"brain.approval.pendingNotice":`A task is waiting for your approval: {goal}`,"brain.approval.pendingNotice.generic":`A task is waiting for your approval.`,"brain.approval.pendingNotice.aria":`Pending approval notice`,"brain.approval.pendingNotice.expiry":`Valid until {time}. Continue from the approval card in the original conversation, or send the request again.`,"brain.approval.pendingNotice.hint":`Continue from the approval card in the original conversation, or send the request again.`,"brain.files.brainOk":`Remembered in Brain ✓`,"brain.files.brainPending":`Memory pending`,"brain.files.brainFailed":`Not remembered`,"brain.agent.repairs":`Repaired the model output {count} times`,"brain.agent.explanation.why":`A summary of why this run ended the way it did.`,"brain.stats.memories":`Memories`,"brain.stats.links":`Links`,"brain.stats.memoryKinds":`Memory kinds`,"brain.stats.linkKinds":`Link kinds`,"brain.stats.sources":`Sources`,"brain.stats.items":`Items`,"brain.stats.bytes":`Bytes`,"brain.stats.health":`Health`,"brain.stats.format":`Brain format`,"brain.stats.storage":`Storage`,"brain.value.reported":`reported`,"brain.graph.nodeStats":`{importance} importance · {links} links`,"brain.memory.recall.title":`Memory Recall`,"brain.memory.recall.detail":`Search and manage your saved memories.`,"brain.memory.recall.placeholder":`Recall memories about...`,"brain.memory.recall.action":`Recall`,"brain.memory.recall.completed":`Recall completed`,"brain.memory.compact":`Compact`,"brain.memory.rebuildVector":`Rebuild vector`,"brain.sources.title":`Sources & Provenance`,"brain.sources.detail":`Where your memories came from.`,"brain.sources.loading":`Loading sources`,"brain.sources.empty":`No sources yet`,"brain.sources.emptyDetail":`New memories will show their chat, manual, document, or import origin here.`,"brain.sources.fallback":`Source {index}`,"brain.sources.createdUnknown":`Created time not recorded`,"brain.sources.inspectable":`inspectable`,"brain.sources.missingProvenance":`missing provenance`,"brain.sources.copy":`Copy source`,"brain.sources.legacyMissing":`This older memory did not record a source path or conversation. It remains searchable, but provenance is incomplete.`,"brain.sources.type.chat":`chat`,"brain.sources.type.document":`document`,"brain.sources.type.import":`import`,"brain.sources.type.manual":`manual`,"brain.sources.type.unknown":`source unknown`,"brain.portability.title":`Export & Backup`,"brain.portability.detail":`Export, back up, or import your Brain data.`,"brain.portability.export":`Export Brain`,"brain.portability.backup":`Create backup`,"brain.portability.importPlaceholder":`Paste an exported Brain artifact to preview import`,"brain.portability.previewImport":`Preview import`,"brain.portability.importCompleted":`Import preview completed`}});
@@ -0,0 +1 @@
1
+ import{l as e,r as t,v as n,x as r,y as i}from"./utils-DYf7pqrR.js";var a=r(i()),o=e=>typeof e==`boolean`?`${e}`:e===0?`0`:e,s=e,c=(e,t)=>n=>{if(t?.variants==null)return s(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let s=o(t)||o(a);return r[e][s]}),c=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return s(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...c}[t]):{...i,...c}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)},l=n(),u=c(`inline-flex h-10 max-w-full items-center justify-center gap-2 rounded-md px-3.5 text-sm font-semibold leading-none transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-45`,{variants:{variant:{default:`bg-primary text-primary-foreground shadow-[0_10px_30px_hsl(var(--primary)/0.16)] hover:bg-primary/92`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/82`,ghost:`text-foreground hover:bg-muted`,outline:`border border-border bg-card/70 hover:bg-muted/88`,destructive:`bg-destructive text-destructive-foreground hover:bg-destructive/90`},size:{sm:`h-8 px-2.5 text-xs`,md:`h-10 px-3.5`,icon:`h-10 w-10 px-0`}},defaultVariants:{variant:`default`,size:`md`}}),d=a.forwardRef(({className:e,variant:n,size:r,...i},a)=>(0,l.jsx)(`button`,{ref:a,className:t(u({variant:n,size:r,className:e})),...i}));d.displayName=`Button`;export{d as t};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`circle-pause`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`10`,x2:`10`,y1:`15`,y2:`9`,key:`c1nkhi`}],[`line`,{x1:`14`,x2:`14`,y1:`15`,y2:`9`,key:`h65svq`}]]);export{t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`circle-pause`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`10`,x2:`10`,y1:`15`,y2:`9`,key:`c1nkhi`}],[`line`,{x1:`14`,x2:`14`,y1:`15`,y2:`9`,key:`h65svq`}]]);export{t};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]);export{t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]);export{t};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`cpu`,[[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M17 20v2`,key:`1rnc9c`}],[`path`,{d:`M17 2v2`,key:`11trls`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M2 17h2`,key:`7oei6x`}],[`path`,{d:`M2 7h2`,key:`asdhe0`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`M20 17h2`,key:`1fpfkl`}],[`path`,{d:`M20 7h2`,key:`1o8tra`}],[`path`,{d:`M7 20v2`,key:`4gnj0m`}],[`path`,{d:`M7 2v2`,key:`1i4yhu`}],[`rect`,{x:`4`,y:`4`,width:`16`,height:`16`,rx:`2`,key:`1vbyd7`}],[`rect`,{x:`8`,y:`8`,width:`8`,height:`8`,rx:`1`,key:`z9xiuo`}]]);export{t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`cpu`,[[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M17 20v2`,key:`1rnc9c`}],[`path`,{d:`M17 2v2`,key:`11trls`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M2 17h2`,key:`7oei6x`}],[`path`,{d:`M2 7h2`,key:`asdhe0`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`M20 17h2`,key:`1fpfkl`}],[`path`,{d:`M20 7h2`,key:`1o8tra`}],[`path`,{d:`M7 20v2`,key:`4gnj0m`}],[`path`,{d:`M7 2v2`,key:`1i4yhu`}],[`rect`,{x:`4`,y:`4`,width:`16`,height:`16`,rx:`2`,key:`1vbyd7`}],[`rect`,{x:`8`,y:`8`,width:`8`,height:`8`,rx:`1`,key:`z9xiuo`}]]);export{t};
@@ -0,0 +1 @@
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`folder-open`,[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]);export{t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`folder-open`,[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]);export{t};
@@ -1 +1 @@
1
- import{m as e}from"./utils-BqoznzGP.js";var t=e(`earth`,[[`path`,{d:`M21.54 15H17a2 2 0 0 0-2 2v4.54`,key:`1djwo0`}],[`path`,{d:`M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17`,key:`1tzkfa`}],[`path`,{d:`M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05`,key:`14pb5j`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),n=e(`folder-plus`,[[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`M9 13h6`,key:`1uhe8q`}],[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),r=e(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]);export{n,t as r,r as t};
1
+ import{h as e}from"./utils-DYf7pqrR.js";var t=e(`earth`,[[`path`,{d:`M21.54 15H17a2 2 0 0 0-2 2v4.54`,key:`1djwo0`}],[`path`,{d:`M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17`,key:`1tzkfa`}],[`path`,{d:`M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05`,key:`14pb5j`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),n=e(`folder-plus`,[[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`M9 13h6`,key:`1uhe8q`}],[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),r=e(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]);export{n,t as r,r as t};