0.12.0: hw-probe + model fixes + mother MCP infra
Combined from three feature branches: - feature/hw-probe-agent-bootstrap: JSON hardware probe (clawdie-hw-probe), remove desktop icon, update START-HERE.txt - chore/0.12.0-model-fix-bump: deepseek-v4-pro model names, version 0.12.0 - feature/mother-mcp-infra: build-colibri.sh MCP tool, colibri-mcp-ssh wrapper
This commit is contained in:
parent
bbf154b571
commit
7300fec1e2
10 changed files with 369 additions and 23 deletions
|
|
@ -216,8 +216,6 @@ test -x /mnt/usr/local/bin/startx
|
||||||
test -x /mnt/usr/local/bin/clawdie-startx
|
test -x /mnt/usr/local/bin/clawdie-startx
|
||||||
test -x /mnt/usr/local/bin/clawdie-gui
|
test -x /mnt/usr/local/bin/clawdie-gui
|
||||||
test -x /mnt/usr/local/bin/hw-report
|
test -x /mnt/usr/local/bin/hw-report
|
||||||
test -f "/mnt/usr/local/share/applications/Clawdie Hardware Report.desktop"
|
|
||||||
test -f "/mnt/home/clawdie/Desktop/Clawdie Hardware Report.desktop"
|
|
||||||
test -x /mnt/home/clawdie/.xinitrc
|
test -x /mnt/home/clawdie/.xinitrc
|
||||||
test -x /mnt/home/clawdie/.config/xfce4/xinitrc
|
test -x /mnt/home/clawdie/.config/xfce4/xinitrc
|
||||||
pkg -r /mnt info -e xterm
|
pkg -r /mnt info -e xterm
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ FREEBSD_MEMSTICK_SHA256_URL="${FREEBSD_ISO_BASE_URL}/CHECKSUM.SHA256-FreeBSD-${F
|
||||||
# clawdie-iso and colibri share this unified version (keep colibri's Cargo.toml
|
# clawdie-iso and colibri share this unified version (keep colibri's Cargo.toml
|
||||||
# in sync). zot and clawdie-ai keep their own versions, recorded as provenance in
|
# in sync). zot and clawdie-ai keep their own versions, recorded as provenance in
|
||||||
# build-manifest.json. Bump this for each release.
|
# build-manifest.json. Bump this for each release.
|
||||||
ISO_VERSION="${ISO_VERSION:-0.11.0}"
|
ISO_VERSION="${ISO_VERSION:-0.12.0}"
|
||||||
BUILD_CHANNEL="${BUILD_CHANNEL:-dev}" # dev | release
|
BUILD_CHANNEL="${BUILD_CHANNEL:-dev}" # dev | release
|
||||||
|
|
||||||
# Output image
|
# Output image
|
||||||
|
|
|
||||||
9
build.sh
9
build.sh
|
|
@ -1308,6 +1308,8 @@ configure_live_operator_session() {
|
||||||
"${MOUNT_POINT}/usr/local/bin/clawdie-noblank-guard.sh"
|
"${MOUNT_POINT}/usr/local/bin/clawdie-noblank-guard.sh"
|
||||||
install -m 0755 "${LIVE_SESSION_DIR}/hw-report" \
|
install -m 0755 "${LIVE_SESSION_DIR}/hw-report" \
|
||||||
"${MOUNT_POINT}/usr/local/bin/hw-report"
|
"${MOUNT_POINT}/usr/local/bin/hw-report"
|
||||||
|
install -m 0755 "${LIVE_SESSION_DIR}/clawdie-hw-probe" \
|
||||||
|
"${MOUNT_POINT}/usr/local/bin/clawdie-hw-probe"
|
||||||
# Vaultwarden secret bridge (bw -> .env). Always staged: needs only the
|
# Vaultwarden secret bridge (bw -> .env). Always staged: needs only the
|
||||||
# bundled `bw` CLI and a 0600 bootstrap drop; absent bootstrap = no-op, so
|
# bundled `bw` CLI and a 0600 bootstrap drop; absent bootstrap = no-op, so
|
||||||
# the manual setup wizard stays the floor. See docs/VAULTWARDEN-SETUP.md.
|
# the manual setup wizard stays the floor. See docs/VAULTWARDEN-SETUP.md.
|
||||||
|
|
@ -1711,15 +1713,11 @@ EOF
|
||||||
"${MOUNT_POINT}/usr/local/share/applications/Clawdie Start Here.desktop"
|
"${MOUNT_POINT}/usr/local/share/applications/Clawdie Start Here.desktop"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/colibri-dashboard.desktop" \
|
install -m 0644 "${LIVE_SESSION_DIR}/colibri-dashboard.desktop" \
|
||||||
"${MOUNT_POINT}/usr/local/share/applications/Colibri Dashboard.desktop"
|
"${MOUNT_POINT}/usr/local/share/applications/Colibri Dashboard.desktop"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/hw-report.desktop" \
|
|
||||||
"${MOUNT_POINT}/usr/local/share/applications/Clawdie Hardware Report.desktop"
|
|
||||||
mkdir -p "${MOUNT_POINT}/home/clawdie/Desktop"
|
mkdir -p "${MOUNT_POINT}/home/clawdie/Desktop"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/clawdie-bootstrap.desktop" \
|
install -m 0644 "${LIVE_SESSION_DIR}/clawdie-bootstrap.desktop" \
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Start Here.desktop"
|
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Start Here.desktop"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/colibri-dashboard.desktop" \
|
install -m 0644 "${LIVE_SESSION_DIR}/colibri-dashboard.desktop" \
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Colibri Dashboard.desktop"
|
"${MOUNT_POINT}/home/clawdie/Desktop/Colibri Dashboard.desktop"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/hw-report.desktop" \
|
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Hardware Report.desktop"
|
|
||||||
mkdir -p "${MOUNT_POINT}/usr/local/share/clawdie-iso"
|
mkdir -p "${MOUNT_POINT}/usr/local/share/clawdie-iso"
|
||||||
install -m 0644 "${LIVE_SESSION_DIR}/START-HERE.txt" \
|
install -m 0644 "${LIVE_SESSION_DIR}/START-HERE.txt" \
|
||||||
"${MOUNT_POINT}/usr/local/share/clawdie-iso/START-HERE.txt"
|
"${MOUNT_POINT}/usr/local/share/clawdie-iso/START-HERE.txt"
|
||||||
|
|
@ -1756,8 +1754,7 @@ EOF
|
||||||
chmod 0755 "${MOUNT_POINT}/home/clawdie/Desktop"
|
chmod 0755 "${MOUNT_POINT}/home/clawdie/Desktop"
|
||||||
chmod 0644 \
|
chmod 0644 \
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Start Here.desktop" \
|
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Start Here.desktop" \
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Colibri Dashboard.desktop" \
|
"${MOUNT_POINT}/home/clawdie/Desktop/Colibri Dashboard.desktop"
|
||||||
"${MOUNT_POINT}/home/clawdie/Desktop/Clawdie Hardware Report.desktop"
|
|
||||||
|
|
||||||
install_live_ai_source_snapshots
|
install_live_ai_source_snapshots
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ FIRST ACTIONS
|
||||||
|
|
||||||
1. Save any notes you want in this file or close it.
|
1. Save any notes you want in this file or close it.
|
||||||
2. Open "Colibri Dashboard" on the desktop when you are ready.
|
2. Open "Colibri Dashboard" on the desktop when you are ready.
|
||||||
3. Use "Clawdie Hardware Report" if this machine needs diagnostics.
|
3. Run 'mdo -u root hw-report' in a terminal if this machine needs diagnostics.
|
||||||
|
|
||||||
COLIBRI
|
COLIBRI
|
||||||
-------
|
-------
|
||||||
|
|
@ -75,9 +75,6 @@ Open manually:
|
||||||
HARDWARE REPORT
|
HARDWARE REPORT
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Desktop launcher:
|
|
||||||
Clawdie Hardware Report
|
|
||||||
|
|
||||||
Terminal:
|
Terminal:
|
||||||
mdo -u root hw-report
|
mdo -u root hw-report
|
||||||
|
|
||||||
|
|
|
||||||
288
live/operator-session/clawdie-hw-probe
Executable file
288
live/operator-session/clawdie-hw-probe
Executable file
|
|
@ -0,0 +1,288 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# clawdie-hw-probe — single-shot JSON hardware probe
|
||||||
|
#
|
||||||
|
# Outputs one JSON object to stdout. All messages/errors go to stderr.
|
||||||
|
# Designed to run as root for full hardware access.
|
||||||
|
# Target: < 3 seconds on cold cache.
|
||||||
|
#
|
||||||
|
# Schema: clawdie.hw-probe.v1
|
||||||
|
|
||||||
|
set -u
|
||||||
|
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# helpers
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
die() {
|
||||||
|
printf '{"error":"%s","schema_version":"clawdie.hw-probe.v1"}\n' "$(json_escape "$1")"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
json_escape() {
|
||||||
|
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g; s/\r//g; s/\t/\\t/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
json_bool() {
|
||||||
|
if [ "$1" = "yes" ] || [ "$1" = "YES" ] || [ "$1" = "true" ] || [ "$1" = "TRUE" ] || [ "$1" = "1" ]; then
|
||||||
|
printf 'true'
|
||||||
|
else
|
||||||
|
printf 'false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# field collectors — each function prints to a temp file or variable
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
collect_hostname() {
|
||||||
|
hostname 2>/dev/null || echo "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_freebsd_version() {
|
||||||
|
# kernel, userland, runtime
|
||||||
|
_k="$(freebsd-version -k 2>/dev/null || echo "unknown")"
|
||||||
|
_u="$(freebsd-version -u 2>/dev/null || echo "unknown")"
|
||||||
|
_r="$(freebsd-version -r 2>/dev/null || echo "unknown")"
|
||||||
|
printf '{"kernel":"%s","userland":"%s","runtime":"%s"}' \
|
||||||
|
"$(json_escape "$_k")" \
|
||||||
|
"$(json_escape "$_u")" \
|
||||||
|
"$(json_escape "$_r")"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_ram_gb() {
|
||||||
|
_bytes="$(sysctl -n hw.physmem 2>/dev/null || echo 0)"
|
||||||
|
# Round to nearest GB: add 0.5 GB then truncate
|
||||||
|
_half_gb=536870912 # 2^29
|
||||||
|
_gb=$(( ( _bytes + _half_gb ) / 1073741824 ))
|
||||||
|
printf '%d' "$_gb"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_cpu_model() {
|
||||||
|
sysctl -n hw.model 2>/dev/null || echo "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_cpu_cores() {
|
||||||
|
sysctl -n hw.ncpu 2>/dev/null || echo "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_gpu() {
|
||||||
|
# Extract VGA/display devices from pciconf -lv
|
||||||
|
# Output: JSON array of {vendor, device, chip}
|
||||||
|
_found=0
|
||||||
|
printf '['
|
||||||
|
pciconf -lv 2>/dev/null | awk '
|
||||||
|
BEGIN { in_block=0; vendor=""; device=""; chip=""; first=1 }
|
||||||
|
/^[a-z]/ {
|
||||||
|
if (in_block && device ~ /VGA|display/) {
|
||||||
|
if (!first) printf ",";
|
||||||
|
gsub(/"/, "\\\"", vendor);
|
||||||
|
gsub(/"/, "\\\"", device);
|
||||||
|
gsub(/"/, "\\\"", chip);
|
||||||
|
printf "{\"vendor\":\"%s\",\"device\":\"%s\",\"chip\":\"%s\"}", vendor, device, chip;
|
||||||
|
first=0;
|
||||||
|
}
|
||||||
|
in_block=1; vendor=""; device=""; chip=$0;
|
||||||
|
sub(/@.*/, "", chip);
|
||||||
|
}
|
||||||
|
/vendor *=/ { vendor=$0; sub(/^[[:space:]]*vendor[[:space:]]*=[[:space:]]*/, "", vendor); sub(/'\''/, "", vendor); sub(/'\''$/, "", vendor) }
|
||||||
|
/device *=/ { device=$0; sub(/^[[:space:]]*device[[:space:]]*=[[:space:]]*/, "", device); sub(/'\''/, "", device); sub(/'\''$/, "", device) }
|
||||||
|
END {
|
||||||
|
if (in_block && device ~ /VGA|display/) {
|
||||||
|
if (!first) printf ",";
|
||||||
|
gsub(/"/, "\\\"", vendor);
|
||||||
|
gsub(/"/, "\\\"", device);
|
||||||
|
gsub(/"/, "\\\"", chip);
|
||||||
|
printf "{\"vendor\":\"%s\",\"device\":\"%s\",\"chip\":\"%s\"}", vendor, device, chip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'
|
||||||
|
printf ']'
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_gpu_driver() {
|
||||||
|
# Check which KMS drivers are loaded
|
||||||
|
printf '['
|
||||||
|
_first=1
|
||||||
|
for _drv in amdgpu i915kms nvidia-modeset; do
|
||||||
|
if kldstat -q -n "$_drv" 2>/dev/null; then
|
||||||
|
if [ "$_first" -ne 1 ]; then printf ','; fi
|
||||||
|
printf '"%s"' "$_drv"
|
||||||
|
_first=0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
printf ']'
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_disks() {
|
||||||
|
# Disk names + sizes
|
||||||
|
printf '{'
|
||||||
|
_disks="$(sysctl -n kern.disks 2>/dev/null || true)"
|
||||||
|
_first=1
|
||||||
|
for _disk in $_disks; do
|
||||||
|
_size=""
|
||||||
|
# Try geom disk list first (fast, no device open)
|
||||||
|
if command -v geom >/dev/null 2>&1; then
|
||||||
|
_size="$(geom disk list "$_disk" 2>/dev/null | awk '/Mediasize:/ {print $2}' | head -1)"
|
||||||
|
fi
|
||||||
|
# Fallback to camcontrol
|
||||||
|
if [ -z "$_size" ] && command -v camcontrol >/dev/null 2>&1; then
|
||||||
|
_size="$(camcontrol identify "/dev/${_disk}" 2>/dev/null | awk -F'[<>]' '/LBA48 supported|LBA supported/{print $2}' | head -1)"
|
||||||
|
fi
|
||||||
|
# Fallback to diskinfo
|
||||||
|
if [ -z "$_size" ] && command -v diskinfo >/dev/null 2>&1; then
|
||||||
|
_size="$(diskinfo "/dev/${_disk}" 2>/dev/null | awk '{print $3}' | head -1)"
|
||||||
|
fi
|
||||||
|
if [ "$_first" -ne 1 ]; then printf ','; fi
|
||||||
|
printf '"%s":%s' "$(json_escape "$_disk")" "${_size:-0}"
|
||||||
|
_first=0
|
||||||
|
done
|
||||||
|
printf '}'
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_network_interfaces() {
|
||||||
|
# Simpler, reliable version that doesn't rely on subshell variable leakage
|
||||||
|
_ifaces="$(ifconfig -l 2>/dev/null)"
|
||||||
|
printf '{'
|
||||||
|
_first=1
|
||||||
|
for _iface in $_ifaces; do
|
||||||
|
_mac="$(ifconfig "$_iface" 2>/dev/null | awk '/ether/{print $2}' | head -1)"
|
||||||
|
[ -z "$_mac" ] && continue
|
||||||
|
if [ "$_first" -ne 1 ]; then printf ','; fi
|
||||||
|
printf '"%s":"%s"' "$(json_escape "$_iface")" "$(json_escape "$_mac")"
|
||||||
|
_first=0
|
||||||
|
done
|
||||||
|
printf '}'
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_wifi() {
|
||||||
|
_wlan="$(sysctl -n net.wlan.devices 2>/dev/null || true)"
|
||||||
|
if [ -n "$_wlan" ]; then
|
||||||
|
printf '['
|
||||||
|
_first=1
|
||||||
|
for _dev in $_wlan; do
|
||||||
|
if [ "$_first" -ne 1 ]; then printf ','; fi
|
||||||
|
printf '"%s"' "$(json_escape "$_dev")"
|
||||||
|
_first=0
|
||||||
|
done
|
||||||
|
printf ']'
|
||||||
|
else
|
||||||
|
printf '[]'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_usb_devices() {
|
||||||
|
if command -v usbconfig >/dev/null 2>&1; then
|
||||||
|
printf '%d' "$(usbconfig 2>/dev/null | grep -c '^ugen' || echo 0)"
|
||||||
|
else
|
||||||
|
printf '0'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_xorg_running() {
|
||||||
|
if pgrep -x Xorg >/dev/null 2>&1; then
|
||||||
|
printf 'true'
|
||||||
|
else
|
||||||
|
printf 'false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_vulkan_support() {
|
||||||
|
if command -v vulkaninfo >/dev/null 2>&1 && \
|
||||||
|
vulkaninfo --summary >/dev/null 2>&1; then
|
||||||
|
printf 'true'
|
||||||
|
else
|
||||||
|
printf 'false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_boot_type() {
|
||||||
|
if [ -e /dev/da0 ]; then
|
||||||
|
printf '"usb"'
|
||||||
|
elif [ -e /dev/nda0 ] || [ -e /dev/nvd0 ]; then
|
||||||
|
printf '"nvme"'
|
||||||
|
elif [ -e /dev/ada0 ]; then
|
||||||
|
printf '"sata"'
|
||||||
|
else
|
||||||
|
printf '"unknown"'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_colibri_running() {
|
||||||
|
if command -v service >/dev/null 2>&1; then
|
||||||
|
# service status can hang on rc.d scripts; enforce a 1s deadline
|
||||||
|
_status="$(timeout 1 service colibri_daemon status 2>/dev/null || echo "not_running")"
|
||||||
|
case "$_status" in
|
||||||
|
*"is running"*|*"Running"*)
|
||||||
|
printf 'true'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf 'false'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
printf 'false'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_zfs_pools() {
|
||||||
|
if command -v zpool >/dev/null 2>&1; then
|
||||||
|
_pools="$(zpool list -H -o name 2>/dev/null || true)"
|
||||||
|
if [ -n "$_pools" ]; then
|
||||||
|
printf '['
|
||||||
|
_first=1
|
||||||
|
for _pool in $_pools; do
|
||||||
|
if [ "$_first" -ne 1 ]; then printf ','; fi
|
||||||
|
printf '"%s"' "$(json_escape "$_pool")"
|
||||||
|
_first=0
|
||||||
|
done
|
||||||
|
printf ']'
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printf '[]'
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# assemble JSON
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
_hostname="$(collect_hostname)"
|
||||||
|
_freebsd_ver="$(collect_freebsd_version)"
|
||||||
|
_ram_gb="$(collect_ram_gb)"
|
||||||
|
_cpu_model="$(collect_cpu_model)"
|
||||||
|
_cpu_cores="$(collect_cpu_cores)"
|
||||||
|
_gpu="$(collect_gpu)"
|
||||||
|
_gpu_driver="$(collect_gpu_driver)"
|
||||||
|
_disks="$(collect_disks)"
|
||||||
|
_net="$(collect_network_interfaces)"
|
||||||
|
_wifi="$(collect_wifi)"
|
||||||
|
_usb="$(collect_usb_devices)"
|
||||||
|
_xorg="$(collect_xorg_running)"
|
||||||
|
_vulkan="$(collect_vulkan_support)"
|
||||||
|
_boot_type="$(collect_boot_type)"
|
||||||
|
_colibri="$(collect_colibri_running)"
|
||||||
|
_zfs_pools="$(collect_zfs_pools)"
|
||||||
|
|
||||||
|
printf '{\n'
|
||||||
|
printf ' "schema_version":"clawdie.hw-probe.v1",\n'
|
||||||
|
printf ' "hostname":"%s",\n' "$(json_escape "$_hostname")"
|
||||||
|
printf ' "freebsd_version":%s,\n' "$_freebsd_ver"
|
||||||
|
printf ' "ram_gb":%s,\n' "$_ram_gb"
|
||||||
|
printf ' "cpu_model":"%s",\n' "$(json_escape "$_cpu_model")"
|
||||||
|
printf ' "cpu_cores":%s,\n' "$_cpu_cores"
|
||||||
|
printf ' "gpu":%s,\n' "$_gpu"
|
||||||
|
printf ' "gpu_driver":%s,\n' "$_gpu_driver"
|
||||||
|
printf ' "disks":%s,\n' "$_disks"
|
||||||
|
printf ' "network_interfaces":%s,\n' "$_net"
|
||||||
|
printf ' "wifi":%s,\n' "$_wifi"
|
||||||
|
printf ' "usb_devices":%s,\n' "$_usb"
|
||||||
|
printf ' "xorg_running":%s,\n' "$_xorg"
|
||||||
|
printf ' "vulkan_support":%s,\n' "$_vulkan"
|
||||||
|
printf ' "boot_type":%s,\n' "$_boot_type"
|
||||||
|
printf ' "colibri_running":%s,\n' "$_colibri"
|
||||||
|
printf ' "zfs_pools":%s\n' "$_zfs_pools"
|
||||||
|
printf '}\n'
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
@ -67,7 +67,7 @@ Inside it, any of these are honored:
|
||||||
/<agent>/harness.toml Which agent harness to run + basic knobs:
|
/<agent>/harness.toml Which agent harness to run + basic knobs:
|
||||||
|
|
||||||
harness = "zot" # zot | pi | local
|
harness = "zot" # zot | pi | local
|
||||||
model = "claude-opus-4-8"
|
model = "deepseek-v4-pro"
|
||||||
cost_mode = "smart"
|
cost_mode = "smart"
|
||||||
|
|
||||||
`harness` must be one of zot, pi, local
|
`harness` must be one of zot, pi, local
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=Clawdie Hardware Report
|
|
||||||
Comment=Collect local hardware diagnostics for support and custom ISO builds
|
|
||||||
Exec=xfce4-terminal --hold --command "mdo -u root /usr/local/bin/hw-report"
|
|
||||||
Icon=utilities-system-monitor
|
|
||||||
Terminal=false
|
|
||||||
Categories=System;Utility;
|
|
||||||
68
packaging/mother/build-colibri.sh
Executable file
68
packaging/mother/build-colibri.sh
Executable file
|
|
@ -0,0 +1,68 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# build-colibri MCP tool — build a colibri crate from any git branch.
|
||||||
|
#
|
||||||
|
# Accepts a JSON-RPC tools/call request on stdin, builds the requested
|
||||||
|
# crate, and returns the result as a JSON content block to stdout.
|
||||||
|
#
|
||||||
|
# Expected input (MCP tools/call):
|
||||||
|
# {"jsonrpc":"2.0","method":"tools/call","id":1,"params":{"name":"build_colibri","arguments":{"crate":"colibri-daemon","branch":"main","features":"","release":"true"}}}
|
||||||
|
#
|
||||||
|
# Parameters:
|
||||||
|
# crate — workspace member to build (default: colibri-daemon)
|
||||||
|
# branch — git branch/ref to check out (default: main)
|
||||||
|
# features — optional comma-separated features
|
||||||
|
# release — "true" for --release, anything else for debug (default: true)
|
||||||
|
#
|
||||||
|
# Output: MCP JSON-RPC response with text content block
|
||||||
|
# {"success":true,"binary":"/home/clawdie/ai/colibri/target/release/colibri-daemon","duration_s":25.4,"branch":"main","commit":"abc1234"}
|
||||||
|
# or
|
||||||
|
# {"success":false,"error":"build failed: ..."}
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
REPO="/home/clawdie/ai/colibri"
|
||||||
|
CRATE_DEFAULT="colibri-daemon"
|
||||||
|
BRANCH_DEFAULT="main"
|
||||||
|
|
||||||
|
# Read JSON from stdin, extract arguments
|
||||||
|
INPUT=$(cat)
|
||||||
|
CRATE=$(echo "$INPUT" | jq -r '.params.arguments.crate // "'"$CRATE_DEFAULT"'"')
|
||||||
|
BRANCH=$(echo "$INPUT" | jq -r '.params.arguments.branch // "'"$BRANCH_DEFAULT"'"')
|
||||||
|
FEATURES=$(echo "$INPUT" | jq -r '.params.arguments.features // ""')
|
||||||
|
RELEASE=$(echo "$INPUT" | jq -r '.params.arguments.release // "true"')
|
||||||
|
ID=$(echo "$INPUT" | jq -r '.id // "1"')
|
||||||
|
|
||||||
|
# Build flags
|
||||||
|
CARGO_FLAGS=""
|
||||||
|
if [ "$RELEASE" = "true" ]; then
|
||||||
|
CARGO_FLAGS="--release"
|
||||||
|
fi
|
||||||
|
if [ -n "$FEATURES" ]; then
|
||||||
|
CARGO_FLAGS="$CARGO_FLAGS --features $FEATURES"
|
||||||
|
fi
|
||||||
|
|
||||||
|
START_TS=$(date +%s)
|
||||||
|
|
||||||
|
# Fetch and checkout
|
||||||
|
cd "$REPO"
|
||||||
|
git fetch origin 2>&1 || true
|
||||||
|
if ! git checkout "$BRANCH" 2>&1; then
|
||||||
|
printf '{"jsonrpc":"2.0","id":%s,"error":{"code":-1,"message":"git checkout failed: %s"}}\n' "$ID" "$BRANCH"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
|
# Build
|
||||||
|
BUILD_LOG=$(mktemp)
|
||||||
|
if cargo build $CARGO_FLAGS -p "$CRATE" >"$BUILD_LOG" 2>&1; then
|
||||||
|
DURATION=$(( $(date +%s) - START_TS ))
|
||||||
|
BINARY=$(find target -maxdepth 3 -type f -name "$CRATE" -perm -111 | grep -v deps | head -1)
|
||||||
|
SIZE=$(stat -f '%z' "$BINARY" 2>/dev/null || echo "0")
|
||||||
|
cat "$BUILD_LOG" | tail -5 >&2 # send tail to stderr for logging
|
||||||
|
printf '{"jsonrpc":"2.0","id":%s,"result":{"content":[{"type":"text","text":"{\\"success\\":true,\\"binary\\":\\"%s\\",\\"duration_s\\":%s,\\"branch\\":\\"%s\\",\\"commit\\":\\"%s\\",\\"size_bytes\\":%s}"}]}}\n' \
|
||||||
|
"$ID" "$BINARY" "$DURATION" "$BRANCH" "$COMMIT" "$SIZE"
|
||||||
|
else
|
||||||
|
DURATION=$(( $(date +%s) - START_TS ))
|
||||||
|
ERROR=$(tail -20 "$BUILD_LOG" | head -10 | tr '\n' ' ' | sed 's/"/\\"/g')
|
||||||
|
printf '{"jsonrpc":"2.0","id":%s,"error":{"code":-1,"message":"build failed in %ss: %s"}}\n' "$ID" "$DURATION" "$ERROR"
|
||||||
|
fi
|
||||||
|
rm -f "$BUILD_LOG"
|
||||||
6
packaging/mother/colibri-mcp-ssh
Executable file
6
packaging/mother/colibri-mcp-ssh
Executable file
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Wrapper for SSH forced-command MCP entrypoint.
|
||||||
|
# SSH's command="..." restriction replaces the client's command with
|
||||||
|
# this script and stores the original in $SSH_ORIGINAL_COMMAND.
|
||||||
|
# Pass it through to colibri-mcp so `ssh colibri@mother tools` works.
|
||||||
|
exec /usr/local/bin/colibri-mcp ${SSH_ORIGINAL_COMMAND}
|
||||||
|
|
@ -153,7 +153,7 @@ BW_SERVER="https://vault.smilepowered.org"
|
||||||
#
|
#
|
||||||
# Optional endpoints/models:
|
# Optional endpoints/models:
|
||||||
# DEEPSEEK_ENDPOINT="https://api.deepseek.com/chat/completions"
|
# DEEPSEEK_ENDPOINT="https://api.deepseek.com/chat/completions"
|
||||||
# DEEPSEEK_MODEL="deepseek-chat"
|
# DEEPSEEK_MODEL="deepseek-v4-pro"
|
||||||
#
|
#
|
||||||
# Behavior toggles (non-secret):
|
# Behavior toggles (non-secret):
|
||||||
# COLIBRI_AUTOSPAWN_PI="YES" # auto-spawn one Pi on daemon startup
|
# COLIBRI_AUTOSPAWN_PI="YES" # auto-spawn one Pi on daemon startup
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue