Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
e5477a2
Operator API for computer use [init]
raiden-staging Aug 9, 2025
a5975e3
Operator API for computer use [tests]
raiden-staging Aug 9, 2025
3caacaa
Operator API for computer use [tests*]
raiden-staging Aug 9, 2025
6a2da86
Operator API for computer use [env]
raiden-staging Aug 9, 2025
dc65e6b
Operator API for computer use [debug logs]
raiden-staging Aug 9, 2025
ae2350d
Operator API for computer use [DISPLAY edit for VM debugging]
raiden-staging Aug 9, 2025
cf84046
Operator API for computer use [dotenv]
raiden-staging Aug 9, 2025
e3568ec
Operator API for computer use [dotenv]
raiden-staging Aug 9, 2025
d7a616b
Operator API for computer use [dotenv*]
raiden-staging Aug 9, 2025
3f73d48
Operator API for computer use [dotenv**]
raiden-staging Aug 9, 2025
53e0720
Operator API for computer use [root .gitignore skips all .env]
raiden-staging Aug 9, 2025
ace39f2
Operator API for computer use [test works, prettyprint]
raiden-staging Aug 9, 2025
e59c6ba
Operator API for computer use [debug logs]
raiden-staging Aug 9, 2025
1d77395
Operator API for computer use [recording test nodelete]
raiden-staging Aug 9, 2025
22e9da3
Operator API for computer use [debug]
raiden-staging Aug 9, 2025
f6cddba
Operator API for computer use [test base url]
raiden-staging Aug 9, 2025
b11231c
Operator API for computer use [better debug]
raiden-staging Aug 9, 2025
6590505
Operator API for computer use [better debug*]
raiden-staging Aug 9, 2025
10f4c18
Operator API for computer use [new *-nodelete tests]
raiden-staging Aug 9, 2025
041b6a4
Operator API for computer use [tests checklist]
raiden-staging Aug 9, 2025
ea31743
Operator API for computer use [added clipboard stream]
raiden-staging Aug 9, 2025
8e8e8e8
Operator API for computer use [clipboard dotenv]
raiden-staging Aug 9, 2025
185ad06
Operator API for computer use [clipboard fix]
raiden-staging Aug 9, 2025
81ee3ac
Operator API for computer use [updated input, openapi matching routes…
raiden-staging Aug 9, 2025
e702791
Operator API for computer use [more tests]
raiden-staging Aug 9, 2025
68de30c
Operator API for computer use [input:xdotool:env]
raiden-staging Aug 9, 2025
97528c4
Operator API for computer use [input:xdotool:env*]
raiden-staging Aug 9, 2025
b0ee7f3
Operator API for computer use [input:xdotool:bin from env]
raiden-staging Aug 9, 2025
f4bab78
Operator API for computer use [input:test fix]
raiden-staging Aug 9, 2025
4bf0592
Operator API for computer use [input:windows:tests update]
raiden-staging Aug 9, 2025
a186f15
Operator API for computer use [input:window:multiple ids for close]
raiden-staging Aug 9, 2025
ee7083c
Operator API for computer use [input:combo:tests update]
raiden-staging Aug 9, 2025
a6348e8
Operator API for computer use [macros:fix for xdotool]
raiden-staging Aug 9, 2025
65ee3cd
Operator API for computer use [scripts fix]
raiden-staging Aug 9, 2025
6cb3b3c
Operator API for computer use [debug:logs]
raiden-staging Aug 9, 2025
eddff67
Operator API [build + into Docker attempt]
raiden-staging Aug 10, 2025
ef69006
Operator API [build + into Docker attempt*]
raiden-staging Aug 11, 2025
83130d0
Operator API [build + into Docker attempt**]
raiden-staging Aug 11, 2025
05d008e
Operator API [build + into Docker attempt***]
raiden-staging Aug 11, 2025
d8fc567
Operator API [build + into Docker attempt****]
raiden-staging Aug 11, 2025
8d0ec48
Operator API [build + into Docker attempt*****]
raiden-staging Aug 11, 2025
89504d7
Operator API [build + into Docker attempt******]
raiden-staging Aug 11, 2025
cf21b7d
Operator API [build + into Docker attempt*******]
raiden-staging Aug 11, 2025
b9c283b
Operator API [build + into Docker attempt : removed socks5]
raiden-staging Aug 11, 2025
e529521
Operator API [build + into Docker attempt : lightweight test]
raiden-staging Aug 11, 2025
f1e5c89
Operator API [updated bin paths in env]
raiden-staging Aug 11, 2025
04873ac
Operator API [test logs]
raiden-staging Aug 11, 2025
307ee27
Operator API [tests list]
raiden-staging Aug 11, 2025
f1e6d65
Operator API [tests update]
raiden-staging Aug 11, 2025
10584fb
Operator API [tests update*]
raiden-staging Aug 11, 2025
13b6148
Operator API [tests update**]
raiden-staging Aug 11, 2025
3b6f719
Operator API [operator api launch]
raiden-staging Aug 11, 2025
1eacf42
Operator API [🙄🙄🙄]
raiden-staging Aug 11, 2025
9607ed0
Operator API🙄]
raiden-staging Aug 11, 2025
8e354c4
Operator API [port mapping , add WITH_KERNEL_IMAGES_API
raiden-staging Aug 11, 2025
37d6eba
Operator API [port mapping , add WITH_KERNEL_IMAGES_API]
raiden-staging Aug 11, 2025
125cf92
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
1f4dc5a
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
babd04e
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
ee1f6bd
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
974957a
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
cf89744
Operator API [inside of you there are 2 wolves : WITH_KERNEL_OPERATOR…
raiden-staging Aug 11, 2025
f04ccf8
nit loader
raiden-staging Aug 11, 2025
ab2bea7
Operator API [unikraft build]
raiden-staging Aug 11, 2025
53f4678
Operator API [unikraft build debug? ; added chrome ext install route …
raiden-staging Aug 11, 2025
a350133
Operator API [unikraft build erofs -b fix ; debugging uinikraft with …
raiden-staging Aug 11, 2025
d9e9677
Operator API [works in unikraft 🤗 ; fix attempt for operator:chrome-e…
raiden-staging Aug 11, 2025
3e030fc
Operator API [operator-api : remote chrome ext install fix attempt*]
raiden-staging Aug 11, 2025
d24b97a
Operator API [operator-api : remote chrome ext works ; added auto pin…
raiden-staging Aug 11, 2025
b92ca5e
Added Operator API (v1) 🎉 | Packaged with kernel-images 📦 | Tested de…
raiden-staging Aug 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
338 changes: 222 additions & 116 deletions images/chromium-headful/Dockerfile

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions images/chromium-headful/Kraftfile.erofs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
spec: v0.6

runtime: index.unikraft.io/official/base-compat:latest

labels:
cloud.unikraft.v1.instances/scale_to_zero.policy: "idle"
cloud.unikraft.v1.instances/scale_to_zero.stateful: "true"
cloud.unikraft.v1.instances/scale_to_zero.cooldown_time_ms: 5000

rootfs: ./initrd

cmd: ["/wrapper.sh"]
12 changes: 12 additions & 0 deletions images/chromium-headful/Kraftfile.no-erofs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
spec: v0.6

runtime: index.unikraft.io/official/base-compat:latest

labels:
cloud.unikraft.v1.instances/scale_to_zero.policy: "on"
cloud.unikraft.v1.instances/scale_to_zero.stateful: "true"
cloud.unikraft.v1.instances/scale_to_zero.cooldown_time_ms: 4000

rootfs: ./Dockerfile

cmd: ["/wrapper.sh"]
3 changes: 3 additions & 0 deletions images/chromium-headful/build-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@ source ../../shared/start-buildkit.sh
# Build the kernel-images API binary and place it into ./bin for Docker build context
source ../../shared/build-server.sh "$(pwd)/bin"

# Build operator api + test + .env → ./bin
source ../../shared/build-operator-api.sh "$(pwd)/bin"

# Build (and optionally push) the Docker image.
docker build -t "$IMAGE" .
96 changes: 67 additions & 29 deletions images/chromium-headful/build-unikernel.sh
Original file line number Diff line number Diff line change
@@ -1,37 +1,75 @@
#!/usr/bin/env bash

# Flag to control whether to use EROFS or not
EROFS_DISABLE=${EROFS_DISABLE:-false}

# Move to the script's directory so relative paths work regardless of the caller CWD
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
cd "$SCRIPT_DIR"
source "$SCRIPT_DIR/../../shared/ensure-common-build-run-vars.sh" chromium-headful
source "$SCRIPT_DIR/../../shared/erofs-utils.sh"

# Ensure the mkfs.erofs tool is available
if ! check_mkfs_erofs; then
echo "mkfs.erofs is not installed. Installing erofs-utils..."
install_erofs_utils
fi
# Copy the appropriate Kraftfile based on EROFS_DISABLE flag
if [ "$EROFS_DISABLE" = "false" ]; then
echo "Using EROFS configuration (default)..."
cp Kraftfile.erofs Kraftfile
source "$SCRIPT_DIR/../../shared/erofs-utils.sh"

# Ensure the mkfs.erofs tool is available
if ! check_mkfs_erofs; then
echo "mkfs.erofs is not installed. Installing erofs-utils..."
install_erofs_utils
fi

set -euo pipefail

# Build the root file system
source ../../shared/start-buildkit.sh

rm -rf ./.rootfs || true

# Build the API binary
source ../../shared/build-server.sh "$(pwd)/bin"

set -euo pipefail

# Build the root file system
source ../../shared/start-buildkit.sh
rm -rf ./.rootfs || true
# Build the API binary
source ../../shared/build-server.sh "$(pwd)/bin"
app_name=chromium-headful-build
docker build --platform linux/amd64 -t "$IMAGE" .
docker rm cnt-"$app_name" || true
docker create --platform linux/amd64 --name cnt-"$app_name" "$IMAGE" /bin/sh
docker cp cnt-"$app_name":/ ./.rootfs
rm -f initrd || true
sudo mkfs.erofs --all-root -d2 -E noinline_data -b 4096 initrd ./.rootfs

# Package the unikernel (and the new initrd) to KraftCloud
kraft pkg \
--name $UKC_INDEX/$IMAGE \
--plat kraftcloud \
--arch x86_64 \
--strategy overwrite \
--push \
.
# Build operator api + test + .env → ./bin
source ../../shared/build-operator-api.sh "$(pwd)/bin"

app_name=chromium-headful-build
docker build --platform linux/amd64 -t "$IMAGE" .
docker rm cnt-"$app_name" || true
docker create --platform linux/amd64 --name cnt-"$app_name" "$IMAGE" /bin/sh
docker cp cnt-"$app_name":/ ./.rootfs
rm -f initrd || true
# sudo mkfs.erofs --all-root -d2 -E noinline_data -b 4096 initrd ./.rootfs
# default block size is 4096 and -b fails for some reason, removed it
sudo mkfs.erofs --all-root -d2 -E noinline_data initrd ./.rootfs

# Package the unikernel (and the new initrd) to KraftCloud
kraft pkg \
--name $UKC_INDEX/$IMAGE \
--plat kraftcloud \
--arch x86_64 \
--strategy overwrite \
--push \
.
else
echo "Using non-EROFS configuration..."
cp Kraftfile.no-erofs Kraftfile

set -euo pipefail

source ../../shared/start-buildkit.sh

# Build the API binary
source ../../shared/build-server.sh "$(pwd)/bin"

# Build operator api + test + .env → ./bin
source ../../shared/build-operator-api.sh "$(pwd)/bin"

# Package the unikernel to KraftCloud
kraft pkg \
--name $UKC_INDEX/$IMAGE \
--plat kraftcloud --arch x86_64 \
--strategy overwrite \
--push \
.
fi
2 changes: 1 addition & 1 deletion images/chromium-headful/client/public/browserconfig.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#19bd9c</TileColor>
<TileColor>#7B42F6</TileColor>
</tile>
</msapplication>
</browserconfig>
6 changes: 3 additions & 3 deletions images/chromium-headful/client/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<link rel="manifest" href="site.webmanifest">
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#19bd9c">
<meta name="msapplication-TileColor" content="#19bd9c">
<meta name="theme-color" content="#19bd9c">
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#7B42F6">
<meta name="msapplication-TileColor" content="#7B42F6">
<meta name="theme-color" content="#7B42F6">
<style> /* weird iOS bug, if this is not set right here, video just does not start */ .video-container { width: 100%; height: 100%; } </style>
</head>
<body>
Expand Down
4 changes: 4 additions & 0 deletions images/chromium-headful/client/public/kernel.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions images/chromium-headful/client/public/site.webmanifest
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"type": "image/png"
}
],
"theme_color": "#19bd9c",
"background_color": "#19bd9c",
"theme_color": "#7B42F6",
"background_color": "#7B42F6",
"display": "standalone"
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,9 @@ $background-modifier-accent: hsla(0, 0%, 100%, 0.06);
$elevation-low: 0 1px 0 rgba(4, 4, 5, 0.2), 0 1.5px 0 rgba(6, 6, 7, 0.05), 0 2px 0 rgba(4, 4, 5, 0.05);
$elevation-high: 0 8px 16px rgba(0, 0, 0, 0.24);

$style-primary: #19bd9c;
$style-primary: #7B42F6;
$style-error: #d32f2f;

$menu-height: 40px;
$controls-height: 125px;
$side-width: 400px;

38 changes: 11 additions & 27 deletions images/chromium-headful/client/src/components/connect.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
</button>
</form>
<div class="loader" v-if="connecting">
<div class="bounce1"></div>
<div class="bounce2"></div>
<img src="/kernel.svg" class="spinning-logo" alt="Loading..." />
</div>
</div>
</div>
Expand Down Expand Up @@ -103,40 +102,25 @@
.loader {
width: 90px;
height: 90px;
position: relative;
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;

.bounce1,
.bounce2 {
.spinning-logo {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: $style-primary;
opacity: 0.6;
position: absolute;
top: 0;
left: 0;

-webkit-animation: bounce 2s infinite ease-in-out;
animation: bounce 2s infinite ease-in-out;
}

.bounce2 {
-webkit-animation-delay: -1s;
animation-delay: -1s;
animation: spin 2s linear infinite;
}
}
}

@keyframes bounce {
0%,
100% {
transform: scale(0);
-webkit-transform: scale(0);
@keyframes spin {
from {
transform: rotate(0deg);
}
50% {
transform: scale(1);
-webkit-transform: scale(1);
to {
transform: rotate(360deg);
}
}
}
Expand Down
57 changes: 55 additions & 2 deletions images/chromium-headful/client/src/components/video.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div ref="component" class="video">
<div ref="player" class="player">
<div ref="player" class="player" :class="{ 'is-muted': muted }">
<div ref="container" class="player-container">
<video ref="video" playsinline />
<div class="emotes">
Expand Down Expand Up @@ -85,6 +85,19 @@
</template>

<style lang="scss" scoped>
/* KERNEL MODIFICATION: Keyframes for the mute indicator pulse effect */
@keyframes mute-pulse {
0% {
box-shadow: inset 0 0 0 2px rgba(255, 80, 80, 0.2);
}
50% {
box-shadow: inset 0 0 0 2px rgba(255, 80, 80, 0.4);
}
100% {
box-shadow: inset 0 0 0 2px rgba(255, 80, 80, 0.2);
}
}

.video {
width: 100%;
height: 100%;
Expand All @@ -96,6 +109,11 @@
align-items: center;
background: #000;

/* KERNEL MODIFICATION: Style for the mute indicator */
&.is-muted {
animation: mute-pulse 2s infinite;
}

.video-menu {
position: absolute;
right: 20px;
Expand Down Expand Up @@ -259,6 +277,10 @@
private fullscreen = false
private mutedOverlay = true

/* KERNEL MODIFICATION: State flag to ensure unmute happens only once. */
private hasInteracted = false
private unmuteHandler: (() => void) | null = null

get admin() {
return this.$accessor.user.admin
}
Expand Down Expand Up @@ -470,6 +492,23 @@
}
}

/* KERNEL MODIFICATION: Centralized one-time unmute logic. */
_unmuteOnFirstInteraction() {
if (this.hasInteracted || !this.muted) {
return
}

this.hasInteracted = true
this.unmute()
this.$accessor.video.setVolume(100)

// Clean up global listeners if they were set
if (this.unmuteHandler) {
document.documentElement.removeEventListener('mousedown', this.unmuteHandler)
document.documentElement.removeEventListener('keydown', this.unmuteHandler)
}
}

mounted() {
this._container.addEventListener('resize', this.onResize)
this.onVolumeChanged(this.volume)
Expand Down Expand Up @@ -533,12 +572,23 @@
this.$client.sendData('keyup', { key: this.keyMap(key) })
}
this.keyboard.listenTo(this._overlay)

/* KERNEL MODIFICATION: Set up listeners for the first interaction. */
this.unmuteHandler = this._unmuteOnFirstInteraction.bind(this)
document.documentElement.addEventListener('mousedown', this.unmuteHandler, { once: true })
document.documentElement.addEventListener('keydown', this.unmuteHandler, { once: true })
}

beforeDestroy() {
this.observer.disconnect()
this.$accessor.video.setPlayable(false)
/* Guacamole Keyboard does not provide destroy functions */

/* KERNEL MODIFICATION: Clean up listeners on component destruction. */
if (this.unmuteHandler) {
document.documentElement.removeEventListener('mousedown', this.unmuteHandler)
document.documentElement.removeEventListener('keydown', this.unmuteHandler)
}
}

get hasMacOSKbd() {
Expand Down Expand Up @@ -761,6 +811,9 @@
}

onMouseDown(e: MouseEvent) {
/* KERNEL MODIFICATION: Trigger unmute on first video click. */
this._unmuteOnFirstInteraction()

if (!this.hosting) {
this.$emit('control-attempt', e)
}
Expand Down Expand Up @@ -846,4 +899,4 @@
this._overlay.focus()
}
}
</script>
</script>
Loading
Loading