Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
4d28f95
includes all the files when ventis build
Saaketh0 Aug 26, 2026
23e3928
fixed some bugs
Saaketh0 Aug 26, 2026
95240ca
ventis build: sweep project .py files into Docker build contexts
Saaketh0 Aug 26, 2026
69d5405
Fix missing os import in metrics_agent.py
Saaketh0 Aug 26, 2026
653bee8
WIP: OTel exporter testing + portfolio merge-conflict fix (pre-pull c…
Saaketh0 Aug 26, 2026
d861795
Merge origin/main into feature/otel-exporter
Saaketh0 Aug 26, 2026
4af43ae
[Feature] Pass env / secrets into agent containers
nickhuo Aug 26, 2026
087ee15
Harden the remote env file copy against a hostile /tmp
nickhuo Aug 26, 2026
db0ba26
WIP: OTel multi-destination fan-out (Railway+Langfuse+Grafana) + clea…
Saaketh0 Aug 27, 2026
1d319a5
Merge PR #51 (feature/all-the-files) into feature/otel-exporter
Saaketh0 Aug 27, 2026
098548c
Dedupe 'import os' from PR #51 merge (both sides added it independently)
Saaketh0 Aug 27, 2026
77231ec
Merge PR #53 (env_file secret injection) into feature/otel-exporter
Saaketh0 Aug 27, 2026
0b9546c
Fix PR #51 regression: disable entrypoint-based stub relocation
Saaketh0 Aug 27, 2026
7b3b167
Parallelize per-instance polling in _poll_controllers
Saaketh0 Aug 27, 2026
b5d6e4d
rough draft
Saaketh0 Aug 28, 2026
9bbc35d
rough draft
Saaketh0 Aug 28, 2026
8baed6c
Parallelize per-instance polling in _poll_controllers
Saaketh0 Aug 31, 2026
cd3a521
cleaned up OTel Exporter
Saaketh0 Aug 31, 2026
50733b8
Merge branch 'main' into feature/otel-exporter
Saaketh0 Aug 31, 2026
03d0a56
Merge feature/otel-exporter into improvement/global-polling
Saaketh0 Aug 31, 2026
1e6a6d8
Align with feature/otel-exporter: use updated langfuse config example…
Saaketh0 Aug 31, 2026
ede3fac
Restore parallelized polling implementation
Saaketh0 Aug 31, 2026
ea91ff9
added concurrent polling
Saaketh0 Aug 31, 2026
b4e45e8
Redis-backed otel destination reload: config change no longer needs f…
Saaketh0 Sep 3, 2026
9f630fe
Simplify: assume otel_exporter's Redis is always localhost:6379
Saaketh0 Sep 3, 2026
c085dbc
Trim explanatory comments off simple/obvious functions
Saaketh0 Sep 3, 2026
53a96c7
Ventis fixes extracted from the CLI packaging work
Saaketh0 Sep 4, 2026
0508422
Point example workflow imports at the stub's entrypoint path
Saaketh0 Sep 4, 2026
ff61053
Route local-provider agents over a dedicated docker network
Saaketh0 Sep 4, 2026
6f36d4f
Add the canyonos CLI package, porting skill, and .car examples
Saaketh0 Sep 4, 2026
7cbd976
removed some useless code
Saaketh0 Sep 4, 2026
c12c5c5
removed more useless code
Saaketh0 Sep 4, 2026
ced549d
cli
Saaketh0 Sep 4, 2026
9447e34
cleanup
Saaketh0 Sep 5, 2026
0931ffc
Integrate LLM proxy telemetry, replacing bedrock.py
Saaketh0 Sep 5, 2026
8f15161
Fix boto3 header injection: use before-call params['headers'] not req…
Saaketh0 Sep 5, 2026
d34df4e
docs: add cli/ARCHITECTURE.md and link it from cli/README.md
Saaketh0 Sep 5, 2026
6655c25
reviewed branch and code, made small changes
Saaketh0 Sep 8, 2026
d13218e
removed ventis changed everything to canyonos
Saaketh0 Sep 5, 2026
6eec206
Add binary distribution pipeline for canyonos CLI (curl + brew)
Saaketh0 Sep 9, 2026
521ad47
Fill in real sha256 for cli-v0.1.5 macos-arm64/linux-x86_64 assets
Saaketh0 Sep 9, 2026
6258046
Fix cli-release.yml: macos-13 runner is retired, use macos-15-intel
Saaketh0 Sep 9, 2026
00ba2ce
Fill in real sha256 for cli-v0.1.5 macos-x86_64 asset
Saaketh0 Sep 9, 2026
1c6338f
Add linux-arm64 to the CLI release matrix
Saaketh0 Sep 10, 2026
ef8498d
Fill in real sha256 for cli-v0.1.5 linux-arm64 asset
Saaketh0 Sep 10, 2026
560623c
Auto-bump version and publish to PyPI on any cli/ change to main
Saaketh0 Sep 10, 2026
e1ec881
Merge main into CAN-309-Alternate-CLI-Download (main as source of truth)
Saaketh0 Sep 10, 2026
38fcd51
Bump cli version to 0.1.711
Saaketh0 Sep 10, 2026
a5bb097
Add multi-arch build/push script for the saakeths/canyonos GC image
Saaketh0 Sep 10, 2026
406af96
small comment
Saaketh0 Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions .github/workflows/cli-release-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: Tag CLI Release

on:
push:
branches: [main]
paths:
- 'cli/**'

permissions:
contents: write

jobs:
bump:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[skip release]')"
outputs:
tag: ${{ steps.bump.outputs.tag }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Bump patch version in cli/pyproject.toml
id: bump
run: |
current=$(grep -m1 '^version = ' cli/pyproject.toml | sed -E 's/version = "(.*)"/\1/')
major=$(echo "$current" | cut -d. -f1)
minor=$(echo "$current" | cut -d. -f2)
patch=$(echo "$current" | cut -d. -f3)
next="$major.$minor.$((patch + 1))"
sed -i "s/^version = \".*\"/version = \"$next\"/" cli/pyproject.toml
echo "tag=cli-v$next" >> "$GITHUB_OUTPUT"

- name: Commit version bump and push tag
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add cli/pyproject.toml
git commit -m "cli: bump version to ${{ steps.bump.outputs.tag }} [skip release]"
git push origin HEAD:main
git tag "${{ steps.bump.outputs.tag }}"
git push origin "${{ steps.bump.outputs.tag }}"

release:
needs: bump
permissions:
contents: write
uses: ./.github/workflows/cli-release.yml
with:
tag: ${{ needs.bump.outputs.tag }}

publish-pypi:
needs: bump
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ needs.bump.outputs.tag }}

