#!/usr/bin/env sh set -eu INSTALL_ROOT="${ORQINT_INSTALL_ROOT:-$HOME/.local/share/orqint}" CURRENT_DIR="$INSTALL_ROOT/current" BIN_DIR="${ORQINT_BIN_DIR:-$HOME/.local/bin}" BIN_PATH="$BIN_DIR/orqint" VERSION="1.2.39" RELEASE_BASE_URL="${ORQINT_RELEASE_BASE_URL:-https://orqint.com/downloads/releases/v1.2.39}" CHECKSUMS_URL="${ORQINT_RELEASE_CHECKSUMS_URL:-https://orqint.com/downloads/channels/stable/SHA256SUMS}" need_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "Missing required command: $1" >&2 exit 1 fi } sha256_file() { if command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | awk '{print $1}' return fi if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}' return fi echo "Missing checksum tool: shasum or sha256sum" >&2 exit 1 } detect_target() { os="$(uname -s)" arch="$(uname -m)" case "$os" in Darwin) case "$arch" in arm64) printf '%s\n' "darwin-arm64 tar.gz" ;; x86_64) printf '%s\n' "darwin-x64 tar.gz" ;; *) echo "Unsupported macOS architecture: $arch" >&2; exit 1 ;; esac ;; Linux) case "$arch" in x86_64|amd64) printf '%s\n' "linux-x64 tar.gz" ;; *) echo "Unsupported Linux architecture: $arch" >&2; exit 1 ;; esac ;; *) echo "Unsupported OS for install.sh: $os" >&2 exit 1 ;; esac } choose_profile() { if [ -n "${ORQINT_PROFILE:-}" ]; then printf '%s\n' "$ORQINT_PROFILE" return fi case "${SHELL:-}" in */zsh) printf '%s\n' "$HOME/.zprofile" ;; */bash) printf '%s\n' "$HOME/.bash_profile" ;; *) printf '%s\n' "$HOME/.profile" ;; esac } file_has_line() { file="$1" expected="$2" while IFS= read -r current_line || [ -n "$current_line" ]; do if [ "$current_line" = "$expected" ]; then return 0 fi done < "$file" return 1 } ensure_path_entry() { case ":$PATH:" in *":$BIN_DIR:"*) return ;; esac profile="$(choose_profile)" line="export PATH=\"$BIN_DIR:\$PATH\"" mkdir -p "$(dirname "$profile")" touch "$profile" if ! file_has_line "$profile" "$line"; then printf '\n%s\n' "$line" >> "$profile" fi echo "Added $BIN_DIR to PATH in $profile" >&2 echo "Open a new terminal or run: export PATH=\"$BIN_DIR:\$PATH\"" >&2 } download() { url="$1" dest="$2" if [ -n "${ORQINT_RELEASE_TOKEN:-}" ]; then curl -fsSL -H "Authorization: Bearer $ORQINT_RELEASE_TOKEN" "$url" -o "$dest" else curl -fsSL "$url" -o "$dest" fi } need_cmd curl need_cmd tar need_cmd awk set -- $(detect_target) TARGET="$1" ARCHIVE_EXT="$2" case "$TARGET" in darwin-arm64) ARTIFACT="orqint-1.2.39-darwin-arm64.tar.gz" ;; darwin-x64) ARTIFACT="orqint-1.2.39-darwin-x64.tar.gz" ;; linux-x64) ARTIFACT="orqint-1.2.39-linux-x64.tar.gz" ;; *) echo "No installer artifact configured for $TARGET" >&2; exit 1 ;; esac WORKDIR="$(mktemp -d "${TMPDIR:-/tmp}/orqint-install-XXXXXX")" trap 'rm -rf "$WORKDIR"' EXIT INT TERM ARCHIVE_PATH="$WORKDIR/$ARTIFACT" SUMS_PATH="$WORKDIR/SHA256SUMS" echo "Installing Orqint $VERSION for $TARGET..." >&2 download "$RELEASE_BASE_URL/$ARTIFACT" "$ARCHIVE_PATH" download "$CHECKSUMS_URL" "$SUMS_PATH" EXPECTED_HASH="$(awk -v name="$ARTIFACT" '$2 == name { print $1 }' "$SUMS_PATH")" if [ -z "$EXPECTED_HASH" ]; then echo "Could not find checksum for $ARTIFACT" >&2 exit 1 fi ACTUAL_HASH="$(sha256_file "$ARCHIVE_PATH")" if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then echo "Checksum verification failed for $ARTIFACT" >&2 exit 1 fi tar -xzf "$ARCHIVE_PATH" -C "$WORKDIR" BUNDLE_ROOT="$WORKDIR/Orqint" if [ ! -d "$BUNDLE_ROOT" ]; then echo "Downloaded archive did not contain Orqint/" >&2 exit 1 fi mkdir -p "$INSTALL_ROOT" "$BIN_DIR" "$BUNDLE_ROOT/runtime/node" -e ' const fs = require("node:fs"); const markerPath = process.argv[1]; const installRoot = process.argv[2]; const binPath = process.argv[3]; const marker = JSON.parse(fs.readFileSync(markerPath, "utf8")); marker.installedVia = "installer_script"; marker.installRoot = installRoot; marker.binPath = binPath; marker.channel = "stable"; marker.releaseOrigin = "https://orqint.com"; marker.updateManifestUrl = "https://orqint.com/downloads/channels/stable/manifest.json"; marker.releaseAccess = { kind: "public_hosted_distribution", bearerEnvVar: "ORQINT_RELEASE_TOKEN" }; fs.writeFileSync(markerPath, JSON.stringify(marker, null, 2) + "\n", "utf8"); ' "$BUNDLE_ROOT/bundle-install.json" "$CURRENT_DIR" "$BIN_PATH" STAGED_DIR="$INSTALL_ROOT/.next" BACKUP_DIR="$INSTALL_ROOT/.previous" rm -rf "$STAGED_DIR" "$BACKUP_DIR" mv "$BUNDLE_ROOT" "$STAGED_DIR" if [ -d "$CURRENT_DIR" ]; then mv "$CURRENT_DIR" "$BACKUP_DIR" fi mv "$STAGED_DIR" "$CURRENT_DIR" rm -rf "$BACKUP_DIR" cat > "$BIN_PATH" <&2 echo "Orqint installed." >&2 echo "Next:" >&2 echo " orqint setup" >&2 echo " orqint start \"Your intent in plain language\"" >&2