diff --git a/packs/common-telemetron.sh b/packs/common-telemetron.sh new file mode 100644 index 0000000..2b2be8b --- /dev/null +++ b/packs/common-telemetron.sh @@ -0,0 +1,185 @@ +#!/usr/bin/env bash +# packs/common-telemetron.sh — Shared telemetron sidecar installer +# +# Sourced by pack install scripts. Provides `install_telemetron `. +# Requires: nothing (self-contained). Source after common.sh in pack scripts. +# +# Contract: +# - Never prints to stdout/stderr (all output to log file) +# - Never fails the caller (always returns 0) +# - Idempotent (safe to re-run) + +# ── Constants ───────────────────────────────────────────────────────────────── +_TELEMETRON_ENDPOINT="https://telemetry.loki.run/v1/metrics" +_TELEMETRON_ENROLL_ENDPOINT="https://telemetry.loki.run/v1/enroll" +_TELEMETRON_INSTALL_URL="https://raw.githubusercontent.com/inceptionstack/telemetron/main/install.sh" + +# ── Gate: should telemetron run? ────────────────────────────────────────────── +_telemetron_should_run() { + if [[ "${PACK_ARG_SKIP_TELEMETRON:-false}" = "true" ]]; then + echo "skip: --skip-telemetron"; return + fi + if [[ "$(uname -s)" != "Linux" ]]; then + echo "skip: non-Linux"; return + fi + if [[ "${LOWKEY_TELEMETRY:-1}" = "0" ]] \ + || [[ "${DO_NOT_TRACK:-0}" = "1" ]] \ + || [[ -f "${HOME:-}/.lowkey/telemetry-off" ]]; then + echo "skip: telemetry opt-out"; return + fi + if ! command -v systemctl >/dev/null 2>&1; then + echo "skip: no systemctl"; return + fi + echo "yes" +} + +# ── Tier detection ──────────────────────────────────────────────────────────── +# Detects whether the AWS account is internal (@amazon.com) or external. +# Tries 3 methods with 5s timeouts each. Email never leaves the machine. +_telemetron_detect_tier() { + local acct_email="" + + # Method 1: account contact info — check all fields for @amazon.com + local contact_info + contact_info=$(timeout 5 aws account get-contact-information --output json 2>/dev/null) || true + if echo "$contact_info" | grep -q '@amazon\.com"'; then + echo "internal"; return + fi + + # Method 2: organization master account email (works from member accounts) + acct_email=$(timeout 5 aws organizations describe-organization \ + --query 'Organization.MasterAccountEmail' --output text 2>/dev/null) || true + if [[ "$acct_email" == *@amazon.com ]]; then + echo "internal"; return + fi + + # Method 3: describe-account (management account only) + local acct_id + acct_id=$(timeout 5 aws sts get-caller-identity --query Account --output text 2>/dev/null) || true + if [[ -n "$acct_id" ]]; then + acct_email=$(timeout 5 aws organizations describe-account \ + --account-id "$acct_id" --query 'Account.Email' --output text 2>/dev/null) || true + if [[ "$acct_email" == *@amazon.com ]]; then + echo "internal"; return + fi + fi + + echo "external" +} + +# ── Write tier files ────────────────────────────────────────────────────────── +_telemetron_write_tier() { + local tier="$1" + local home="${HOME:-/home/ec2-user}" + for dir in "$home/.lowkey" "$home/.loki"; do + mkdir -p "$dir" 2>/dev/null || true + printf '%s\n' "$tier" > "$dir/tier" 2>/dev/null || true + done +} + +# ── Install binary ──────────────────────────────────────────────────────────── +# Downloads and installs telemetron to /usr/local/bin via sudo. +# Returns 0 on success or if already installed, 1 on failure. +_telemetron_ensure_binary() { + local log="$1" + + if command -v telemetron >/dev/null 2>&1 \ + || [[ -x /var/lib/telemetron/bin/telemetron ]]; then + return 0 + fi + + if ! sudo -n true 2>/dev/null; then + printf '[telemetron] sudo not available (non-interactive) — skipping\n' >>"$log" + return 1 + fi + + timeout 60 bash -c " + set -euo pipefail + curl --retry 3 --retry-delay 2 --connect-timeout 5 --max-time 55 \ + -fsSL '${_TELEMETRON_INSTALL_URL}' | sudo -n TELEMETRON_PREFIX=/usr/local bash + " >>"$log" 2>&1 || { + printf '[telemetron] binary install failed (exit %d)\n' "$?" >>"$log" + return 1 + } +} + +# ── Resolve binary path ─────────────────────────────────────────────────────── +_telemetron_resolve_bin() { + if [[ -x /var/lib/telemetron/bin/telemetron ]]; then + echo "/var/lib/telemetron/bin/telemetron" + elif command -v telemetron >/dev/null 2>&1; then + command -v telemetron + fi +} + +# ══════════════════════════════════════════════════════════════════════════════ +# Public API +# ══════════════════════════════════════════════════════════════════════════════ + +# install_telemetron +# +# Installs and configures telemetron for the given pack mode. +# Uses `telemetron detect` which auto-discovers sessions by install directory. +# +# When called via `sudo`, SUDO_USER is preserved so telemetron resolves +# the correct user home (not /root). +# +# Usage: +# install_telemetron openclaw +# install_telemetron roundhouse +install_telemetron() { + local mode="${1:?usage: install_telemetron }" + ( + set +e + local _raw_log="${INSTALL_LOG:-/tmp/loki-install.log}" + local log + { >> "$_raw_log"; } 2>/dev/null && log="$_raw_log" || log=/dev/null + + printf '\n[telemetron] begin %s mode=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$mode" >>"$log" + + # Gate check + local decision + decision="$(_telemetron_should_run)" + if [[ "$decision" != "yes" ]]; then + printf '[telemetron] %s\n' "$decision" >>"$log" + printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >>"$log" + exit 0 + fi + + # Tier detection + write + local tier + tier="$(_telemetron_detect_tier)" + _telemetron_write_tier "$tier" + printf '[telemetron] tier=%s\n' "$tier" >>"$log" + + # Ensure binary installed + if ! _telemetron_ensure_binary "$log"; then + printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >>"$log" + exit 0 + fi + + # Resolve binary path + local bin + bin="$(_telemetron_resolve_bin)" + if [[ -z "$bin" ]]; then + printf '[telemetron] binary not found after install\n' >>"$log" + printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >>"$log" + exit 0 + fi + + # Run detect — auto-discovers sessions, enrolls, starts service + timeout 30 sudo -n "$bin" detect \ + --endpoint "$_TELEMETRON_ENDPOINT" \ + --enroll-endpoint "$_TELEMETRON_ENROLL_ENDPOINT" \ + --mode "$mode" \ + --force >>"$log" 2>&1 || { + printf '[telemetron] detect failed (exit %d)\n' "$?" >>"$log" + printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >>"$log" + exit 0 + } + + printf '[telemetron] detect completed successfully\n' >>"$log" + printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >>"$log" + exit 0 + ) || true +} diff --git a/packs/common.sh b/packs/common.sh index 949a0d9..504db1b 100755 --- a/packs/common.sh +++ b/packs/common.sh @@ -92,6 +92,10 @@ pack_banner() { # companion (metrics agent, diagnostics daemon, etc.) with the following # hard invariants: # +# DEPRECATED: No pack currently calls this function. Telemetron installs now +# use `install_telemetron` from common-telemetron.sh instead. Kept for +# potential future sidecars that use a curl|bash pipeline pattern. +# # - Silent: zero bytes on caller's stdout/stderr. Every line (begin, # outcome, transcript of the inner installer, end) goes to # LOG_FILE only. diff --git a/packs/openclaw/install.sh b/packs/openclaw/install.sh index 6625880..fec9c81 100755 --- a/packs/openclaw/install.sh +++ b/packs/openclaw/install.sh @@ -249,107 +249,8 @@ fi write_done_marker "openclaw" printf "\n[PACK:openclaw] INSTALLED — gateway on :%s (systemd: openclaw-gateway)\n" "${GW_PORT}" -# ── Optional sidecar: telemetron ────────────────────────────────────────────── -# Anonymous enrollment against the Loki telemetry backend. The pack decides -# "should this run?" here; common.sh:run_optional_sidecar owns the silent, -# bounded, pipefail-safe install machinery. Never blocks, never warns, never -# prints anything on the user's terminal — all output goes to $INSTALL_LOG. - -# should_run_telemetron — pure decision. Echoes "yes" or "skip: ". -should_run_telemetron() { - if [[ "${PACK_ARG_SKIP_TELEMETRON:-false}" = "true" ]]; then - echo "skip: --skip-telemetron"; return - fi - if [[ "$(uname -s)" != "Linux" ]]; then - echo "skip: non-Linux"; return - fi - if [[ "${LOWKEY_TELEMETRY:-1}" = "0" ]] \ - || [[ "${DO_NOT_TRACK:-0}" = "1" ]] \ - || [[ -f "${HOME:-}/.lowkey/telemetry-off" ]]; then - echo "skip: lowkey telemetry opt-out"; return - fi - if ! command -v systemctl >/dev/null 2>&1; then - echo "skip: systemctl not found"; return - fi - echo "yes" -} -_telemetron_sidecar() { - # Resolve the log path once. Fall back to /dev/null if not writable - # so the "never prints on the user's terminal" contract holds even when - # INSTALL_LOG points at an unwritable or nonexistent path. - local _raw_log="${INSTALL_LOG:-/tmp/loki-install.log}" - local log; { >> "$_raw_log"; } 2>/dev/null && log="$_raw_log" || log=/dev/null - local decision - decision="$(should_run_telemetron)" - if [[ "$decision" != "yes" ]]; then - { - printf '\n[telemetron] begin %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" - printf '[telemetron] %s\n' "$decision" - printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" - } >>"$log" || true - return 0 - fi - local endpoint="https://telemetry.loki.run/v1/metrics" - local enroll_endpoint="https://telemetry.loki.run/v1/enroll" - local url="https://raw.githubusercontent.com/inceptionstack/telemetron/main/install.sh" - # session_dir: telemetron auto-detects from $HOME, but under sudo $HOME - # becomes /root. Point it at the real ec2-user openclaw session tree. - local session_dir="${HOME:-/home/ec2-user}/.openclaw/agents/main/sessions" - - # Detect tier from AWS account owner email. Internal = @amazon.com. - # The email stays local — only the tier string is written to the tier file. - # Bounded to 5s per method to avoid hanging the installer. - # Tries three methods: - # 1. aws account get-contact-information — checks all fields for @amazon.com - # 2. aws organizations describe-organization — master account email (works from member accounts) - # 3. aws organizations describe-account — account email (only from management account) - local tier="external" - local acct_email="" - - # Method 1: account contact info — check ALL fields for @amazon.com - # FullName sometimes contains the account email on Amazon accounts, but other - # accounts may have a person's name there. Check the full JSON output. - local contact_info - contact_info=$(timeout 5 aws account get-contact-information --output json 2>/dev/null) || true - if echo "$contact_info" | grep -q '@amazon\.com"'; then - acct_email="internal@amazon.com" - fi - - # Method 2: organization master account email (works from member accounts) - if [[ "$acct_email" != *@amazon.com ]]; then - acct_email=$(timeout 5 aws organizations describe-organization \ - --query 'Organization.MasterAccountEmail' --output text 2>/dev/null) || true - fi - - # Method 3: organizations describe-account (only works from management account) - if [[ "$acct_email" != *@amazon.com ]]; then - acct_email=$(timeout 5 aws organizations describe-account \ - --account-id "${ACCOUNT_ID:-$(timeout 3 aws sts get-caller-identity --query Account --output text 2>/dev/null)}" \ - --query 'Account.Email' --output text 2>/dev/null) || true - fi - - if [[ "$acct_email" == *@amazon.com ]]; then - tier="internal" - fi - - # Write tier file for telemetron (and future tools) to read. - # Both .lowkey and .loki paths in case we rename. - local home="${HOME:-/home/ec2-user}" - for dir in "$home/.lowkey" "$home/.loki"; do - mkdir -p "$dir" 2>/dev/null || true - printf '%s\n' "$tier" > "$dir/tier" 2>/dev/null || true - done - - # TELEMETRON_VERSION intentionally unset — install.sh resolves latest via GitHub API. - # Auto-update handles subsequent upgrades after initial install. - run_optional_sidecar telemetron "$url" 60 "$log" \ - "TELEMETRON_ENDPOINT=$endpoint" \ - "TELEMETRON_ENROLL_ENDPOINT=$enroll_endpoint" \ - "TELEMETRON_PREFIX=/usr/local" \ - "TELEMETRON_SESSION_DIR=$session_dir" \ - "TELEMETRON_RUN_AS=${USER:-ec2-user}" \ - "SIDECAR_USE_SUDO=1" -} - -_telemetron_sidecar +# ── Optional sidecar: telemetron ────────────────────────────────────────────── +# shellcheck source=../common-telemetron.sh +source "${SCRIPT_DIR}/../common-telemetron.sh" +install_telemetron openclaw diff --git a/packs/openclaw/test.sh b/packs/openclaw/test.sh index 8562d1c..bff1454 100755 --- a/packs/openclaw/test.sh +++ b/packs/openclaw/test.sh @@ -70,40 +70,25 @@ bash "${INSTALL}" --skip-telemetron --help >/dev/null 2>&1 \ && pass "--skip-telemetron accepted as an arg (not rejected by parser)" \ || fail "--skip-telemetron rejected by parser" -# ── Test: should_run_telemetron() decisions ─────────────────────────────────── -# The pack's *policy* layer. Pure function — given env/PATH, returns one of: +# ── Test: _telemetron_should_run() decisions ────────────────────────────────── +# The shared policy gate from common-telemetron.sh. Pure function — given +# env/PATH, returns one of: # yes | skip: --skip-telemetron | skip: non-Linux -# skip: lowkey telemetry opt-out | skip: systemctl not found -# We source install.sh with the `_telemetron_sidecar` call short-circuited so -# sourcing doesn't actually run any network or install work. -header "Test: should_run_telemetron() — pack policy decisions" +# skip: telemetry opt-out | skip: no systemctl +header "Test: _telemetron_should_run() — shared policy decisions" DEC_TMP="$(mktemp -d)" -# Patched install.sh that defines functions but skips the final invocation -# and the rest of the pack install. We extract only up to the `_telemetron_sidecar` -# invocation, and stop there. -sed '/^_telemetron_sidecar$/,$d' "${INSTALL}" > "${DEC_TMP}/install-patched.sh" -# The patched file sources common.sh and then runs the entire pack install. -# That's fine for function definitions, but we also need to neutralize the -# install logic so tests don't try to `npm install` etc. Strategy: source only -# the common.sh + the last two function definitions (should_run_telemetron, -# _telemetron_sidecar) by extracting them explicitly. - -# Extract should_run_telemetron from install.sh. -awk ' - /^should_run_telemetron\(\) \{/ { p=1 } - p - p && /^\}/ { p=0 } -' "${INSTALL}" > "${DEC_TMP}/should_run.sh" -if grep -q '^should_run_telemetron() {' "${DEC_TMP}/should_run.sh" \ - && grep -q '^}$' "${DEC_TMP}/should_run.sh"; then - pass "extracted should_run_telemetron()" + +# The function lives in common-telemetron.sh — source it directly. +COMMON_TELEMETRON="${SCRIPT_DIR}/../common-telemetron.sh" +if [[ -f "$COMMON_TELEMETRON" ]]; then + pass "common-telemetron.sh exists" else - fail "could not extract should_run_telemetron" + fail "common-telemetron.sh not found at ${COMMON_TELEMETRON}" exit 1 fi -# Helper: run should_run_telemetron under an isolated PATH + env, compare output. +# Helper: run _telemetron_should_run under an isolated PATH + env, compare output. dec_run() { # args: ENV_KV... -- PATH_DIR — prints decision local envs=() path_dir="" while [[ $# -gt 0 ]]; do @@ -111,7 +96,7 @@ dec_run() { # args: ENV_KV... -- PATH_DIR — prints decision else envs+=("$1"); shift; fi done env -i HOME="${DEC_TMP}/home" PATH="${path_dir}" BASH_ENV= ENV= "${envs[@]}" \ - bash --noprofile --norc -c "set -euo pipefail; source '${DEC_TMP}/should_run.sh'; should_run_telemetron" + bash --noprofile --norc -c "set -euo pipefail; source '${COMMON_TELEMETRON}'; _telemetron_should_run" } mk_path() { # args: dir — pre-populate a PATH dir with common coreutils @@ -140,11 +125,11 @@ mkdir -p "${DEC_TMP}/home" assert_decision "no flags → yes" "yes" -- "$P" assert_decision "--skip-telemetron → skip" "skip: --skip-telemetron" PACK_ARG_SKIP_TELEMETRON=true -- "$P" -assert_decision "LOWKEY_TELEMETRY=0 → opt-out" "skip: lowkey telemetry opt-out" LOWKEY_TELEMETRY=0 -- "$P" -assert_decision "DO_NOT_TRACK=1 → opt-out" "skip: lowkey telemetry opt-out" DO_NOT_TRACK=1 -- "$P" +assert_decision "LOWKEY_TELEMETRY=0 → opt-out" "skip: telemetry opt-out" LOWKEY_TELEMETRY=0 -- "$P" +assert_decision "DO_NOT_TRACK=1 → opt-out" "skip: telemetry opt-out" DO_NOT_TRACK=1 -- "$P" mkdir -p "${DEC_TMP}/home/.lowkey"; touch "${DEC_TMP}/home/.lowkey/telemetry-off" -assert_decision "telemetry-off file → opt-out" "skip: lowkey telemetry opt-out" -- "$P" +assert_decision "telemetry-off file → opt-out" "skip: telemetry opt-out" -- "$P" rm -f "${DEC_TMP}/home/.lowkey/telemetry-off" P_DARWIN="${DEC_TMP}/path.darwin"; mk_path "$P_DARWIN" @@ -152,7 +137,7 @@ rm -f "${P_DARWIN}/uname"; printf '#!/bin/sh\necho Darwin\n' > "${P_DARWIN}/unam assert_decision "Darwin → non-Linux" "skip: non-Linux" -- "$P_DARWIN" P_NOSYSD="${DEC_TMP}/path.nosysd"; mk_path "$P_NOSYSD"; rm -f "${P_NOSYSD}/systemctl" -assert_decision "no systemctl → skip" "skip: systemctl not found" -- "$P_NOSYSD" +assert_decision "no systemctl → skip" "skip: no systemctl" -- "$P_NOSYSD" # Decision precedence: explicit --skip wins over everything. assert_decision "--skip beats opt-out env" "skip: --skip-telemetron" \ diff --git a/packs/roundhouse/install.sh b/packs/roundhouse/install.sh index 8649754..caa6437 100755 --- a/packs/roundhouse/install.sh +++ b/packs/roundhouse/install.sh @@ -153,133 +153,13 @@ else warn "Roundhouse service may not be active yet — check: systemctl status roundhouse.service" fi -# ── Optional sidecar: telemetron ────────────────────────────────────────────── -# Uses `telemetron detect` to auto-discover roundhouse sessions and configure -# metrics collection. Runs silently — never blocks, never warns, never prints -# on the user's terminal. All output goes to $INSTALL_LOG. - -should_run_telemetron() { - if [[ "${PACK_ARG_SKIP_TELEMETRON:-false}" = "true" ]]; then - echo "skip: --skip-telemetron"; return - fi - if [[ "$(uname -s)" != "Linux" ]]; then - echo "skip: non-Linux"; return - fi - if [[ "${LOWKEY_TELEMETRY:-1}" = "0" ]] \ - || [[ "${DO_NOT_TRACK:-0}" = "1" ]] \ - || [[ -f "${HOME:-}/.lowkey/telemetry-off" ]]; then - echo "skip: lowkey telemetry opt-out"; return - fi - if ! command -v systemctl >/dev/null 2>&1; then - echo "skip: systemctl not found"; return - fi - echo "yes" -} - -_telemetron_sidecar() { - local _raw_log="${INSTALL_LOG:-/tmp/loki-install.log}" - local log; { >> "$_raw_log"; } 2>/dev/null && log="$_raw_log" || log=/dev/null - local decision - decision="$(should_run_telemetron)" - if [[ "$decision" != "yes" ]]; then - { - printf '\n[telemetron] begin %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" - printf '[telemetron] %s\n' "$decision" - printf '[telemetron] end %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" - } >>"$log" || true - return 0 - fi - - local endpoint="https://telemetry.loki.run/v1/metrics" - local enroll_endpoint="https://telemetry.loki.run/v1/enroll" - local install_url="https://raw.githubusercontent.com/inceptionstack/telemetron/main/install.sh" - - # Detect tier from AWS account. Internal = @amazon.com. - local tier="external" - local acct_email="" - - # Method 1: account contact info - local contact_info - contact_info=$(timeout 5 aws account get-contact-information --output json 2>/dev/null) || true - if echo "$contact_info" | grep -q '@amazon\.com"'; then - acct_email="internal@amazon.com" - fi - - # Method 2: organization master account email - if [[ "$acct_email" != *@amazon.com ]]; then - acct_email=$(timeout 5 aws organizations describe-organization \ - --query 'Organization.MasterAccountEmail' --output text 2>/dev/null) || true - fi - - # Method 3: organizations describe-account - if [[ "$acct_email" != *@amazon.com ]]; then - local acct_id - acct_id=$(timeout 5 aws sts get-caller-identity --query Account --output text 2>/dev/null) || true - if [[ -n "$acct_id" ]]; then - acct_email=$(timeout 5 aws organizations describe-account \ - --account-id "$acct_id" --query 'Account.Email' --output text 2>/dev/null) || true - fi - fi - - if [[ "$acct_email" == *@amazon.com ]]; then - tier="internal" - fi - - # Write tier file for telemetron to read - local home="${HOME:-/home/ec2-user}" - for dir in "$home/.lowkey" "$home/.loki"; do - mkdir -p "$dir" 2>/dev/null || true - printf '%s\n' "$tier" > "$dir/tier" 2>/dev/null || true - done - - # Install telemetron binary if not already present. - # No env vars = install.sh only downloads the binary, skips setup. - # We use `telemetron detect` for configuration instead. - if ! command -v telemetron >/dev/null 2>&1 \ - && [[ ! -x /var/lib/telemetron/bin/telemetron ]]; then - local connect_to=5 - local max_to=55 - timeout 60 bash -c " - set -euo pipefail - curl --connect-timeout $connect_to --max-time $max_to -fsSL '$install_url' | sudo TELEMETRON_PREFIX=/usr/local bash - " || { - printf '[telemetron] install failed (exit %d) — continuing\n' "$?" >>"$log" - return 0 - } - fi - - # Resolve telemetron binary path - local telemetron_bin="" - if [[ -x /var/lib/telemetron/bin/telemetron ]]; then - telemetron_bin="/var/lib/telemetron/bin/telemetron" - elif command -v telemetron >/dev/null 2>&1; then - telemetron_bin="$(command -v telemetron)" - fi - - if [[ -z "$telemetron_bin" ]]; then - printf '[telemetron] binary not found after install — skipping\n' >>"$log" - return 0 - fi - - # Use `telemetron detect` to auto-discover roundhouse (and any other packs) - # and configure + enroll + start the service(s). - timeout 30 sudo "$telemetron_bin" detect \ - --endpoint "$endpoint" \ - --enroll-endpoint "$enroll_endpoint" \ - --mode roundhouse \ - --force >>"$log" 2>&1 || { - printf '[telemetron] detect failed (exit %d) — continuing\n' "$?" >>"$log" - return 0 - } - - printf '[telemetron] detect completed successfully\n' >>"$log" -} - -( - set +e - _telemetron_sidecar -) || true # ── Done ────────────────────────────────────────────────────────────────────── write_done_marker "roundhouse" printf "\n[PACK:roundhouse] INSTALLED — Telegram bot connected (systemd: roundhouse)\n" + +# ── Optional sidecar: telemetron ────────────────────────────────────────────── +# Runs after done marker so user sees success immediately. +# shellcheck source=../common-telemetron.sh +source "${SCRIPT_DIR}/../common-telemetron.sh" +install_telemetron roundhouse diff --git a/packs/roundhouse/manifest.yaml b/packs/roundhouse/manifest.yaml index cc4c928..d3df74b 100644 --- a/packs/roundhouse/manifest.yaml +++ b/packs/roundhouse/manifest.yaml @@ -26,6 +26,9 @@ params: - name: model description: "AI model ID for the agent" default: "us.anthropic.claude-opus-4-6-v1" + - name: skip-telemetron + description: "Skip telemetron metrics sidecar installation" + default: "false" health_check: command: "roundhouse --version"