ltcai 2.2.7 → 3.1.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 (122) hide show
  1. package/README.md +72 -34
  2. package/docs/CHANGELOG.md +119 -0
  3. package/docs/V3_BACKEND_ARCHITECTURE.md +138 -0
  4. package/docs/V3_FRONTEND.md +139 -0
  5. package/knowledge_graph.py +649 -21
  6. package/latticeai/__init__.py +1 -1
  7. package/latticeai/api/admin.py +47 -0
  8. package/latticeai/api/agents.py +54 -31
  9. package/latticeai/api/auth.py +5 -2
  10. package/latticeai/api/chat.py +10 -2
  11. package/latticeai/api/search.py +240 -0
  12. package/latticeai/api/static_routes.py +11 -2
  13. package/latticeai/core/config.py +18 -0
  14. package/latticeai/core/embedding_providers.py +625 -0
  15. package/latticeai/core/local_embeddings.py +86 -0
  16. package/latticeai/core/workspace_os.py +1 -1
  17. package/latticeai/server_app.py +65 -1
  18. package/latticeai/services/agent_runtime.py +245 -0
  19. package/latticeai/services/search_service.py +346 -0
  20. package/package.json +13 -6
  21. package/scripts/build_v3_assets.mjs +164 -0
  22. package/scripts/capture/README.md +28 -0
  23. package/scripts/capture/capture_enterprise.js +8 -0
  24. package/scripts/capture/capture_graph.js +8 -0
  25. package/scripts/capture/capture_onboarding.js +8 -0
  26. package/scripts/capture/capture_page.js +43 -0
  27. package/scripts/capture/capture_release_media.js +125 -0
  28. package/scripts/capture/capture_skills.js +8 -0
  29. package/scripts/capture/capture_workspace.js +8 -0
  30. package/scripts/generate_diagrams.py +513 -0
  31. package/scripts/lint_v3.mjs +33 -0
  32. package/scripts/release-0.3.1.sh +105 -0
  33. package/scripts/take_screenshots.js +69 -0
  34. package/scripts/validate_release_artifacts.py +167 -0
  35. package/static/account.html +9 -9
  36. package/static/activity.html +4 -4
  37. package/static/admin.html +8 -8
  38. package/static/agents.html +4 -4
  39. package/static/chat.html +10 -10
  40. package/static/css/reference/account.css +137 -1
  41. package/static/css/reference/chat.css +31 -37
  42. package/static/css/responsive.css +42 -0
  43. package/static/css/tokens.5a595671.css +260 -0
  44. package/static/css/tokens.css +125 -130
  45. package/static/graph.html +9 -9
  46. package/static/manifest.json +3 -3
  47. package/static/plugins.html +4 -4
  48. package/static/scripts/account.js +4 -4
  49. package/static/scripts/chat.js +40 -8
  50. package/static/scripts/workspace.js +78 -0
  51. package/static/sw.js +3 -1
  52. package/static/v3/asset-manifest.json +47 -0
  53. package/static/v3/css/lattice.base.css +128 -0
  54. package/static/v3/css/lattice.base.e4cdd05d.css +128 -0
  55. package/static/v3/css/lattice.components.011e988b.css +447 -0
  56. package/static/v3/css/lattice.components.css +447 -0
  57. package/static/v3/css/lattice.shell.4920f42d.css +407 -0
  58. package/static/v3/css/lattice.shell.css +407 -0
  59. package/static/v3/css/lattice.tokens.c597ff81.css +132 -0
  60. package/static/v3/css/lattice.tokens.css +132 -0
  61. package/static/v3/css/lattice.views.3ee19d4e.css +277 -0
  62. package/static/v3/css/lattice.views.css +277 -0
  63. package/static/v3/index.html +69 -0
  64. package/static/v3/js/app.46fb61d9.js +26 -0
  65. package/static/v3/js/app.js +26 -0
  66. package/static/v3/js/core/api.22a41d42.js +344 -0
  67. package/static/v3/js/core/api.js +344 -0
  68. package/static/v3/js/core/components.4c83e0a9.js +222 -0
  69. package/static/v3/js/core/components.js +222 -0
  70. package/static/v3/js/core/dom.a2773eb0.js +148 -0
  71. package/static/v3/js/core/dom.js +148 -0
  72. package/static/v3/js/core/router.584570f2.js +37 -0
  73. package/static/v3/js/core/router.js +37 -0
  74. package/static/v3/js/core/routes.f935dd50.js +78 -0
  75. package/static/v3/js/core/routes.js +78 -0
  76. package/static/v3/js/core/shell.1b6199d6.js +363 -0
  77. package/static/v3/js/core/shell.js +363 -0
  78. package/static/v3/js/core/store.34ebd5e6.js +113 -0
  79. package/static/v3/js/core/store.js +113 -0
  80. package/static/v3/js/views/admin-audit.660a1fb1.js +185 -0
  81. package/static/v3/js/views/admin-audit.js +185 -0
  82. package/static/v3/js/views/admin-permissions.a7ae5f09.js +177 -0
  83. package/static/v3/js/views/admin-permissions.js +177 -0
  84. package/static/v3/js/views/admin-policies.3658fd86.js +102 -0
  85. package/static/v3/js/views/admin-policies.js +102 -0
  86. package/static/v3/js/views/admin-private-vpc.7d342d36.js +135 -0
  87. package/static/v3/js/views/admin-private-vpc.js +135 -0
  88. package/static/v3/js/views/admin-security.07c66b72.js +180 -0
  89. package/static/v3/js/views/admin-security.js +180 -0
  90. package/static/v3/js/views/admin-users.03bac88c.js +168 -0
  91. package/static/v3/js/views/admin-users.js +168 -0
  92. package/static/v3/js/views/agents.14e48bdd.js +193 -0
  93. package/static/v3/js/views/agents.js +193 -0
  94. package/static/v3/js/views/chat.718144ce.js +449 -0
  95. package/static/v3/js/views/chat.js +449 -0
  96. package/static/v3/js/views/files.4935197e.js +186 -0
  97. package/static/v3/js/views/files.js +186 -0
  98. package/static/v3/js/views/home.cdde3b32.js +119 -0
  99. package/static/v3/js/views/home.js +119 -0
  100. package/static/v3/js/views/hybrid-search.b22b97e0.js +195 -0
  101. package/static/v3/js/views/hybrid-search.js +195 -0
  102. package/static/v3/js/views/knowledge-graph.a14ea7e7.js +237 -0
  103. package/static/v3/js/views/knowledge-graph.js +237 -0
  104. package/static/v3/js/views/models.a1ffa147.js +256 -0
  105. package/static/v3/js/views/models.js +256 -0
  106. package/static/v3/js/views/my-computer.1b2ff621.js +237 -0
  107. package/static/v3/js/views/my-computer.js +237 -0
  108. package/static/v3/js/views/pipeline.c522f1ce.js +157 -0
  109. package/static/v3/js/views/pipeline.js +157 -0
  110. package/static/v3/js/views/settings.4f777210.js +250 -0
  111. package/static/v3/js/views/settings.js +250 -0
  112. package/static/workflows.html +4 -4
  113. package/static/workspace.css +340 -2
  114. package/static/workspace.html +43 -24
  115. package/docs/images/tmp_frames/frame_00.png +0 -0
  116. package/docs/images/tmp_frames/frame_01.png +0 -0
  117. package/docs/images/tmp_frames/frame_02.png +0 -0
  118. package/docs/images/tmp_frames/frame_03.png +0 -0
  119. package/docs/images/tmp_frames/hero_00.png +0 -0
  120. package/docs/images/tmp_frames/hero_01.png +0 -0
  121. package/docs/images/tmp_frames/hero_02.png +0 -0
  122. package/docs/images/tmp_frames/hero_03.png +0 -0
