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.
- package/README.md +1 -1
- package/VERSION +1 -1
- package/aidevops.sh +1 -1
- package/package.json +1 -1
- package/packages/gui-api/src/status-adapter-utils.ts +9 -5
- package/packages/gui-desktop/scripts/install-macos-app.sh +31 -8
- package/packages/gui-shared/src/notifications.ts +3 -2
- package/packages/gui-web/src/App.tsx +37 -8
- package/packages/gui-web/src/AppActionTerminal.tsx +81 -0
- package/packages/gui-web/src/AppNavigation.tsx +11 -189
- package/packages/gui-web/src/AppWorkspace.tsx +21 -29
- package/packages/gui-web/src/AppearanceControls.tsx +244 -0
- package/packages/gui-web/src/InventoryEditorSurfaces.tsx +99 -0
- package/packages/gui-web/src/InventorySurfaces.tsx +39 -500
- package/packages/gui-web/src/ManagedAppPanel.tsx +142 -0
- package/packages/gui-web/src/RecommendedAppsSurface.tsx +199 -0
- package/packages/gui-web/src/app-model.ts +18 -0
- package/packages/gui-web/src/dashboard.ts +1 -1
- package/packages/gui-web/src/external-links.ts +60 -0
- package/packages/gui-web/src/styles.css +135 -3
- package/packages/gui-web/src/workspace-header-state.ts +107 -0
- package/setup.sh +1 -1
|
@@ -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:
|
|
2662
|
+
left: var(--tooltip-x);
|
|
2574
2663
|
line-height: 1.35;
|
|
2575
|
-
max-width: min(440px,
|
|
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.
|
|
15
|
+
# Version: 3.29.23
|
|
16
16
|
#
|
|
17
17
|
# Quick Install:
|
|
18
18
|
# npm install -g aidevops && aidevops update (recommended)
|