Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea0b3c8c8c | |||
| 627b160f55 | |||
| 6463bc84b0 | |||
| f84f1229af | |||
| f85d21097b | |||
| 306821d6a2 | |||
| 06f9424274 | |||
| fa14ab4ab2 | |||
| 36a0c8eba9 | |||
| f4c82d5797 | |||
| 5edebf4869 | |||
| 613fa79444 | |||
| 44c8e1eaac | |||
| 414b1fa8dd | |||
| 913d5ee851 | |||
| 5a4332d0e4 | |||
| 970c80d278 | |||
| 9514c20038 | |||
| 9cf31a732c | |||
| 7f0ddf06a9 | |||
| b79e88662e | |||
| b71b69fa6e | |||
| 8b961b7bd9 | |||
| 3b67d8a797 | |||
| f0e111bf7b | |||
| b3071f622a | |||
| 8dbf142c7b | |||
| 2b3603bacf | |||
| 02369d892d | |||
| b38db505ff | |||
| 06b9525263 | |||
| 8fe573330c | |||
| dc61f08f60 | |||
| f7c8a3b8be | |||
| 6cd8749eb4 | |||
| c54f374c7e | |||
| dd00b57f6f | |||
| c8db32389d | |||
| 611e4702c2 | |||
| 99cfae1f00 | |||
| 1c624f0c51 | |||
| 8a8f946269 | |||
| 17469945f7 | |||
| 6dcd7b7222 | |||
| 342f743720 | |||
| e05fd75763 | |||
| 4daeb380a0 | |||
| ddacb2a917 | |||
| 77ca576be6 | |||
| 5a4f69e71f | |||
| e952838eef | |||
| 3fc4e66fb6 |
@@ -53,7 +53,7 @@ If the user hasn't set up ZeroClaw yet (no `~/.zeroclaw/config.toml` exists), gu
|
||||
```bash
|
||||
zeroclaw onboard # Quick mode — defaults to OpenRouter
|
||||
zeroclaw onboard --provider anthropic # Use Anthropic directly
|
||||
zeroclaw onboard --interactive # Step-by-step wizard
|
||||
zeroclaw onboard # Guided wizard (default)
|
||||
```
|
||||
|
||||
After onboarding, verify everything works:
|
||||
|
||||
@@ -50,7 +50,7 @@ First-time setup or reconfiguration.
|
||||
```bash
|
||||
zeroclaw onboard # Quick mode (default: openrouter)
|
||||
zeroclaw onboard --provider anthropic # Quick mode with specific provider
|
||||
zeroclaw onboard --interactive # Interactive wizard
|
||||
zeroclaw onboard # Guided wizard (default)
|
||||
zeroclaw onboard --memory sqlite # Set memory backend
|
||||
zeroclaw onboard --force # Overwrite existing config
|
||||
zeroclaw onboard --channels-only # Repair channels only
|
||||
@@ -62,7 +62,7 @@ zeroclaw onboard --channels-only # Repair channels only
|
||||
- `--memory <backend>` — sqlite, markdown, lucid, none
|
||||
- `--force` — overwrite existing config.toml
|
||||
- `--channels-only` — only repair channel configuration
|
||||
- `--interactive` — step-by-step wizard
|
||||
- `--reinit` — start fresh (backs up existing config)
|
||||
|
||||
Creates `~/.zeroclaw/config.toml` with `0600` permissions.
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ body:
|
||||
label: Steps to reproduce
|
||||
description: Please provide exact commands/config.
|
||||
placeholder: |
|
||||
1. zeroclaw onboard --interactive
|
||||
1. zeroclaw onboard
|
||||
2. zeroclaw daemon
|
||||
3. Observe crash in logs
|
||||
render: bash
|
||||
|
||||
Executable
+139
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env bash
|
||||
# sync-readme.sh — Auto-update "What's New" and "Recent Contributors" in all READMEs
|
||||
# Called by the sync-readme GitHub Actions workflow on each release.
|
||||
set -euo pipefail
|
||||
|
||||
# --- Resolve version and ranges ---
|
||||
|
||||
LATEST_TAG=$(git tag --sort=-creatordate | head -1 || echo "")
|
||||
if [ -z "$LATEST_TAG" ]; then
|
||||
echo "No tags found — skipping README sync"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
VERSION="${LATEST_TAG#v}"
|
||||
|
||||
# Find previous stable tag for contributor range
|
||||
PREV_STABLE=$(git tag --sort=-creatordate \
|
||||
| grep -v "^${LATEST_TAG}$" \
|
||||
| grep -vE '\-beta\.' \
|
||||
| head -1 || echo "")
|
||||
|
||||
FEAT_RANGE="${PREV_STABLE:+${PREV_STABLE}..}${LATEST_TAG}"
|
||||
CONTRIB_RANGE="${PREV_STABLE:+${PREV_STABLE}..}${LATEST_TAG}"
|
||||
|
||||
# --- Build "What's New" table rows ---
|
||||
|
||||
FEATURES=$(git log "$FEAT_RANGE" --pretty=format:"%s" --no-merges \
|
||||
| grep -iE '^feat(\(|:)' \
|
||||
| sed 's/^feat(\([^)]*\)): /| \1 | /' \
|
||||
| sed 's/^feat: /| General | /' \
|
||||
| sed 's/ (#[0-9]*)$//' \
|
||||
| sort -uf \
|
||||
| while IFS= read -r line; do echo "${line} |"; done || true)
|
||||
|
||||
if [ -z "$FEATURES" ]; then
|
||||
FEATURES="| General | Incremental improvements and polish |"
|
||||
fi
|
||||
|
||||
MONTH_YEAR=$(date -u +"%B %Y")
|
||||
|
||||
# --- Build contributor list ---
|
||||
|
||||
GIT_AUTHORS=$(git log "$CONTRIB_RANGE" --pretty=format:"%an" --no-merges | sort -uf || true)
|
||||
CO_AUTHORS=$(git log "$CONTRIB_RANGE" --pretty=format:"%b" --no-merges \
|
||||
| grep -ioE 'Co-Authored-By: *[^<]+' \
|
||||
| sed 's/Co-Authored-By: *//i' \
|
||||
| sed 's/ *$//' \
|
||||
| sort -uf || true)
|
||||
|
||||
ALL_CONTRIBUTORS=$(printf "%s\n%s" "$GIT_AUTHORS" "$CO_AUTHORS" \
|
||||
| sort -uf \
|
||||
| grep -v '^$' \
|
||||
| grep -viE '\[bot\]$|^dependabot|^github-actions|^copilot|^ZeroClaw Bot|^ZeroClaw Runner|^ZeroClaw Agent|^blacksmith' \
|
||||
|| true)
|
||||
|
||||
CONTRIBUTOR_COUNT=$(echo "$ALL_CONTRIBUTORS" | grep -c . || echo "0")
|
||||
|
||||
CONTRIBUTOR_LIST=$(echo "$ALL_CONTRIBUTORS" \
|
||||
| while IFS= read -r name; do
|
||||
[ -z "$name" ] && continue
|
||||
echo "- **${name}**"
|
||||
done || true)
|
||||
|
||||
# --- Write temp files for section content ---
|
||||
|
||||
WHATS_NEW_FILE=$(mktemp)
|
||||
cat > "$WHATS_NEW_FILE" <<WHATS_EOF
|
||||
|
||||
### 🚀 What's New in ${LATEST_TAG} (${MONTH_YEAR})
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
${FEATURES}
|
||||
|
||||
WHATS_EOF
|
||||
|
||||
CONTRIBUTORS_FILE=$(mktemp)
|
||||
cat > "$CONTRIBUTORS_FILE" <<CONTRIB_EOF
|
||||
|
||||
### 🌟 Recent Contributors (${LATEST_TAG})
|
||||
|
||||
${CONTRIBUTOR_COUNT} contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
${CONTRIBUTOR_LIST}
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
CONTRIB_EOF
|
||||
|
||||
# --- Replace sections in all README files with markers ---
|
||||
|
||||
README_FILES=$(find . -maxdepth 1 -name 'README*.md' -type f | sort)
|
||||
UPDATED=0
|
||||
|
||||
for readme in $README_FILES; do
|
||||
if ! grep -q 'BEGIN:WHATS_NEW' "$readme"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
python3 - "$readme" "$WHATS_NEW_FILE" "$CONTRIBUTORS_FILE" <<'PYEOF'
|
||||
import sys, re
|
||||
|
||||
readme_path = sys.argv[1]
|
||||
whats_new_path = sys.argv[2]
|
||||
contributors_path = sys.argv[3]
|
||||
|
||||
with open(readme_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
with open(whats_new_path, 'r') as f:
|
||||
whats_new = f.read()
|
||||
|
||||
with open(contributors_path, 'r') as f:
|
||||
contributors = f.read()
|
||||
|
||||
content = re.sub(
|
||||
r'(<!-- BEGIN:WHATS_NEW -->)\n.*?(<!-- END:WHATS_NEW -->)',
|
||||
r'\1\n' + whats_new + r'\2',
|
||||
content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
content = re.sub(
|
||||
r'(<!-- BEGIN:RECENT_CONTRIBUTORS -->)\n.*?(<!-- END:RECENT_CONTRIBUTORS -->)',
|
||||
r'\1\n' + contributors + r'\2',
|
||||
content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
|
||||
with open(readme_path, 'w') as f:
|
||||
f.write(content)
|
||||
PYEOF
|
||||
|
||||
UPDATED=$((UPDATED + 1))
|
||||
done
|
||||
|
||||
rm -f "$WHATS_NEW_FILE" "$CONTRIBUTORS_FILE"
|
||||
|
||||
echo "README synced: ${LATEST_TAG} — ${CONTRIBUTOR_COUNT} contributors — ${UPDATED} files updated"
|
||||
@@ -0,0 +1,124 @@
|
||||
name: Auto-sync crates.io
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
paths:
|
||||
- "Cargo.toml"
|
||||
|
||||
concurrency:
|
||||
group: publish-crates-auto
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
detect-version-change:
|
||||
name: Detect Version Bump
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
changed: ${{ steps.check.outputs.changed }}
|
||||
version: ${{ steps.check.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Check if version changed
|
||||
id: check
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
current=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)
|
||||
previous=$(git show HEAD~1:Cargo.toml 2>/dev/null | sed -n 's/^version = "\([^"]*\)"/\1/p' | head -1 || echo "")
|
||||
|
||||
echo "Current version: ${current}"
|
||||
echo "Previous version: ${previous}"
|
||||
|
||||
if [[ "$current" != "$previous" && -n "$current" ]]; then
|
||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||
echo "version=${current}" >> "$GITHUB_OUTPUT"
|
||||
echo "Version bumped from ${previous} to ${current} — will publish"
|
||||
else
|
||||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||
echo "Version unchanged (${current}) — skipping publish"
|
||||
fi
|
||||
|
||||
check-registry:
|
||||
name: Check if Already Published
|
||||
needs: [detect-version-change]
|
||||
if: needs.detect-version-change.outputs.changed == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
should_publish: ${{ steps.check.outputs.should_publish }}
|
||||
steps:
|
||||
- name: Check crates.io for existing version
|
||||
id: check
|
||||
shell: bash
|
||||
env:
|
||||
VERSION: ${{ needs.detect-version-change.outputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
status=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
"https://crates.io/api/v1/crates/zeroclawlabs/${VERSION}")
|
||||
|
||||
if [[ "$status" == "200" ]]; then
|
||||
echo "Version ${VERSION} already exists on crates.io — skipping"
|
||||
echo "should_publish=false" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "Version ${VERSION} not yet published — proceeding"
|
||||
echo "should_publish=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
publish:
|
||||
name: Publish to crates.io
|
||||
needs: [detect-version-change, check-registry]
|
||||
if: needs.check-registry.outputs.should_publish == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
toolchain: 1.92.0
|
||||
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
cache-dependency-path: web/package-lock.json
|
||||
|
||||
- name: Build web dashboard
|
||||
run: cd web && npm ci && npm run build
|
||||
|
||||
- name: Clean web build artifacts
|
||||
run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html
|
||||
|
||||
- name: Publish to crates.io
|
||||
run: cargo publish --locked --allow-dirty --no-verify
|
||||
env:
|
||||
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||
|
||||
- name: Verify published
|
||||
shell: bash
|
||||
env:
|
||||
VERSION: ${{ needs.detect-version-change.outputs.version }}
|
||||
run: |
|
||||
echo "Waiting for crates.io to index..."
|
||||
sleep 15
|
||||
status=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
"https://crates.io/api/v1/crates/zeroclawlabs/${VERSION}")
|
||||
if [[ "$status" == "200" ]]; then
|
||||
echo "zeroclawlabs v${VERSION} is live on crates.io"
|
||||
echo "Install: cargo install zeroclawlabs"
|
||||
else
|
||||
echo "::warning::Version may still be indexing — check https://crates.io/crates/zeroclawlabs"
|
||||
fi
|
||||
@@ -0,0 +1,80 @@
|
||||
name: Publish to crates.io
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: "Version to publish (e.g. 0.2.0) — must match Cargo.toml"
|
||||
required: true
|
||||
type: string
|
||||
dry_run:
|
||||
description: "Dry run (validate without publishing)"
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: publish-crates
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
name: Validate
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Check version matches Cargo.toml
|
||||
shell: bash
|
||||
env:
|
||||
INPUT_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cargo_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)
|
||||
if [[ "$cargo_version" != "$INPUT_VERSION" ]]; then
|
||||
echo "::error::Cargo.toml version (${cargo_version}) does not match input (${INPUT_VERSION})"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
publish:
|
||||
name: Publish to crates.io
|
||||
needs: [validate]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
toolchain: 1.92.0
|
||||
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
cache-dependency-path: web/package-lock.json
|
||||
|
||||
- name: Build web dashboard
|
||||
run: cd web && npm ci && npm run build
|
||||
|
||||
- name: Clean web build artifacts
|
||||
run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html
|
||||
|
||||
- name: Publish (dry run)
|
||||
if: inputs.dry_run
|
||||
run: cargo publish --dry-run --locked --allow-dirty --no-verify
|
||||
env:
|
||||
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||
|
||||
- name: Publish to crates.io
|
||||
if: "!inputs.dry_run"
|
||||
run: cargo publish --locked --allow-dirty --no-verify
|
||||
env:
|
||||
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||
@@ -170,6 +170,11 @@ jobs:
|
||||
target: aarch64-apple-darwin
|
||||
artifact: zeroclaw
|
||||
ext: tar.gz
|
||||
- os: ubuntu-latest
|
||||
target: aarch64-linux-android
|
||||
artifact: zeroclaw
|
||||
ext: tar.gz
|
||||
ndk: true
|
||||
- os: windows-latest
|
||||
target: x86_64-pc-windows-msvc
|
||||
artifact: zeroclaw.exe
|
||||
@@ -194,6 +199,10 @@ jobs:
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y ${{ matrix.cross_compiler }}
|
||||
|
||||
- name: Setup Android NDK
|
||||
if: matrix.ndk
|
||||
run: echo "$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Build release
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -238,19 +247,35 @@ jobs:
|
||||
find . -type f \( -name '*.tar.gz' -o -name '*.zip' \) -exec sha256sum {} + | sed 's| \./[^/]*/| |' > SHA256SUMS
|
||||
cat SHA256SUMS
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2
|
||||
with:
|
||||
tag_name: ${{ needs.version.outputs.tag }}
|
||||
name: ${{ needs.version.outputs.tag }}
|
||||
prerelease: true
|
||||
body: ${{ needs.release-notes.outputs.notes }}
|
||||
files: |
|
||||
artifacts/**/*
|
||||
install.sh
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
- name: Collect release assets
|
||||
run: |
|
||||
mkdir -p release-assets
|
||||
find artifacts -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name 'SHA256SUMS' \) -exec cp {} release-assets/ \;
|
||||
cp install.sh release-assets/
|
||||
echo "--- Assets ---"
|
||||
ls -lh release-assets/
|
||||
|
||||
- name: Write release notes
|
||||
env:
|
||||
NOTES: ${{ needs.release-notes.outputs.notes }}
|
||||
run: printf '%s\n' "$NOTES" > release-notes.md
|
||||
|
||||
- name: Create GitHub Release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
TAG: ${{ needs.version.outputs.tag }}
|
||||
run: |
|
||||
gh release create "$TAG" release-assets/* \
|
||||
--repo "${{ github.repository }}" \
|
||||
--title "$TAG" \
|
||||
--notes-file release-notes.md \
|
||||
--prerelease
|
||||
|
||||
redeploy-website:
|
||||
name: Trigger Website Redeploy
|
||||
needs: [publish]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Trigger website redeploy
|
||||
env:
|
||||
PAT: ${{ secrets.WEBSITE_REPO_PAT }}
|
||||
@@ -265,7 +290,7 @@ jobs:
|
||||
name: Push Docker Image
|
||||
needs: [version, build]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
timeout-minutes: 60
|
||||
steps:
|
||||
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||
|
||||
@@ -288,3 +313,19 @@ jobs:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
# ── Post-publish: only run after ALL artifacts are live ──────────────
|
||||
tweet:
|
||||
name: Tweet Release
|
||||
needs: [version, publish, docker, redeploy-website]
|
||||
uses: ./.github/workflows/tweet-release.yml
|
||||
with:
|
||||
release_tag: ${{ needs.version.outputs.tag }}
|
||||
release_url: https://github.com/zeroclaw-labs/zeroclaw/releases/tag/${{ needs.version.outputs.tag }}
|
||||
secrets: inherit
|
||||
|
||||
sync-readme:
|
||||
name: Sync README
|
||||
needs: [publish, docker, redeploy-website]
|
||||
uses: ./.github/workflows/sync-readme.yml
|
||||
secrets: inherit
|
||||
|
||||
@@ -171,6 +171,11 @@ jobs:
|
||||
target: aarch64-apple-darwin
|
||||
artifact: zeroclaw
|
||||
ext: tar.gz
|
||||
- os: ubuntu-latest
|
||||
target: aarch64-linux-android
|
||||
artifact: zeroclaw
|
||||
ext: tar.gz
|
||||
ndk: true
|
||||
- os: windows-latest
|
||||
target: x86_64-pc-windows-msvc
|
||||
artifact: zeroclaw.exe
|
||||
@@ -195,6 +200,10 @@ jobs:
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y ${{ matrix.cross_compiler }}
|
||||
|
||||
- name: Setup Android NDK
|
||||
if: matrix.ndk
|
||||
run: echo "$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Build release
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -239,19 +248,74 @@ jobs:
|
||||
find . -type f \( -name '*.tar.gz' -o -name '*.zip' \) -exec sha256sum {} + | sed 's| \./[^/]*/| |' > SHA256SUMS
|
||||
cat SHA256SUMS
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2
|
||||
with:
|
||||
tag_name: ${{ needs.validate.outputs.tag }}
|
||||
name: ${{ needs.validate.outputs.tag }}
|
||||
prerelease: false
|
||||
body: ${{ needs.release-notes.outputs.notes }}
|
||||
files: |
|
||||
artifacts/**/*
|
||||
install.sh
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Collect release assets
|
||||
run: |
|
||||
mkdir -p release-assets
|
||||
find artifacts -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name 'SHA256SUMS' \) -exec cp {} release-assets/ \;
|
||||
cp install.sh release-assets/
|
||||
echo "--- Assets ---"
|
||||
ls -lh release-assets/
|
||||
|
||||
- name: Write release notes
|
||||
env:
|
||||
NOTES: ${{ needs.release-notes.outputs.notes }}
|
||||
run: printf '%s\n' "$NOTES" > release-notes.md
|
||||
|
||||
- name: Create GitHub Release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
TAG: ${{ needs.validate.outputs.tag }}
|
||||
run: |
|
||||
gh release create "$TAG" release-assets/* \
|
||||
--repo "${{ github.repository }}" \
|
||||
--title "$TAG" \
|
||||
--notes-file release-notes.md \
|
||||
--latest
|
||||
|
||||
crates-io:
|
||||
name: Publish to crates.io
|
||||
needs: [validate, publish]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
toolchain: 1.92.0
|
||||
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
cache-dependency-path: web/package-lock.json
|
||||
|
||||
- name: Build web dashboard
|
||||
run: cd web && npm ci && npm run build
|
||||
|
||||
- name: Clean web build artifacts
|
||||
run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html
|
||||
|
||||
- name: Publish to crates.io
|
||||
env:
|
||||
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||
VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
# Skip if this version is already on crates.io (auto-sync may have published it)
|
||||
CRATE_NAME=$(sed -n 's/^name = "\([^"]*\)"/\1/p' Cargo.toml | head -1)
|
||||
if curl -sfL "https://crates.io/api/v1/crates/${CRATE_NAME}/${VERSION}" | grep -q '"version"'; then
|
||||
echo "::notice::${CRATE_NAME}@${VERSION} already published on crates.io — skipping"
|
||||
else
|
||||
cargo publish --locked --allow-dirty --no-verify
|
||||
fi
|
||||
|
||||
redeploy-website:
|
||||
name: Trigger Website Redeploy
|
||||
needs: [publish]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Trigger website redeploy
|
||||
env:
|
||||
PAT: ${{ secrets.WEBSITE_REPO_PAT }}
|
||||
@@ -266,7 +330,7 @@ jobs:
|
||||
name: Push Docker Image
|
||||
needs: [validate, build]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
timeout-minutes: 60
|
||||
steps:
|
||||
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||
|
||||
@@ -289,3 +353,19 @@ jobs:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
# ── Post-publish: only run after ALL artifacts are live ──────────────
|
||||
tweet:
|
||||
name: Tweet Release
|
||||
needs: [validate, publish, docker, crates-io, redeploy-website]
|
||||
uses: ./.github/workflows/tweet-release.yml
|
||||
with:
|
||||
release_tag: ${{ needs.validate.outputs.tag }}
|
||||
release_url: https://github.com/zeroclaw-labs/zeroclaw/releases/tag/${{ needs.validate.outputs.tag }}
|
||||
secrets: inherit
|
||||
|
||||
sync-readme:
|
||||
name: Sync README
|
||||
needs: [publish, docker, crates-io, redeploy-website]
|
||||
uses: ./.github/workflows/sync-readme.yml
|
||||
secrets: inherit
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
name: Sync README
|
||||
|
||||
on:
|
||||
# Called by release workflows AFTER all publish steps complete.
|
||||
workflow_call:
|
||||
secrets:
|
||||
RELEASE_TOKEN:
|
||||
required: true
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
|
||||
- name: Sync README sections
|
||||
run: bash .github/scripts/sync-readme.sh
|
||||
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "ZeroClaw Bot"
|
||||
git config user.email "bot@zeroclawlabs.ai"
|
||||
if git diff --quiet -- 'README*.md'; then
|
||||
echo "No README changes — skipping commit"
|
||||
exit 0
|
||||
fi
|
||||
git add README*.md
|
||||
git commit -m "docs(readme): auto-sync What's New and Contributors"
|
||||
git push origin HEAD:master
|
||||
@@ -1,8 +1,26 @@
|
||||
name: Tweet Release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
# Called by release workflows AFTER all publish steps (docker, crates, website) complete.
|
||||
workflow_call:
|
||||
inputs:
|
||||
release_tag:
|
||||
description: "Release tag (e.g. v0.3.0 or v0.3.0-beta.42)"
|
||||
required: true
|
||||
type: string
|
||||
release_url:
|
||||
description: "GitHub Release URL"
|
||||
required: true
|
||||
type: string
|
||||
secrets:
|
||||
TWITTER_CONSUMER_API_KEY:
|
||||
required: false
|
||||
TWITTER_CONSUMER_API_SECRET_KEY:
|
||||
required: false
|
||||
TWITTER_ACCESS_TOKEN:
|
||||
required: false
|
||||
TWITTER_ACCESS_TOKEN_SECRET:
|
||||
required: false
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tweet_text:
|
||||
@@ -26,7 +44,7 @@ jobs:
|
||||
id: check
|
||||
shell: bash
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name || '' }}
|
||||
RELEASE_TAG: ${{ inputs.release_tag || '' }}
|
||||
MANUAL_TEXT: ${{ inputs.tweet_text || '' }}
|
||||
run: |
|
||||
# Manual dispatch always proceeds
|
||||
@@ -62,8 +80,8 @@ jobs:
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
shell: bash
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name || '' }}
|
||||
RELEASE_URL: ${{ github.event.release.html_url || '' }}
|
||||
RELEASE_TAG: ${{ inputs.release_tag || '' }}
|
||||
RELEASE_URL: ${{ inputs.release_url || '' }}
|
||||
MANUAL_TEXT: ${{ inputs.tweet_text || '' }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
@@ -120,14 +138,32 @@ jobs:
|
||||
"$RELEASE_TAG" "$FEATURES" "$TOTAL_COUNT" "$RELEASE_URL")
|
||||
fi
|
||||
|
||||
# Append release URL if not already present and we have one
|
||||
if [ -n "$RELEASE_URL" ] && ! echo "$TWEET" | grep -q "$RELEASE_URL"; then
|
||||
TWEET=$(printf "%s\n\n%s" "$TWEET" "$RELEASE_URL")
|
||||
# X/Twitter counts any URL as 23 chars (t.co shortening).
|
||||
# Extract the URL (if present), truncate the BODY to fit, then
|
||||
# re-append the URL so it is never chopped.
|
||||
URL=""
|
||||
BODY="$TWEET"
|
||||
|
||||
# Pull URL out of existing tweet text or use RELEASE_URL
|
||||
FOUND_URL=$(echo "$TWEET" | grep -oE 'https?://[^ ]+' | tail -1 || true)
|
||||
if [ -n "$FOUND_URL" ]; then
|
||||
URL="$FOUND_URL"
|
||||
BODY=$(echo "$TWEET" | sed "s|${URL}||" | sed -e 's/[[:space:]]*$//')
|
||||
elif [ -n "$RELEASE_URL" ]; then
|
||||
URL="$RELEASE_URL"
|
||||
fi
|
||||
|
||||
# Truncate to 280 chars if needed
|
||||
if [ ${#TWEET} -gt 280 ]; then
|
||||
TWEET="${TWEET:0:277}..."
|
||||
if [ -n "$URL" ]; then
|
||||
# URL counts as 23 chars on X + 2 chars for \n\n separator = 25
|
||||
MAX_BODY=$((280 - 25))
|
||||
if [ ${#BODY} -gt $MAX_BODY ]; then
|
||||
BODY="${BODY:0:$((MAX_BODY - 3))}..."
|
||||
fi
|
||||
TWEET=$(printf "%s\n\n%s" "$BODY" "$URL")
|
||||
else
|
||||
if [ ${#TWEET} -gt 280 ]; then
|
||||
TWEET="${TWEET:0:277}..."
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "--- Tweet preview ---"
|
||||
@@ -140,9 +176,37 @@ jobs:
|
||||
echo "TWEET_EOF"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Post to X
|
||||
- name: Check for duplicate tweet
|
||||
id: dedup
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
shell: bash
|
||||
env:
|
||||
TWEET_TEXT: ${{ steps.tweet.outputs.text }}
|
||||
run: |
|
||||
# Hash the tweet content (ignore whitespace differences)
|
||||
TWEET_HASH=$(echo "$TWEET_TEXT" | tr -s '[:space:]' | sha256sum | cut -d' ' -f1)
|
||||
echo "hash=${TWEET_HASH}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Check if we already have a cache hit for this exact tweet
|
||||
MARKER_FILE="/tmp/tweet-dedup-${TWEET_HASH}"
|
||||
echo "$TWEET_HASH" > "$MARKER_FILE"
|
||||
|
||||
- uses: actions/cache@v4
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
id: tweet-cache
|
||||
with:
|
||||
path: /tmp/tweet-dedup-${{ steps.dedup.outputs.hash }}
|
||||
key: tweet-${{ steps.dedup.outputs.hash }}
|
||||
|
||||
- name: Skip duplicate tweet
|
||||
if: steps.check.outputs.skip != 'true' && steps.tweet-cache.outputs.cache-hit == 'true'
|
||||
run: |
|
||||
echo "::warning::Duplicate tweet detected (hash=${{ steps.dedup.outputs.hash }}) — skipping"
|
||||
echo "This exact tweet was already posted in a previous run."
|
||||
|
||||
- name: Post to X
|
||||
if: steps.check.outputs.skip != 'true' && steps.tweet-cache.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
env:
|
||||
TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
|
||||
TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET_KEY }}
|
||||
|
||||
Generated
+54
-55
@@ -117,9 +117,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
|
||||
|
||||
[[package]]
|
||||
name = "anstream"
|
||||
version = "0.6.21"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
|
||||
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"anstyle-parse",
|
||||
@@ -132,15 +132,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anstyle"
|
||||
version = "1.0.13"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
|
||||
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
||||
|
||||
[[package]]
|
||||
name = "anstyle-parse"
|
||||
version = "0.2.7"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
|
||||
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
||||
dependencies = [
|
||||
"utf8parse",
|
||||
]
|
||||
@@ -752,9 +752,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.56"
|
||||
version = "1.2.57"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2"
|
||||
checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"jobserver",
|
||||
@@ -889,9 +889,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.60"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a"
|
||||
checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -899,9 +899,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.60"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876"
|
||||
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -911,18 +911,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_complete"
|
||||
version = "4.5.66"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031"
|
||||
checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb"
|
||||
dependencies = [
|
||||
"clap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.55"
|
||||
version = "4.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"
|
||||
checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
@@ -932,9 +932,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_lex"
|
||||
version = "1.0.0"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831"
|
||||
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
|
||||
|
||||
[[package]]
|
||||
name = "cmake"
|
||||
@@ -957,9 +957,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "colorchoice"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
||||
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
||||
|
||||
[[package]]
|
||||
name = "compression-codecs"
|
||||
@@ -989,13 +989,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "console"
|
||||
version = "0.16.2"
|
||||
version = "0.16.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4"
|
||||
checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87"
|
||||
dependencies = [
|
||||
"encode_unicode",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"unicode-width 0.2.2",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
@@ -3985,9 +3984,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.21.3"
|
||||
version = "1.21.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
||||
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell_polyfill"
|
||||
@@ -5737,9 +5736,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_with"
|
||||
version = "3.17.0"
|
||||
version = "3.18.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9"
|
||||
checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"chrono",
|
||||
@@ -6194,9 +6193,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec"
|
||||
version = "1.10.0"
|
||||
version = "1.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
|
||||
checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
|
||||
dependencies = [
|
||||
"tinyvec_macros",
|
||||
]
|
||||
@@ -6585,9 +6584,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-subscriber"
|
||||
version = "0.3.22"
|
||||
version = "0.3.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
|
||||
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
|
||||
dependencies = [
|
||||
"matchers",
|
||||
"nu-ansi-term",
|
||||
@@ -7923,8 +7922,30 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroclaw"
|
||||
version = "0.2.0"
|
||||
name = "zeroclaw-robot-kit"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"base64",
|
||||
"chrono",
|
||||
"directories",
|
||||
"portable-atomic",
|
||||
"reqwest",
|
||||
"rppal",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tempfile",
|
||||
"thiserror 2.0.18",
|
||||
"tokio",
|
||||
"tokio-test",
|
||||
"toml 1.0.6+spec-1.1.0",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroclawlabs"
|
||||
version = "0.3.1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-imap",
|
||||
@@ -8012,28 +8033,6 @@ dependencies = [
|
||||
"wiremock",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroclaw-robot-kit"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"base64",
|
||||
"chrono",
|
||||
"directories",
|
||||
"portable-atomic",
|
||||
"reqwest",
|
||||
"rppal",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tempfile",
|
||||
"thiserror 2.0.18",
|
||||
"tokio",
|
||||
"tokio-test",
|
||||
"toml 1.0.6+spec-1.1.0",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.42"
|
||||
|
||||
+20
-2
@@ -3,8 +3,8 @@ members = [".", "crates/robot-kit"]
|
||||
resolver = "2"
|
||||
|
||||
[package]
|
||||
name = "zeroclaw"
|
||||
version = "0.2.0"
|
||||
name = "zeroclawlabs"
|
||||
version = "0.3.1"
|
||||
edition = "2021"
|
||||
authors = ["theonlyhennygod"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
@@ -15,6 +15,24 @@ keywords = ["ai", "agent", "cli", "assistant", "chatbot"]
|
||||
categories = ["command-line-utilities", "api-bindings"]
|
||||
rust-version = "1.87"
|
||||
|
||||
[[bin]]
|
||||
name = "zeroclaw"
|
||||
path = "src/main.rs"
|
||||
|
||||
[lib]
|
||||
name = "zeroclaw"
|
||||
path = "src/lib.rs"
|
||||
|
||||
include = [
|
||||
"/src/**/*",
|
||||
"/build.rs",
|
||||
"/Cargo.toml",
|
||||
"/Cargo.lock",
|
||||
"/LICENSE*",
|
||||
"/README.md",
|
||||
"/web/dist/**/*",
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
# CLI - minimal and fast
|
||||
clap = { version = "4.5", features = ["derive"] }
|
||||
|
||||
@@ -18,6 +18,7 @@ COPY crates/robot-kit/Cargo.toml crates/robot-kit/Cargo.toml
|
||||
# Create dummy targets declared in Cargo.toml so manifest parsing succeeds.
|
||||
RUN mkdir -p src benches crates/robot-kit/src \
|
||||
&& echo "fn main() {}" > src/main.rs \
|
||||
&& echo "" > src/lib.rs \
|
||||
&& echo "fn main() {}" > benches/agent_benchmarks.rs \
|
||||
&& echo "pub fn placeholder() {}" > crates/robot-kit/src/lib.rs
|
||||
RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \
|
||||
|
||||
@@ -86,6 +86,16 @@
|
||||
|
||||
<p align="center"><code>بنية قائمة على السمات · وقت تشغيل آمن افتراضيًا · موفر/قناة/أداة قابلة للتبديل · كل شيء قابل للتوصيل</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 الإعلانات
|
||||
|
||||
استخدم هذا الجدول للإشعارات المهمة (تغييرات التوافق، إشعارات الأمان، نوافذ الصيانة، وحجوز الإصدارات).
|
||||
@@ -413,6 +423,20 @@ zeroclaw version # عرض الإصدار ومعلومات البنا
|
||||
|
||||
نحن نبني في المصدر المفتوح لأن أفضل الأفكار تأتي من كل مكان. إذا كنت تقرأ هذا، فأنت جزء منه. مرحبًا. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ المستودع الرسمي وتحذير الانتحال
|
||||
|
||||
**هذا هو مستودع ZeroClaw الرسمي الوحيد:**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## ZeroClaw কী?
|
||||
|
||||
ZeroClaw হল একটি হালকা, মিউটেবল এবং এক্সটেনসিবল AI অ্যাসিস্ট্যান্ট ইনফ্রাস্ট্রাকচার যা রাস্টে তৈরি। এটি বিভিন্ন LLM প্রদানকারীদের (Anthropic, OpenAI, Google, Ollama, ইত্যাদি) একটি ইউনিফাইড ইন্টারফেসের মাধ্যমে সংযুক্ত করে এবং একাধিক চ্যানেল (Telegram, Matrix, CLI, ইত্যাদি) সমর্থন করে।
|
||||
@@ -177,3 +187,17 @@ channels:
|
||||
যদি ZeroClaw আপনার জন্য উপযোগী হয়, তবে অনুগ্রহ করে আমাদের একটি কফি কিনতে বিবেচনা করুন:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -86,6 +86,16 @@ Postaveno studenty a členy komunit Harvard, MIT a Sundai.Club.
|
||||
|
||||
<p align="center"><code>Architektura založená na traitech · bezpečný runtime defaultně · vyměnitelný poskytovatel/kanál/nástroj · vše je připojitelné</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Oznámení
|
||||
|
||||
Použijte tuto tabulku pro důležitá oznámení (změny kompatibility, bezpečnostní upozornění, servisní okna a blokování verzí).
|
||||
@@ -413,6 +423,20 @@ Upřímné poděkování komunitám a institucím které inspirují a živí tut
|
||||
|
||||
Stavíme v open source protože nejlepší nápady přicházejí odkudkoliv. Pokud toto čtete, jste součástí toho. Vítejte. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Oficiální Repoziťář a Varování před Vydáváním se
|
||||
|
||||
**Toto je jediný oficiální ZeroClaw repoziťář:**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Hvad er ZeroClaw?
|
||||
|
||||
ZeroClaw er en letvægts, foranderlig og udvidbar AI-assistent-infrastruktur bygget i Rust. Den forbinder forskellige LLM-udbydere (Anthropic, OpenAI, Google, Ollama osv.) via en samlet grænseflade og understøtter flere kanaler (Telegram, Matrix, CLI osv.).
|
||||
@@ -177,3 +187,17 @@ Se [LICENSE-APACHE](LICENSE-APACHE) og [LICENSE-MIT](LICENSE-MIT) for detaljer.
|
||||
Hvis ZeroClaw er nyttigt for dig, overvej venligst at købe os en kaffe:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -90,6 +90,16 @@ Erstellt von Studenten und Mitgliedern der Harvard, MIT und Sundai.Club Gemeinsc
|
||||
|
||||
<p align="center"><code>Trait-basierte Architektur · sicheres Runtime standardmäßig · Provider/Channel/Tool austauschbar · alles ist steckbar</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Ankündigungen
|
||||
|
||||
Verwende diese Tabelle für wichtige Hinweise (Kompatibilitätsänderungen, Sicherheitshinweise, Wartungsfenster und Versionsblockierungen).
|
||||
@@ -417,6 +427,20 @@ Ein herzliches Dankeschön an die Gemeinschaften und Institutionen, die diese Op
|
||||
|
||||
Wir bauen in Open Source, weil die besten Ideen von überall kommen. Wenn du das liest, bist du Teil davon. Willkommen. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Offizielles Repository und Fälschungswarnung
|
||||
|
||||
**Dies ist das einzige offizielle ZeroClaw-Repository:**
|
||||
|
||||
@@ -54,6 +54,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
> **📝 Σημείωση:** Αυτό είναι ένα συνοπτικό README στα ελληνικά. Για πλήρη τεκμηρίωση, ανατρέξτε στο [αγγλικό README](README.md). Οι σύνδεσμοι τεκμηρίωσης παραπέμπουν στην αγγλική τεκμηρίωση.
|
||||
|
||||
## Τι είναι το ZeroClaw;
|
||||
@@ -176,3 +186,17 @@ channels:
|
||||
Αν το ZeroClaw είναι χρήσιμο για εσάς, παρακαλώ σκεφτείτε να μας αγοράσετε έναν καφέ:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -86,6 +86,16 @@ Construido por estudiantes y miembros de las comunidades de Harvard, MIT y Sunda
|
||||
|
||||
<p align="center"><code>Arquitectura basada en traits · runtime seguro por defecto · proveedor/canal/herramienta intercambiables · todo es conectable</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Anuncios
|
||||
|
||||
Usa esta tabla para avisos importantes (cambios de compatibilidad, avisos de seguridad, ventanas de mantenimiento y bloqueos de versión).
|
||||
@@ -413,6 +423,20 @@ Un sincero agradecimiento a las comunidades e instituciones que inspiran y alime
|
||||
|
||||
Construimos en código abierto porque las mejores ideas vienen de todas partes. Si estás leyendo esto, eres parte de esto. Bienvenido. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Repositorio Oficial y Advertencia de Suplantación
|
||||
|
||||
**Este es el único repositorio oficial de ZeroClaw:**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Mikä on ZeroClaw?
|
||||
|
||||
ZeroClaw on kevyt, muokattava ja laajennettava AI-assistentti-infrastruktuuri, joka on rakennettu Rustilla. Se yhdistää eri LLM-palveluntarjoajat (Anthropic, OpenAI, Google, Ollama jne.) yhtenäisen käyttöliittymän kautta ja tukee useita kanavia (Telegram, Matrix, CLI jne.).
|
||||
@@ -177,3 +187,17 @@ Katso [LICENSE-APACHE](LICENSE-APACHE) ja [LICENSE-MIT](LICENSE-MIT) yksityiskoh
|
||||
Jos ZeroClaw on hyödyllinen sinulle, harkitse kahvin ostamista meille:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -84,6 +84,16 @@ Construit par des étudiants et membres des communautés Harvard, MIT et Sundai.
|
||||
|
||||
<p align="center"><code>Architecture pilotée par traits · runtime sécurisé par défaut · fournisseur/canal/outil interchangeables · tout est pluggable</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Annonces
|
||||
|
||||
Utilisez ce tableau pour les avis importants (changements incompatibles, avis de sécurité, fenêtres de maintenance et bloqueurs de version).
|
||||
@@ -411,6 +421,20 @@ Un remerciement sincère aux communautés et institutions qui inspirent et alime
|
||||
|
||||
Nous construisons en open source parce que les meilleures idées viennent de partout. Si vous lisez ceci, vous en faites partie. Bienvenue. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Dépôt Officiel & Avertissement d'Usurpation d'Identité
|
||||
|
||||
**Ceci est le seul dépôt officiel ZeroClaw :**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## מה זה ZeroClaw?
|
||||
|
||||
<p align="center" dir="rtl">
|
||||
@@ -195,3 +205,17 @@ channels:
|
||||
</p>
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## ZeroClaw क्या है?
|
||||
|
||||
ZeroClaw एक हल्का, म्यूटेबल और एक्स्टेंसिबल AI असिस्टेंट इन्फ्रास्ट्रक्चर है जो रस्ट में बनाया गया है। यह विभिन्न LLM प्रदाताओं (Anthropic, OpenAI, Google, Ollama, आदि) को एक एकीकृत इंटरफेस के माध्यम से कनेक्ट करता है और कई चैनलों (Telegram, Matrix, CLI, आदि) का समर्थन करता है।
|
||||
@@ -177,3 +187,17 @@ channels:
|
||||
यदि ZeroClaw आपके लिए उपयोगी है, तो कृपया हमें एक कॉफी खरीदने पर विचार करें:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Mi az a ZeroClaw?
|
||||
|
||||
A ZeroClaw egy könnyűsúlyú, változtatható és bővíthető AI asszisztens infrastruktúra, amely Rust nyelven készült. Különböző LLM szolgáltatókat (Anthropic, OpenAI, Google, Ollama stb.) köt össze egy egységes felületen keresztül, és több csatornát támogat (Telegram, Matrix, CLI stb.).
|
||||
@@ -177,3 +187,17 @@ Részletekért lásd a [LICENSE-APACHE](LICENSE-APACHE) és [LICENSE-MIT](LICENS
|
||||
Ha a ZeroClaw hasznos az Ön számára, kérjük, fontolja meg, hogy vesz nekünk egy kávét:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Apa itu ZeroClaw?
|
||||
|
||||
ZeroClaw adalah infrastruktur asisten AI yang ringan, dapat diubah, dan dapat diperluas yang dibangun dengan Rust. Ini menghubungkan berbagai penyedia LLM (Anthropic, OpenAI, Google, Ollama, dll.) melalui antarmuka terpadu dan mendukung banyak saluran (Telegram, Matrix, CLI, dll.).
|
||||
@@ -177,3 +187,17 @@ Lihat [LICENSE-APACHE](LICENSE-APACHE) dan [LICENSE-MIT](LICENSE-MIT) untuk deta
|
||||
Jika ZeroClaw berguna bagi Anda, mohon pertimbangkan untuk membelikan kami kopi:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -86,6 +86,16 @@ Costruito da studenti e membri delle comunità Harvard, MIT e Sundai.Club.
|
||||
|
||||
<p align="center"><code>Architettura basata su trait · runtime sicuro di default · provider/canale/strumento intercambiabili · tutto è collegabile</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Annunci
|
||||
|
||||
Usa questa tabella per avvisi importanti (cambiamenti di compatibilità, avvisi di sicurezza, finestre di manutenzione e blocchi di versione).
|
||||
@@ -413,6 +423,20 @@ Un sincero ringraziamento alle comunità e istituzioni che ispirano e alimentano
|
||||
|
||||
Costruiamo in open source perché le migliori idee vengono da ovunque. Se stai leggendo questo, ne fai parte. Benvenuto. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Repository Ufficiale e Avviso di Contraffazione
|
||||
|
||||
**Questo è l'unico repository ufficiale di ZeroClaw:**
|
||||
|
||||
+25
-1
@@ -75,6 +75,16 @@
|
||||
>
|
||||
> 最終同期日: **2026-02-19**。
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## 📢 お知らせボード
|
||||
|
||||
重要なお知らせ(互換性破壊変更、セキュリティ告知、メンテナンス時間、リリース阻害事項など)をここに掲載します。
|
||||
@@ -163,7 +173,7 @@ cargo build --release --locked
|
||||
cargo install --path . --force --locked
|
||||
|
||||
zeroclaw onboard --api-key sk-... --provider openrouter
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
|
||||
zeroclaw agent -m "Hello, ZeroClaw!"
|
||||
|
||||
@@ -225,6 +235,20 @@ zeroclaw agent --provider anthropic -m "hello"
|
||||
- Reviewer Playbook: [`docs/contributing/reviewer-playbook.md`](docs/contributing/reviewer-playbook.md)
|
||||
- License: MIT or Apache 2.0([`LICENSE-MIT`](LICENSE-MIT), [`LICENSE-APACHE`](LICENSE-APACHE), [`NOTICE`](NOTICE))
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
---
|
||||
|
||||
詳細仕様(全コマンド、アーキテクチャ、API 仕様、開発フロー)は英語版の [`README.md`](README.md) を参照してください。
|
||||
|
||||
@@ -86,6 +86,16 @@ Harvard, MIT, 그리고 Sundai.Club 커뮤니티의 학생들과 멤버들이
|
||||
|
||||
<p align="center"><code>트레이트 기반 아키텍처 · 기본 보안 런타임 · 교체 가능한 제공자/채널/도구 · 모든 것이 플러그 가능</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 공지사항
|
||||
|
||||
이 표를 사용하여 중요한 공지사항(호환성 변경, 보안 공지, 유지보수 기간, 버전 차단)을 확인하세요.
|
||||
@@ -413,6 +423,20 @@ ZeroClaw가 당신의 작업에 도움이 되었고 지속적인 개발을 지
|
||||
|
||||
우리는 최고의 아이디어가 모든 곳에서 나오기 때문에 오픈소스로 구축합니다. 이것을 읽고 있다면 여러분도 그 일부입니다. 환영합니다. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ 공식 저장소 및 사칭 경고
|
||||
|
||||
**이것이 유일한 공식 ZeroClaw 저장소입니다:**
|
||||
|
||||
@@ -84,15 +84,15 @@ Built by students and members of the Harvard, MIT, and Sundai.Club communities.
|
||||
|
||||
<p align="center"><code>Trait-driven architecture · secure-by-default runtime · provider/channel/tool swappable · pluggable everything</code></p>
|
||||
|
||||
### 🚀 What's New in v0.1.9b (March 2026)
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| Web Dashboard | Electric blue restyle with glassmorphism and animations, ZeroClaw logo, cron run history panel, message draft persistence, auto-expanding chat composer |
|
||||
| Providers & Channels | Azure OpenAI support, WeCom webhook channel, Matrix read markers/typing/file uploads/voice/multi-room, custom HTTP headers, `ZEROCLAW_PROVIDER_URL` override, configurable `ack_reactions` |
|
||||
| Tools & MCP | On-demand MCP tool loading via `tool_search`, multi-transport MCP client, `tool_filter_groups` for per-turn schema filtering, Windows shell `tool_call` support, dynamic node discovery |
|
||||
| Infrastructure | 32-bit system support via feature gates, Debian Docker variant with shell tools, session state persistence/recovery, docs hub translations for all 30 languages |
|
||||
| Fixes | Slack thread events in polling mode, Discord WebSocket Ping handling, Ollama Qwen think-tag stripping, security hardening (filesystem scoping, credential scrubbing, cron validation), 32-bit atomic fallbacks |
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Announcements
|
||||
|
||||
@@ -276,7 +276,7 @@ cd zeroclaw
|
||||
./install.sh --prebuilt-only
|
||||
|
||||
# Optional: run onboarding in the same flow
|
||||
./install.sh --onboard --api-key "sk-..." --provider openrouter [--model "openrouter/auto"]
|
||||
./install.sh --api-key "sk-..." --provider openrouter [--model "openrouter/auto"]
|
||||
|
||||
# Optional: run bootstrap + onboarding fully in Docker-compatible mode
|
||||
./install.sh --docker
|
||||
@@ -327,8 +327,8 @@ export PATH="$HOME/.cargo/bin:$PATH"
|
||||
# Quick setup (no prompts, optional model specification)
|
||||
zeroclaw onboard --api-key sk-... --provider openrouter [--model "openrouter/auto"]
|
||||
|
||||
# Or interactive wizard
|
||||
zeroclaw onboard --interactive
|
||||
# Or guided wizard
|
||||
zeroclaw onboard
|
||||
|
||||
# If config.toml already exists and you intentionally want to overwrite it
|
||||
zeroclaw onboard --force
|
||||
@@ -480,27 +480,20 @@ A heartfelt thank you to the communities and institutions that inspire and fuel
|
||||
|
||||
We're building in the open because the best ideas come from everywhere. If you're reading this, you're part of it. Welcome. 🦀❤️
|
||||
|
||||
### 🌟 Recent Contributors (v0.1.9b)
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
Special recognition to the contributors who shipped features, fixes, and improvements in this release cycle:
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
| Contributor | Highlights |
|
||||
|---|---|
|
||||
| **@SimianAstronaut7** | Security hardening (credential scrubbing, filesystem scoping), Discord WebSocket fixes, Lark/Feishu channel restoration, WhatsApp Web concurrency fix |
|
||||
| **@Alix-007** | CI/CD master branch migration, release runner fixes, install script Bash 3.2 compatibility |
|
||||
| **@darrenzeng2025** | Anthropic vision support, email subject config, auto-expanding chat composer, config fixes, SIGTERM graceful shutdown |
|
||||
| **@imadnyc** | Live tool call notifications, Matrix reactions/threading, datetime refresh in cached prompts |
|
||||
| **@jameslcowan** | Channel secrets encryption roundtrip fix |
|
||||
| **@ImanHashemi** | Webhook-audit builtin hook |
|
||||
| **@alanpjohn** | Opencode-go provider integration |
|
||||
| **@parziva-1** | WhatsApp Web session reconnect and QR flow |
|
||||
| **@ttuffin** | Docker dependency management |
|
||||
| **@zverozabr** | Embedding API key resolution fix |
|
||||
| **@Jacobinwwey** | MCP tools and subsystem integration |
|
||||
| **@vernonstinebaker** | MCP tool filter groups and schema filtering |
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Official Repository & Impersonation Warning
|
||||
|
||||
**This is the only official ZeroClaw repository:**
|
||||
@@ -571,4 +564,3 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) and [CLA.md](docs/contributing/cla.md). I
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
# Features Documentation
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Hva er ZeroClaw?
|
||||
|
||||
ZeroClaw er en lettvektig, foranderlig og utvidbar AI-assistent-infrastruktur bygget i Rust. Den kobler sammen ulike LLM-leverandører (Anthropic, OpenAI, Google, Ollama osv.) via et samlet grensesnitt og støtter flere kanaler (Telegram, Matrix, CLI osv.).
|
||||
@@ -177,3 +187,17 @@ Se [LICENSE-APACHE](LICENSE-APACHE) og [LICENSE-MIT](LICENSE-MIT) for detaljer.
|
||||
Hvis ZeroClaw er nyttig for deg, vennligst vurder å kjøpe oss en kaffe:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -86,6 +86,16 @@ Gebouwd door studenten en leden van de Harvard, MIT en Sundai.Club gemeenschappe
|
||||
|
||||
<p align="center"><code>Trait-gedreven architectuur · veilige runtime standaard · verwisselbare provider/kanaal/tool · alles is plugbaar</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Aankondigingen
|
||||
|
||||
Gebruik deze tabel voor belangrijke aankondigingen (compatibiliteitswijzigingen, beveiligingsberichten, onderhoudsvensters en versieblokkades).
|
||||
@@ -413,6 +423,20 @@ Een oprechte dankjewel aan de gemeenschappen en instellingen die dit open-source
|
||||
|
||||
We bouwen in open source omdat de beste ideeën van overal komen. Als je dit leest, ben je er deel van. Welkom. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Officiële Repository en Waarschuwing voor Imitatie
|
||||
|
||||
**Dit is de enige officiële ZeroClaw repository:**
|
||||
|
||||
@@ -86,6 +86,16 @@ Zbudowany przez studentów i członków społeczności Harvard, MIT i Sundai.Clu
|
||||
|
||||
<p align="center"><code>Architektura oparta na traitach · bezpieczny runtime domyślnie · wymienny dostawca/kanał/narzędzie · wszystko jest podłączalne</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Ogłoszenia
|
||||
|
||||
Użyj tej tabeli dla ważnych ogłoszeń (zmiany kompatybilności, powiadomienia bezpieczeństwa, okna serwisowe i blokady wersji).
|
||||
@@ -413,6 +423,20 @@ Serdeczne podziękowania dla społeczności i instytucji które inspirują i zas
|
||||
|
||||
Budujemy w open source ponieważ najlepsze pomysły przychodzą zewsząd. Jeśli to czytasz, jesteś tego częścią. Witamy. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Oficjalne Repozytorium i Ostrzeżenie o Podszywaniu Się
|
||||
|
||||
**To jest jedyne oficjalne repozytorium ZeroClaw:**
|
||||
|
||||
@@ -86,6 +86,16 @@ Construído por estudantes e membros das comunidades Harvard, MIT e Sundai.Club.
|
||||
|
||||
<p align="center"><code>Arquitetura baseada em traits · runtime seguro por padrão · provedor/canal/ferramenta intercambiáveis · tudo é conectável</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Anúncios
|
||||
|
||||
Use esta tabela para avisos importantes (mudanças de compatibilidade, avisos de segurança, janelas de manutenção e bloqueios de versão).
|
||||
@@ -413,6 +423,20 @@ Um sincero agradecimento às comunidades e instituições que inspiram e aliment
|
||||
|
||||
Construímos em código aberto porque as melhores ideias vêm de todo lugar. Se você está lendo isso, você é parte disso. Bem-vindo. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Repositório Oficial e Aviso de Falsificação
|
||||
|
||||
**Este é o único repositório oficial do ZeroClaw:**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Ce este ZeroClaw?
|
||||
|
||||
ZeroClaw este o infrastructură de asistent AI ușoară, mutabilă și extensibilă construită în Rust. Conectează diverși furnizori de LLM (Anthropic, OpenAI, Google, Ollama, etc.) printr-o interfață unificată și suportă multiple canale (Telegram, Matrix, CLI, etc.).
|
||||
@@ -177,3 +187,17 @@ Vezi [LICENSE-APACHE](LICENSE-APACHE) și [LICENSE-MIT](LICENSE-MIT) pentru deta
|
||||
Dacă ZeroClaw îți este util, te rugăm să iei în considerare să ne cumperi o cafea:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
+25
-1
@@ -75,6 +75,16 @@
|
||||
>
|
||||
> Последняя синхронизация: **2026-02-19**.
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## 📢 Доска объявлений
|
||||
|
||||
Публикуйте здесь важные уведомления (breaking changes, security advisories, окна обслуживания и блокеры релиза).
|
||||
@@ -163,7 +173,7 @@ cargo build --release --locked
|
||||
cargo install --path . --force --locked
|
||||
|
||||
zeroclaw onboard --api-key sk-... --provider openrouter
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
|
||||
zeroclaw agent -m "Hello, ZeroClaw!"
|
||||
|
||||
@@ -225,6 +235,20 @@ zeroclaw agent --provider anthropic -m "hello"
|
||||
- Reviewer playbook: [`docs/contributing/reviewer-playbook.md`](docs/contributing/reviewer-playbook.md)
|
||||
- License: MIT or Apache 2.0 ([`LICENSE-MIT`](LICENSE-MIT), [`LICENSE-APACHE`](LICENSE-APACHE), [`NOTICE`](NOTICE))
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
---
|
||||
|
||||
Для полной и исчерпывающей информации (архитектура, все команды, API, разработка) используйте основной английский документ: [`README.md`](README.md).
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Vad är ZeroClaw?
|
||||
|
||||
ZeroClaw är en lättvikts, föränderlig och utökningsbar AI-assistent-infrastruktur byggd i Rust. Den ansluter olika LLM-leverantörer (Anthropic, OpenAI, Google, Ollama, etc.) via ett enhetligt gränssnitt och stöder flera kanaler (Telegram, Matrix, CLI, etc.).
|
||||
@@ -177,3 +187,17 @@ Se [LICENSE-APACHE](LICENSE-APACHE) och [LICENSE-MIT](LICENSE-MIT) för detaljer
|
||||
Om ZeroClaw är användbart för dig, vänligen överväg att köpa en kaffe till oss:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## ZeroClaw คืออะไร?
|
||||
|
||||
ZeroClaw เป็นโครงสร้างพื้นฐานผู้ช่วย AI ที่มีน้ำหนักเบา ปรับเปลี่ยนได้ และขยายได้ สร้างด้วย Rust มันเชื่อมต่อผู้ให้บริการ LLM ต่างๆ (Anthropic, OpenAI, Google, Ollama ฯลฯ) ผ่านอินเทอร์เฟซแบบรวมและรองรับหลายช่องทาง (Telegram, Matrix, CLI ฯลฯ)
|
||||
@@ -177,3 +187,17 @@ channels:
|
||||
หาก ZeroClaw มีประโยชน์สำหรับคุณ โปรดพิจารณาซื้อกาแฟให้เรา:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -86,6 +86,16 @@ Binuo ng mga mag-aaral at miyembro ng Harvard, MIT, at Sundai.Club na komunidad.
|
||||
|
||||
<p align="center"><code>Trait-driven architecture · secure-by-default runtime · swappable provider/channel/tool · lahat ay pluggable</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Mga Anunsyo
|
||||
|
||||
Gamitin ang talahanayang ito para sa mahahalagang paunawa (compatibility changes, security notices, maintenance windows, at version blocks).
|
||||
@@ -413,6 +423,20 @@ Isang taos-pusong pasasalamat sa mga komunidad at institusyon na nagbibigay-insp
|
||||
|
||||
Kami ay bumubuo sa open source dahil ang mga pinakamahusay na ideya ay nagmumula sa lahat ng dako. Kung binabasa mo ito, ikaw ay bahagi nito. Maligayang pagdating. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Official Repository at Impersonation Warning
|
||||
|
||||
**Ito ang tanging opisyal na ZeroClaw repository:**
|
||||
|
||||
@@ -86,6 +86,16 @@ Harvard, MIT ve Sundai.Club topluluklarının öğrencileri ve üyeleri tarafın
|
||||
|
||||
<p align="center"><code>Trait tabanlı mimari · varsayılan olarak güvenli çalışma zamanı · değiştirilebilir sağlayıcı/kanal/araç · her şey eklenebilir</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Duyurular
|
||||
|
||||
Önemli duyurular için bu tabloyu kullanın (uyumluluk değişiklikleri, güvenlik bildirimleri, bakım pencereleri ve sürüm engellemeleri).
|
||||
@@ -413,6 +423,20 @@ Bu açık kaynak çalışmasını ilham veren ve besleyen topluluklara ve kuruml
|
||||
|
||||
En iyi fikirler her yerden geldiği için açık kaynakta inşa ediyoruz. Bunu okuyorsan, bunun bir parçasısın. Hoş geldin. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Resmi Depo ve Taklit Uyarısı
|
||||
|
||||
**Bu tek resmi ZeroClaw deposudur:**
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## Що таке ZeroClaw?
|
||||
|
||||
ZeroClaw — це легка, змінювана та розширювана інфраструктура AI-асистента, написана на Rust. Вона з'єднує різних LLM-провайдерів (Anthropic, OpenAI, Google, Ollama тощо) через уніфікований інтерфейс і підтримує багато каналів (Telegram, Matrix, CLI тощо).
|
||||
@@ -177,3 +187,17 @@ channels:
|
||||
Якщо ZeroClaw корисний для вас, будь ласка, розгляньте можливість купити нам каву:
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
|
||||
---
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## ZeroClaw کیا ہے؟
|
||||
|
||||
<p align="center" dir="rtl">
|
||||
@@ -195,3 +205,17 @@ channels:
|
||||
</p>
|
||||
|
||||
[](https://buymeacoffee.com/argenistherose)
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
+27
-3
@@ -84,6 +84,16 @@
|
||||
|
||||
<p align="center"><code>Kiến trúc trait-driven · mặc định bảo mật · provider/channel/tool hoán đổi tự do · mọi thứ đều dễ mở rộng</code></p>
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
### 📢 Thông báo
|
||||
|
||||
Bảng này dành cho các thông báo quan trọng (thay đổi không tương thích, cảnh báo bảo mật, lịch bảo trì, vấn đề chặn release).
|
||||
@@ -260,7 +270,7 @@ cd zeroclaw
|
||||
./install.sh --prebuilt-only
|
||||
|
||||
# Tùy chọn: chạy onboarding trong cùng luồng
|
||||
./install.sh --onboard --api-key "sk-..." --provider openrouter [--model "openrouter/auto"]
|
||||
./install.sh --api-key "sk-..." --provider openrouter [--model "openrouter/auto"]
|
||||
|
||||
# Tùy chọn: chạy bootstrap + onboarding hoàn toàn ở chế độ tương thích với Docker
|
||||
./install.sh --docker
|
||||
@@ -311,8 +321,8 @@ export PATH="$HOME/.cargo/bin:$PATH"
|
||||
# Cài nhanh (không cần tương tác, có thể chỉ định model)
|
||||
zeroclaw onboard --api-key sk-... --provider openrouter [--model "openrouter/auto"]
|
||||
|
||||
# Hoặc dùng trình hướng dẫn tương tác
|
||||
zeroclaw onboard --interactive
|
||||
# Hoặc dùng trình hướng dẫn
|
||||
zeroclaw onboard
|
||||
|
||||
# Hoặc chỉ sửa nhanh channel/allowlist
|
||||
zeroclaw onboard --channels-only
|
||||
@@ -456,6 +466,20 @@ Chân thành cảm ơn các cộng đồng và tổ chức đã truyền cảm h
|
||||
|
||||
Chúng tôi xây dựng công khai vì ý tưởng hay đến từ khắp nơi. Nếu bạn đang đọc đến đây, bạn đã là một phần của chúng tôi. Chào mừng. 🦀❤️
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
## ⚠️ Repository Chính thức & Cảnh báo Mạo danh
|
||||
|
||||
**Đây là repository ZeroClaw chính thức duy nhất:**
|
||||
|
||||
+26
-2
@@ -75,6 +75,16 @@
|
||||
>
|
||||
> 最后对齐时间:**2026-03-14**。
|
||||
|
||||
<!-- BEGIN:WHATS_NEW -->
|
||||
|
||||
### 🚀 What's New in v0.3.1 (March 2026)
|
||||
|
||||
| Area | Highlights |
|
||||
|---|---|
|
||||
| ci | add Termux (aarch64-linux-android) release target |
|
||||
|
||||
<!-- END:WHATS_NEW -->
|
||||
|
||||
## 📢 公告板
|
||||
|
||||
用于发布重要通知(破坏性变更、安全通告、维护窗口、版本阻塞问题等)。
|
||||
@@ -165,8 +175,8 @@ cargo install --path . --force --locked
|
||||
# 快速初始化(无交互)
|
||||
zeroclaw onboard --api-key sk-... --provider openrouter
|
||||
|
||||
# 或使用交互式向导
|
||||
zeroclaw onboard --interactive
|
||||
# 或使用引导式向导
|
||||
zeroclaw onboard
|
||||
|
||||
# 单次对话
|
||||
zeroclaw agent -m "Hello, ZeroClaw!"
|
||||
@@ -230,6 +240,20 @@ zeroclaw agent --provider anthropic -m "hello"
|
||||
- Reviewer 指南:[`docs/contributing/reviewer-playbook.md`](docs/i18n/zh-CN/contributing/reviewer-playbook.zh-CN.md)
|
||||
- 许可证:MIT 或 Apache 2.0(见 [`LICENSE-MIT`](LICENSE-MIT)、[`LICENSE-APACHE`](LICENSE-APACHE) 与 [`NOTICE`](NOTICE))
|
||||
|
||||
<!-- BEGIN:RECENT_CONTRIBUTORS -->
|
||||
|
||||
### 🌟 Recent Contributors (v0.3.1)
|
||||
|
||||
3 contributors shipped features, fixes, and improvements in this release cycle:
|
||||
|
||||
- **Argenis**
|
||||
- **argenis de la rosa**
|
||||
- **Claude Opus 4.6**
|
||||
|
||||
Thank you to everyone who opened issues, reviewed PRs, translated docs, and helped test. Every contribution matters. 🦀
|
||||
|
||||
<!-- END:RECENT_CONTRIBUTORS -->
|
||||
|
||||
---
|
||||
|
||||
如果你需要完整实现细节(架构图、全部命令、完整 API、开发流程),请直接阅读英文主文档:[`README.md`](README.md)。
|
||||
|
||||
Executable
+261
@@ -0,0 +1,261 @@
|
||||
#!/usr/bin/env bash
|
||||
# Termux release validation script
|
||||
# Validates the aarch64-linux-android release artifact for Termux compatibility.
|
||||
#
|
||||
# Usage:
|
||||
# ./dev/test-termux-release.sh [version]
|
||||
#
|
||||
# Examples:
|
||||
# ./dev/test-termux-release.sh 0.3.1
|
||||
# ./dev/test-termux-release.sh # auto-detects from Cargo.toml
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
BLUE='\033[0;34m'
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[0;33m'
|
||||
BOLD='\033[1m'
|
||||
DIM='\033[2m'
|
||||
RESET='\033[0m'
|
||||
|
||||
pass() { echo -e " ${GREEN}✓${RESET} $*"; }
|
||||
fail() { echo -e " ${RED}✗${RESET} $*"; FAILURES=$((FAILURES + 1)); }
|
||||
info() { echo -e "${BLUE}→${RESET} ${BOLD}$*${RESET}"; }
|
||||
warn() { echo -e "${YELLOW}!${RESET} $*"; }
|
||||
|
||||
FAILURES=0
|
||||
TARGET="aarch64-linux-android"
|
||||
VERSION="${1:-}"
|
||||
|
||||
if [[ -z "$VERSION" ]]; then
|
||||
if [[ -f Cargo.toml ]]; then
|
||||
VERSION=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1)
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$VERSION" ]]; then
|
||||
echo "Usage: $0 <version>"
|
||||
echo " e.g. $0 0.3.1"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TAG="v${VERSION}"
|
||||
ASSET_NAME="zeroclaw-${TARGET}.tar.gz"
|
||||
ASSET_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/download/${TAG}/${ASSET_NAME}"
|
||||
TEMP_DIR="$(mktemp -d -t zeroclaw-termux-test-XXXXXX)"
|
||||
|
||||
cleanup() { rm -rf "$TEMP_DIR"; }
|
||||
trap cleanup EXIT
|
||||
|
||||
echo
|
||||
echo -e "${BOLD}Termux Release Validation — ${TAG}${RESET}"
|
||||
echo -e "${DIM}Target: ${TARGET}${RESET}"
|
||||
echo
|
||||
|
||||
# --- Test 1: Release tag exists ---
|
||||
info "Checking release tag ${TAG}"
|
||||
if gh release view "$TAG" >/dev/null 2>&1; then
|
||||
pass "Release ${TAG} exists"
|
||||
else
|
||||
fail "Release ${TAG} not found"
|
||||
echo -e "${RED}Release has not been published yet. Wait for the release workflow to complete.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Test 2: Android asset is listed ---
|
||||
info "Checking for ${ASSET_NAME} in release assets"
|
||||
ASSETS=$(gh release view "$TAG" --json assets -q '.assets[].name')
|
||||
if echo "$ASSETS" | grep -q "$ASSET_NAME"; then
|
||||
pass "Asset ${ASSET_NAME} found in release"
|
||||
else
|
||||
fail "Asset ${ASSET_NAME} not found in release"
|
||||
echo "Available assets:"
|
||||
echo "$ASSETS" | sed 's/^/ /'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Test 3: Download the asset ---
|
||||
info "Downloading ${ASSET_NAME}"
|
||||
if curl -fsSL "$ASSET_URL" -o "$TEMP_DIR/$ASSET_NAME"; then
|
||||
FILESIZE=$(wc -c < "$TEMP_DIR/$ASSET_NAME" | tr -d ' ')
|
||||
pass "Downloaded successfully (${FILESIZE} bytes)"
|
||||
else
|
||||
fail "Download failed from ${ASSET_URL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Test 4: Archive integrity ---
|
||||
info "Verifying archive integrity"
|
||||
if tar -tzf "$TEMP_DIR/$ASSET_NAME" >/dev/null 2>&1; then
|
||||
pass "Archive is a valid gzip tar"
|
||||
else
|
||||
fail "Archive is corrupted or not a valid tar.gz"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Test 5: Contains zeroclaw binary ---
|
||||
info "Checking archive contents"
|
||||
CONTENTS=$(tar -tzf "$TEMP_DIR/$ASSET_NAME")
|
||||
if echo "$CONTENTS" | grep -q "^zeroclaw$"; then
|
||||
pass "Archive contains 'zeroclaw' binary"
|
||||
else
|
||||
fail "Archive does not contain 'zeroclaw' binary"
|
||||
echo "Contents:"
|
||||
echo "$CONTENTS" | sed 's/^/ /'
|
||||
fi
|
||||
|
||||
# --- Test 6: Extract and inspect binary ---
|
||||
info "Extracting and inspecting binary"
|
||||
tar -xzf "$TEMP_DIR/$ASSET_NAME" -C "$TEMP_DIR"
|
||||
BINARY="$TEMP_DIR/zeroclaw"
|
||||
|
||||
if [[ -f "$BINARY" ]]; then
|
||||
pass "Binary extracted"
|
||||
else
|
||||
fail "Binary not found after extraction"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Test 7: ELF format and architecture ---
|
||||
info "Checking binary format"
|
||||
FILE_INFO=$(file "$BINARY")
|
||||
if echo "$FILE_INFO" | grep -q "ELF"; then
|
||||
pass "Binary is ELF format"
|
||||
else
|
||||
fail "Binary is not ELF format: $FILE_INFO"
|
||||
fi
|
||||
|
||||
if echo "$FILE_INFO" | grep -qi "aarch64\|ARM aarch64"; then
|
||||
pass "Binary targets aarch64 architecture"
|
||||
else
|
||||
fail "Binary does not target aarch64: $FILE_INFO"
|
||||
fi
|
||||
|
||||
if echo "$FILE_INFO" | grep -qi "android\|bionic"; then
|
||||
pass "Binary is linked for Android/Bionic"
|
||||
else
|
||||
# Android binaries may not always show "android" in file output,
|
||||
# check with readelf if available
|
||||
if command -v readelf >/dev/null 2>&1; then
|
||||
INTERP=$(readelf -l "$BINARY" 2>/dev/null | grep -o '/[^ ]*linker[^ ]*' || true)
|
||||
if echo "$INTERP" | grep -qi "android\|bionic"; then
|
||||
pass "Binary uses Android linker: $INTERP"
|
||||
else
|
||||
warn "Could not confirm Android linkage (interpreter: ${INTERP:-unknown})"
|
||||
warn "file output: $FILE_INFO"
|
||||
fi
|
||||
else
|
||||
warn "Could not confirm Android linkage (readelf not available)"
|
||||
warn "file output: $FILE_INFO"
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- Test 8: Binary is stripped ---
|
||||
info "Checking binary optimization"
|
||||
if echo "$FILE_INFO" | grep -q "stripped"; then
|
||||
pass "Binary is stripped (release optimized)"
|
||||
else
|
||||
warn "Binary may not be stripped"
|
||||
fi
|
||||
|
||||
# --- Test 9: Binary is not dynamically linked to glibc ---
|
||||
info "Checking for glibc dependencies"
|
||||
if command -v readelf >/dev/null 2>&1; then
|
||||
NEEDED=$(readelf -d "$BINARY" 2>/dev/null | grep NEEDED || true)
|
||||
if echo "$NEEDED" | grep -qi "libc\.so\.\|libpthread\|libdl"; then
|
||||
# Check if it's glibc or bionic
|
||||
if echo "$NEEDED" | grep -qi "libc\.so\.6"; then
|
||||
fail "Binary links against glibc (libc.so.6) — will not work on Termux"
|
||||
else
|
||||
pass "Binary links against libc (likely Bionic)"
|
||||
fi
|
||||
else
|
||||
pass "No glibc dependencies detected"
|
||||
fi
|
||||
else
|
||||
warn "readelf not available — skipping dynamic library check"
|
||||
fi
|
||||
|
||||
# --- Test 10: SHA256 checksum verification ---
|
||||
info "Verifying SHA256 checksum"
|
||||
CHECKSUMS_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/download/${TAG}/SHA256SUMS"
|
||||
if curl -fsSL "$CHECKSUMS_URL" -o "$TEMP_DIR/SHA256SUMS" 2>/dev/null; then
|
||||
EXPECTED=$(grep "$ASSET_NAME" "$TEMP_DIR/SHA256SUMS" | awk '{print $1}')
|
||||
if [[ -n "$EXPECTED" ]]; then
|
||||
if command -v sha256sum >/dev/null 2>&1; then
|
||||
ACTUAL=$(sha256sum "$TEMP_DIR/$ASSET_NAME" | awk '{print $1}')
|
||||
elif command -v shasum >/dev/null 2>&1; then
|
||||
ACTUAL=$(shasum -a 256 "$TEMP_DIR/$ASSET_NAME" | awk '{print $1}')
|
||||
else
|
||||
warn "No sha256sum or shasum available"
|
||||
ACTUAL=""
|
||||
fi
|
||||
|
||||
if [[ -n "$ACTUAL" && "$ACTUAL" == "$EXPECTED" ]]; then
|
||||
pass "SHA256 checksum matches"
|
||||
elif [[ -n "$ACTUAL" ]]; then
|
||||
fail "SHA256 mismatch: expected=$EXPECTED actual=$ACTUAL"
|
||||
fi
|
||||
else
|
||||
warn "No checksum entry for ${ASSET_NAME} in SHA256SUMS"
|
||||
fi
|
||||
else
|
||||
warn "Could not download SHA256SUMS"
|
||||
fi
|
||||
|
||||
# --- Test 11: install.sh Termux detection ---
|
||||
info "Validating install.sh Termux detection"
|
||||
INSTALL_SH="install.sh"
|
||||
if [[ ! -f "$INSTALL_SH" ]]; then
|
||||
INSTALL_SH="$(dirname "$0")/../install.sh"
|
||||
fi
|
||||
|
||||
if [[ -f "$INSTALL_SH" ]]; then
|
||||
if grep -q 'TERMUX_VERSION' "$INSTALL_SH"; then
|
||||
pass "install.sh checks TERMUX_VERSION"
|
||||
else
|
||||
fail "install.sh does not check TERMUX_VERSION"
|
||||
fi
|
||||
|
||||
if grep -q 'aarch64-linux-android' "$INSTALL_SH"; then
|
||||
pass "install.sh maps to aarch64-linux-android target"
|
||||
else
|
||||
fail "install.sh does not map to aarch64-linux-android"
|
||||
fi
|
||||
|
||||
# Simulate Termux detection (mock uname as Linux since we may run on macOS)
|
||||
detect_result=$(
|
||||
bash -c '
|
||||
TERMUX_VERSION="0.118"
|
||||
os="Linux"
|
||||
arch="aarch64"
|
||||
case "$os:$arch" in
|
||||
Linux:aarch64|Linux:arm64)
|
||||
if [[ -n "${TERMUX_VERSION:-}" || -d "/data/data/com.termux" ]]; then
|
||||
echo "aarch64-linux-android"
|
||||
else
|
||||
echo "aarch64-unknown-linux-gnu"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
'
|
||||
)
|
||||
if [[ "$detect_result" == "aarch64-linux-android" ]]; then
|
||||
pass "Termux detection returns correct target (simulated)"
|
||||
else
|
||||
fail "Termux detection returned: $detect_result (expected aarch64-linux-android)"
|
||||
fi
|
||||
else
|
||||
warn "install.sh not found — skipping detection tests"
|
||||
fi
|
||||
|
||||
# --- Summary ---
|
||||
echo
|
||||
if [[ "$FAILURES" -eq 0 ]]; then
|
||||
echo -e "${GREEN}${BOLD}All tests passed!${RESET}"
|
||||
echo -e "${DIM}The Termux release artifact for ${TAG} is valid.${RESET}"
|
||||
else
|
||||
echo -e "${RED}${BOLD}${FAILURES} test(s) failed.${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
@@ -101,8 +101,8 @@ Pass Rate: 100%
|
||||
### Step 2: Configure Telegram (if not done)
|
||||
|
||||
```bash
|
||||
# Interactive setup
|
||||
zeroclaw onboard --interactive
|
||||
# Guided setup
|
||||
zeroclaw onboard
|
||||
|
||||
# Or channels-only setup
|
||||
zeroclaw onboard --channels-only
|
||||
|
||||
@@ -299,10 +299,10 @@ receive_mode = "websocket" # hoặc "webhook"
|
||||
port = 8081 # bắt buộc ở chế độ webhook
|
||||
```
|
||||
|
||||
Hỗ trợ onboarding tương tác:
|
||||
Hỗ trợ onboarding hướng dẫn:
|
||||
|
||||
```bash
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
```
|
||||
|
||||
Trình hướng dẫn bao gồm bước **Lark/Feishu** chuyên biệt với:
|
||||
|
||||
@@ -32,7 +32,6 @@ Xác minh lần cuối: **2026-02-20**.
|
||||
### `onboard`
|
||||
|
||||
- `zeroclaw onboard`
|
||||
- `zeroclaw onboard --interactive`
|
||||
- `zeroclaw onboard --channels-only`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none>`
|
||||
|
||||
@@ -288,15 +288,6 @@ $ zeroclaw onboard
|
||||
# ↑ Chỉ thêm một từ, tự phát hiện âm thầm!
|
||||
```
|
||||
|
||||
### Người dùng nâng cao (kiểm soát tường minh)
|
||||
|
||||
```bash
|
||||
$ zeroclaw onboard --security-level paranoid
|
||||
[1/9] Workspace Setup...
|
||||
...
|
||||
✓ Security: Paranoid | Landlock + Firejail | Audit signed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tương thích ngược
|
||||
|
||||
@@ -13,14 +13,14 @@ Dành cho cài đặt lần đầu và làm quen nhanh.
|
||||
| Tình huống | Lệnh |
|
||||
|----------|---------|
|
||||
| Có API key, muốn cài nhanh nhất | `zeroclaw onboard --api-key sk-... --provider openrouter` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard --interactive` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard` |
|
||||
| Đã có config, chỉ cần sửa kênh | `zeroclaw onboard --channels-only` |
|
||||
| Dùng xác thực subscription | Xem [Subscription Auth](../../../README.md#subscription-auth-openai-codex--claude-code) |
|
||||
|
||||
## Thiết lập và kiểm tra
|
||||
|
||||
- Thiết lập nhanh: `zeroclaw onboard --api-key "sk-..." --provider openrouter`
|
||||
- Thiết lập tương tác: `zeroclaw onboard --interactive`
|
||||
- Thiết lập hướng dẫn: `zeroclaw onboard`
|
||||
- Kiểm tra môi trường: `zeroclaw status` + `zeroclaw doctor`
|
||||
|
||||
## Tiếp theo
|
||||
|
||||
@@ -89,19 +89,13 @@ Lệnh này build image ZeroClaw cục bộ và chạy thiết lập trong conta
|
||||
### Thiết lập nhanh (không tương tác)
|
||||
|
||||
```bash
|
||||
./install.sh --onboard --api-key "sk-..." --provider openrouter
|
||||
./install.sh --api-key "sk-..." --provider openrouter
|
||||
```
|
||||
|
||||
Hoặc dùng biến môi trường:
|
||||
|
||||
```bash
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh --onboard
|
||||
```
|
||||
|
||||
### Thiết lập tương tác
|
||||
|
||||
```bash
|
||||
./install.sh --interactive-onboard
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh
|
||||
```
|
||||
|
||||
## Các cờ hữu ích
|
||||
|
||||
@@ -106,7 +106,7 @@ Pass Rate: 100%
|
||||
|
||||
```bash
|
||||
# 交互式设置
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
|
||||
# 或仅渠道设置
|
||||
zeroclaw onboard --channels-only
|
||||
|
||||
@@ -233,7 +233,7 @@ main.rs ──▶ daemon/ ──▶ gateway/ + channels/ + cron/ + heartbeat/
|
||||
|
||||
```
|
||||
zeroclaw
|
||||
├── onboard [--interactive] [--force] # 首次运行设置
|
||||
├── onboard [--force] [--reinit] [--channels-only] # 首次运行设置
|
||||
├── agent [-m "msg"] [-p provider] # 启动代理循环
|
||||
├── daemon [-p port] # 完整运行时(网关+渠道+cron+心跳)
|
||||
├── gateway [-p port] # 仅 HTTP API 服务器
|
||||
|
||||
@@ -350,10 +350,10 @@ allowed_pubkeys = [\"hex-or-npub\"] # 空 = 拒绝所有, \"*\" = 允
|
||||
Nostr 同时支持 NIP-04(传统加密私信)和 NIP-17(礼物包装私有消息)。
|
||||
回复自动使用发送者使用的相同协议。当 `secrets.encrypt = true`(默认)时,私钥通过 `SecretStore` 静态加密。
|
||||
|
||||
交互式引导支持:
|
||||
引导式设置支持:
|
||||
|
||||
```bash
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
```
|
||||
|
||||
向导现在包含专用的 **Lark** 和 **Feishu** 步骤,包括:
|
||||
|
||||
@@ -33,22 +33,21 @@
|
||||
### `onboard`
|
||||
|
||||
- `zeroclaw onboard`
|
||||
- `zeroclaw onboard --interactive`
|
||||
- `zeroclaw onboard --channels-only`
|
||||
- `zeroclaw onboard --force`
|
||||
- `zeroclaw onboard --reinit`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none> --force`
|
||||
- `zeroclaw onboard --reinit --interactive`
|
||||
|
||||
`onboard` 安全行为:
|
||||
|
||||
- 如果 `config.toml` 已存在且你运行 `--interactive`,引导程序现在提供两种模式:
|
||||
- 如果 `config.toml` 已存在,引导程序提供两种模式:
|
||||
- 完整引导(覆盖 `config.toml`)
|
||||
- 仅更新提供商(更新提供商/模型/API 密钥,同时保留现有渠道、隧道、内存、钩子和其他设置)
|
||||
- 在非交互式环境中,现有 `config.toml` 会导致安全拒绝,除非传递 `--force`。
|
||||
- 当你只需要轮换渠道令牌/白名单时,使用 `zeroclaw onboard --channels-only`。
|
||||
- 使用 `zeroclaw onboard --reinit --interactive` 重新开始。这会备份现有配置目录并添加时间戳后缀,然后从头创建新配置。需要 `--interactive`。
|
||||
- 使用 `zeroclaw onboard --reinit` 重新开始。这会备份现有配置目录并添加时间戳后缀,然后从头创建新配置。
|
||||
|
||||
### `agent`
|
||||
|
||||
|
||||
@@ -288,15 +288,6 @@ $ zeroclaw onboard
|
||||
# ↑ 仅多了一个词,静默自动检测!
|
||||
```
|
||||
|
||||
### 高级用户(显式控制)
|
||||
|
||||
```bash
|
||||
$ zeroclaw onboard --security-level paranoid
|
||||
[1/9] Workspace Setup...
|
||||
...
|
||||
✓ Security: Paranoid | Landlock + Firejail | Audit signed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 向后兼容性
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
| 场景 | 命令 |
|
||||
|----------|---------|
|
||||
| 我有 API 密钥,想要最快安装 | `zeroclaw onboard --api-key sk-... --provider openrouter` |
|
||||
| 我想要引导式提示 | `zeroclaw onboard --interactive` |
|
||||
| 我想要引导式提示 | `zeroclaw onboard` |
|
||||
| 配置已存在,仅修复渠道配置 | `zeroclaw onboard --channels-only` |
|
||||
| 配置已存在,我需要完全覆盖 | `zeroclaw onboard --force` |
|
||||
| 使用订阅认证 | 查看 [订阅认证](../../../../README.zh-CN.md#subscription-auth-openai-codex--claude-code) |
|
||||
@@ -22,7 +22,7 @@
|
||||
## 引导和验证
|
||||
|
||||
- 快速引导:`zeroclaw onboard --api-key \"sk-...\" --provider openrouter`
|
||||
- 交互式引导:`zeroclaw onboard --interactive`
|
||||
- 引导式设置:`zeroclaw onboard`
|
||||
- 现有配置保护:重新运行需要显式确认(非交互式流程中使用 `--force`)
|
||||
- Ollama 云模型(`:cloud`)需要远程 `api_url` 和 API 密钥(例如 `api_url = \"https://ollama.com\"`)。
|
||||
- 验证环境:`zeroclaw status` + `zeroclaw doctor`
|
||||
|
||||
@@ -95,19 +95,13 @@ curl -fsSL https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/insta
|
||||
### 快速引导(非交互式)
|
||||
|
||||
```bash
|
||||
./install.sh --onboard --api-key \"sk-...\" --provider openrouter
|
||||
./install.sh --api-key \"sk-...\" --provider openrouter
|
||||
```
|
||||
|
||||
或者使用环境变量:
|
||||
|
||||
```bash
|
||||
ZEROCLAW_API_KEY=\"sk-...\" ZEROCLAW_PROVIDER=\"openrouter\" ./install.sh --onboard
|
||||
```
|
||||
|
||||
### 交互式引导
|
||||
|
||||
```bash
|
||||
./install.sh --interactive-onboard
|
||||
ZEROCLAW_API_KEY=\"sk-...\" ZEROCLAW_PROVIDER=\"openrouter\" ./install.sh
|
||||
```
|
||||
|
||||
## 有用的参数
|
||||
|
||||
@@ -233,7 +233,7 @@ Traits never import concrete implementations.
|
||||
|
||||
```
|
||||
zeroclaw
|
||||
├── onboard [--interactive] [--force] # First-run setup
|
||||
├── onboard [--force] [--reinit] [--channels-only] # First-run setup
|
||||
├── agent [-m "msg"] [-p provider] # Start agent loop
|
||||
├── daemon [-p port] # Full runtime (gateway+channels+cron+heartbeat)
|
||||
├── gateway [-p port] # HTTP API server only
|
||||
|
||||
@@ -351,10 +351,10 @@ Nostr supports both NIP-04 (legacy encrypted DMs) and NIP-17 (gift-wrapped priva
|
||||
Replies automatically use the same protocol the sender used. The private key is encrypted at rest
|
||||
via the `SecretStore` when `secrets.encrypt = true` (the default).
|
||||
|
||||
Interactive onboarding support:
|
||||
Guided onboarding support:
|
||||
|
||||
```bash
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
```
|
||||
|
||||
The wizard now includes dedicated **Lark** and **Feishu** steps with:
|
||||
|
||||
@@ -33,22 +33,21 @@ Last verified: **February 21, 2026**.
|
||||
### `onboard`
|
||||
|
||||
- `zeroclaw onboard`
|
||||
- `zeroclaw onboard --interactive`
|
||||
- `zeroclaw onboard --channels-only`
|
||||
- `zeroclaw onboard --force`
|
||||
- `zeroclaw onboard --reinit`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none> --force`
|
||||
- `zeroclaw onboard --reinit --interactive`
|
||||
|
||||
`onboard` safety behavior:
|
||||
|
||||
- If `config.toml` already exists and you run `--interactive`, onboarding now offers two modes:
|
||||
- If `config.toml` already exists, onboarding offers two modes:
|
||||
- Full onboarding (overwrite `config.toml`)
|
||||
- Provider-only update (update provider/model/API key while preserving existing channels, tunnel, memory, hooks, and other settings)
|
||||
- In non-interactive environments, existing `config.toml` causes a safe refusal unless `--force` is passed.
|
||||
- Use `zeroclaw onboard --channels-only` when you only need to rotate channel tokens/allowlists.
|
||||
- Use `zeroclaw onboard --reinit --interactive` to start fresh. This backs up your existing config directory with a timestamp suffix and creates a new configuration from scratch. Requires `--interactive`.
|
||||
- Use `zeroclaw onboard --reinit` to start fresh. This backs up your existing config directory with a timestamp suffix and creates a new configuration from scratch.
|
||||
|
||||
### `agent`
|
||||
|
||||
|
||||
@@ -285,14 +285,6 @@ $ zeroclaw onboard
|
||||
# ↑ Just one extra word, silent auto-detection!
|
||||
```
|
||||
|
||||
### Advanced User (Explicit Control)
|
||||
```bash
|
||||
$ zeroclaw onboard --security-level paranoid
|
||||
[1/9] Workspace Setup...
|
||||
...
|
||||
✓ Security: Paranoid | Landlock + Firejail | Audit signed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Backward Compatibility
|
||||
|
||||
@@ -14,7 +14,7 @@ For first-time setup and quick orientation.
|
||||
| Scenario | Command |
|
||||
|----------|---------|
|
||||
| I have an API key, want fastest setup | `zeroclaw onboard --api-key sk-... --provider openrouter` |
|
||||
| I want guided prompts | `zeroclaw onboard --interactive` |
|
||||
| I want guided prompts | `zeroclaw onboard` |
|
||||
| Config exists, just fix channels | `zeroclaw onboard --channels-only` |
|
||||
| Config exists, I intentionally want full overwrite | `zeroclaw onboard --force` |
|
||||
| Using subscription auth | See [Subscription Auth](../../README.md#subscription-auth-openai-codex--claude-code) |
|
||||
@@ -22,7 +22,7 @@ For first-time setup and quick orientation.
|
||||
## Onboarding and Validation
|
||||
|
||||
- Quick onboarding: `zeroclaw onboard --api-key "sk-..." --provider openrouter`
|
||||
- Interactive onboarding: `zeroclaw onboard --interactive`
|
||||
- Guided onboarding: `zeroclaw onboard`
|
||||
- Existing config protection: reruns require explicit confirmation (or `--force` in non-interactive flows)
|
||||
- Ollama cloud models (`:cloud`) require a remote `api_url` and API key (for example `api_url = "https://ollama.com"`).
|
||||
- Validate environment: `zeroclaw status` + `zeroclaw doctor`
|
||||
|
||||
@@ -13,14 +13,14 @@ Dành cho cài đặt lần đầu và làm quen nhanh.
|
||||
| Tình huống | Lệnh |
|
||||
|----------|---------|
|
||||
| Có API key, muốn cài nhanh nhất | `zeroclaw onboard --api-key sk-... --provider openrouter` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard --interactive` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard` |
|
||||
| Đã có config, chỉ cần sửa kênh | `zeroclaw onboard --channels-only` |
|
||||
| Dùng xác thực subscription | Xem [Subscription Auth](../../README.vi.md#subscription-auth-openai-codex--claude-code) |
|
||||
|
||||
## Thiết lập và kiểm tra
|
||||
|
||||
- Thiết lập nhanh: `zeroclaw onboard --api-key "sk-..." --provider openrouter`
|
||||
- Thiết lập tương tác: `zeroclaw onboard --interactive`
|
||||
- Thiết lập hướng dẫn: `zeroclaw onboard`
|
||||
- Kiểm tra môi trường: `zeroclaw status` + `zeroclaw doctor`
|
||||
|
||||
## Tiếp theo
|
||||
|
||||
@@ -101,19 +101,13 @@ it pulls `ghcr.io/zeroclaw-labs/zeroclaw:latest` and tags it locally before runn
|
||||
### Quick onboarding (non-interactive)
|
||||
|
||||
```bash
|
||||
./install.sh --onboard --api-key "sk-..." --provider openrouter
|
||||
./install.sh --api-key "sk-..." --provider openrouter
|
||||
```
|
||||
|
||||
Or with environment variables:
|
||||
|
||||
```bash
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh --onboard
|
||||
```
|
||||
|
||||
### Interactive onboarding
|
||||
|
||||
```bash
|
||||
./install.sh --interactive-onboard
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh
|
||||
```
|
||||
|
||||
## Useful flags
|
||||
|
||||
@@ -299,10 +299,10 @@ receive_mode = "websocket" # hoặc "webhook"
|
||||
port = 8081 # bắt buộc ở chế độ webhook
|
||||
```
|
||||
|
||||
Hỗ trợ onboarding tương tác:
|
||||
Hỗ trợ onboarding hướng dẫn:
|
||||
|
||||
```bash
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
```
|
||||
|
||||
Trình hướng dẫn bao gồm bước **Lark/Feishu** chuyên biệt với:
|
||||
|
||||
@@ -32,7 +32,6 @@ Xác minh lần cuối: **2026-02-20**.
|
||||
### `onboard`
|
||||
|
||||
- `zeroclaw onboard`
|
||||
- `zeroclaw onboard --interactive`
|
||||
- `zeroclaw onboard --channels-only`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --memory <sqlite|lucid|markdown|none>`
|
||||
- `zeroclaw onboard --api-key <KEY> --provider <ID> --model <MODEL_ID> --memory <sqlite|lucid|markdown|none>`
|
||||
|
||||
@@ -285,14 +285,6 @@ $ zeroclaw onboard
|
||||
# ↑ Chỉ thêm một từ, tự phát hiện âm thầm!
|
||||
```
|
||||
|
||||
### Người dùng nâng cao (kiểm soát tường minh)
|
||||
```bash
|
||||
$ zeroclaw onboard --security-level paranoid
|
||||
[1/9] Workspace Setup...
|
||||
...
|
||||
✓ Security: Paranoid | Landlock + Firejail | Audit signed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tương thích ngược
|
||||
|
||||
@@ -13,14 +13,14 @@ Dành cho cài đặt lần đầu và làm quen nhanh.
|
||||
| Tình huống | Lệnh |
|
||||
|----------|---------|
|
||||
| Có API key, muốn cài nhanh nhất | `zeroclaw onboard --api-key sk-... --provider openrouter` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard --interactive` |
|
||||
| Muốn được hướng dẫn từng bước | `zeroclaw onboard` |
|
||||
| Đã có config, chỉ cần sửa kênh | `zeroclaw onboard --channels-only` |
|
||||
| Dùng xác thực subscription | Xem [Subscription Auth](../../../README.md#subscription-auth-openai-codex--claude-code) |
|
||||
|
||||
## Thiết lập và kiểm tra
|
||||
|
||||
- Thiết lập nhanh: `zeroclaw onboard --api-key "sk-..." --provider openrouter`
|
||||
- Thiết lập tương tác: `zeroclaw onboard --interactive`
|
||||
- Thiết lập hướng dẫn: `zeroclaw onboard`
|
||||
- Kiểm tra môi trường: `zeroclaw status` + `zeroclaw doctor`
|
||||
|
||||
## Tiếp theo
|
||||
|
||||
@@ -89,19 +89,13 @@ Lệnh này build image ZeroClaw cục bộ và chạy thiết lập trong conta
|
||||
### Thiết lập nhanh (không tương tác)
|
||||
|
||||
```bash
|
||||
./install.sh --onboard --api-key "sk-..." --provider openrouter
|
||||
./install.sh --api-key "sk-..." --provider openrouter
|
||||
```
|
||||
|
||||
Hoặc dùng biến môi trường:
|
||||
|
||||
```bash
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh --onboard
|
||||
```
|
||||
|
||||
### Thiết lập tương tác
|
||||
|
||||
```bash
|
||||
./install.sh --interactive-onboard
|
||||
ZEROCLAW_API_KEY="sk-..." ZEROCLAW_PROVIDER="openrouter" ./install.sh
|
||||
```
|
||||
|
||||
## Các cờ hữu ích
|
||||
|
||||
+27
-2
@@ -187,7 +187,12 @@ detect_release_target() {
|
||||
echo "x86_64-unknown-linux-gnu"
|
||||
;;
|
||||
Linux:aarch64|Linux:arm64)
|
||||
echo "aarch64-unknown-linux-gnu"
|
||||
# Termux on Android needs the android target, not linux-gnu
|
||||
if [[ -n "${TERMUX_VERSION:-}" || -d "/data/data/com.termux" ]]; then
|
||||
echo "aarch64-linux-android"
|
||||
else
|
||||
echo "aarch64-unknown-linux-gnu"
|
||||
fi
|
||||
;;
|
||||
Linux:armv7l|Linux:armv6l)
|
||||
echo "armv7-unknown-linux-gnueabihf"
|
||||
@@ -420,11 +425,18 @@ bool_to_word() {
|
||||
}
|
||||
|
||||
guided_input_stream() {
|
||||
if [[ -t 0 ]]; then
|
||||
# Some constrained containers report interactive stdin (-t 0) but deny
|
||||
# opening /dev/stdin directly. Probe readability before selecting it.
|
||||
if [[ -t 0 ]] && (: </dev/stdin) 2>/dev/null; then
|
||||
echo "/dev/stdin"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -t 0 ]] && (: </proc/self/fd/0) 2>/dev/null; then
|
||||
echo "/proc/self/fd/0"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if (: </dev/tty) 2>/dev/null; then
|
||||
echo "/dev/tty"
|
||||
return 0
|
||||
@@ -527,6 +539,8 @@ install_system_deps() {
|
||||
openssl \
|
||||
perl \
|
||||
ca-certificates
|
||||
elif have_cmd pkg && [[ -n "${TERMUX_VERSION:-}" ]]; then
|
||||
pkg install -y build-essential pkg-config git curl openssl perl
|
||||
else
|
||||
warn "Unsupported Linux distribution. Install compiler toolchain + pkg-config + git + curl + OpenSSL headers + perl manually."
|
||||
fi
|
||||
@@ -1185,6 +1199,17 @@ fi
|
||||
|
||||
if [[ "$SKIP_INSTALL" == false ]]; then
|
||||
step_dot "Installing zeroclaw to cargo bin"
|
||||
|
||||
# Clean up stale cargo install tracking from the old "zeroclaw" package name
|
||||
# (renamed to "zeroclawlabs"). Without this, `cargo install zeroclawlabs` from
|
||||
# crates.io fails with "binary already exists as part of `zeroclaw`".
|
||||
if have_cmd cargo; then
|
||||
if [[ -f "$HOME/.cargo/.crates.toml" ]] && grep -q '^"zeroclaw ' "$HOME/.cargo/.crates.toml" 2>/dev/null; then
|
||||
step_dot "Removing stale cargo tracking for old 'zeroclaw' package name"
|
||||
cargo uninstall zeroclaw 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
|
||||
cargo install --path "$WORK_DIR" --force --locked
|
||||
step_ok "ZeroClaw installed"
|
||||
else
|
||||
|
||||
@@ -63,14 +63,18 @@ impl NextcloudTalkChannel {
|
||||
/// Parse a Nextcloud Talk webhook payload into channel messages.
|
||||
///
|
||||
/// Relevant payload fields:
|
||||
/// - `type` (expects `message`)
|
||||
/// - `type` (accepts `message` or `Create`)
|
||||
/// - `object.token` (room token for reply routing)
|
||||
/// - `message.actorType`, `message.actorId`, `message.message`, `message.timestamp`
|
||||
pub fn parse_webhook_payload(&self, payload: &serde_json::Value) -> Vec<ChannelMessage> {
|
||||
let mut messages = Vec::new();
|
||||
|
||||
if let Some(event_type) = payload.get("type").and_then(|v| v.as_str()) {
|
||||
if !event_type.eq_ignore_ascii_case("message") {
|
||||
// Nextcloud Talk bot webhooks send "Create" for new chat messages,
|
||||
// but some setups may use "message". Accept both.
|
||||
let is_message_event = event_type.eq_ignore_ascii_case("message")
|
||||
|| event_type.eq_ignore_ascii_case("create");
|
||||
if !is_message_event {
|
||||
tracing::debug!("Nextcloud Talk: skipping non-message event: {event_type}");
|
||||
return messages;
|
||||
}
|
||||
@@ -338,6 +342,36 @@ mod tests {
|
||||
assert_eq!(messages[0].timestamp, 1_735_701_200);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nextcloud_talk_parse_create_event_type() {
|
||||
let channel = make_channel();
|
||||
let payload = serde_json::json!({
|
||||
"type": "Create",
|
||||
"object": {
|
||||
"id": "42",
|
||||
"token": "room-token-123",
|
||||
"name": "Team Room",
|
||||
"type": "room"
|
||||
},
|
||||
"message": {
|
||||
"id": 88,
|
||||
"token": "room-token-123",
|
||||
"actorType": "users",
|
||||
"actorId": "user_a",
|
||||
"actorDisplayName": "User A",
|
||||
"timestamp": 1_735_701_300,
|
||||
"messageType": "comment",
|
||||
"systemMessage": "",
|
||||
"message": "Hello via Create event"
|
||||
}
|
||||
});
|
||||
|
||||
let messages = channel.parse_webhook_payload(&payload);
|
||||
assert_eq!(messages.len(), 1);
|
||||
assert_eq!(messages[0].id, "88");
|
||||
assert_eq!(messages[0].content, "Hello via Create event");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nextcloud_talk_parse_skips_non_message_events() {
|
||||
let channel = make_channel();
|
||||
|
||||
+18
-1
@@ -1,7 +1,8 @@
|
||||
#[cfg(feature = "channel-matrix")]
|
||||
use crate::channels::MatrixChannel;
|
||||
use crate::channels::{
|
||||
Channel, DiscordChannel, MattermostChannel, SendMessage, SlackChannel, TelegramChannel,
|
||||
Channel, DiscordChannel, MattermostChannel, SendMessage, SignalChannel, SlackChannel,
|
||||
TelegramChannel,
|
||||
};
|
||||
use crate::config::Config;
|
||||
use crate::cron::{
|
||||
@@ -378,6 +379,22 @@ pub(crate) async fn deliver_announcement(
|
||||
);
|
||||
channel.send(&SendMessage::new(output, target)).await?;
|
||||
}
|
||||
"signal" => {
|
||||
let sg = config
|
||||
.channels_config
|
||||
.signal
|
||||
.as_ref()
|
||||
.ok_or_else(|| anyhow::anyhow!("signal channel not configured"))?;
|
||||
let channel = SignalChannel::new(
|
||||
sg.http_url.clone(),
|
||||
sg.account.clone(),
|
||||
sg.group_id.clone(),
|
||||
sg.allowed_from.clone(),
|
||||
sg.ignore_attachments,
|
||||
sg.ignore_stories,
|
||||
);
|
||||
channel.send(&SendMessage::new(output, target)).await?;
|
||||
}
|
||||
"matrix" => {
|
||||
#[cfg(feature = "channel-matrix")]
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
use axum::{
|
||||
http::{header, StatusCode, Uri},
|
||||
response::IntoResponse,
|
||||
response::{IntoResponse, Response},
|
||||
};
|
||||
use rust_embed::Embed;
|
||||
|
||||
@@ -13,18 +13,29 @@ use rust_embed::Embed;
|
||||
struct WebAssets;
|
||||
|
||||
/// Serve static files from `/_app/*` path
|
||||
pub async fn handle_static(uri: Uri) -> impl IntoResponse {
|
||||
let path = uri.path().strip_prefix("/_app/").unwrap_or(uri.path());
|
||||
pub async fn handle_static(uri: Uri) -> Response {
|
||||
let path = uri
|
||||
.path()
|
||||
.strip_prefix("/_app/")
|
||||
.unwrap_or(uri.path())
|
||||
.trim_start_matches('/');
|
||||
|
||||
serve_embedded_file(path)
|
||||
}
|
||||
|
||||
/// SPA fallback: serve index.html for any non-API, non-static GET request
|
||||
pub async fn handle_spa_fallback() -> impl IntoResponse {
|
||||
pub async fn handle_spa_fallback() -> Response {
|
||||
if WebAssets::get("index.html").is_none() {
|
||||
return (
|
||||
StatusCode::SERVICE_UNAVAILABLE,
|
||||
"Web dashboard not available. Build it with: cd web && npm ci && npm run build",
|
||||
)
|
||||
.into_response();
|
||||
}
|
||||
serve_embedded_file("index.html")
|
||||
}
|
||||
|
||||
fn serve_embedded_file(path: &str) -> impl IntoResponse {
|
||||
fn serve_embedded_file(path: &str) -> Response {
|
||||
match WebAssets::get(path) {
|
||||
Some(content) => {
|
||||
let mime = mime_guess::from_path(path)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![recursion_limit = "256"]
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(
|
||||
clippy::assigning_clones,
|
||||
|
||||
+159
-20
@@ -319,7 +319,7 @@ impl AnthropicProvider {
|
||||
role: "assistant".to_string(),
|
||||
content: blocks,
|
||||
});
|
||||
} else {
|
||||
} else if !msg.content.trim().is_empty() {
|
||||
native_messages.push(NativeMessage {
|
||||
role: "assistant".to_string(),
|
||||
content: vec![NativeContentOut::Text {
|
||||
@@ -330,16 +330,33 @@ impl AnthropicProvider {
|
||||
}
|
||||
}
|
||||
"tool" => {
|
||||
if let Some(tool_result) = Self::parse_tool_result_message(&msg.content) {
|
||||
native_messages.push(tool_result);
|
||||
} else {
|
||||
native_messages.push(NativeMessage {
|
||||
let tool_msg = if let Some(tr) = Self::parse_tool_result_message(&msg.content) {
|
||||
tr
|
||||
} else if !msg.content.trim().is_empty() {
|
||||
NativeMessage {
|
||||
role: "user".to_string(),
|
||||
content: vec![NativeContentOut::Text {
|
||||
text: msg.content.clone(),
|
||||
cache_control: None,
|
||||
}],
|
||||
});
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
};
|
||||
// Tool results map to role "user"; merge consecutive ones
|
||||
// into a single message so Anthropic doesn't reject the
|
||||
// request for having adjacent same-role messages.
|
||||
if native_messages
|
||||
.last()
|
||||
.is_some_and(|m| m.role == tool_msg.role)
|
||||
{
|
||||
native_messages
|
||||
.last_mut()
|
||||
.unwrap()
|
||||
.content
|
||||
.extend(tool_msg.content);
|
||||
} else {
|
||||
native_messages.push(tool_msg);
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -394,21 +411,34 @@ impl AnthropicProvider {
|
||||
});
|
||||
}
|
||||
|
||||
// Add text content block
|
||||
let display_text = if text.is_empty() && !image_refs.is_empty() {
|
||||
"[image]".to_string()
|
||||
} else {
|
||||
text
|
||||
};
|
||||
content_blocks.push(NativeContentOut::Text {
|
||||
text: display_text,
|
||||
cache_control: None,
|
||||
});
|
||||
// Add text content block (skip empty text when images are present)
|
||||
if text.is_empty() && !image_refs.is_empty() {
|
||||
content_blocks.push(NativeContentOut::Text {
|
||||
text: "[image]".to_string(),
|
||||
cache_control: None,
|
||||
});
|
||||
} else if !text.trim().is_empty() {
|
||||
content_blocks.push(NativeContentOut::Text {
|
||||
text,
|
||||
cache_control: None,
|
||||
});
|
||||
}
|
||||
|
||||
native_messages.push(NativeMessage {
|
||||
role: "user".to_string(),
|
||||
content: content_blocks,
|
||||
});
|
||||
// Merge into previous user message if present (e.g.
|
||||
// when a user message immediately follows tool results
|
||||
// which are also role "user" in Anthropic's format).
|
||||
if native_messages.last().is_some_and(|m| m.role == "user") {
|
||||
native_messages
|
||||
.last_mut()
|
||||
.unwrap()
|
||||
.content
|
||||
.extend(content_blocks);
|
||||
} else {
|
||||
native_messages.push(NativeMessage {
|
||||
role: "user".to_string(),
|
||||
content: content_blocks,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1550,4 +1580,113 @@ mod tests {
|
||||
);
|
||||
assert!(json.contains(r#""data":"testdata""#), "JSON: {}", json);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn convert_messages_merges_consecutive_tool_results() {
|
||||
// Simulate a multi-tool-call turn: assistant with two tool_use blocks
|
||||
// followed by two separate tool result messages.
|
||||
let messages = vec![
|
||||
ChatMessage {
|
||||
role: "system".to_string(),
|
||||
content: "You are helpful.".to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "user".to_string(),
|
||||
content: "Do two things.".to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "assistant".to_string(),
|
||||
content: serde_json::json!({
|
||||
"content": "",
|
||||
"tool_calls": [
|
||||
{"id": "call_1", "name": "shell", "arguments": "{\"command\":\"ls\"}"},
|
||||
{"id": "call_2", "name": "shell", "arguments": "{\"command\":\"pwd\"}"}
|
||||
]
|
||||
})
|
||||
.to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "tool".to_string(),
|
||||
content: serde_json::json!({
|
||||
"tool_call_id": "call_1",
|
||||
"content": "file1.txt\nfile2.txt"
|
||||
})
|
||||
.to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "tool".to_string(),
|
||||
content: serde_json::json!({
|
||||
"tool_call_id": "call_2",
|
||||
"content": "/home/user"
|
||||
})
|
||||
.to_string(),
|
||||
},
|
||||
];
|
||||
|
||||
let (system, native_msgs) = AnthropicProvider::convert_messages(&messages);
|
||||
|
||||
assert!(system.is_some());
|
||||
// Should be: user, assistant, user (merged tool results)
|
||||
// NOT: user, assistant, user, user (which Anthropic rejects)
|
||||
assert_eq!(
|
||||
native_msgs.len(),
|
||||
3,
|
||||
"Expected 3 messages (user, assistant, merged tool results), got {}.\nRoles: {:?}",
|
||||
native_msgs.len(),
|
||||
native_msgs.iter().map(|m| &m.role).collect::<Vec<_>>()
|
||||
);
|
||||
assert_eq!(native_msgs[0].role, "user");
|
||||
assert_eq!(native_msgs[1].role, "assistant");
|
||||
assert_eq!(native_msgs[2].role, "user");
|
||||
// The merged user message should contain both tool results
|
||||
assert_eq!(
|
||||
native_msgs[2].content.len(),
|
||||
2,
|
||||
"Expected 2 tool_result blocks in merged message"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn convert_messages_no_adjacent_same_role() {
|
||||
// Verify that convert_messages never produces adjacent messages with the
|
||||
// same role, regardless of input ordering.
|
||||
let messages = vec![
|
||||
ChatMessage {
|
||||
role: "user".to_string(),
|
||||
content: "Hello".to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "assistant".to_string(),
|
||||
content: serde_json::json!({
|
||||
"content": "I'll run a command",
|
||||
"tool_calls": [
|
||||
{"id": "tc1", "name": "shell", "arguments": "{\"command\":\"echo hi\"}"}
|
||||
]
|
||||
})
|
||||
.to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "tool".to_string(),
|
||||
content: serde_json::json!({
|
||||
"tool_call_id": "tc1",
|
||||
"content": "hi"
|
||||
})
|
||||
.to_string(),
|
||||
},
|
||||
ChatMessage {
|
||||
role: "user".to_string(),
|
||||
content: "Thanks!".to_string(),
|
||||
},
|
||||
];
|
||||
|
||||
let (_system, native_msgs) = AnthropicProvider::convert_messages(&messages);
|
||||
|
||||
for window in native_msgs.windows(2) {
|
||||
assert_ne!(
|
||||
window[0].role, window[1].role,
|
||||
"Adjacent messages must not share the same role: found two '{}' messages in a row",
|
||||
window[0].role
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1328,6 +1328,96 @@ fn create_provider_with_url_and_options(
|
||||
"astrai" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Astrai", "https://as-trai.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"siliconflow" | "silicon-flow" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"SiliconFlow",
|
||||
"https://api.siliconflow.cn/v1",
|
||||
key,
|
||||
AuthStyle::Bearer,
|
||||
))),
|
||||
"aihubmix" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"AiHubMix",
|
||||
"https://aihubmix.com/v1",
|
||||
key,
|
||||
AuthStyle::Bearer,
|
||||
))),
|
||||
"litellm" | "lite-llm" => {
|
||||
let base_url = api_url
|
||||
.map(str::trim)
|
||||
.filter(|value| !value.is_empty())
|
||||
.unwrap_or("http://localhost:4000/v1");
|
||||
Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"LiteLLM",
|
||||
base_url,
|
||||
key,
|
||||
AuthStyle::Bearer,
|
||||
)))
|
||||
}
|
||||
|
||||
// ── Fast inference providers ──────────────────────────
|
||||
"cerebras" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Cerebras", "https://api.cerebras.ai/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"sambanova" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"SambaNova", "https://api.sambanova.ai/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"hyperbolic" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Hyperbolic", "https://api.hyperbolic.xyz/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
|
||||
// ── Model hosting platforms ──────────────────────────
|
||||
"deepinfra" | "deep-infra" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"DeepInfra", "https://api.deepinfra.com/v1/openai", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"huggingface" | "hf" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Hugging Face", "https://router.huggingface.co/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"ai21" | "ai21-labs" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"AI21 Labs", "https://api.ai21.com/studio/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"reka" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Reka", "https://api.reka.ai/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"baseten" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Baseten", "https://inference.baseten.co/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"nscale" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Nscale", "https://inference.api.nscale.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"anyscale" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Anyscale", "https://api.endpoints.anyscale.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"nebius" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Nebius AI Studio", "https://api.studio.nebius.ai/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"friendli" | "friendliai" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Friendli AI", "https://api.friendli.ai/serverless/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"lepton" | "lepton-ai" => {
|
||||
let base_url = api_url
|
||||
.map(str::trim)
|
||||
.filter(|value| !value.is_empty())
|
||||
.unwrap_or("https://llama3-1-405b.lepton.run/api/v1");
|
||||
Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Lepton AI",
|
||||
base_url,
|
||||
key,
|
||||
AuthStyle::Bearer,
|
||||
)))
|
||||
}
|
||||
|
||||
// ── Chinese AI providers ─────────────────────────────
|
||||
"stepfun" | "step" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Stepfun", "https://api.stepfun.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"baichuan" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Baichuan", "https://api.baichuan-ai.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"yi" | "01ai" | "lingyiwanwu" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"01.AI (Yi)", "https://api.lingyiwanwu.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
"hunyuan" | "tencent" => Ok(compat(OpenAiCompatibleProvider::new(
|
||||
"Tencent Hunyuan", "https://api.hunyuan.cloud.tencent.com/v1", key, AuthStyle::Bearer,
|
||||
))),
|
||||
|
||||
// ── Cloud AI endpoints ───────────────────────────────
|
||||
"ovhcloud" | "ovh" => Ok(Box::new(openai::OpenAiProvider::with_base_url(
|
||||
@@ -1614,6 +1704,18 @@ pub fn list_providers() -> Vec<ProviderInfo> {
|
||||
aliases: &["openai_codex", "codex"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "telnyx",
|
||||
display_name: "Telnyx",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "azure_openai",
|
||||
display_name: "Azure OpenAI",
|
||||
aliases: &["azure-openai", "azure"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "ollama",
|
||||
display_name: "Ollama",
|
||||
@@ -1832,6 +1934,130 @@ pub fn list_providers() -> Vec<ProviderInfo> {
|
||||
aliases: &["nvidia-nim", "build.nvidia.com"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "siliconflow",
|
||||
display_name: "SiliconFlow",
|
||||
aliases: &["silicon-flow"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "aihubmix",
|
||||
display_name: "AiHubMix",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "litellm",
|
||||
display_name: "LiteLLM",
|
||||
aliases: &["lite-llm"],
|
||||
local: false,
|
||||
},
|
||||
// ── Fast inference ────────────────────────────────────
|
||||
ProviderInfo {
|
||||
name: "cerebras",
|
||||
display_name: "Cerebras",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "sambanova",
|
||||
display_name: "SambaNova",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "hyperbolic",
|
||||
display_name: "Hyperbolic",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
// ── Model hosting platforms ──────────────────────────
|
||||
ProviderInfo {
|
||||
name: "deepinfra",
|
||||
display_name: "DeepInfra",
|
||||
aliases: &["deep-infra"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "huggingface",
|
||||
display_name: "Hugging Face",
|
||||
aliases: &["hf"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "ai21",
|
||||
display_name: "AI21 Labs",
|
||||
aliases: &["ai21-labs"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "reka",
|
||||
display_name: "Reka",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "baseten",
|
||||
display_name: "Baseten",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "nscale",
|
||||
display_name: "Nscale",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "anyscale",
|
||||
display_name: "Anyscale",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "nebius",
|
||||
display_name: "Nebius AI Studio",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "friendli",
|
||||
display_name: "Friendli AI",
|
||||
aliases: &["friendliai"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "lepton",
|
||||
display_name: "Lepton AI",
|
||||
aliases: &["lepton-ai"],
|
||||
local: false,
|
||||
},
|
||||
// ── Chinese AI providers ─────────────────────────────
|
||||
ProviderInfo {
|
||||
name: "stepfun",
|
||||
display_name: "Stepfun",
|
||||
aliases: &["step"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "baichuan",
|
||||
display_name: "Baichuan",
|
||||
aliases: &[],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "yi",
|
||||
display_name: "01.AI (Yi)",
|
||||
aliases: &["01ai", "lingyiwanwu"],
|
||||
local: false,
|
||||
},
|
||||
ProviderInfo {
|
||||
name: "hunyuan",
|
||||
display_name: "Tencent Hunyuan",
|
||||
aliases: &["tencent"],
|
||||
local: false,
|
||||
},
|
||||
// ── Cloud AI endpoints ───────────────────────────────
|
||||
ProviderInfo {
|
||||
name: "ovhcloud",
|
||||
display_name: "OVHcloud AI Endpoints",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
mod agent;
|
||||
mod agent_robustness;
|
||||
mod channel_matrix;
|
||||
mod channel_routing;
|
||||
mod hooks;
|
||||
mod memory_comparison;
|
||||
|
||||
@@ -179,7 +179,7 @@ Solution: Verify code changes
|
||||
./tests/telegram/test_telegram_integration.sh
|
||||
|
||||
# 2. Configure Telegram
|
||||
zeroclaw onboard --interactive
|
||||
zeroclaw onboard
|
||||
# Select Telegram channel
|
||||
# Enter bot token (from @BotFather)
|
||||
# Enter your user ID
|
||||
|
||||
Reference in New Issue
Block a user