ltcai 7.0.0 → 7.2.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 (67) hide show
  1. package/README.md +22 -20
  2. package/docs/CHANGELOG.md +43 -0
  3. package/frontend/src/App.tsx +80 -0
  4. package/frontend/src/api/client.ts +9 -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/admin/AdminConsole.tsx +41 -1
  14. package/frontend/src/features/brain/BrainConversation.tsx +232 -19
  15. package/frontend/src/features/brain/BrainGraphLayer.tsx +258 -25
  16. package/frontend/src/features/brain/BrainHome.tsx +193 -1
  17. package/frontend/src/features/brain/brainData.ts +25 -1
  18. package/frontend/src/features/brain/graphLayout.ts +12 -1
  19. package/frontend/src/features/brain/types.ts +41 -0
  20. package/frontend/src/i18n.ts +328 -0
  21. package/frontend/src/store/appStore.ts +15 -0
  22. package/frontend/src/styles.css +1175 -0
  23. package/lattice_brain/__init__.py +1 -1
  24. package/lattice_brain/runtime/agent_runtime.py +51 -0
  25. package/lattice_brain/runtime/multi_agent.py +1 -1
  26. package/latticeai/__init__.py +1 -1
  27. package/latticeai/api/agents.py +12 -0
  28. package/latticeai/api/tools.py +14 -0
  29. package/latticeai/api/workspace.py +59 -0
  30. package/latticeai/core/marketplace.py +1 -1
  31. package/latticeai/core/tool_registry.py +47 -0
  32. package/latticeai/core/workspace_os.py +1 -1
  33. package/latticeai/services/tool_dispatch.py +14 -0
  34. package/package.json +1 -1
  35. package/src-tauri/Cargo.lock +1 -1
  36. package/src-tauri/Cargo.toml +1 -1
  37. package/src-tauri/tauri.conf.json +1 -1
  38. package/static/app/asset-manifest.json +28 -28
  39. package/static/app/assets/Act-Di4tRFWY.js +2 -0
  40. package/static/app/assets/{Act-DhLaHnrT.js.map → Act-Di4tRFWY.js.map} +1 -1
  41. package/static/app/assets/Brain-BZB3Gy9w.js +322 -0
  42. package/static/app/assets/Brain-BZB3Gy9w.js.map +1 -0
  43. package/static/app/assets/{Capture-CAKouj52.js → Capture-tNyYWxnh.js} +2 -2
  44. package/static/app/assets/{Capture-CAKouj52.js.map → Capture-tNyYWxnh.js.map} +1 -1
  45. package/static/app/assets/Library-DAtDDLdg.js +2 -0
  46. package/static/app/assets/{Library-B_hW4AwR.js.map → Library-DAtDDLdg.js.map} +1 -1
  47. package/static/app/assets/System-DEu0xNUc.js +2 -0
  48. package/static/app/assets/System-DEu0xNUc.js.map +1 -0
  49. package/static/app/assets/{index-DKFpn5Kn.css → index-Bi_bpigM.css} +1 -1
  50. package/static/app/assets/index-COuGp7_5.js +17 -0
  51. package/static/app/assets/index-COuGp7_5.js.map +1 -0
  52. package/static/app/assets/primitives-CdwcE--L.js +2 -0
  53. package/static/app/assets/primitives-CdwcE--L.js.map +1 -0
  54. package/static/app/assets/textarea-CqOdBPL1.js +2 -0
  55. package/static/app/assets/{textarea-DR2Tyy_6.js.map → textarea-CqOdBPL1.js.map} +1 -1
  56. package/static/app/index.html +2 -2
  57. package/static/app/assets/Act-DhLaHnrT.js +0 -2
  58. package/static/app/assets/Brain-DS7NULyY.js +0 -322
  59. package/static/app/assets/Brain-DS7NULyY.js.map +0 -1
  60. package/static/app/assets/Library-B_hW4AwR.js +0 -2
  61. package/static/app/assets/System-9OAoXWPz.js +0 -2
  62. package/static/app/assets/System-9OAoXWPz.js.map +0 -1
  63. package/static/app/assets/index-C-7aHabu.js +0 -17
  64. package/static/app/assets/index-C-7aHabu.js.map +0 -1
  65. package/static/app/assets/primitives-DcO2H3yh.js +0 -2
  66. package/static/app/assets/primitives-DcO2H3yh.js.map +0 -1
  67. 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));
@@ -3146,6 +3472,51 @@ body {
3146
3472
  font-size: 0.88rem;
3147
3473
  }