@@ -730,8 +730,7 @@ textarea {
730
730
 
731
731
  :root[data-lt-theme="dark"] main {
732
732
  background:
733
- radial-gradient(circle at 80% 14%, rgba(167, 139, 250, 0.12), transparent 30%),
734
- linear-gradient(180deg, var(--bg) 0%, #10122c 100%);
733
+ linear-gradient(180deg, var(--bg) 0%, var(--bg-soft) 100%);
735
734
  }
736
735
 
737
736
  :root[data-lt-theme="dark"] .workspace-band,
@@ -781,3 +780,342 @@ textarea {
781
780
  background: rgba(244, 113, 113, 0.16);
782
781
  color: #fca5a5;
783
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.7"></script>
7
+ <script src="/static/scripts/ux.js"></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.7">
13
- <link rel="stylesheet" href="/static/workspace.css?v=2.2.7">
14
- <link rel="stylesheet" href="/static/css/responsive.css?v=2.2.7">
12
+ <link rel="stylesheet" href="/static/css/tokens.css">
13
+ <link rel="stylesheet" href="/static/workspace.css">
14
+ <link rel="stylesheet" href="/static/css/responsive.css">
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=2.2.7"></script>
355
+ <script src="/static/scripts/workspace.js"></script>
337
356
  </body>
338
357
  </html>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file