aidevops 3.29.21 → 3.29.23

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.
@@ -70,6 +70,61 @@
70
70
  color-scheme: dark;
71
71
  }
72
72
 
73
+ :root[data-contrast="medium"] {
74
+ --bg-secondary: #f3f3f3;
75
+ --bg-tertiary: #e8e8e8;
76
+ --border: color-mix(in srgb, rgb(0 0 0 / 26%) 74%, rgb(255 255 255 / 36%));
77
+ --border-hover: color-mix(in srgb, rgb(0 0 0 / 40%) 80%, rgb(255 255 255 / 32%));
78
+ --surface-elevated: #ffffff;
79
+ --surface-muted: #e8e8e8;
80
+ --text-muted: rgb(0 0 0 / 68%);
81
+ --text-secondary: rgb(0 0 0 / 84%);
82
+ }
83
+
84
+ :root[data-theme="dark"][data-contrast="medium"] {
85
+ --bg-primary: #050505;
86
+ --bg-secondary: #0b0b0b;
87
+ --bg-tertiary: #141414;
88
+ --border: color-mix(in srgb, rgb(255 255 255 / 22%) 78%, rgb(255 255 255 / 44%));
89
+ --border-hover: color-mix(in srgb, rgb(255 255 255 / 36%) 80%, rgb(255 255 255 / 52%));
90
+ --surface-elevated: #101010;
91
+ --surface-muted: #181818;
92
+ --text-muted: rgb(255 255 255 / 58%);
93
+ --text-secondary: rgb(255 255 255 / 82%);
94
+ }
95
+
96
+ :root[data-contrast="high"] {
97
+ --bg-primary: #ffffff;
98
+ --bg-secondary: #ffffff;
99
+ --bg-tertiary: #f4f4f4;
100
+ --border: rgb(0 0 0 / 48%);
101
+ --border-hover: #000000;
102
+ --code-bg: #ffffff;
103
+ --glass-panel-shadow: inset 0 0 0 1px rgb(0 0 0 / 18%);
104
+ --shadow-soft: 0 18px 56px rgb(0 0 0 / 18%);
105
+ --surface-elevated: #ffffff;
106
+ --surface-muted: #ffffff;
107
+ --text-muted: #333333;
108
+ --text-primary: #000000;
109
+ --text-secondary: #000000;
110
+ }
111
+
112
+ :root[data-theme="dark"][data-contrast="high"] {
113
+ --bg-primary: #000000;
114
+ --bg-secondary: #000000;
115
+ --bg-tertiary: #050505;
116
+ --border: rgb(255 255 255 / 56%);
117
+ --border-hover: #ffffff;
118
+ --code-bg: #000000;
119
+ --glass-panel-shadow: inset 0 0 0 1px rgb(255 255 255 / 24%);
120
+ --shadow-soft: 0 24px 80px rgb(0 0 0 / 72%);
121
+ --surface-elevated: #000000;
122
+ --surface-muted: #050505;
123
+ --text-muted: #d6d6d6;
124
+ --text-primary: #ffffff;
125
+ --text-secondary: #ffffff;
126
+ }
127
+
73
128
  :root[data-borders="hidden"] {
74
129
  --border: transparent;
75
130
  --border-hover: transparent;
@@ -763,6 +818,7 @@ code {
763
818
  }
764
819
 
765
820
  .theme-hue-control,
821
+ .contrast-control,
766
822
  .font-size-control,
767
823
  .font-control {
768
824
  display: grid;
@@ -782,6 +838,7 @@ code {
782
838
  }
783
839
 
784
840
  .theme-control-heading label,
841
+ .contrast-control legend,
785
842
  .font-size-control label,
786
843
  .font-control span {
787
844
  color: var(--text-muted);
@@ -791,6 +848,38 @@ code {
791
848
  text-transform: uppercase;
792
849
  }
793
850
 
851
+ .contrast-control {
852
+ border: 0;
853
+ margin: 0;
854
+ padding: 0;
855
+ }
856
+
857
+ .contrast-options {
858
+ display: grid;
859
+ gap: 6px;
860
+ grid-template-columns: repeat(3, minmax(0, 1fr));
861
+ }
862
+
863
+ .contrast-options button {
864
+ background: var(--surface-elevated);
865
+ border: 1px solid var(--border);
866
+ border-radius: 10px;
867
+ color: var(--text-secondary);
868
+ font-size: 0.72rem;
869
+ font-weight: 900;
870
+ padding: 7px 6px;
871
+ text-transform: uppercase;
872
+ }
873
+
874
+ .contrast-options button:hover,
875
+ .contrast-options button:focus-visible,
876
+ .contrast-options button.active {
877
+ background: color-mix(in srgb, var(--accent) 18%, var(--surface-elevated));
878
+ border-color: color-mix(in srgb, var(--accent) 48%, var(--border));
879
+ color: var(--accent);
880
+ outline: none;
881
+ }
882
+
794
883
  .hue-number-input {
795
884
  background: var(--surface-elevated);
796
885
  border: 1px solid var(--border);
@@ -2570,20 +2659,31 @@ button.managed-toggle:focus-visible {
2570
2659
  color: var(--text-primary);
2571
2660
  font-size: 0.72rem;
2572
2661
  font-weight: 700;
2573
- left: clamp(12px, var(--tooltip-x), calc(100vw - 12px));
2662
+ left: var(--tooltip-x);
2574
2663
  line-height: 1.35;
2575
- max-width: min(440px, 72vw);
2664
+ max-width: min(440px, calc(100vw - 24px));
2576
2665
  overflow-wrap: anywhere;
2577
2666
  padding: 8px 10px;
2578
2667
  pointer-events: none;
2579
2668
  position: fixed;
2580
2669
  text-align: left;
2581
2670
  top: var(--tooltip-y);
2582
- transform: translate(-50%, calc(-100% - 10px));
2583
2671
  width: max-content;
2584
2672
  z-index: 10000;
2585
2673
  }
2586
2674
 
2675
+ .app-global-tooltip.center {
2676
+ transform: translate(-50%, calc(-100% - 10px));
2677
+ }
2678
+
2679
+ .app-global-tooltip.start {
2680
+ transform: translate(0, calc(-100% - 10px));
2681
+ }
2682
+
2683
+ .app-global-tooltip.end {
2684
+ transform: translate(-100%, calc(-100% - 10px));
2685
+ }
2686
+
2587
2687
  .data-row,
2588
2688
  .editable-row {
2589
2689
  display: grid;
@@ -2688,12 +2788,37 @@ button.managed-toggle:focus-visible {
2688
2788
  display: grid;
2689
2789
  gap: 12px;
2690
2790
  padding: 16px;
2791
+ transition: background 150ms ease, border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease;
2792
+ }
2793
+
2794
+ .recommended-app-card:hover,
2795
+ .recommended-app-card:focus-within {
2796
+ background:
2797
+ linear-gradient(135deg, color-mix(in srgb, var(--accent) 16%, transparent), transparent 46%),
2798
+ color-mix(in srgb, var(--accent) 7%, var(--surface-muted));
2799
+ border-color: color-mix(in srgb, var(--accent) 38%, var(--border));
2800
+ box-shadow: 0 18px 46px color-mix(in srgb, var(--accent) 10%, transparent);
2801
+ transform: translateY(-1px);
2691
2802
  }
2692
2803
 
2693
2804
  .recommended-app-card strong {
2694
2805
  font-size: 1.05rem;
2695
2806
  }
2696
2807
 
2808
+ .recommended-app-title-link {
2809
+ color: var(--text-primary);
2810
+ display: inline-flex;
2811
+ text-decoration: none;
2812
+ width: fit-content;
2813
+ }
2814
+
2815
+ .recommended-app-title-link:hover,
2816
+ .recommended-app-title-link:focus-visible {
2817
+ color: var(--accent);
2818
+ outline: none;
2819
+ text-decoration: underline;
2820
+ }
2821
+
2697
2822
  .recommended-app-card p {
2698
2823
  color: var(--text-secondary);
2699
2824
  margin: 4px 0 0;
@@ -2722,11 +2847,18 @@ button.managed-toggle:focus-visible {
2722
2847
  font-size: 1.12rem;
2723
2848
  font-weight: 900;
2724
2849
  justify-content: center;
2850
+ line-height: 1;
2725
2851
  min-height: 24px;
2726
2852
  min-width: 24px;
2727
2853
  padding: 0;
2728
2854
  }
2729
2855
 
2856
+ .os-icon-list svg {
2857
+ display: block;
2858
+ height: 18px;
2859
+ width: 18px;
2860
+ }
2861
+
2730
2862
  .platform-icon-list button {
2731
2863
  cursor: pointer;
2732
2864
  }
@@ -0,0 +1,107 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import type { GuiStatusData } from "../../gui-shared/src";
3
+ import type { ConversationMode, ShellMode, SurfaceId } from "./app-model";
4
+ import type { CommandPaletteSelection } from "./CommandPalette";
5
+
6
+ export function useHeaderMenuState() {
7
+ const [assistantOpen, setAssistantOpen] = useState(false);
8
+ const [notificationsOpen, setNotificationsOpen] = useState(false);
9
+ const [profileOpen, setProfileOpen] = useState(false);
10
+ const headerActionsRef = useRef<HTMLDivElement | null>(null);
11
+ const closeHeaderTimerRef = useRef<number | null>(null);
12
+ const clearScheduledHeaderClose = useCallback(() => {
13
+ if (closeHeaderTimerRef.current !== null) {
14
+ window.clearTimeout(closeHeaderTimerRef.current);
15
+ closeHeaderTimerRef.current = null;
16
+ }
17
+ }, []);
18
+ const closeHeaderMenus = useCallback(() => {
19
+ clearScheduledHeaderClose();
20
+ setAssistantOpen(false);
21
+ setNotificationsOpen(false);
22
+ setProfileOpen(false);
23
+ }, [clearScheduledHeaderClose]);
24
+ const scheduleHeaderMenusClose = useCallback(() => {
25
+ clearScheduledHeaderClose();
26
+ closeHeaderTimerRef.current = window.setTimeout(closeHeaderMenus, 2_400);
27
+ }, [clearScheduledHeaderClose, closeHeaderMenus]);
28
+ const toggleNotifications = useCallback(() => {
29
+ clearScheduledHeaderClose();
30
+ setNotificationsOpen((current) => !current);
31
+ setProfileOpen(false);
32
+ setAssistantOpen(false);
33
+ }, [clearScheduledHeaderClose]);
34
+ const toggleAssistant = useCallback(() => {
35
+ clearScheduledHeaderClose();
36
+ setAssistantOpen((current) => !current);
37
+ setNotificationsOpen(false);
38
+ setProfileOpen(false);
39
+ }, [clearScheduledHeaderClose]);
40
+ const toggleProfile = useCallback(() => {
41
+ clearScheduledHeaderClose();
42
+ setProfileOpen((current) => !current);
43
+ setNotificationsOpen(false);
44
+ setAssistantOpen(false);
45
+ }, [clearScheduledHeaderClose]);
46
+
47
+ useEffect(() => {
48
+ const closeOnPointerDown = (event: PointerEvent) => {
49
+ const target = event.target;
50
+ if (!(target instanceof Node) || !headerActionsRef.current?.contains(target)) {
51
+ closeHeaderMenus();
52
+ }
53
+ };
54
+ const closeOnEscape = (event: KeyboardEvent) => {
55
+ if (event.key === "Escape") {
56
+ closeHeaderMenus();
57
+ }
58
+ };
59
+
60
+ document.addEventListener("pointerdown", closeOnPointerDown, true);
61
+ document.addEventListener("keydown", closeOnEscape);
62
+ return () => {
63
+ document.removeEventListener("pointerdown", closeOnPointerDown, true);
64
+ document.removeEventListener("keydown", closeOnEscape);
65
+ clearScheduledHeaderClose();
66
+ };
67
+ }, [clearScheduledHeaderClose, closeHeaderMenus]);
68
+
69
+ return {
70
+ assistantOpen,
71
+ clearScheduledHeaderClose,
72
+ closeHeaderMenus,
73
+ headerActionsRef,
74
+ notificationsOpen,
75
+ profileOpen,
76
+ scheduleHeaderMenusClose,
77
+ toggleAssistant,
78
+ toggleNotifications,
79
+ toggleProfile,
80
+ };
81
+ }
82
+
83
+ export interface CommandPaletteNavigationActions {
84
+ closeCommandPalette: () => void;
85
+ closeHeaderMenus: () => void;
86
+ setActiveSurface: (surface: SurfaceId) => void;
87
+ setConversationMode: (mode: ConversationMode) => void;
88
+ setSelectedLocalRepoIndex: (index: number) => void;
89
+ setSelectedSessionId: (id: string | undefined) => void;
90
+ setShellMode: (mode: ShellMode) => void;
91
+ status: GuiStatusData;
92
+ }
93
+
94
+ export function applyCommandPaletteSelection({ conversationMode, repoPathRef, sessionId, shellMode, surface }: CommandPaletteSelection, actions: CommandPaletteNavigationActions): void {
95
+ const repoIndex = actions.status.local_repos.repos.findIndex((repo) => repo.path_ref === repoPathRef);
96
+ actions.setShellMode(shellMode ?? "devices");
97
+ if (repoIndex >= 0) {
98
+ actions.setSelectedLocalRepoIndex(repoIndex);
99
+ }
100
+ actions.setSelectedSessionId(sessionId);
101
+ if (conversationMode) {
102
+ actions.setConversationMode(conversationMode);
103
+ }
104
+ actions.setActiveSurface(surface);
105
+ actions.closeHeaderMenus();
106
+ actions.closeCommandPalette();
107
+ }
package/setup.sh CHANGED
@@ -12,7 +12,7 @@ shopt -s inherit_errexit 2>/dev/null || true
12
12
  # AI Assistant Server Access Framework Setup Script
13
13
  # Helps developers set up the framework for their infrastructure
14
14
  #
15
- # Version: 3.29.21
15
+ # Version: 3.29.23
16
16
  #
17
17
  # Quick Install:
18
18
  # npm install -g aidevops && aidevops update (recommended)