Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
977a9a9
new features
Hendler Feb 5, 2026
d9db0a9
todo
Hendler Feb 5, 2026
1fbd3e8
more features
Hendler Feb 5, 2026
9cfceb8
new features
Hendler Feb 6, 2026
f493a42
more complete todos
Hendler Feb 6, 2026
725ef2f
agent state
Hendler Feb 6, 2026
1f2fbab
agent state
Hendler Feb 6, 2026
0c67290
commitment
Hendler Feb 6, 2026
30a9f84
phase 0 and 1
Hendler Feb 6, 2026
8183d03
phase 0 and 1
Hendler Feb 6, 2026
4002a6c
database scaffolding
Hendler Feb 6, 2026
07339dc
db backends
Hendler Feb 6, 2026
6c67ca0
another security review
Hendler Feb 7, 2026
5db5db3
more security updates
Hendler Feb 7, 2026
1d9ba54
0.6.0 updates
Hendler Feb 7, 2026
4cc6242
docs and versions
Hendler Feb 7, 2026
9a494ea
use cases
Hendler Feb 7, 2026
5648dfc
fixes
Hendler Feb 7, 2026
eff229f
accuracy
Hendler Feb 7, 2026
ff2301e
ummary of what was done for Task 19 and Task 20:
Hendler Feb 7, 2026
304be52
ummary of what was done for Task 19 and Task 20:
Hendler Feb 7, 2026
1d9edce
docs:wq
Hendler Feb 7, 2026
d28af07
I’ve applied the hardening patches and added focused regression tests…
Hendler Feb 8, 2026
3a7e198
docs update
Hendler Feb 8, 2026
a25b704
fixes
Hendler Feb 8, 2026
0ea36d3
⏺ All 5 test suites pass:
Hendler Feb 8, 2026
bcc81c4
Implemented end-to-end.
Hendler Feb 8, 2026
39d9c57
go build
Hendler Feb 8, 2026
672a03c
go build
Hendler Feb 8, 2026
648848e
fix(release,bindings): harden npm/pypi packaging, align strict agreem…
Hendler Feb 8, 2026
3be107b
Fixed programmatic agent creation in simple.rs:
Hendler Feb 8, 2026
c4fde34
update book
Hendler Feb 8, 2026
dea42b0
rename, cleanup bug
Hendler Feb 8, 2026
07aa790
CI fixes
Hendler Feb 8, 2026
dee8f38
more ci fixes
Hendler Feb 8, 2026
8513ed4
CI
Hendler Feb 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion .github/workflows/nodejs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ jobs:

- name: Install dependencies
working-directory: jacsnpm
run: npm ci || npm install
run: npm ci

- name: Run npm audit
working-directory: jacsnpm
run: npm audit --audit-level=high || true

- name: Build native module
working-directory: jacsnpm
Expand All @@ -51,3 +55,14 @@ jobs:
- name: Run tests
working-directory: jacsnpm
run: npm test

- name: Smoke test packed npm install
working-directory: jacsnpm
run: |
set -euo pipefail
PACKAGE_TGZ=$(npm pack | tail -n 1)
mkdir -p /tmp/jacs-npm-smoke
cd /tmp/jacs-npm-smoke
npm init -y >/dev/null
npm install "${GITHUB_WORKSPACE}/jacsnpm/${PACKAGE_TGZ}" --ignore-scripts
node -e "require('@hai-ai/jacs'); require('@hai-ai/jacs/simple'); require('@hai-ai/jacs/mcp'); require('@hai-ai/jacs/a2a'); console.log('smoke imports ok')"
109 changes: 77 additions & 32 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,19 @@
name: Python (jacspy crate)
name: Python (jacs)

on:
push:
branches: [ "main" ]
paths: # Optional: Trigger only on changes within jacspy/ or relevant files
- 'jacspy/**'
- 'jacs/**' # jacspy depends on jacs
- '.github/workflows/python.yml'
pull_request:
branches: [ "main" ]
paths: # Optional: Trigger only on changes within jacspy/ or relevant files
- 'jacspy/**'
- 'jacs/**' # jacspy depends on jacs
- '.github/workflows/python.yml'
workflow_dispatch: # Allows manual triggering