- name: Set up uv
uses: astral-sh/setup-uv@v5

- name: Build sdist and wheel
working-directory: cli
run: uv build

- name: Publish to PyPI
working-directory: cli
env:
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
run: uv publish

# Calls cli-release.yml directly (a GITHUB_TOKEN tag push won't retrigger it); "[skip release]" is a defensive backstop against the same push looping.
83 changes: 83 additions & 0 deletions .github/workflows/cli-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Release CLI

on:
push:
tags:
- 'cli-v*'
workflow_dispatch:
inputs:
tag:
description: 'Release tag (e.g. cli-v0.1.5)'
required: false
type: string
workflow_call:
inputs:
tag:
required: true
type: string

permissions:
contents: write

jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
asset: canyonos-macos-arm64
- os: macos-15-intel
asset: canyonos-macos-x86_64
- os: ubuntu-latest
asset: canyonos-linux-x86_64
- os: ubuntu-24.04-arm
asset: canyonos-linux-arm64

runs-on: ${{ matrix.os }}

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ inputs.tag || github.ref }}

- name: Set up uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true

- name: Install project and Nuitka
working-directory: cli
run: |
uv venv
uv pip install -e .
uv pip install nuitka

- name: Build standalone binary
working-directory: cli
run: |
uv run python -m nuitka \
--mode=onefile \
--output-filename=${{ matrix.asset }} \
--output-dir=dist \
--include-data-file=canyonos/dashboard.compose.yml=canyonos/dashboard.compose.yml \
--include-distribution-metadata=canyonos \
--assume-yes-for-downloads \
cli.py

- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.asset }}
path: cli/dist/${{ matrix.asset }}

- name: Attach to GitHub release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag || github.ref_name }}
files: cli/dist/${{ matrix.asset }}

# Triggered by: pushing a "cli-v*" tag directly, running manually, or cli-release-tag.yml calling
# this workflow after it auto-tags a cli/pyproject.toml version bump on main.
# cli/install.sh downloads the matching asset for the latest "cli-v*" release.
33 changes: 33 additions & 0 deletions Formula/canyonos.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class Canyonos < Formula
desc "CLI for CanyonOS"
homepage "https://github.com/CanyonCodeCoreAI/canyoncodecore"
version "0.1.5"

on_macos do
if Hardware::CPU.arm?
url "https://github.com/CanyonCodeCoreAI/canyoncodecore/releases/download/cli-v#{version}/canyonos-macos-arm64"
sha256 "068136e3e69ea502b8651cb2ab889ee53a7efc5d35723dce85f91b04817bef76"
else
url "https://github.com/CanyonCodeCoreAI/canyoncodecore/releases/download/cli-v#{version}/canyonos-macos-x86_64"
sha256 "c3f5e9adefc27f1cbfc2682138fde779b1865b3b66abba8b0d9dbd17d021526f"
end
end

