ltcai 12.3.0 → 12.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +25 -39
  2. package/docs/CHANGELOG.md +44 -0
  3. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  4. package/docs/DEVELOPMENT.md +11 -11
  5. package/docs/ONBOARDING.md +1 -1
  6. package/docs/OPERATIONS.md +1 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TRUST_MODEL.md +1 -1
  9. package/docs/WHY_LATTICE.md +1 -1
  10. package/docs/kg-schema.md +1 -1
  11. package/lattice_brain/__init__.py +1 -1
  12. package/latticeai/__init__.py +1 -1
  13. package/latticeai/api/models.py +21 -1
  14. package/latticeai/api/search.py +8 -1
  15. package/latticeai/api/worker_compute.py +9 -1
  16. package/latticeai/core/embedding_providers/__init__.py +14 -0
  17. package/latticeai/core/embedding_providers/autodetect.py +91 -24
  18. package/latticeai/core/embedding_providers/base.py +10 -2
  19. package/latticeai/core/embedding_providers/profiles.py +44 -0
  20. package/latticeai/core/embedding_providers/text.py +325 -2
  21. package/latticeai/models/model_providers.py +2 -0
  22. package/latticeai/services/architecture_readiness.py +1 -1
  23. package/latticeai/services/embedding_recommendation.py +229 -0
  24. package/latticeai/services/model_capability_registry.py +114 -0
  25. package/latticeai/services/model_catalog.py +148 -0
  26. package/latticeai/services/model_engines.py +3 -1
  27. package/latticeai/services/product_readiness.py +1 -1
  28. package/package.json +3 -3
  29. package/requirements.txt +3 -1
  30. package/scripts/bump_version.py +106 -6
  31. package/scripts/check_current_release_docs.mjs +1 -1
  32. package/scripts/check_screenshot_pixel_delta.py +6 -2
  33. package/scripts/release_screen_claims.json +11 -0
  34. package/src-tauri/Cargo.lock +10 -10
  35. package/src-tauri/Cargo.toml +1 -1
  36. package/src-tauri/tauri.conf.json +1 -1
  37. package/static/app/asset-manifest.json +46 -47
  38. package/static/app/assets/Act-DQ2Ldwo8.js +2 -0
  39. package/static/app/assets/AdminConsole-y6EjiXeH.js +1 -0
  40. package/static/app/assets/Brain-CRWWw-h9.js +2 -0
  41. package/static/app/assets/BrainHome-cmvTu7Ea.js +2 -0
  42. package/static/app/assets/BrainSignals-gaNn5E4-.js +1 -0
  43. package/static/app/assets/Capture-BJK7in1j.js +1 -0
  44. package/static/app/assets/Chronicle-BuYZ9lMt.js +1 -0
  45. package/static/app/assets/CommandPalette-BjFwuKaA.js +1 -0
  46. package/static/app/assets/DigitalBrainExplorer-DTBRPYJ3.js +321 -0
  47. package/static/app/assets/Library-BsmZ-YVh.js +1 -0
  48. package/static/app/assets/LivingBrain-aT9hgkPV.js +1 -0
  49. package/static/app/assets/ProductFlow-Ct0QLLY5.js +1 -0
  50. package/static/app/assets/{QueryClientProvider-B3OjqSyJ.js → QueryClientProvider-CTiSBeU6.js} +1 -1
  51. package/static/app/assets/ReviewCard-CdooYtWr.js +3 -0
  52. package/static/app/assets/RunsListPanel-Btf2DIrG.js +1 -0
  53. package/static/app/assets/System-B77M4t-M.js +1 -0
  54. package/static/app/assets/WorkflowGraph-u3ZKLvZe.js +1 -0
  55. package/static/app/assets/WorkflowsPanel--nTFq3Cs.js +2 -0
  56. package/static/app/assets/actHelpers-xNnCfUeC.js +1 -0
  57. package/static/app/assets/arrow-left-Cp4NHbfX.js +1 -0
  58. package/static/app/assets/{bot-CAfN5QD1.js → bot-CXwvpODC.js} +1 -1
  59. package/static/app/assets/{brain-DNNLFQgq.js → brain-BzjoGgor.js} +1 -1
  60. package/static/app/assets/{button-D0k7_k6e.js → button-_hHOhp7g.js} +1 -1
  61. package/static/app/assets/circle-check-qG5dMahn.js +1 -0
  62. package/static/app/assets/{circle-pause-Dxw6SJuA.js → circle-pause-DBOqYYMh.js} +1 -1
  63. package/static/app/assets/{circle-play-DuoLDLEg.js → circle-play-DA0Vf2NH.js} +1 -1
  64. package/static/app/assets/{cpu-BGOpEdGX.js → cpu-DwsE0_o3.js} +1 -1
  65. package/static/app/assets/{download-wXD9L5vN.js → download-iCoe2f2Q.js} +1 -1
  66. package/static/app/assets/{folder-open-CittV8Ey.js → folder-open-C1vNOMhy.js} +1 -1
  67. package/static/app/assets/{hard-drive-CLQPYYBF.js → hard-drive-a73KaYth.js} +1 -1
  68. package/static/app/assets/index-Dbb2YhYw.css +2 -0
  69. package/static/app/assets/index-DpuEeYmP.js +13 -0
  70. package/static/app/assets/{input-RZ8aKj6d.js → input-BclQNHyj.js} +1 -1
  71. package/static/app/assets/jsx-runtime-CU_pEDDh.js +1 -0
  72. package/static/app/assets/{link-2-B7QYeNdJ.js → link-2-D23wihBe.js} +1 -1
  73. package/static/app/assets/{permissionCopy-DFGEuU2d.js → permissionCopy-DiGZRKAY.js} +1 -1
  74. package/static/app/assets/primitives-1S-XCgmz.js +1 -0
  75. package/static/app/assets/search-Cl2k5uhD.js +1 -0
  76. package/static/app/assets/{share-2-Drg0MPgx.js → share-2-47_av_aF.js} +1 -1
  77. package/static/app/assets/{shield-alert-CFKdCGM8.js → shield-alert-BvKq2P-G.js} +1 -1
  78. package/static/app/assets/{textarea-n_69mQP_.js → textarea-DcLO52bu.js} +1 -1
  79. package/static/app/assets/useFocusTrap-CpqVPzJ_.js +1 -0
  80. package/static/app/assets/{useMutation-Dvcq6J6b.js → useMutation-DhI3jqCN.js} +1 -1
  81. package/static/app/assets/workspace-DwNHbqaX.js +1 -0
  82. package/static/app/index.html +4 -4
  83. package/static/sw.js +1 -1
  84. package/static/app/assets/Act-CZXyMcfJ.js +0 -2
  85. package/static/app/assets/AdminConsole-CAkZk0BI.js +0 -1
  86. package/static/app/assets/Brain-DN_7_HSV.js +0 -2
  87. package/static/app/assets/BrainHome-BBP0ouU-.js +0 -2
  88. package/static/app/assets/BrainSignals-nyRNxvQ3.js +0 -1
  89. package/static/app/assets/Capture-DBvFoZKL.js +0 -1
  90. package/static/app/assets/Chronicle-BC5zmR44.js +0 -1
  91. package/static/app/assets/CommandPalette-Bs-Fk6HT.js +0 -1
  92. package/static/app/assets/DigitalBrainExplorer-CNcCktPP.js +0 -321
  93. package/static/app/assets/Library-CxUA4xai.js +0 -1
  94. package/static/app/assets/LivingBrain-CiyjvwKy.js +0 -1
  95. package/static/app/assets/ProductFlow-DccERGr3.js +0 -1
  96. package/static/app/assets/ReviewCard-lawM1khV.js +0 -3
  97. package/static/app/assets/RunsListPanel-DQC-zQ7m.js +0 -1
  98. package/static/app/assets/System-DwqYJQaj.js +0 -1
  99. package/static/app/assets/WorkflowGraph-pJ2eFrhy.js +0 -1
  100. package/static/app/assets/WorkflowsPanel-BIGjfM7h.js +0 -2
  101. package/static/app/assets/actHelpers-DfIqS92u.js +0 -1
  102. package/static/app/assets/arrow-left-DvwQxqcD.js +0 -1
  103. package/static/app/assets/circle-check-hH6updC-.js +0 -1
  104. package/static/app/assets/index-C0VEkbAp.js +0 -13
  105. package/static/app/assets/index-C8gwOf0C.css +0 -2
  106. package/static/app/assets/jsx-runtime-bzQ4Vb5N.js +0 -1
  107. package/static/app/assets/primitives-EKxh12KR.js +0 -1
  108. package/static/app/assets/search-BA5Ge197.js +0 -1
  109. package/static/app/assets/sourceMeta-BzqJiEPI.js +0 -1
  110. package/static/app/assets/useFocusTrap-B0w4AxK1.js +0 -1
  111. package/static/app/assets/workspace-BgBHikYl.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ltcai",
3
- "version": "12.3.0",
3
+ "version": "12.5.0",
4
4
  "description": "Lattice AI — local-first Digital Brain that keeps your knowledge durable across any AI model.",
5
5
  "homepage": "https://github.com/TaeSooPark-PTS/LatticeAI#readme",
6
6
  "repository": {
@@ -140,7 +140,7 @@
140
140
  "@types/react": "^19.2.17",
141
141
  "@types/react-dom": "^19.2.3",
142
142
  "@vitejs/plugin-react": "^6.0.2",
143
- "@vitest/coverage-v8": "^4.1.10",
143
+ "@vitest/coverage-v8": "^4.1.12",
144
144
  "autoprefixer": "^10.5.0",
145
145
  "class-variance-authority": "^0.7.1",
146
146
  "clsx": "^2.1.1",
@@ -157,7 +157,7 @@
157
157
  "tailwindcss": "^4.3.0",
158
158
  "typescript": "^5.9.3",
159
159
  "vite": "^8.0.16",
160
- "vitest": "^4.1.10",
160
+ "vitest": "^4.1.12",
161
161
  "zustand": "^5.0.14"
162
162
  },
