Tags: ababol/bnot
Tags
Stable DMG download URL and FAQ install/update wording Landing Download buttons now link to a stable releases/latest/download URL backed by a new release-workflow step that uploads a renamed copy of the universal DMG. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop stale hooks from ended turns; unblock stopFailure scanning Late SubagentStop / preToolUse from a finished turn could re-arm isThinking and leave the bnot stuck in the working state. Mark sessions idle on sessionEnd and gate the relevant hooks via STALE_TURN_EVENTS in handleMessage. stopFailure no longer sets status=completed, which had wedged the session for 5s under COMPLETED_MIN_MS and blocked legit status transitions on a still-alive Claude. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add /release skill so releases run through GitHub Actions The release workflow reads the version from the tag of a GitHub Release and writes it into the repo inside the runner only. The skill codifies that contract — computes the next version, pushes main, and calls `gh release create` to trigger the workflow — so no one bumps versions in tauri.conf.json / Cargo.toml / package.json by hand. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Detach transcript watcher on auto-compact and trim redundant state - session-manager evicted the prior session entry on terminalPid reuse (auto-compact rotation) without detaching its watcher, leaking one fs.watch per compact. - Drop transcriptPath from AgentSession (sidecar + web types). The watcher's own map is the only consumer; the field added redundant state across three layers. - Move the interrupt mutation into SessionManager.applyInterrupt() so the watcher stops reaching into sm.sessions directly, matching the pattern of every other state change. - applyInterrupt now early-returns if state is already cleared, avoiding a spurious emitUpdate when duplicate markers appear in one chunk. - Drop redundant serde(rename) on transcript_path in hook_input.rs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Clear stuck Working state when user presses Esc to interrupt Claude Code does not fire any hook on Esc, so Bnot's notch was stuck on "Working" indefinitely after an interrupt. Tail the per-session JSONL transcript for the `[Request interrupted by user` marker (the same signal Claude Code uses internally) and clear isThinking/currentTool when seen. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hide Working/Napping text and tighten pid identity to pid+cwd - Hero card no longer renders "Working..." or any idle text — the spinner / zzz indicator already conveys those states. Only non-active statuses (approval / answer / done / error) get a text label. Switched to flex+gap-1 so spacing stays even when the row is omitted. - Drop the dead `currentTool !== "Unknown"` guard — the literal "Unknown" is never produced by any code path. - Promote the workingDirectory `"unknown"` placeholder to an exported UNKNOWN_CWD constant so the pid-identity checks reference a single source of truth instead of stringly-typed sentinels. - Tighten orphan / dedup / push-live to require pid AND cwd to match — pid alone isn't a stable identity on macOS (recycled pids can land on another Claude, defeating a comm-only check). Resolution is computed once into hookForLivePid so the skip-create and push-live loops see consistent matches even if sessions mutate during the orphan-check await. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Authenticate socket peers and fix AskUserQuestion render Move the Unix socket gateway into the Tauri Rust process and reject any peer whose executable isn't a known bnot-bridge path (getpeereid + LOCAL_PEERPID + proc_pidpath, socket chmod 0600). Drop the unused shell and global-shortcut plugins. Fix AskUserQuestion showing the generic Yes/No approval UI: preToolUse and permissionRequest fire from separate bridge processes and can land in either order, but AskUserQuestion only ever uses pendingQuestion — clear pendingApproval on the question side and skip it on the perm side. Keep the bridge alive across SHUT_WR until the gateway closes its end so LOCAL_PEERPID succeeds — fire-and-forget hooks were previously dropped. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fix stale Working/Planning status and animate plan mode indicator - Bridge maps all permission_mode values explicitly (including "default" → "normal") so sessionMode resets when exiting plan mode - Track idle sessions to discard stale preToolUse events that arrive after sessionEnd, preventing isThinking from getting stuck - Clear isThinking in postToolUse handler for consistent state - Split _bootstrapGhostty into focus/no-focus paths so terminal ID capture doesn't steal window focus - Replace static plan mode dots with animated sequential bar indicator Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PreviousNext