Skip to content

Commit dd9e860

Browse files
tholmsdepletionmodeclaude
authored
Release v0.9.16
* Add AUR package * Add AUR package files PKGBUILD, systemd system units, sysusers/tmpfiles configs, default env file, and install hooks for packaging Praxis as an Arch Linux AUR package. Runs as a dedicated praxis system user with data in /var/lib/praxis and config in /etc/praxis/env. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix AUR build: disable LTO, bundle SQLite, update release process - PKGBUILD: add !lto option and unset CFLAGS/LDFLAGS to prevent GCC LTO objects in bundled C libraries (ring, mlua-sys) which are incompatible with rust-lld. Set SQLITE3_NO_PKG_CONFIG to force bundled SQLite. - service/Cargo.toml: disable sqlx default features to avoid system SQLite conflicts. - CLAUDE.md: add AUR package update step to release process. - .gitignore: exclude makepkg build artifacts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Bump version to 0.9.13 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update pkgdesc and add .SRCINFO Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add AUR packaging gitignore * Update release process: include .SRCINFO regeneration for AUR Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Move AUR package to originsec/praxis-aur, add release automation - Remove pkg/aur/ from this repo (now lives in originsec/praxis-aur) - Add update-aur job to release workflow that automatically updates pkgver, sha256sums, and .SRCINFO in praxis-aur on each tagged release - Update CLAUDE.md release process to reflect automation - Clean up .gitignore Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * TUI improvements, node stability, and prompt timeouts (#129) * Release v0.9.13 * Add AUR package * Add AUR package files PKGBUILD, systemd system units, sysusers/tmpfiles configs, default env file, and install hooks for packaging Praxis as an Arch Linux AUR package. Runs as a dedicated praxis system user with data in /var/lib/praxis and config in /etc/praxis/env. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix AUR build: disable LTO, bundle SQLite, update release process - PKGBUILD: add !lto option and unset CFLAGS/LDFLAGS to prevent GCC LTO objects in bundled C libraries (ring, mlua-sys) which are incompatible with rust-lld. Set SQLITE3_NO_PKG_CONFIG to force bundled SQLite. - service/Cargo.toml: disable sqlx default features to avoid system SQLite conflicts. - CLAUDE.md: add AUR package update step to release process. - .gitignore: exclude makepkg build artifacts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Bump version to 0.9.13 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update pkgdesc and add .SRCINFO Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add AUR packaging gitignore * Update release process: include .SRCINFO regeneration for AUR Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Move AUR package to originsec/praxis-aur, add release automation - Remove pkg/aur/ from this repo (now lives in originsec/praxis-aur) - Add update-aur job to release workflow that automatically updates pkgver, sha256sums, and .SRCINFO in praxis-aur on each tagged release - Update CLAUDE.md release process to reflect automation - Clean up .gitignore Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * AUR package automation and installation docs - Add AUR package files (aur/praxis/) with PKGBUILD, systemd units, sysusers/tmpfiles configs, and install hooks - Add automated AUR update workflows: release.yml pushes to AUR on tagged releases, update-aur.yml for manual dispatch - Workflows run in Arch Linux container, compute sha256 from release tarball, update PKGBUILD and .SRCINFO, commit to main, then push to AUR via SSH - Add AUR installation instructions to docs - Bump version to 0.9.14 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update AUR package to v0.9.14 * Switch to ulises-jeremias/github-actions-aur-publish for AUR push Replaces manual SSH setup with a dedicated action that handles all SSH authentication internals. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix workflow paths: aur/ -> pkg/aur/ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix AUR publish: exclude unsupported dsa key type from ssh_keyscan Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Bump version to 0.9.15 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update AUR package to v0.9.15 * Revert to direct SSH push in Arch container for AUR Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * AUR push: use IdentitiesOnly, keyscan, and retry with backoff Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Make AUR update non-blocking in release workflow Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Consolidate SSH setup and AUR push into single step Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add verbose SSH debug to AUR push Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix AUR SSH: copy known_hosts to /root/.ssh/ for container HOME mismatch Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add back SSH verbosity for debugging Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix update-aur SSH config * Fix release AUR SSH config * tui: refine orchestrator thinking and spinner display * tui: keep orchestrator spinner visible while waiting * node: fix VM lock blocking main loop and improve reset/shutdown - Use spawn_blocking for create_session, close_session, do_fingerprint, and perform_recon to avoid blocking the async runtime - Use try_lock for fingerprint, recon, and read_session_content so they fail fast when a transaction holds the VM lock - Agent::Select now closes the existing session and cancels transactions before fingerprinting, preventing queue stalls - Shutdown path now cancels all transactions and closes sessions (matching reset behavior) so child processes are killed on Ctrl+C - Read stdout/stderr on background threads to prevent pipe deadlock when child output exceeds 64KB buffer - Add timed join (5s) for reader threads to handle orphaned grandchildren - Add explicit flush() before dropping stdin pipe Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * service: fix op queue not advancing after early failures Early failures in select_agent or create_session returned before the dequeue logic, leaving subsequent queued operations stuck. Wrap execution steps in a labeled block so break exits to the dequeue path. Also send close_session before select_agent to clean up lingering sessions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add configurable prompt timeout for agent commands Adds a prompt_timeout_secs setting that kills agent processes exceeding the configured time limit. Fingerprint checks use a 10s hardcoded timeout. - Add timeout_secs to CommandSpec with deadline-based kill in poll loop - Add prompt_timeout_secs to SessionContext, service config (default 600s) - Service reads timeout from config and passes through SessionContext - TUI and web fetch timeout from service config at session creation - CLI session create accepts --timeout / -T flag, falls back to service config - All Lua agents store and use prompt_timeout_secs from session context - Settings UI in both TUI and web for configuring the timeout - Web fetches prompt_timeout_secs on connection for immediate availability Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * lua: inline timeout_secs in command spec tables Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Bump version to 0.9.16 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add Claude Bridge with CCRv1 (WebSocket) and CCRv2 (HTTP/SSE) transports Implement the Claude Bridge module for Claude agent connectivity with two transport protocols. CCRv1 uses WebSocket via tokio-tungstenite and CCRv2 uses HTTP/SSE via axum. Both share a common BridgeSession protocol core through a Transport trait abstraction. Includes service bootstrap integration, settings UI with grouped configuration, and documentation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Chains/Ops do not shutdown Bridge sessions * Adding ip + email as node hostname for bridge nodes --------- Co-authored-by: David Kaplan <davkaplan@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c9cd7e4 commit dd9e860

48 files changed

Lines changed: 2409 additions & 203 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/release.yml‎

Lines changed: 11 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -69,99 +69,32 @@ jobs:
6969
7070
update-aur:
7171
needs: release
72-
if: always() && needs.release.result == 'success'
73-
continue-on-error: true
7472
runs-on: ubuntu-latest
75-
container:
76-
image: archlinux
77-
options: --privileged
78-
permissions:
79-
contents: write
8073

8174
steps:
82-
- name: Install dependencies
83-
run: pacman -Sy --noconfirm git curl openssh
84-
85-
- uses: actions/checkout@v4
75+
- name: Checkout AUR repo
76+
uses: actions/checkout@v4
8677
with:
87-
ref: main
88-
fetch-depth: 0
78+
repository: originsec/praxis-aur
79+
token: ${{ secrets.AUR_REPO_TOKEN }}
8980

90-
- name: Update AUR files
81+
- name: Update version
9182
run: |
9283
VERSION="${GITHUB_REF_NAME#v}"
9384
SHA256=$(curl -sL "https://github.com/originsec/praxis/archive/${GITHUB_REF_NAME}.tar.gz" | sha256sum | cut -d' ' -f1)
9485
95-
cd pkg/aur/praxis
9686
sed -i "s/^pkgver=.*/pkgver=${VERSION}/" PKGBUILD
9787
sed -i "0,/^ '[a-f0-9]\{64\}'/{s/^ '[a-f0-9]\{64\}'/ '${SHA256}'/}" PKGBUILD
88+
9889
sed -i "s/pkgver = .*/pkgver = ${VERSION}/" .SRCINFO
9990
sed -i "s|source = praxis-.*\.tar\.gz::.*|source = praxis-${VERSION}.tar.gz::https://github.com/originsec/praxis/archive/v${VERSION}.tar.gz|" .SRCINFO
10091
sed -i "0,/sha256sums = [a-f0-9]\{64\}/{s/sha256sums = [a-f0-9]\{64\}/sha256sums = ${SHA256}/}" .SRCINFO
10192
102-
- name: Commit to praxis repo
103-
run: |
104-
VERSION="${GITHUB_REF_NAME#v}"
105-
git config --global --add safe.directory "$PWD"
106-
git config user.name "David Kaplan"
107-
git config user.email "davkaplan@gmail.com"
108-
git add pkg/aur/praxis/PKGBUILD pkg/aur/praxis/.SRCINFO
109-
if git diff --cached --quiet; then
110-
echo "No changes to commit"
111-
else
112-
git commit -m "Update AUR package to v${VERSION}"
113-
git push
114-
fi
115-
116-
- name: Configure SSH for AUR
117-
env:
118-
AUR_SSH_KEY: ${{ secrets.AUR_SSH_KEY }}
119-
run: |
120-
mkdir -p /github/home/.ssh /root/.ssh
121-
printf '%s\n' "${AUR_SSH_KEY}" > /github/home/.ssh/aur
122-
chmod 600 /github/home/.ssh/aur
123-
ssh-keyscan -t ed25519,rsa aur.archlinux.org > /github/home/.ssh/known_hosts 2>/dev/null
124-
chmod 600 /github/home/.ssh/known_hosts
125-
cat > /github/home/.ssh/config <<'EOF'
126-
Host aur.archlinux.org
127-
User aur
128-
IdentityFile /github/home/.ssh/aur
129-
IdentitiesOnly yes
130-
StrictHostKeyChecking yes
131-
UserKnownHostsFile /github/home/.ssh/known_hosts
132-
GlobalKnownHostsFile /dev/null
133-
ConnectTimeout 20
134-
ServerAliveInterval 15
135-
ServerAliveCountMax 3
136-
EOF
137-
chmod 600 /github/home/.ssh/config
138-
cp /github/home/.ssh/known_hosts /root/.ssh/known_hosts
139-
cp /github/home/.ssh/config /root/.ssh/config
140-
chmod 600 /root/.ssh/known_hosts /root/.ssh/config
141-
142-
- name: Push to AUR
93+
- name: Commit and push
14394
run: |
144-
git config --global user.name "David Kaplan"
145-
git config --global user.email "davkaplan@gmail.com"
146-
git config --global --add safe.directory "$PWD"
147-
148-
export GIT_SSH_COMMAND="ssh -F /github/home/.ssh/config -vvv"
149-
150-
git clone ssh://aur@aur.archlinux.org/praxis.git /tmp/aur-push
151-
cp pkg/aur/praxis/PKGBUILD pkg/aur/praxis/.SRCINFO /tmp/aur-push/
152-
cp pkg/aur/praxis/*.service pkg/aur/praxis/*.conf /tmp/aur-push/
153-
cp pkg/aur/praxis/*.env pkg/aur/praxis/*.install /tmp/aur-push/
154-
cd /tmp/aur-push
155-
git add -A
156-
if git diff --cached --quiet; then
157-
echo "AUR already up to date"
158-
exit 0
159-
fi
16095
VERSION="${GITHUB_REF_NAME#v}"
96+
git config user.name "github-actions[bot]"
97+
git config user.email "github-actions[bot]@users.noreply.github.com"
98+
git add PKGBUILD .SRCINFO
16199
git commit -m "Update to v${VERSION}"
162-
for i in 1 2 3 4 5; do
163-
git push && echo "Pushed to AUR" && exit 0
164-
echo "AUR push failed, retry $i"
165-
sleep $((i * 15))
166-
done
167-
exit 1
100+
git push

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,4 @@
8888
3. **Squash merge**: Squash-merge the PR into `main`.
8989
4. **GitHub release**: Create a GitHub release on `main` with an excellent changelog covering all notable changes, new features, fixes, and breaking changes.
9090
5. **Tag and push**: Create a version tag matching the version number set on the `prerelease` branch (e.g., `v0.10.0`), push the tag, and push the release.
91-
6. **AUR package**: Handled automatically. The release workflow computes the sha256 of the release tarball (which only exists after the tag is pushed), updates `pkg/aur/praxis/PKGBUILD` and `pkg/aur/praxis/.SRCINFO`, commits to `main`, and pushes to the AUR. Do **not** manually update `pkg/aur/praxis/` version or sha256 — the automation handles this. The "Update AUR Package" workflow can also be triggered manually to re-push the current repo state to AUR.
91+
6. **AUR package**: Handled automatically — a GitHub Action updates the `originsec/praxis-aur` repo on each release.

‎Cargo.lock‎

Lines changed: 11 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resolver = "3"
33
members = ["cli", "common", "node", "semantic_parser", "service", "web"]
44

55
[workspace.package]
6-
version = "0.9.15"
6+
version = "0.9.16"
77
edition = "2024"
88
license = "Apache-2.0"
99
repository = "https://github.com/originsec/praxis"

‎agents/claudecode.lua‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ local INTERCEPT_DOMAINS = { "api.anthropic.com", "a-api.anthropic.com" }
77
local INTERCEPT_URL_PATTERN = "messages"
88

99
local function verify_binary(path)
10-
local result = praxis.command_run({ program = path, args = { "--version" } })
10+
local result = praxis.command_run({ program = path, args = { "--version" }, timeout_secs = 10 })
1111
if result.success then
1212
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")
1313
return string.lower(result.stdout or ""):find("claude") ~= nil, version
@@ -171,6 +171,7 @@ local function run_create_session(ctx)
171171
process_path = ctx.process_path,
172172
working_dir = working_dir,
173173
yolo_mode = ctx.yolo_mode == true,
174+
prompt_timeout_secs = ctx.prompt_timeout_secs,
174175
external_session_id = nil,
175176
}
176177
end
@@ -210,6 +211,7 @@ local function run_session_transact(state, prompt)
210211
program = state.process_path,
211212
args = args,
212213
cwd = state.working_dir,
214+
timeout_secs = state.prompt_timeout_secs or 1800,
213215
}
214216

215217
local result = praxis.command_run_handle(spec, state.handle)

‎agents/claudedesktop.lua‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ local function verify_binary(path)
4343
local result = praxis.command_run({
4444
program = "powershell",
4545
args = { "-NoProfile", "-Command", "(Get-Item '" .. path .. "').VersionInfo.ProductVersion" },
46+
timeout_secs = 10,
4647
})
4748
if result.success then
4849
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")

‎agents/codex.lua‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local AGENT_NAME = "Codex CLI"
44
local AGENT_SHORT_NAME = "codex"
55

66
local function verify_binary(path)
7-
local result = praxis.command_run({ program = path, args = { "--version" } })
7+
local result = praxis.command_run({ program = path, args = { "--version" }, timeout_secs = 10 })
88
if result.success then
99
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")
1010
return string.lower(result.stdout or ""):find("codex") ~= nil, version
@@ -200,6 +200,7 @@ local function run_create_session(ctx)
200200
process_path = ctx.process_path,
201201
working_dir = working_dir,
202202
yolo_mode = ctx.yolo_mode == true,
203+
prompt_timeout_secs = ctx.prompt_timeout_secs,
203204
has_first_prompt = false,
204205
}
205206
end
@@ -266,6 +267,7 @@ local function run_session_transact(state, prompt)
266267
program = state.process_path,
267268
args = args,
268269
stdin = prompt,
270+
timeout_secs = state.prompt_timeout_secs or 1800,
269271
}
270272
if type(wd) == "string" and wd ~= "" then
271273
spec.cwd = wd

‎agents/cursor.lua‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ local INTERCEPT_DOMAINS = {
1111
}
1212

1313
local function verify_binary(path)
14-
local result = praxis.command_run({ program = path, args = { "--version" } })
14+
local result = praxis.command_run({ program = path, args = { "--version" }, timeout_secs = 10 })
1515
if result.success then
1616
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")
1717
return true, version
@@ -45,6 +45,7 @@ local function check_user_logged_in(cursor_agent_path, working_dir)
4545
program = cursor_agent_path,
4646
args = { "status" },
4747
cwd = working_dir,
48+
timeout_secs = 10,
4849
})
4950
if result.success then
5051
return (result.stdout or ""):find("Logged in") ~= nil
@@ -230,6 +231,7 @@ local function run_create_session(ctx)
230231
process_path = pp,
231232
working_dir = working_dir,
232233
yolo_mode = ctx.yolo_mode == true,
234+
prompt_timeout_secs = ctx.prompt_timeout_secs,
233235
chat_id = chat_id,
234236
}
235237
end
@@ -257,6 +259,7 @@ local function run_session_transact(state, prompt)
257259
program = state.process_path,
258260
args = args,
259261
stdin = prompt,
262+
timeout_secs = state.prompt_timeout_secs or 1800,
260263
}
261264
if type(wd) == "string" and wd ~= "" then
262265
spec.cwd = wd

‎agents/droid.lua‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ local INTERCEPT_DOMAINS = {
1212
local INTERCEPT_URL_PATTERN = nil
1313

1414
local function verify_binary(path)
15-
local result = praxis.command_run({ program = path, args = { "--version" } })
15+
local result = praxis.command_run({ program = path, args = { "--version" }, timeout_secs = 10 })
1616
if result.success then
1717
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")
1818
return version ~= nil, version
@@ -133,6 +133,7 @@ local function run_create_session(ctx)
133133
process_path = ctx.process_path,
134134
working_dir = working_dir,
135135
yolo_mode = ctx.yolo_mode == true,
136+
prompt_timeout_secs = ctx.prompt_timeout_secs,
136137
external_session_id = nil,
137138
}
138139
end
@@ -192,6 +193,7 @@ local function run_session_transact(state, prompt)
192193
program = state.process_path,
193194
args = args,
194195
cwd = state.working_dir,
196+
timeout_secs = state.prompt_timeout_secs or 1800,
195197
}
196198

197199
local result = praxis.command_run_handle(spec, state.handle)

‎agents/gemini.lua‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ local function is_session_file(name)
1313
end
1414

1515
local function verify_binary(path)
16-
local result = praxis.command_run({ program = path, args = { "--version" } })
16+
local result = praxis.command_run({ program = path, args = { "--version" }, timeout_secs = 10 })
1717
if result.success then
1818
local version = (result.stdout or ""):match("(%d[%d%.%-a-zA-Z]*)")
1919
return true, version
@@ -271,6 +271,7 @@ local function run_create_session(ctx)
271271
process_path = ctx.process_path,
272272
working_dir = working_dir,
273273
yolo_mode = ctx.yolo_mode == true,
274+
prompt_timeout_secs = ctx.prompt_timeout_secs,
274275
external_session_id = nil,
275276
}
276277
end
@@ -290,6 +291,7 @@ local function run_session_transact(state, prompt)
290291
args = args,
291292
cwd = state.working_dir,
292293
stdin = prompt,
294+
timeout_secs = state.prompt_timeout_secs or 1800,
293295
}
294296

295297
local result = praxis.command_run_handle(spec, state.handle)
@@ -316,6 +318,7 @@ local function run_session_close(state)
316318
program = state.process_path,
317319
args = { "--delete-session", state.external_session_id },
318320
cwd = state.working_dir,
321+
timeout_secs = 10,
319322
}
320323
pcall(praxis.command_run, spec)
321324
end

0 commit comments

Comments
 (0)