3148
3474
 
3475
+ .admin-runtime-trust {
3476
+ display: grid;
3477
+ gap: 0.72rem;
3478
+ }
3479
+
3480
+ .admin-runtime-row {
3481
+ display: grid;
3482
+ grid-template-columns: minmax(8rem, 1fr) auto;
3483
+ gap: 0.2rem 0.75rem;
3484
+ border: 1px solid hsl(var(--border) / 0.48);
3485
+ border-radius: 8px;
3486
+ background: hsl(var(--bg) / 0.35);
3487
+ padding: 0.72rem;
3488
+ }
3489
+
3490
+ .admin-runtime-row strong {
3491
+ color: hsl(var(--fg));
3492
+ font-size: 0.88rem;
3493
+ }
3494
+
3495
+ .admin-runtime-row > span {
3496
+ align-self: start;
3497
+ border-radius: 999px;
3498
+ padding: 0.18rem 0.48rem;
3499
+ font-size: 0.72rem;
3500
+ font-weight: 700;
3501
+ }
3502
+
3503
+ .admin-runtime-row > small {
3504
+ grid-column: 1 / -1;
3505
+ color: hsl(var(--fg-muted));
3506
+ font-size: 0.78rem;
3507
+ line-height: 1.35;
3508
+ }
3509
+
3510
+ .admin-runtime-row .is-ok {
3511
+ background: hsl(151 65% 36% / 0.13);
3512
+ color: hsl(151 48% 32%);
3513
+ }
3514
+
3515
+ .admin-runtime-row .is-warn {
3516
+ background: hsl(36 88% 52% / 0.14);
3517
+ color: hsl(30 82% 35%);
3518
+ }
3519
+
3149
3520
  .brain-document-input,
3150
3521
  .brain-image-input {
3151
3522
  display: inline-flex;
@@ -4679,3 +5050,807 @@ body {
4679
5050
  animation: none;
4680
5051
  }
4681
5052
  }
