@amd-gaia/agent-ui 0.25.0 → 0.25.1-rc.10
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/assets/tray-icon.png +0 -0
- package/assets/tray-icon@2x.png +0 -0
- package/dist/assets/AdvancedSettings-CtYKNNWc.js +1 -0
- package/dist/assets/AdvancedSettings-D5VKpkPY.css +1 -0
- package/dist/assets/ConnectorsPane-Ctfp9d5s.js +1 -0
- package/dist/assets/ConnectorsPane-Dzu2DRTc.css +1 -0
- package/dist/assets/DocumentLibrary-CIKp6qld.css +1 -0
- package/dist/assets/DocumentLibrary-Fp70O1-8.js +4 -0
- package/dist/assets/FileBrowser-3H3DoJIm.js +4 -0
- package/dist/assets/FileBrowser-D04I8Pvv.css +1 -0
- package/dist/assets/MemoryDashboard-D5HzmtDi.js +1 -0
- package/dist/assets/MemoryDashboard-Mo721-BI.css +1 -0
- package/dist/assets/MobileAccessModal-B9peVPY4.js +2 -0
- package/dist/assets/MobileAccessModal-DuVy9F1u.css +1 -0
- package/dist/assets/ScheduleManager-DotJl5JW.css +1 -0
- package/dist/assets/ScheduleManager-HcGB9P6m.js +2 -0
- package/dist/assets/{jsx-runtime-DVeaULmT.js → apiBase-y00JgRBP.js} +1 -1
- package/dist/assets/eye-B6FejHNG.js +1 -0
- package/dist/assets/fraunces-latin-BwwriW9Y.woff2 +0 -0
- package/dist/assets/index-D2UMLtwY.js +74 -0
- package/dist/assets/index-DF5qku9L.css +1 -0
- package/dist/assets/inter-latin-C2S99t-D.woff2 +0 -0
- package/dist/assets/inter-latin-ext-CFHvXkgd.woff2 +0 -0
- package/dist/assets/message-square-Dwm7y3C0.js +1 -0
- package/dist/fonts-OFL.txt +101 -0
- package/dist/index.html +6 -6
- package/main-safety-net.cjs +54 -7
- package/main.cjs +276 -120
- package/package.json +3 -1
- package/preload.cjs +24 -0
- package/services/agent-process-manager.cjs +116 -13
- package/services/app-icon.cjs +29 -0
- package/services/auto-updater.cjs +26 -2
- package/services/backend-crash-dialog.cjs +102 -0
- package/services/backend-installer-progress-dialog.cjs +71 -43
- package/services/backend-installer.cjs +233 -25
- package/services/chromium-switches.cjs +29 -0
- package/services/keep-awake.cjs +52 -0
- package/services/notification-service.cjs +62 -0
- package/services/port-manager.cjs +19 -70
- package/services/process-tree.cjs +328 -0
- package/services/quit-cleanup.cjs +86 -0
- package/services/quit-guard.cjs +242 -0
- package/services/tray-icons.cjs +174 -0
- package/services/tray-manager.cjs +582 -83
- package/services/tray-state.cjs +231 -0
- package/services/window-keys.cjs +43 -0
- package/assets/tray-icon.ico +0 -0
- package/dist/assets/AdvancedSettings-5cX0pGZc.js +0 -1
- package/dist/assets/AdvancedSettings-Ce6EvcAe.css +0 -1
- package/dist/assets/ConnectorsPane-CG7atLb2.css +0 -1
- package/dist/assets/ConnectorsPane-CuWxzcBY.js +0 -1
- package/dist/assets/DocumentLibrary-BdAKDe8H.js +0 -1
- package/dist/assets/DocumentLibrary-DrIP_032.css +0 -1
- package/dist/assets/FileBrowser-B8s6hKC5.js +0 -4
- package/dist/assets/FileBrowser-Bj6aB6Ro.css +0 -1
- package/dist/assets/MemoryDashboard-DQxtAW90.css +0 -1
- package/dist/assets/MemoryDashboard-DtolA-HZ.js +0 -1
- package/dist/assets/MobileAccessModal-C3nWkpWA.js +0 -2
- package/dist/assets/MobileAccessModal-C_t8DG0n.css +0 -1
- package/dist/assets/ScheduleManager-CIescbX6.css +0 -1
- package/dist/assets/ScheduleManager-HHdD6sko.js +0 -2
- package/dist/assets/dm-sans-latin-Xz1IZZA0.woff2 +0 -0
- package/dist/assets/index-CFVpPQal.css +0 -1
- package/dist/assets/index-DEPbenxC.js +0 -60
- package/dist/assets/message-square-Ccmbk96j.js +0 -1
- package/dist/assets/space-mono-400-Co7bH5Hm.woff2 +0 -0
- package/dist/assets/useEscapeToClose-B8fw5mn-.js +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Copyright(C) 2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Tray and taskbar-overlay icons for each tray state, drawn onto raw bitmaps.
|
|
6
|
+
*
|
|
7
|
+
* Each state adds its own badge shape to the bottom-right of the logo, so the
|
|
8
|
+
* state reads without colour (macOS template images are one colour, and some
|
|
9
|
+
* users can't tell the colours apart):
|
|
10
|
+
*
|
|
11
|
+
* idle no badge
|
|
12
|
+
* working an open ring, like a spinner
|
|
13
|
+
* waiting an hourglass: waiting for the model to load or answer
|
|
14
|
+
* needs-you a solid disc, with "!" wherever the badge is big enough
|
|
15
|
+
* error a solid triangle
|
|
16
|
+
*
|
|
17
|
+
* Bitmaps are Electron's native layout: premultiplied BGRA, row-major.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const STATES = Object.freeze(["idle", "working", "waiting", "needs-you", "error"]);
|
|
21
|
+
|
|
22
|
+
// Mid-tones that hold up on both light and dark taskbars.
|
|
23
|
+
const BADGE_COLORS = Object.freeze({
|
|
24
|
+
working: [0xb0, 0x8d, 0x57], // brass
|
|
25
|
+
waiting: [0x94, 0x8a, 0x7c], // warm gray
|
|
26
|
+
"needs-you": [0xe5, 0xa1, 0x3a], // amber
|
|
27
|
+
error: [0xd9, 0x49, 0x3f], // red
|
|
28
|
+
unread: [0xb0, 0x8d, 0x57],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// The badge sits in a disc of this radius (fraction of the icon) ...
|
|
32
|
+
const BADGE_RADIUS = 0.27;
|
|
33
|
+
// ... cut out of the logo with this much clear space around it.
|
|
34
|
+
const BADGE_GAP = 0.07;
|
|
35
|
+
const SUPERSAMPLE = 4;
|
|
36
|
+
// The "!" needs this badge radius (px) for its 0.32-radius bar to be ~2 px wide.
|
|
37
|
+
const MARK_MIN_RADIUS_PX = 6;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Point-in-shape tests in badge space: u, v in [-1, 1], v grows downward;
|
|
41
|
+
* `radiusPx` is the badge's drawn radius, for detail that needs room.
|
|
42
|
+
*/
|
|
43
|
+
const SHAPES = {
|
|
44
|
+
working(u, v) {
|
|
45
|
+
const r = Math.hypot(u, v);
|
|
46
|
+
if (r > 1 || r < 0.5) return false;
|
|
47
|
+
// A gap in the top-right quarter makes it a spinner, not a plain ring.
|
|
48
|
+
return !(u > 0 && v < 0);
|
|
49
|
+
},
|
|
50
|
+
waiting(u, v) {
|
|
51
|
+
if (Math.abs(v) > 0.95) return false;
|
|
52
|
+
if (Math.abs(v) >= 0.75) return Math.abs(u) <= 0.8;
|
|
53
|
+
return Math.abs(u) <= 0.75 * Math.abs(v) + 0.14;
|
|
54
|
+
},
|
|
55
|
+
"needs-you"(u, v, radiusPx) {
|
|
56
|
+
if (Math.hypot(u, v) > 1) return false;
|
|
57
|
+
// The "!" is what tells needs-you from the unread dot, so draw it wherever it fits.
|
|
58
|
+
if (radiusPx >= MARK_MIN_RADIUS_PX && Math.abs(u) <= 0.16) {
|
|
59
|
+
if (v >= -0.62 && v <= 0.2) return false;
|
|
60
|
+
if (v >= 0.38 && v <= 0.64) return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
},
|
|
64
|
+
error(u, v) {
|
|
65
|
+
if (v < -0.95 || v > 0.85) return false;
|
|
66
|
+
return Math.abs(u) <= ((v + 0.95) / 1.8) * 1.05;
|
|
67
|
+
},
|
|
68
|
+
unread(u, v) {
|
|
69
|
+
return Math.hypot(u, v) <= 1;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/** Fraction of the pixel at (px, py) where `inside(x, y)` holds. */
|
|
74
|
+
function coverage(px, py, inside) {
|
|
75
|
+
let hits = 0;
|
|
76
|
+
for (let sy = 0; sy < SUPERSAMPLE; sy++) {
|
|
77
|
+
for (let sx = 0; sx < SUPERSAMPLE; sx++) {
|
|
78
|
+
if (inside(px + (sx + 0.5) / SUPERSAMPLE, py + (sy + 0.5) / SUPERSAMPLE)) hits++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return hits / (SUPERSAMPLE * SUPERSAMPLE);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function checkBitmap(bitmap) {
|
|
85
|
+
const { width, height, buffer } = bitmap || {};
|
|
86
|
+
if (!Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || width !== height) {
|
|
87
|
+
throw new TypeError(`tray icon bitmap must be square, got ${width}x${height}`);
|
|
88
|
+
}
|
|
89
|
+
if (!Buffer.isBuffer(buffer) || buffer.length !== width * height * 4) {
|
|
90
|
+
throw new TypeError(
|
|
91
|
+
`tray icon bitmap buffer must hold ${width * height * 4} bytes, got ${buffer && buffer.length}`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Draw a badge into `out` (premultiplied BGRA). With `knockout`, first clear
|
|
98
|
+
* the logo under and around the badge so it stands apart from it.
|
|
99
|
+
*/
|
|
100
|
+
function paintBadge(out, size, kind, { template, knockout, center, radius }) {
|
|
101
|
+
const shape = SHAPES[kind];
|
|
102
|
+
if (!shape) throw new Error(`no tray badge shape for "${kind}"`);
|
|
103
|
+
const [r, g, b] = template ? [0, 0, 0] : BADGE_COLORS[kind];
|
|
104
|
+
const cx = center * size;
|
|
105
|
+
const cy = center * size;
|
|
106
|
+
const rad = radius * size;
|
|
107
|
+
const clear = (BADGE_RADIUS + BADGE_GAP) * size;
|
|
108
|
+
|
|
109
|
+
for (let py = 0; py < size; py++) {
|
|
110
|
+
for (let px = 0; px < size; px++) {
|
|
111
|
+
const i = (py * size + px) * 4;
|
|
112
|
+
if (knockout) {
|
|
113
|
+
const cut = coverage(px, py, (x, y) => Math.hypot(x - cx, y - cy) <= clear);
|
|
114
|
+
if (cut > 0) {
|
|
115
|
+
for (let c = 0; c < 4; c++) out[i + c] = Math.round(out[i + c] * (1 - cut));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const cov = coverage(px, py, (x, y) => shape((x - cx) / rad, (y - cy) / rad, rad));
|
|
119
|
+
if (cov === 0) continue;
|
|
120
|
+
const keep = 1 - cov;
|
|
121
|
+
const a = 255 * cov;
|
|
122
|
+
out[i] = Math.round(b * cov + out[i] * keep);
|
|
123
|
+
out[i + 1] = Math.round(g * cov + out[i + 1] * keep);
|
|
124
|
+
out[i + 2] = Math.round(r * cov + out[i + 2] * keep);
|
|
125
|
+
out[i + 3] = Math.round(a + out[i + 3] * keep);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The logo bitmap with `state`'s badge drawn on. Idle returns an unchanged copy.
|
|
132
|
+
*
|
|
133
|
+
* @param {{width:number, height:number, buffer:Buffer}} bitmap Premultiplied BGRA.
|
|
134
|
+
* @param {string} state One of STATES.
|
|
135
|
+
* @param {{template?: boolean}} [opts] Draw in black for a macOS template image.
|
|
136
|
+
* @returns {Buffer}
|
|
137
|
+
*/
|
|
138
|
+
function drawStateIcon(bitmap, state, opts = {}) {
|
|
139
|
+
checkBitmap(bitmap);
|
|
140
|
+
if (!STATES.includes(state)) {
|
|
141
|
+
throw new Error(`unknown tray state "${state}"; expected one of ${STATES.join(", ")}`);
|
|
142
|
+
}
|
|
143
|
+
const out = Buffer.from(bitmap.buffer);
|
|
144
|
+
if (state === "idle") return out;
|
|
145
|
+
const center = 1 - BADGE_RADIUS - 0.01;
|
|
146
|
+
paintBadge(out, bitmap.width, state, {
|
|
147
|
+
template: Boolean(opts.template),
|
|
148
|
+
knockout: true,
|
|
149
|
+
center,
|
|
150
|
+
radius: BADGE_RADIUS,
|
|
151
|
+
});
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* A Windows taskbar overlay: the badge alone, filling a transparent square.
|
|
157
|
+
*
|
|
158
|
+
* @param {"needs-you"|"unread"} kind
|
|
159
|
+
* @param {number} size Pixel size.
|
|
160
|
+
* @returns {Buffer} Premultiplied BGRA.
|
|
161
|
+
*/
|
|
162
|
+
function drawOverlayIcon(kind, size) {
|
|
163
|
+
if (kind !== "needs-you" && kind !== "unread") {
|
|
164
|
+
throw new Error(`no taskbar overlay for "${kind}"; expected needs-you or unread`);
|
|
165
|
+
}
|
|
166
|
+
if (!Number.isInteger(size) || size <= 0) {
|
|
167
|
+
throw new TypeError(`overlay size must be a positive integer, got ${size}`);
|
|
168
|
+
}
|
|
169
|
+
const out = Buffer.alloc(size * size * 4);
|
|
170
|
+
paintBadge(out, size, kind, { template: false, knockout: false, center: 0.5, radius: 0.47 });
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
module.exports = { STATES, BADGE_COLORS, drawStateIcon, drawOverlayIcon };
|