ltcai 7.0.0 → 7.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 (61) hide show
  1. package/README.md +20 -20
  2. package/docs/CHANGELOG.md +23 -0
  3. package/frontend/src/App.tsx +80 -0
  4. package/frontend/src/api/client.ts +6 -0
  5. package/frontend/src/components/AdminAccessGate.tsx +70 -0
  6. package/frontend/src/components/BrainConversation.tsx +232 -8
  7. package/frontend/src/components/FeedbackState.tsx +45 -0
  8. package/frontend/src/components/WorkspaceProfileSwitcher.tsx +176 -0
  9. package/frontend/src/components/onboarding/AnalysisScreen.tsx +20 -12
  10. package/frontend/src/components/onboarding/InstallScreen.tsx +55 -0
  11. package/frontend/src/components/onboarding/RecommendationScreen.tsx +55 -5
  12. package/frontend/src/components/onboarding/recommendationModel.ts +59 -2
  13. package/frontend/src/features/brain/BrainConversation.tsx +232 -19
  14. package/frontend/src/features/brain/BrainGraphLayer.tsx +258 -25
  15. package/frontend/src/features/brain/BrainHome.tsx +193 -1
  16. package/frontend/src/features/brain/brainData.ts +25 -1
  17. package/frontend/src/features/brain/graphLayout.ts +12 -1
  18. package/frontend/src/features/brain/types.ts +41 -0
  19. package/frontend/src/i18n.ts +304 -0
  20. package/frontend/src/store/appStore.ts +15 -0
  21. package/frontend/src/styles.css +1130 -0
  22. package/lattice_brain/__init__.py +1 -1
  23. package/lattice_brain/runtime/multi_agent.py +1 -1
  24. package/latticeai/__init__.py +1 -1
  25. package/latticeai/api/workspace.py +59 -0
  26. package/latticeai/core/marketplace.py +1 -1
  27. package/latticeai/core/workspace_os.py +1 -1
  28. package/package.json +1 -1
  29. package/src-tauri/Cargo.lock +1 -1
  30. package/src-tauri/Cargo.toml +1 -1
  31. package/src-tauri/tauri.conf.json +1 -1
  32. package/static/app/asset-manifest.json +28 -28
  33. package/static/app/assets/Act-BHEb8bAM.js +2 -0
  34. package/static/app/assets/{Act-DhLaHnrT.js.map → Act-BHEb8bAM.js.map} +1 -1
  35. package/static/app/assets/Brain-yvR7xkrV.js +322 -0
  36. package/static/app/assets/Brain-yvR7xkrV.js.map +1 -0
  37. package/static/app/assets/{Capture-CAKouj52.js → Capture-BrAmsSEH.js} +2 -2
  38. package/static/app/assets/{Capture-CAKouj52.js.map → Capture-BrAmsSEH.js.map} +1 -1
  39. package/static/app/assets/Library-BOVzYfxI.js +2 -0
  40. package/static/app/assets/{Library-B_hW4AwR.js.map → Library-BOVzYfxI.js.map} +1 -1
  41. package/static/app/assets/System-D4WaN4kj.js +2 -0
  42. package/static/app/assets/System-D4WaN4kj.js.map +1 -0
  43. package/static/app/assets/index-BOB-W1FZ.js +17 -0
  44. package/static/app/assets/index-BOB-W1FZ.js.map +1 -0
  45. package/static/app/assets/{index-DKFpn5Kn.css → index-DvLsGy-z.css} +1 -1
  46. package/static/app/assets/primitives-C3_BfUb8.js +2 -0
  47. package/static/app/assets/primitives-C3_BfUb8.js.map +1 -0
  48. package/static/app/assets/textarea-CbvhHvzg.js +2 -0
  49. package/static/app/assets/{textarea-DR2Tyy_6.js.map → textarea-CbvhHvzg.js.map} +1 -1
  50. package/static/app/index.html +2 -2
  51. package/static/app/assets/Act-DhLaHnrT.js +0 -2
  52. package/static/app/assets/Brain-DS7NULyY.js +0 -322
  53. package/static/app/assets/Brain-DS7NULyY.js.map +0 -1
  54. package/static/app/assets/Library-B_hW4AwR.js +0 -2
  55. package/static/app/assets/System-9OAoXWPz.js +0 -2
  56. package/static/app/assets/System-9OAoXWPz.js.map +0 -1
  57. package/static/app/assets/index-C-7aHabu.js +0 -17
  58. package/static/app/assets/index-C-7aHabu.js.map +0 -1
  59. package/static/app/assets/primitives-DcO2H3yh.js +0 -2
  60. package/static/app/assets/primitives-DcO2H3yh.js.map +0 -1
  61. package/static/app/assets/textarea-DR2Tyy_6.js +0 -2
@@ -1906,6 +1906,71 @@ body {
1906
1906
  font-size: 0.7rem;
1907
1907
  }
1908
1908
 