env:
CARGO_TERM_COLOR: always

jobs:
# Job to run tests on every push/PR
test-jacspy:
name: Test jacspy crate (x86_64)
# Job to run tests on every push/PR (jacspy = local dir name; package on PyPI is jacs)
test-jacs:
name: Test jacs (x86_64)
runs-on: ubuntu-latest # Docker is available on ubuntu-latest runners (x86_64)

steps:
Expand All @@ -35,7 +27,7 @@ jobs:
working-directory: jacspy # Directory containing DockerfileBuilder
run: docker buildx build --tag "jacs-build-x86_64" -f DockerfileBuilder . --load # --load makes image available

- name: Run jacspy tests in Docker (x86_64)
- name: Run jacs tests in Docker (x86_64)
working-directory: jacspy # To match PWD context if needed by scripts
env:
RUST_BACKTRACE: "1"
Expand All @@ -51,12 +43,62 @@ jobs:
pip install fastmcp mcp starlette && \
make test-python"

# Job to build wheels, runs ONLY on push to main
build-jacspy-wheels:
name: Build jacspy wheels on ${{ matrix.os }}
# Condition: Only run on push events to the main branch
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: test-jacspy # Optional: Ensure tests pass before building wheels
- name: Verify sdist build on PR/push
working-directory: jacspy
env:
RUST_BACKTRACE: "1"
run: |
docker run --rm \
-v "$(pwd)/..:/workspace" \
jacs-build-x86_64 \
bash -c "\
cd /workspace/jacspy && \
/opt/python/cp311-cp311/bin/python3.11 -m pip install maturin && \
/opt/python/cp311-cp311/bin/python3.11 -m maturin sdist --out dist-sdist-check"

wheel-smoke-uv:
name: Wheel smoke install (uv)
needs: test-jacs
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Set up Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: '1.93'

- name: Install uv and maturin
run: python -m pip install uv maturin

- name: Build wheel
working-directory: jacspy
run: UV_NO_SYNC=1 uv run maturin build --release --out dist

- name: Smoke test wheel import in clean venv
working-directory: jacspy
run: |
set -euo pipefail
uv venv /tmp/jacs-wheel-smoke
uv pip install --python /tmp/jacs-wheel-smoke/bin/python dist/jacs-*.whl
uv run --python /tmp/jacs-wheel-smoke/bin/python python - <<'PY'
import jacs
import jacs.simple
import jacs.hai
print("wheel smoke imports ok")
PY

# Job to build wheels for CI coverage (PyPI package name is jacs)
build-jacs-wheels:
name: Build jacs wheels on ${{ matrix.os }}
needs: [test-jacs, wheel-smoke-uv]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand All @@ -80,28 +122,31 @@ jobs:
with:
python-version: '3.11'

- name: Set up Rust (macOS)
if: runner.os == 'macOS'
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: '1.93'
target: x86_64-apple-darwin,aarch64-apple-darwin

- name: Install cibuildwheel
run: python -m pip install cibuildwheel