163
163
  "overrides": {
package/requirements.txt CHANGED
@@ -2,10 +2,12 @@ fastapi>=0.110,<1
2
2
  uvicorn>=0.29,<1
3
3
  pydantic>=2.7,<3
4
4
  httpx>=0.27,<1
5
- pillow>=10,<13
5
+ pillow>=13,<14
6
6
  openai>=1.30,<3
7
7
  python-docx>=1.1,<2
8
8
  openpyxl>=3.1,<4
9
9
  python-pptx>=0.6.23,<2
10
10
  keyring>=24,<26
11
11
  pdfplumber>=0.11,<0.12
12
+ reportlab>=4,<5
13
+ huggingface_hub>=1.0,<2
@@ -13,6 +13,7 @@ Usage:
13
13
  from __future__ import annotations
14
14
 
15
15
  import argparse
16
+ import hashlib
16
17
  import json
17
18
  import re
18
19
  import sys
@@ -44,6 +45,25 @@ RUST_CRATES = (
44
45
  )
45
46
  RUST_LOCKFILES = ("rust/Cargo.lock", "src-tauri/Cargo.lock")
46
47
 
48
+ # Committed OpenAPI fragments (`rust/fixtures/openapi/<family>.json`) plus
49
+ # `_envelope.json` and `_index.json`. Serialized with `sort_keys=True, indent=2`
50
+ # (`scripts/gen_openapi_fragments.py::canonical_json`).
51
+ OPENAPI_FRAGMENTS = (
52
+ "admin",
53
+ "auth",
54
+ "chat",
55
+ "knowledge_search",
56
+ "mcp_market",
57
+ "memory_brain",
58
+ "models_misc",
59
+ "portability_network",
60
+ "review_proposals",
61
+ "static_ui",
62
+ "ui_redirects",
63
+ "worker_keep",
64
+ "workspace",
65
+ )
66
+
47
67
  # (path, kind, pattern) — pattern groups: (prefix, version)
48
68
  TARGETS = [
49
69
  ("latticeai/__init__.py", "regex", r'(__version__ = ")([^"]+)(")'),
@@ -68,9 +88,20 @@ TARGETS = [
68
88
  for crate in RUST_CRATES
69
89
  ],
70
90
  ("static/app/asset-manifest.json", "json", "version"),
91
+ ("frontend/openapi.json", "openapi-spec", None),
92
+ ("rust/fixtures/openapi/_envelope.json", "openapi-envelope", None),
93
+ *[
94
+ (f"rust/fixtures/openapi/{family}.json", "openapi-fragment", None)
95
+ for family in OPENAPI_FRAGMENTS
96
+ ],
97
+ ("rust/fixtures/openapi/_index.json", "openapi-index", None),
71
98
  ]
72
99
 
73
100
 
101
+ def _canonical_openapi_json(payload: object) -> str:
102
+ return json.dumps(payload, sort_keys=True, indent=2) + "\n"
103
+
104
+
74
105
  def bump(version: str, *, check: bool = False) -> int:
75
106
  if not re.fullmatch(r"\d+\.\d+\.\d+([-.][0-9A-Za-z.]+)?", version):
76
107
  print(f"error: '{version}' is not a sane semantic version", file=sys.stderr)
@@ -82,26 +113,96 @@ def bump(version: str, *, check: bool = False) -> int:
82
113
  print(f" skip {rel} (missing)")
83
114
  continue
84
115
  text = path.read_text(encoding="utf-8")
116
+ current = ""
117
+ new = text
85
118
  if kind == "regex":
86
- new, n = re.subn(spec, lambda m: m.group(1) + version + m.group(3), text, count=1, flags=re.MULTILINE)
87
- changed = n == 1 and new != text
88
- ok = n == 1
119
+ m = re.search(spec, text, flags=re.MULTILINE)
120
+ ok = m is not None
121
+ if ok and m is not None:
122
+ current = m.group(2)
123
+ new, n = re.subn(spec, lambda match: match.group(1) + version + match.group(3), text, count=1, flags=re.MULTILINE)
124
+ changed = n == 1 and new != text
125
+ else:
126
+ changed = False
89
127
  elif kind == "json":
90
128
  data = json.loads(text)
91
129
  ok = spec in data
92
- changed = ok and data.get(spec) != version
93
130
  if ok:
131
+ current = str(data.get(spec))
132
+ changed = current != version
94
133
  data[spec] = version
95
134
  new = json.dumps(data, ensure_ascii=False, indent=2) + "\n"
135
+ else:
136
+ changed = False
96
137
  elif kind == "package-lock":
97
138
  data = json.loads(text)
98
139
  ok = "version" in data
99
- changed = ok and data.get("version") != version
100
140
  if ok:
141
+ current = str(data.get("version"))
142
+ changed = current != version
101
143
  data["version"] = version
102
144
  if "packages" in data and "" in data["packages"]:
103
145
  data["packages"][""]["version"] = version
104
146
  new = json.dumps(data, ensure_ascii=False, indent=2) + "\n"
147
+ else:
148
+ changed = False
149
+ elif kind == "openapi-spec":
150
+ data = json.loads(text)
151
+ info = data.get("info") if isinstance(data.get("info"), dict) else None
152
+ ok = info is not None and "version" in info
153
+ if ok and info is not None:
154
+ current = str(info["version"])
155
+ changed = current != version
156
+ info["version"] = version
157
+ new = _canonical_openapi_json(data)
158
+ else:
159
+ changed = False
160
+ elif kind == "openapi-envelope":
161
+ data = json.loads(text)
162
+ spec_obj = data.get("spec") if isinstance(data.get("spec"), dict) else None
163
+ info = spec_obj.get("info") if isinstance(spec_obj, dict) and isinstance(spec_obj.get("info"), dict) else None
164
+ ok = "spec_version" in data and info is not None and "version" in info
165
+ if ok and info is not None:
166
+ sv = str(data["spec_version"])
167
+ iv = str(info["version"])
168
+ current = sv if sv != version else iv
169
+ changed = sv != version or iv != version
170
+ data["spec_version"] = version
171
+ info["version"] = version
172
+ new = _canonical_openapi_json(data)
173
+ else:
174
+ changed = False
175
+ elif kind == "openapi-fragment":
176
+ data = json.loads(text)
177
+ ok = "spec_version" in data
178
+ if ok:
179
+ current = str(data["spec_version"])
180
+ changed = current != version
181
+ data["spec_version"] = version
182
+ new = _canonical_openapi_json(data)
183
+ else:
184
+ changed = False
185
+ elif kind == "openapi-index":
186
+ data = json.loads(text)
187
+ ok = "spec_version" in data
188
+ if ok:
189
+ current = str(data["spec_version"])
190
+ data["spec_version"] = version
191
+ if not check:
192
+ env_meta = data.get("envelope")
193
+ if isinstance(env_meta, dict) and "file" in env_meta:
194
+ env_path = path.parent / str(env_meta["file"])
195
+ if env_path.is_file():
196
+ env_meta["sha256"] = hashlib.sha256(env_path.read_bytes()).hexdigest()
197
+ for entry in data.get("fragments", []):
198
+ if isinstance(entry, dict) and "file" in entry:
199
+ frag_path = path.parent / str(entry["file"])
200
+ if frag_path.is_file():
201
+ entry["sha256"] = hashlib.sha256(frag_path.read_bytes()).hexdigest()
202
+ new = _canonical_openapi_json(data)
203
+ changed = current != version or new != text
204
+ else:
205
+ changed = False
105
206
  else: # pragma: no cover
106
207
  raise AssertionError(kind)
107
208
  if not ok:
@@ -109,7 +210,6 @@ def bump(version: str, *, check: bool = False) -> int:
109
210
  failures += 1
110
211
  continue
111
212
  if check:
112
- current = re.search(spec, text, flags=re.MULTILINE).group(2) if kind == "regex" else json.loads(text)["version"]
113
213
  status = "ok" if current == version else f"MISMATCH ({current})"
114
214
  if current != version:
115
215
  failures += 1
@@ -6,7 +6,7 @@ const root = process.cwd();
6
6
  const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
7
7
  const version = pkg.version;
8
8
  const releaseDir = `output/release/v${version}`;
9
- const releaseTheme = "Live Wire";
9
+ const releaseTheme = "Deep Vector";
10
10
  const title = `${version} — ${releaseTheme}`;
11
11
  const escapedVersion = version.replaceAll(".", "\\.");
12
12
 
@@ -324,10 +324,14 @@ def _pixel_delta_pct(
324
324
  w, h = canvas_a.size
325
325
  diff = ImageChops.difference(canvas_a, canvas_b)
326
326
  # Any channel delta > 8 counts as changed (ignore sub-pixel AA noise).
327
- # Count on RGB getdata: a pixel is changed if any channel exceeds the
327
+ # Count on RGB get_flattened_data: a pixel is changed if any channel exceeds the
328
328
  # threshold. (A point()+convert("L") mask would average channels and
329
329
  # under-count single-channel diffs, so we do not use it.)
330
- pixels = list(diff.getdata())
330
+ pixels = (
331
+ diff.get_flattened_data()
332
+ if hasattr(diff, "get_flattened_data")
333
+ else diff.getdata()
334
+ )
331
335
  changed = sum(1 for r, g, b in pixels if r > 8 or g > 8 or b > 8)
332
336
  total = w * h
333
337
  pct = (100.0 * changed / total) if total else 0.0
@@ -20,6 +20,17 @@
20
20
  "whole-image delta: naming where the change is makes the claim more",
21
21
  "specific, not less."
22
22
  ],
23
+ "12.4.0": {
24
+ "_why": [
25
+ "Sharp Weight is a model catalog and security audit release: Qwen 3.8 27B",
26
+ "4-bit and Gemma 4 26B A4B QAT / QAT-OptiQ 4-bit catalog expansion,",
27
+ "Pillow 13.0.0 and npm lockfile vulnerability closure, model_engines",
28
+ "URL scheme validation, and scoped Tailwind CSS v4 source scanning.",
29
+ "",
30
+ "No screen was redesigned. Empty claim set on purpose. Unclaimed screens",
31
+ "are still measured and printed; they are not gated."
32
+ ]
33
+ },
23
34
  "12.3.0": {
24
35
  "_why": [
25
36
  "Live Wire is a backend and runtime release: verified Hugging Face GGUF",
@@ -1863,7 +1863,7 @@ dependencies = [
1863
1863
 
1864
1864
  [[package]]
1865
1865
  name = "lattice-agent"
1866
- version = "12.3.0"
1866
+ version = "12.5.0"
1867
1867
  dependencies = [
1868
1868
  "axum",
1869
1869
  "base64 0.22.1",
@@ -1880,7 +1880,7 @@ dependencies = [
1880
1880
 
1881
1881
  [[package]]
1882
1882
  name = "lattice-ai-desktop"
1883
- version = "12.3.0"
1883
+ version = "12.5.0"
1884
1884
  dependencies = [
1885
1885
  "lattice-host",
1886
1886
  "lattice-jobs",
@@ -1895,7 +1895,7 @@ dependencies = [
1895
1895
 
1896
1896
  [[package]]
1897
1897
  name = "lattice-auth"
1898
- version = "12.3.0"
1898
+ version = "12.5.0"
1899
1899
  dependencies = [
1900
1900
  "axum",
1901
1901
  "base64 0.22.1",
@@ -1912,7 +1912,7 @@ dependencies = [
1912
1912
 
1913
1913
  [[package]]
1914
1914
  name = "lattice-chat"
1915
- version = "12.3.0"
1915
+ version = "12.5.0"
1916
1916
  dependencies = [
1917
1917
  "axum",
1918
1918
  "bytes",
@@ -1934,7 +1934,7 @@ dependencies = [
1934
1934
 
1935
1935
  [[package]]
1936
1936
  name = "lattice-core"
1937
- version = "12.3.0"
1937
+ version = "12.5.0"
1938
1938
  dependencies = [
1939
1939
  "blake2",
1940
1940
  "bytes",
@@ -1950,7 +1950,7 @@ dependencies = [
1950
1950
 
1951
1951
  [[package]]
1952
1952
  name = "lattice-host"
1953
- version = "12.3.0"
1953
+ version = "12.5.0"
1954
1954
  dependencies = [
1955
1955
  "axum",
1956
1956
  "lattice-agent",
@@ -1971,7 +1971,7 @@ dependencies = [
1971
1971
 
1972
1972
  [[package]]
1973
1973
  name = "lattice-ingest"
1974
- version = "12.3.0"
1974
+ version = "12.5.0"
1975
1975
  dependencies = [
1976
1976
  "axum",
1977
1977
  "lattice-auth",
@@ -1986,7 +1986,7 @@ dependencies = [
1986
1986
 
1987
1987
  [[package]]
1988
1988
  name = "lattice-jobs"
1989
- version = "12.3.0"
1989
+ version = "12.5.0"
1990
1990
  dependencies = [
1991
1991
  "axum",
1992
1992
  "lattice-auth",
@@ -2001,7 +2001,7 @@ dependencies = [
2001
2001
 
2002
2002
  [[package]]
2003
2003
  name = "lattice-platform"
2004
- version = "12.3.0"
2004
+ version = "12.5.0"
2005
2005
  dependencies = [
2006
2006
  "axum",
2007
2007
  "base64 0.22.1",
@@ -2024,7 +2024,7 @@ dependencies = [
2024
2024
 
2025
2025
  [[package]]
2026
2026
  name = "lattice-retrieval"
2027
- version = "12.3.0"
2027
+ version = "12.5.0"
2028
2028
  dependencies = [
2029
2029
  "axum",
2030
2030
  "fancy-regex",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lattice-ai-desktop"
3
- version = "12.3.0"
3
+ version = "12.5.0"
4
4
  description = "Lattice AI Digital Brain desktop shell"
5
5
  authors = ["TaeSoo Park"]
6
6
  edition = "2021"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://schema.tauri.app/config/2",
3
3
  "productName": "Lattice AI",
4
- "version": "12.3.0",
4
+ "version": "12.5.0",
5
5
  "identifier": "ai.lattice.desktop",
6
6
  "build": {
7
7
  "beforeDevCommand": "npm run frontend:dev",
@@ -1,55 +1,54 @@
1
1
  {
2
- "version": "12.3.0",
2
+ "version": "12.5.0",
3
3
  "generated_at": "vite",
4
4
  "entrypoints": {
5
- "app": "/static/app/assets/index-C0VEkbAp.js"
5
+ "app": "/static/app/assets/index-DpuEeYmP.js"
6
6
  },
7
7
  "assets": {
8
8
  "../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
9
- "_BrainSignals-nyRNxvQ3.js": "/static/app/assets/BrainSignals-nyRNxvQ3.js",
10
- "_LivingBrain-CiyjvwKy.js": "/static/app/assets/LivingBrain-CiyjvwKy.js",
11
- "_QueryClientProvider-B3OjqSyJ.js": "/static/app/assets/QueryClientProvider-B3OjqSyJ.js",
12
- "_ReviewCard-lawM1khV.js": "/static/app/assets/ReviewCard-lawM1khV.js",
13
- "_actHelpers-DfIqS92u.js": "/static/app/assets/actHelpers-DfIqS92u.js",
14
- "_arrow-left-DvwQxqcD.js": "/static/app/assets/arrow-left-DvwQxqcD.js",
15
- "_bot-CAfN5QD1.js": "/static/app/assets/bot-CAfN5QD1.js",
16
- "_brain-DNNLFQgq.js": "/static/app/assets/brain-DNNLFQgq.js",
17
- "_button-D0k7_k6e.js": "/static/app/assets/button-D0k7_k6e.js",
18
- "_circle-check-hH6updC-.js": "/static/app/assets/circle-check-hH6updC-.js",
19
- "_circle-pause-Dxw6SJuA.js": "/static/app/assets/circle-pause-Dxw6SJuA.js",
20
- "_circle-play-DuoLDLEg.js": "/static/app/assets/circle-play-DuoLDLEg.js",
21
- "_cpu-BGOpEdGX.js": "/static/app/assets/cpu-BGOpEdGX.js",
22
- "_download-wXD9L5vN.js": "/static/app/assets/download-wXD9L5vN.js",
23
- "_folder-open-CittV8Ey.js": "/static/app/assets/folder-open-CittV8Ey.js",
24
- "_hard-drive-CLQPYYBF.js": "/static/app/assets/hard-drive-CLQPYYBF.js",
25
- "_input-RZ8aKj6d.js": "/static/app/assets/input-RZ8aKj6d.js",
26
- "_jsx-runtime-bzQ4Vb5N.js": "/static/app/assets/jsx-runtime-bzQ4Vb5N.js",
27
- "_link-2-B7QYeNdJ.js": "/static/app/assets/link-2-B7QYeNdJ.js",
28
- "_permissionCopy-DFGEuU2d.js": "/static/app/assets/permissionCopy-DFGEuU2d.js",
29
- "_primitives-EKxh12KR.js": "/static/app/assets/primitives-EKxh12KR.js",
30
- "_search-BA5Ge197.js": "/static/app/assets/search-BA5Ge197.js",
31
- "_share-2-Drg0MPgx.js": "/static/app/assets/share-2-Drg0MPgx.js",
32
- "_shield-alert-CFKdCGM8.js": "/static/app/assets/shield-alert-CFKdCGM8.js",
33
- "_sourceMeta-BzqJiEPI.js": "/static/app/assets/sourceMeta-BzqJiEPI.js",
34
- "_textarea-n_69mQP_.js": "/static/app/assets/textarea-n_69mQP_.js",
35
- "_useFocusTrap-B0w4AxK1.js": "/static/app/assets/useFocusTrap-B0w4AxK1.js",
36
- "_useMutation-Dvcq6J6b.js": "/static/app/assets/useMutation-Dvcq6J6b.js",
37
- "_workspace-BgBHikYl.js": "/static/app/assets/workspace-BgBHikYl.js",
38
- "index.html": "/static/app/assets/index-C0VEkbAp.js",
39
- "assets/index-C8gwOf0C.css": "/static/app/assets/index-C8gwOf0C.css",
40
- "src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-DccERGr3.js",
41
- "src/features/act/RunsListPanel.tsx": "/static/app/assets/RunsListPanel-DQC-zQ7m.js",
42
- "src/features/act/WorkflowGraph.tsx": "/static/app/assets/WorkflowGraph-pJ2eFrhy.js",
43
- "src/features/act/WorkflowsPanel.tsx": "/static/app/assets/WorkflowsPanel-BIGjfM7h.js",
44
- "src/features/admin/AdminConsole.tsx": "/static/app/assets/AdminConsole-CAkZk0BI.js",
45
- "src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-BBP0ouU-.js",
46
- "src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-Bs-Fk6HT.js",
47
- "src/pages/Act.tsx": "/static/app/assets/Act-CZXyMcfJ.js",
48
- "src/pages/Brain.tsx": "/static/app/assets/Brain-DN_7_HSV.js",
49
- "src/pages/Capture.tsx": "/static/app/assets/Capture-DBvFoZKL.js",
50
- "src/pages/Chronicle.tsx": "/static/app/assets/Chronicle-BC5zmR44.js",
51
- "src/pages/Library.tsx": "/static/app/assets/Library-CxUA4xai.js",
52
- "src/pages/System.tsx": "/static/app/assets/System-DwqYJQaj.js",
53
- "src/pages/brain/DigitalBrainExplorer.tsx": "/static/app/assets/DigitalBrainExplorer-CNcCktPP.js"
9
+ "_BrainSignals-gaNn5E4-.js": "/static/app/assets/BrainSignals-gaNn5E4-.js",
10
+ "_LivingBrain-aT9hgkPV.js": "/static/app/assets/LivingBrain-aT9hgkPV.js",
11
+ "_QueryClientProvider-CTiSBeU6.js": "/static/app/assets/QueryClientProvider-CTiSBeU6.js",
12
+ "_ReviewCard-CdooYtWr.js": "/static/app/assets/ReviewCard-CdooYtWr.js",
13
+ "_actHelpers-xNnCfUeC.js": "/static/app/assets/actHelpers-xNnCfUeC.js",
14
+ "_arrow-left-Cp4NHbfX.js": "/static/app/assets/arrow-left-Cp4NHbfX.js",
15
+ "_bot-CXwvpODC.js": "/static/app/assets/bot-CXwvpODC.js",
16
+ "_brain-BzjoGgor.js": "/static/app/assets/brain-BzjoGgor.js",
17
+ "_button-_hHOhp7g.js": "/static/app/assets/button-_hHOhp7g.js",
18
+ "_circle-check-qG5dMahn.js": "/static/app/assets/circle-check-qG5dMahn.js",
19
+ "_circle-pause-DBOqYYMh.js": "/static/app/assets/circle-pause-DBOqYYMh.js",
20
+ "_circle-play-DA0Vf2NH.js": "/static/app/assets/circle-play-DA0Vf2NH.js",
21
+ "_cpu-DwsE0_o3.js": "/static/app/assets/cpu-DwsE0_o3.js",
22
+ "_download-iCoe2f2Q.js": "/static/app/assets/download-iCoe2f2Q.js",
23
+ "_folder-open-C1vNOMhy.js": "/static/app/assets/folder-open-C1vNOMhy.js",
24
+ "_hard-drive-a73KaYth.js": "/static/app/assets/hard-drive-a73KaYth.js",
25
+ "_input-BclQNHyj.js": "/static/app/assets/input-BclQNHyj.js",
26
+ "_jsx-runtime-CU_pEDDh.js": "/static/app/assets/jsx-runtime-CU_pEDDh.js",
27
+ "_link-2-D23wihBe.js": "/static/app/assets/link-2-D23wihBe.js",
28
+ "_permissionCopy-DiGZRKAY.js": "/static/app/assets/permissionCopy-DiGZRKAY.js",
29
+ "_primitives-1S-XCgmz.js": "/static/app/assets/primitives-1S-XCgmz.js",
30
+ "_search-Cl2k5uhD.js": "/static/app/assets/search-Cl2k5uhD.js",
31
+ "_share-2-47_av_aF.js": "/static/app/assets/share-2-47_av_aF.js",
32
+ "_shield-alert-BvKq2P-G.js": "/static/app/assets/shield-alert-BvKq2P-G.js",
33
+ "_textarea-DcLO52bu.js": "/static/app/assets/textarea-DcLO52bu.js",
34
+ "_useFocusTrap-CpqVPzJ_.js": "/static/app/assets/useFocusTrap-CpqVPzJ_.js",
35
+ "_useMutation-DhI3jqCN.js": "/static/app/assets/useMutation-DhI3jqCN.js",
36
+ "_workspace-DwNHbqaX.js": "/static/app/assets/workspace-DwNHbqaX.js",
37
+ "index.html": "/static/app/assets/index-DpuEeYmP.js",
38
+ "assets/index-Dbb2YhYw.css": "/static/app/assets/index-Dbb2YhYw.css",
39
+ "src/components/ProductFlow.tsx": "/static/app/assets/ProductFlow-Ct0QLLY5.js",
40
+ "src/features/act/RunsListPanel.tsx": "/static/app/assets/RunsListPanel-Btf2DIrG.js",
41
+ "src/features/act/WorkflowGraph.tsx": "/static/app/assets/WorkflowGraph-u3ZKLvZe.js",
42
+ "src/features/act/WorkflowsPanel.tsx": "/static/app/assets/WorkflowsPanel--nTFq3Cs.js",
43
+ "src/features/admin/AdminConsole.tsx": "/static/app/assets/AdminConsole-y6EjiXeH.js",
44
+ "src/features/brain/BrainHome.tsx": "/static/app/assets/BrainHome-cmvTu7Ea.js",
45
+ "src/features/command/CommandPalette.tsx": "/static/app/assets/CommandPalette-BjFwuKaA.js",
46
+ "src/pages/Act.tsx": "/static/app/assets/Act-DQ2Ldwo8.js",
47
+ "src/pages/Brain.tsx": "/static/app/assets/Brain-CRWWw-h9.js",
48
+ "src/pages/Capture.tsx": "/static/app/assets/Capture-BJK7in1j.js",
49
+ "src/pages/Chronicle.tsx": "/static/app/assets/Chronicle-BuYZ9lMt.js",
50
+ "src/pages/Library.tsx": "/static/app/assets/Library-BsmZ-YVh.js",
51
+ "src/pages/System.tsx": "/static/app/assets/System-B77M4t-M.js",
52
+ "src/pages/brain/DigitalBrainExplorer.tsx": "/static/app/assets/DigitalBrainExplorer-DTBRPYJ3.js"
54
53
  }
55
54
  }
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RunsListPanel-Btf2DIrG.js","assets/jsx-runtime-CU_pEDDh.js","assets/workspace-DwNHbqaX.js","assets/index-DpuEeYmP.js","assets/QueryClientProvider-CTiSBeU6.js","assets/index-Dbb2YhYw.css","assets/primitives-1S-XCgmz.js","assets/useMutation-DhI3jqCN.js","assets/circle-check-qG5dMahn.js","assets/button-_hHOhp7g.js","assets/actHelpers-xNnCfUeC.js","assets/circle-play-DA0Vf2NH.js","assets/WorkflowsPanel--nTFq3Cs.js","assets/input-BclQNHyj.js","assets/textarea-DcLO52bu.js","assets/folder-open-C1vNOMhy.js"])))=>i.map(i=>d[i]);
2
+ import{i as e,n as t,t as n}from"./jsx-runtime-CU_pEDDh.js";import"./workspace-DwNHbqaX.js";import{t as r}from"./useMutation-DhI3jqCN.js";import{D as i,H as a,R as o,S as s,b as c,i as l,k as u,o as d,v as f,z as p}from"./index-DpuEeYmP.js";import{n as m}from"./QueryClientProvider-CTiSBeU6.js";import{t as h}from"./bot-CXwvpODC.js";import{t as g}from"./circle-pause-DBOqYYMh.js";import{_,c as v,d as y,g as b,h as x,i as S,m as C,n as w,o as T,p as E,r as D,s as O,t as k,u as A,v as j}from"./primitives-1S-XCgmz.js";import{t as M}from"./button-_hHOhp7g.js";import{t as N}from"./input-BclQNHyj.js";import{t as P}from"./textarea-DcLO52bu.js";import{a as F,i as I,n as L,r as R}from"./ReviewCard-CdooYtWr.js";var z=o(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),B=e(t()),V=n();function H(){let e=p(e=>e.language),t=m(),[n,r]=B.useState(`pending`),[i,o]=B.useState(`all`),[c,l]=B.useState({}),u=a({queryKey:[`automationReviews`,n,i],queryFn:()=>f.automationReviews({...n===`all`?{}:{status:n},...i===`all`?{}:{source:i}})}),d=u.data?.data.items||[],h=a({queryKey:[`proposalCounts`],queryFn:f.proposalCounts}),g=Number(h.data?.data?.pending||0),_=async(n,r,i=!1,a)=>{let o=await(r===`approve`?()=>f.approveReviewItem(n.id):r===`dismiss`?n.source===`change_proposal`?()=>f.rejectProposal(n.id,a||``):()=>f.dismissReviewItem(n.id):r===`snooze`?()=>f.snoozeReviewItem(n.id,R()):r===`unsnooze`?()=>f.unsnoozeReviewItem(n.id):()=>f.runNowReviewItem(n.id))();if(!o.ok){let t=r===`approve`&&n.source===`change_proposal`&&o.status===409;return l(r=>({...r,[n.id]:t?{tone:`error`,message:s(e,`proposals.conflict.title`),conflict:!0}:{tone:`error`,message:s(e,`review.feedback.error`),...o.error?{detail:o.error}:{}}})),o}if(r===`run_now`){let t=o.data.payload||{},r=o.data.provenance||{},a=String(t.last_run_id||r.run_id||``),c=i?s(e,`review.regenerated`):s(e,`review.executed`);l(e=>({...e,[n.id]:{tone:`success`,message:a?`${c} · ${a}`:c}}))}else l(e=>{let t={...e};return delete t[n.id],t});return await Promise.all([t.invalidateQueries({queryKey:[`automationReviews`]}),t.invalidateQueries({queryKey:[`proposalCounts`]}),t.invalidateQueries({queryKey:[`pendingProposals`]})]),o};return u.isLoading?(0,V.jsx)(T,{title:s(e,`review.inbox.title`)}):(0,V.jsxs)(`div`,{className:`review-inbox`,children:[(0,V.jsxs)(`div`,{className:`review-inbox-head`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h2`,{className:`text-xl font-bold`,children:s(e,`review.inbox.title`)}),(0,V.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:s(e,`review.inbox.description`)})]}),(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[g>0?(0,V.jsx)(j,{variant:`warning`,"data-testid":`proposal-count-badge`,children:s(e,`review.proposal.badge`,{count:g})}):null,u.data?(0,V.jsx)(j,{variant:u.data.ok?`success`:`warning`,children:u.data.ok?s(e,`review.status.connected`):s(e,`review.status.unavailable`)}):null]})]}),(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-6 gap-y-2 py-1`,children:[(0,V.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,V.jsx)(`span`,{id:`review-status-filter-label`,className:`text-xs font-semibold tracking-wide text-muted-foreground`,children:s(e,`review.status.title`)}),(0,V.jsx)(y,{tabs:F.map(t=>({id:t.id,label:s(e,t.labelKey)})),value:n,onChange:e=>r(e),ariaLabelledBy:`review-status-filter-label`})]}),(0,V.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,V.jsx)(`span`,{id:`review-source-filter-label`,className:`text-xs font-semibold tracking-wide text-muted-foreground`,children:s(e,`review.source.title`)}),(0,V.jsx)(y,{tabs:I.map(t=>({id:t.id,label:s(e,t.labelKey)})),value:i,onChange:e=>o(e),ariaLabelledBy:`review-source-filter-label`})]})]}),(0,V.jsx)(`div`,{className:`pt-2`,children:u.isError||u.data&&!u.data.ok?(0,V.jsx)(D,{title:s(e,`review.inbox.loadError`),detail:(0,V.jsxs)(V.Fragment,{children:[s(e,`review.inbox.unavailable`),u.data?.error?(0,V.jsx)(`span`,{className:`mt-1 block text-xs opacity-75`,children:u.data.error}):null]})}):d.length?(0,V.jsx)(`div`,{className:`flex flex-col gap-3`,children:d.map(e=>(0,V.jsx)(L,{item:e,feedback:c[e.id],onAction:_},e.id))}):(0,V.jsx)(D,{title:s(e,`review.inbox.empty`),detail:n===`snoozed`?s(e,`review.inbox.emptySnoozed`):s(e,`review.inbox.emptyPending`)})})]})}var U=[{id:`review`,labelKey:`act.tab.review`},{id:`runs`,labelKey:`act.tab.runsHistory`}],W={runs:{titleKey:`act.title.runs`,copyKey:`act.copy.runs`},agents:{titleKey:`act.title.goals`,copyKey:`act.copy.goals`},workflows:{titleKey:`act.title.workflows`,copyKey:`act.copy.workflows`},hooks:{titleKey:`act.title.safeguards`,copyKey:`act.copy.safeguards`},tools:{titleKey:`act.title.permissions`,copyKey:`act.copy.permissions`}},G=[{id:`runs`,labelKey:`act.tab.runs`},{id:`agents`,labelKey:`act.tab.goals`},{id:`workflows`,labelKey:`act.tab.recipes`},{id:`hooks`,labelKey:`act.tab.safeguards`,advancedLabelKey:`act.tab.hooks`},{id:`tools`,labelKey:`act.tab.permissions`,advancedLabelKey:`act.tab.tools`}],K=B.lazy(()=>c(()=>import(`./RunsListPanel-Btf2DIrG.js`).then(e=>({default:e.RunsListPanel})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),q=B.lazy(()=>c(()=>import(`./WorkflowsPanel--nTFq3Cs.js`).then(e=>({default:e.WorkflowsPanel})),__vite__mapDeps([12,1,2,3,4,5,7,6,8,9,13,14,15,10,11])));function J({initialTab:e}){let t=p(e=>e.mode),n=p(e=>e.language),[r,a]=B.useState(()=>e===`agents`||e===`workflows`||e===`hooks`||e===`tools`?e:`runs`),[o,c]=B.useState(e===`runs`?`runs`:`review`);B.useEffect(()=>{e===`review`?(a(`runs`),c(`review`)):e===`runs`?(a(`runs`),c(`runs`)):G.some(t=>t.id===e)&&a(e)},[e]);let u=e=>{a(e),d(`/`+e)},f=e=>{c(e),d(e===`review`?`/review`:`/runs`)},{titleKey:m,copyKey:h}=W[r];return(0,V.jsxs)(`div`,{className:`product-page act-page space-y-5`,children:[(0,V.jsxs)(`header`,{className:`page-hero`,children:[(0,V.jsxs)(`div`,{className:`page-kicker`,children:[(0,V.jsx)(i,{className:`h-4 w-4`}),` `,s(n,`act.kicker`)]}),(0,V.jsx)(`h1`,{className:`page-title`,children:s(n,m)}),(0,V.jsx)(`p`,{className:`page-copy`,children:s(n,h)})]}),(0,V.jsx)(y,{tabs:(t===`basic`?G.filter(e=>e.id===`runs`||e.id===`agents`||e.id===`workflows`):G).map(e=>({id:e.id,label:s(n,t===`basic`||!e.advancedLabelKey?e.labelKey:e.advancedLabelKey)})),value:r,onChange:e=>u(e)}),r===`runs`?(0,V.jsx)(X,{subTab:o,onSubTabChange:f}):null,r===`agents`?(0,V.jsx)(Y,{}):null,r===`workflows`?(0,V.jsx)(l,{language:n,resetKey:`act-workflows`,children:(0,V.jsx)(q,{})}):null,r===`hooks`?(0,V.jsx)(Z,{}):null,r===`tools`?(0,V.jsx)(Q,{}):null]})}function Y(){let e=m(),t=p(e=>e.mode),n=p(e=>e.language),[i,o]=B.useState(``),c=a({queryKey:[`agentRuntime`],queryFn:f.agentRuntime}),l=a({queryKey:[`agentRegistry`],queryFn:f.agentRegistry,enabled:t!==`basic`}),d=a({queryKey:[`agentCapabilities`],queryFn:f.agentCapabilities,enabled:t!==`basic`}),g=r({mutationFn:()=>f.runAgent(i,[`planner`,`executor`,`reviewer`]),onSuccess:()=>e.invalidateQueries({queryKey:[`agentRuntime`]})}),[y,T]=B.useState(``),D=r({mutationFn:()=>f.registerAgent({name:y,type:`custom`,capabilities:[]}),onSuccess:()=>e.invalidateQueries({queryKey:[`agentRegistry`]})}),O=(c.data?.data||{}).runtime||{},k=!!O.ready,F=t===`basic`?s(n,`act.goal.modelRequired`):String(O.unavailable_reason||s(n,`act.runtime.modelUnavailable`)),I=!!i.trim()&&k&&!g.isPending;return(0,V.jsxs)(`div`,{className:`work-start-flow flex flex-col gap-4`,children:[(0,V.jsxs)(E,{className:`work-goal-card`,children:[(0,V.jsxs)(b,{children:[(0,V.jsxs)(_,{className:`flex items-center gap-2`,children:[(0,V.jsx)(h,{className:`h-4 w-4`}),` `,s(n,`act.goal.title`)]}),(0,V.jsx)(x,{children:s(n,`act.goal.description`)})]}),(0,V.jsxs)(C,{className:`space-y-3`,children:[(0,V.jsx)(P,{value:i,onChange:e=>o(e.target.value),placeholder:s(n,`act.goal.placeholder`)}),k?null:(0,V.jsx)(j,{variant:`warning`,children:F}),(0,V.jsxs)(M,{className:`w-full`,variant:k?`default`:`outline`,disabled:!I,onClick:()=>g.mutate(),children:[(0,V.jsx)(z,{className:`h-4 w-4`}),` `,k?s(n,`act.goal.start`):s(n,`act.goal.needsModel`)]}),g.data?(0,V.jsx)(v,{result:g.data,successLabel:s(n,`act.goal.completed`)}):null,g.data&&g.data?.data?(0,V.jsx)(`div`,{className:`text-xs text-emerald-600`,children:s(n,`act.goal.brainSaved`)}):null]})]}),t===`basic`?(0,V.jsxs)(`div`,{className:`work-safety-note`,children:[(0,V.jsx)(u,{className:`h-4 w-4`,"aria-hidden":`true`}),(0,V.jsx)(`span`,{children:s(n,`act.goal.safety`)})]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(w,{title:s(n,`act.panel.readiness`),result:c.data,children:e=>(0,V.jsx)(A,{value:e})}),(0,V.jsx)(w,{title:s(n,`act.panel.agentTeam`),result:l.data,children:e=>(0,V.jsxs)(`div`,{className:`space-y-3`,children:[(0,V.jsx)(S,{items:e.agents,titleKey:`name`,metaKey:`type`,labelPrefix:`act.agentRole`}),(0,V.jsxs)(`div`,{className:`flex gap-2`,children:[(0,V.jsx)(N,{value:y,onChange:e=>T(e.target.value),placeholder:s(n,`act.agent.namePlaceholder`)}),(0,V.jsx)(M,{disabled:!y.trim()||D.isPending,onClick:()=>D.mutate(),children:s(n,`act.agent.register`)})]})]})}),(0,V.jsx)(w,{title:s(n,`act.panel.capabilities`),result:d.data,children:e=>(0,V.jsx)(A,{value:e})})]})]})}function X({subTab:e,onSubTabChange:t}){let n=p(e=>e.language);return(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsx)(y,{tabs:U.map(e=>({id:e.id,label:s(n,e.labelKey)})),value:e,onChange:e=>t(e)}),e===`runs`?(0,V.jsx)(l,{language:n,resetKey:`act-runs`,children:(0,V.jsx)(K,{})}):(0,V.jsx)(H,{})]})}function Z(){let e=p(e=>e.mode),t=p(e=>e.language),n=a({queryKey:[`hooks`],queryFn:f.hooks}),r=a({queryKey:[`hookRuns`],queryFn:f.hookRuns});return e===`basic`?(0,V.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,V.jsx)(w,{title:s(t,`act.panel.safeguards`),result:n.data,children:e=>(0,V.jsx)(S,{items:e.hooks,titleKey:`name`,metaKey:`kind`})}),(0,V.jsx)(O,{title:s(t,`act.hooks.detailed`),detail:s(t,`act.hooks.detailedHint`)})]}):(0,V.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,V.jsx)(w,{title:s(t,`act.panel.hooks`),result:n.data,children:e=>(0,V.jsx)(S,{items:e.hooks,titleKey:`name`,metaKey:`kind`})}),(0,V.jsx)(w,{title:s(t,`act.panel.hookRuns`),result:r.data,children:e=>(0,V.jsx)(S,{items:e.runs,titleKey:`hook_id`,metaKey:`status`})}),(0,V.jsxs)(E,{children:[(0,V.jsxs)(b,{children:[(0,V.jsxs)(_,{className:`flex items-center gap-2`,children:[(0,V.jsx)(g,{className:`h-4 w-4`}),` `,s(t,`act.hooks.runManual`)]}),(0,V.jsx)(x,{children:s(t,`act.hooks.runManualHint`)})]}),(0,V.jsx)(C,{children:(0,V.jsx)(k,{label:s(t,`act.hooks.runAll`),action:()=>f.hookRun({event:`manual`}),invalidate:[`hookRuns`]})})]})]})}function Q(){let e=p(e=>e.language),t=a({queryKey:[`toolPermissions`],queryFn:f.toolPermissions});return(0,V.jsx)(w,{title:s(e,`act.panel.permissions`),result:t.data,children:e=>(0,V.jsx)(S,{items:e.permissions||e,titleKey:`tool`,metaKey:`risk`})})}export{J as ActPage};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,t as n}from"./jsx-runtime-CU_pEDDh.js";import"./workspace-DwNHbqaX.js";import{t as r}from"./useMutation-DhI3jqCN.js";import{A as i,H as a,R as o,S as s,c,k as l,p as u,r as d,s as f,v as p,z as m}from"./index-DpuEeYmP.js";import{n as h}from"./QueryClientProvider-CTiSBeU6.js";import{t as g}from"./arrow-left-Cp4NHbfX.js";import{t as _}from"./search-Cl2k5uhD.js";import{t as v}from"./button-_hHOhp7g.js";var y=o(`list-filter`,[[`path`,{d:`M2 5h20`,key:`1fs1ex`}],[`path`,{d:`M6 12h12`,key:`8npq4p`}],[`path`,{d:`M9 19h6`,key:`456am0`}]]),b=e(t()),x=n();function S({onBack:e}){let t=h(),n=m(e=>e.language),[a,o]=b.useState({q:``,actor:``,action:``,severity:``,limit:50}),{summaryQ:u,statsQ:_,usersQ:y,auditQ:S,securityQ:N,securityEventsQ:P,policiesQ:F,rolesQ:I,retentionQ:L,indexQ:R,agentRuntimeQ:z,toolRegistryQ:B,healthSummaryQ:V}=C(a),H=r({mutationFn:p.rebuildIndex,onSuccess:()=>void t.invalidateQueries({queryKey:[`indexStatus`]})}),U=c(y.data?.data),W=c(S.data?.data?.recent_events),G=c(P.data?.data?.events),K=c(F.data?.data?.policies),q=c(I.data?.data?.roles),J=L.data?.data||{},Y=V.data?.data||V.data,X=Y?.status===`attention`||typeof Y?.issue_count==`number`&&Y.issue_count>0;return(0,x.jsxs)(`main`,{className:`admin-console`,"aria-label":s(n,`admin.aria.console`),children:[(0,x.jsxs)(`header`,{className:`admin-console-header`,children:[(0,x.jsxs)(`button`,{className:`admin-back-button`,type:`button`,onClick:e,children:[(0,x.jsx)(g,{className:`h-4 w-4`}),s(n,`admin.back`)]}),(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`span`,{children:s(n,`admin.kicker`)}),(0,x.jsx)(`h1`,{children:s(n,`admin.title`)}),(0,x.jsx)(`p`,{children:s(n,`admin.body`)})]}),(0,x.jsx)(f,{compact:!0})]}),(0,x.jsxs)(`section`,{className:`admin-metrics-statement`,"aria-label":s(n,`admin.overview`),children:[(0,x.jsxs)(`div`,{className:`admin-metrics-statement-main`,children:[(0,x.jsx)(l,{className:`h-4 w-4 ${X?`is-warn`:`is-ok`}`}),(0,x.jsx)(`span`,{children:X?s(n,`admin.health.attention`,{count:String(Y?.issue_count||1)}):s(n,`admin.health.ok`)})]}),(0,x.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:s(n,`admin.summaryStatement`,{users:U.length,logs:W.length+G.length,security:k(N.data?.data,`status`)||(N.data?.ok?s(n,`admin.status.ready`):s(n,`admin.status.unavailable`)),index:k(R.data?.data,`status`)||(R.data?.ok?s(n,`admin.status.indexed`):s(n,`admin.status.unknown`))})})]}),(0,x.jsxs)(`section`,{className:`admin-accordion-list flex flex-col gap-4 mt-4`,children:[(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,open:!0,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.users`),` · `,s(n,`admin.panel.people`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-users`,children:(0,x.jsx)(E,{title:s(n,`admin.panel.users`),eyebrow:s(n,`admin.panel.people`),children:(0,x.jsx)(D,{items:U.slice(0,8),empty:s(n,`admin.empty.users`),render:e=>{let t=e;return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(`strong`,{children:M(t.name||t.email||t.id,s(n,`admin.fallback.localUser`))}),(0,x.jsx)(`span`,{children:M(t.role||t.status||t.workspace_id,s(n,`admin.fallback.member`))})]})}})})})]}),(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.roles`),` · `,s(n,`admin.panel.access`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-roles`,children:(0,x.jsx)(E,{title:s(n,`admin.panel.roles`),eyebrow:s(n,`admin.panel.access`),children:(0,x.jsx)(D,{items:q.slice(0,6),empty:s(n,`admin.empty.roles`),render:e=>{let t=e;return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`strong`,{children:[M(t.role,s(n,`admin.fallback.role`)),` · `,M(t.members,`0`),` `,s(n,`admin.metric.users`)]}),(0,x.jsx)(`span`,{children:c(t.caps).slice(0,4).map(e=>M(e,``)).filter(Boolean).join(`, `)||s(n,`admin.fallback.noCaps`)})]})}})})})]}),(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.logs`),` · `,s(n,`admin.panel.audit`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-logs`,children:(0,x.jsxs)(E,{title:s(n,`admin.panel.logs`),eyebrow:s(n,`admin.panel.audit`),children:[(0,x.jsx)(T,{language:n,filters:a,onChange:o,matched:S.data?.data?.filters}),(0,x.jsx)(D,{items:W.slice(0,8),empty:s(n,`admin.empty.audit`),render:e=>O(e,n)})]})})]}),(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.securityEvents`),` · `,s(n,`admin.panel.protection`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-security`,children:(0,x.jsx)(E,{title:s(n,`admin.panel.securityEvents`),eyebrow:s(n,`admin.panel.protection`),children:(0,x.jsx)(D,{items:G.slice(0,8),empty:s(n,`admin.empty.security`),render:e=>O(e,n)})})})]}),(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.brainOps`),` · `,s(n,`admin.panel.maintenance`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-brain-ops`,children:(0,x.jsxs)(E,{title:s(n,`admin.panel.brainOps`),eyebrow:s(n,`admin.panel.maintenance`),children:[(0,x.jsxs)(`div`,{className:`admin-operation`,children:[(0,x.jsxs)(`div`,{children:[(0,x.jsx)(`strong`,{children:A(R.data?.data,n)}),(0,x.jsx)(`span`,{children:j(u.data?.data)||j(_.data?.data)||s(n,`admin.brain.summaryFallback`)})]}),(0,x.jsxs)(v,{variant:`outline`,size:`sm`,disabled:H.isPending,onClick:()=>H.mutate(),children:[(0,x.jsx)(i,{className:`h-3.5 w-3.5`}),H.isPending?s(n,`admin.brain.rebuilding`):s(n,`admin.brain.rebuild`)]})]}),(0,x.jsxs)(`div`,{className:`admin-policy-strip`,children:[K.slice(0,5).map((e,t)=>{let r=e;return(0,x.jsx)(`span`,{children:M(r.label||r.name||r.id,s(n,`admin.policy.fallback`))},`${M(r.id||r.name,`policy`)}-${t}`)}),K.length?null:(0,x.jsx)(`span`,{children:s(n,`admin.policy.quiet`)})]}),(0,x.jsxs)(`div`,{className:`admin-retention`,children:[(0,x.jsx)(`strong`,{children:s(n,`admin.retention.days`,{days:M(J.retention_days,`90`)})}),(0,x.jsx)(`span`,{children:s(n,`admin.retention.detail`,{events:M(J.retained_events,`0`),candidates:M(J.prune_candidates,`0`)})})]})]})})]}),(0,x.jsxs)(`details`,{className:`admin-accordion-details border border-border rounded-lg bg-card p-4`,children:[(0,x.jsx)(`summary`,{className:`font-semibold text-base cursor-pointer mb-3`,children:(0,x.jsxs)(`h2`,{className:`inline font-semibold text-base`,children:[s(n,`admin.panel.runtimeTrust`),` · `,s(n,`admin.panel.contracts`)]})}),(0,x.jsx)(d,{surface:`panel`,resetKey:`admin-runtime`,children:(0,x.jsx)(E,{title:s(n,`admin.panel.runtimeTrust`),eyebrow:s(n,`admin.panel.contracts`),children:(0,x.jsx)(w,{runtime:z.data?.data,registry:B.data?.data,language:n})})})]})]})]})}function C(e){let t=b.useMemo(()=>({q:e.q||void 0,actor:e.actor||void 0,action:e.action||void 0,severity:e.severity||void 0,limit:e.limit}),[e]);return{summaryQ:a({queryKey:[`adminSummary`],queryFn:p.adminSummary}),statsQ:a({queryKey:[`adminStats`],queryFn:p.adminStats}),usersQ:a({queryKey:[`adminUsers`],queryFn:p.adminUsers}),auditQ:a({queryKey:[`adminAudit`,t],queryFn:()=>p.adminAudit(t)}),securityQ:a({queryKey:[`adminSecurity`],queryFn:p.adminSecurity}),securityEventsQ:a({queryKey:[`adminSecurityEvents`],queryFn:()=>p.adminSecurityEvents(50)}),policiesQ:a({queryKey:[`adminPolicies`],queryFn:p.adminPolicies}),rolesQ:a({queryKey:[`adminRoles`],queryFn:p.adminRoles}),retentionQ:a({queryKey:[`adminLogRetention`],queryFn:p.adminLogRetention}),indexQ:a({queryKey:[`indexStatus`],queryFn:p.indexStatus}),agentRuntimeQ:a({queryKey:[`agentRuntime`],queryFn:p.agentRuntime}),toolRegistryQ:a({queryKey:[`toolRegistryDiagnostics`],queryFn:p.toolRegistryDiagnostics}),healthSummaryQ:a({queryKey:[`adminHealthSummary`],queryFn:p.adminHealthSummary})}}function w({runtime:e,registry:t,language:n}){let r=e?.runtime||{},i=e?.health||{},a=t?.diagnostics||{},o=!!r.ready,c=!!a.ready,l=M(r.unavailable_reason,o?s(n,`admin.runtime.readyDetail`):s(n,`admin.runtime.blockedFallback`));return(0,x.jsxs)(`div`,{className:`admin-runtime-trust`,children:[(0,x.jsxs)(`div`,{className:`admin-runtime-row`,children:[(0,x.jsx)(`strong`,{children:s(n,`admin.runtime.agent`)}),(0,x.jsx)(`span`,{className:o?`is-ok`:`is-warn`,children:o?s(n,`admin.status.ready`):s(n,`admin.status.unavailable`)}),(0,x.jsx)(`small`,{children:l})]}),(0,x.jsxs)(`div`,{className:`admin-runtime-row`,children:[(0,x.jsx)(`strong`,{children:s(n,`admin.runtime.tools`)}),(0,x.jsx)(`span`,{className:c?`is-ok`:`is-warn`,children:c?s(n,`admin.runtime.aligned`):s(n,`admin.runtime.drift`)}),(0,x.jsx)(`small`,{children:s(n,`admin.runtime.toolCounts`,{registered:M(a.registered_tools,`0`),governed:M(a.governed_tools,`0`),described:M(a.described_tools,`0`)})})]}),(0,x.jsxs)(`div`,{className:`admin-policy-strip`,children:[(0,x.jsx)(`span`,{children:s(n,`admin.runtime.mode`,{mode:M(r.mode,`unknown`)})}),(0,x.jsx)(`span`,{children:s(n,`admin.runtime.execution`,{mode:M(r.execution_mode,`unknown`)})}),(0,x.jsx)(`span`,{children:s(n,`admin.runtime.health`,{status:M(i.status,`unknown`)})})]})]})}function T({filters:e,matched:t,onChange:n,language:r}){return(0,x.jsxs)(`div`,{className:`admin-log-filters`,"aria-label":s(r,`admin.filters.label`),children:[(0,x.jsxs)(`label`,{children:[(0,x.jsx)(_,{className:`h-3.5 w-3.5`}),(0,x.jsx)(`input`,{value:e.q,onChange:e=>n(t=>({...t,q:e.target.value})),placeholder:s(r,`admin.filters.search`),"aria-label":s(r,`admin.filters.searchAria`)})]}),(0,x.jsxs)(`label`,{children:[(0,x.jsx)(y,{className:`h-3.5 w-3.5`}),(0,x.jsxs)(`select`,{value:e.severity,onChange:e=>n(t=>({...t,severity:e.target.value})),"aria-label":s(r,`admin.filters.severityAria`),children:[(0,x.jsx)(`option`,{value:``,children:s(r,`admin.filters.all`)}),(0,x.jsx)(`option`,{value:`informational`,children:s(r,`admin.filters.informational`)}),(0,x.jsx)(`option`,{value:`notice`,children:s(r,`admin.filters.notice`)}),(0,x.jsx)(`option`,{value:`warning`,children:s(r,`admin.filters.warning`)}),(0,x.jsx)(`option`,{value:`high`,children:s(r,`admin.filters.high`)})]})]}),(0,x.jsx)(`span`,{children:s(r,`admin.filters.matched`,{count:M(t?.matched_events,`0`)})})]})}function E({eyebrow:e,title:t,children:n}){return(0,x.jsxs)(`section`,{className:`admin-panel`,children:[(0,x.jsxs)(`div`,{className:`admin-panel-head`,children:[(0,x.jsx)(`span`,{children:e}),(0,x.jsx)(`h2`,{children:t})]}),n]})}function D({items:e,empty:t,render:n}){return e.length?(0,x.jsx)(`div`,{className:`admin-list`,children:e.map((e,t)=>(0,x.jsx)(`div`,{className:`admin-list-row`,children:n(e)},t))}):(0,x.jsx)(`div`,{className:`admin-empty`,children:t})}function O(e,t){let n=M(e.action||e.event||e.type||e.name,s(t,`admin.log.event`)),r=M(e.actor||e.user||e.user_id||e.workspace_id,s(t,`admin.log.system`)),i=M(e.timestamp||e.time||e.created_at||e.ts,s(t,`admin.log.recently`));return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(`strong`,{children:n}),(0,x.jsxs)(`span`,{children:[r,` · `,i]})]})}function k(e,t){return N(u(e)?e:{},[t,`health`,`state`,`overall_status`])}function A(e,t){let n=u(e)?e:{},r=n.documents??n.document_count??n.docs,i=n.chunks??n.chunk_count??n.vectors;return r!==void 0||i!==void 0?`${M(r,`0`)} docs · ${M(i,`0`)} chunks`:N(n,[`message`,`detail`,`status`],s(t,`admin.index.ready`))}function j(e){return N(u(e)?e:{},[`summary`,`message`,`status`,`detail`])}function M(e,t=``){return typeof e==`string`&&e.trim()?e:typeof e==`number`&&Number.isFinite(e)?String(e):typeof e==`boolean`?e?`true`:`false`:t}function N(e,t,n=``){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t;if(typeof t==`number`&&Number.isFinite(t))return String(t)}return n}export{S as AdminConsole};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DigitalBrainExplorer-DTBRPYJ3.js","assets/jsx-runtime-CU_pEDDh.js","assets/brain-BzjoGgor.js","assets/index-DpuEeYmP.js","assets/QueryClientProvider-CTiSBeU6.js","assets/index-Dbb2YhYw.css","assets/useMutation-DhI3jqCN.js","assets/search-Cl2k5uhD.js","assets/primitives-1S-XCgmz.js","assets/circle-check-qG5dMahn.js","assets/button-_hHOhp7g.js","assets/input-BclQNHyj.js"])))=>i.map(i=>d[i]);
2
+ import{i as e,n as t,t as n}from"./jsx-runtime-CU_pEDDh.js";import"./brain-BzjoGgor.js";import"./workspace-DwNHbqaX.js";import{t as r}from"./useMutation-DhI3jqCN.js";import{H as i,R as a,S as o,b as s,c,d as l,g as u,h as d,i as f,m as p,o as m,p as h,v as g,z as _}from"./index-DpuEeYmP.js";import{n as v}from"./QueryClientProvider-CTiSBeU6.js";import{t as y}from"./arrow-left-Cp4NHbfX.js";import{O as b,i as x,k as S,r as C}from"./BrainSignals-gaNn5E4-.js";import{t as w}from"./search-Cl2k5uhD.js";import{t as T}from"./share-2-47_av_aF.js";import{_ as E,c as D,d as ee,g as O,h as k,i as te,l as ne,m as A,n as re,o as j,p as M,r as ie,t as N,v as ae,y as oe}from"./primitives-1S-XCgmz.js";import{t as P}from"./button-_hHOhp7g.js";import{t as F}from"./input-BclQNHyj.js";import{t as se}from"./textarea-DcLO52bu.js";var ce=a(`layers`,[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`,key:`zw3jo`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`,key:`1wduqc`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`,key:`kqbvx6`}]]),I=e(t()),L=[{id:`knowledge`,labelKey:`brain.group.knowledge`,token:`--knowledge`,fallback:`205 55% 66%`,types:[`topic`,`concept`,`entity`,`decision`,`insight`,`claim`,`fact`]},{id:`source`,labelKey:`brain.group.source`,token:`--library`,fallback:`195 45% 62%`,types:[`file`,`document`,`source`,`chunk`,`note`,`url`,`page`,`image`,`transcript`]},{id:`activity`,labelKey:`brain.group.activity`,token:`--act`,fallback:`30 66% 62%`,types:[`task`,`workflow`,`agent`,`run`,`approval`,`hook`]},{id:`memory`,labelKey:`brain.group.memory`,token:`--memory`,fallback:`168 48% 58%`,types:[`memory`,`conversation`,`message`,`chat`,`context`]},{id:`people`,labelKey:`brain.group.people`,token:`--connection`,fallback:`278 44% 72%`,types:[`person`,`user`,`team`,`organization`,`org`]},{id:`system`,labelKey:`brain.group.system`,token:`--fg-muted`,fallback:`46 8% 66%`,types:[`model`,`skill`,`plugin`,`setting`,`policy`,`device`,`storage`]},{id:`other`,labelKey:`brain.group.other`,token:`--fg`,fallback:`43 26% 94%`,types:[]}],le=/^(-?[\d.]+)[\s,]+([\d.]+)%[\s,]+([\d.]+)%$/,ue=`hsl(205, 55%, 66%)`;function R(e){let t=e.trim();if(!t)return null;let n=/^hsla?\(\s*(.+?)\s*\)$/i.exec(t)?.[1]??t,r=le.exec(n);return r?`hsl(${r[1]}, ${r[2]}%, ${r[3]}%)`:/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.test(t)||/^rgba?\(/i.test(t)?t:null}function z(e,t){return R(getComputedStyle(document.documentElement).getPropertyValue(e).trim())??R(t)??ue}function B(e){let t=q(e);return z(t.token,t.fallback)}function V(){return z(`--fg`,`43 26% 94%`)}var H=new Map(L.flatMap(e=>e.types.map(t=>[t,e.id]))),U=h;function W(e,t,n=``){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t;if(typeof t==`number`&&Number.isFinite(t))return String(t)}return n}function G(e,t){for(let n of t){let t=Number(e[n]);if(Number.isFinite(t))return t}return 0}function K(e,t){return U(e[t])?e[t]:{}}function de(e){return H.get(e.toLowerCase())||`other`}function q(e){return L.find(t=>t.id===e)||L[L.length-1]}function fe(e,t){let n=U(e)?e:{};U(n.data)&&(Array.isArray(n.data.nodes)||U(n.data.nodes))&&(n=n.data);let r=c(n.nodes),i=c(n.edges),a=new Set(r.map(e=>W(e,[`id`,`node_id`,`title`,`label`])).filter(Boolean)),s=i.flatMap((e,t)=>{let n=W(e,[`from`,`source`,`source_id`]),r=W(e,[`to`,`target`,`target_id`]);return!n||!r||!a.has(n)||!a.has(r)?[]:[{id:W(e,[`id`],`edge-${t}`),source:n,target:r,label:W(e,[`type`,`label`,`relationship`],`related`),weight:Math.max(.2,G(e,[`weight`,`score`,`confidence`])||1)}]}),l=new Map;s.forEach(e=>{l.set(e.source,(l.get(e.source)||0)+1),l.set(e.target,(l.get(e.target)||0)+1)});let u=Math.max(1,...Array.from(l.values())),f=r.flatMap(e=>{let t=W(e,[`id`,`node_id`,`title`,`label`]);if(!t)return[];let n=K(e,`metadata`),r=K(n,`graph_metrics`),i=W(e,[`type`,`kind`,`category`],`Node`),a=p(W(e,[`title`,`label`,`name`],``))||d(t,38),o=G(e,[`importance_norm`,`importance`,`score`])||G(r,[`importance_norm`,`importance`,`centrality`]),s=l.get(t)||0,c=Math.max(.08,Math.min(1,o||s/u*.8+.12)),f=p(W(e,[`summary`,`description`,`snippet`]))||p(W(n,[`summary`,`description`,`relative_path`,`filename`])),m=W(e,[`source`,`path`])||W(n,[`source`,`relative_path`,`filename`]),h=[t,a,i,f,m,Object.keys(n).join(` `)].join(` `).toLowerCase();return[{id:t,label:a,type:i,group:de(i),summary:f,source:m,importance:c,degree:s,searchText:h,raw:e}]}),m=new Map;return f.forEach(e=>m.set(e.group,(m.get(e.group)||0)+1)),{nodes:f,edges:s,groups:L.map(e=>({id:e.id,label:o(t,e.labelKey),color:B(e.id),count:m.get(e.id)||0,visibleCount:0,collapsed:!1})).filter(e=>e.count>0)}}function pe({graph:e,search:t,groupFilter:n,minImportance:r,collapsedGroups:i,selectedId:a,labelMode:o,maxNodes:s}){let c=t.trim().toLowerCase(),l=new Set;a&&!a.startsWith(`group:`)&&(l.add(a),e.edges.forEach(e=>{e.source===a&&l.add(e.target),e.target===a&&l.add(e.source)}));let u=e.nodes.filter(e=>n===`all`||e.group===n||e.type===n).filter(e=>c?e.searchText.includes(c):e.importance>=r).filter(e=>!l.size||l.has(e.id)).sort((e,t)=>t.importance+t.degree/25-(e.importance+e.degree/25)).slice(0,s),d=new Set(u.map(e=>e.id)),f=new Map,p=u.filter(t=>{if(!i.has(t.group))return!0;let n=q(t.group),r=e.groups.find(e=>e.id===t.group),a=`group:${t.group}`,o=f.get(a);return f.set(a,{id:a,group:{id:n.id,label:r?.label||n.id,color:B(n.id),count:0,visibleCount:0,collapsed:!0},count:(o?.count||0)+1,maxImportance:Math.max(o?.maxImportance||0,t.importance)}),!1}),m=new Set(p.map(e=>e.id)),h=new Set(f.keys()),g=e.edges.filter(e=>d.has(e.source)&&d.has(e.target)),_=g.flatMap((t,n)=>{let r=e.nodes.find(e=>e.id===t.source),i=e.nodes.find(e=>e.id===t.target),o=m.has(t.source)?t.source:r&&h.has(`group:${r.group}`)?`group:${r.group}`:``,s=m.has(t.target)?t.target:i&&h.has(`group:${i.group}`)?`group:${i.group}`:``;return!o||!s||o===s?[]:[{data:{id:`${t.id}-${n}-${o}-${s}`,source:o,target:s,label:t.label,width:Math.max(1,Math.min(4,t.weight))},classes:a&&(t.source===a||t.target===a)?`connected`:``}]}),v=p.map(t=>{let n=q(t.group),r=e.groups.find(e=>e.id===t.group),i=c&&t.searchText.includes(c),s=o===`off`?``:o===`all`||t.importance>.55||t.degree>1||i||a===t.id?t.label:``;return{data:{id:t.id,label:t.label,displayLabel:s,type:t.type,group:r?.label||n.id,color:B(n.id),borderColor:a===t.id?V():B(n.id),size:Math.round(20+t.importance*34+Math.min(t.degree,10)*2)},classes:[a===t.id?`selected`:``,i?`match`:``].filter(Boolean).join(` `)}}),y=Array.from(f.values()).map(e=>({data:{id:e.id,label:e.group.label,displayLabel:`${e.group.label} (${e.count})`,type:`Cluster`,group:e.group.label,color:e.group.color,borderColor:V(),size:Math.round(34+Math.min(e.count,28)*2+e.maxImportance*16)},classes:`cluster`})),b=new Map;p.forEach(e=>b.set(e.group,(b.get(e.group)||0)+1));let x=e.groups.map(e=>({...e,visibleCount:(b.get(e.id)||0)+(f.get(`group:${e.id}`)?.count||0),collapsed:i.has(e.id)}));return{...e,groups:x,elements:[...y,...v,..._],visibleNodes:p,visibleEdges:g,totalNodes:e.nodes.length,totalEdges:e.edges.length,hiddenByFilters:Math.max(0,e.nodes.length-u.length)}}function me(e,t){return t.find(t=>t.id===e.group)?.label||e.group}function he(e,t){let n=String(e||``),r=n.charAt(0).toUpperCase()+n.slice(1).toLowerCase();for(let e of[n,r]){let n=`ui.entity.${e}`,r=o(t,n);if(r!==n)return r}return u(n)}function J(e,t){let n=U(e.metadata)?e.metadata:{},r=String(e.source_type||e.type||e.kind||n.source_type||n.role||``).toLowerCase();return/chat|conversation|message/.test(r)?o(t,`brain.sources.type.chat`):/document|upload|file|pdf|markdown|text/.test(r)?o(t,`brain.sources.type.document`):/import|archive|restore/.test(r)?o(t,`brain.sources.type.import`):/manual|note/.test(r)?o(t,`brain.sources.type.manual`):o(t,`brain.sources.type.unknown`)}function Y(e){let t=U(e.metadata)?e.metadata:{},n=e.created_at||e.timestamp||e.updated_at||t.created_at||t.timestamp;return n?String(n):``}var X=n(),Z=I.lazy(()=>s(()=>import(`./DigitalBrainExplorer-DTBRPYJ3.js`).then(e=>({default:e.DigitalBrainExplorer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))),Q=[{id:`knowledge`,labelKey:`brain.tab.knowledge`},{id:`memory`,labelKey:`brain.tab.memory`}],ge={knowledge:`hybrid-search`,memory:`memory`,graph:`knowledge-graph`};function _e({initialTab:e}){_(e=>e.mode);let t=_(e=>e.language),[n,r]=I.useState(()=>$(e));I.useEffect(()=>{r($(e))},[e]);let a=e=>{r(e),m(`/`+ge[e])},s=i({queryKey:[`graph`],queryFn:g.graph}),c=i({queryKey:[`coverage`],queryFn:g.graphCoverage}),l=n===`graph`;return(0,X.jsxs)(`div`,{className:`product-page memory-page space-y-5`,children:[(0,X.jsxs)(`header`,{className:`brain-layer-header`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsxs)(`div`,{className:`page-kicker`,children:[(0,X.jsx)(S,{className:`h-4 w-4`}),` `,ye(t,n)]}),(0,X.jsx)(`h1`,{children:o(t,`brain.headline.${n}`)})]}),(0,X.jsx)(ve,{language:t,data:c.data?.data})]}),l?(0,X.jsxs)(`nav`,{className:`memory-subview-bar`,"aria-label":o(t,`brain.graph.subviewAria`),children:[(0,X.jsxs)(`button`,{type:`button`,className:`memory-subview-back`,onClick:()=>a(`knowledge`),children:[(0,X.jsx)(y,{className:`h-4 w-4`,"aria-hidden":`true`}),o(t,`brain.graph.back`)]}),(0,X.jsx)(`span`,{className:`memory-subview-title`,children:o(t,`brain.tab.graph`)})]}):(0,X.jsx)(ee,{tabs:Q.map(e=>({id:e.id,label:o(t,e.labelKey)})),value:n,onChange:e=>a(e)}),(0,X.jsx)(C,{language:t}),(0,X.jsx)(x,{language:t}),n===`knowledge`?(0,X.jsx)(be,{}):null,n===`memory`?(0,X.jsx)(xe,{}):null,l?s.isLoading?(0,X.jsx)(j,{title:o(t,`graph.deep.title`)}):s.data?.ok===!1?(0,X.jsx)(D,{result:s.data}):(0,X.jsx)(f,{language:t,resetKey:`brain-graph`,children:(0,X.jsx)(Z,{data:s.data?.data??s.data})}):(0,X.jsxs)(`button`,{type:`button`,className:`memory-map-entry`,"data-testid":`open-connections-map`,onClick:()=>a(`graph`),children:[(0,X.jsx)(T,{className:`h-4 w-4`,"aria-hidden":`true`}),(0,X.jsxs)(`span`,{className:`memory-map-entry-copy`,children:[(0,X.jsx)(`strong`,{children:o(t,`brain.graph.open`)}),(0,X.jsx)(`small`,{children:o(t,`brain.graph.openHint`)})]})]})]})}function $(e){return e===`graph`||e===`knowledge-graph`?`graph`:e===`memory`||e===`relationships`||e===`provenance`||e===`sources`||e===`portability`||e===`care`?`memory`:`knowledge`}function ve({language:e,data:t}){let n=Math.max(0,Math.round(Number(t?.total_nodes)||0)),r=Math.max(0,Math.round(Number(t?.nodes_with_provenance)||0));if(!n)return(0,X.jsxs)(`div`,{className:`brain-layer-meter`,children:[(0,X.jsx)(`span`,{children:o(e,`graph.coverage`)}),(0,X.jsx)(`strong`,{children:o(e,`graph.coverage.empty`)})]});let i=o(e,`graph.coverage.detail`,{covered:l(r),total:l(n)});return(0,X.jsxs)(`div`,{className:`brain-layer-meter`,title:i,children:[(0,X.jsx)(`span`,{children:o(e,`graph.coverage`)}),(0,X.jsx)(`strong`,{children:o(e,`graph.coverage.value`,{covered:l(r),total:l(n)})}),(0,X.jsx)(`small`,{children:i})]})}function ye(e,t){if(t===`graph`)return o(e,`brain.tab.graph`);let n=Q.find(e=>e.id===t)?.labelKey;return n?o(e,n):o(e,`brain.title`)}function be(){let e=_(e=>e.language),[t,n]=I.useState(``),i=r({mutationFn:()=>g.hybridSearch(t)});return(0,X.jsxs)(M,{children:[(0,X.jsxs)(O,{children:[(0,X.jsxs)(E,{className:`flex items-center gap-2`,children:[(0,X.jsx)(w,{className:`h-4 w-4`}),` `,o(e,`brain.search.title`)]}),(0,X.jsx)(k,{children:o(e,`brain.search.detail`)})]}),(0,X.jsxs)(A,{className:`space-y-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,X.jsx)(F,{placeholder:o(e,`brain.search.placeholder`),value:t,onChange:e=>n(e.target.value),onKeyDown:e=>e.key===`Enter`&&!e.nativeEvent.isComposing&&i.mutate()}),(0,X.jsx)(P,{onClick:()=>i.mutate(),disabled:!t.trim()||i.isPending,children:o(e,`brain.search.cta`)})]}),i.data?(0,X.jsx)(re,{title:o(e,`brain.search.results`),result:i.data,children:e=>(0,X.jsx)(te,{items:e.matches||e,titleKey:`title`,metaKey:`type`,limit:12})}):null]})]})}function xe(){let e=v(),t=_(e=>e.mode),n=_(e=>e.language),[a,s]=I.useState(``),[c,l]=I.useState(``),[u,d]=I.useState(`recall`),f=i({queryKey:[`memoryManager`],queryFn:g.memoryManager}),p=i({queryKey:[`provenance`],queryFn:()=>g.graphProvenance(80)}),m=i({queryKey:[`portability`],queryFn:g.graphPortability}),h=r({mutationFn:()=>g.memoryRecall(a,25)}),y=r({mutationFn:async()=>{try{return await g.graphImport(JSON.parse(c),!0)}catch(e){return{ok:!1,status:0,data:{},source:`unavailable`,error:e instanceof Error?e.message:String(e)}}},onSuccess:()=>e.invalidateQueries({queryKey:[`portability`]})}),x=U(f.data?.data)?f.data.data:{},S=U(m.data?.data)?m.data.data:{};U(S.stats)&&S.stats;let C=U(S.storage)?S.storage:{},w=U(x.usage)?x.usage:{},T=e=>d(t=>t===e?null:e);return(0,X.jsxs)(`div`,{className:`space-y-4`,children:[(0,X.jsx)(M,{children:(0,X.jsx)(A,{className:`py-4`,children:(0,X.jsx)(ne,{stats:t===`basic`?[{label:o(n,`brain.stats.sources`),value:w.sources??0},{label:o(n,`brain.stats.items`),value:w.total_items??0},{label:o(n,`brain.stats.savedWhere`),value:o(n,`brain.stats.savedWhere.local`)},{label:o(n,`brain.stats.exportable`),value:o(n,m.data?.ok?`brain.stats.exportable.yes`:`brain.stats.exportable.unknown`)}]:[{label:o(n,`brain.stats.sources`),value:w.sources??0},{label:o(n,`brain.stats.items`),value:w.total_items??0},{label:o(n,`brain.stats.format`),value:S.graph_schema_version||S.schema_version||`–`},{label:o(n,`brain.stats.storage`),value:C.engine||`–`}]})})}),(0,X.jsxs)(M,{children:[(0,X.jsxs)(O,{className:`cursor-pointer select-none`,onClick:()=>T(`recall`),children:[(0,X.jsxs)(E,{className:`flex items-center gap-2`,children:[(0,X.jsx)(oe,{className:`h-4 w-4`}),o(n,`brain.memory.recall.title`),(0,X.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground`,children:u===`recall`?`▲`:`▼`})]}),(0,X.jsx)(k,{children:o(n,`brain.memory.recall.detail`)})]}),u===`recall`&&(0,X.jsxs)(A,{className:`space-y-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,X.jsx)(F,{value:a,onChange:e=>s(e.target.value),onKeyDown:e=>e.key===`Enter`&&!e.nativeEvent.isComposing&&a.trim()&&h.mutate(),placeholder:o(n,`brain.memory.recall.placeholder`)}),(0,X.jsx)(P,{disabled:!a.trim()||h.isPending,onClick:()=>h.mutate(),children:o(n,`brain.memory.recall.action`)})]}),t!==`basic`&&(0,X.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,X.jsx)(N,{label:o(n,`brain.memory.compact`),action:()=>g.memoryCompact()}),(0,X.jsx)(N,{label:o(n,`brain.memory.rebuildVector`),action:()=>g.memoryRebuild()})]}),h.data?(0,X.jsx)(D,{result:h.data,successLabel:o(n,`brain.memory.recall.completed`)}):null]})]}),(0,X.jsxs)(M,{children:[(0,X.jsxs)(O,{className:`cursor-pointer select-none`,onClick:()=>T(`sources`),children:[(0,X.jsxs)(E,{className:`flex items-center gap-2`,children:[(0,X.jsx)(ce,{className:`h-4 w-4`}),o(n,`brain.sources.title`),(0,X.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground`,children:u===`sources`?`▲`:`▼`})]}),(0,X.jsx)(k,{children:o(n,`brain.sources.detail`)})]}),u===`sources`&&(0,X.jsx)(A,{className:`space-y-3`,children:p.isLoading?(0,X.jsx)(j,{title:o(n,`brain.sources.loading`)}):(0,X.jsx)(Se,{items:U(p.data?.data)?p.data.data.items||p.data.data:p.data,limit:10})})]}),(0,X.jsxs)(M,{children:[(0,X.jsxs)(O,{className:`cursor-pointer select-none`,onClick:()=>T(`backup`),children:[(0,X.jsxs)(E,{className:`flex items-center gap-2`,children:[(0,X.jsx)(b,{className:`h-4 w-4`}),o(n,`brain.portability.title`),(0,X.jsx)(`span`,{className:`ml-auto text-xs text-muted-foreground`,children:u===`backup`?`▲`:`▼`})]}),(0,X.jsx)(k,{children:o(n,`brain.portability.detail`)})]}),u===`backup`&&(0,X.jsxs)(A,{className:`space-y-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,X.jsx)(N,{label:o(n,`brain.portability.export`),action:()=>g.graphExport()}),(0,X.jsx)(N,{label:o(n,`brain.portability.backup`),action:()=>g.graphBackup()})]}),(0,X.jsx)(se,{value:c,onChange:e=>l(e.target.value),placeholder:o(n,`brain.portability.importPlaceholder`)}),(0,X.jsx)(P,{variant:`outline`,disabled:!c.trim()||y.isPending,onClick:()=>y.mutate(),children:o(n,`brain.portability.previewImport`)}),y.data?(0,X.jsx)(D,{result:y.data,successLabel:o(n,`brain.portability.importCompleted`)}):null]})]})]})}function Se({items:e,limit:t=8}){let n=_(e=>e.language),r=c(e).slice(0,t);return r.length?(0,X.jsx)(`div`,{className:`grid gap-2`,children:r.map((e,t)=>{let r=`brain.memoryTier.${String(e.id||``)}`,i=o(n,r),a=i===r?String(e.title||e.label||e.source_title||e.filename||e.path||e.source||o(n,`brain.sources.fallback`,{index:t+1})):i,s=String(e.path||e.source_path||e.source||e.conversation_id||``),c=J(e,n),l=Y(e);return(0,X.jsxs)(`div`,{className:`rounded-lg border border-border bg-background/55 p-3`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`div`,{className:`font-medium`,children:a}),(0,X.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[c,` · `,l||o(n,`brain.sources.createdUnknown`)]})]}),(0,X.jsx)(ae,{variant:`muted`,children:o(n,s?`brain.sources.inspectable`:`brain.sources.missingProvenance`)})]}),s?(0,X.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2 text-xs text-muted-foreground`,children:[(0,X.jsx)(`span`,{className:`break-all`,children:s}),(0,X.jsx)(P,{variant:`outline`,size:`sm`,onClick:()=>void navigator.clipboard?.writeText(s),children:o(n,`brain.sources.copy`)})]}):(0,X.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:o(n,`brain.sources.legacyMissing`)})]},String(e.id||e.source_id||a))})}):(0,X.jsx)(ie,{title:o(n,`brain.sources.empty`),detail:o(n,`brain.sources.emptyDetail`)})}export{_e as BrainPage,pe as a,J as i,me as n,fe as o,Y as r,z as s,he as t};