ltcai 6.6.0 → 7.0.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.
- package/README.md +32 -36
- package/docs/CHANGELOG.md +50 -2
- package/frontend/src/App.tsx +78 -3
- package/frontend/src/api/client.ts +5 -0
- package/frontend/src/features/brain/BrainConversation.tsx +182 -2
- package/frontend/src/features/brain/BrainHome.tsx +108 -1
- package/frontend/src/features/brain/types.ts +13 -0
- package/frontend/src/i18n.ts +80 -0
- package/frontend/src/routes.ts +31 -17
- package/frontend/src/styles.css +295 -0
- package/lattice_brain/__init__.py +1 -1
- package/lattice_brain/runtime/multi_agent.py +1 -1
- package/latticeai/__init__.py +1 -1
- package/latticeai/core/marketplace.py +1 -1
- package/latticeai/core/workspace_os.py +1 -1
- package/package.json +1 -1
- package/scripts/brain_quality_eval.py +118 -0
- package/src-tauri/Cargo.lock +1 -1
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/tauri.conf.json +1 -1
- package/static/app/asset-manifest.json +84 -6
- package/static/app/assets/Act-DhLaHnrT.js +2 -0
- package/static/app/assets/Act-DhLaHnrT.js.map +1 -0
- package/static/app/assets/Brain-DS7NULyY.js +322 -0
- package/static/app/assets/Brain-DS7NULyY.js.map +1 -0
- package/static/app/assets/Capture-CAKouj52.js +2 -0
- package/static/app/assets/Capture-CAKouj52.js.map +1 -0
- package/static/app/assets/Library-B_hW4AwR.js +2 -0
- package/static/app/assets/Library-B_hW4AwR.js.map +1 -0
- package/static/app/assets/System-9OAoXWPz.js +2 -0
- package/static/app/assets/System-9OAoXWPz.js.map +1 -0
- package/static/app/assets/index-C-7aHabu.js +17 -0
- package/static/app/assets/index-C-7aHabu.js.map +1 -0
- package/static/app/assets/index-DKFpn5Kn.css +2 -0
- package/static/app/assets/primitives-DcO2H3yh.js +2 -0
- package/static/app/assets/primitives-DcO2H3yh.js.map +1 -0
- package/static/app/assets/textarea-DR2Tyy_6.js +2 -0
- package/static/app/assets/textarea-DR2Tyy_6.js.map +1 -0
- package/static/app/index.html +2 -2
- package/static/app/assets/index-C8toxDpv.css +0 -2
- package/static/app/assets/index-CbvcAQ6B.js +0 -16
- package/static/app/assets/index-CbvcAQ6B.js.map +0 -1
package/frontend/src/styles.css
CHANGED
|
@@ -964,6 +964,69 @@ body {
|
|
|
964
964
|
overflow: hidden;
|
|
965
965
|
}
|
|
966
966
|
|
|
967
|
+
.brain-shell-page {
|
|
968
|
+
position: relative;
|
|
969
|
+
z-index: 2;
|
|
970
|
+
height: 100vh;
|
|
971
|
+
overflow: auto;
|
|
972
|
+
padding: 0.9rem 1rem 2rem;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
.brain-shell-nav {
|
|
976
|
+
position: sticky;
|
|
977
|
+
top: 0.65rem;
|
|
978
|
+
z-index: 20;
|
|
979
|
+
display: flex;
|
|
980
|
+
flex-wrap: wrap;
|
|
981
|
+
justify-content: center;
|
|
982
|
+
gap: 0.45rem;
|
|
983
|
+
width: min(100%, 72rem);
|
|
984
|
+
margin: 0 auto 1rem;
|
|
985
|
+
border: 1px solid hsl(var(--border) / 0.66);
|
|
986
|
+
border-radius: 8px;
|
|
987
|
+
background: hsl(var(--surface-glass));
|
|
988
|
+
padding: 0.35rem;
|
|
989
|
+
backdrop-filter: blur(18px);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
.brain-shell-nav button {
|
|
993
|
+
min-height: 2.25rem;
|
|
994
|
+
border: 1px solid transparent;
|
|
995
|
+
border-radius: 6px;
|
|
996
|
+
background: transparent;
|
|
997
|
+
color: hsl(var(--fg-muted));
|
|
998
|
+
padding: 0 0.78rem;
|
|
999
|
+
font-size: 0.78rem;
|
|
1000
|
+
font-weight: 820;
|
|
1001
|
+
letter-spacing: 0;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
.brain-shell-nav button:hover,
|
|
1005
|
+
.brain-shell-nav button:focus-visible,
|
|
1006
|
+
.brain-shell-nav button.is-active {
|
|
1007
|
+
border-color: hsl(var(--brain-core) / 0.58);
|
|
1008
|
+
background: hsl(var(--brain-core) / 0.1);
|
|
1009
|
+
color: hsl(var(--fg));
|
|
1010
|
+
outline: none;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
.brain-shell-content {
|
|
1014
|
+
width: min(100%, 72rem);
|
|
1015
|
+
margin: 0 auto;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
.brain-shell-loader {
|
|
1019
|
+
min-height: 18rem;
|
|
1020
|
+
display: grid;
|
|
1021
|
+
place-items: center;
|
|
1022
|
+
border: 1px solid hsl(var(--border) / 0.58);
|
|
1023
|
+
border-radius: 8px;
|
|
1024
|
+
background: hsl(var(--surface-glass));
|
|
1025
|
+
color: hsl(var(--fg-muted));
|
|
1026
|
+
font-size: 0.82rem;
|
|
1027
|
+
font-weight: 760;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
967
1030
|
/* Subtle living field behind everything */
|
|
968
1031
|
.brain-field {
|
|
969
1032
|
position: fixed;
|
|
@@ -1238,6 +1301,7 @@ body {
|
|
|
1238
1301
|
display: flex;
|
|
1239
1302
|
align-items: center;
|
|
1240
1303
|
justify-content: space-between;
|
|
1304
|
+
flex-wrap: wrap;
|
|
1241
1305
|
gap: 0.75rem;
|
|
1242
1306
|
padding-bottom: 0.65rem;
|
|
1243
1307
|
color: hsl(var(--fg-muted));
|
|
@@ -1265,6 +1329,16 @@ body {
|
|
|
1265
1329
|
white-space: nowrap;
|
|
1266
1330
|
}
|
|
1267
1331
|
|
|
1332
|
+
.brain-flow-actions {
|
|
1333
|
+
display: flex;
|
|
1334
|
+
flex: 0 1 auto;
|
|
1335
|
+
flex-wrap: wrap;
|
|
1336
|
+
justify-content: flex-end;
|
|
1337
|
+
gap: 0.35rem;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
.brain-flow-actions button,
|
|
1341
|
+
.brain-model-pill,
|
|
1268
1342
|
.brain-admin-link {
|
|
1269
1343
|
display: inline-flex;
|
|
1270
1344
|
min-height: 2rem;
|
|
@@ -1282,6 +1356,15 @@ body {
|
|
|
1282
1356
|
transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
|
|
1283
1357
|
}
|
|
1284
1358
|
|
|
1359
|
+
.brain-model-pill {
|
|
1360
|
+
max-width: 13rem;
|
|
1361
|
+
overflow: hidden;
|
|
1362
|
+
text-overflow: ellipsis;
|
|
1363
|
+
white-space: nowrap;
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
.brain-flow-actions button:hover,
|
|
1367
|
+
.brain-flow-actions button:focus-visible,
|
|
1285
1368
|
.brain-admin-link:hover,
|
|
1286
1369
|
.brain-admin-link:focus-visible {
|
|
1287
1370
|
border-color: hsl(var(--brain-core) / 0.72);
|
|
@@ -1330,6 +1413,99 @@ body {
|
|
|
1330
1413
|
mask-image: linear-gradient(transparent, black 6%, black 92%, transparent);
|
|
1331
1414
|
}
|
|
1332
1415
|
|
|
1416
|
+
.brain-ingestion-panel {
|
|
1417
|
+
margin: 0 0 0.85rem;
|
|
1418
|
+
border: 1px solid hsl(var(--memory) / 0.34);
|
|
1419
|
+
border-radius: 8px;
|
|
1420
|
+
background: hsl(var(--memory) / 0.06);
|
|
1421
|
+
padding: 0.78rem;
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
.brain-ingestion-head {
|
|
1425
|
+
display: flex;
|
|
1426
|
+
align-items: baseline;
|
|
1427
|
+
justify-content: space-between;
|
|
1428
|
+
gap: 0.75rem;
|
|
1429
|
+
margin-bottom: 0.62rem;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
.brain-ingestion-head span {
|
|
1433
|
+
color: hsl(var(--fg-muted));
|
|
1434
|
+
font-size: 0.64rem;
|
|
1435
|
+
font-weight: 840;
|
|
1436
|
+
text-transform: uppercase;
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
.brain-ingestion-head strong {
|
|
1440
|
+
color: hsl(var(--fg));
|
|
1441
|
+
font-size: 0.9rem;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
.brain-ingestion-grid {
|
|
1445
|
+
display: grid;
|
|
1446
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
1447
|
+
gap: 0.55rem;
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
.brain-ingest-tile {
|
|
1451
|
+
display: grid;
|
|
1452
|
+
min-height: 5.8rem;
|
|
1453
|
+
cursor: pointer;
|
|
1454
|
+
align-content: start;
|
|
1455
|
+
gap: 0.28rem;
|
|
1456
|
+
border: 1px solid hsl(var(--border) / 0.55);
|
|
1457
|
+
border-radius: 8px;
|
|
1458
|
+
background: hsl(var(--surface) / 0.58);
|
|
1459
|
+
color: hsl(var(--fg));
|
|
1460
|
+
padding: 0.62rem;
|
|
1461
|
+
text-align: left;
|
|
1462
|
+
transition: border-color 150ms ease, background 150ms ease, transform 150ms ease;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
.brain-ingest-tile:hover,
|
|
1466
|
+
.brain-ingest-tile:focus-within {
|
|
1467
|
+
border-color: hsl(var(--memory) / 0.72);
|
|
1468
|
+
background: hsl(var(--memory) / 0.1);
|
|
1469
|
+
outline: none;
|
|
1470
|
+
transform: translateY(-1px);
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
.brain-ingest-tile.is-primary {
|
|
1474
|
+
border-color: hsl(var(--memory) / 0.5);
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
.brain-ingest-tile.is-disabled {
|
|
1478
|
+
cursor: wait;
|
|
1479
|
+
opacity: 0.68;
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
.brain-ingest-tile svg {
|
|
1483
|
+
color: hsl(var(--memory));
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
.brain-ingest-tile span {
|
|
1487
|
+
font-size: 0.78rem;
|
|
1488
|
+
font-weight: 820;
|
|
1489
|
+
line-height: 1.15;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
.brain-ingest-tile small {
|
|
1493
|
+
color: hsl(var(--fg-muted));
|
|
1494
|
+
font-size: 0.68rem;
|
|
1495
|
+
line-height: 1.2;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
.brain-ingest-tile input {
|
|
1499
|
+
width: 100%;
|
|
1500
|
+
min-width: 0;
|
|
1501
|
+
border: 1px solid hsl(var(--border) / 0.55);
|
|
1502
|
+
border-radius: 6px;
|
|
1503
|
+
background: hsl(var(--bg) / 0.45);
|
|
1504
|
+
color: hsl(var(--fg));
|
|
1505
|
+
padding: 0.38rem 0.44rem;
|
|
1506
|
+
font-size: 0.72rem;
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1333
1509
|
.brain-overview-panel {
|
|
1334
1510
|
margin: 0 0 1rem;
|
|
1335
1511
|
border: 1px solid hsl(var(--border) / 0.58);
|
|
@@ -1560,6 +1736,59 @@ body {
|
|
|
1560
1736
|
font-size: 0.76rem;
|
|
1561
1737
|
}
|
|
1562
1738
|
|
|
1739
|
+
.brain-model-demo {
|
|
1740
|
+
display: grid;
|
|
1741
|
+
grid-template-columns: minmax(0, 1fr) auto auto;
|
|
1742
|
+
align-items: center;
|
|
1743
|
+
gap: 0.58rem;
|
|
1744
|
+
margin: 0 0 1rem;
|
|
1745
|
+
border: 1px solid hsl(var(--knowledge) / 0.3);
|
|
1746
|
+
border-radius: 8px;
|
|
1747
|
+
background: hsl(var(--knowledge) / 0.06);
|
|
1748
|
+
padding: 0.66rem;
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
.brain-model-demo span {
|
|
1752
|
+
display: block;
|
|
1753
|
+
color: hsl(var(--fg-muted));
|
|
1754
|
+
font-size: 0.62rem;
|
|
1755
|
+
font-weight: 840;
|
|
1756
|
+
text-transform: uppercase;
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
.brain-model-demo strong,
|
|
1760
|
+
.brain-model-demo small {
|
|
1761
|
+
display: block;
|
|
1762
|
+
overflow: hidden;
|
|
1763
|
+
text-overflow: ellipsis;
|
|
1764
|
+
white-space: nowrap;
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
.brain-model-demo strong {
|
|
1768
|
+
font-size: 0.82rem;
|
|
1769
|
+
line-height: 1.2;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
.brain-model-demo small {
|
|
1773
|
+
color: hsl(var(--fg-muted));
|
|
1774
|
+
font-size: 0.72rem;
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
.brain-model-demo button {
|
|
1778
|
+
display: inline-flex;
|
|
1779
|
+
min-height: 2rem;
|
|
1780
|
+
align-items: center;
|
|
1781
|
+
gap: 0.35rem;
|
|
1782
|
+
border: 1px solid hsl(var(--knowledge) / 0.38);
|
|
1783
|
+
border-radius: 999px;
|
|
1784
|
+
background: hsl(var(--surface) / 0.72);
|
|
1785
|
+
color: hsl(var(--fg));
|
|
1786
|
+
padding: 0 0.64rem;
|
|
1787
|
+
font-size: 0.72rem;
|
|
1788
|
+
font-weight: 780;
|
|
1789
|
+
white-space: nowrap;
|
|
1790
|
+
}
|
|
1791
|
+
|
|
1563
1792
|
.brain-save-feedback {
|
|
1564
1793
|
display: grid;
|
|
1565
1794
|
grid-template-columns: auto minmax(0, 1fr);
|
|
@@ -1611,6 +1840,72 @@ body {
|
|
|
1611
1840
|
border-bottom-left-radius: 6px;
|
|
1612
1841
|
}
|
|
1613
1842
|
|
|
1843
|
+
.brain-answer-proof {
|
|
1844
|
+
display: grid;
|
|
1845
|
+
gap: 0.45rem;
|
|
1846
|
+
margin-top: 0.45rem;
|
|
1847
|
+
border: 1px solid hsl(var(--memory) / 0.34);
|
|
1848
|
+
border-radius: 8px;
|
|
1849
|
+
background: hsl(var(--memory) / 0.06);
|
|
1850
|
+
padding: 0.58rem;
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
.brain-answer-proof-head {
|
|
1854
|
+
display: flex;
|
|
1855
|
+
justify-content: space-between;
|
|
1856
|
+
gap: 0.6rem;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
.brain-answer-proof-head span,
|
|
1860
|
+
.brain-answer-proof li span {
|
|
1861
|
+
color: hsl(var(--fg-muted));
|
|
1862
|
+
font-size: 0.62rem;
|
|
1863
|
+
font-weight: 840;
|
|
1864
|
+
text-transform: uppercase;
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
.brain-answer-proof-head strong {
|
|
1868
|
+
overflow: hidden;
|
|
1869
|
+
color: hsl(var(--fg));
|
|
1870
|
+
font-size: 0.68rem;
|
|
1871
|
+
text-overflow: ellipsis;
|
|
1872
|
+
white-space: nowrap;
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
.brain-answer-proof ol {
|
|
1876
|
+
display: grid;
|
|
1877
|
+
gap: 0.35rem;
|
|
1878
|
+
margin: 0;
|
|
1879
|
+
padding: 0;
|
|
1880
|
+
list-style: none;
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
.brain-answer-proof li {
|
|
1884
|
+
display: grid;
|
|
1885
|
+
gap: 0.1rem;
|
|
1886
|
+
border: 1px solid hsl(var(--border) / 0.45);
|
|
1887
|
+
border-radius: 6px;
|
|
1888
|
+
background: hsl(var(--surface) / 0.48);
|
|
1889
|
+
padding: 0.44rem;
|
|
1890
|
+
}
|
|
1891
|
+
|
|
1892
|
+
.brain-answer-proof li strong,
|
|
1893
|
+
.brain-answer-proof li small {
|
|
1894
|
+
overflow: hidden;
|
|
1895
|
+
text-overflow: ellipsis;
|
|
1896
|
+
white-space: nowrap;
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
.brain-answer-proof li strong {
|
|
1900
|
+
font-size: 0.76rem;
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
.brain-answer-proof li small,
|
|
1904
|
+
.brain-answer-proof > small {
|
|
1905
|
+
color: hsl(var(--fg-muted));
|
|
1906
|
+
font-size: 0.7rem;
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1614
1909
|
@keyframes message-enter {
|
|
1615
1910
|
from { opacity: 0; transform: translateY(6px); }
|
|
1616
1911
|
to { opacity: 1; transform: none; }
|
|
@@ -19,7 +19,7 @@ from datetime import datetime
|
|
|
19
19
|
from typing import Any, Callable, Dict, List, Optional
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
MULTI_AGENT_VERSION = "
|
|
22
|
+
MULTI_AGENT_VERSION = "7.0.0"
|
|
23
23
|
|
|
24
24
|
AGENT_ROLES = ("researcher", "planner", "executor", "reviewer", "release")
|
|
25
25
|
CORE_PIPELINE = ("planner", "executor", "reviewer")
|
package/latticeai/__init__.py
CHANGED
|
@@ -19,7 +19,7 @@ from pathlib import Path
|
|
|
19
19
|
from typing import Any, Callable, Dict, Iterable, List, Optional
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
WORKSPACE_OS_VERSION = "
|
|
22
|
+
WORKSPACE_OS_VERSION = "7.0.0"
|
|
23
23
|
|
|
24
24
|
# Workspace types separate single-user Personal workspaces from shared
|
|
25
25
|
# Organization workspaces. Both keep the same local-first JSON store; the type
|
package/package.json
CHANGED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Deterministic Brain recall/KG quality gate for CI.
|
|
3
|
+
|
|
4
|
+
This is intentionally small and fixture-driven. It guards the product promise
|
|
5
|
+
that the first Brain loop can save context, recall it with source evidence, and
|
|
6
|
+
show model-independent proof without relying on a live model.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import tempfile
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from latticeai.services.memory_service import MemoryService
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class _EvalStore:
|
|
19
|
+
def __init__(self) -> None:
|
|
20
|
+
self.rows = [
|
|
21
|
+
{
|
|
22
|
+
"id": "decision:pricing",
|
|
23
|
+
"kind": "decision",
|
|
24
|
+
"content": "Use local-first memory as the product wedge for early access customers.",
|
|
25
|
+
"workspace_id": "personal",
|
|
26
|
+
"tags": ["strategy"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "note:first-loop",
|
|
30
|
+
"kind": "note",
|
|
31
|
+
"content": "The first five minute loop is add source, ask question, see Brain proof.",
|
|
32
|
+
"workspace_id": "personal",
|
|
33
|
+
"tags": ["onboarding"],
|
|
34
|
+
},
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
def list_memories(self, user_email=None, kind=None, workspace_id=None):
|
|
38
|
+
rows = [row for row in self.rows if kind is None or row["kind"] == kind]
|
|
39
|
+
if workspace_id is not None:
|
|
40
|
+
rows = [row for row in rows if (row.get("workspace_id") or "personal") == workspace_id]
|
|
41
|
+
return {"memories": rows}
|
|
42
|
+
|
|
43
|
+
def list_memory_snapshots(self, workspace_id=None, limit=50):
|
|
44
|
+
return {"snapshots": [{"snapshot_id": "eval-snapshot"}]}
|
|
45
|
+
|
|
46
|
+
def search_memories(self, q, user_email=None, limit=20, workspace_id=None):
|
|
47
|
+
terms = {term for term in (q or "").lower().split() if len(term) > 2}
|
|
48
|
+
rows = [
|
|
49
|
+
row for row in self.rows
|
|
50
|
+
if (workspace_id is None or (row.get("workspace_id") or "personal") == workspace_id)
|
|
51
|
+
and terms.intersection(row["content"].lower().split())
|
|
52
|
+
]
|
|
53
|
+
return {"memories": rows[:limit]}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class _EvalGraph:
|
|
57
|
+
def stats(self):
|
|
58
|
+
return {"nodes": {"Document": 1, "Decision": 1, "Topic": 1}, "edges": {"mentions": 2}}
|
|
59
|
+
|
|
60
|
+
def index_status(self):
|
|
61
|
+
return {"vector_counts": {"node": 3, "chunk": 2}}
|
|
62
|
+
|
|
63
|
+
def search(self, q, limit=20):
|
|
64
|
+
return {
|
|
65
|
+
"matches": [
|
|
66
|
+
{
|
|
67
|
+
"id": "doc:first-loop",
|
|
68
|
+
"type": "Document",
|
|
69
|
+
"title": "First Brain Loop",
|
|
70
|
+
"summary": "Users add a source, ask a question, and see proof with citations.",
|
|
71
|
+
"score": 0.94,
|
|
72
|
+
"metadata": {"source": "eval:first-loop.md", "workspace_id": "personal"},
|
|
73
|
+
}
|
|
74
|
+
][:limit]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _fail(message: str) -> int:
|
|
79
|
+
print(f"brain-quality-eval: FAIL: {message}", file=sys.stderr)
|
|
80
|
+
return 1
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def main() -> int:
|
|
84
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
85
|
+
service = MemoryService(
|
|
86
|
+
store=_EvalStore(),
|
|
87
|
+
data_dir=Path(tmp),
|
|
88
|
+
knowledge_graph=_EvalGraph(),
|
|
89
|
+
enable_graph=True,
|
|
90
|
+
)
|
|
91
|
+
proof = service.brain_proof(
|
|
92
|
+
recall_query="first five minute Brain proof",
|
|
93
|
+
user_email="eval@example.com",
|
|
94
|
+
workspace_id="personal",
|
|
95
|
+
active_model="eval-model-a",
|
|
96
|
+
limit=4,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
recall_items = proof.get("recall", {}).get("items", [])
|
|
100
|
+
if proof.get("model_continuity", {}).get("proven") is not True:
|
|
101
|
+
return _fail("model continuity proof must be true when durable evidence exists")
|
|
102
|
+
if proof.get("claims", {}).get("keeps_context_across_models") is not True:
|
|
103
|
+
return _fail("model-independent context claim must be backed by durable evidence")
|
|
104
|
+
if not recall_items:
|
|
105
|
+
return _fail("recall must return at least one memory or KG item")
|
|
106
|
+
if not any(str(item.get("source") or "").lower() in {"workspace", "graph"} for item in recall_items):
|
|
107
|
+
return _fail("recall items must expose a source for citation UI")
|
|
108
|
+
if proof.get("proofs", {}).get("graph_concepts", 0) < 1:
|
|
109
|
+
return _fail("KG concepts must be counted in Brain proof")
|
|
110
|
+
if proof.get("proofs", {}).get("vector_items", 0) < 1:
|
|
111
|
+
return _fail("vector items must be counted in Brain proof")
|
|
112
|
+
|
|
113
|
+
print("brain-quality-eval: OK")
|
|
114
|
+
return 0
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
raise SystemExit(main())
|
package/src-tauri/Cargo.lock
CHANGED
package/src-tauri/Cargo.toml
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "
|
|
2
|
+
"version": "7.0.0",
|
|
3
3
|
"generated_at": "vite",
|
|
4
4
|
"entrypoints": {
|
|
5
5
|
"app": "/static/app/index.html"
|
|
6
6
|
},
|
|
7
7
|
"assets": {
|
|
8
8
|
"../node_modules/@tauri-apps/api/core.js": "/static/app/assets/core-CwxXejkd.js",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"_primitives-DcO2H3yh.js": "/static/app/assets/primitives-DcO2H3yh.js",
|
|
10
|
+
"_textarea-DR2Tyy_6.js": "/static/app/assets/textarea-DR2Tyy_6.js",
|
|
11
|
+
"index.html": "/static/app/assets/index-C-7aHabu.js",
|
|
12
|
+
"assets/index-DKFpn5Kn.css": "/static/app/assets/index-DKFpn5Kn.css",
|
|
13
|
+
"src/pages/Act.tsx": "/static/app/assets/Act-DhLaHnrT.js",
|
|
14
|
+
"src/pages/Brain.tsx": "/static/app/assets/Brain-DS7NULyY.js",
|
|
15
|
+
"src/pages/Capture.tsx": "/static/app/assets/Capture-CAKouj52.js",
|
|
16
|
+
"src/pages/Library.tsx": "/static/app/assets/Library-B_hW4AwR.js",
|
|
17
|
+
"src/pages/System.tsx": "/static/app/assets/System-9OAoXWPz.js"
|
|
11
18
|
},
|
|
12
19
|
"vite": {
|
|
13
20
|
"../node_modules/@tauri-apps/api/core.js": {
|
|
@@ -16,16 +23,87 @@
|
|
|
16
23
|
"src": "../node_modules/@tauri-apps/api/core.js",
|
|
17
24
|
"isDynamicEntry": true
|
|
18
25
|
},
|
|
26
|
+
"_primitives-DcO2H3yh.js": {
|
|
27
|
+
"file": "assets/primitives-DcO2H3yh.js",
|
|
28
|
+
"name": "primitives",
|
|
29
|
+
"imports": [
|
|
30
|
+
"index.html"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"_textarea-DR2Tyy_6.js": {
|
|
34
|
+
"file": "assets/textarea-DR2Tyy_6.js",
|
|
35
|
+
"name": "textarea",
|
|
36
|
+
"imports": [
|
|
37
|
+
"index.html"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
19
40
|
"index.html": {
|
|
20
|
-
"file": "assets/index-
|
|
41
|
+
"file": "assets/index-C-7aHabu.js",
|
|
21
42
|
"name": "index",
|
|
22
43
|
"src": "index.html",
|
|
23
44
|
"isEntry": true,
|
|
24
45
|
"dynamicImports": [
|
|
25
|
-
"../node_modules/@tauri-apps/api/core.js"
|
|
46
|
+
"../node_modules/@tauri-apps/api/core.js",
|
|
47
|
+
"src/pages/Act.tsx",
|
|
48
|
+
"src/pages/Brain.tsx",
|
|
49
|
+
"src/pages/Capture.tsx",
|
|
50
|
+
"src/pages/Library.tsx",
|
|
51
|
+
"src/pages/System.tsx"
|
|
26
52
|
],
|
|
27
53
|
"css": [
|
|
28
|
-
"assets/index-
|
|
54
|
+
"assets/index-DKFpn5Kn.css"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"src/pages/Act.tsx": {
|
|
58
|
+
"file": "assets/Act-DhLaHnrT.js",
|
|
59
|
+
"name": "Act",
|
|
60
|
+
"src": "src/pages/Act.tsx",
|
|
61
|
+
"isDynamicEntry": true,
|
|
62
|
+
"imports": [
|
|
63
|
+
"index.html",
|
|
64
|
+
"_primitives-DcO2H3yh.js",
|
|
65
|
+
"_textarea-DR2Tyy_6.js"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"src/pages/Brain.tsx": {
|
|
69
|
+
"file": "assets/Brain-DS7NULyY.js",
|
|
70
|
+
"name": "Brain",
|
|
71
|
+
"src": "src/pages/Brain.tsx",
|
|
72
|
+
"isDynamicEntry": true,
|
|
73
|
+
"imports": [
|
|
74
|
+
"index.html",
|
|
75
|
+
"_primitives-DcO2H3yh.js",
|
|
76
|
+
"_textarea-DR2Tyy_6.js"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"src/pages/Capture.tsx": {
|
|
80
|
+
"file": "assets/Capture-CAKouj52.js",
|
|
81
|
+
"name": "Capture",
|
|
82
|
+
"src": "src/pages/Capture.tsx",
|
|
83
|
+
"isDynamicEntry": true,
|
|
84
|
+
"imports": [
|
|
85
|
+
"index.html",
|
|
86
|
+
"_primitives-DcO2H3yh.js"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"src/pages/Library.tsx": {
|
|
90
|
+
"file": "assets/Library-B_hW4AwR.js",
|
|
91
|
+
"name": "Library",
|
|
92
|
+
"src": "src/pages/Library.tsx",
|
|
93
|
+
"isDynamicEntry": true,
|
|
94
|
+
"imports": [
|
|
95
|
+
"index.html",
|
|
96
|
+
"_primitives-DcO2H3yh.js"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"src/pages/System.tsx": {
|
|
100
|
+
"file": "assets/System-9OAoXWPz.js",
|
|
101
|
+
"name": "System",
|
|
102
|
+
"src": "src/pages/System.tsx",
|
|
103
|
+
"isDynamicEntry": true,
|
|
104
|
+
"imports": [
|
|
105
|
+
"index.html",
|
|
106
|
+
"_primitives-DcO2H3yh.js"
|
|
29
107
|
]
|
|
30
108
|
}
|
|
31
109
|
}
|