{"repo": "caseymcc/arbiterai", "files": {".github/workflows/release-major-minor.yml": {"c2ae5b23520503b8227da2e1a3f9be9e7fcf1d4f": {"t": 1785747043.0894752, "n": 9093, "h": "8d175a189f18bff8", "c": "name: Release Major/Minor\n\non:\n workflow_dispatch:\n inputs:\n release_type:\n description: 'Release type'\n required: true\n type: choice\n options:\n - minor\n - major\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n packages: write\n pull-requests: read\n\n steps:\n - name: Checkout source branch\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n ssh-key: ${{ secrets.RELEASE_DEPLOY_KEY }}\n\n - name: Configure Git\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Calculate new version and branch\n id: version\n run: |\n chmod +x ./scripts/version.sh\n CURRENT=$(./scripts/version.sh get)\n IFS='.' read -r MAJOR MINOR PATCH <<< \"${CURRENT}\"\n\n if [ \"${{ inputs.release_type }}\" = \"major\" ]; then\n NEW_MAJOR=$((MAJOR+1))\n NEW_MINOR=0\n NEW_VERSION=\"${NEW_MAJOR}.0.0\"\n BRANCH=\"release/${NEW_MAJOR}.0\"\n else\n NEW_MINOR=$((MINOR+1))\n NEW_VERSION=\"${MAJOR}.${NEW_MINOR}.0\"\n BRANCH=\"release/${MAJOR}.${NEW_MINOR}\"\n fi\n\n echo \"current=${CURRENT}\" >> $GITHUB_OUTPUT\n echo \"new_version=${NEW_VERSION}\" >> $GITHUB_OUTPUT\n echo \"branch=${BRANCH}\" >> $GITHUB_OUTPUT\n echo \"Release type: ${{ inputs.release_type }}\"\n echo \"Current version: ${CURRENT}\"\n echo \"New version: ${NEW_VERSION}\"\n echo \"Branch: ${BRANCH}\"\n\n - name: Create release branch\n run: |\n git checkout -b \"${{ steps.version.outputs.branch }}\"\n\n - name: Set version on release branch\n run: |\n ./scripts/version.sh set \"${{ steps.version.outputs.new_version }}\"\n\n - name: Commit version bump\n run: |\n git add CMakeLists.txt\n git commit -m \"release: v${{ steps.version.outputs.new_version }}\"\n\n - name: Create tag\n run: |\n git tag \"v${{ steps.version.outputs.new_version }}\"\n\n - name: Push branch and tag\n run: |\n git push origin \"${{ steps.version.outputs.branch }}\" --follow-tags\n\n # --- Build artifacts ---\n\n - name: Extract Docker version\n id: docker_version\n run: |\n VERSION=$(grep -oP '(?<=^ARG DOCKER_VERSION=)[0-9]+\\.[0-9]+\\.[0-9]+' docker/Dockerfile)\n echo \"DOCKER_VERSION=$VERSION\" >> $GITHUB_OUTPUT\n REPO_LC=$(echo \"${{ github.repository }}\" | tr '[:upper:]' '[:lower:]')\n echo \"REPO_LC=$REPO_LC\" >> $GITHUB_OUTPUT\n\n - name: Log in to GitHub Container Registry\n uses: docker/login-action@v2\n with:\n registry: ghcr.io\n username: ${{ github.actor }}\n password: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Docker meta\n id: meta\n uses: docker/metadata-action@v4\n with:\n images: |\n ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}\n arbiterai-dev\n tags: |\n type=raw,value=${{ steps.docker_version.outputs.DOCKER_VERSION }}\n\n - name: Build and cache Docker image\n uses: docker/build-push-action@v4\n with:\n context: .\n file: ./docker/Dockerfile\n push: false\n load: true\n tags: ${{ steps.meta.outputs.tags }}\n labels: ${{ steps.meta.outputs.labels }}\n cache-from: type=registry,ref=ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}:${{ steps.docker_version.outputs.DOCKER_VERSION }}\n cache-to: type=inline\n\n - name: Create cache directories\n run: |\n mkdir -p models\n mkdir -p vcpkg_cache\n\n - name: Cache vcpkg\n uses: actions/cache@v3\n with:\n path: vcpkg_cache\n key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }}\n restore-keys: |\n ${{ runner.os }}-vcpkg-\n\n - name: Build project\n run: ./runDocker.sh --ci ./build.sh\n env:\n VCPKG_CACHE_PATH: ${{ github.workspace }}/vcpkg_cache\n\n # --- Package library ---\n\n - name: Package library\n id: package_lib\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n LIB_DIR=\"arbiterAI-lib-v${VERSION}-linux-x64\"\n\n mkdir -p \"${LIB_DIR}/lib\"\n mkdir -p \"${LIB_DIR}/include/arbiterAI\"\n mkdir -p \"${LIB_DIR}/lib/cmake/arbiterAI\"\n mkdir -p \"${LIB_DIR}/share/arbiterAI/schemas\"\n\n # Static library\n cp build/linux_x64_debug/libarbiterai.a \"${LIB_DIR}/lib/\"\n\n # Public headers\n for header in src/arbiterAI/*.h; do\n cp \"$header\" \"${LIB_DIR}/include/arbiterAI/\"\n done\n cp build/linux_x64_debug/generated/arbiterAI/version.h \"${LIB_DIR}/include/arbiterAI/\"\n\n # CMake package config\n cp build/linux_x64_debug/cmake/arbiterAIConfig.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n cp build/linux_x64_debug/cmake/arbiterAIConfigVersion.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n\n # JSON schema\n cp schemas/model_config.schema.json \"${LIB_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${LIB_DIR}/\"\n\n LIB_TARBALL=\"arbiterAI-lib-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${LIB_TARBALL}\" \"${LIB_DIR}\"\n echo \"tarball=${LIB_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Package server ---\n\n - name: Package server\n id: package_server\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n SRV_DIR=\"arbiterAI-server-v${VERSION}-linux-x64\"\n\n mkdir -p \"${SRV_DIR}/bin\"\n mkdir -p \"${SRV_DIR}/share/arbiterAI/schemas\"\n\n # Server binary\n cp build/linux_x64_debug/arbiterAI-server \"${SRV_DIR}/bin/\"\n\n # JSON schema for config validation\n cp schemas/model_config.schema.json \"${SRV_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${SRV_DIR}/\"\n\n # README with config instructions\n cat > \"${SRV_DIR}/README.md\" << 'READMEEOF'\n # ArbiterAI Server\n\n ## Quick Start\n\n ```bash\n ./bin/arbiterAI-server --port 8080 --config ./config\n ```\n\n ## Configuration\n\n The server loads model configurations from the path(s) given via `--config`.\n\n ### Downloading Model Configurations\n\n Default model configurations are maintained in the\n [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config) repository.\n Clone it to get started:\n\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ```\n\n The server will automatically discover model definitions from the cloned\n directory. To update configurations later:\n\n ```bash\n cd config && git pull\n ```\n\n ### Environment Variables\n\n Set API keys for cloud providers as environment variables:\n\n | Variable | Provider |\n |----------------------|------------|\n | `OPENAI_API_KEY` | OpenAI |\n | `ANTHROPIC_API_KEY` | Anthropic |\n | `DEEPSEEK_API_KEY` | DeepSeek |\n | `OPENROUTER_API_KEY` | OpenRouter |\n\n ## Command-Line Options\n\n ```\n --port, -p HTTP port (default: 8080)\n --host, -H Bind address (default: 0.0.0.0)\n --config, -c Model config path(s) (default: config)\n --model, -m Default model to load on startup\n --variant, -v Default variant (e.g., Q4_K_M)\n --ram-budget Ready model RAM budget in MB (default: auto)\n --log-level Log level: trace, debug, info, warn, error (default: info)\n ```\n\n ## Dashboard\n\n Open `http://localhost:8080/dashboard` in a browser for the live monitoring dashboard.\n READMEEOF\n\n SRV_TARBALL=\"arbiterAI-server-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${SRV_TARBALL}\" \"${SRV_DIR}\"\n echo \"tarball=${SRV_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Create release ---\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v2\n with:\n tag_name: \"v${{ steps.version.outputs.new_version }}\"\n name: \"v${{ steps.version.outputs.new_version }}\"\n generate_release_notes: true\n body: |\n ### Packages\n\n | Package | Description |\n |---------|-------------|\n | `arbiterAI-lib-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Library, headers, and CMake config for linking |\n | `arbiterAI-server-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Standalone server binary |\n\n ### Server Configuration\n\n Download model configurations from [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config):\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ./bin/arbiterAI-server --config ./config\n ```\n draft: false\n prerelease: false\n files: |\n ${{ steps.package_lib.outputs.tarball }}\n ${{ steps.package_server.outputs.tarball }}\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"}, "aa13e6078fabc73bbc9403bf06c8deb06e10917b": {"t": 1785770006.4671292, "n": 9093, "h": "8d175a189f18bff8", "c": "name: Release Major/Minor\n\non:\n workflow_dispatch:\n inputs:\n release_type:\n description: 'Release type'\n required: true\n type: choice\n options:\n - minor\n - major\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n packages: write\n pull-requests: read\n\n steps:\n - name: Checkout source branch\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n ssh-key: ${{ secrets.RELEASE_DEPLOY_KEY }}\n\n - name: Configure Git\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Calculate new version and branch\n id: version\n run: |\n chmod +x ./scripts/version.sh\n CURRENT=$(./scripts/version.sh get)\n IFS='.' read -r MAJOR MINOR PATCH <<< \"${CURRENT}\"\n\n if [ \"${{ inputs.release_type }}\" = \"major\" ]; then\n NEW_MAJOR=$((MAJOR+1))\n NEW_MINOR=0\n NEW_VERSION=\"${NEW_MAJOR}.0.0\"\n BRANCH=\"release/${NEW_MAJOR}.0\"\n else\n NEW_MINOR=$((MINOR+1))\n NEW_VERSION=\"${MAJOR}.${NEW_MINOR}.0\"\n BRANCH=\"release/${MAJOR}.${NEW_MINOR}\"\n fi\n\n echo \"current=${CURRENT}\" >> $GITHUB_OUTPUT\n echo \"new_version=${NEW_VERSION}\" >> $GITHUB_OUTPUT\n echo \"branch=${BRANCH}\" >> $GITHUB_OUTPUT\n echo \"Release type: ${{ inputs.release_type }}\"\n echo \"Current version: ${CURRENT}\"\n echo \"New version: ${NEW_VERSION}\"\n echo \"Branch: ${BRANCH}\"\n\n - name: Create release branch\n run: |\n git checkout -b \"${{ steps.version.outputs.branch }}\"\n\n - name: Set version on release branch\n run: |\n ./scripts/version.sh set \"${{ steps.version.outputs.new_version }}\"\n\n - name: Commit version bump\n run: |\n git add CMakeLists.txt\n git commit -m \"release: v${{ steps.version.outputs.new_version }}\"\n\n - name: Create tag\n run: |\n git tag \"v${{ steps.version.outputs.new_version }}\"\n\n - name: Push branch and tag\n run: |\n git push origin \"${{ steps.version.outputs.branch }}\" --follow-tags\n\n # --- Build artifacts ---\n\n - name: Extract Docker version\n id: docker_version\n run: |\n VERSION=$(grep -oP '(?<=^ARG DOCKER_VERSION=)[0-9]+\\.[0-9]+\\.[0-9]+' docker/Dockerfile)\n echo \"DOCKER_VERSION=$VERSION\" >> $GITHUB_OUTPUT\n REPO_LC=$(echo \"${{ github.repository }}\" | tr '[:upper:]' '[:lower:]')\n echo \"REPO_LC=$REPO_LC\" >> $GITHUB_OUTPUT\n\n - name: Log in to GitHub Container Registry\n uses: docker/login-action@v2\n with:\n registry: ghcr.io\n username: ${{ github.actor }}\n password: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Docker meta\n id: meta\n uses: docker/metadata-action@v4\n with:\n images: |\n ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}\n arbiterai-dev\n tags: |\n type=raw,value=${{ steps.docker_version.outputs.DOCKER_VERSION }}\n\n - name: Build and cache Docker image\n uses: docker/build-push-action@v4\n with:\n context: .\n file: ./docker/Dockerfile\n push: false\n load: true\n tags: ${{ steps.meta.outputs.tags }}\n labels: ${{ steps.meta.outputs.labels }}\n cache-from: type=registry,ref=ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}:${{ steps.docker_version.outputs.DOCKER_VERSION }}\n cache-to: type=inline\n\n - name: Create cache directories\n run: |\n mkdir -p models\n mkdir -p vcpkg_cache\n\n - name: Cache vcpkg\n uses: actions/cache@v3\n with:\n path: vcpkg_cache\n key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }}\n restore-keys: |\n ${{ runner.os }}-vcpkg-\n\n - name: Build project\n run: ./runDocker.sh --ci ./build.sh\n env:\n VCPKG_CACHE_PATH: ${{ github.workspace }}/vcpkg_cache\n\n # --- Package library ---\n\n - name: Package library\n id: package_lib\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n LIB_DIR=\"arbiterAI-lib-v${VERSION}-linux-x64\"\n\n mkdir -p \"${LIB_DIR}/lib\"\n mkdir -p \"${LIB_DIR}/include/arbiterAI\"\n mkdir -p \"${LIB_DIR}/lib/cmake/arbiterAI\"\n mkdir -p \"${LIB_DIR}/share/arbiterAI/schemas\"\n\n # Static library\n cp build/linux_x64_debug/libarbiterai.a \"${LIB_DIR}/lib/\"\n\n # Public headers\n for header in src/arbiterAI/*.h; do\n cp \"$header\" \"${LIB_DIR}/include/arbiterAI/\"\n done\n cp build/linux_x64_debug/generated/arbiterAI/version.h \"${LIB_DIR}/include/arbiterAI/\"\n\n # CMake package config\n cp build/linux_x64_debug/cmake/arbiterAIConfig.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n cp build/linux_x64_debug/cmake/arbiterAIConfigVersion.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n\n # JSON schema\n cp schemas/model_config.schema.json \"${LIB_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${LIB_DIR}/\"\n\n LIB_TARBALL=\"arbiterAI-lib-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${LIB_TARBALL}\" \"${LIB_DIR}\"\n echo \"tarball=${LIB_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Package server ---\n\n - name: Package server\n id: package_server\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n SRV_DIR=\"arbiterAI-server-v${VERSION}-linux-x64\"\n\n mkdir -p \"${SRV_DIR}/bin\"\n mkdir -p \"${SRV_DIR}/share/arbiterAI/schemas\"\n\n # Server binary\n cp build/linux_x64_debug/arbiterAI-server \"${SRV_DIR}/bin/\"\n\n # JSON schema for config validation\n cp schemas/model_config.schema.json \"${SRV_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${SRV_DIR}/\"\n\n # README with config instructions\n cat > \"${SRV_DIR}/README.md\" << 'READMEEOF'\n # ArbiterAI Server\n\n ## Quick Start\n\n ```bash\n ./bin/arbiterAI-server --port 8080 --config ./config\n ```\n\n ## Configuration\n\n The server loads model configurations from the path(s) given via `--config`.\n\n ### Downloading Model Configurations\n\n Default model configurations are maintained in the\n [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config) repository.\n Clone it to get started:\n\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ```\n\n The server will automatically discover model definitions from the cloned\n directory. To update configurations later:\n\n ```bash\n cd config && git pull\n ```\n\n ### Environment Variables\n\n Set API keys for cloud providers as environment variables:\n\n | Variable | Provider |\n |----------------------|------------|\n | `OPENAI_API_KEY` | OpenAI |\n | `ANTHROPIC_API_KEY` | Anthropic |\n | `DEEPSEEK_API_KEY` | DeepSeek |\n | `OPENROUTER_API_KEY` | OpenRouter |\n\n ## Command-Line Options\n\n ```\n --port, -p HTTP port (default: 8080)\n --host, -H Bind address (default: 0.0.0.0)\n --config, -c Model config path(s) (default: config)\n --model, -m Default model to load on startup\n --variant, -v Default variant (e.g., Q4_K_M)\n --ram-budget Ready model RAM budget in MB (default: auto)\n --log-level Log level: trace, debug, info, warn, error (default: info)\n ```\n\n ## Dashboard\n\n Open `http://localhost:8080/dashboard` in a browser for the live monitoring dashboard.\n READMEEOF\n\n SRV_TARBALL=\"arbiterAI-server-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${SRV_TARBALL}\" \"${SRV_DIR}\"\n echo \"tarball=${SRV_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Create release ---\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v2\n with:\n tag_name: \"v${{ steps.version.outputs.new_version }}\"\n name: \"v${{ steps.version.outputs.new_version }}\"\n generate_release_notes: true\n body: |\n ### Packages\n\n | Package | Description |\n |---------|-------------|\n | `arbiterAI-lib-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Library, headers, and CMake config for linking |\n | `arbiterAI-server-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Standalone server binary |\n\n ### Server Configuration\n\n Download model configurations from [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config):\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ./bin/arbiterAI-server --config ./config\n ```\n draft: false\n prerelease: false\n files: |\n ${{ steps.package_lib.outputs.tarball }}\n ${{ steps.package_server.outputs.tarball }}\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"}, "e20b83f1687e09b6f09f808e75197cb7b76979ac": {"t": 1785770012.050531, "n": 9085, "h": "092a74bef1c5c34e", "c": "name: Release Major/Minor\n\non:\n workflow_dispatch:\n inputs:\n release_type:\n description: 'Release type'\n required: true\n type: choice\n options:\n - minor\n - major\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n packages: write\n pull-requests: read\n\n steps:\n - name: Checkout source branch\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n token: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Configure Git\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Calculate new version and branch\n id: version\n run: |\n chmod +x ./scripts/version.sh\n CURRENT=$(./scripts/version.sh get)\n IFS='.' read -r MAJOR MINOR PATCH <<< \"${CURRENT}\"\n\n if [ \"${{ inputs.release_type }}\" = \"major\" ]; then\n NEW_MAJOR=$((MAJOR+1))\n NEW_MINOR=0\n NEW_VERSION=\"${NEW_MAJOR}.0.0\"\n BRANCH=\"release/${NEW_MAJOR}.0\"\n else\n NEW_MINOR=$((MINOR+1))\n NEW_VERSION=\"${MAJOR}.${NEW_MINOR}.0\"\n BRANCH=\"release/${MAJOR}.${NEW_MINOR}\"\n fi\n\n echo \"current=${CURRENT}\" >> $GITHUB_OUTPUT\n echo \"new_version=${NEW_VERSION}\" >> $GITHUB_OUTPUT\n echo \"branch=${BRANCH}\" >> $GITHUB_OUTPUT\n echo \"Release type: ${{ inputs.release_type }}\"\n echo \"Current version: ${CURRENT}\"\n echo \"New version: ${NEW_VERSION}\"\n echo \"Branch: ${BRANCH}\"\n\n - name: Create release branch\n run: |\n git checkout -b \"${{ steps.version.outputs.branch }}\"\n\n - name: Set version on release branch\n run: |\n ./scripts/version.sh set \"${{ steps.version.outputs.new_version }}\"\n\n - name: Commit version bump\n run: |\n git add CMakeLists.txt\n git commit -m \"release: v${{ steps.version.outputs.new_version }}\"\n\n - name: Create tag\n run: |\n git tag \"v${{ steps.version.outputs.new_version }}\"\n\n - name: Push branch and tag\n run: |\n git push origin \"${{ steps.version.outputs.branch }}\" --follow-tags\n\n # --- Build artifacts ---\n\n - name: Extract Docker version\n id: docker_version\n run: |\n VERSION=$(grep -oP '(?<=^ARG DOCKER_VERSION=)[0-9]+\\.[0-9]+\\.[0-9]+' docker/Dockerfile)\n echo \"DOCKER_VERSION=$VERSION\" >> $GITHUB_OUTPUT\n REPO_LC=$(echo \"${{ github.repository }}\" | tr '[:upper:]' '[:lower:]')\n echo \"REPO_LC=$REPO_LC\" >> $GITHUB_OUTPUT\n\n - name: Log in to GitHub Container Registry\n uses: docker/login-action@v2\n with:\n registry: ghcr.io\n username: ${{ github.actor }}\n password: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Docker meta\n id: meta\n uses: docker/metadata-action@v4\n with:\n images: |\n ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}\n arbiterai-dev\n tags: |\n type=raw,value=${{ steps.docker_version.outputs.DOCKER_VERSION }}\n\n - name: Build and cache Docker image\n uses: docker/build-push-action@v4\n with:\n context: .\n file: ./docker/Dockerfile\n push: false\n load: true\n tags: ${{ steps.meta.outputs.tags }}\n labels: ${{ steps.meta.outputs.labels }}\n cache-from: type=registry,ref=ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}:${{ steps.docker_version.outputs.DOCKER_VERSION }}\n cache-to: type=inline\n\n - name: Create cache directories\n run: |\n mkdir -p models\n mkdir -p vcpkg_cache\n\n - name: Cache vcpkg\n uses: actions/cache@v3\n with:\n path: vcpkg_cache\n key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }}\n restore-keys: |\n ${{ runner.os }}-vcpkg-\n\n - name: Build project\n run: ./runDocker.sh --ci ./build.sh\n env:\n VCPKG_CACHE_PATH: ${{ github.workspace }}/vcpkg_cache\n\n # --- Package library ---\n\n - name: Package library\n id: package_lib\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n LIB_DIR=\"arbiterAI-lib-v${VERSION}-linux-x64\"\n\n mkdir -p \"${LIB_DIR}/lib\"\n mkdir -p \"${LIB_DIR}/include/arbiterAI\"\n mkdir -p \"${LIB_DIR}/lib/cmake/arbiterAI\"\n mkdir -p \"${LIB_DIR}/share/arbiterAI/schemas\"\n\n # Static library\n cp build/linux_x64_debug/libarbiterai.a \"${LIB_DIR}/lib/\"\n\n # Public headers\n for header in src/arbiterAI/*.h; do\n cp \"$header\" \"${LIB_DIR}/include/arbiterAI/\"\n done\n cp build/linux_x64_debug/generated/arbiterAI/version.h \"${LIB_DIR}/include/arbiterAI/\"\n\n # CMake package config\n cp build/linux_x64_debug/cmake/arbiterAIConfig.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n cp build/linux_x64_debug/cmake/arbiterAIConfigVersion.cmake \"${LIB_DIR}/lib/cmake/arbiterAI/\" 2>/dev/null || true\n\n # JSON schema\n cp schemas/model_config.schema.json \"${LIB_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${LIB_DIR}/\"\n\n LIB_TARBALL=\"arbiterAI-lib-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${LIB_TARBALL}\" \"${LIB_DIR}\"\n echo \"tarball=${LIB_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Package server ---\n\n - name: Package server\n id: package_server\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n SRV_DIR=\"arbiterAI-server-v${VERSION}-linux-x64\"\n\n mkdir -p \"${SRV_DIR}/bin\"\n mkdir -p \"${SRV_DIR}/share/arbiterAI/schemas\"\n\n # Server binary\n cp build/linux_x64_debug/arbiterAI-server \"${SRV_DIR}/bin/\"\n\n # JSON schema for config validation\n cp schemas/model_config.schema.json \"${SRV_DIR}/share/arbiterAI/schemas/\"\n\n cp LICENSE \"${SRV_DIR}/\"\n\n # README with config instructions\n cat > \"${SRV_DIR}/README.md\" << 'READMEEOF'\n # ArbiterAI Server\n\n ## Quick Start\n\n ```bash\n ./bin/arbiterAI-server --port 8080 --config ./config\n ```\n\n ## Configuration\n\n The server loads model configurations from the path(s) given via `--config`.\n\n ### Downloading Model Configurations\n\n Default model configurations are maintained in the\n [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config) repository.\n Clone it to get started:\n\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ```\n\n The server will automatically discover model definitions from the cloned\n directory. To update configurations later:\n\n ```bash\n cd config && git pull\n ```\n\n ### Environment Variables\n\n Set API keys for cloud providers as environment variables:\n\n | Variable | Provider |\n |----------------------|------------|\n | `OPENAI_API_KEY` | OpenAI |\n | `ANTHROPIC_API_KEY` | Anthropic |\n | `DEEPSEEK_API_KEY` | DeepSeek |\n | `OPENROUTER_API_KEY` | OpenRouter |\n\n ## Command-Line Options\n\n ```\n --port, -p HTTP port (default: 8080)\n --host, -H Bind address (default: 0.0.0.0)\n --config, -c Model config path(s) (default: config)\n --model, -m Default model to load on startup\n --variant, -v Default variant (e.g., Q4_K_M)\n --ram-budget Ready model RAM budget in MB (default: auto)\n --log-level Log level: trace, debug, info, warn, error (default: info)\n ```\n\n ## Dashboard\n\n Open `http://localhost:8080/dashboard` in a browser for the live monitoring dashboard.\n READMEEOF\n\n SRV_TARBALL=\"arbiterAI-server-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${SRV_TARBALL}\" \"${SRV_DIR}\"\n echo \"tarball=${SRV_TARBALL}\" >> $GITHUB_OUTPUT\n\n # --- Create release ---\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v2\n with:\n tag_name: \"v${{ steps.version.outputs.new_version }}\"\n name: \"v${{ steps.version.outputs.new_version }}\"\n generate_release_notes: true\n body: |\n ### Packages\n\n | Package | Description |\n |---------|-------------|\n | `arbiterAI-lib-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Library, headers, and CMake config for linking |\n | `arbiterAI-server-v${{ steps.version.outputs.new_version }}-linux-x64.tar.gz` | Standalone server binary |\n\n ### Server Configuration\n\n Download model configurations from [arbiterAI_config](https://github.com/caseymcc/arbiterAI_config):\n ```bash\n git clone https://github.com/caseymcc/arbiterAI_config.git config\n ./bin/arbiterAI-server --config ./config\n ```\n draft: false\n prerelease: false\n files: |\n ${{ steps.package_lib.outputs.tarball }}\n ${{ steps.package_server.outputs.tarball }}\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"}, "b874a1a247f19671fa7396a3aca20aebf9129961": {"t": 1785770014.7479784, "n": 5648, "h": "881857880c05720e", "c": "name: Release Major/Minor\n\non:\n workflow_dispatch:\n inputs:\n release_type:\n description: 'Release type'\n required: true\n type: choice\n options:\n - minor\n - major\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n packages: write\n pull-requests: read\n\n steps:\n - name: Checkout source branch\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n token: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Configure Git\n run: |\n git config user.name \"github-actions[bot]\"\n git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n - name: Calculate new version and branch\n id: version\n run: |\n chmod +x ./scripts/version.sh\n CURRENT=$(./scripts/version.sh get)\n IFS='.' read -r MAJOR MINOR PATCH <<< \"${CURRENT}\"\n\n if [ \"${{ inputs.release_type }}\" = \"major\" ]; then\n NEW_MAJOR=$((MAJOR+1))\n NEW_MINOR=0\n NEW_VERSION=\"${NEW_MAJOR}.0.0\"\n BRANCH=\"release/${NEW_MAJOR}.0\"\n else\n NEW_MINOR=$((MINOR+1))\n NEW_VERSION=\"${MAJOR}.${NEW_MINOR}.0\"\n BRANCH=\"release/${MAJOR}.${NEW_MINOR}\"\n fi\n\n echo \"current=${CURRENT}\" >> $GITHUB_OUTPUT\n echo \"new_version=${NEW_VERSION}\" >> $GITHUB_OUTPUT\n echo \"branch=${BRANCH}\" >> $GITHUB_OUTPUT\n echo \"Release type: ${{ inputs.release_type }}\"\n echo \"Current version: ${CURRENT}\"\n echo \"New version: ${NEW_VERSION}\"\n echo \"Branch: ${BRANCH}\"\n\n - name: Create release branch\n run: |\n git checkout -b \"${{ steps.version.outputs.branch }}\"\n\n - name: Set version on release branch\n run: |\n ./scripts/version.sh set \"${{ steps.version.outputs.new_version }}\"\n\n - name: Commit version bump\n run: |\n git add CMakeLists.txt\n git commit -m \"release: v${{ steps.version.outputs.new_version }}\"\n\n - name: Create tag\n run: |\n git tag \"v${{ steps.version.outputs.new_version }}\"\n\n - name: Push branch and tag\n run: |\n git push origin \"${{ steps.version.outputs.branch }}\" --follow-tags\n\n # --- Build artifacts ---\n\n - name: Extract Docker version\n id: docker_version\n run: |\n VERSION=$(grep -oP '(?<=^ARG DOCKER_VERSION=)[0-9]+\\.[0-9]+\\.[0-9]+' docker/Dockerfile)\n echo \"DOCKER_VERSION=$VERSION\" >> $GITHUB_OUTPUT\n REPO_LC=$(echo \"${{ github.repository }}\" | tr '[:upper:]' '[:lower:]')\n echo \"REPO_LC=$REPO_LC\" >> $GITHUB_OUTPUT\n\n - name: Log in to GitHub Container Registry\n uses: docker/login-action@v2\n with:\n registry: ghcr.io\n username: ${{ github.actor }}\n password: ${{ secrets.GITHUB_TOKEN }}\n\n - name: Docker meta\n id: meta\n uses: docker/metadata-action@v4\n with:\n images: |\n ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}\n arbiterai-dev\n tags: |\n type=raw,value=${{ steps.docker_version.outputs.DOCKER_VERSION }}\n\n - name: Build and cache Docker image\n uses: docker/build-push-action@v4\n with:\n context: .\n file: ./docker/Dockerfile\n push: false\n load: true\n tags: ${{ steps.meta.outputs.tags }}\n labels: ${{ steps.meta.outputs.labels }}\n cache-from: type=registry,ref=ghcr.io/${{ steps.docker_version.outputs.REPO_LC }}:${{ steps.docker_version.outputs.DOCKER_VERSION }}\n cache-to: type=inline\n\n - name: Create cache directories\n run: |\n mkdir -p models\n mkdir -p vcpkg_cache\n\n - name: Cache vcpkg\n uses: actions/cache@v3\n with:\n path: vcpkg_cache\n key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }}\n restore-keys: |\n ${{ runner.os }}-vcpkg-\n\n - name: Build project\n run: ./runDocker.sh --ci ./build.sh\n env:\n VCPKG_CACHE_PATH: ${{ github.workspace }}/vcpkg_cache\n\n # --- Package artifacts ---\n\n - name: Package release artifacts\n id: package\n run: |\n VERSION=\"${{ steps.version.outputs.new_version }}\"\n ARTIFACT_DIR=\"arbiterAI-v${VERSION}-linux-x64\"\n\n mkdir -p \"${ARTIFACT_DIR}/lib\"\n mkdir -p \"${ARTIFACT_DIR}/bin\"\n mkdir -p \"${ARTIFACT_DIR}/include/arbiterAI\"\n\n # Copy library\n cp build/linux_x64_debug/libarbiterai.a \"${ARTIFACT_DIR}/lib/\" 2>/dev/null || true\n cp build/linux_x64_debug/libarbiterai.so \"${ARTIFACT_DIR}/lib/\" 2>/dev/null || true\n\n # Copy binaries\n cp build/linux_x64_debug/arbiterAI-server \"${ARTIFACT_DIR}/bin/\" 2>/dev/null || true\n cp build/linux_x64_debug/arbiterAI-cli \"${ARTIFACT_DIR}/bin/\" 2>/dev/null || true\n\n # Copy headers\n cp src/arbiterAI/*.h \"${ARTIFACT_DIR}/include/arbiterAI/\" 2>/dev/null || true\n cp build/linux_x64_debug/generated/arbiterAI/version.h \"${ARTIFACT_DIR}/include/arbiterAI/\" 2>/dev/null || true\n\n # Copy license\n cp LICENSE \"${ARTIFACT_DIR}/\"\n\n # Create tarball\n TARBALL=\"arbiterAI-v${VERSION}-linux-x64.tar.gz\"\n tar -czf \"${TARBALL}\" \"${ARTIFACT_DIR}\"\n echo \"tarball=${TARBALL}\" >> $GITHUB_OUTPUT\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v2\n with:\n tag_name: \"v${{ steps.version.outputs.new_version }}\"\n name: \"v${{ steps.version.outputs.new_version }}\"\n generate_release_notes: true\n draft: false\n prerelease: false\n files: |\n ${{ steps.package.outputs.tarball }}\n env:\n GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"}}}}