on_linux do
if Hardware::CPU.arm?
url "https://github.com/CanyonCodeCoreAI/canyoncodecore/releases/download/cli-v#{version}/canyonos-linux-arm64"
sha256 "378d4a0a022e27396c531980c7a0808cb5a1d624ff0884f4ae5de0586533be4a"
else
url "https://github.com/CanyonCodeCoreAI/canyoncodecore/releases/download/cli-v#{version}/canyonos-linux-x86_64"
sha256 "1b5add3432079d06b2ec055f4a0da8a65961a33a0fd2f57ca79787ff01ca243f"
end
end

def install
bin.install Dir["canyonos-*"].first => "canyonos"
end

test do
system "#{bin}/canyonos", "version"
end
end
3 changes: 2 additions & 1 deletion canyonos_core/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ EXPOSE 8000
ENTRYPOINT ["python", "-m", "canyonos_core.server"]


# to run: docker build -f canyonos_core/Dockerfile -t saakeths/canyonos:latest .
# to run (single-arch, host platform only): docker build -f canyonos_core/Dockerfile -t saakeths/canyonos:latest .
# to build+push both amd64 and arm64: canyonos_core/build-and-push.sh
23 changes: 23 additions & 0 deletions canyonos_core/build-and-push.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/sh
# Builds and pushes saakeths/canyonos:latest for linux/amd64 and linux/arm64.
# NOTE: Will need to create an enterprise account on a registry and switch from saakeths to canyonos, this is temporary

set -eu

IMAGE="saakeths/canyonos:latest"
PLATFORMS="linux/amd64,linux/arm64"
BUILDER_NAME="canyonos-multiarch"

if ! docker buildx inspect "$BUILDER_NAME" >/dev/null 2>&1; then
docker buildx create --name "$BUILDER_NAME" --driver docker-container --use
else
docker buildx use "$BUILDER_NAME"
fi

docker buildx build \
--builder "$BUILDER_NAME" \
--platform "$PLATFORMS" \
-f canyonos_core/Dockerfile \
-t "$IMAGE" \
--push \
.
58 changes: 58 additions & 0 deletions cli/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/sh
# Installs the canyonos CLI from a prebuilt binary attached to the latest
# "cli-v*" GitHub release. Usage: curl -fsSL <raw-url>/install.sh | sh

set -eu

REPO="CanyonCodeCoreAI/canyoncodecore"
INSTALL_DIR="${CANYONOS_INSTALL_DIR:-$HOME/.local/bin}"

os="$(uname -s)"
arch="$(uname -m)"

case "$os" in
Darwin)
case "$arch" in
arm64) asset="canyonos-macos-arm64" ;;
x86_64) asset="canyonos-macos-x86_64" ;;
*) echo "error: unsupported macOS arch: $arch" >&2; exit 1 ;;
esac
;;
Linux)
case "$arch" in
x86_64) asset="canyonos-linux-x86_64" ;;
aarch64|arm64) asset="canyonos-linux-arm64" ;;
*) echo "error: unsupported Linux arch: $arch" >&2; exit 1 ;;
esac
;;
*)
echo "error: unsupported OS: $os (try 'pip install canyonos' instead)" >&2
exit 1
;;
esac

tag="${CANYONOS_VERSION:-}"
if [ -z "$tag" ]; then
tag="$(curl -fsSL "https://api.github.com/repos/$REPO/releases" \
| grep '"tag_name"' \
| grep -o 'cli-v[0-9][^"]*' \
| head -n1)"
fi

if [ -z "$tag" ]; then
echo "error: could not find a cli-v* release for $REPO" >&2
exit 1
fi

url="https://github.com/$REPO/releases/download/$tag/$asset"

echo "Installing canyonos $tag ($asset) to $INSTALL_DIR..."
mkdir -p "$INSTALL_DIR"
curl -fsSL "$url" -o "$INSTALL_DIR/canyonos"
chmod +x "$INSTALL_DIR/canyonos"

echo "Installed: $INSTALL_DIR/canyonos"
case ":$PATH:" in
*":$INSTALL_DIR:"*) ;;
*) echo "Add $INSTALL_DIR to your PATH to use 'canyonos' directly." ;;
esac
2 changes: 1 addition & 1 deletion cli/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "canyonos"
version = "0.1.5"
version = "0.1.711"
description = "CanyonOS CLI"
requires-python = ">=3.10"
dependencies = [
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading