ltcai 2.2.2 → 3.0.1

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 (78) hide show
  1. package/README.md +66 -27
  2. package/codex_telegram_bot.py +6 -2
  3. package/docs/CHANGELOG.md +154 -0
  4. package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
  5. package/docs/V3_FRONTEND.md +136 -0
  6. package/knowledge_graph.py +649 -21
  7. package/latticeai/__init__.py +1 -1
  8. package/latticeai/api/admin.py +47 -0
  9. package/latticeai/api/agents.py +54 -31
  10. package/latticeai/api/auth.py +1 -1
  11. package/latticeai/api/chat.py +10 -2
  12. package/latticeai/api/search.py +236 -0
  13. package/latticeai/api/static_routes.py +21 -2
  14. package/latticeai/core/config.py +16 -0
  15. package/latticeai/core/embedding_providers.py +502 -0
  16. package/latticeai/core/local_embeddings.py +86 -0
  17. package/latticeai/core/logging_safety.py +62 -0
  18. package/latticeai/core/workspace_os.py +1 -1
  19. package/latticeai/server_app.py +49 -1
  20. package/latticeai/services/agent_runtime.py +245 -0
  21. package/latticeai/services/search_service.py +346 -0
  22. package/package.json +8 -4
  23. package/static/account.html +9 -4
  24. package/static/activity.html +4 -4
  25. package/static/admin.html +8 -3
  26. package/static/agents.html +4 -4
  27. package/static/chat.html +16 -11
  28. package/static/css/reference/account.css +439 -0
  29. package/static/css/reference/admin.css +610 -0
  30. package/static/css/reference/base.css +1658 -0
  31. package/static/{lattice-reference.css → css/reference/chat.css} +271 -3633
  32. package/static/css/reference/graph.css +1016 -0
  33. package/static/css/responsive.css +248 -1
  34. package/static/css/tokens.css +132 -126
  35. package/static/favicon.ico +0 -0
  36. package/static/graph.html +9 -4
  37. package/static/manifest.json +3 -3
  38. package/static/platform.css +1 -1
  39. package/static/plugins.html +4 -4
  40. package/static/scripts/account.js +4 -4
  41. package/static/scripts/chat.js +227 -77
  42. package/static/scripts/workspace.js +78 -0
  43. package/static/sw.js +5 -3
  44. package/static/v3/css/lattice.base.css +128 -0
  45. package/static/v3/css/lattice.components.css +447 -0
  46. package/static/v3/css/lattice.shell.css +407 -0
  47. package/static/v3/css/lattice.tokens.css +132 -0
  48. package/static/v3/css/lattice.views.css +277 -0
  49. package/static/v3/index.html +40 -0
  50. package/static/v3/js/app.js +26 -0
  51. package/static/v3/js/core/api.js +327 -0
  52. package/static/v3/js/core/components.js +215 -0
  53. package/static/v3/js/core/dom.js +148 -0
  54. package/static/v3/js/core/fixtures.js +171 -0
  55. package/static/v3/js/core/router.js +37 -0
  56. package/static/v3/js/core/routes.js +73 -0
  57. package/static/v3/js/core/shell.js +363 -0
  58. package/static/v3/js/core/store.js +113 -0
  59. package/static/v3/js/views/admin-audit.js +185 -0
  60. package/static/v3/js/views/admin-permissions.js +178 -0
  61. package/static/v3/js/views/admin-policies.js +103 -0
  62. package/static/v3/js/views/admin-private-vpc.js +138 -0
  63. package/static/v3/js/views/admin-security.js +181 -0
  64. package/static/v3/js/views/admin-users.js +168 -0
  65. package/static/v3/js/views/agents.js +194 -0
  66. package/static/v3/js/views/chat.js +450 -0
  67. package/static/v3/js/views/files.js +180 -0
  68. package/static/v3/js/views/home.js +119 -0
  69. package/static/v3/js/views/hybrid-search.js +195 -0
  70. package/static/v3/js/views/knowledge-graph.js +238 -0
  71. package/static/v3/js/views/models.js +247 -0
  72. package/static/v3/js/views/my-computer.js +237 -0
  73. package/static/v3/js/views/pipeline.js +161 -0
  74. package/static/v3/js/views/settings.js +258 -0
  75. package/static/workflows.html +4 -4
  76. package/static/workspace.css +408 -14
  77. package/static/workspace.html +43 -24
  78. package/telegram_bot.py +18 -14
@@ -5,6 +5,7 @@
5
5
  --bg: var(--lt-bg, #f6f7f9);
6
6
  --surface: var(--lt-surface, #ffffff);
7
7
  --surface-2: var(--lt-surface-2, #f0f4f8);
8
+ --input: var(--lt-input, var(--surface));
8
9
  --ink: var(--lt-ink, #101828);
9
10
  --muted: var(--lt-muted, #667085);
10
11
  --line: var(--lt-line, #d9e0e8);
@@ -199,8 +200,8 @@ h2 {
199
200
  }
200
201
 
201
202
  .secondary-action {
202
- background: #e6efff;
203
- color: #174ea6;
203
+ background: var(--accent-soft, #e6efff);
204
+ color: var(--blue);
204
205
  padding: 0 12px;
205
206
  font-weight: 700;
206
207
  }
@@ -317,7 +318,7 @@ h2 {
317
318
 
318
319
  .list-item {
319
320
  border: 1px solid var(--line);
320
- background: #fbfcfe;
321
+ background: var(--surface-2);
321
322
  border-radius: 8px;
322
323
  padding: 12px;
323
324
  display: grid;
@@ -354,8 +355,9 @@ h2 {
354
355
  .tag {
355
356
  font-size: 11px;
356
357
  font-weight: 800;
357
- color: #344054;
358
- background: #edf2f7;
358
+ color: var(--ink);
359
+ background: var(--surface-2);
360
+ border: 1px solid var(--line);
359
361
  border-radius: 999px;
360
362
  padding: 3px 8px;
361
363
  }
@@ -373,7 +375,7 @@ input, select, textarea {
373
375
  border: 1px solid var(--line);
374
376
  border-radius: 8px;
375
377
  color: var(--ink);
376
- background: #fff;
378
+ background: var(--input);
377
379
  min-height: 38px;
378
380
  padding: 9px 10px;
379
381
  }
@@ -468,7 +470,7 @@ textarea {
468
470
  top: 3px;
469
471
  left: 3px;
470
472
  border-radius: 50%;
471
- background: white;
473
+ background: var(--surface);
472
474
  transition: transform 160ms ease;
473
475
  }
474
476
 
@@ -597,10 +599,10 @@ textarea {
597
599
  .quickswitch-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
598
600
  .switch-chip {
599
601
  display: inline-flex; align-items: center; gap: 6px;
600
- border: 1px solid var(--line); background: #fbfcfe; color: var(--ink);
602
+ border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
601
603
  border-radius: 999px; padding: 6px 12px; font-weight: 700; font-size: 13px; cursor: pointer;
602
604
  }
603
- .switch-chip.active { border-color: var(--blue); background: #eef2ff; color: var(--blue); }
605
+ .switch-chip.active { border-color: var(--blue); background: var(--accent-soft, #eef2ff); color: var(--blue); }
604
606
 
605
607
  /* Entity explorer */
606
608
  .entity-card { text-align: left; cursor: pointer; width: 100%; font: inherit; }
@@ -615,10 +617,10 @@ textarea {
615
617
  /* Skill marketplace tabs */
616
618
  .tab-bar { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
617
619
  .tab {
618
- border: 1px solid var(--line); background: #fbfcfe; color: var(--muted);
620
+ border: 1px solid var(--line); background: var(--surface-2); color: var(--muted);
619
621
  border-radius: 999px; padding: 6px 14px; font-weight: 700; font-size: 13px; cursor: pointer;
620
622
  }
621
- .tab.active { border-color: var(--blue); background: #eef2ff; color: var(--blue); }
623
+ .tab.active { border-color: var(--blue); background: var(--accent-soft, #eef2ff); color: var(--blue); }
622
624
  .tab-count {
623
625
  display: inline-block; min-width: 16px; padding: 0 5px; margin-left: 4px;
624
626
  border-radius: 999px; background: var(--red); color: #fff; font-size: 11px;
@@ -633,7 +635,7 @@ textarea {
633
635
  }
634
636
  .capability-card {
635
637
  display: flex; align-items: center; gap: 10px;
636
- border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; background: #fbfcfe;
638
+ border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; background: var(--surface-2);
637
639
  }
638
640
  .capability-card i { font-size: 18px; }
639
641
  .capability-card.off i { color: var(--muted); }
@@ -650,7 +652,7 @@ textarea {
650
652
  min-width: 0;
651
653
  border: 1px solid var(--line);
652
654
  border-radius: 8px;
653
- background: #fbfcfe;
655
+ background: var(--surface-2);
654
656
  padding: 14px;
655
657
  display: grid;
656
658
  gap: 7px;
@@ -691,7 +693,7 @@ textarea {
691
693
  .skill-progress-track {
692
694
  height: 7px;
693
695
  border-radius: 999px;
694
- background: #e5eaf2;
696
+ background: var(--surface-3, var(--surface-2));
695
697
  overflow: hidden;
696
698
  }
697
699
  .skill-progress-track span {
@@ -725,3 +727,395 @@ textarea {
725
727
  .small-action { min-height: 44px; }
726
728
  .workspace-rail a { min-height: 44px; display: flex; align-items: center; }
727
729
  }
730
+
731
+ :root[data-lt-theme="dark"] main {
732
+ background:
733
+ linear-gradient(180deg, var(--bg) 0%, var(--bg-soft) 100%);
734
+ }
735
+
736
+ :root[data-lt-theme="dark"] .workspace-band,
737
+ :root[data-lt-theme="dark"] .workspace-panel,
738
+ :root[data-lt-theme="dark"] .metric-card {
739
+ background: rgba(22, 22, 58, 0.92);
740
+ border-color: rgba(160, 170, 230, 0.22);
741
+ box-shadow: 0 18px 44px rgba(0, 0, 0, 0.38);
742
+ }
743
+
744
+ :root[data-lt-theme="dark"] input,
745
+ :root[data-lt-theme="dark"] select,
746
+ :root[data-lt-theme="dark"] textarea,
747
+ :root[data-lt-theme="dark"] .list-item,
748
+ :root[data-lt-theme="dark"] .health-card,
749
+ :root[data-lt-theme="dark"] .capability-card,
750
+ :root[data-lt-theme="dark"] .switch-chip,
751
+ :root[data-lt-theme="dark"] .tab,
752
+ :root[data-lt-theme="dark"] .tag {
753
+ background: rgba(255, 255, 255, 0.06);
754
+ border-color: rgba(160, 170, 230, 0.22);
755
+ color: var(--ink);
756
+ }
757
+
758
+ :root[data-lt-theme="dark"] input::placeholder,
759
+ :root[data-lt-theme="dark"] textarea::placeholder {
760
+ color: rgba(226, 232, 255, 0.48);
761
+ }
762
+
763
+ :root[data-lt-theme="dark"] .status-pill,
764
+ :root[data-lt-theme="dark"] .workspace-role-pill {
765
+ background: rgba(255, 255, 255, 0.10);
766
+ color: var(--blue);
767
+ }
768
+
769
+ :root[data-lt-theme="dark"] .status-complete {
770
+ background: rgba(52, 211, 153, 0.16);
771
+ color: #86efac;
772
+ }
773
+
774
+ :root[data-lt-theme="dark"] .status-running {
775
+ background: rgba(251, 191, 36, 0.16);
776
+ color: #fbbf24;
777
+ }
778
+
779
+ :root[data-lt-theme="dark"] .status-failed {
780
+ background: rgba(244, 113, 113, 0.16);
781
+ color: #fca5a5;
782
+ }
783
+
784
+ /* ── Product shell redesign (frontend-only) ─────────────────────────────── */
785
+ .workspace-page {
786
+ background: var(--bg);
787
+ color: var(--ink);
788
+ }
789
+
790
+ .workspace-page::before {
791
+ content: "";
792
+ position: fixed;
793
+ inset: 0;
794
+ pointer-events: none;
795
+ background:
796
+ linear-gradient(90deg, rgba(12, 92, 115, 0.035) 1px, transparent 1px),
797
+ linear-gradient(180deg, rgba(12, 92, 115, 0.035) 1px, transparent 1px);
798
+ background-size: 36px 36px;
799
+ mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.4), transparent 72%);
800
+ }
801
+
802
+ .workspace-shell {
803
+ grid-template-columns: minmax(240px, 284px) minmax(0, 1fr);
804
+ background: var(--app-bg);
805
+ }
806
+
807
+ .workspace-rail {
808
+ background: var(--rail-bg);
809
+ color: var(--rail-ink);
810
+ border-right: 1px solid var(--rail-line);
811
+ box-shadow: none;
812
+ overflow-y: auto;
813
+ scrollbar-gutter: stable;
814
+ }
815
+
816
+ .rail-brand {
817
+ min-height: 48px;
818
+ border-radius: 8px;
819
+ background: rgba(255, 255, 255, 0.06);
820
+ border: 1px solid var(--rail-line);
821
+ }
822
+
823
+ .rail-brand span {
824
+ line-height: 1;
825
+ }
826
+
827
+ .rail-brand small {
828
+ margin-left: auto;
829
+ color: var(--rail-ink-soft);
830
+ font-size: 10px;
831
+ font-weight: 800;
832
+ text-transform: uppercase;
833
+ letter-spacing: 0.08em;
834
+ }
835
+
836
+ .rail-section-label {
837
+ color: var(--rail-ink-soft);
838
+ display: block;
839
+ font-size: 10px;
840
+ font-weight: 900;
841
+ letter-spacing: 0.1em;
842
+ padding: 8px 12px 4px;
843
+ text-transform: uppercase;
844
+ }
845
+
846
+ .workspace-rail nav a,
847
+ .rail-links a {
848
+ border: 1px solid transparent;
849
+ min-height: 42px;
850
+ }
851
+
852
+ .workspace-rail nav a.active,
853
+ .workspace-rail nav a:hover,
854
+ .rail-links a:hover {
855
+ background: var(--rail-hover);
856
+ border-color: var(--rail-line);
857
+ }
858
+
859
+ .workspace-shell:not([data-admin-available="true"]) .admin-navigation {
860
+ display: none;
861
+ }
862
+
863
+ main {
864
+ gap: 16px;
865
+ padding: 20px clamp(16px, 2vw, 28px) 36px;
866
+ }
867
+
868
+ .workspace-topbar {
869
+ position: sticky;
870
+ top: 0;
871
+ z-index: 4;
872
+ margin: -20px calc(clamp(16px, 2vw, 28px) * -1) 0;
873
+ padding: 16px clamp(16px, 2vw, 28px);
874
+ background: color-mix(in srgb, var(--surface-elevated) 94%, transparent);
875
+ border-bottom: 1px solid var(--line);
876
+ backdrop-filter: blur(18px);
877
+ }
878
+
879
+ .topbar-subtitle {
880
+ color: var(--muted);
881
+ font-size: 13px;
882
+ line-height: 1.45;
883
+ margin: 6px 0 0;
884
+ max-width: 760px;
885
+ }
886
+
887
+ .top-actions {
888
+ flex-wrap: wrap;
889
+ justify-content: flex-end;
890
+ min-width: min(100%, 560px);
891
+ }
892
+
893
+ .global-mode-switcher {
894
+ display: inline-grid;
895
+ grid-auto-flow: column;
896
+ grid-auto-columns: minmax(76px, 1fr);
897
+ gap: 2px;
898
+ padding: 3px;
899
+ border: 1px solid var(--line);
900
+ border-radius: 8px;
901
+ background: var(--surface-2);
902
+ }
903
+
904
+ .global-mode-switcher button {
905
+ min-height: 34px;
906
+ border-radius: 6px;
907
+ background: transparent;
908
+ color: var(--muted);
909
+ font-size: 12px;
910
+ font-weight: 800;
911
+ padding: 0 10px;
912
+ }
913
+
914
+ .global-mode-switcher button.active {
915
+ background: var(--accent);
916
+ color: #fff;
917
+ }
918
+
919
+ .global-mode-switcher button:disabled {
920
+ cursor: not-allowed;
921
+ opacity: 0.45;
922
+ }
923
+
924
+ .chrome-select {
925
+ width: auto;
926
+ min-width: 108px;
927
+ min-height: 38px;
928
+ color: var(--ink);
929
+ background: var(--surface);
930
+ }
931
+
932
+ .workspace-switcher {
933
+ background: var(--surface);
934
+ border-color: var(--line);
935
+ color: var(--ink);
936
+ }
937
+
938
+ .workspace-switcher select {
939
+ color: var(--ink);
940
+ max-width: min(220px, 36vw);
941
+ }
942
+
943
+ .workspace-role-pill {
944
+ color: var(--muted);
945
+ opacity: 1;
946
+ }
947
+
948
+ .metric-grid {
949
+ grid-template-columns: repeat(4, minmax(150px, 1fr));
950
+ }
951
+
952
+ .metric-card,
953
+ .workspace-panel,
954
+ .workspace-band {
955
+ background: var(--surface);
956
+ border-color: var(--line);
957
+ border-radius: 8px;
958
+ box-shadow: none;
959
+ }
960
+
961
+ .metric-card {
962
+ border-left: 3px solid var(--accent);
963
+ }
964
+
965
+ .metric-card i,
966
+ .health-card i {
967
+ color: var(--accent-2);
968
+ }
969
+
970
+ .workspace-band,
971
+ .workspace-panel {
972
+ padding: 18px;
973
+ }
974
+
975
+ .section-head {
976
+ border-bottom: 1px solid var(--line);
977
+ margin: -2px 0 14px;
978
+ padding-bottom: 12px;
979
+ }
980
+
981
+ .eyebrow {
982
+ color: var(--accent);
983
+ }
984
+
985
+ .primary-action {
986
+ background: var(--accent);
987
+ }
988
+
989
+ .secondary-action,
990
+ .tab.active,
991
+ .switch-chip.active {
992
+ background: var(--accent-soft);
993
+ color: var(--accent);
994
+ border-color: color-mix(in srgb, var(--accent) 34%, var(--line));
995
+ }
996
+
997
+ .icon-action,
998
+ .small-action,
999
+ .step-chip,
1000
+ .tab,
1001
+ .switch-chip,
1002
+ .list-item,
1003
+ .health-card,
1004
+ .capability-card {
1005
+ background: var(--surface-2);
1006
+ border-color: var(--line);
1007
+ }
1008
+
1009
+ .list-item,
1010
+ .health-card,
1011
+ .capability-card {
1012
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);
1013
+ }
1014
+
1015
+ :root[data-lt-theme="dark"] .list-item,
1016
+ :root[data-lt-theme="dark"] .health-card,
1017
+ :root[data-lt-theme="dark"] .capability-card {
1018
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
1019
+ }
1020
+
1021
+ .status-pill {
1022
+ background: var(--accent-soft);
1023
+ color: var(--accent);
1024
+ }
1025
+
1026
+ .status-complete {
1027
+ background: color-mix(in srgb, var(--success) 16%, transparent);
1028
+ color: var(--success);
1029
+ }
1030
+
1031
+ .status-running {
1032
+ background: color-mix(in srgb, var(--warning) 18%, transparent);
1033
+ color: var(--warning);
1034
+ }
1035
+
1036
+ .status-failed {
1037
+ background: color-mix(in srgb, var(--danger) 16%, transparent);
1038
+ color: var(--danger);
1039
+ }
1040
+
1041
+ .importance-bar {
1042
+ background: var(--surface-3);
1043
+ }
1044
+
1045
+ .importance-bar span,
1046
+ .skill-progress-track span {
1047
+ background: linear-gradient(90deg, var(--accent), var(--accent-2));
1048
+ }
1049
+
1050
+ .code-box,
1051
+ .state-box,
1052
+ .toast {
1053
+ background: #101820;
1054
+ border-color: rgba(148, 163, 184, 0.22);
1055
+ }
1056
+
1057
+ @media (min-width: 1600px) {
1058
+ main {
1059
+ max-width: 1680px;
1060
+ width: 100%;
1061
+ }
1062
+
1063
+ .metric-grid,
1064
+ .health-grid {
1065
+ grid-template-columns: repeat(4, minmax(180px, 1fr));
1066
+ }
1067
+ }
1068
+
1069
+ @media (max-width: 1180px) {
1070
+ .workspace-topbar {
1071
+ align-items: flex-start;
1072
+ flex-direction: column;
1073
+ }
1074
+
1075
+ .top-actions {
1076
+ justify-content: flex-start;
1077
+ width: 100%;
1078
+ }
1079
+ }
1080
+
1081
+ @media (max-width: 860px) {
1082
+ .workspace-shell {
1083
+ grid-template-columns: 1fr;
1084
+ }
1085
+
1086
+ .workspace-rail {
1087
+ position: relative;
1088
+ height: auto;
1089
+ max-height: none;
1090
+ }
1091
+
1092
+ .workspace-rail nav,
1093
+ .rail-links {
1094
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1095
+ }
1096
+
1097
+ .rail-section-label,
1098
+ .rail-brand {
1099
+ grid-column: 1 / -1;
1100
+ }
1101
+
1102
+ .workspace-topbar {
1103
+ position: static;
1104
+ margin-top: 0;
1105
+ }
1106
+
1107
+ .global-mode-switcher {
1108
+ grid-auto-columns: minmax(88px, 1fr);
1109
+ width: 100%;
1110
+ }
1111
+
1112
+ .workspace-switcher,
1113
+ .chrome-select,
1114
+ .primary-action {
1115
+ width: 100%;
1116
+ }
1117
+
1118
+ .workspace-switcher select {
1119
+ max-width: none;
1120
+ }
1121
+ }
@@ -4,58 +4,77 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content">
6
6
  <title>Lattice AI Workspace OS</title>
7
- <script src="/static/scripts/ux.js?v=2.2.2"></script>
7
+ <script src="/static/scripts/ux.js?v=3.0.0"></script>
8
8
  <link rel="manifest" href="/manifest.json">
9
9
  <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32.png">
10
10
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap">
11
11
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
12
- <link rel="stylesheet" href="/static/css/tokens.css?v=2.2.2">
13
- <link rel="stylesheet" href="/static/workspace.css?v=2.2.2">
14
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.2">
12
+ <link rel="stylesheet" href="/static/css/tokens.css?v=3.0.0">
13
+ <link rel="stylesheet" href="/static/workspace.css?v=3.0.0">
14
+ <link rel="stylesheet" href="/static/css/responsive.css?v=3.0.0">
15
15
  </head>
16
- <body>
17
- <div class="workspace-shell">
16
+ <body class="workspace-page">
17
+ <div class="workspace-shell" data-workspace-mode="basic">
18
18
  <aside class="workspace-rail">
19
19
  <a class="rail-brand" href="/workspace" aria-label="Lattice AI Workspace OS">
20
20
  <img src="/static/icons/icon-192.png" alt="">
21
21
  <span>Lattice AI</span>
22
+ <small>Workspace OS</small>
22
23
  </a>
23
- <nav>
24
- <a class="active" href="#overview"><i class="ti ti-layout-dashboard"></i><span>Overview</span></a>
25
- <a href="#health"><i class="ti ti-heartbeat"></i><span>Health</span></a>
26
- <a href="#graph"><i class="ti ti-chart-dots-3"></i><span>Graph</span></a>
27
- <a href="#graph-explorer"><i class="ti ti-affiliate"></i><span>Explorer</span></a>
28
- <a href="#snapshots"><i class="ti ti-stack-2"></i><span>Snapshots</span></a>
29
- <a href="#memory"><i class="ti ti-book-2"></i><span>Memory</span></a>
30
- <a href="#agents"><i class="ti ti-route-alt-left"></i><span>Agents</span></a>
31
- <a href="#workflows"><i class="ti ti-git-branch"></i><span>Workflow</span></a>
32
- <a href="#skills"><i class="ti ti-puzzle"></i><span>Skills</span></a>
33
- <a href="#timeline"><i class="ti ti-timeline-event"></i><span>Timeline</span></a>
34
- <a href="#enterprise"><i class="ti ti-building-skyscraper"></i><span>Editions</span></a>
24
+ <nav aria-label="Primary workspace navigation">
25
+ <span class="rail-section-label">Primary</span>
26
+ <a class="active" href="#overview"><i class="ti ti-home"></i><span>Home</span></a>
27
+ <a href="/chat"><i class="ti ti-message-circle"></i><span>Chat</span></a>
28
+ <a href="/graph"><i class="ti ti-chart-dots-3"></i><span>Knowledge Graph</span></a>
29
+ <a href="#memory"><i class="ti ti-files"></i><span>Files</span></a>
30
+ <a href="#workflows"><i class="ti ti-git-branch"></i><span>Pipeline</span></a>
31
+ <a href="#memory"><i class="ti ti-device-desktop"></i><span>My Computer</span></a>
32
+ <a href="#graph-explorer"><i class="ti ti-search"></i><span>Search</span></a>
33
+ <a href="/chat?new=1"><i class="ti ti-plus"></i><span>New Chat</span></a>
34
+ </nav>
35
+ <nav class="admin-navigation" aria-label="Administration navigation">
36
+ <span class="rail-section-label">Admin</span>
37
+ <a href="/admin#users" data-admin-link><i class="ti ti-users"></i><span>User Management</span></a>
38
+ <a href="/admin#permissions" data-admin-link><i class="ti ti-key"></i><span>Permissions</span></a>
39
+ <a href="/admin#audit" data-admin-link><i class="ti ti-report-search"></i><span>Audit Logs</span></a>
40
+ <a href="/admin#security" data-admin-link><i class="ti ti-shield-check"></i><span>Security</span></a>
41
+ <a href="/admin#security" data-admin-link><i class="ti ti-radar"></i><span>Sensitive Data</span></a>
42
+ <a href="/admin#enterprise" data-admin-link><i class="ti ti-building-skyscraper"></i><span>Org Policies</span></a>
43
+ <a href="/admin#enterprise" data-admin-link><i class="ti ti-cloud-lock"></i><span>Private VPC</span></a>
35
44
  </nav>
36
45
  <div class="rail-links">
46
+ <span class="rail-section-label">Runtime</span>
37
47
  <a href="/plugins/sdk"><i class="ti ti-plug"></i><span>Plugins</span></a>
38
48
  <a href="/workflows"><i class="ti ti-sitemap"></i><span>Designer</span></a>
39
49
  <a href="/agents"><i class="ti ti-robot"></i><span>Agents</span></a>
40
50
  <a href="/activity"><i class="ti ti-broadcast"></i><span>Activity</span></a>
41
- <a href="/chat"><i class="ti ti-message-circle"></i><span>Chat</span></a>
42
- <a href="/graph"><i class="ti ti-network"></i><span>Graph Canvas</span></a>
43
- <a href="/admin"><i class="ti ti-shield-lock"></i><span>Admin</span></a>
44
51
  </div>
45
52
  </aside>
46
53
 
47
54
  <main>
48
55
  <header class="workspace-topbar" id="overview">
49
56
  <div>
50
- <div class="eyebrow">AI Workspace OS</div>
51
- <h1>Workspace Command Center</h1>
57
+ <div class="eyebrow">Local-first AI Workspace</div>
58
+ <h1>Home</h1>
59
+ <p class="topbar-subtitle">Coordinate chat, graph context, files, pipelines, local models, and organization controls from one workspace surface.</p>
52
60
  </div>
53
61
  <div class="top-actions">
62
+ <div class="global-mode-switcher" role="tablist" aria-label="Workspace mode">
63
+ <button type="button" class="active" data-workspace-mode="basic" role="tab" aria-selected="true">Basic</button>
64
+ <button type="button" data-workspace-mode="advanced" role="tab" aria-selected="false">Advanced</button>
65
+ <button type="button" data-workspace-mode="admin" role="tab" aria-selected="false">Admin</button>
66
+ </div>
54
67
  <div class="workspace-switcher" title="Active workspace">
55
68
  <i class="ti ti-building-community"></i>
56
69
  <select id="workspace-select" aria-label="Active workspace"></select>
57
70
  <span class="workspace-role-pill" id="workspace-role"></span>
58
71
  </div>
72
+ <select class="chrome-select" id="workspace-language" aria-label="Language">
73
+ <option value="en">English</option>
74
+ <option value="ko">한국어</option>
75
+ </select>
76
+ <a class="icon-action" href="/account" title="User profile" aria-label="User profile"><i class="ti ti-user"></i></a>
77
+ <button class="icon-action" id="workspace-logout" title="Logout" aria-label="Logout"><i class="ti ti-logout"></i></button>
59
78
  <button class="icon-action" id="new-org-btn" title="New organization workspace"><i class="ti ti-plus"></i></button>
60
79
  <button class="icon-action" id="refresh-btn" title="Refresh"><i class="ti ti-refresh"></i></button>
61
80
  <button class="primary-action" id="snapshot-now"><i class="ti ti-device-floppy"></i><span>Snapshot</span></button>
@@ -333,6 +352,6 @@
333
352
  </div>
334
353
 
335
354
  <div class="toast" id="toast"></div>
336
- <script src="/static/scripts/workspace.js?v=1.7.0"></script>
355
+ <script src="/static/scripts/workspace.js?v=3.0.0"></script>
337
356
  </body>
338
357
  </html>