- name: Build wheels
# Run cibuildwheel from the root, but it should detect ./JACS/jacspy/pyproject.toml
# Or use working-directory: JACS/jacspy
run: cibuildwheel --output-dir wheelhouse jacspy
env:
# === cibuildwheel configuration ===
# Build architectures
CIBW_ARCHS_LINUX: "x86_64 aarch64"
CIBW_ARCHS_MACOS: "x86_64 aarch64" # Build both Intel and ARM on macOS runners
# Skip PyPy builds
CIBW_SKIP: "pp*"
# Python versions to build for (align with pyproject.toml requires-python)
CIBW_BUILD: "cp311-* cp312-* cp313-*" # Example: Build for 3.11, 3.12, 3.13
# Linux specific dependencies (if needed inside manylinux container)
# CIBW_BUILD_DEPENDS_LINUX: "openssl-devel"
CIBW_ARCHS_MACOS: "x86_64 arm64"
CIBW_BUILD: "cp311-* cp312-* cp313-*"
# macOS: set minimum deployment target so delocate doesn't reject the wheel
CIBW_ENVIRONMENT_MACOS: 'MACOSX_DEPLOYMENT_TARGET=10.13'
# Linux: install Rust toolchain and OpenSSL inside manylinux containers
CIBW_BEFORE_ALL_LINUX: "yum install -y openssl-devel perl-IPC-Cmd && curl https://sh.rustup.rs -sSf | sh -s -- -y"
CIBW_ENVIRONMENT_LINUX: 'PATH=$HOME/.cargo/bin:$PATH'

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: wheels-jacspy-${{ matrix.os }}
name: wheels-jacs-${{ matrix.os }}
# Path is relative to GITHUB_WORKSPACE (repo root)
path: ./wheelhouse/*.whl
path: ./wheelhouse/*.whl
27 changes: 16 additions & 11 deletions .github/workflows/release-crate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@ jobs:
TAG="${GITHUB_REF#refs/tags/crate/v}"
echo "version=$TAG" >> $GITHUB_OUTPUT

- name: Check Cargo.toml version matches tag
- name: Check Cargo.toml version matches tag (jacs + jacs-mcp)
run: |
CARGO_VERSION=$(grep '^version = ' jacs/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
TAG_VERSION="${{ steps.extract.outputs.version }}"
echo "Cargo version: $CARGO_VERSION"
echo "Tag version: $TAG_VERSION"
if [ "$CARGO_VERSION" = "$TAG_VERSION" ]; then
echo "Version match confirmed"
else
echo "::error::Version mismatch! Cargo.toml has $CARGO_VERSION but tag is $TAG_VERSION"
exit 1
fi
for dir in jacs jacs-mcp; do
CARGO_VERSION=$(grep '^version = ' $dir/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "$dir Cargo version: $CARGO_VERSION, tag: $TAG_VERSION"
if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
echo "::error::Version mismatch! $dir/Cargo.toml has $CARGO_VERSION but tag is $TAG_VERSION"
exit 1
fi
done
echo "Version match confirmed for jacs and jacs-mcp"

publish:
needs: verify-version
Expand All @@ -43,6 +43,11 @@ jobs:

- uses: actions-rust-lang/setup-rust-toolchain@v1

- name: Publish to crates.io
- name: Publish jacs to crates.io
working-directory: jacs
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}

- name: Publish jacs-mcp to crates.io
working-directory: jacs-mcp
continue-on-error: true
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
30 changes: 28 additions & 2 deletions .github/workflows/release-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,35 @@ jobs:

build-wheels:
needs: verify-version
continue-on-error: ${{ matrix.allow_failure }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
use_zig: false
allow_failure: false
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
use_zig: true
allow_failure: false
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
use_zig: true
allow_failure: false
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
use_zig: true
allow_failure: false
- os: macos-latest
target: aarch64-apple-darwin
use_zig: false
allow_failure: false
- os: macos-13
target: x86_64-apple-darwin
- os: windows-latest
target: x86_64-pc-windows-msvc
use_zig: false
allow_failure: false

runs-on: ${{ matrix.os }}
steps:
Expand All @@ -69,15 +83,27 @@ jobs:

- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: '1.93'
target: ${{ matrix.target }}

- name: Install maturin
if: ${{ !matrix.use_zig }}
run: pip install maturin

- name: Install maturin with zig support
if: ${{ matrix.use_zig }}
run: pip install "maturin[zig]"

- name: Build wheel
if: ${{ !matrix.use_zig }}
working-directory: jacspy
run: maturin build --release --target ${{ matrix.target }} --out dist

- name: Build wheel (zig)
if: ${{ matrix.use_zig }}
working-directory: jacspy
run: maturin build --release --target ${{ matrix.target }} --out dist --zig

- uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.target }}
Expand Down
Loading
Loading