5053
+
5054
+ /* ── Onboarding: hardware visualization + time estimates + next-action CTA ── */
5055
+ /* Track: 첫 실행 온보딩 (additive, scoped to ritual onboarding screens). */
5056
+
5057
+ .ritual-fact--visual .ritual-fact-head {
5058
+ display: flex;
5059
+ align-items: center;
5060
+ gap: 0.5rem;
5061
+ margin-bottom: 0.3rem;
5062
+ }
5063
+
5064
+ .ritual-hardware-icon {
5065
+ font-size: 1.8rem;
5066
+ line-height: 1;
5067
+ margin-right: 0.5rem;
5068
+ flex: 0 0 auto;
5069
+ }
5070
+
5071
+ .ritual-fact--visual .ritual-fact-head .ritual-fact-label {
5072
+ margin-bottom: 0;
5073
+ margin-right: 0;
5074
+ }
5075
+
5076
+ .ritual-time-estimate {
5077
+ font-size: 0.82rem;
5078
+ color: hsl(var(--fg-muted));
5079
+ margin-top: 0.4rem;
5080
+ }
5081
+
5082
+ .ritual-time-note {
5083
+ font-size: 0.78rem;
5084
+ color: hsl(var(--fg-muted));
5085
+ text-align: center;
5086
+ margin-top: 0.6rem;
5087
+ margin-bottom: 0.2rem;
5088
+ }
5089
+
5090
+ .ritual-model-stats {
5091
+ display: flex;
5092
+ gap: 0.6rem;
5093
+ align-items: center;
5094
+ flex-wrap: wrap;
5095
+ }
5096
+
5097
+ .ritual-model-comparison {
5098
+ color: hsl(var(--brain-core));
5099
+ font-weight: 600;
5100
+ }
5101
+
5102
+ .ritual-model-choose {
5103
+ display: inline-block;
5104
+ margin-top: 0.55rem;
5105
+ font-size: 0.82rem;
5106
+ font-weight: 600;
5107
+ color: hsl(var(--brain-core));
5108
+ }
5109
+
5110
+ .ritual-primary-cta {
5111
+ display: flex;
5112
+ flex-direction: column;
5113
+ align-items: stretch;
5114
+ text-align: center;
5115
+ margin-bottom: 0.95rem;
5116
+ }
5117
+
5118
+ .ritual-primary-note {
5119
+ margin-top: 0.45rem;
5120
+ }
5121
+
5122
+ .ritual-next-hint {
5123
+ margin-top: 0.3rem;
5124
+ font-size: 0.82rem;
5125
+ }
5126
+
5127
+ .ritual-expected-card {
5128
+ margin-top: 1rem;
5129
+ text-align: left;
5130
+ }
5131
+
5132
+ .ritual-expected-line {
5133
+ font-size: 0.92rem;
5134
+ color: hsl(var(--fg));
5135
+ margin-top: 0.25rem;
5136
+ margin-bottom: 0.6rem;
5137
+ }
5138
+
5139
+ .ritual-timeline {
5140
+ list-style: none;
5141
+ margin: 0 0 0.6rem;
5142
+ padding: 0;
5143
+ display: flex;
5144
+ flex-direction: column;
5145
+ gap: 0.4rem;
5146
+ }
5147
+
5148
+ .ritual-timeline-step {
5149
+ display: flex;
5150
+ align-items: center;
5151
+ justify-content: space-between;
5152
+ gap: 0.75rem;
5153
+ padding: 0.45rem 0.7rem;
5154
+ border: 1px solid hsl(var(--border) / 0.5);
5155
+ border-radius: 12px;
5156
+ background: hsl(var(--bg) / 0.5);
5157
+ }
5158
+
5159
+ .ritual-timeline-name {
5160
+ font-size: 0.9rem;
5161
+ font-weight: 560;
5162
+ color: hsl(var(--fg));
5163
+ }
5164
+
5165
+ .ritual-timeline-time {
5166
+ font-size: 0.82rem;
5167
+ color: hsl(var(--fg-muted));
5168
+ white-space: nowrap;
5169
+ }
5170
+
5171
+ /* ── Brain Home ingestion progressive disclosure + emergence timeline ──
5172
+ Track: ingestion CTA clarity + collect→parse→embed→memorize disclosure.
5173
+ Token-native (--memory, --brain-core); additive, scoped to .brain-ingest-*
5174
+ and .brain-emergence-* selectors. */
5175
+ .brain-ingest-tile {
5176
+ position: relative;
5177
+ }
5178
+
5179
+ .brain-ingest-tile.is-ingesting {
5180
+ border-color: hsl(var(--brain-core) / 0.72);
5181
+ background: hsl(var(--brain-core) / 0.1);
5182
+ }
5183
+
5184
+ .brain-ingest-tile.is-emerged {
5185
+ border-color: hsl(var(--memory) / 0.82);
5186
+ background: hsl(var(--memory) / 0.12);
5187
+ }
5188
+
5189
+ .brain-ingest-tile.is-failed {
5190
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.6);
5191
+ background: hsl(var(--danger, 0 64% 56%) / 0.08);
5192
+ }
5193
+
5194
+ .brain-ingest-cta {
5195
+ color: hsl(var(--fg-muted));
5196
+ font-size: 0.64rem;
5197
+ font-weight: 620;
5198
+ line-height: 1.2;
5199
+ }
5200
+
5201
+ .brain-ingest-progress {
5202
+ display: grid;
5203
+ gap: 0.3rem;
5204
+ margin-top: 0.12rem;
5205
+ }
5206
+
5207
+ .brain-ingest-stage-badges {
5208
+ display: flex;
5209
+ flex-wrap: wrap;
5210
+ gap: 0.22rem;
5211
+ }
5212
+
5213
+ .brain-ingest-stage-badge {
5214
+ display: inline-flex;
5215
+ align-items: center;
5216
+ gap: 0.16rem;
5217
+ border: 1px solid hsl(var(--border) / 0.55);
5218
+ border-radius: 999px;
5219
+ background: hsl(var(--surface) / 0.6);
5220
+ color: hsl(var(--fg-muted));
5221
+ padding: 0.08rem 0.34rem;
5222
+ font-size: 0.58rem;
5223
+ font-weight: 760;
5224
+ letter-spacing: 0.01em;
5225
+ transition: border-color 150ms ease, background 150ms ease, color 150ms ease;
5226
+ }
5227
+
5228
+ .brain-ingest-stage-badge.is-active {
5229
+ border-color: hsl(var(--brain-core) / 0.78);
5230
+ background: hsl(var(--brain-core) / 0.16);
5231
+ color: hsl(var(--fg));
5232
+ }
5233
+
5234
+ .brain-ingest-stage-badge.is-done {
5235
+ border-color: hsl(var(--memory) / 0.72);
5236
+ background: hsl(var(--memory) / 0.14);
5237
+ color: hsl(var(--fg));
5238
+ }
5239
+
5240
+ .brain-ingest-stage-badge.is-failed {
5241
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.6);
5242
+ color: hsl(var(--danger, 0 64% 56%));
5243
+ }
5244
+
5245
+ .brain-ingest-spin {
5246
+ animation: brain-ingest-spin 900ms linear infinite;
5247
+ }
5248
+
5249
+ @keyframes brain-ingest-spin {
5250
+ to {
5251
+ transform: rotate(360deg);
5252
+ }
5253
+ }
5254
+
5255
+ @media (prefers-reduced-motion: reduce) {
5256
+ .brain-ingest-spin {
5257
+ animation: none;
5258
+ }
5259
+ }
5260
+
5261
+ .brain-ingest-stage-hint {
5262
+ color: hsl(var(--fg-muted));
5263
+ font-size: 0.62rem;
5264
+ font-weight: 620;
5265
+ line-height: 1.2;
5266
+ }
5267
+
5268
+ .brain-ingest-stage-hint.is-emerged {
5269
+ color: hsl(var(--memory));
5270
+ font-weight: 780;
5271
+ }
5272
+
5273
+ .brain-ingest-stage-hint.is-failed {
5274
+ color: hsl(var(--danger, 0 64% 56%));
5275
+ }
5276
+
5277
+ .brain-emergence-timeline {
5278
+ margin: 0 0 1rem;
5279
+ border: 1px solid hsl(var(--memory) / 0.3);
5280
+ border-radius: 8px;
5281
+ background: hsl(var(--memory) / 0.05);
5282
+ padding: 0.72rem 0.78rem;
5283
+ }
5284
+
5285
+ .brain-emergence-head {
5286
+ display: flex;
5287
+ align-items: center;
5288
+ gap: 0.4rem;
5289
+ margin-bottom: 0.5rem;
5290
+ }
5291
+
5292
+ .brain-emergence-head svg {
5293
+ color: hsl(var(--memory));
5294
+ }
5295
+
5296
+ .brain-emergence-head strong {
5297
+ color: hsl(var(--fg));
5298
+ font-size: 0.84rem;
5299
+ font-weight: 820;
5300
+ }
5301
+
5302
+ .brain-emergence-head span {
5303
+ margin-left: auto;
5304
+ color: hsl(var(--fg-muted));
5305
+ font-size: 0.6rem;
5306
+ font-weight: 760;
5307
+ text-transform: uppercase;
5308
+ letter-spacing: 0.04em;
5309
+ }
5310
+
5311
+ .brain-emergence-empty {
5312
+ margin: 0;
5313
+ color: hsl(var(--fg-muted));
5314
+ font-size: 0.74rem;
5315
+ line-height: 1.3;
5316
+ }
5317
+
5318
+ .brain-emergence-list {
5319
+ display: grid;
5320
+ gap: 0.4rem;
5321
+ margin: 0;
5322
+ padding: 0;
5323
+ list-style: none;
5324
+ }
5325
+
5326
+ .brain-emergence-item {
5327
+ display: grid;
5328
+ grid-template-columns: auto minmax(0, 1fr) auto;
5329
+ align-items: center;
5330
+ gap: 0.2rem 0.5rem;
5331
+ border: 1px solid hsl(var(--border) / 0.5);
5332
+ border-radius: 7px;
5333
+ background: hsl(var(--surface) / 0.58);
5334
+ padding: 0.42rem 0.55rem;
5335
+ animation: brain-emergence-enter 280ms cubic-bezier(0.23, 1, 0.32, 1);
5336
+ }
5337
+
5338
+ @keyframes brain-emergence-enter {
5339
+ from {
5340
+ opacity: 0;
5341
+ transform: translateY(4px);
5342
+ }
5343
+ to {
5344
+ opacity: 1;
5345
+ transform: translateY(0);
5346
+ }
5347
+ }
5348
+
5349
+ @media (prefers-reduced-motion: reduce) {
5350
+ .brain-emergence-item {
5351
+ animation: none;
5352
+ }
5353
+ }
5354
+
5355
+ .brain-emergence-type {
5356
+ border: 1px solid hsl(var(--brain-core) / 0.5);
5357
+ border-radius: 999px;
5358
+ background: hsl(var(--brain-core) / 0.12);
5359
+ color: hsl(var(--fg));
5360
+ padding: 0.05rem 0.4rem;
5361
+ font-size: 0.6rem;
5362
+ font-weight: 800;
5363
+ }
5364
+
5365
+ .brain-emergence-label {
5366
+ overflow: hidden;
5367
+ color: hsl(var(--fg));
5368
+ font-size: 0.74rem;
5369
+ font-weight: 680;
5370
+ text-overflow: ellipsis;
5371
+ white-space: nowrap;
5372
+ }
5373
+
5374
+ .brain-emergence-counts {
5375
+ grid-column: 2;
5376
+ display: flex;
5377
+ flex-wrap: wrap;
5378
+ gap: 0.3rem;
5379
+ }
5380
+
5381
+ .brain-emergence-counts strong {
5382
+ color: hsl(var(--memory));
5383
+ font-size: 0.62rem;
5384
+ font-weight: 800;
5385
+ }
5386
+
5387
+ .brain-emergence-at {
5388
+ grid-column: 3;
5389
+ grid-row: 1 / span 2;
5390
+ align-self: center;
5391
+ color: hsl(var(--fg-muted));
5392
+ font-size: 0.62rem;
5393
+ font-weight: 640;
5394
+ white-space: nowrap;
5395
+ }
5396
+
5397
+ /* ============================================================
5398
+ Track: Workspace/profile switcher + admin surface discovery
5399
+ Adds discoverable shell entry points for workspace/profile
5400
+ switching and the admin console. Token-native, additive.
5401
+ ============================================================ */
5402
+ .brain-shell-switchers {
5403
+ display: inline-flex;
5404
+ flex-wrap: wrap;
5405
+ align-items: center;
5406
+ gap: 0.4rem;
5407
+ margin-left: auto;
5408
+ }
5409
+
5410
+ .external-consent-status {
5411
+ margin: 0 0 0.85rem;
5412
+ }
5413
+
5414
+ .feedback-state {
5415
+ display: flex;
5416
+ align-items: center;
5417
+ gap: 0.7rem;
5418
+ border: 1px solid hsl(var(--border) / 0.58);
5419
+ border-radius: 8px;
5420
+ background: hsl(var(--surface-glass));
5421
+ color: hsl(var(--fg));
5422
+ padding: 0.7rem 0.78rem;
5423
+ }
5424
+
5425
+ .feedback-state.is-empty {
5426
+ border-color: hsl(var(--memory) / 0.28);
5427
+ background: hsl(var(--memory) / 0.05);
5428
+ }
5429
+
5430
+ .feedback-state.is-error {
5431
+ border-color: hsl(var(--danger, 0 64% 56%) / 0.35);
5432
+ background: hsl(var(--danger, 0 64% 56%) / 0.07);
5433
+ }
5434
+
5435
+ .feedback-state-icon {
5436
+ display: inline-flex;
5437
+ align-items: center;
5438
+ justify-content: center;
5439
+ width: 1.75rem;
5440
+ height: 1.75rem;
5441
+ flex: 0 0 auto;
5442
+ border-radius: 999px;
5443
+ background: hsl(var(--surface) / 0.8);
5444
+ color: hsl(var(--fg-muted));
5445
+ }
5446
+
5447
+ .feedback-state.is-error .feedback-state-icon {
5448
+ color: hsl(var(--danger, 0 64% 56%));
5449
+ }
5450
+
5451
+ .feedback-state-body {
5452
+ display: grid;
5453
+ gap: 0.12rem;
5454
+ min-width: 0;
5455
+ flex: 1 1 auto;
5456
+ }
5457
+
5458
+ .feedback-state-body strong {
5459
+ font-size: 0.78rem;
5460
+ font-weight: 820;
5461
+ }
5462
+
5463
+ .feedback-state-body span {
5464
+ color: hsl(var(--fg-muted));
5465
+ font-size: 0.7rem;
5466
+ line-height: 1.35;
5467
+ }
5468
+
5469
+ .feedback-state-action {
5470
+ display: inline-flex;
5471
+ align-items: center;
5472
+ gap: 0.32rem;
5473
+ flex: 0 0 auto;
5474
+ min-height: 1.9rem;
5475
+ border: 1px solid hsl(var(--border) / 0.6);
5476
+ border-radius: 7px;
5477
+ background: hsl(var(--surface) / 0.72);
5478
+ color: hsl(var(--fg));
5479
+ padding: 0 0.62rem;
5480
+ font-size: 0.68rem;
5481
+ font-weight: 760;
5482
+ cursor: pointer;
5483
+ }
5484
+
5485
+ .feedback-state-action:hover,
5486
+ .feedback-state-action:focus-visible {
5487
+ border-color: hsl(var(--brain-core) / 0.7);
5488
+ background: hsl(var(--brain-core) / 0.08);
5489
+ outline: none;
5490
+ }
5491
+
5492
+ .workspace-profile-switcher {
5493
+ position: relative;
5494
+ display: inline-flex;
5495
+ }
5496
+
5497
+ .workspace-profile-trigger {
5498
+ display: inline-flex;
5499
+ align-items: center;
5500
+ gap: 0.45rem;
5501
+ min-height: 2rem;
5502
+ max-width: 16rem;
5503
+ border: 1px solid hsl(var(--border) / 0.58);
5504
+ border-radius: 999px;
5505
+ background: hsl(var(--surface-glass));
5506
+ color: hsl(var(--fg-muted));
5507
+ padding: 0 0.62rem;
5508
+ font-size: 0.68rem;
5509
+ font-weight: 820;
5510
+ letter-spacing: 0;
5511
+ cursor: pointer;
5512
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5513
+ }
5514
+
5515
+ .workspace-profile-trigger:hover,
5516
+ .workspace-profile-trigger:focus-visible,
5517
+ .workspace-profile-switcher .workspace-profile-trigger[aria-expanded="true"] {
5518
+ border-color: hsl(var(--brain-core) / 0.72);
5519
+ background: hsl(var(--brain-core) / 0.08);
5520
+ color: hsl(var(--fg));
5521
+ outline: none;
5522
+ }
5523
+
5524
+ .workspace-profile-trigger-text {
5525
+ display: flex;
5526
+ flex-direction: column;
5527
+ align-items: flex-start;
5528
+ min-width: 0;
5529
+ line-height: 1.1;
5530
+ }
5531
+
5532
+ .workspace-profile-trigger-name {
5533
+ max-width: 11rem;
5534
+ overflow: hidden;
5535
+ text-overflow: ellipsis;
5536
+ white-space: nowrap;
5537
+ color: hsl(var(--fg));
5538
+ }
5539
+
5540
+ .workspace-profile-trigger-owner {
5541
+ max-width: 11rem;
5542
+ overflow: hidden;
5543
+ text-overflow: ellipsis;
5544
+ white-space: nowrap;
5545
+ font-size: 0.58rem;
5546
+ font-weight: 640;
5547
+ color: hsl(var(--fg-muted));
5548
+ }
5549
+
5550
+ .workspace-profile-popover {
5551
+ position: absolute;
5552
+ top: calc(100% + 0.45rem);
5553
+ right: 0;
5554
+ z-index: 40;
5555
+ width: min(20rem, calc(100vw - 2rem));
5556
+ display: flex;
5557
+ flex-direction: column;
5558
+ gap: 0.7rem;
5559
+ border: 1px solid hsl(var(--border) / 0.7);
5560
+ border-radius: 12px;
5561
+ background: hsl(var(--surface));
5562
+ padding: 0.85rem;
5563
+ box-shadow: 0 18px 48px -24px hsl(24 14% 4% / 0.8);
5564
+ }
5565
+
5566
+ .workspace-profile-section {
5567
+ display: flex;
5568
+ flex-direction: column;
5569
+ gap: 0.4rem;
5570
+ }
5571
+
5572
+ .workspace-profile-section + .workspace-profile-section {
5573
+ border-top: 1px solid hsl(var(--border) / 0.5);
5574
+ padding-top: 0.7rem;
5575
+ }
5576
+
5577
+ .workspace-profile-section-head {
5578
+ display: inline-flex;
5579
+ align-items: center;
5580
+ gap: 0.35rem;
5581
+ color: hsl(var(--fg-muted));
5582
+ font-size: 0.62rem;
5583
+ font-weight: 820;
5584
+ text-transform: uppercase;
5585
+ letter-spacing: 0.04em;
5586
+ }
5587
+
5588
+ .workspace-profile-owner-row {
5589
+ display: flex;
5590
+ align-items: baseline;
5591
+ justify-content: space-between;
5592
+ gap: 0.5rem;
5593
+ }
5594
+
5595
+ .workspace-profile-owner-label {
5596
+ color: hsl(var(--fg-muted));
5597
+ font-size: 0.7rem;
5598
+ }
5599
+
5600
+ .workspace-profile-owner-value {
5601
+ min-width: 0;
5602
+ overflow: hidden;
5603
+ text-overflow: ellipsis;
5604
+ white-space: nowrap;
5605
+ color: hsl(var(--fg));
5606
+ font-size: 0.74rem;
5607
+ font-weight: 720;
5608
+ }
5609
+
5610
+ .workspace-profile-empty {
5611
+ margin: 0;
5612
+ color: hsl(var(--fg-muted));
5613
+ font-size: 0.72rem;
5614
+ }
5615
+
5616
+ .workspace-profile-list {
5617
+ display: flex;
5618
+ flex-direction: column;
5619
+ gap: 0.3rem;
5620
+ margin: 0;
5621
+ padding: 0;
5622
+ list-style: none;
5623
+ }
5624
+
5625
+ .workspace-profile-item {
5626
+ display: flex;
5627
+ align-items: center;
5628
+ justify-content: space-between;
5629
+ gap: 0.5rem;
5630
+ width: 100%;
5631
+ min-height: 2.1rem;
5632
+ border: 1px solid hsl(var(--border) / 0.5);
5633
+ border-radius: 8px;
5634
+ background: transparent;
5635
+ color: hsl(var(--fg));
5636
+ padding: 0 0.62rem;
5637
+ font-size: 0.74rem;
5638
+ font-weight: 680;
5639
+ text-align: left;
5640
+ cursor: pointer;
5641
+ transition: border-color 150ms ease, background 150ms ease;
5642
+ }
5643
+
5644
+ .workspace-profile-item:hover,
5645
+ .workspace-profile-item:focus-visible {
5646
+ border-color: hsl(var(--brain-core) / 0.6);
5647
+ background: hsl(var(--brain-core) / 0.06);
5648
+ outline: none;
5649
+ }
5650
+
5651
+ .workspace-profile-item.is-active {
5652
+ border-color: hsl(var(--brain-core) / 0.66);
5653
+ background: hsl(var(--brain-core) / 0.1);
5654
+ font-weight: 820;
5655
+ }
5656
+
5657
+ .workspace-profile-item-name {
5658
+ min-width: 0;
5659
+ overflow: hidden;
5660
+ text-overflow: ellipsis;
5661
+ white-space: nowrap;
5662
+ }
5663
+
5664
+ .workspace-profile-item-flag,
5665
+ .workspace-profile-item-switch {
5666
+ display: inline-flex;
5667
+ align-items: center;
5668
+ gap: 0.25rem;
5669
+ flex: 0 0 auto;
5670
+ font-size: 0.62rem;
5671
+ font-weight: 740;
5672
+ }
5673
+
5674
+ .workspace-profile-item-flag {
5675
+ color: hsl(var(--brain-core));
5676
+ }
5677
+
5678
+ .workspace-profile-item-switch {
5679
+ color: hsl(var(--fg-muted));
5680
+ }
5681
+
5682
+ .workspace-profile-link {
5683
+ align-self: flex-start;
5684
+ border: 0;
5685
+ border-radius: 6px;
5686
+ background: transparent;
5687
+ color: hsl(var(--brain-core));
5688
+ padding: 0.2rem 0;
5689
+ font-size: 0.7rem;
5690
+ font-weight: 760;
5691
+ cursor: pointer;
5692
+ }
5693
+
5694
+ .workspace-profile-link:hover,
5695
+ .workspace-profile-link:focus-visible {
5696
+ text-decoration: underline;
5697
+ outline: none;
5698
+ }
5699
+
5700
+ .admin-access-gate {
5701
+ display: inline-flex;
5702
+ align-items: center;
5703
+ gap: 0.4rem;
5704
+ }
5705
+
5706
+ .vscode-sync-status {
5707
+ display: inline-flex;
5708
+ align-items: center;
5709
+ gap: 0.42rem;
5710
+ min-height: 2rem;
5711
+ border: 1px solid hsl(var(--border) / 0.58);
5712
+ border-radius: 999px;
5713
+ background: hsl(var(--surface-glass));
5714
+ color: hsl(var(--fg-muted));
5715
+ padding: 0 0.62rem;
5716
+ font-size: 0.68rem;
5717
+ font-weight: 820;
5718
+ letter-spacing: 0;
5719
+ cursor: pointer;
5720
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5721
+ }
5722
+
5723
+ .vscode-sync-status:hover,
5724
+ .vscode-sync-status:focus-visible {
5725
+ border-color: hsl(var(--brain-core) / 0.72);
5726
+ background: hsl(var(--brain-core) / 0.08);
5727
+ color: hsl(var(--fg));
5728
+ outline: none;
5729
+ }
5730
+
5731
+ .vscode-sync-dot {
5732
+ width: 0.46rem;
5733
+ height: 0.46rem;
5734
+ border-radius: 999px;
5735
+ background: hsl(var(--fg-muted));
5736
+ box-shadow: 0 0 0 3px hsl(var(--fg-muted) / 0.12);
5737
+ }
5738
+
5739
+ .vscode-sync-status.is-synced .vscode-sync-dot,
5740
+ .vscode-sync-status.is-connected .vscode-sync-dot {
5741
+ background: hsl(var(--memory));
5742
+ box-shadow: 0 0 0 3px hsl(var(--memory) / 0.16);
5743
+ }
5744
+
5745
+ .vscode-sync-status.is-indexing .vscode-sync-dot,
5746
+ .vscode-sync-status.is-checking .vscode-sync-dot {
5747
+ background: hsl(var(--brain-core));
5748
+ box-shadow: 0 0 0 3px hsl(var(--brain-core) / 0.16);
5749
+ }
5750
+
5751
+ .vscode-sync-status.is-offline .vscode-sync-dot {
5752
+ background: hsl(var(--danger, 0 64% 56%));
5753
+ box-shadow: 0 0 0 3px hsl(var(--danger, 0 64% 56%) / 0.12);
5754
+ }
5755
+
5756
+ .vscode-sync-copy {
5757
+ display: flex;
5758
+ flex-direction: column;
5759
+ align-items: flex-start;
5760
+ line-height: 1.05;
5761
+ }
5762
+
5763
+ .vscode-sync-copy strong {
5764
+ color: hsl(var(--fg));
5765
+ font-size: 0.66rem;
5766
+ }
5767
+
5768
+ .vscode-sync-copy small {
5769
+ color: hsl(var(--fg-muted));
5770
+ font-size: 0.56rem;
5771
+ font-weight: 680;
5772
+ }
5773
+
5774
+ .admin-access-button {
5775
+ display: inline-flex;
5776
+ align-items: center;
5777
+ gap: 0.35rem;
5778
+ min-height: 2rem;
5779
+ border: 1px solid hsl(var(--border) / 0.58);
5780
+ border-radius: 999px;
5781
+ background: hsl(var(--surface-glass));
5782
+ color: hsl(var(--fg-muted));
5783
+ padding: 0 0.62rem;
5784
+ font-size: 0.68rem;
5785
+ font-weight: 820;
5786
+ letter-spacing: 0;
5787
+ cursor: pointer;
5788
+ transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
5789
+ }
5790
+
5791
+ .admin-access-button:hover,
5792
+ .admin-access-button:focus-visible {
5793
+ border-color: hsl(var(--brain-core) / 0.72);
5794
+ background: hsl(var(--brain-core) / 0.08);
5795
+ color: hsl(var(--fg));
5796
+ outline: none;
5797
+ }
5798
+
5799
+ .admin-access-button.is-locked {
5800
+ color: hsl(var(--fg-muted));
5801
+ opacity: 0.85;
5802
+ }
5803
+
5804
+ .admin-access-button.is-locked:hover,
5805
+ .admin-access-button.is-locked:focus-visible {
5806
+ border-color: hsl(var(--border) / 0.8);
5807
+ background: hsl(var(--surface));
5808
+ color: hsl(var(--fg));
5809
+ }
5810
+
5811
+ .mode-switcher-mini {
5812
+ display: inline-flex;
5813
+ align-items: center;
5814
+ gap: 0.2rem;
5815
+ border: 1px solid hsl(var(--border) / 0.58);
5816
+ border-radius: 999px;
5817
+ background: hsl(var(--surface-glass));
5818
+ padding: 0.18rem;
5819
+ }
5820
+
5821
+ .mode-switcher-mini button {
5822
+ min-height: 1.65rem;
5823
+ border: 0;
5824
+ border-radius: 999px;
5825
+ background: transparent;
5826
+ color: hsl(var(--fg-muted));
5827
+ padding: 0 0.5rem;
5828
+ font-size: 0.64rem;
5829
+ font-weight: 820;
5830
+ letter-spacing: 0;
5831
+ cursor: pointer;
5832
+ }
5833
+
5834
+ .mode-switcher-mini button.is-active {
5835
+ background: hsl(var(--brain-core) / 0.14);
5836
+ color: hsl(var(--fg));
5837
+ }
5838
+
5839
+ .mode-switcher-mini button:focus-visible {
5840
+ outline: 2px solid hsl(var(--ring) / 0.6);
5841
+ outline-offset: 1px;
5842
+ }
5843
+
5844
+ @media (max-width: 640px) {
5845
+ .brain-shell-switchers {
5846
+ margin-left: 0;
5847
+ width: 100%;
5848
+ justify-content: center;
5849
+ }
5850
+
5851
+ .workspace-profile-popover {
5852
+ right: auto;
5853
+ left: 50%;
5854
+ transform: translateX(-50%);
5855
+ }
5856
+ }