forked from WHC/Hermit
Initial CST-Agent: portable Linux/Termux/Windows coding agent.
Vendored sashidown, OpenAI-compatible env (OPENAI_*), and bootstrap scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
# One-shot: clone (optional) + build CST-Agent on Linux.
|
||||
set -euo pipefail
|
||||
|
||||
REPO_URL="${CST_AGENT_REPO:-https://git.whcself.xyz/WHC/CST-agent.git}"
|
||||
DIR="${1:-}"
|
||||
|
||||
if [[ -z "$DIR" ]]; then
|
||||
if [[ -f Makefile && -d src ]]; then
|
||||
DIR="$(pwd)"
|
||||
else
|
||||
DIR="CST-agent"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -f "$DIR/Makefile" ]]; then
|
||||
echo "==> git clone $REPO_URL -> $DIR"
|
||||
git clone "$REPO_URL" "$DIR"
|
||||
fi
|
||||
cd "$DIR"
|
||||
|
||||
echo "==> deps hint: gcc/clang make cmake libcurl ncursesw (zenity optional)"
|
||||
if command -v pacman >/dev/null 2>&1; then
|
||||
echo " Arch: sudo pacman -S --needed base-devel cmake curl ncurses"
|
||||
elif command -v apt-get >/dev/null 2>&1; then
|
||||
echo " Debian: sudo apt install build-essential cmake libcurl4-openssl-dev libncurses-dev"
|
||||
fi
|
||||
|
||||
echo "==> make"
|
||||
make -j"$(nproc 2>/dev/null || echo 4)"
|
||||
make check || true
|
||||
|
||||
echo
|
||||
echo "OK: ./cst-agent"
|
||||
echo "OpenAI-compatible env (see docs/env_openai.md):"
|
||||
echo " export OPENAI_API_KEY=sk-..."
|
||||
echo " export OPENAI_BASE_URL=https://api.openai.com/v1"
|
||||
echo " export OPENAI_MODEL=gpt-4.1-mini"
|
||||
echo " ./cst-agent --workspace ."
|
||||
echo "Or MiniMax default: export CST_API_KEY=... && ./cst-agent --workspace ."
|
||||
Executable
+31
@@ -0,0 +1,31 @@
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
# One-shot: clone + build CST-Agent on Android Termux.
|
||||
set -euo pipefail
|
||||
|
||||
REPO_URL="${CST_AGENT_REPO:-https://git.whcself.xyz/WHC/CST-agent.git}"
|
||||
DIR="${1:-CST-agent}"
|
||||
|
||||
echo "==> Termux packages"
|
||||
pkg install -y git clang make cmake libcurl ncurses-ui-libs 2>/dev/null \
|
||||
|| pkg install -y git clang make cmake curl ncurses
|
||||
|
||||
if [[ ! -f "$DIR/Makefile" ]]; then
|
||||
echo "==> git clone $REPO_URL -> $DIR"
|
||||
git clone "$REPO_URL" "$DIR"
|
||||
fi
|
||||
cd "$DIR"
|
||||
|
||||
echo "==> cmake build (TUI)"
|
||||
cmake -B build -DCMAKE_C_COMPILER=clang -DCST_BUILD_TUI=ON
|
||||
cmake --build build -j"$(nproc 2>/dev/null || echo 4)"
|
||||
# Also keep Makefile binary path convenience
|
||||
cp -f build/cst-agent ./cst-agent 2>/dev/null || true
|
||||
|
||||
echo
|
||||
echo "OK: ./cst-agent (or ./build/cst-agent)"
|
||||
echo "OpenAI-compatible:"
|
||||
echo " export OPENAI_API_KEY=sk-..."
|
||||
echo " export OPENAI_BASE_URL=https://api.openai.com/v1"
|
||||
echo " export OPENAI_MODEL=gpt-4.1-mini"
|
||||
echo " ./cst-agent --workspace \$HOME"
|
||||
echo "Docs: docs/env_openai.md"
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
# One-shot on a Linux host: cross-build Windows x86_64 release (MinGW).
|
||||
# Output: dist/windows-x86_64/ — copy that folder to a Windows machine.
|
||||
set -euo pipefail
|
||||
|
||||
REPO_URL="${CST_AGENT_REPO:-https://git.whcself.xyz/WHC/CST-agent.git}"
|
||||
DIR="${1:-}"
|
||||
|
||||
if [[ -z "$DIR" ]]; then
|
||||
if [[ -f CMakeLists.txt && -d src ]]; then
|
||||
DIR="$(pwd)"
|
||||
else
|
||||
DIR="CST-agent"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -f "$DIR/CMakeLists.txt" ]]; then
|
||||
echo "==> git clone $REPO_URL -> $DIR"
|
||||
git clone "$REPO_URL" "$DIR"
|
||||
fi
|
||||
cd "$DIR"
|
||||
|
||||
need() { command -v "$1" >/dev/null || { echo "missing $1 (install mingw-w64 gcc cmake git)" >&2; exit 1; }; }
|
||||
need git; need cmake; need x86_64-w64-mingw32-gcc
|
||||
|
||||
echo "==> third-party (curl Schannel + PDCurses + busybox-w32)"
|
||||
chmod +x scripts/*.sh 2>/dev/null || true
|
||||
./scripts/build_third_party_mingw.sh all
|
||||
|
||||
echo "==> cmake Windows TUI"
|
||||
cmake -B build-win-tui \
|
||||
-DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64-x86_64.cmake \
|
||||
-DCST_BUILD_TUI=ON \
|
||||
-DCMAKE_PREFIX_PATH="$PWD/third_party/prefix-mingw" \
|
||||
-DPDCurses_ROOT="$PWD/third_party/prefix-mingw"
|
||||
cmake --build build-win-tui -j"$(nproc 2>/dev/null || echo 4)"
|
||||
|
||||
echo "==> package"
|
||||
./scripts/package_windows.sh
|
||||
|
||||
echo
|
||||
echo "OK: dist/windows-x86_64/"
|
||||
echo "Copy that folder to Windows, then:"
|
||||
echo " set OPENAI_API_KEY=sk-..."
|
||||
echo " set OPENAI_BASE_URL=https://api.openai.com/v1"
|
||||
echo " set OPENAI_MODEL=gpt-4.1-mini"
|
||||
echo " cst-agent.exe --workspace ."
|
||||
echo "See docs/env_openai.md and docs/README-windows.md"
|
||||
Executable
+139
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build third-party deps for Windows MinGW cross + optional Unix busybox.
|
||||
# Sources:
|
||||
# busybox-w32: https://github.com/rmyorston/busybox-w32.git
|
||||
# busybox: https://github.com/mirror/busybox.git
|
||||
# curl: https://github.com/curl/curl.git (Windows via Schannel)
|
||||
# PDCurses: https://github.com/wmcbrine/PDCurses.git
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
TP="$ROOT/third_party"
|
||||
HOST="${MINGW_HOST:-x86_64-w64-mingw32}"
|
||||
JOBS="${JOBS:-$(nproc 2>/dev/null || echo 4)}"
|
||||
mkdir -p "$TP"
|
||||
|
||||
need_cmd() { command -v "$1" >/dev/null || { echo "missing: $1" >&2; exit 1; }; }
|
||||
need_cmd git
|
||||
need_cmd make
|
||||
need_cmd "${HOST}-gcc"
|
||||
|
||||
clone_or_update() {
|
||||
local url="$1" dir="$2"
|
||||
if [[ -d "$dir/.git" ]]; then
|
||||
git -C "$dir" fetch --depth 1 origin 2>/dev/null || true
|
||||
git -C "$dir" pull --ff-only 2>/dev/null || true
|
||||
else
|
||||
git clone --depth 1 "$url" "$dir"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- curl (static, Schannel) ---
|
||||
build_curl_mingw() {
|
||||
clone_or_update https://github.com/curl/curl.git "$TP/curl"
|
||||
cd "$TP/curl"
|
||||
if [[ ! -f configure ]]; then
|
||||
autoreconf -fi 2>/dev/null || true
|
||||
fi
|
||||
# Prefer cmake for curl modern tree
|
||||
rm -rf build-mingw
|
||||
cmake -B build-mingw -G "Unix Makefiles" \
|
||||
-DCMAKE_SYSTEM_NAME=Windows \
|
||||
-DCMAKE_C_COMPILER="${HOST}-gcc" \
|
||||
-DCMAKE_RC_COMPILER="${HOST}-windres" \
|
||||
-DCMAKE_INSTALL_PREFIX="$TP/prefix-mingw" \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DCURL_USE_SCHANNEL=ON \
|
||||
-DCURL_USE_OPENSSL=OFF \
|
||||
-DCURL_DISABLE_LDAP=ON \
|
||||
-DCURL_USE_LIBPSL=OFF \
|
||||
-DCURL_ZLIB=OFF \
|
||||
-DCURL_BROTLI=OFF \
|
||||
-DCURL_ZSTD=OFF \
|
||||
-DUSE_NGHTTP2=OFF \
|
||||
-DBUILD_CURL_EXE=OFF \
|
||||
-DBUILD_TESTING=OFF \
|
||||
-DHTTP_ONLY=OFF
|
||||
cmake --build build-mingw -j"$JOBS"
|
||||
cmake --install build-mingw
|
||||
echo "curl installed -> $TP/prefix-mingw"
|
||||
}
|
||||
|
||||
# --- PDCurses ---
|
||||
build_pdcurses_mingw() {
|
||||
clone_or_update https://github.com/wmcbrine/PDCurses.git "$TP/PDCurses"
|
||||
cd "$TP/PDCurses/wincon"
|
||||
make -f Makefile clean 2>/dev/null || true
|
||||
make -f Makefile \
|
||||
CC="${HOST}-gcc" \
|
||||
LINK="${HOST}-gcc" \
|
||||
CFLAGS="-O2 -I.. -DPDC_WIDE -DPDC_FORCE_UTF8" \
|
||||
LIBEXE="${HOST}-ar" \
|
||||
LIBFLAGS=rcv \
|
||||
pdcurses.a
|
||||
mkdir -p "$TP/prefix-mingw/include" "$TP/prefix-mingw/lib"
|
||||
cp -f ../curses.h "$TP/prefix-mingw/include/"
|
||||
[[ -f ../panel.h ]] && cp -f ../panel.h "$TP/prefix-mingw/include/" || true
|
||||
cp -f pdcurses.a "$TP/prefix-mingw/lib/libpdcurses.a"
|
||||
# Also install as curses for find_library
|
||||
cp -f pdcurses.a "$TP/prefix-mingw/lib/libcurses.a"
|
||||
echo "PDCurses -> $TP/prefix-mingw"
|
||||
}
|
||||
|
||||
# --- busybox-w32 ---
|
||||
build_busybox_w32() {
|
||||
clone_or_update https://github.com/rmyorston/busybox-w32.git "$TP/busybox-w32"
|
||||
cd "$TP/busybox-w32"
|
||||
# configs: try mingw64 defconfig
|
||||
if [[ -f configs/mingw64_defconfig ]]; then
|
||||
make mingw64_defconfig
|
||||
elif [[ -f configs/mingw_defconfig ]]; then
|
||||
make mingw_defconfig
|
||||
else
|
||||
make defconfig
|
||||
fi
|
||||
# Cross compile
|
||||
make -j"$JOBS" CROSS_COMPILE="${HOST}-" \
|
||||
CONFIG_EXTRA_CFLAGS="-O2" \
|
||||
busybox.exe 2>&1 || make -j"$JOBS" CROSS_COMPILE="${HOST}-"
|
||||
mkdir -p "$TP/busybox"
|
||||
if [[ -f busybox.exe ]]; then
|
||||
cp -f busybox.exe "$TP/busybox/busybox.exe"
|
||||
else
|
||||
find . -name 'busybox.exe' | head -1 | xargs -I{} cp -f {} "$TP/busybox/busybox.exe"
|
||||
fi
|
||||
cat > "$TP/busybox/LICENSE.busybox" << 'EOF'
|
||||
BusyBox is GPLv2. Source: https://github.com/rmyorston/busybox-w32
|
||||
Upstream BusyBox: https://github.com/mirror/busybox
|
||||
EOF
|
||||
ls -la "$TP/busybox/busybox.exe"
|
||||
}
|
||||
|
||||
# --- Unix busybox (optional, for Linux/Termux side-by-side bundle) ---
|
||||
build_busybox_unix() {
|
||||
clone_or_update https://github.com/mirror/busybox.git "$TP/busybox-src"
|
||||
cd "$TP/busybox-src"
|
||||
make defconfig
|
||||
# Keep applets reasonable; enable ash + diff
|
||||
make -j"$JOBS" busybox
|
||||
mkdir -p "$TP/busybox"
|
||||
cp -f busybox "$TP/busybox/busybox"
|
||||
echo "unix busybox -> $TP/busybox/busybox"
|
||||
}
|
||||
|
||||
TARGETS="${1:-all}"
|
||||
case "$TARGETS" in
|
||||
curl) build_curl_mingw ;;
|
||||
pdcurses) build_pdcurses_mingw ;;
|
||||
busybox-w32) build_busybox_w32 ;;
|
||||
busybox-unix) build_busybox_unix ;;
|
||||
all)
|
||||
build_curl_mingw
|
||||
build_pdcurses_mingw
|
||||
build_busybox_w32
|
||||
;;
|
||||
*)
|
||||
echo "usage: $0 [all|curl|pdcurses|busybox-w32|busybox-unix]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "DONE"
|
||||
Executable
+114
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env bash
|
||||
# E2E: copy mini_calc → temp workspace → optional cst-agent headless → make test.
|
||||
# Usage:
|
||||
# ./scripts/e2e_mini_calc.sh # run agent if credentials exist
|
||||
# ./scripts/e2e_mini_calc.sh --baseline-only # only prove fixture starts RED then skip agent
|
||||
# SKIP_AGENT=1 ./scripts/e2e_mini_calc.sh
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
FIX="$ROOT/fixtures/mini_calc"
|
||||
OUT="$FIX/out"
|
||||
BASELINE_ONLY=0
|
||||
for a in "$@"; do
|
||||
case "$a" in
|
||||
--baseline-only) BASELINE_ONLY=1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
mkdir -p "$OUT"
|
||||
STAMP="$(date -u +%Y%m%dT%H%M%SZ)"
|
||||
WORKDIR="$(mktemp -d /tmp/cst-mini-calc.XXXXXX)"
|
||||
RESULT="$OUT/result-$STAMP.txt"
|
||||
SESSION_COPY="$OUT/session-$STAMP.jsonl"
|
||||
|
||||
cleanup() { rm -rf "$WORKDIR"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "== mini_calc e2e ==" | tee "$RESULT"
|
||||
echo "workdir=$WORKDIR" | tee -a "$RESULT"
|
||||
echo "stamp=$STAMP" | tee -a "$RESULT"
|
||||
|
||||
# Fresh copy (no .agent from previous runs)
|
||||
cp -a "$FIX/." "$WORKDIR/"
|
||||
rm -rf "$WORKDIR/out" "$WORKDIR/.agent"
|
||||
chmod +x "$WORKDIR/tests/smoke.sh"
|
||||
|
||||
cd "$WORKDIR"
|
||||
make clean >/dev/null 2>&1 || true
|
||||
make
|
||||
|
||||
echo "-- baseline make test (expect FAIL before agent) --" | tee -a "$RESULT"
|
||||
set +e
|
||||
make test >"$OUT/baseline-$STAMP.log" 2>&1
|
||||
base_rc=$?
|
||||
set -e
|
||||
echo "baseline_rc=$base_rc" | tee -a "$RESULT"
|
||||
if [[ "$base_rc" -eq 0 ]]; then
|
||||
echo "UNEXPECTED: fixture already passes; bugs may have been fixed in source." | tee -a "$RESULT"
|
||||
echo "outcome=unexpected_green_fixture" | tee -a "$RESULT"
|
||||
exit 2
|
||||
fi
|
||||
echo "baseline: RED (as expected)" | tee -a "$RESULT"
|
||||
|
||||
if [[ "$BASELINE_ONLY" -eq 1 || "${SKIP_AGENT:-0}" == "1" ]]; then
|
||||
echo "outcome=baseline_ok_agent_skipped" | tee -a "$RESULT"
|
||||
echo "SKIP agent step (--baseline-only or SKIP_AGENT=1)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Need API key for agent step
|
||||
has_key=0
|
||||
if [[ -n "${CST_API_KEY:-}" || -n "${MINIMAX_API_KEY:-}" ]]; then
|
||||
has_key=1
|
||||
elif [[ -f "$HOME/.config/cst-agent/credentials" ]]; then
|
||||
has_key=1
|
||||
fi
|
||||
if [[ "$has_key" -eq 0 ]]; then
|
||||
echo "outcome=baseline_ok_no_api_key" | tee -a "$RESULT"
|
||||
echo "No API key; agent step skipped. Set CST_API_KEY or save credentials."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
cd "$ROOT"
|
||||
make -s
|
||||
|
||||
mkdir -p "$WORKDIR/.agent"
|
||||
PROMPT="$(cat "$FIX/TASK.md")"
|
||||
export CST_AUTO_APPROVE=1
|
||||
echo "-- cst-agent headless --" | tee -a "$RESULT"
|
||||
set +e
|
||||
"$ROOT/cst-agent" --headless --workspace "$WORKDIR" --session "$WORKDIR/.agent/e2e.jsonl" \
|
||||
--prompt "$PROMPT" >"$OUT/agent-$STAMP.log" 2>&1
|
||||
agent_rc=$?
|
||||
set -e
|
||||
echo "agent_rc=$agent_rc" | tee -a "$RESULT"
|
||||
if [[ -f "$WORKDIR/.agent/e2e.jsonl" ]]; then
|
||||
cp -f "$WORKDIR/.agent/e2e.jsonl" "$SESSION_COPY"
|
||||
echo "session_copy=$SESSION_COPY" | tee -a "$RESULT"
|
||||
fi
|
||||
|
||||
cd "$WORKDIR"
|
||||
set +e
|
||||
make test >"$OUT/after-$STAMP.log" 2>&1
|
||||
test_rc=$?
|
||||
set -e
|
||||
echo "after_test_rc=$test_rc" | tee -a "$RESULT"
|
||||
|
||||
# Classify
|
||||
changed=0
|
||||
if ! diff -q "$FIX/calc.c" "$WORKDIR/calc.c" >/dev/null 2>&1; then
|
||||
changed=1
|
||||
fi
|
||||
echo "calc_c_changed=$changed" | tee -a "$RESULT"
|
||||
|
||||
if [[ "$test_rc" -eq 0 ]]; then
|
||||
echo "outcome=pass" | tee -a "$RESULT"
|
||||
exit 0
|
||||
fi
|
||||
if [[ "$changed" -eq 1 ]]; then
|
||||
echo "outcome=partial" | tee -a "$RESULT"
|
||||
exit 1
|
||||
fi
|
||||
echo "outcome=fail" | tee -a "$RESULT"
|
||||
exit 1
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fetch busybox-w32 into third_party/busybox/busybox.exe (Linux/CI host).
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
DEST="$ROOT/third_party/busybox"
|
||||
mkdir -p "$DEST"
|
||||
OUT="$DEST/busybox.exe"
|
||||
|
||||
# Override with BUSYBOX_W32_URL if the default 404s / TLS fails.
|
||||
URLS=(
|
||||
"${BUSYBOX_W32_URL:-}"
|
||||
"https://frippery.org/files/busybox/busybox-w64-FRP-5007-g82accfc19.exe"
|
||||
"https://frippery.org/files/busybox/busybox.exe"
|
||||
)
|
||||
|
||||
ok=0
|
||||
for URL in "${URLS[@]}"; do
|
||||
[[ -z "$URL" ]] && continue
|
||||
echo "Downloading $URL -> $OUT"
|
||||
if curl -fsSL -L --connect-timeout 20 -o "$OUT" "$URL"; then
|
||||
ok=1
|
||||
break
|
||||
fi
|
||||
echo "failed: $URL" >&2
|
||||
done
|
||||
|
||||
cat > "$DEST/LICENSE.busybox" << 'EOF'
|
||||
BusyBox is licensed under GPLv2. Obtain the corresponding source from the
|
||||
upstream busybox-w32 / BusyBox project when redistributing the binary.
|
||||
See: https://www.busybox.net/ https://frippery.org/busybox/
|
||||
EOF
|
||||
|
||||
if [[ "$ok" -ne 1 ]]; then
|
||||
cat >&2 <<'EOF'
|
||||
Could not download busybox-w32 automatically.
|
||||
Manual steps:
|
||||
1. Visit https://frippery.org/busybox/ or busybox-w32 releases
|
||||
2. Save the 64-bit binary as agent/third_party/busybox/busybox.exe
|
||||
3. Copy it next to cst-agent.exe on Windows releases
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
chmod +x "$OUT" || true
|
||||
file "$OUT" || true
|
||||
ls -la "$OUT"
|
||||
echo "OK: place this next to cst-agent.exe on Windows releases."
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Assemble dist/windows-x86_64 from MinGW TUI build + busybox.
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
REL="$ROOT/dist/windows-x86_64"
|
||||
EXE="$ROOT/build-win-tui/cst-agent.exe"
|
||||
[[ -f "$EXE" ]] || EXE="$ROOT/build-win/cst-agent.exe"
|
||||
BB="$ROOT/third_party/busybox/busybox.exe"
|
||||
DLL="/usr/x86_64-w64-mingw32/bin/libwinpthread-1.dll"
|
||||
|
||||
mkdir -p "$REL"
|
||||
cp -f "$EXE" "$REL/cst-agent.exe"
|
||||
cp -f "$BB" "$REL/busybox.exe"
|
||||
cp -f "$ROOT/third_party/busybox/LICENSE.busybox" "$REL/"
|
||||
cp -f "$ROOT/docs/README-windows.md" "$REL/"
|
||||
[[ -f "$DLL" ]] && cp -f "$DLL" "$REL/"
|
||||
ls -la "$REL"
|
||||
file "$REL/cst-agent.exe"
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
# Replay starvation experiment (CTL vs JSON-buffer).
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
make check
|
||||
echo
|
||||
echo "See docs/theory_tool_cst.md for the claim under test."
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
@echo off
|
||||
REM Run ON Windows after copying dist/windows-x86_64 (or a full git checkout + MSYS2 build).
|
||||
REM This script only documents env + launch; prefer bootstrap_windows.sh on Linux for cross-build.
|
||||
|
||||
setlocal
|
||||
if "%OPENAI_API_KEY%"=="" if "%CST_API_KEY%"=="" (
|
||||
echo Set OPENAI_API_KEY or CST_API_KEY first. See docs\env_openai.md
|
||||
echo Example:
|
||||
echo set OPENAI_API_KEY=sk-...
|
||||
echo set OPENAI_BASE_URL=https://api.openai.com/v1
|
||||
echo set OPENAI_MODEL=gpt-4.1-mini
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if not exist cst-agent.exe (
|
||||
echo cst-agent.exe not found in %CD%
|
||||
echo Copy dist\windows-x86_64\* here, or build with MSYS2/MinGW.
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if not exist busybox.exe (
|
||||
echo WARNING: busybox.exe missing — run_shell may fail. Place busybox.exe beside cst-agent.exe
|
||||
)
|
||||
|
||||
echo Launching CST-Agent...
|
||||
cst-agent.exe --workspace .
|
||||
endlocal
|
||||
Reference in New Issue
Block a user