1909
+ /* === Track: Chat inline source citations + a11y === */
1910
+ .brain-message-cited {
1911
+ display: grid;
1912
+ gap: 0.5rem;
1913
+ }
1914
+
1915
+ .brain-message-text {
1916
+ line-height: 1.55;
1917
+ }
1918
+
1919
+ .citation-chip {
1920
+ display: inline-flex;
1921
+ align-items: center;
1922
+ margin-left: 0.18rem;
1923
+ border: 1px solid hsl(var(--memory) / 0.4);
1924
+ border-radius: 4px;
1925
+ background: hsl(var(--memory) / 0.18);
1926
+ padding: 0.04rem 0.34rem;
1927
+ color: hsl(var(--fg));
1928
+ font-size: 0.66rem;
1929
+ font-weight: 700;
1930
+ line-height: 1.1;
1931
+ vertical-align: super;
1932
+ cursor: pointer;
1933
+ user-select: none;
1934
+ transition: background 0.12s ease, border-color 0.12s ease, outline-color 0.12s ease;
1935
+ }
1936
+
1937
+ .citation-chip:hover {
1938
+ border-color: hsl(var(--memory) / 0.6);
1939
+ background: hsl(var(--memory) / 0.28);
1940
+ }
1941
+
1942
+ .citation-chip:focus-visible {
1943
+ outline: 2px solid hsl(var(--memory) / 0.8);
1944
+ outline-offset: 1px;
1945
+ }
1946
+
1947
+ .citation-chip.is-active {
1948
+ border-color: hsl(var(--memory) / 0.7);
1949
+ background: hsl(var(--memory) / 0.35);
1950
+ }
1951
+
1952
+ .brain-answer-proof li.is-cited {
1953
+ border-left: 3px solid hsl(var(--memory) / 0.8);
1954
+ background: hsl(var(--memory) / 0.12);
1955
+ }
1956
+
1957
+ .brain-answer-proof li[tabindex]:focus-visible {
1958
+ outline: 2px solid hsl(var(--memory) / 0.7);
1959
+ outline-offset: 1px;
1960
+ }
1961
+
1962
+ .brain-citation-score {
1963
+ color: hsl(var(--memory));
1964
+ font-weight: 700;
1965
+ }
1966
+
1967
+ .brain-citation-tip {
1968
+ color: hsl(var(--fg-muted));
1969
+ font-size: 0.66rem;
1970
+ font-style: italic;
1971
+ }
1972
+ /* === End track: Chat inline source citations + a11y === */
1973
+
1909
1974
  @keyframes message-enter {
1910
1975
  from { opacity: 0; transform: translateY(6px); }
1911
1976
  to { opacity: 1; transform: none; }
@@ -2635,6 +2700,267 @@ body {
2635
2700
  color: hsl(var(--fg-muted));
2636
2701
  }
2637
2702
 
2703
+ /* ============================================================
2704
+ Track: Knowledge Graph intuitiveness
2705
+ (search typeahead + match highlight, type/time filters,
2706
+ focus/dim on neighbors). Token-native, additive only.
2707
+ ============================================================ */
2708
+
2709
+ .brain-graph-search-wrap {
2710
+ position: relative;
2711
+ width: min(100%, 16rem);
2712
+ }
2713
+
2714
+ .brain-graph-search-wrap .brain-graph-search {
2715
+ width: 100%;
2716
+ }
2717
+
2718
+ .brain-graph-search-clear {
2719
+ display: grid;
2720
+ place-items: center;
2721
+ flex: 0 0 auto;
2722
+ width: 1.15rem;
2723
+ height: 1.15rem;
2724
+ border: 0;
2725
+ border-radius: 999px;
2726
+ background: hsl(var(--border) / 0.5);
2727
+ color: hsl(var(--fg-muted));
2728
+ cursor: pointer;
2729
+ transition: background 140ms ease, color 140ms ease;
2730
+ }
2731
+
2732
+ .brain-graph-search-clear:hover,
2733
+ .brain-graph-search-clear:focus-visible {
2734
+ background: hsl(var(--brain-core) / 0.28);
2735
+ color: hsl(var(--fg));
2736
+ outline: none;
2737
+ }
2738
+
2739
+ /* Match highlight inside node labels and typeahead suggestions */
2740
+ .brain-graph-canvas mark,
2741
+ .brain-graph-typeahead mark {
2742
+ border-radius: 3px;
2743
+ background: hsl(var(--brain-core) / 0.34);
2744
+ color: hsl(var(--fg));
2745
+ padding: 0 0.08em;
2746
+ font-weight: 700;
2747
+ }
2748
+
2749
+ /* Typeahead suggestion list */
2750
+ .brain-graph-typeahead {
2751
+ position: absolute;
2752
+ z-index: 12;
2753
+ top: calc(100% + 0.35rem);
2754
+ right: 0;
2755
+ left: 0;
2756
+ display: grid;
2757
+ gap: 0.12rem;
2758
+ max-height: 14rem;
2759
+ margin: 0;
2760
+ padding: 0.32rem;
2761
+ overflow-y: auto;
2762
+ list-style: none;
2763
+ border: 1px solid hsl(var(--border) / 0.7);
2764
+ border-radius: 10px;
2765
+ background: hsl(var(--surface));
2766
+ box-shadow: 0 18px 48px hsl(205 40% 3% / 0.42);
2767
+ }
2768
+
2769
+ .brain-graph-typeahead li {
2770
+ margin: 0;
2771
+ }
2772
+
2773
+ .brain-graph-typeahead li.is-empty {
2774
+ padding: 0.5rem 0.55rem;
2775
+ color: hsl(var(--fg-muted));
2776
+ font-size: 0.82rem;
2777
+ }
2778
+
2779
+ .brain-graph-typeahead li button {
2780
+ display: grid;
2781
+ gap: 0.08rem;
2782
+ width: 100%;
2783
+ border: 0;
2784
+ border-radius: 7px;
2785
+ background: transparent;
2786
+ padding: 0.4rem 0.55rem;
2787
+ text-align: left;
2788
+ color: hsl(var(--fg));
2789
+ cursor: pointer;
2790
+ transition: background 120ms ease;
2791
+ }
2792
+
2793
+ .brain-graph-typeahead li button:hover,
2794
+ .brain-graph-typeahead li button:focus-visible {
2795
+ background: hsl(var(--brain-core) / 0.12);
2796
+ outline: none;
2797
+ }
2798
+
2799
+ .brain-graph-typeahead li button span {
2800
+ color: hsl(var(--fg-muted));
2801
+ font-size: 0.6rem;
2802
+ font-weight: 800;
2803
+ text-transform: uppercase;
2804
+ }
2805
+
2806
+ .brain-graph-typeahead li button strong {
2807
+ font-size: 0.86rem;
2808
+ font-weight: 600;
2809
+ }
2810
+
2811
+ /* Control panel: filters + time exploration */
2812
+ .brain-graph-control-panel {
2813
+ display: grid;
2814
+ gap: 0.5rem;
2815
+ border: 1px solid hsl(var(--border) / 0.5);
2816
+ border-radius: 10px;
2817
+ background: hsl(var(--bg) / 0.4);
2818
+ padding: 0.6rem 0.7rem;
2819
+ }
2820
+
2821
+ .brain-graph-filter-row {
2822
+ display: flex;
2823
+ flex-wrap: wrap;
2824
+ align-items: center;
2825
+ gap: 0.4rem 0.55rem;
2826
+ }
2827
+
2828
+ .brain-graph-control-label {
2829
+ display: inline-flex;
2830
+ align-items: center;
2831
+ gap: 0.3rem;
2832
+ color: hsl(var(--fg-muted));
2833
+ font-size: 0.66rem;
2834
+ font-weight: 800;
2835
+ text-transform: uppercase;
2836
+ letter-spacing: 0.02em;
2837
+ }
2838
+
2839
+ .brain-graph-type-chips,
2840
+ .brain-graph-time-chips {
2841
+ display: flex;
2842
+ flex-wrap: wrap;
2843
+ gap: 0.3rem;
2844
+ }
2845
+
2846
+ .brain-graph-chip {
2847
+ border: 1px solid hsl(var(--border) / 0.7);
2848
+ border-radius: 999px;
2849
+ background: hsl(var(--surface) / 0.6);
2850
+ padding: 0.22rem 0.62rem;
2851
+ color: hsl(var(--fg-muted));
2852
+ font-size: 0.74rem;
2853
+ font-weight: 600;
2854
+ cursor: pointer;
2855
+ transition: border-color 140ms ease, background 140ms ease, color 140ms ease;
2856
+ }
2857
+
2858
+ .brain-graph-chip:hover,
2859
+ .brain-graph-chip:focus-visible {
2860
+ border-color: hsl(var(--brain-core) / 0.6);
2861
+ color: hsl(var(--fg));
2862
+ outline: none;
2863
+ }
2864
+
2865
+ .brain-graph-chip.is-active {
2866
+ border-color: hsl(var(--brain-core) / 0.85);
2867
+ background: hsl(var(--brain-core) / 0.16);
2868
+ color: hsl(var(--fg));
2869
+ }
2870
+
2871
+ .brain-graph-chip:disabled {
2872
+ opacity: 0.4;
2873
+ cursor: not-allowed;
2874
+ }
2875
+
2876
+ .brain-graph-reset {
2877
+ display: inline-flex;
2878
+ align-items: center;
2879
+ gap: 0.28rem;
2880
+ margin-left: auto;
2881
+ border: 0;
2882
+ border-radius: 999px;
2883
+ background: transparent;
2884
+ padding: 0.22rem 0.5rem;
2885
+ color: hsl(var(--fg-muted));
2886
+ font-size: 0.72rem;
2887
+ font-weight: 600;
2888
+ cursor: pointer;
2889
+ transition: color 140ms ease;
2890
+ }
2891
+
2892
+ .brain-graph-reset:hover,
2893
+ .brain-graph-reset:focus-visible {
2894
+ color: hsl(var(--fg));
2895
+ outline: none;
2896
+ }
2897
+
2898
+ /* Smooth focus transitions: focused node + neighbors stand out, rest dims */
2899
+ .brain-graph-canvas .graph-node {
2900
+ transition:
2901
+ opacity 320ms cubic-bezier(0.23, 1, 0.32, 1),
2902
+ filter 320ms ease,
2903
+ border-color 200ms ease,
2904
+ box-shadow 200ms ease,
2905
+ transform 320ms cubic-bezier(0.23, 1, 0.32, 1);
2906
+ }
2907
+
2908
+ .graph-node[data-focus="true"] {
2909
+ z-index: 6;
2910
+ border-color: hsl(var(--brain-core) / 0.85);
2911
+ box-shadow:
2912
+ 0 0 0 2px hsl(var(--brain-core) / 0.32),
2913
+ 0 16px 40px hsl(200 35% 3% / 0.34);
2914
+ }
2915
+
2916
+ .graph-node[data-focus="false"] {
2917
+ opacity: 0.34;
2918
+ filter: saturate(0.55);
2919
+ }
2920
+
2921
+ .graph-node[data-focus="false"]:hover,
2922
+ .graph-node[data-focus="false"]:focus-visible {
2923
+ opacity: 0.85;
2924
+ filter: none;
2925
+ }
2926
+
2927
+ /* Search match emphasis on canvas */
2928
+ .graph-node.is-match {
2929
+ border-color: hsl(var(--brain-core) / 0.7);
2930
+ }
2931
+
2932
+ /* Recently added emphasis (time exploration) */
2933
+ .graph-node[data-recent="true"] {
2934
+ border-color: hsl(var(--knowledge) / 0.9);
2935
+ box-shadow: 0 0 0 1px hsl(var(--knowledge) / 0.45) inset;
2936
+ }
2937
+
2938
+ /* Edge highlight/dim coupled to focus + match state */
2939
+ .brain-graph-edges line {
2940
+ transition: opacity 280ms ease, stroke-width 200ms ease, stroke 200ms ease;
2941
+ }
2942
+
2943
+ .brain-graph-edges line[data-highlight="true"] {
2944
+ opacity: 1;
2945
+ stroke: hsl(var(--brain-core) / 0.78);
2946
+ stroke-width: calc(var(--weight, 1) * 0.56);
2947
+ }
2948
+
2949
+ .brain-graph-edges line[data-highlight="false"] {
2950
+ opacity: 0.18;
2951
+ }
2952
+
2953
+ .brain-graph-focus-meta {
2954
+ color: hsl(var(--brain-core)) !important;
2955
+ font-weight: 600;
2956
+ }
2957
+
2958
+ @media (max-width: 640px) {
2959
+ .brain-graph-search-wrap {
2960
+ width: 100%;
2961
+ }
2962
+ }
2963
+
2638
2964
  .brain-conversation-header h1 {
2639
2965
  margin: 0;
2640
2966
  color: hsl(var(--fg));
@@ -4679,3 +5005,807 @@ body {
4679
5005
  animation: none;
4680
5006
  }
4681
5007
  }
5008
+
5009
+ /* ── Onboarding: hardware visualization + time estimates + next-action CTA ── */
5010
+ /* Track: 첫 실행 온보딩 (additive, scoped to ritual onboarding screens). */
5011
+
5012
+ .ritual-fact--visual .ritual-fact-head {
5013
+ display: flex;
5014
+ align-items: center;
5015
+ gap: 0.5rem;
5016
+ margin-bottom: 0.3rem;
5017
+ }
5018
+
5019
+ .ritual-hardware-icon {
5020
+ font-size: 1.8rem;
5021
+ line-height: 1;
5022
+ margin-right: 0.5rem;
5023
+ flex: 0 0 auto;
5024
+ }
5025
+
5026
+ .ritual-fact--visual .ritual-fact-head .ritual-fact-label {
5027
+ margin-bottom: 0;
5028
+ margin-right: 0;
5029
+ }
5030
+
5031
+ .ritual-time-estimate {
5032
+ font-size: 0.82rem;
5033
+ color: hsl(var(--fg-muted));
5034
+ margin-top: 0.4rem;
5035
+ }
5036
+
5037
+ .ritual-time-note {
5038
+ font-size: 0.78rem;
5039
+ color: hsl(var(--fg-muted));
5040
+ text-align: center;
5041
+ margin-top: 0.6rem;
5042
+ margin-bottom: 0.2rem;
5043
+ }
5044
+
5045
+ .ritual-model-stats {
5046
+ display: flex;
5047
+ gap: 0.6rem;
5048
+ align-items: center;
5049
+ flex-wrap: wrap;
5050
+ }
5051
+
5052
+ .ritual-model-comparison {
5053
+ color: hsl(var(--brain-core));
5054
+ font-weight: 600;
5055
+ }
5056
+
5057
+ .ritual-model-choose {
5058
+ display: inline-block;
5059
+ margin-top: 0.55rem;
5060
+ font-size: 0.82rem;
5061
+ font-weight: 600;
5062
+ color: hsl(var(--brain-core));
5063
+ }
5064
+
5065
+ .ritual-primary-cta {
5066
+ display: flex;
5067
+ flex-direction: column;
5068
+ align-items: stretch;
5069
+ text-align: center;
5070
+ margin-bottom: 0.95rem;
5071
+ }
5072
+
5073
+ .ritual-primary-note {
5074
+ margin-top: 0.45rem;
5075
+ }
5076
+
5077
+ .ritual-next-hint {
5078
+ margin-top: 0.3rem;
5079
+ font-size: 0.82rem;
5080
+ }
5081
+
5082
+ .ritual-expected-card {
5083
+ margin-top: 1rem;
5084
+ text-align: left;
5085
+ }
5086
+
5087
+ .ritual-expected-line {
5088
+ font-size: 0.92rem;
5089
+ color: hsl(var(--fg));
5090
+ margin-top: 0.25rem;
5091
+ margin-bottom: 0.6rem;
5092
+ }
5093
+
5094
+ .ritual-timeline {
5095
+ list-style: none;
5096
+ margin: 0 0 0.6rem;
5097
+ padding: 0;
5098
+ display: flex;
5099
+ flex-direction: column;
5100
+ gap: 0.4rem;
5101
+ }
5102
+
5103
+ .ritual-timeline-step {
5104
+ display: flex;
5105
+ align-items: center;
5106
+ justify-content: space-between;
5107
+ gap: 0.75rem;
5108
+ padding: 0.45rem 0.7rem;
5109
+ border: 1px solid hsl(var(--border) / 0.5);
5110
+ border-radius: 12px;
5111
+ background: hsl(var(--bg) / 0.5);
5112
+ }
5113
+
5114
+ .ritual-timeline-name {
5115
+ font-size: 0.9rem;
5116
+ font-weight: 560;
5117
+ color: hsl(var(--fg));
5118
+ }
5119
+
5120
+ .ritual-timeline-time {
5121
+ font-size: 0.82rem;
5122
+ color: hsl(var(--fg-muted));
5123
+ white-space: nowrap;
5124
+ }
5125
+
5126
+ /* ── Brain Home ingestion progressive disclosure + emergence timeline ──
5127
+ Track: ingestion CTA clarity + collect→parse→embed→memorize disclosure.
5128
+ Token-native (--memory, --brain-core); additive, scoped to .brain-ingest-*
5129
+ and .brain-emergence-* selectors. */
5130
+ .brain-ingest-tile {
5131
+ position: relative;
5132
+ }
5133
+
5134
+ .brain-ingest-tile.is-ingesting {
5135
+ border-color: hsl(var(--brain-core) / 0.72);
5136
+ background: hsl(var(--brain-core) / 0.1);
5137
+ }
5138
+
5139
+ .brain-ingest-tile.is-emerged {
5140
+ border-color: hsl(var(--memory) / 0.82);
5141
+ background: hsl(var(--memory) / 0.12);
5142
+ }
5143
+
5144
+ .brain-ingest-tile.is-failed {
5145
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.6);
5146
+ background: hsl(var(--danger, 0 64% 56%) / 0.08);
5147
+ }
5148
+
5149
+ .brain-ingest-cta {
5150
+ color: hsl(var(--fg-muted));
5151
+ font-size: 0.64rem;
5152
+ font-weight: 620;
5153
+ line-height: 1.2;
5154
+ }
5155
+
5156
+ .brain-ingest-progress {
5157
+ display: grid;
5158
+ gap: 0.3rem;
5159
+ margin-top: 0.12rem;
5160
+ }
5161
+
5162
+ .brain-ingest-stage-badges {
5163
+ display: flex;
5164
+ flex-wrap: wrap;
5165
+ gap: 0.22rem;
5166
+ }
5167
+
5168
+ .brain-ingest-stage-badge {
5169
+ display: inline-flex;
5170
+ align-items: center;
5171
+ gap: 0.16rem;
5172
+ border: 1px solid hsl(var(--border) / 0.55);
5173
+ border-radius: 999px;
5174
+ background: hsl(var(--surface) / 0.6);
5175
+ color: hsl(var(--fg-muted));
5176
+ padding: 0.08rem 0.34rem;
5177
+ font-size: 0.58rem;
5178
+ font-weight: 760;
5179
+ letter-spacing: 0.01em;
5180
+ transition: border-color 150ms ease, background 150ms ease, color 150ms ease;
5181
+ }
5182
+
5183
+ .brain-ingest-stage-badge.is-active {
5184
+ border-color: hsl(var(--brain-core) / 0.78);
5185
+ background: hsl(var(--brain-core) / 0.16);
5186
+ color: hsl(var(--fg));
5187
+ }
5188
+
5189
+ .brain-ingest-stage-badge.is-done {
5190
+ border-color: hsl(var(--memory) / 0.72);
5191
+ background: hsl(var(--memory) / 0.14);
5192
+ color: hsl(var(--fg));
5193
+ }
5194
+
5195
+ .brain-ingest-stage-badge.is-failed {
5196
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.6);
5197
+ color: hsl(var(--danger, 0 64% 56%));
5198
+ }
5199
+
5200
+ .brain-ingest-spin {
5201
+ animation: brain-ingest-spin 900ms linear infinite;
5202
+ }
5203
+
5204
+ @keyframes brain-ingest-spin {
5205
+ to {
5206
+ transform: rotate(360deg);
5207
+ }
5208
+ }
5209
+
5210
+ @media (prefers-reduced-motion: reduce) {
5211
+ .brain-ingest-spin {
5212
+ animation: none;
5213
+ }
5214
+ }
5215
+
5216
+ .brain-ingest-stage-hint {
5217
+ color: hsl(var(--fg-muted));
5218
+ font-size: 0.62rem;
5219
+ font-weight: 620;
5220
+ line-height: 1.2;
5221
+ }
5222
+
5223
+ .brain-ingest-stage-hint.is-emerged {
5224
+ color: hsl(var(--memory));
5225
+ font-weight: 780;
5226
+ }
5227
+
5228
+ .brain-ingest-stage-hint.is-failed {
5229
+ color: hsl(var(--danger, 0 64% 56%));
5230
+ }
5231
+
5232
+ .brain-emergence-timeline {
5233
+ margin: 0 0 1rem;
5234
+ border: 1px solid hsl(var(--memory) / 0.3);
5235
+ border-radius: 8px;
5236
+ background: hsl(var(--memory) / 0.05);
5237
+ padding: 0.72rem 0.78rem;
5238
+ }
5239
+
5240
+ .brain-emergence-head {
5241
+ display: flex;
5242
+ align-items: center;
5243
+ gap: 0.4rem;
5244
+ margin-bottom: 0.5rem;
5245
+ }
5246
+
5247
+ .brain-emergence-head svg {
5248
+ color: hsl(var(--memory));
5249
+ }
5250
+
5251
+ .brain-emergence-head strong {
5252
+ color: hsl(var(--fg));
5253
+ font-size: 0.84rem;
5254
+ font-weight: 820;
5255
+ }
5256
+
5257
+ .brain-emergence-head span {
5258
+ margin-left: auto;
5259
+ color: hsl(var(--fg-muted));
5260
+ font-size: 0.6rem;
5261
+ font-weight: 760;
5262
+ text-transform: uppercase;
5263
+ letter-spacing: 0.04em;
5264
+ }
5265
+
5266
+ .brain-emergence-empty {
5267
+ margin: 0;
5268
+ color: hsl(var(--fg-muted));
5269
+ font-size: 0.74rem;
5270
+ line-height: 1.3;
5271
+ }
5272
+
5273
+ .brain-emergence-list {
5274
+ display: grid;
5275
+ gap: 0.4rem;
5276
+ margin: 0;
5277
+ padding: 0;
5278
+ list-style: none;
5279
+ }
5280
+
5281
+ .brain-emergence-item {
5282
+ display: grid;
5283
+ grid-template-columns: auto minmax(0, 1fr) auto;
5284
+ align-items: center;
5285
+ gap: 0.2rem 0.5rem;
5286
+ border: 1px solid hsl(var(--border) / 0.5);
5287
+ border-radius: 7px;
5288
+ background: hsl(var(--surface) / 0.58);
5289
+ padding: 0.42rem 0.55rem;
5290
+ animation: brain-emergence-enter 280ms cubic-bezier(0.23, 1, 0.32, 1);
5291
+ }
5292
+
5293
+ @keyframes brain-emergence-enter {
5294
+ from {
5295
+ opacity: 0;
5296
+ transform: translateY(4px);
5297
+ }
5298
+ to {
5299
+ opacity: 1;
5300
+ transform: translateY(0);
5301
+ }
5302
+ }
5303
+
5304
+ @media (prefers-reduced-motion: reduce) {
5305
+ .brain-emergence-item {
5306
+ animation: none;
5307
+ }
5308
+ }
5309
+
5310
+ .brain-emergence-type {
5311
+ border: 1px solid hsl(var(--brain-core) / 0.5);
5312
+ border-radius: 999px;
5313
+ background: hsl(var(--brain-core) / 0.12);
5314
+ color: hsl(var(--fg));
5315
+ padding: 0.05rem 0.4rem;
5316
+ font-size: 0.6rem;
5317
+ font-weight: 800;
5318
+ }
5319
+
5320
+ .brain-emergence-label {
5321
+ overflow: hidden;
5322
+ color: hsl(var(--fg));
5323
+ font-size: 0.74rem;
5324
+ font-weight: 680;
5325
+ text-overflow: ellipsis;
5326
+ white-space: nowrap;
5327
+ }
5328
+
5329
+ .brain-emergence-counts {
5330
+ grid-column: 2;
5331
+ display: flex;
5332
+ flex-wrap: wrap;
5333
+ gap: 0.3rem;
5334
+ }
5335
+
5336
+ .brain-emergence-counts strong {
5337
+ color: hsl(var(--memory));
5338
+ font-size: 0.62rem;
5339
+ font-weight: 800;
5340
+ }
5341
+
5342
+ .brain-emergence-at {
5343
+ grid-column: 3;
5344
+ grid-row: 1 / span 2;
5345
+ align-self: center;
5346
+ color: hsl(var(--fg-muted));
5347
+ font-size: 0.62rem;
5348
+ font-weight: 640;
5349
+ white-space: nowrap;
5350
+ }
5351
+
5352
+ /* ============================================================
5353
+ Track: Workspace/profile switcher + admin surface discovery
5354
+ Adds discoverable shell entry points for workspace/profile
5355
+ switching and the admin console. Token-native, additive.
5356
+ ============================================================ */
5357
+ .brain-shell-switchers {
5358
+ display: inline-flex;
5359
+ flex-wrap: wrap;
5360
+ align-items: center;
5361
+ gap: 0.4rem;
5362
+ margin-left: auto;
5363
+ }
5364
+
5365
+ .external-consent-status {
5366
+ margin: 0 0 0.85rem;
5367
+ }
5368
+
5369
+ .feedback-state {
5370
+ display: flex;
5371
+ align-items: center;
5372
+ gap: 0.7rem;
5373
+ border: 1px solid hsl(var(--border) / 0.58);
5374
+ border-radius: 8px;
5375
+ background: hsl(var(--surface-glass));
5376
+ color: hsl(var(--fg));
5377
+ padding: 0.7rem 0.78rem;
5378
+ }
5379
+
5380
+ .feedback-state.is-empty {
5381
+ border-color: hsl(var(--memory) / 0.28);
5382
+ background: hsl(var(--memory) / 0.05);
5383
+ }
5384
+
5385
+ .feedback-state.is-error {
5386
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.35);
5387
+ background: hsl(var(--danger, 0 64% 56%) / 0.07);
5388
+ }
5389
+
5390
+ .feedback-state-icon {
5391
+ display: inline-flex;
5392
+ align-items: center;
5393
+ justify-content: center;
5394
+ width: 1.75rem;
5395
+ height: 1.75rem;
5396
+ flex: 0 0 auto;
5397
+ border-radius: 999px;
5398
+ background: hsl(var(--surface) / 0.8);
5399
+ color: hsl(var(--fg-muted));
5400
+ }
5401
+
5402
+ .feedback-state.is-error .feedback-state-icon {
5403
+ color: hsl(var(--danger, 0 64% 56%));
5404
+ }
5405
+
5406
+ .feedback-state-body {
5407
+ display: grid;
5408
+ gap: 0.12rem;
5409
+ min-width: 0;
5410
+ flex: 1 1 auto;
5411
+ }
5412
+
5413
+ .feedback-state-body strong {
5414
+ font-size: 0.78rem;
5415
+ font-weight: 820;
5416
+ }
5417
+
5418
+ .feedback-state-body span {
5419
+ color: hsl(var(--fg-muted));
5420
+ font-size: 0.7rem;
5421
+ line-height: 1.35;
5422
+ }
5423
+
5424
+ .feedback-state-action {
5425
+ display: inline-flex;
5426
+ align-items: center;
5427
+ gap: 0.32rem;
5428
+ flex: 0 0 auto;
5429
+ min-height: 1.9rem;
5430
+ border: 1px solid hsl(var(--border) / 0.6);
5431
+ border-radius: 7px;
5432
+ background: hsl(var(--surface) / 0.72);
5433
+ color: hsl(var(--fg));
5434
+ padding: 0 0.62rem;
5435
+ font-size: 0.68rem;
5436
+ font-weight: 760;
5437
+ cursor: pointer;
5438
+ }
5439
+
5440
+ .feedback-state-action:hover,
5441
+ .feedback-state-action:focus-visible {
5442
+ border-color: hsl(var(--brain-core) / 0.7);
5443
+ background: hsl(var(--brain-core) / 0.08);
5444
+ outline: none;
5445
+ }
5446
+
5447
+ .workspace-profile-switcher {
5448
+ position: relative;
5449
+ display: inline-flex;
5450
+ }
5451
+
5452
+ .workspace-profile-trigger {
5453
+ display: inline-flex;
5454
+ align-items: center;
5455
+ gap: 0.45rem;
5456
+ min-height: 2rem;
5457
+ max-width: 16rem;
5458
+ border: 1px solid hsl(var(--border) / 0.58);
5459
+ border-radius: 999px;
5460
+ background: hsl(var(--surface-glass));
5461
+ color: hsl(var(--fg-muted));
5462
+ padding: 0 0.62rem;
5463
+ font-size: 0.68rem;
5464
+ font-weight: 820;
5465
+ letter-spacing: 0;
5466
+ cursor: pointer;
5467
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5468
+ }
5469
+
5470
+ .workspace-profile-trigger:hover,
5471
+ .workspace-profile-trigger:focus-visible,
5472
+ .workspace-profile-switcher .workspace-profile-trigger[aria-expanded="true"] {
5473
+ border-color: hsl(var(--brain-core) / 0.72);
5474
+ background: hsl(var(--brain-core) / 0.08);
5475
+ color: hsl(var(--fg));
5476
+ outline: none;
5477
+ }
5478
+
5479
+ .workspace-profile-trigger-text {
5480
+ display: flex;
5481
+ flex-direction: column;
5482
+ align-items: flex-start;
5483
+ min-width: 0;
5484
+ line-height: 1.1;
5485
+ }
5486
+
5487
+ .workspace-profile-trigger-name {
5488
+ max-width: 11rem;
5489
+ overflow: hidden;
5490
+ text-overflow: ellipsis;
5491
+ white-space: nowrap;
5492
+ color: hsl(var(--fg));
5493
+ }
5494
+
5495
+ .workspace-profile-trigger-owner {
5496
+ max-width: 11rem;
5497
+ overflow: hidden;
5498
+ text-overflow: ellipsis;
5499
+ white-space: nowrap;
5500
+ font-size: 0.58rem;
5501
+ font-weight: 640;
5502
+ color: hsl(var(--fg-muted));
5503
+ }
5504
+
5505
+ .workspace-profile-popover {
5506
+ position: absolute;
5507
+ top: calc(100% + 0.45rem);
5508
+ right: 0;
5509
+ z-index: 40;
5510
+ width: min(20rem, calc(100vw - 2rem));
5511
+ display: flex;
5512
+ flex-direction: column;
5513
+ gap: 0.7rem;
5514
+ border: 1px solid hsl(var(--border) / 0.7);
5515
+ border-radius: 12px;
5516
+ background: hsl(var(--surface));
5517
+ padding: 0.85rem;
5518
+ box-shadow: 0 18px 48px -24px hsl(24 14% 4% / 0.8);
5519
+ }
5520
+
5521
+ .workspace-profile-section {
5522
+ display: flex;
5523
+ flex-direction: column;
5524
+ gap: 0.4rem;
5525
+ }
5526
+
5527
+ .workspace-profile-section + .workspace-profile-section {
5528
+ border-top: 1px solid hsl(var(--border) / 0.5);
5529
+ padding-top: 0.7rem;
5530
+ }
5531
+
5532
+ .workspace-profile-section-head {
5533
+ display: inline-flex;
5534
+ align-items: center;
5535
+ gap: 0.35rem;
5536
+ color: hsl(var(--fg-muted));
5537
+ font-size: 0.62rem;
5538
+ font-weight: 820;
5539
+ text-transform: uppercase;
5540
+ letter-spacing: 0.04em;
5541
+ }
5542
+
5543
+ .workspace-profile-owner-row {
5544
+ display: flex;
5545
+ align-items: baseline;
5546
+ justify-content: space-between;
5547
+ gap: 0.5rem;
5548
+ }
5549
+
5550
+ .workspace-profile-owner-label {
5551
+ color: hsl(var(--fg-muted));
5552
+ font-size: 0.7rem;
5553
+ }
5554
+
5555
+ .workspace-profile-owner-value {
5556
+ min-width: 0;
5557
+ overflow: hidden;
5558
+ text-overflow: ellipsis;
5559
+ white-space: nowrap;
5560
+ color: hsl(var(--fg));
5561
+ font-size: 0.74rem;
5562
+ font-weight: 720;
5563
+ }
5564
+
5565
+ .workspace-profile-empty {
5566
+ margin: 0;
5567
+ color: hsl(var(--fg-muted));
5568
+ font-size: 0.72rem;
5569
+ }
5570
+
5571
+ .workspace-profile-list {
5572
+ display: flex;
5573
+ flex-direction: column;
5574
+ gap: 0.3rem;
5575
+ margin: 0;
5576
+ padding: 0;
5577
+ list-style: none;
5578
+ }
5579
+
5580
+ .workspace-profile-item {
5581
+ display: flex;
5582
+ align-items: center;
5583
+ justify-content: space-between;
5584
+ gap: 0.5rem;
5585
+ width: 100%;
5586
+ min-height: 2.1rem;
5587
+ border: 1px solid hsl(var(--border) / 0.5);
5588
+ border-radius: 8px;
5589
+ background: transparent;
5590
+ color: hsl(var(--fg));
5591
+ padding: 0 0.62rem;
5592
+ font-size: 0.74rem;
5593
+ font-weight: 680;
5594
+ text-align: left;
5595
+ cursor: pointer;
5596
+ transition: border-color 150ms ease, background 150ms ease;
5597
+ }
5598
+
5599
+ .workspace-profile-item:hover,
5600
+ .workspace-profile-item:focus-visible {
5601
+ border-color: hsl(var(--brain-core) / 0.6);
5602
+ background: hsl(var(--brain-core) / 0.06);
5603
+ outline: none;
5604
+ }
5605
+
5606
+ .workspace-profile-item.is-active {
5607
+ border-color: hsl(var(--brain-core) / 0.66);
5608
+ background: hsl(var(--brain-core) / 0.1);
5609
+ font-weight: 820;
5610
+ }
5611
+
5612
+ .workspace-profile-item-name {
5613
+ min-width: 0;
5614
+ overflow: hidden;
5615
+ text-overflow: ellipsis;
5616
+ white-space: nowrap;
5617
+ }
5618
+
5619
+ .workspace-profile-item-flag,
5620
+ .workspace-profile-item-switch {
5621
+ display: inline-flex;
5622
+ align-items: center;
5623
+ gap: 0.25rem;
5624
+ flex: 0 0 auto;
5625
+ font-size: 0.62rem;
5626
+ font-weight: 740;
5627
+ }
5628
+
5629
+ .workspace-profile-item-flag {
5630
+ color: hsl(var(--brain-core));
5631
+ }
5632
+
5633
+ .workspace-profile-item-switch {
5634
+ color: hsl(var(--fg-muted));
5635
+ }
5636
+
5637
+ .workspace-profile-link {
5638
+ align-self: flex-start;
5639
+ border: 0;
5640
+ border-radius: 6px;
5641
+ background: transparent;
5642
+ color: hsl(var(--brain-core));
5643
+ padding: 0.2rem 0;
5644
+ font-size: 0.7rem;
5645
+ font-weight: 760;
5646
+ cursor: pointer;
5647
+ }
5648
+
5649
+ .workspace-profile-link:hover,
5650
+ .workspace-profile-link:focus-visible {
5651
+ text-decoration: underline;
5652
+ outline: none;
5653
+ }
5654
+
5655
+ .admin-access-gate {
5656
+ display: inline-flex;
5657
+ align-items: center;
5658
+ gap: 0.4rem;
5659
+ }
5660
+
5661
+ .vscode-sync-status {
5662
+ display: inline-flex;
5663
+ align-items: center;
5664
+ gap: 0.42rem;
5665
+ min-height: 2rem;
5666
+ border: 1px solid hsl(var(--border) / 0.58);
5667
+ border-radius: 999px;
5668
+ background: hsl(var(--surface-glass));
5669
+ color: hsl(var(--fg-muted));
5670
+ padding: 0 0.62rem;
5671
+ font-size: 0.68rem;
5672
+ font-weight: 820;
5673
+ letter-spacing: 0;
5674
+ cursor: pointer;
5675
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5676
+ }
5677
+
5678
+ .vscode-sync-status:hover,
5679
+ .vscode-sync-status:focus-visible {
5680
+ border-color: hsl(var(--brain-core) / 0.72);
5681
+ background: hsl(var(--brain-core) / 0.08);
5682
+ color: hsl(var(--fg));
5683
+ outline: none;
5684
+ }
5685
+
5686
+ .vscode-sync-dot {
5687
+ width: 0.46rem;
5688
+ height: 0.46rem;
5689
+ border-radius: 999px;
5690
+ background: hsl(var(--fg-muted));
5691
+ box-shadow: 0 0 0 3px hsl(var(--fg-muted) / 0.12);
5692
+ }
5693
+
5694
+ .vscode-sync-status.is-synced .vscode-sync-dot,
5695
+ .vscode-sync-status.is-connected .vscode-sync-dot {
5696
+ background: hsl(var(--memory));
5697
+ box-shadow: 0 0 0 3px hsl(var(--memory) / 0.16);
5698
+ }
5699
+
5700
+ .vscode-sync-status.is-indexing .vscode-sync-dot,
5701
+ .vscode-sync-status.is-checking .vscode-sync-dot {
5702
+ background: hsl(var(--brain-core));
5703
+ box-shadow: 0 0 0 3px hsl(var(--brain-core) / 0.16);
5704
+ }
5705
+
5706
+ .vscode-sync-status.is-offline .vscode-sync-dot {
5707
+ background: hsl(var(--danger, 0 64% 56%));
5708
+ box-shadow: 0 0 0 3px hsl(var(--danger, 0 64% 56%) / 0.12);
5709
+ }
5710
+
5711
+ .vscode-sync-copy {
5712
+ display: flex;
5713
+ flex-direction: column;
5714
+ align-items: flex-start;
5715
+ line-height: 1.05;
5716
+ }
5717
+
5718
+ .vscode-sync-copy strong {
5719
+ color: hsl(var(--fg));
5720
+ font-size: 0.66rem;
5721
+ }
5722
+
5723
+ .vscode-sync-copy small {
5724
+ color: hsl(var(--fg-muted));
5725
+ font-size: 0.56rem;
5726
+ font-weight: 680;
5727
+ }
5728
+
5729
+ .admin-access-button {
5730
+ display: inline-flex;
5731
+ align-items: center;
5732
+ gap: 0.35rem;
5733
+ min-height: 2rem;
5734
+ border: 1px solid hsl(var(--border) / 0.58);
5735
+ border-radius: 999px;
5736
+ background: hsl(var(--surface-glass));
5737
+ color: hsl(var(--fg-muted));
5738
+ padding: 0 0.62rem;
5739
+ font-size: 0.68rem;
5740
+ font-weight: 820;
5741
+ letter-spacing: 0;
5742
+ cursor: pointer;
5743
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5744
+ }
5745
+
5746
+ .admin-access-button:hover,
5747
+ .admin-access-button:focus-visible {
5748
+ border-color: hsl(var(--brain-core) / 0.72);
5749
+ background: hsl(var(--brain-core) / 0.08);
5750
+ color: hsl(var(--fg));
5751
+ outline: none;
5752
+ }
5753
+
5754
+ .admin-access-button.is-locked {
5755
+ color: hsl(var(--fg-muted));
5756
+ opacity: 0.85;
5757
+ }
5758
+
5759
+ .admin-access-button.is-locked:hover,
5760
+ .admin-access-button.is-locked:focus-visible {
5761
+ border-color: hsl(var(--border) / 0.8);
5762
+ background: hsl(var(--surface));
5763
+ color: hsl(var(--fg));
5764
+ }
5765
+
5766
+ .mode-switcher-mini {
5767
+ display: inline-flex;
5768
+ align-items: center;
5769
+ gap: 0.2rem;
5770
+ border: 1px solid hsl(var(--border) / 0.58);
5771
+ border-radius: 999px;
5772
+ background: hsl(var(--surface-glass));
5773
+ padding: 0.18rem;
5774
+ }
5775
+
5776
+ .mode-switcher-mini button {
5777
+ min-height: 1.65rem;
5778
+ border: 0;
5779
+ border-radius: 999px;
5780
+ background: transparent;
5781
+ color: hsl(var(--fg-muted));
5782
+ padding: 0 0.5rem;
5783
+ font-size: 0.64rem;
5784
+ font-weight: 820;
5785
+ letter-spacing: 0;
5786
+ cursor: pointer;
5787
+ }
5788
+
5789
+ .mode-switcher-mini button.is-active {
5790
+ background: hsl(var(--brain-core) / 0.14);
5791
+ color: hsl(var(--fg));
5792
+ }
5793
+
5794
+ .mode-switcher-mini button:focus-visible {
5795
+ outline: 2px solid hsl(var(--ring) / 0.6);
5796
+ outline-offset: 1px;
5797
+ }
5798
+
5799
+ @media (max-width: 640px) {
5800
+ .brain-shell-switchers {
5801
+ margin-left: 0;
5802
+ width: 100%;
5803
+ justify-content: center;
5804
+ }
5805
+
5806
+ .workspace-profile-popover {
5807
+ right: auto;
5808
+ left: 50%;
5809
+ transform: translateX(-50%);
5810
+ }
5811
+ }